@yenio-pld/blocks 0.0.0 → 1.0.0-rc.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +361 -855
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +16 -2
- package/dist/index.d.ts +16 -2
- package/dist/index.js +223 -697
- package/dist/index.js.map +1 -1
- package/dist/ui/alert-dialog.d.ts +9 -3
- package/dist/ui/alert-dialog.js +11 -3
- package/dist/ui/alert-dialog.js.map +1 -1
- package/dist/ui/button.d.ts +1 -1
- package/dist/ui/drawer.d.ts +15 -0
- package/dist/ui/drawer.js +126 -0
- package/dist/ui/drawer.js.map +1 -0
- package/dist/ui/dropdown-menu.d.ts +9 -3
- package/dist/ui/dropdown-menu.js +9 -2
- package/dist/ui/dropdown-menu.js.map +1 -1
- package/dist/ui/empty.d.ts +15 -0
- package/dist/ui/empty.js +104 -0
- package/dist/ui/empty.js.map +1 -0
- package/dist/ui/select.d.ts +5 -0
- package/dist/ui/select.js +25 -0
- package/dist/ui/select.js.map +1 -0
- package/dist/ui/slider.d.ts +6 -0
- package/dist/ui/slider.js +70 -0
- package/dist/ui/slider.js.map +1 -0
- package/dist/ui/sonner.d.ts +1 -0
- package/dist/ui/sonner.js +1 -0
- package/dist/ui/sonner.js.map +1 -1
- package/dist/ui/textarea.d.ts +5 -0
- package/dist/ui/textarea.js +25 -0
- package/dist/ui/textarea.js.map +1 -0
- package/dist/ui/toggle.d.ts +12 -0
- package/dist/ui/toggle.js +49 -0
- package/dist/ui/toggle.js.map +1 -0
- package/package.json +25 -1
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/contexts/index.ts","../src/lib/utils.ts","../src/components/ui/empty.tsx","../src/components/EmptyState.tsx","../src/components/ui/button.tsx","../src/components/ui/alert-dialog.tsx","../src/components/ConfirmDestructiveDialog.tsx","../src/components/ui/dropdown-menu.tsx","../src/components/NotificationBell.tsx","../src/components/editable/types.ts","../src/components/editable/useEditableSection.ts","../src/components/editable/EditableSection.tsx","../src/components/editable/DataList.tsx","../src/components/editable/FieldMessage.tsx","../src/components/media/SafeImage.tsx","../src/components/ThemeSwitcher.tsx","../src/components/LanguageSwitcher.tsx","../src/components/ui/slider.tsx","../src/components/ui/toggle.tsx","../src/components/AvatarEditor.tsx","../src/components/ui/dialog.tsx","../src/components/ui/drawer.tsx","../src/components/AvatarEditorDialog.tsx","../src/components/upload/part-math.ts","../src/components/upload/types.ts","../src/components/upload/FileDropzone.tsx","../src/components/upload/FileUploadTray.tsx","../src/components/upload/FileUploadMenu.tsx","../src/components/upload/createMultipartUploadController.ts","../src/hooks/useMediaQuery.ts","../src/lib/avatar.ts","../src/components/metrics/StatHighlightCard.tsx","../src/components/metrics/MetricChartCard.tsx","../src/components/metrics/SparklineStat.tsx","../src/components/metrics/TimeRangePicker.tsx","../src/components/metrics/DimensionBreakdownTable.tsx","../src/components/metrics/CostBreakdownCard.tsx","../src/components/metrics/MetricEmptyState.tsx","../src/components/metrics/MetricSkeleton.tsx","../src/lib/cookie-consent.ts","../src/components/CookieConsentBanner.tsx","../src/lib/legal-accept-label.tsx","../src/components/LegalAcceptDialog.tsx","../src/components/LegalAcceptCheckbox.tsx","../src/components/LegalMarkdown.tsx","../src/theme-init.ts","../src/components/AuditTimeline.tsx","../src/components/RiskBadge.tsx","../src/components/EntityGraph.tsx","../src/components/MatchReview.tsx"],"names":["createContext","useContext","twMerge","clsx","jsx","cva","jsxs","Loader2","AlertTriangle","Inbox","Slot","AlertDialogPrimitive","DropdownMenuPrimitive","Bell","useState","useRef","useId","useEffect","useCallback","Fragment","useLayoutEffect","Monitor","Sun","Moon","useTheme","sizeClasses","shapeClasses","iconTriggerClassName","Languages","React","SliderPrimitive","TogglePrimitive","Upload","Move","ZoomOut","ZoomIn","RotateCcw","RotateCw","Grid3X3","RefreshCw","X","DialogPrimitive","XIcon","DrawerPrimitive","User","Pencil","AnimatePresence","motion","Check","Pause","Play","useMediaQuery","DEFAULT_LABELS","BarChart3"],"mappings":"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","file":"index.cjs","sourcesContent":["\"use client\";\n\nimport { createContext, useContext } from \"react\";\n\n/**\n * Blocks Context Interfaces\n *\n * These interfaces define the contract that consuming apps must implement\n * to provide context to blocks components. Components will automatically\n * consume these contexts when available, falling back to props otherwise.\n */\n\n// =============================================================================\n// Language Context\n// =============================================================================\n\n/**\n * Language definition for the language switcher.\n */\nexport interface BlocksLanguage {\n\tcode: string;\n\tname: string;\n\tflag?: string;\n}\n\n/**\n * Language context value interface.\n * Consuming apps implement this interface to provide language state\n * and actions to blocks components.\n */\nexport interface LanguageContextValue {\n\t/** Current language code (e.g., \"en\", \"es\") */\n\tlanguage: string;\n\t/** Function to change the language */\n\tsetLanguage: (lang: string) => void;\n\t/** Available languages (optional, components have defaults) */\n\tlanguages?: BlocksLanguage[];\n}\n\n/**\n * React context for language.\n * Blocks components will consume this context when available.\n */\nexport const LanguageContext = createContext<LanguageContextValue | null>(null);\n\n/**\n * Hook to consume the language context.\n * Returns null if no provider is present (components should fall back to props).\n */\nexport function useLanguageContext(): LanguageContextValue | null {\n\treturn useContext(LanguageContext);\n}\n","import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n\treturn twMerge(clsx(inputs));\n}\n","import * as React from \"react\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\n\nimport { cn } from \"../../lib/utils\";\n\nfunction Empty({ className, ...props }: React.ComponentProps<\"div\">) {\n\treturn (\n\t\t<div\n\t\t\tdata-slot=\"empty\"\n\t\t\tclassName={cn(\n\t\t\t\t\"flex min-w-0 flex-1 flex-col items-center justify-center gap-6 rounded-lg p-6 text-center text-balance md:p-12\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction EmptyHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n\treturn (\n\t\t<div\n\t\t\tdata-slot=\"empty-header\"\n\t\t\tclassName={cn(\n\t\t\t\t\"flex max-w-sm flex-col items-center gap-2 text-center\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nconst emptyMediaVariants = cva(\n\t\"mb-2 flex shrink-0 items-center justify-center [&_svg]:pointer-events-none [&_svg]:shrink-0\",\n\t{\n\t\tvariants: {\n\t\t\tvariant: {\n\t\t\t\tdefault: \"bg-transparent\",\n\t\t\t\ticon: \"flex size-10 shrink-0 items-center justify-center rounded-lg bg-muted text-foreground [&_svg:not([class*='size-'])]:size-6\",\n\t\t\t},\n\t\t},\n\t\tdefaultVariants: {\n\t\t\tvariant: \"default\",\n\t\t},\n\t},\n);\n\nfunction EmptyMedia({\n\tclassName,\n\tvariant = \"default\",\n\t...props\n}: React.ComponentProps<\"div\"> & VariantProps<typeof emptyMediaVariants>) {\n\treturn (\n\t\t<div\n\t\t\tdata-slot=\"empty-icon\"\n\t\t\tdata-variant={variant}\n\t\t\tclassName={cn(emptyMediaVariants({ variant, className }))}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction EmptyTitle({ className, ...props }: React.ComponentProps<\"div\">) {\n\treturn (\n\t\t<div\n\t\t\tdata-slot=\"empty-title\"\n\t\t\tclassName={cn(\"text-lg font-medium tracking-tight\", className)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction EmptyDescription({ className, ...props }: React.ComponentProps<\"p\">) {\n\treturn (\n\t\t<div\n\t\t\tdata-slot=\"empty-description\"\n\t\t\tclassName={cn(\n\t\t\t\t\"text-sm/relaxed text-muted-foreground [&>a]:underline [&>a]:underline-offset-4 [&>a:hover]:text-primary\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction EmptyContent({ className, ...props }: React.ComponentProps<\"div\">) {\n\treturn (\n\t\t<div\n\t\t\tdata-slot=\"empty-content\"\n\t\t\tclassName={cn(\n\t\t\t\t\"flex w-full max-w-sm min-w-0 flex-col items-center gap-4 text-sm text-balance\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nexport {\n\tEmpty,\n\tEmptyHeader,\n\tEmptyTitle,\n\tEmptyDescription,\n\tEmptyContent,\n\tEmptyMedia,\n};\n","\"use client\";\n\nimport * as React from \"react\";\nimport { AlertTriangle, Inbox, Loader2 } from \"lucide-react\";\n\nimport { cn } from \"../lib/utils\";\nimport {\n\tEmpty,\n\tEmptyContent,\n\tEmptyDescription,\n\tEmptyHeader,\n\tEmptyMedia,\n\tEmptyTitle,\n} from \"./ui/empty\";\n\nexport function LoadingState({\n\tlabel = \"Loading…\",\n\tclassName,\n}: {\n\tlabel?: string;\n\tclassName?: string;\n}) {\n\treturn (\n\t\t<div\n\t\t\trole=\"status\"\n\t\t\taria-live=\"polite\"\n\t\t\tclassName={cn(\n\t\t\t\t\"flex items-center justify-center gap-2 py-12 text-sm text-muted-foreground\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t<Loader2 className=\"size-4 animate-spin\" aria-hidden=\"true\" />\n\t\t\t<span>{label}</span>\n\t\t</div>\n\t);\n}\n\nexport function ErrorState({\n\ttitle = \"Something went wrong\",\n\tdescription,\n\taction,\n\tclassName,\n}: {\n\ttitle?: string;\n\tdescription?: string;\n\taction?: React.ReactNode;\n\tclassName?: string;\n}) {\n\treturn (\n\t\t<div\n\t\t\trole=\"alert\"\n\t\t\tclassName={cn(\n\t\t\t\t\"flex flex-col items-center gap-3 rounded-xl border border-dashed border-destructive/40 bg-destructive/5 py-12 text-center\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t<AlertTriangle className=\"size-6 text-destructive\" aria-hidden=\"true\" />\n\t\t\t<div>\n\t\t\t\t<p className=\"font-medium\">{title}</p>\n\t\t\t\t{description ? (\n\t\t\t\t\t<p className=\"mt-1 text-sm text-muted-foreground\">{description}</p>\n\t\t\t\t) : null}\n\t\t\t</div>\n\t\t\t{action}\n\t\t</div>\n\t);\n}\n\n/** Accept any icon component with a className prop — avoids LucideIcon\n * version skew between blocks peers and consuming apps. */\nexport type EmptyStateIcon = React.ComponentType<{\n\tclassName?: string;\n\t\"aria-hidden\"?: boolean | \"true\" | \"false\";\n}>;\n\nexport type EmptyStateProps = {\n\ttitle: string;\n\tdescription?: string;\n\taction?: React.ReactNode;\n\ticon?: EmptyStateIcon;\n\tvariant?: \"default\" | \"compact\";\n\tclassName?: string;\n};\n\nexport function EmptyState({\n\ttitle,\n\tdescription,\n\taction,\n\ticon: Icon = Inbox,\n\tvariant = \"default\",\n\tclassName,\n}: EmptyStateProps) {\n\tconst isCompact = variant === \"compact\";\n\n\treturn (\n\t\t<Empty\n\t\t\tclassName={cn(\n\t\t\t\t\"gap-3\",\n\t\t\t\tisCompact\n\t\t\t\t\t? \"flex-none rounded-none px-4 py-6\"\n\t\t\t\t\t: \"flex-none rounded-xl border border-dashed px-6 py-12\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t<EmptyHeader className=\"gap-3\">\n\t\t\t\t<EmptyMedia\n\t\t\t\t\tvariant=\"icon\"\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"mb-0 bg-transparent text-muted-foreground\",\n\t\t\t\t\t\tisCompact\n\t\t\t\t\t\t\t? \"size-auto [&_svg:not([class*='size-'])]:size-8 [&_svg]:opacity-50\"\n\t\t\t\t\t\t\t: \"size-auto [&_svg:not([class*='size-'])]:size-6\",\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t<Icon aria-hidden=\"true\" />\n\t\t\t\t</EmptyMedia>\n\t\t\t\t<EmptyTitle\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"font-medium tracking-normal\",\n\t\t\t\t\t\tisCompact ? \"text-sm\" : \"text-base\",\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t{title}\n\t\t\t\t</EmptyTitle>\n\t\t\t\t{description ? (\n\t\t\t\t\t<EmptyDescription className=\"mt-0\">{description}</EmptyDescription>\n\t\t\t\t) : null}\n\t\t\t</EmptyHeader>\n\t\t\t{action ? <EmptyContent className=\"gap-0\">{action}</EmptyContent> : null}\n\t\t</Empty>\n\t);\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { Slot } from \"@radix-ui/react-slot\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\n\nimport { cn } from \"../../lib/utils\";\n\nconst buttonVariants = cva(\n\t\"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive\",\n\t{\n\t\tvariants: {\n\t\t\tvariant: {\n\t\t\t\tdefault: \"bg-primary text-primary-foreground hover:bg-primary/90\",\n\t\t\t\tdestructive:\n\t\t\t\t\t\"bg-destructive text-white hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60\",\n\t\t\t\toutline:\n\t\t\t\t\t\"border bg-background text-foreground shadow-xs hover:bg-accent hover:text-accent-foreground dark:border-input dark:bg-input/30 dark:text-foreground dark:hover:bg-muted dark:hover:text-foreground\",\n\t\t\t\tsecondary:\n\t\t\t\t\t\"bg-secondary text-secondary-foreground hover:bg-secondary/80\",\n\t\t\t\tghost:\n\t\t\t\t\t\"hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50 dark:hover:text-foreground\",\n\t\t\t\tlink: \"text-primary underline-offset-4 hover:underline\",\n\t\t\t},\n\t\t\tsize: {\n\t\t\t\tdefault: \"h-9 px-4 py-2 has-[>svg]:px-3\",\n\t\t\t\tsm: \"h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5\",\n\t\t\t\tlg: \"h-10 rounded-md px-6 has-[>svg]:px-4\",\n\t\t\t\ticon: \"size-9\",\n\t\t\t\t\"icon-sm\": \"size-8\",\n\t\t\t\t\"icon-lg\": \"size-10\",\n\t\t\t},\n\t\t},\n\t\tdefaultVariants: {\n\t\t\tvariant: \"default\",\n\t\t\tsize: \"default\",\n\t\t},\n\t},\n);\n\nfunction Button({\n\tclassName,\n\tvariant = \"default\",\n\tsize = \"default\",\n\tasChild = false,\n\t...props\n}: React.ComponentProps<\"button\"> &\n\tVariantProps<typeof buttonVariants> & {\n\t\tasChild?: boolean;\n\t}) {\n\tconst Comp = asChild ? Slot : \"button\";\n\n\treturn (\n\t\t<Comp\n\t\t\tdata-slot=\"button\"\n\t\t\tdata-variant={variant}\n\t\t\tdata-size={size}\n\t\t\tclassName={cn(buttonVariants({ variant, size, className }))}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nexport { Button, buttonVariants };\n","\"use client\";\n\nimport * as React from \"react\";\nimport * as AlertDialogPrimitive from \"@radix-ui/react-alert-dialog\";\n\nimport { cn } from \"../../lib/utils\";\nimport { Button } from \"./button\";\n\nfunction AlertDialog({\n\t...props\n}: React.ComponentProps<typeof AlertDialogPrimitive.Root>) {\n\treturn <AlertDialogPrimitive.Root data-slot=\"alert-dialog\" {...props} />;\n}\n\nfunction AlertDialogTrigger({\n\t...props\n}: React.ComponentProps<typeof AlertDialogPrimitive.Trigger>) {\n\treturn (\n\t\t<AlertDialogPrimitive.Trigger data-slot=\"alert-dialog-trigger\" {...props} />\n\t);\n}\n\nfunction AlertDialogPortal({\n\t...props\n}: React.ComponentProps<typeof AlertDialogPrimitive.Portal>) {\n\treturn (\n\t\t<AlertDialogPrimitive.Portal data-slot=\"alert-dialog-portal\" {...props} />\n\t);\n}\n\nfunction AlertDialogOverlay({\n\tclassName,\n\t...props\n}: React.ComponentProps<typeof AlertDialogPrimitive.Overlay>) {\n\treturn (\n\t\t<AlertDialogPrimitive.Overlay\n\t\t\tdata-slot=\"alert-dialog-overlay\"\n\t\t\tclassName={cn(\n\t\t\t\t\"fixed inset-0 z-50 bg-black/50 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:animate-in data-[state=open]:fade-in-0\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction AlertDialogContent({\n\tclassName,\n\tsize = \"default\",\n\t...props\n}: React.ComponentProps<typeof AlertDialogPrimitive.Content> & {\n\tsize?: \"default\" | \"sm\";\n}) {\n\treturn (\n\t\t<AlertDialogPortal>\n\t\t\t<AlertDialogOverlay />\n\t\t\t<AlertDialogPrimitive.Content\n\t\t\t\tdata-slot=\"alert-dialog-content\"\n\t\t\t\tdata-size={size}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"group/alert-dialog-content fixed top-[50%] left-[50%] z-50 grid w-full max-w-[calc(100%-2rem)] translate-x-[-50%] translate-y-[-50%] gap-4 rounded-lg border bg-background p-6 shadow-lg duration-200 data-[size=sm]:max-w-xs data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95 data-[size=default]:sm:max-w-lg\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t/>\n\t\t</AlertDialogPortal>\n\t);\n}\n\nfunction AlertDialogHeader({\n\tclassName,\n\t...props\n}: React.ComponentProps<\"div\">) {\n\treturn (\n\t\t<div\n\t\t\tdata-slot=\"alert-dialog-header\"\n\t\t\tclassName={cn(\n\t\t\t\t\"flex flex-col gap-1.5 text-center sm:text-left\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction AlertDialogFooter({\n\tclassName,\n\t...props\n}: React.ComponentProps<\"div\">) {\n\treturn (\n\t\t<div\n\t\t\tdata-slot=\"alert-dialog-footer\"\n\t\t\tclassName={cn(\n\t\t\t\t\"flex flex-col-reverse gap-2 sm:flex-row sm:justify-end\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction AlertDialogTitle({\n\tclassName,\n\t...props\n}: React.ComponentProps<typeof AlertDialogPrimitive.Title>) {\n\treturn (\n\t\t<AlertDialogPrimitive.Title\n\t\t\tdata-slot=\"alert-dialog-title\"\n\t\t\tclassName={cn(\"text-lg font-semibold\", className)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction AlertDialogDescription({\n\tclassName,\n\t...props\n}: React.ComponentProps<typeof AlertDialogPrimitive.Description>) {\n\treturn (\n\t\t<AlertDialogPrimitive.Description\n\t\t\tdata-slot=\"alert-dialog-description\"\n\t\t\tclassName={cn(\"text-sm text-muted-foreground\", className)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction AlertDialogAction({\n\tclassName,\n\tvariant = \"default\",\n\tsize = \"default\",\n\t...props\n}: React.ComponentProps<typeof AlertDialogPrimitive.Action> &\n\tPick<React.ComponentProps<typeof Button>, \"variant\" | \"size\">) {\n\treturn (\n\t\t<Button variant={variant} size={size} asChild>\n\t\t\t<AlertDialogPrimitive.Action\n\t\t\t\tdata-slot=\"alert-dialog-action\"\n\t\t\t\tclassName={cn(className)}\n\t\t\t\t{...props}\n\t\t\t/>\n\t\t</Button>\n\t);\n}\n\nfunction AlertDialogCancel({\n\tclassName,\n\tvariant = \"outline\",\n\tsize = \"default\",\n\t...props\n}: React.ComponentProps<typeof AlertDialogPrimitive.Cancel> &\n\tPick<React.ComponentProps<typeof Button>, \"variant\" | \"size\">) {\n\treturn (\n\t\t<Button variant={variant} size={size} asChild>\n\t\t\t<AlertDialogPrimitive.Cancel\n\t\t\t\tdata-slot=\"alert-dialog-cancel\"\n\t\t\t\tclassName={cn(className)}\n\t\t\t\t{...props}\n\t\t\t/>\n\t\t</Button>\n\t);\n}\n\nexport {\n\tAlertDialog,\n\tAlertDialogAction,\n\tAlertDialogCancel,\n\tAlertDialogContent,\n\tAlertDialogDescription,\n\tAlertDialogFooter,\n\tAlertDialogHeader,\n\tAlertDialogOverlay,\n\tAlertDialogPortal,\n\tAlertDialogTitle,\n\tAlertDialogTrigger,\n};\n","\"use client\";\n\nimport {\n\tAlertDialog,\n\tAlertDialogAction,\n\tAlertDialogCancel,\n\tAlertDialogContent,\n\tAlertDialogDescription,\n\tAlertDialogFooter,\n\tAlertDialogHeader,\n\tAlertDialogTitle,\n} from \"./ui/alert-dialog\";\n\nexport type ConfirmDestructiveDialogProps = {\n\topen: boolean;\n\tonOpenChange: (open: boolean) => void;\n\ttitle: string;\n\tdescription: string;\n\tconfirmLabel?: string;\n\tcancelLabel?: string;\n\tonConfirm: () => void;\n};\n\n/**\n * Shared confirm step for destructive actions (delete, mute, etc.).\n * Prefer this over window.confirm so focus stays in the app and copy is clear.\n */\nexport function ConfirmDestructiveDialog({\n\topen,\n\tonOpenChange,\n\ttitle,\n\tdescription,\n\tconfirmLabel = \"Delete\",\n\tcancelLabel = \"Cancel\",\n\tonConfirm,\n}: ConfirmDestructiveDialogProps) {\n\treturn (\n\t\t<AlertDialog open={open} onOpenChange={onOpenChange}>\n\t\t\t<AlertDialogContent size=\"sm\">\n\t\t\t\t<AlertDialogHeader>\n\t\t\t\t\t<AlertDialogTitle>{title}</AlertDialogTitle>\n\t\t\t\t\t<AlertDialogDescription>{description}</AlertDialogDescription>\n\t\t\t\t</AlertDialogHeader>\n\t\t\t\t<AlertDialogFooter>\n\t\t\t\t\t<AlertDialogCancel>{cancelLabel}</AlertDialogCancel>\n\t\t\t\t\t<AlertDialogAction\n\t\t\t\t\t\tvariant=\"destructive\"\n\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\tonConfirm();\n\t\t\t\t\t\t\tonOpenChange(false);\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t{confirmLabel}\n\t\t\t\t\t</AlertDialogAction>\n\t\t\t\t</AlertDialogFooter>\n\t\t\t</AlertDialogContent>\n\t\t</AlertDialog>\n\t);\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport * as DropdownMenuPrimitive from \"@radix-ui/react-dropdown-menu\";\nimport { CheckIcon, ChevronRightIcon, CircleIcon } from \"lucide-react\";\n\nimport { cn } from \"../../lib/utils\";\n\n/** Unclamped menu surface for compact header switchers (theme, language, env). */\nexport const miniMenuContentClassName =\n\t\"max-h-none overflow-x-visible overflow-y-visible\";\n\nexport const miniMenuContentDefaults = {\n\tsideOffset: 8,\n\tcollisionPadding: 12,\n} as const;\n\nfunction DropdownMenu({\n\t...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Root>) {\n\treturn <DropdownMenuPrimitive.Root data-slot=\"dropdown-menu\" {...props} />;\n}\n\nfunction DropdownMenuPortal({\n\t...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Portal>) {\n\treturn (\n\t\t<DropdownMenuPrimitive.Portal data-slot=\"dropdown-menu-portal\" {...props} />\n\t);\n}\n\nfunction DropdownMenuTrigger({\n\t...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Trigger>) {\n\treturn (\n\t\t<DropdownMenuPrimitive.Trigger\n\t\t\tdata-slot=\"dropdown-menu-trigger\"\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction DropdownMenuContent({\n\tclassName,\n\tsideOffset = 4,\n\t...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Content>) {\n\treturn (\n\t\t<DropdownMenuPrimitive.Portal>\n\t\t\t<DropdownMenuPrimitive.Content\n\t\t\t\tdata-slot=\"dropdown-menu-content\"\n\t\t\t\tsideOffset={sideOffset}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-[200] max-h-(--radix-dropdown-menu-content-available-height) min-w-[8rem] origin-(--radix-dropdown-menu-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border p-1 shadow-md\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t/>\n\t\t</DropdownMenuPrimitive.Portal>\n\t);\n}\n\nfunction DropdownMenuGroup({\n\t...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Group>) {\n\treturn (\n\t\t<DropdownMenuPrimitive.Group data-slot=\"dropdown-menu-group\" {...props} />\n\t);\n}\n\nfunction DropdownMenuItem({\n\tclassName,\n\tinset,\n\tvariant = \"default\",\n\t...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Item> & {\n\tinset?: boolean;\n\tvariant?: \"default\" | \"destructive\";\n}) {\n\treturn (\n\t\t<DropdownMenuPrimitive.Item\n\t\t\tdata-slot=\"dropdown-menu-item\"\n\t\t\tdata-inset={inset}\n\t\t\tdata-variant={variant}\n\t\t\tclassName={cn(\n\t\t\t\t\"relative flex cursor-default select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden data-[disabled]:pointer-events-none data-[disabled]:opacity-50 data-[inset]:pl-8 data-[highlighted]:bg-accent data-[highlighted]:text-accent-foreground data-[highlighted]:[&_svg:not([class*='text-'])]:text-accent-foreground focus:bg-accent focus:text-accent-foreground focus:[&_svg:not([class*='text-'])]:text-accent-foreground data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 data-[variant=destructive]:data-[highlighted]:bg-destructive/10 dark:data-[variant=destructive]:focus:bg-destructive/20 dark:data-[variant=destructive]:data-[highlighted]:bg-destructive/20 data-[variant=destructive]:focus:text-destructive data-[variant=destructive]:data-[highlighted]:text-destructive data-[variant=destructive]:*:[svg]:!text-destructive [&_svg:not([class*='text-'])]:text-muted-foreground [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction DropdownMenuCheckboxItem({\n\tclassName,\n\tchildren,\n\tchecked,\n\t...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.CheckboxItem>) {\n\treturn (\n\t\t<DropdownMenuPrimitive.CheckboxItem\n\t\t\tdata-slot=\"dropdown-menu-checkbox-item\"\n\t\t\tclassName={cn(\n\t\t\t\t\"relative flex cursor-default select-none items-center gap-2 rounded-sm py-1.5 pr-2 pl-8 text-sm outline-hidden data-[disabled]:pointer-events-none data-[disabled]:opacity-50 data-[highlighted]:bg-accent data-[highlighted]:text-accent-foreground data-[highlighted]:[&_svg:not([class*='text-'])]:text-accent-foreground focus:bg-accent focus:text-accent-foreground focus:[&_svg:not([class*='text-'])]:text-accent-foreground [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\tchecked={checked}\n\t\t\t{...props}\n\t\t>\n\t\t\t<span className=\"pointer-events-none absolute left-2 flex size-3.5 items-center justify-center\">\n\t\t\t\t<DropdownMenuPrimitive.ItemIndicator>\n\t\t\t\t\t<CheckIcon className=\"size-4\" />\n\t\t\t\t</DropdownMenuPrimitive.ItemIndicator>\n\t\t\t</span>\n\t\t\t{children}\n\t\t</DropdownMenuPrimitive.CheckboxItem>\n\t);\n}\n\nfunction DropdownMenuRadioGroup({\n\t...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.RadioGroup>) {\n\treturn (\n\t\t<DropdownMenuPrimitive.RadioGroup\n\t\t\tdata-slot=\"dropdown-menu-radio-group\"\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction DropdownMenuRadioItem({\n\tclassName,\n\tchildren,\n\t...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.RadioItem>) {\n\treturn (\n\t\t<DropdownMenuPrimitive.RadioItem\n\t\t\tdata-slot=\"dropdown-menu-radio-item\"\n\t\t\tclassName={cn(\n\t\t\t\t\"relative flex cursor-default select-none items-center gap-2 rounded-sm py-1.5 pr-2 pl-8 text-sm outline-hidden data-[disabled]:pointer-events-none data-[disabled]:opacity-50 data-[highlighted]:bg-accent data-[highlighted]:text-accent-foreground data-[highlighted]:[&_svg:not([class*='text-'])]:text-accent-foreground focus:bg-accent focus:text-accent-foreground focus:[&_svg:not([class*='text-'])]:text-accent-foreground [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t>\n\t\t\t<span className=\"pointer-events-none absolute left-2 flex size-3.5 items-center justify-center\">\n\t\t\t\t<DropdownMenuPrimitive.ItemIndicator>\n\t\t\t\t\t<CircleIcon className=\"size-2 fill-current\" />\n\t\t\t\t</DropdownMenuPrimitive.ItemIndicator>\n\t\t\t</span>\n\t\t\t{children}\n\t\t</DropdownMenuPrimitive.RadioItem>\n\t);\n}\n\nfunction DropdownMenuLabel({\n\tclassName,\n\tinset,\n\t...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Label> & {\n\tinset?: boolean;\n}) {\n\treturn (\n\t\t<DropdownMenuPrimitive.Label\n\t\t\tdata-slot=\"dropdown-menu-label\"\n\t\t\tdata-inset={inset}\n\t\t\tclassName={cn(\n\t\t\t\t\"px-2 py-1.5 text-sm font-medium data-[inset]:pl-8\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction DropdownMenuSeparator({\n\tclassName,\n\t...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Separator>) {\n\treturn (\n\t\t<DropdownMenuPrimitive.Separator\n\t\t\tdata-slot=\"dropdown-menu-separator\"\n\t\t\tclassName={cn(\"bg-border -mx-1 my-1 h-px\", className)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction DropdownMenuShortcut({\n\tclassName,\n\t...props\n}: React.ComponentProps<\"span\">) {\n\treturn (\n\t\t<span\n\t\t\tdata-slot=\"dropdown-menu-shortcut\"\n\t\t\tclassName={cn(\n\t\t\t\t\"text-muted-foreground ml-auto text-xs tracking-widest\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction DropdownMenuSub({\n\t...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Sub>) {\n\treturn <DropdownMenuPrimitive.Sub data-slot=\"dropdown-menu-sub\" {...props} />;\n}\n\nfunction DropdownMenuSubTrigger({\n\tclassName,\n\tinset,\n\tchildren,\n\t...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.SubTrigger> & {\n\tinset?: boolean;\n}) {\n\treturn (\n\t\t<DropdownMenuPrimitive.SubTrigger\n\t\t\tdata-slot=\"dropdown-menu-sub-trigger\"\n\t\t\tdata-inset={inset}\n\t\t\tclassName={cn(\n\t\t\t\t\"flex cursor-default select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden data-[inset]:pl-8 data-[highlighted]:bg-accent data-[highlighted]:text-accent-foreground data-[highlighted]:[&_svg:not([class*='text-'])]:text-accent-foreground data-[state=open]:bg-accent data-[state=open]:text-accent-foreground data-[state=open]:[&_svg:not([class*='text-'])]:text-accent-foreground focus:bg-accent focus:text-accent-foreground focus:[&_svg:not([class*='text-'])]:text-accent-foreground [&_svg:not([class*='text-'])]:text-muted-foreground [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t>\n\t\t\t{children}\n\t\t\t<ChevronRightIcon className=\"ml-auto size-4\" />\n\t\t</DropdownMenuPrimitive.SubTrigger>\n\t);\n}\n\nfunction DropdownMenuSubContent({\n\tclassName,\n\t...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.SubContent>) {\n\treturn (\n\t\t<DropdownMenuPrimitive.SubContent\n\t\t\tdata-slot=\"dropdown-menu-sub-content\"\n\t\t\tclassName={cn(\n\t\t\t\t\"bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 min-w-[8rem] origin-(--radix-dropdown-menu-content-transform-origin) overflow-hidden rounded-md border p-1 shadow-lg\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nexport {\n\tDropdownMenu,\n\tDropdownMenuPortal,\n\tDropdownMenuTrigger,\n\tDropdownMenuContent,\n\tDropdownMenuGroup,\n\tDropdownMenuLabel,\n\tDropdownMenuItem,\n\tDropdownMenuCheckboxItem,\n\tDropdownMenuRadioGroup,\n\tDropdownMenuRadioItem,\n\tDropdownMenuSeparator,\n\tDropdownMenuShortcut,\n\tDropdownMenuSub,\n\tDropdownMenuSubTrigger,\n\tDropdownMenuSubContent,\n};\n","\"use client\";\n\nimport { Bell } from \"lucide-react\";\n\nimport { cn } from \"../lib/utils\";\nimport { Button } from \"./ui/button\";\nimport {\n\tDropdownMenu,\n\tDropdownMenuContent,\n\tDropdownMenuTrigger,\n} from \"./ui/dropdown-menu\";\n\nexport type NotificationBellItem = {\n\tid: string;\n\ttitle: string;\n\tmessage: string;\n\tread: boolean;\n\tcreatedAt: string;\n\thref?: string | null;\n};\n\nexport type NotificationBellLabels = {\n\ttitle: string;\n\tempty: string;\n\tviewAll: string;\n};\n\nexport const DEFAULT_NOTIFICATION_BELL_LABELS: NotificationBellLabels = {\n\ttitle: \"Notifications\",\n\tempty: \"You're all caught up.\",\n\tviewAll: \"View all\",\n};\n\nexport type NotificationBellProps = {\n\titems: NotificationBellItem[];\n\tunreadCount: number;\n\tisLoading?: boolean;\n\tlabels?: Partial<NotificationBellLabels>;\n\tviewAllHref: string;\n\tformatTime?: (iso: string) => string;\n\tonOpenChange?: (open: boolean) => void;\n\talign?: \"start\" | \"end\";\n\tclassName?: string;\n};\n\nfunction formatUnreadBadge(count: number): string {\n\treturn count > 9 ? \"9+\" : String(count);\n}\n\nfunction defaultFormatTime(iso: string): string {\n\tconst date = new Date(iso);\n\tif (Number.isNaN(date.getTime())) return iso;\n\treturn date.toLocaleString(undefined, {\n\t\tdateStyle: \"short\",\n\t\ttimeStyle: \"short\",\n\t});\n}\n\nfunction NotificationListSkeleton({ rows = 3 }: { rows?: number }) {\n\treturn (\n\t\t<div className=\"flex flex-col\" aria-hidden=\"true\">\n\t\t\t{Array.from({ length: rows }, (_, index) => (\n\t\t\t\t<div key={index}>\n\t\t\t\t\t<div className=\"space-y-2 px-4 py-3\">\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tdata-slot=\"skeleton\"\n\t\t\t\t\t\t\tclassName=\"bg-muted h-4 w-36 animate-pulse rounded-md motion-reduce:animate-none\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tdata-slot=\"skeleton\"\n\t\t\t\t\t\t\tclassName=\"bg-muted h-3 w-full animate-pulse rounded-md motion-reduce:animate-none\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tdata-slot=\"skeleton\"\n\t\t\t\t\t\t\tclassName=\"bg-muted h-3 w-20 animate-pulse rounded-md motion-reduce:animate-none\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t\t{index < rows - 1 ? <div className=\"bg-border h-px\" /> : null}\n\t\t\t\t</div>\n\t\t\t))}\n\t\t</div>\n\t);\n}\n\nexport function NotificationBell({\n\titems,\n\tunreadCount,\n\tisLoading = false,\n\tlabels: labelOverrides,\n\tviewAllHref,\n\tformatTime = defaultFormatTime,\n\tonOpenChange,\n\talign = \"end\",\n\tclassName,\n}: NotificationBellProps) {\n\tconst labels = { ...DEFAULT_NOTIFICATION_BELL_LABELS, ...labelOverrides };\n\n\treturn (\n\t\t<DropdownMenu modal={false} onOpenChange={onOpenChange}>\n\t\t\t<DropdownMenuTrigger asChild>\n\t\t\t\t<Button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\tclassName={cn(\"relative size-9\", className)}\n\t\t\t\t\taria-label={labels.title}\n\t\t\t\t>\n\t\t\t\t\t<Bell className=\"size-4\" />\n\t\t\t\t\t{unreadCount > 0 ? (\n\t\t\t\t\t\t<span className=\"bg-destructive text-destructive-foreground absolute -top-0.5 -right-0.5 flex size-4 items-center justify-center rounded-full text-[10px] leading-none font-medium tabular-nums\">\n\t\t\t\t\t\t\t{formatUnreadBadge(unreadCount)}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t) : null}\n\t\t\t\t</Button>\n\t\t\t</DropdownMenuTrigger>\n\t\t\t<DropdownMenuContent align={align} className=\"w-80 p-0\">\n\t\t\t\t<div className=\"flex items-center justify-between border-b px-4 py-3\">\n\t\t\t\t\t<h4 className=\"font-semibold\">{labels.title}</h4>\n\t\t\t\t</div>\n\t\t\t\t<div className=\"max-h-80 overflow-y-auto\">\n\t\t\t\t\t{isLoading ? (\n\t\t\t\t\t\t<NotificationListSkeleton />\n\t\t\t\t\t) : items.length === 0 ? (\n\t\t\t\t\t\t<p className=\"text-muted-foreground px-4 py-8 text-center text-sm\">\n\t\t\t\t\t\t\t{labels.empty}\n\t\t\t\t\t\t</p>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<div className=\"flex flex-col\">\n\t\t\t\t\t\t\t{items.map((item, index) => {\n\t\t\t\t\t\t\t\tconst body = (\n\t\t\t\t\t\t\t\t\t<div className=\"flex-1 space-y-1\">\n\t\t\t\t\t\t\t\t\t\t<p className=\"text-sm leading-none font-medium\">\n\t\t\t\t\t\t\t\t\t\t\t{item.title}\n\t\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t\t<p className=\"text-muted-foreground line-clamp-2 text-xs\">\n\t\t\t\t\t\t\t\t\t\t\t{item.message}\n\t\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t\t<p className=\"text-muted-foreground/70 text-xs\">\n\t\t\t\t\t\t\t\t\t\t\t{formatTime(item.createdAt)}\n\t\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t<div key={item.id}>\n\t\t\t\t\t\t\t\t\t\t{item.href ? (\n\t\t\t\t\t\t\t\t\t\t\t<a\n\t\t\t\t\t\t\t\t\t\t\t\thref={item.href}\n\t\t\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\"hover:bg-muted/50 flex gap-3 px-4 py-3 motion-safe:transition-colors\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t!item.read && \"bg-muted/30\",\n\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t{body}\n\t\t\t\t\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\"flex gap-3 px-4 py-3\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t!item.read && \"bg-muted/30\",\n\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t{body}\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t{index < items.length - 1 ? (\n\t\t\t\t\t\t\t\t\t\t\t<div className=\"bg-border h-px\" />\n\t\t\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t\t<div className=\"border-t px-4 py-2\">\n\t\t\t\t\t<a\n\t\t\t\t\t\thref={viewAllHref}\n\t\t\t\t\t\tclassName=\"text-primary block text-center text-sm font-medium hover:underline\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{labels.viewAll}\n\t\t\t\t\t</a>\n\t\t\t\t</div>\n\t\t\t</DropdownMenuContent>\n\t\t</DropdownMenu>\n\t);\n}\n","\"use client\";\n\nexport type EditableSectionMode = \"reading\" | \"editing\" | \"saving\";\n\nexport type EditableSectionLabels = {\n\t/** Visible Edit button label. Default: \"Edit\" */\n\tedit?: string;\n\t/** Visible Save button label. Default: \"Save\" */\n\tsave?: string;\n\t/** Visible Save button label while pending. Default: \"Saving…\" */\n\tsaving?: string;\n\t/** Visible Cancel button label. Default: \"Cancel\" */\n\tcancel?: string;\n\t/** Polite live-region message after a successful save. Default: \"Saved\" */\n\tsaved?: string;\n\t/** ConfirmDestructiveDialog title when discarding dirty edits. */\n\tdiscardTitle?: string;\n\t/** ConfirmDestructiveDialog description when discarding dirty edits. */\n\tdiscardDescription?: string;\n\t/** ConfirmDestructiveDialog confirm label. Default: \"Discard\" */\n\tdiscardConfirm?: string;\n\t/** ConfirmDestructiveDialog cancel label. Default: \"Keep editing\" */\n\tdiscardCancel?: string;\n};\n\nexport const DEFAULT_EDITABLE_SECTION_LABELS = {\n\tedit: \"Edit\",\n\tsave: \"Save\",\n\tsaving: \"Saving…\",\n\tcancel: \"Cancel\",\n\tsaved: \"Saved\",\n\tdiscardTitle: \"Discard changes?\",\n\tdiscardDescription: \"If you leave now, unsaved changes will be lost.\",\n\tdiscardConfirm: \"Discard\",\n\tdiscardCancel: \"Keep editing\",\n} as const satisfies Required<EditableSectionLabels>;\n","\"use client\";\n\nimport {\n\tuseCallback,\n\tuseEffect,\n\tuseId,\n\tuseRef,\n\tuseState,\n\ttype CSSProperties,\n\ttype FormEvent,\n\ttype KeyboardEvent,\n\ttype RefObject,\n} from \"react\";\n\nimport {\n\tDEFAULT_EDITABLE_SECTION_LABELS,\n\ttype EditableSectionLabels,\n\ttype EditableSectionMode,\n} from \"./types\";\n\nexport type UseEditableSectionOptions = {\n\tonSave: () => Promise<void> | void;\n\t/** Called when edit mode exits without saving (Cancel / Escape / discard confirm). */\n\tonDiscard?: () => void;\n\t/** Whether the in-progress edit has unsaved changes. Defaults to false. */\n\tisDirty?: boolean;\n\t/** Id of an existing heading that names this section (preferred). */\n\tlabelledBy?: string;\n\t/** Fallback accessible name when there is no visible heading. */\n\ttitle?: string;\n\tlabels?: EditableSectionLabels;\n\t/**\n\t * After the first edit entry, keep `min-height` at the tallest measured\n\t * content height so later toggles do not shift. First toggle may still shift.\n\t */\n\tstableHeight?: boolean;\n};\n\nexport type UseEditableSectionResult = {\n\tmode: EditableSectionMode;\n\tisEditing: boolean;\n\tisSaving: boolean;\n\tstartEdit: () => void;\n\trequestCancel: () => void;\n\tformProps: {\n\t\tonSubmit: (event: FormEvent<HTMLFormElement>) => void;\n\t\tonKeyDown: (event: KeyboardEvent<HTMLFormElement>) => void;\n\t\tnoValidate: true;\n\t};\n\tcontentRef: RefObject<HTMLElement | null>;\n\teditButtonRef: RefObject<HTMLButtonElement | null>;\n\t/** Form id for associating external submit buttons via the HTML `form` attribute. */\n\tcontentFormId: string;\n\teditButtonProps: {\n\t\ttype: \"button\";\n\t\tid: string;\n\t\tonClick: () => void;\n\t\tref: RefObject<HTMLButtonElement | null>;\n\t\t\"aria-labelledby\"?: string;\n\t\t\"aria-label\"?: string;\n\t};\n\tsaveButtonProps: {\n\t\ttype: \"submit\";\n\t\tdisabled: boolean;\n\t};\n\tcancelButtonProps: {\n\t\ttype: \"button\";\n\t\tonClick: () => void;\n\t\tdisabled: boolean;\n\t};\n\tstatus: string | null;\n\tstatusProps: {\n\t\trole: \"status\";\n\t\t\"aria-live\": \"polite\";\n\t\tclassName: string;\n\t};\n\tconfirmDiscard: {\n\t\topen: boolean;\n\t\tonOpenChange: (open: boolean) => void;\n\t\ttitle: string;\n\t\tdescription: string;\n\t\tconfirmLabel: string;\n\t\tcancelLabel: string;\n\t\tonConfirm: () => void;\n\t};\n\tresolvedLabels: Required<EditableSectionLabels>;\n\tcontentStyle: CSSProperties | undefined;\n\tactionsClassName: string;\n};\n\nfunction focusFirstField(container: HTMLElement | null) {\n\tif (!container) return;\n\tconst target = container.querySelector<HTMLElement>(\n\t\t\"[data-autofocus], input:not([type='hidden']):not([disabled]), select:not([disabled]), textarea:not([disabled]), [contenteditable='true']\",\n\t);\n\ttarget?.focus();\n}\n\nexport function useEditableSection({\n\tonSave,\n\tonDiscard,\n\tisDirty = false,\n\tlabelledBy,\n\ttitle,\n\tlabels,\n\tstableHeight = false,\n}: UseEditableSectionOptions): UseEditableSectionResult {\n\tconst resolvedLabels = {\n\t\t...DEFAULT_EDITABLE_SECTION_LABELS,\n\t\t...labels,\n\t};\n\tconst [mode, setMode] = useState<EditableSectionMode>(\"reading\");\n\tconst [status, setStatus] = useState<string | null>(null);\n\tconst [confirmOpen, setConfirmOpen] = useState(false);\n\tconst [minHeightPx, setMinHeightPx] = useState<number | undefined>(undefined);\n\n\tconst contentRef = useRef<HTMLElement | null>(null);\n\tconst editButtonRef = useRef<HTMLButtonElement | null>(null);\n\tconst measuredHeightRef = useRef(0);\n\tconst shouldFocusEditRef = useRef(false);\n\tconst shouldFocusFirstFieldRef = useRef(false);\n\tconst editButtonId = useId();\n\tconst contentFormId = useId();\n\tconst isEditing = mode === \"editing\" || mode === \"saving\";\n\tconst isSaving = mode === \"saving\";\n\n\tuseEffect(() => {\n\t\tif (mode === \"reading\" && shouldFocusEditRef.current) {\n\t\t\tshouldFocusEditRef.current = false;\n\t\t\teditButtonRef.current?.focus();\n\t\t\treturn;\n\t\t}\n\t\tif (mode === \"editing\" && shouldFocusFirstFieldRef.current) {\n\t\t\tshouldFocusFirstFieldRef.current = false;\n\t\t\tconst invalid = contentRef.current?.querySelector<HTMLElement>(\n\t\t\t\t\"[aria-invalid='true']\",\n\t\t\t);\n\t\t\tif (invalid) {\n\t\t\t\tinvalid.focus();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tfocusFirstField(contentRef.current);\n\t\t}\n\t}, [mode]);\n\n\tconst exitToReading = useCallback(() => {\n\t\tsetConfirmOpen(false);\n\t\tshouldFocusEditRef.current = true;\n\t\tsetMode(\"reading\");\n\t\tonDiscard?.();\n\t}, [onDiscard]);\n\n\tconst startEdit = useCallback(() => {\n\t\tsetStatus(null);\n\t\tshouldFocusFirstFieldRef.current = true;\n\t\tsetMode(\"editing\");\n\t}, []);\n\n\tconst requestCancel = useCallback(() => {\n\t\tif (isSaving) return;\n\t\tif (isDirty) {\n\t\t\tsetConfirmOpen(true);\n\t\t\treturn;\n\t\t}\n\t\texitToReading();\n\t}, [exitToReading, isDirty, isSaving]);\n\n\tconst handleSubmit = useCallback(\n\t\t(event: FormEvent<HTMLFormElement>) => {\n\t\t\tevent.preventDefault();\n\t\t\tif (isSaving) return;\n\n\t\t\tvoid (async () => {\n\t\t\t\tsetMode(\"saving\");\n\t\t\t\tsetStatus(null);\n\t\t\t\ttry {\n\t\t\t\t\tawait onSave();\n\t\t\t\t\tsetStatus(resolvedLabels.saved);\n\t\t\t\t\tshouldFocusEditRef.current = true;\n\t\t\t\t\tsetMode(\"reading\");\n\t\t\t\t} catch {\n\t\t\t\t\tshouldFocusFirstFieldRef.current = true;\n\t\t\t\t\tsetMode(\"editing\");\n\t\t\t\t}\n\t\t\t})();\n\t\t},\n\t\t[isSaving, onSave, resolvedLabels.saved],\n\t);\n\n\tconst handleFormKeyDown = useCallback(\n\t\t(event: KeyboardEvent<HTMLFormElement>) => {\n\t\t\tif (event.key !== \"Escape\") return;\n\t\t\tevent.preventDefault();\n\t\t\trequestCancel();\n\t\t},\n\t\t[requestCancel],\n\t);\n\n\tuseEffect(() => {\n\t\tif (!stableHeight || !isEditing) return;\n\t\tconst el = contentRef.current;\n\t\tif (!el) return;\n\n\t\tconst measure = () => {\n\t\t\tconst height = el.getBoundingClientRect().height;\n\t\t\tif (height > measuredHeightRef.current) {\n\t\t\t\tmeasuredHeightRef.current = height;\n\t\t\t\tsetMinHeightPx(height);\n\t\t\t}\n\t\t};\n\n\t\tmeasure();\n\t\tconst observer = new ResizeObserver(measure);\n\t\tobserver.observe(el);\n\t\treturn () => observer.disconnect();\n\t}, [isEditing, stableHeight]);\n\n\tconst editButtonNameProps =\n\t\tlabelledBy != null\n\t\t\t? { \"aria-labelledby\": `${labelledBy} ${editButtonId}` as const }\n\t\t\t: title != null && title.length > 0\n\t\t\t\t? { \"aria-label\": `${resolvedLabels.edit} ${title}` as const }\n\t\t\t\t: { \"aria-label\": resolvedLabels.edit };\n\n\treturn {\n\t\tmode,\n\t\tisEditing,\n\t\tisSaving,\n\t\tstartEdit,\n\t\trequestCancel,\n\t\tformProps: {\n\t\t\tonSubmit: handleSubmit,\n\t\t\tonKeyDown: handleFormKeyDown,\n\t\t\tnoValidate: true,\n\t\t},\n\t\tcontentRef,\n\t\teditButtonRef,\n\t\tcontentFormId,\n\t\teditButtonProps: {\n\t\t\ttype: \"button\",\n\t\t\tid: editButtonId,\n\t\t\tonClick: startEdit,\n\t\t\tref: editButtonRef,\n\t\t\t...editButtonNameProps,\n\t\t},\n\t\tsaveButtonProps: {\n\t\t\ttype: \"submit\",\n\t\t\tdisabled: isSaving,\n\t\t},\n\t\tcancelButtonProps: {\n\t\t\ttype: \"button\",\n\t\t\tonClick: requestCancel,\n\t\t\tdisabled: isSaving,\n\t\t},\n\t\tstatus,\n\t\tstatusProps: {\n\t\t\trole: \"status\",\n\t\t\t\"aria-live\": \"polite\",\n\t\t\tclassName: \"sr-only\",\n\t\t},\n\t\tconfirmDiscard: {\n\t\t\topen: confirmOpen,\n\t\t\tonOpenChange: setConfirmOpen,\n\t\t\ttitle: resolvedLabels.discardTitle,\n\t\t\tdescription: resolvedLabels.discardDescription,\n\t\t\tconfirmLabel: resolvedLabels.discardConfirm,\n\t\t\tcancelLabel: resolvedLabels.discardCancel,\n\t\t\tonConfirm: exitToReading,\n\t\t},\n\t\tresolvedLabels,\n\t\tcontentStyle:\n\t\t\tstableHeight && minHeightPx != null\n\t\t\t\t? { minHeight: minHeightPx }\n\t\t\t\t: undefined,\n\t\tactionsClassName:\n\t\t\t\"flex min-h-9 min-w-[11rem] flex-wrap items-center justify-end gap-2\",\n\t};\n}\n","\"use client\";\n\nimport type { ReactNode, Ref } from \"react\";\n\nimport { cn } from \"../../lib/utils\";\nimport { ConfirmDestructiveDialog } from \"../ConfirmDestructiveDialog\";\nimport { Button } from \"../ui/button\";\nimport {\n\tuseEditableSection,\n\ttype UseEditableSectionOptions,\n\ttype UseEditableSectionResult,\n} from \"./useEditableSection\";\n\nexport type EditableSectionSlots = {\n\tactions: ReactNode;\n\tcontent: ReactNode;\n\tstatus: ReactNode;\n\tmode: UseEditableSectionResult[\"mode\"];\n\tisSaving: boolean;\n\tisEditing: boolean;\n};\n\nexport type EditableSectionProps = UseEditableSectionOptions & {\n\treadView: () => ReactNode;\n\teditView: () => ReactNode;\n\tclassName?: string;\n\t/**\n\t * Compose chrome yourself (Card, dialog, page header, …). Receives the\n\t * stable actions node, the read/edit content, and the live status region.\n\t * When omitted, actions render above content with no surrounding chrome.\n\t */\n\tchildren?: (slots: EditableSectionSlots) => ReactNode;\n};\n\n/**\n * Chrome-free read-first section: semantic text by default, real `<form>` on\n * Edit, pending Save until `onSave` resolves, and ConfirmDestructiveDialog\n * when Cancel/Escape would discard dirty edits.\n *\n * Does not render a Card — place `actions` wherever your layout needs them.\n */\nexport function EditableSection({\n\treadView,\n\teditView,\n\tchildren,\n\tclassName,\n\t...options\n}: EditableSectionProps) {\n\tconst section = useEditableSection(options);\n\tconst {\n\t\tisEditing,\n\t\tisSaving,\n\t\tformProps,\n\t\tcontentRef,\n\t\tcontentFormId,\n\t\teditButtonProps,\n\t\tsaveButtonProps,\n\t\tcancelButtonProps,\n\t\tstatus,\n\t\tstatusProps,\n\t\tconfirmDiscard,\n\t\tresolvedLabels,\n\t\tcontentStyle,\n\t\tactionsClassName,\n\t\tmode,\n\t} = section;\n\n\tconst actionButtons = !isEditing ? (\n\t\t<Button variant=\"outline\" size=\"sm\" {...editButtonProps}>\n\t\t\t{resolvedLabels.edit}\n\t\t</Button>\n\t) : (\n\t\t<>\n\t\t\t<Button variant=\"outline\" size=\"sm\" {...cancelButtonProps}>\n\t\t\t\t{resolvedLabels.cancel}\n\t\t\t</Button>\n\t\t\t<Button\n\t\t\t\tsize=\"sm\"\n\t\t\t\ttype=\"submit\"\n\t\t\t\tform={contentFormId}\n\t\t\t\tdisabled={saveButtonProps.disabled}\n\t\t\t>\n\t\t\t\t{isSaving ? resolvedLabels.saving : resolvedLabels.save}\n\t\t\t</Button>\n\t\t</>\n\t);\n\n\tconst actions = (\n\t\t<div data-slot=\"editable-section-actions\" className={actionsClassName}>\n\t\t\t{actionButtons}\n\t\t</div>\n\t);\n\n\tconst content = isEditing ? (\n\t\t<form\n\t\t\tid={contentFormId}\n\t\t\tref={contentRef as Ref<HTMLFormElement>}\n\t\t\tdata-slot=\"editable-section-content\"\n\t\t\tclassName={cn(\"yenio-editable-section-content space-y-4\")}\n\t\t\tstyle={contentStyle}\n\t\t\t{...formProps}\n\t\t>\n\t\t\t{editView()}\n\t\t</form>\n\t) : (\n\t\t<div\n\t\t\tref={contentRef as Ref<HTMLDivElement>}\n\t\t\tdata-slot=\"editable-section-content\"\n\t\t\tclassName=\"yenio-editable-section-content\"\n\t\t\tstyle={contentStyle}\n\t\t>\n\t\t\t{readView()}\n\t\t</div>\n\t);\n\n\tconst statusNode = (\n\t\t<span {...statusProps} data-slot=\"editable-section-status\">\n\t\t\t{status}\n\t\t</span>\n\t);\n\n\tconst dialog = (\n\t\t<ConfirmDestructiveDialog\n\t\t\topen={confirmDiscard.open}\n\t\t\tonOpenChange={confirmDiscard.onOpenChange}\n\t\t\ttitle={confirmDiscard.title}\n\t\t\tdescription={confirmDiscard.description}\n\t\t\tconfirmLabel={confirmDiscard.confirmLabel}\n\t\t\tcancelLabel={confirmDiscard.cancelLabel}\n\t\t\tonConfirm={confirmDiscard.onConfirm}\n\t\t/>\n\t);\n\n\tif (children) {\n\t\treturn (\n\t\t\t<>\n\t\t\t\t{children({\n\t\t\t\t\tactions,\n\t\t\t\t\tcontent,\n\t\t\t\t\tstatus: statusNode,\n\t\t\t\t\tmode,\n\t\t\t\t\tisSaving,\n\t\t\t\t\tisEditing,\n\t\t\t\t})}\n\t\t\t\t{dialog}\n\t\t\t</>\n\t\t);\n\t}\n\n\treturn (\n\t\t<div data-slot=\"editable-section\" className={cn(\"space-y-4\", className)}>\n\t\t\t{actions}\n\t\t\t{content}\n\t\t\t{statusNode}\n\t\t\t{dialog}\n\t\t</div>\n\t);\n}\n","\"use client\";\n\nimport type { ComponentProps, ReactNode } from \"react\";\n\nimport { cn } from \"../../lib/utils\";\n\n/**\n * Read-mode description list. Column grid and label placement match the\n * typical edit-form field stack (`flex flex-col gap-1.5` + `text-sm` label)\n * so labels and values keep the same x-position across modes.\n */\nexport type DataListProps = ComponentProps<\"dl\">;\n\nexport function DataList({ className, ...props }: DataListProps) {\n\treturn (\n\t\t<dl\n\t\t\tdata-slot=\"data-list\"\n\t\t\tclassName={cn(\"grid gap-4 sm:grid-cols-2\", className)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nexport type DataListItemProps = {\n\tlabel: ReactNode;\n\tchildren?: ReactNode;\n\t/** Shown when `children` is nullish or an empty string. Default: \"—\" */\n\tempty?: ReactNode;\n\tclassName?: string;\n\tlabelClassName?: string;\n\tvalueClassName?: string;\n};\n\nexport function DataListItem({\n\tlabel,\n\tchildren,\n\tempty = \"—\",\n\tclassName,\n\tlabelClassName,\n\tvalueClassName,\n}: DataListItemProps) {\n\tconst isEmpty =\n\t\tchildren == null ||\n\t\tchildren === false ||\n\t\t(typeof children === \"string\" && children.trim().length === 0);\n\n\treturn (\n\t\t<div\n\t\t\tdata-slot=\"data-list-item\"\n\t\t\tclassName={cn(\"flex flex-col gap-1.5\", className)}\n\t\t>\n\t\t\t<dt\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"text-sm leading-none font-medium peer-disabled:cursor-not-allowed peer-disabled:opacity-70\",\n\t\t\t\t\tlabelClassName,\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t{label}\n\t\t\t</dt>\n\t\t\t<dd\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"text-sm wrap-break-word\",\n\t\t\t\t\tisEmpty && \"text-muted-foreground\",\n\t\t\t\t\tvalueClassName,\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t{isEmpty ? empty : children}\n\t\t\t</dd>\n\t\t</div>\n\t);\n}\n","\"use client\";\n\nimport type { ComponentProps, ReactNode } from \"react\";\n\nimport { cn } from \"../../lib/utils\";\n\nexport type FieldMessageProps = Omit<ComponentProps<\"p\">, \"children\"> & {\n\tchildren?: ReactNode;\n\t/**\n\t * Id referenced by the field's `aria-describedby`. Required when the\n\t * message is shown so assistive tech can associate it with the control.\n\t */\n\tid?: string;\n};\n\n/**\n * Reserved slot for field-level validation copy. Always occupies `min-h-5`\n * so async errors do not shift fields under the pointer (CLS outside the\n * 500ms input exclusion window).\n */\nexport function FieldMessage({\n\tid,\n\tchildren,\n\tclassName,\n\t...props\n}: FieldMessageProps) {\n\tconst hasMessage =\n\t\tchildren != null &&\n\t\tchildren !== false &&\n\t\t!(typeof children === \"string\" && children.trim().length === 0);\n\n\treturn (\n\t\t<p\n\t\t\tid={id}\n\t\t\trole={hasMessage ? \"alert\" : undefined}\n\t\t\tdata-slot=\"field-message\"\n\t\t\tclassName={cn(\"min-h-5 text-xs text-destructive\", className)}\n\t\t\t{...props}\n\t\t>\n\t\t\t{hasMessage ? children : \"\\u00a0\"}\n\t\t</p>\n\t);\n}\n","\"use client\";\n\nimport {\n\tuseLayoutEffect,\n\tuseRef,\n\tuseState,\n\ttype ImgHTMLAttributes,\n\ttype ReactNode,\n\ttype SyntheticEvent,\n} from \"react\";\n\nexport type SafeImageProps = Omit<\n\tImgHTMLAttributes<HTMLImageElement>,\n\t\"src\" | \"onError\"\n> & {\n\tsrc?: string | null;\n\t/** Rendered when `src` is missing/empty or the image fails to load. */\n\tfallback: ReactNode;\n\tonError?: (event: SyntheticEvent<HTMLImageElement>) => void;\n};\n\nfunction isBrokenImage(img: HTMLImageElement): boolean {\n\t// Cached failures / races before `onError` attaches often leave\n\t// `complete === true` with a zero natural size instead of firing `error`.\n\treturn img.complete && img.naturalWidth === 0;\n}\n\n/**\n * `<img>` that swaps to `fallback` when the source is missing or fails to load,\n * so the browser never shows its default broken-image glyph.\n */\nexport function SafeImage({\n\tsrc,\n\tfallback,\n\talt = \"\",\n\tonError,\n\t...imgProps\n}: SafeImageProps) {\n\tconst [failed, setFailed] = useState(false);\n\tconst imgRef = useRef<HTMLImageElement | null>(null);\n\tconst resolvedSrc = typeof src === \"string\" && src.length > 0 ? src : null;\n\n\tuseLayoutEffect(() => {\n\t\tsetFailed(false);\n\t}, [resolvedSrc]);\n\n\tuseLayoutEffect(() => {\n\t\tconst img = imgRef.current;\n\t\tif (img && isBrokenImage(img)) {\n\t\t\tsetFailed(true);\n\t\t}\n\t}, [resolvedSrc, failed]);\n\n\tif (!resolvedSrc || failed) {\n\t\treturn <>{fallback}</>;\n\t}\n\n\treturn (\n\t\t<img\n\t\t\t{...imgProps}\n\t\t\tref={imgRef}\n\t\t\tsrc={resolvedSrc}\n\t\t\talt={alt}\n\t\t\tonError={(event) => {\n\t\t\t\tsetFailed(true);\n\t\t\t\tonError?.(event);\n\t\t\t}}\n\t\t/>\n\t);\n}\n","\"use client\";\n\nimport { useTheme } from \"next-themes\";\nimport { Monitor, Moon, Sun } from \"lucide-react\";\nimport { useEffect, useState, useCallback } from \"react\";\nimport {\n\tDropdownMenu,\n\tDropdownMenuContent,\n\tDropdownMenuItem,\n\tDropdownMenuTrigger,\n\tminiMenuContentClassName,\n\tminiMenuContentDefaults,\n} from \"./ui/dropdown-menu\";\nimport { Button } from \"./ui/button\";\nimport { cn } from \"../lib/utils\";\n\ntype ThemeKey = \"system\" | \"light\" | \"dark\";\n\nexport type ThemeSwitcherLabels = {\n\t/** Accessible name for the theme trigger */\n\ttheme?: string;\n\t/** Label for \"System\" option */\n\tsystem?: string;\n\t/** Label for \"Light\" option */\n\tlight?: string;\n\t/** Label for \"Dark\" option */\n\tdark?: string;\n};\n\nconst defaultLabels: Required<ThemeSwitcherLabels> = {\n\ttheme: \"Theme\",\n\tsystem: \"System\",\n\tlight: \"Light\",\n\tdark: \"Dark\",\n};\n\nexport type ThemeSwitcherProps = {\n\tclassName?: string;\n\t/** Size of the trigger */\n\tsize?: \"sm\" | \"md\" | \"lg\";\n\t/** Shape of the trigger */\n\tshape?: \"rounded\" | \"pill\";\n\t/**\n\t * Kept for existing callers. Both variants render the stored theme's icon\n\t * (sun, moon, or monitor) and open the system / light / dark menu.\n\t */\n\tvariant?: \"default\" | \"mini\";\n\t/** Dropdown alignment */\n\talign?: \"start\" | \"center\" | \"end\";\n\t/** Dropdown side */\n\tside?: \"top\" | \"bottom\" | \"left\" | \"right\";\n\t/** @deprecated No longer used; the trigger no longer renders a tooltip. */\n\ttooltipSide?: \"top\" | \"right\" | \"bottom\" | \"left\";\n\t/** @deprecated No longer used; the trigger no longer renders a tooltip. */\n\ttooltipAlign?: \"start\" | \"center\" | \"end\";\n\t/** @deprecated No longer used; the trigger no longer renders a tooltip. */\n\ttooltipSideOffset?: number;\n\t/** Translation labels - consumers can pass their own t() values */\n\tlabels?: ThemeSwitcherLabels;\n};\n\nconst sizeClasses = {\n\tsm: { button: \"size-8\", icon: \"size-4\" },\n\tmd: { button: \"size-8\", icon: \"size-4\" },\n\tlg: { button: \"size-9\", icon: \"size-4\" },\n};\n\nconst shapeClasses = {\n\trounded: \"rounded-md\",\n\tpill: \"rounded-full\",\n};\n\n/** Compact outline icon button: thin border, muted glyph, no fill. */\nconst iconTriggerClassName =\n\t\"border border-border bg-transparent text-muted-foreground shadow-none hover:bg-accent hover:text-foreground dark:border-border dark:bg-transparent dark:text-muted-foreground dark:hover:bg-accent/50\";\n\nconst themeIcons = {\n\tsystem: Monitor,\n\tlight: Sun,\n\tdark: Moon,\n} as const;\n\nconst themes = [\n\t{ key: \"system\" as const, icon: themeIcons.system },\n\t{ key: \"light\" as const, icon: themeIcons.light },\n\t{ key: \"dark\" as const, icon: themeIcons.dark },\n];\n\nfunction storedTheme(value: string | undefined): ThemeKey | undefined {\n\tif (value === \"system\" || value === \"light\" || value === \"dark\") return value;\n\treturn undefined;\n}\n\nexport function ThemeSwitcher({\n\tclassName,\n\tsize = \"sm\",\n\tshape = \"rounded\",\n\talign = \"end\",\n\tside = \"bottom\",\n\tlabels: userLabels,\n}: ThemeSwitcherProps) {\n\tconst { theme, setTheme } = useTheme();\n\tconst [mounted, setMounted] = useState(false);\n\tconst sizes = sizeClasses[size];\n\tconst shapeClass = shapeClasses[shape];\n\tconst labels = { ...defaultLabels, ...userLabels };\n\n\tconst handleThemeClick = useCallback(\n\t\t(themeKey: ThemeKey) => {\n\t\t\tsetTheme(themeKey);\n\t\t},\n\t\t[setTheme],\n\t);\n\n\tuseEffect(() => {\n\t\tsetMounted(true);\n\t}, []);\n\n\tif (!mounted) {\n\t\treturn (\n\t\t\t<div\n\t\t\t\taria-hidden\n\t\t\t\tclassName={cn(\n\t\t\t\t\tsizes.button,\n\t\t\t\t\tshapeClass,\n\t\t\t\t\ticonTriggerClassName,\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t/>\n\t\t);\n\t}\n\n\tconst currentTheme = storedTheme(theme);\n\tconst TriggerIcon = currentTheme ? themeIcons[currentTheme] : Monitor;\n\n\treturn (\n\t\t<DropdownMenu modal={false}>\n\t\t\t<DropdownMenuTrigger asChild>\n\t\t\t\t<Button\n\t\t\t\t\tdata-testid=\"theme-switcher\"\n\t\t\t\t\tvariant=\"outline\"\n\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\taria-label={labels.theme}\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\tsizes.button,\n\t\t\t\t\t\tshapeClass,\n\t\t\t\t\t\ticonTriggerClassName,\n\t\t\t\t\t\tclassName,\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t<TriggerIcon className={sizes.icon} />\n\t\t\t\t</Button>\n\t\t\t</DropdownMenuTrigger>\n\t\t\t<DropdownMenuContent\n\t\t\t\tside={side}\n\t\t\t\talign={align}\n\t\t\t\tsideOffset={miniMenuContentDefaults.sideOffset}\n\t\t\t\tcollisionPadding={miniMenuContentDefaults.collisionPadding}\n\t\t\t\tclassName={miniMenuContentClassName}\n\t\t\t>\n\t\t\t\t{themes.map(({ key, icon: Icon }) => (\n\t\t\t\t\t<DropdownMenuItem\n\t\t\t\t\t\tkey={key}\n\t\t\t\t\t\tonClick={() => handleThemeClick(key)}\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\"gap-2 cursor-pointer\",\n\t\t\t\t\t\t\tcurrentTheme === key &&\n\t\t\t\t\t\t\t\t\"bg-accent text-accent-foreground [&_svg]:text-accent-foreground\",\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t<Icon className=\"size-4\" />\n\t\t\t\t\t\t<span>{labels[key]}</span>\n\t\t\t\t\t</DropdownMenuItem>\n\t\t\t\t))}\n\t\t\t</DropdownMenuContent>\n\t\t</DropdownMenu>\n\t);\n}\n","\"use client\";\n\nimport { Languages } from \"lucide-react\";\nimport {\n\tDropdownMenu,\n\tDropdownMenuContent,\n\tDropdownMenuItem,\n\tDropdownMenuTrigger,\n\tminiMenuContentClassName,\n\tminiMenuContentDefaults,\n} from \"./ui/dropdown-menu\";\nimport { Button } from \"./ui/button\";\nimport { cn } from \"../lib/utils\";\nimport { useLanguageContext } from \"../contexts\";\n\nexport type Language = {\n\t/** Language key/code (e.g., \"en\", \"es\") */\n\tkey: string;\n\t/** Short label kept for callers that still pass segmented copy */\n\tlabel: string;\n\t/** Full native name for the menu (e.g., \"English\", \"Español\") */\n\tnativeName: string;\n};\n\nexport type LanguageSwitcherLabels = {\n\t/** Accessible name for the language trigger */\n\tlanguage?: string;\n};\n\n/**\n * Default languages when none are provided via props or context.\n */\nexport const defaultLanguages: Language[] = [\n\t{ key: \"es-MX\", label: \"ES\", nativeName: \"Español (México)\" },\n\t{ key: \"en\", label: \"EN\", nativeName: \"English\" },\n];\n\nexport type LanguageSwitcherProps = {\n\t/**\n\t * Available languages. Optional if using LanguageContext.\n\t * When context is available, context.languages is used; props override context.\n\t * Falls back to defaultLanguages if neither provided.\n\t */\n\tlanguages?: Language[];\n\t/**\n\t * Current selected language key. Optional if using LanguageContext.\n\t * When context is available, context.language is used; props override context.\n\t */\n\tcurrentLanguage?: string;\n\t/**\n\t * Callback when language changes. Optional if using LanguageContext.\n\t * When context is available, context.setLanguage is used; props override context.\n\t */\n\tonLanguageChange?: (languageKey: string) => void;\n\t/** Accessible name for the trigger */\n\tlabels?: LanguageSwitcherLabels;\n\tclassName?: string;\n\t/** Size of the trigger */\n\tsize?: \"sm\" | \"md\" | \"lg\";\n\t/** Shape of the trigger */\n\tshape?: \"rounded\" | \"squared\" | \"pill\";\n\t/**\n\t * Kept for existing callers. Both variants render the languages glyph\n\t * and open the locale menu.\n\t */\n\tvariant?: \"default\" | \"mini\";\n\t/** @deprecated The trigger is always the languages glyph. */\n\tshowIcon?: boolean;\n\t/** Dropdown alignment */\n\talign?: \"start\" | \"center\" | \"end\";\n\t/** Dropdown side */\n\tside?: \"top\" | \"bottom\" | \"left\" | \"right\";\n\t/** @deprecated No longer used; the trigger no longer renders a tooltip. */\n\ttooltipSide?: \"top\" | \"right\" | \"bottom\" | \"left\";\n\t/** @deprecated No longer used; the trigger no longer renders a tooltip. */\n\ttooltipAlign?: \"start\" | \"center\" | \"end\";\n\t/** @deprecated No longer used; the trigger no longer renders a tooltip. */\n\ttooltipSideOffset?: number;\n};\n\nconst sizeClasses = {\n\tsm: { button: \"size-8\", icon: \"size-4\" },\n\tmd: { button: \"size-8\", icon: \"size-4\" },\n\tlg: { button: \"size-9\", icon: \"size-4\" },\n};\n\nconst shapeClasses = {\n\trounded: \"rounded-md\",\n\tsquared: \"rounded-sm\",\n\tpill: \"rounded-full\",\n};\n\n/** Compact outline icon button: thin border, muted glyph, no fill. */\nconst iconTriggerClassName =\n\t\"border border-border bg-transparent text-muted-foreground shadow-none hover:bg-accent hover:text-foreground dark:border-border dark:bg-transparent dark:text-muted-foreground dark:hover:bg-accent/50\";\n\nexport function LanguageSwitcher({\n\tlanguages: propLanguages,\n\tcurrentLanguage: propCurrentLanguage,\n\tonLanguageChange: propOnLanguageChange,\n\tlabels = {},\n\tclassName,\n\tsize = \"sm\",\n\tshape = \"rounded\",\n\talign = \"end\",\n\tside = \"bottom\",\n}: LanguageSwitcherProps) {\n\tconst context = useLanguageContext();\n\n\tconst contextLanguages = context?.languages?.map((lang) => ({\n\t\tkey: lang.code,\n\t\tlabel: lang.code.toUpperCase(),\n\t\tnativeName: lang.name,\n\t}));\n\n\tconst languages = propLanguages ?? contextLanguages ?? defaultLanguages;\n\tconst currentLanguage = propCurrentLanguage ?? context?.language ?? \"en\";\n\tconst onLanguageChange = propOnLanguageChange ?? context?.setLanguage;\n\n\tconst sizes = sizeClasses[size];\n\tconst shapeClass = shapeClasses[shape];\n\tconst accessibleName = labels.language ?? \"Language\";\n\n\treturn (\n\t\t<DropdownMenu modal={false}>\n\t\t\t<DropdownMenuTrigger asChild>\n\t\t\t\t<Button\n\t\t\t\t\tvariant=\"outline\"\n\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\taria-label={accessibleName}\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\tsizes.button,\n\t\t\t\t\t\tshapeClass,\n\t\t\t\t\t\ticonTriggerClassName,\n\t\t\t\t\t\tclassName,\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t<Languages className={sizes.icon} />\n\t\t\t\t</Button>\n\t\t\t</DropdownMenuTrigger>\n\t\t\t<DropdownMenuContent\n\t\t\t\tside={side}\n\t\t\t\talign={align}\n\t\t\t\tsideOffset={miniMenuContentDefaults.sideOffset}\n\t\t\t\tcollisionPadding={miniMenuContentDefaults.collisionPadding}\n\t\t\t\tclassName={cn(miniMenuContentClassName, \"min-w-0 w-auto\")}\n\t\t\t>\n\t\t\t\t{languages.map(({ key, nativeName }) => (\n\t\t\t\t\t<DropdownMenuItem\n\t\t\t\t\t\tkey={key}\n\t\t\t\t\t\tonClick={() => onLanguageChange?.(key)}\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\"justify-center text-xs font-semibold cursor-pointer px-3\",\n\t\t\t\t\t\t\tcurrentLanguage === key && \"bg-accent text-accent-foreground\",\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t{nativeName}\n\t\t\t\t\t</DropdownMenuItem>\n\t\t\t\t))}\n\t\t\t</DropdownMenuContent>\n\t\t</DropdownMenu>\n\t);\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport * as SliderPrimitive from \"@radix-ui/react-slider\";\n\nimport { cn } from \"../../lib/utils\";\n\nfunction Slider({\n\tclassName,\n\tdefaultValue,\n\tvalue,\n\tmin = 0,\n\tmax = 100,\n\t...props\n}: React.ComponentProps<typeof SliderPrimitive.Root>) {\n\tconst _values = React.useMemo(\n\t\t() =>\n\t\t\tArray.isArray(value)\n\t\t\t\t? value\n\t\t\t\t: Array.isArray(defaultValue)\n\t\t\t\t\t? defaultValue\n\t\t\t\t\t: [min, max],\n\t\t[value, defaultValue, min, max],\n\t);\n\n\treturn (\n\t\t<SliderPrimitive.Root\n\t\t\tdata-slot=\"slider\"\n\t\t\tdefaultValue={defaultValue}\n\t\t\tvalue={value}\n\t\t\tmin={min}\n\t\t\tmax={max}\n\t\t\tclassName={cn(\n\t\t\t\t\"relative flex w-full touch-none items-center select-none data-[disabled]:opacity-50 data-[orientation=vertical]:h-full data-[orientation=vertical]:min-h-44 data-[orientation=vertical]:w-auto data-[orientation=vertical]:flex-col\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t>\n\t\t\t<SliderPrimitive.Track\n\t\t\t\tdata-slot=\"slider-track\"\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"bg-muted relative grow overflow-hidden rounded-full data-[orientation=horizontal]:h-1.5 data-[orientation=horizontal]:w-full data-[orientation=vertical]:h-full data-[orientation=vertical]:w-1.5\",\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t<SliderPrimitive.Range\n\t\t\t\t\tdata-slot=\"slider-range\"\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"bg-primary absolute data-[orientation=horizontal]:h-full data-[orientation=vertical]:w-full\",\n\t\t\t\t\t)}\n\t\t\t\t/>\n\t\t\t</SliderPrimitive.Track>\n\t\t\t{Array.from({ length: _values.length }, (_, index) => (\n\t\t\t\t<SliderPrimitive.Thumb\n\t\t\t\t\tdata-slot=\"slider-thumb\"\n\t\t\t\t\tkey={index}\n\t\t\t\t\tclassName=\"border-primary ring-ring/50 block size-4 shrink-0 rounded-full border bg-white shadow-sm transition-[color,box-shadow] hover:ring-4 focus-visible:ring-4 focus-visible:outline-hidden disabled:pointer-events-none disabled:opacity-50\"\n\t\t\t\t/>\n\t\t\t))}\n\t\t</SliderPrimitive.Root>\n\t);\n}\n\nexport { Slider };\n","\"use client\";\n\nimport * as React from \"react\";\nimport * as TogglePrimitive from \"@radix-ui/react-toggle\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\n\nimport { cn } from \"../../lib/utils\";\n\nconst toggleVariants = cva(\n\t\"inline-flex items-center justify-center gap-2 rounded-md text-sm font-medium hover:bg-muted hover:text-muted-foreground disabled:pointer-events-none disabled:opacity-50 data-[state=on]:bg-accent data-[state=on]:text-accent-foreground [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 [&_svg]:shrink-0 focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] outline-none transition-[color,box-shadow] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive whitespace-nowrap\",\n\t{\n\t\tvariants: {\n\t\t\tvariant: {\n\t\t\t\tdefault: \"bg-transparent\",\n\t\t\t\toutline:\n\t\t\t\t\t\"border border-input bg-transparent shadow-xs hover:bg-accent hover:text-accent-foreground\",\n\t\t\t},\n\t\t\tsize: {\n\t\t\t\tdefault: \"h-9 px-2 min-w-9\",\n\t\t\t\tsm: \"h-8 px-1.5 min-w-8\",\n\t\t\t\tlg: \"h-10 px-2.5 min-w-10\",\n\t\t\t},\n\t\t},\n\t\tdefaultVariants: {\n\t\t\tvariant: \"default\",\n\t\t\tsize: \"default\",\n\t\t},\n\t},\n);\n\nfunction Toggle({\n\tclassName,\n\tvariant,\n\tsize,\n\t...props\n}: React.ComponentProps<typeof TogglePrimitive.Root> &\n\tVariantProps<typeof toggleVariants>) {\n\treturn (\n\t\t<TogglePrimitive.Root\n\t\t\tdata-slot=\"toggle\"\n\t\t\tclassName={cn(toggleVariants({ variant, size, className }))}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nexport { Toggle, toggleVariants };\n","/**\n * @name AvatarEditor\n * @description A compact, reusable avatar editor that crops to a 1:1 square.\n * Supports zooming, rotating, and repositioning with an optional grid overlay.\n * The editor shows a circular guide in the UI; the exported image stays square\n * (no circular pixel mask). Display avatars as circles with CSS elsewhere.\n * This is a controlled component - the parent manages the image state.\n *\n * @example\n * ```tsx\n * import { AvatarEditor } from \"@/components/avatar-editor\"\n *\n * export default function ProfileForm() {\n * const [avatarData, setAvatarData] = useState<string | null>(null)\n *\n * return (\n * <form>\n * <AvatarEditor\n * value={avatarData}\n * onChange={setAvatarData}\n * size={280}\n * />\n * <button type=\"submit\">Submit Form</button>\n * </form>\n * )\n * }\n * ```\n *\n * @props\n * - `value` - The current cropped image as a data URL (controlled)\n * - `onChange` - Callback when the cropped image changes\n * - `size` - Size of the editor container in pixels (default: 280)\n * - `showGrid` - Whether to show the alignment grid overlay (default: false)\n * - `outputSize` - Size of the square output image in pixels (default: 256)\n * - `outputFormat` - Output format: 'png' | 'jpeg' | 'webp' (default: 'png')\n * - `outputQuality` - Quality for jpeg/webp output 0-1 (default: 0.92)\n * - `className` - Additional class names\n * - `controlSize` - Control size variant - 'default' for desktop, 'large' for mobile/touch devices (default: 'default')\n *\n * @accessibility\n * - Full keyboard navigation support\n * - ARIA labels for all controls\n * - High contrast focus indicators\n *\n * @dependencies\n * - lucide-react (icons)\n * - @/components/ui/button\n * - @/components/ui/slider\n * - @/components/ui/toggle\n */\n\"use client\";\n\nimport type * as React from \"react\";\nimport { useCallback, useRef, useState, useEffect } from \"react\";\nimport {\n\tUpload,\n\tZoomIn,\n\tZoomOut,\n\tRotateCcw,\n\tRotateCw,\n\tGrid3X3,\n\tX,\n\tMove,\n\tRefreshCw,\n} from \"lucide-react\";\nimport { Button } from \"./ui/button\";\nimport { Slider } from \"./ui/slider\";\nimport { Toggle } from \"./ui/toggle\";\nimport { cn } from \"../lib/utils\";\n\nexport type AvatarEditorLabels = {\n\tuploadAria?: string;\n\tuploadHint?: string;\n\tuploadFormats?: string;\n\tdragging?: string;\n\tzoomOut?: string;\n\tzoomIn?: string;\n\tzoomLevel?: string;\n\trotateLeft?: string;\n\trotateRight?: string;\n\ttoggleGrid?: string;\n\treset?: string;\n\treplace?: string;\n\tdiscard?: string;\n};\n\nconst DEFAULT_LABELS: Required<AvatarEditorLabels> = {\n\tuploadAria: \"Upload image\",\n\tuploadHint: \"Click to upload\",\n\tuploadFormats: \"PNG, JPG up to 10MB\",\n\tdragging: \"Dragging\",\n\tzoomOut: \"Zoom out\",\n\tzoomIn: \"Zoom in\",\n\tzoomLevel: \"Zoom level\",\n\trotateLeft: \"Rotate left 15 degrees\",\n\trotateRight: \"Rotate right 15 degrees\",\n\ttoggleGrid: \"Toggle grid overlay\",\n\treset: \"Reset all transforms\",\n\treplace: \"Upload new image\",\n\tdiscard: \"Discard image\",\n};\n\nexport interface AvatarEditorProps {\n\t/** Current cropped image as data URL (controlled) */\n\tvalue?: string | null;\n\t/** Callback when the cropped image changes */\n\tonChange?: (dataUrl: string | null) => void;\n\t/** Size of the editor container in pixels */\n\tsize?: number;\n\t/** Whether to show grid overlay by default */\n\tshowGrid?: boolean;\n\t/** Square output image size in pixels (width === height) */\n\toutputSize?: number;\n\t/** Output format */\n\toutputFormat?: \"png\" | \"jpeg\" | \"webp\";\n\t/** Output quality for jpeg/webp (0-1) */\n\toutputQuality?: number;\n\t/** Additional class names */\n\tclassName?: string;\n\t/** Control size variant - 'default' for desktop, 'large' for mobile/touch devices */\n\tcontrolSize?: \"default\" | \"large\";\n\t/** Override English chrome strings */\n\tlabels?: AvatarEditorLabels;\n}\n\nexport function AvatarEditor({\n\tvalue: _value,\n\tonChange,\n\tsize = 280,\n\tshowGrid: initialShowGrid = false,\n\toutputSize = 256,\n\toutputFormat = \"png\",\n\toutputQuality = 0.92,\n\tclassName,\n\tcontrolSize = \"default\",\n\tlabels,\n}: AvatarEditorProps) {\n\tconst t = { ...DEFAULT_LABELS, ...labels };\n\tconst canvasRef = useRef<HTMLCanvasElement>(null);\n\tconst fileInputRef = useRef<HTMLInputElement>(null);\n\tconst containerRef = useRef<HTMLDivElement>(null);\n\n\tconst [image, setImage] = useState<HTMLImageElement | null>(null);\n\tconst [imageLoaded, setImageLoaded] = useState(false);\n\tconst [zoom, setZoom] = useState(1);\n\tconst [rotation, setRotation] = useState(0);\n\tconst [position, setPosition] = useState({ x: 0, y: 0 });\n\tconst [isDragging, setIsDragging] = useState(false);\n\tconst [dragStart, setDragStart] = useState({ x: 0, y: 0 });\n\tconst [showGrid, setShowGrid] = useState(initialShowGrid);\n\n\tconst generateOutput = useCallback(() => {\n\t\tif (!canvasRef.current || !image) return null;\n\n\t\tconst outputCanvas = document.createElement(\"canvas\");\n\t\toutputCanvas.width = outputSize;\n\t\toutputCanvas.height = outputSize;\n\t\tconst ctx = outputCanvas.getContext(\"2d\");\n\t\tif (!ctx) return null;\n\n\t\tctx.drawImage(canvasRef.current, 0, 0, outputSize, outputSize);\n\n\t\tconst mimeType = `image/${outputFormat}`;\n\t\treturn outputCanvas.toDataURL(mimeType, outputQuality);\n\t}, [image, outputSize, outputFormat, outputQuality]);\n\n\tuseEffect(() => {\n\t\tif (!canvasRef.current || !image || !imageLoaded) return;\n\n\t\tconst canvas = canvasRef.current;\n\t\tconst ctx = canvas.getContext(\"2d\");\n\t\tif (!ctx) return;\n\n\t\tconst displaySize = size;\n\t\tcanvas.width = displaySize;\n\t\tcanvas.height = displaySize;\n\n\t\t// Square crop only — circular mask/guide stays in CSS/SVG overlays so it\n\t\t// never gets baked into the exported data URL.\n\t\tctx.clearRect(0, 0, displaySize, displaySize);\n\n\t\tctx.save();\n\t\tctx.translate(displaySize / 2, displaySize / 2);\n\t\tctx.rotate((rotation * Math.PI) / 180);\n\n\t\tconst scale = zoom;\n\t\tconst imgAspect = image.width / image.height;\n\t\tlet drawWidth, drawHeight;\n\n\t\tif (imgAspect > 1) {\n\t\t\tdrawHeight = displaySize * scale;\n\t\t\tdrawWidth = drawHeight * imgAspect;\n\t\t} else {\n\t\t\tdrawWidth = displaySize * scale;\n\t\t\tdrawHeight = drawWidth / imgAspect;\n\t\t}\n\n\t\tctx.drawImage(\n\t\t\timage,\n\t\t\t-drawWidth / 2 + position.x,\n\t\t\t-drawHeight / 2 + position.y,\n\t\t\tdrawWidth,\n\t\t\tdrawHeight,\n\t\t);\n\t\tctx.restore();\n\n\t\tconst dataUrl = generateOutput();\n\t\tif (dataUrl) {\n\t\t\tonChange?.(dataUrl);\n\t\t}\n\t}, [\n\t\timage,\n\t\timageLoaded,\n\t\tzoom,\n\t\trotation,\n\t\tposition,\n\t\tsize,\n\t\tgenerateOutput,\n\t\tonChange,\n\t]);\n\n\tconst resetTransforms = useCallback(() => {\n\t\tsetZoom(1);\n\t\tsetRotation(0);\n\t\tsetPosition({ x: 0, y: 0 });\n\t}, []);\n\n\tconst handleFileSelect = useCallback(\n\t\t(e: React.ChangeEvent<HTMLInputElement>) => {\n\t\t\tconst file = e.target.files?.[0];\n\t\t\tif (!file) return;\n\n\t\t\tconst reader = new FileReader();\n\t\t\treader.onload = (event) => {\n\t\t\t\tconst img = new Image();\n\t\t\t\timg.crossOrigin = \"anonymous\";\n\t\t\t\timg.onload = () => {\n\t\t\t\t\tsetImage(img);\n\t\t\t\t\tsetImageLoaded(true);\n\t\t\t\t\tresetTransforms();\n\t\t\t\t};\n\t\t\t\timg.src = event.target?.result as string;\n\t\t\t};\n\t\t\treader.readAsDataURL(file);\n\t\t},\n\t\t[resetTransforms],\n\t);\n\n\tconst handleMouseDown = useCallback(\n\t\t(e: React.MouseEvent) => {\n\t\t\tif (!imageLoaded) return;\n\t\t\tsetIsDragging(true);\n\t\t\tsetDragStart({ x: e.clientX - position.x, y: e.clientY - position.y });\n\t\t},\n\t\t[imageLoaded, position],\n\t);\n\n\tconst handleMouseMove = useCallback(\n\t\t(e: React.MouseEvent) => {\n\t\t\tif (!isDragging) return;\n\t\t\tsetPosition({\n\t\t\t\tx: e.clientX - dragStart.x,\n\t\t\t\ty: e.clientY - dragStart.y,\n\t\t\t});\n\t\t},\n\t\t[isDragging, dragStart],\n\t);\n\n\tconst handleMouseUp = useCallback(() => {\n\t\tsetIsDragging(false);\n\t}, []);\n\n\tconst handleTouchStart = useCallback(\n\t\t(e: React.TouchEvent) => {\n\t\t\tif (!imageLoaded) return;\n\t\t\tconst touch = e.touches[0];\n\t\t\tsetIsDragging(true);\n\t\t\tsetDragStart({\n\t\t\t\tx: touch.clientX - position.x,\n\t\t\t\ty: touch.clientY - position.y,\n\t\t\t});\n\t\t},\n\t\t[imageLoaded, position],\n\t);\n\n\tconst handleTouchMove = useCallback(\n\t\t(e: React.TouchEvent) => {\n\t\t\tif (!isDragging) return;\n\t\t\tconst touch = e.touches[0];\n\t\t\tsetPosition({\n\t\t\t\tx: touch.clientX - dragStart.x,\n\t\t\t\ty: touch.clientY - dragStart.y,\n\t\t\t});\n\t\t},\n\t\t[isDragging, dragStart],\n\t);\n\n\tconst handleDiscard = useCallback(() => {\n\t\tsetImage(null);\n\t\tsetImageLoaded(false);\n\t\tresetTransforms();\n\t\tif (fileInputRef.current) {\n\t\t\tfileInputRef.current.value = \"\";\n\t\t}\n\t\tonChange?.(null);\n\t}, [resetTransforms, onChange]);\n\n\tconst handleZoomIn = () => setZoom((z) => Math.min(z + 0.1, 3));\n\tconst handleZoomOut = () => setZoom((z) => Math.max(z - 0.1, 0.5));\n\tconst handleRotateLeft = () => setRotation((r) => r - 15);\n\tconst handleRotateRight = () => setRotation((r) => r + 15);\n\n\tconst isLarge = controlSize === \"large\";\n\tconst buttonSize = isLarge ? \"h-12 w-12\" : \"h-8 w-8\";\n\tconst iconSize = isLarge ? \"w-6 h-6\" : \"w-4 h-4\";\n\tconst smallIconSize = isLarge ? \"w-5 h-5\" : \"w-3 h-3\";\n\tconst textSize = isLarge ? \"text-sm\" : \"text-xs\";\n\tconst uploadIconSize = isLarge ? \"w-12 h-12\" : \"w-8 h-8\";\n\tconst uploadContainerSize = isLarge ? \"w-24 h-24\" : \"w-16 h-16\";\n\tconst gapSize = isLarge ? \"gap-6\" : \"gap-4\";\n\tconst controlGap = isLarge ? \"gap-3\" : \"gap-2\";\n\tconst sliderHeight = isLarge\n\t\t? \"[&_[role=slider]]:h-6 [&_[role=slider]]:w-6\"\n\t\t: \"\";\n\tconst guideRadius = size / 2 - 2;\n\tconst guideCenter = size / 2;\n\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\"flex flex-col\", gapSize, className)}\n\t\t\tstyle={{ width: size }}\n\t\t>\n\t\t\t{/* Canvas Container */}\n\t\t\t<div\n\t\t\t\tref={containerRef}\n\t\t\t\tclassName=\"relative bg-muted rounded-2xl overflow-hidden\"\n\t\t\t\tstyle={{ width: size, height: size }}\n\t\t\t>\n\t\t\t\t{/* Upload placeholder */}\n\t\t\t\t{!imageLoaded && (\n\t\t\t\t\t<button\n\t\t\t\t\t\tonClick={() => fileInputRef.current?.click()}\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\"absolute inset-0 z-10 flex flex-col items-center justify-center text-muted-foreground hover:text-foreground hover:bg-muted/80 transition-colors cursor-pointer\",\n\t\t\t\t\t\t\tisLarge ? \"gap-4\" : \"gap-3\",\n\t\t\t\t\t\t)}\n\t\t\t\t\t\taria-label={t.uploadAria}\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\"rounded-full bg-primary/10 flex items-center justify-center\",\n\t\t\t\t\t\t\t\tuploadContainerSize,\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Upload className={cn(\"text-primary\", uploadIconSize)} />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<span\n\t\t\t\t\t\t\tclassName={cn(\"font-medium\", isLarge ? \"text-base\" : \"text-sm\")}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{t.uploadHint}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t<span className={cn(\"text-muted-foreground\", textSize)}>\n\t\t\t\t\t\t\t{t.uploadFormats}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</button>\n\t\t\t\t)}\n\n\t\t\t\t{/* Canvas — full square pixels (what gets exported) */}\n\t\t\t\t<canvas\n\t\t\t\t\tref={canvasRef}\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"absolute inset-0\",\n\t\t\t\t\t\timageLoaded ? \"cursor-move\" : \"pointer-events-none opacity-0\",\n\t\t\t\t\t)}\n\t\t\t\t\tstyle={{ width: size, height: size }}\n\t\t\t\t\tonMouseDown={handleMouseDown}\n\t\t\t\t\tonMouseMove={handleMouseMove}\n\t\t\t\t\tonMouseUp={handleMouseUp}\n\t\t\t\t\tonMouseLeave={handleMouseUp}\n\t\t\t\t\tonTouchStart={handleTouchStart}\n\t\t\t\t\tonTouchMove={handleTouchMove}\n\t\t\t\t\tonTouchEnd={handleMouseUp}\n\t\t\t\t/>\n\n\t\t\t\t{/* Circular guide + dimmed corners (CSS/SVG only — not in export) */}\n\t\t\t\t{imageLoaded && (\n\t\t\t\t\t<svg\n\t\t\t\t\t\twidth={size}\n\t\t\t\t\t\theight={size}\n\t\t\t\t\t\tclassName=\"pointer-events-none absolute inset-0\"\n\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<path\n\t\t\t\t\t\t\td={`M0 0H${size}V${size}H0Z M${guideCenter - guideRadius} ${guideCenter}a${guideRadius} ${guideRadius} 0 1 0 ${guideRadius * 2} 0a${guideRadius} ${guideRadius} 0 1 0 ${-guideRadius * 2} 0`}\n\t\t\t\t\t\t\tfill=\"rgb(0 0 0 / 0.45)\"\n\t\t\t\t\t\t\tfillRule=\"evenodd\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<circle\n\t\t\t\t\t\t\tcx={guideCenter}\n\t\t\t\t\t\t\tcy={guideCenter}\n\t\t\t\t\t\t\tr={guideRadius}\n\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\tstroke=\"hsl(var(--primary))\"\n\t\t\t\t\t\t\tstrokeWidth=\"3\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</svg>\n\t\t\t\t)}\n\n\t\t\t\t{/* Grid Overlay */}\n\t\t\t\t{showGrid && imageLoaded && (\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName=\"absolute inset-0 pointer-events-none\"\n\t\t\t\t\t\tstyle={{ width: size, height: size }}\n\t\t\t\t\t>\n\t\t\t\t\t\t<svg width={size} height={size} className=\"opacity-30\">\n\t\t\t\t\t\t\t<line\n\t\t\t\t\t\t\t\tx1={size / 3}\n\t\t\t\t\t\t\t\ty1={0}\n\t\t\t\t\t\t\t\tx2={size / 3}\n\t\t\t\t\t\t\t\ty2={size}\n\t\t\t\t\t\t\t\tstroke=\"white\"\n\t\t\t\t\t\t\t\tstrokeWidth=\"1\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t<line\n\t\t\t\t\t\t\t\tx1={(size * 2) / 3}\n\t\t\t\t\t\t\t\ty1={0}\n\t\t\t\t\t\t\t\tx2={(size * 2) / 3}\n\t\t\t\t\t\t\t\ty2={size}\n\t\t\t\t\t\t\t\tstroke=\"white\"\n\t\t\t\t\t\t\t\tstrokeWidth=\"1\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t<line\n\t\t\t\t\t\t\t\tx1={0}\n\t\t\t\t\t\t\t\ty1={size / 3}\n\t\t\t\t\t\t\t\tx2={size}\n\t\t\t\t\t\t\t\ty2={size / 3}\n\t\t\t\t\t\t\t\tstroke=\"white\"\n\t\t\t\t\t\t\t\tstrokeWidth=\"1\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t<line\n\t\t\t\t\t\t\t\tx1={0}\n\t\t\t\t\t\t\t\ty1={(size * 2) / 3}\n\t\t\t\t\t\t\t\tx2={size}\n\t\t\t\t\t\t\t\ty2={(size * 2) / 3}\n\t\t\t\t\t\t\t\tstroke=\"white\"\n\t\t\t\t\t\t\t\tstrokeWidth=\"1\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t<line\n\t\t\t\t\t\t\t\tx1={size / 2 - 10}\n\t\t\t\t\t\t\t\ty1={size / 2}\n\t\t\t\t\t\t\t\tx2={size / 2 + 10}\n\t\t\t\t\t\t\t\ty2={size / 2}\n\t\t\t\t\t\t\t\tstroke=\"white\"\n\t\t\t\t\t\t\t\tstrokeWidth=\"1\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t<line\n\t\t\t\t\t\t\t\tx1={size / 2}\n\t\t\t\t\t\t\t\ty1={size / 2 - 10}\n\t\t\t\t\t\t\t\tx2={size / 2}\n\t\t\t\t\t\t\t\ty2={size / 2 + 10}\n\t\t\t\t\t\t\t\tstroke=\"white\"\n\t\t\t\t\t\t\t\tstrokeWidth=\"1\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</svg>\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\n\t\t\t\t{/* Drag indicator */}\n\t\t\t\t{imageLoaded && isDragging && (\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\"absolute top-2 left-1/2 -translate-x-1/2 bg-black/60 rounded text-white flex items-center\",\n\t\t\t\t\t\t\tisLarge ? \"px-3 py-2 text-sm gap-2\" : \"px-2 py-1 text-xs gap-1\",\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t<Move className={smallIconSize} />\n\t\t\t\t\t\t{t.dragging}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</div>\n\n\t\t\t{/* Controls - only show when image is loaded */}\n\t\t\t{imageLoaded && (\n\t\t\t\t<div className={cn(\"space-y-4\", isLarge && \"space-y-5\")}>\n\t\t\t\t\t{/* Zoom Slider */}\n\t\t\t\t\t<div className={cn(\"flex items-center\", controlGap)}>\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\t\t\tclassName={cn(buttonSize, \"shrink-0\")}\n\t\t\t\t\t\t\tonClick={handleZoomOut}\n\t\t\t\t\t\t\taria-label={t.zoomOut}\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<ZoomOut className={iconSize} />\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t<Slider\n\t\t\t\t\t\t\tvalue={[zoom]}\n\t\t\t\t\t\t\tonValueChange={([v]) => setZoom(v)}\n\t\t\t\t\t\t\tmin={0.5}\n\t\t\t\t\t\t\tmax={3}\n\t\t\t\t\t\t\tstep={0.01}\n\t\t\t\t\t\t\tclassName={cn(\"flex-1\", sliderHeight)}\n\t\t\t\t\t\t\taria-label={t.zoomLevel}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\t\t\tclassName={cn(buttonSize, \"shrink-0\")}\n\t\t\t\t\t\t\tonClick={handleZoomIn}\n\t\t\t\t\t\t\taria-label={t.zoomIn}\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<ZoomIn className={iconSize} />\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t{/* Rotation & Grid Controls */}\n\t\t\t\t\t<div className={cn(\"flex items-center justify-between\", controlGap)}>\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclassName={cn(\"flex items-center\", isLarge ? \"gap-2\" : \"gap-1\")}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\t\t\t\tclassName={buttonSize}\n\t\t\t\t\t\t\t\tonClick={handleRotateLeft}\n\t\t\t\t\t\t\t\taria-label={t.rotateLeft}\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<RotateCcw className={iconSize} />\n\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\"text-muted-foreground text-center tabular-nums\",\n\t\t\t\t\t\t\t\t\ttextSize,\n\t\t\t\t\t\t\t\t\tisLarge ? \"w-16\" : \"w-12\",\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{rotation}°\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\t\t\t\tclassName={buttonSize}\n\t\t\t\t\t\t\t\tonClick={handleRotateRight}\n\t\t\t\t\t\t\t\taria-label={t.rotateRight}\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<RotateCw className={iconSize} />\n\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclassName={cn(\"flex items-center\", isLarge ? \"gap-2\" : \"gap-1\")}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Toggle\n\t\t\t\t\t\t\t\tpressed={showGrid}\n\t\t\t\t\t\t\t\tonPressedChange={setShowGrid}\n\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\tclassName={cn(buttonSize, \"p-0\")}\n\t\t\t\t\t\t\t\taria-label={t.toggleGrid}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<Grid3X3 className={iconSize} />\n\t\t\t\t\t\t\t</Toggle>\n\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\t\t\t\tclassName={buttonSize}\n\t\t\t\t\t\t\t\tonClick={resetTransforms}\n\t\t\t\t\t\t\t\taria-label={t.reset}\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<RefreshCw className={iconSize} />\n\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\t\t\t\tclassName={buttonSize}\n\t\t\t\t\t\t\t\tonClick={() => fileInputRef.current?.click()}\n\t\t\t\t\t\t\t\taria-label={t.replace}\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<Upload className={iconSize} />\n\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t{/* Discard button */}\n\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\tbuttonSize,\n\t\t\t\t\t\t\t\t\t\"text-destructive hover:text-destructive hover:bg-destructive/10\",\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\tonClick={handleDiscard}\n\t\t\t\t\t\t\t\taria-label={t.discard}\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<X className={iconSize} />\n\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t)}\n\n\t\t\t{/* Hidden file input */}\n\t\t\t<input\n\t\t\t\tref={fileInputRef}\n\t\t\t\ttype=\"file\"\n\t\t\t\taccept=\"image/*\"\n\t\t\t\tonChange={handleFileSelect}\n\t\t\t\tclassName=\"hidden\"\n\t\t\t\taria-hidden=\"true\"\n\t\t\t/>\n\t\t</div>\n\t);\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport * as DialogPrimitive from \"@radix-ui/react-dialog\";\nimport { XIcon } from \"lucide-react\";\n\nimport { cn } from \"../../lib/utils\";\n\nfunction Dialog({\n\t...props\n}: React.ComponentProps<typeof DialogPrimitive.Root>) {\n\treturn <DialogPrimitive.Root data-slot=\"dialog\" {...props} />;\n}\n\nfunction DialogTrigger({\n\t...props\n}: React.ComponentProps<typeof DialogPrimitive.Trigger>) {\n\treturn <DialogPrimitive.Trigger data-slot=\"dialog-trigger\" {...props} />;\n}\n\nfunction DialogPortal({\n\t...props\n}: React.ComponentProps<typeof DialogPrimitive.Portal>) {\n\treturn <DialogPrimitive.Portal data-slot=\"dialog-portal\" {...props} />;\n}\n\nfunction DialogClose({\n\t...props\n}: React.ComponentProps<typeof DialogPrimitive.Close>) {\n\treturn <DialogPrimitive.Close data-slot=\"dialog-close\" {...props} />;\n}\n\nfunction DialogOverlay({\n\tclassName,\n\t...props\n}: React.ComponentProps<typeof DialogPrimitive.Overlay>) {\n\treturn (\n\t\t<DialogPrimitive.Overlay\n\t\t\tdata-slot=\"dialog-overlay\"\n\t\t\tclassName={cn(\n\t\t\t\t\"data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 bg-black/50\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction DialogContent({\n\tclassName,\n\tchildren,\n\tshowCloseButton = true,\n\t...props\n}: React.ComponentProps<typeof DialogPrimitive.Content> & {\n\tshowCloseButton?: boolean;\n}) {\n\treturn (\n\t\t<DialogPortal data-slot=\"dialog-portal\">\n\t\t\t<DialogOverlay />\n\t\t\t<DialogPrimitive.Content\n\t\t\t\tdata-slot=\"dialog-content\"\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"bg-background data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 fixed top-[50%] left-[50%] z-50 grid w-full max-w-[calc(100%-2rem)] translate-x-[-50%] translate-y-[-50%] gap-4 rounded-lg border p-6 shadow-lg duration-200 outline-none sm:max-w-lg\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t\t{showCloseButton && (\n\t\t\t\t\t<DialogPrimitive.Close\n\t\t\t\t\t\tdata-slot=\"dialog-close\"\n\t\t\t\t\t\tclassName=\"ring-offset-background focus:ring-ring data-[state=open]:bg-accent data-[state=open]:text-muted-foreground absolute top-4 right-4 rounded-xs opacity-70 transition-opacity hover:opacity-100 focus:ring-2 focus:ring-offset-2 focus:outline-hidden disabled:pointer-events-none [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<XIcon />\n\t\t\t\t\t\t<span className=\"sr-only\">Close</span>\n\t\t\t\t\t</DialogPrimitive.Close>\n\t\t\t\t)}\n\t\t\t</DialogPrimitive.Content>\n\t\t</DialogPortal>\n\t);\n}\n\nfunction DialogHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n\treturn (\n\t\t<div\n\t\t\tdata-slot=\"dialog-header\"\n\t\t\tclassName={cn(\"flex flex-col gap-2 text-center sm:text-left\", className)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction DialogFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n\treturn (\n\t\t<div\n\t\t\tdata-slot=\"dialog-footer\"\n\t\t\tclassName={cn(\n\t\t\t\t\"flex flex-col-reverse gap-2 sm:flex-row sm:justify-end\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction DialogTitle({\n\tclassName,\n\t...props\n}: React.ComponentProps<typeof DialogPrimitive.Title>) {\n\treturn (\n\t\t<DialogPrimitive.Title\n\t\t\tdata-slot=\"dialog-title\"\n\t\t\tclassName={cn(\"text-lg leading-none font-semibold\", className)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction DialogDescription({\n\tclassName,\n\t...props\n}: React.ComponentProps<typeof DialogPrimitive.Description>) {\n\treturn (\n\t\t<DialogPrimitive.Description\n\t\t\tdata-slot=\"dialog-description\"\n\t\t\tclassName={cn(\"text-muted-foreground text-sm\", className)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nexport {\n\tDialog,\n\tDialogClose,\n\tDialogContent,\n\tDialogDescription,\n\tDialogFooter,\n\tDialogHeader,\n\tDialogOverlay,\n\tDialogPortal,\n\tDialogTitle,\n\tDialogTrigger,\n};\n","\"use client\";\n\nimport * as React from \"react\";\nimport { Drawer as DrawerPrimitive } from \"vaul\";\n\nimport { cn } from \"../../lib/utils\";\n\nfunction Drawer({\n\t...props\n}: React.ComponentProps<typeof DrawerPrimitive.Root>) {\n\treturn <DrawerPrimitive.Root data-slot=\"drawer\" {...props} />;\n}\n\nfunction DrawerTrigger({\n\t...props\n}: React.ComponentProps<typeof DrawerPrimitive.Trigger>) {\n\treturn <DrawerPrimitive.Trigger data-slot=\"drawer-trigger\" {...props} />;\n}\n\nfunction DrawerPortal({\n\t...props\n}: React.ComponentProps<typeof DrawerPrimitive.Portal>) {\n\treturn <DrawerPrimitive.Portal data-slot=\"drawer-portal\" {...props} />;\n}\n\nfunction DrawerClose({\n\t...props\n}: React.ComponentProps<typeof DrawerPrimitive.Close>) {\n\treturn <DrawerPrimitive.Close data-slot=\"drawer-close\" {...props} />;\n}\n\nfunction DrawerOverlay({\n\tclassName,\n\t...props\n}: React.ComponentProps<typeof DrawerPrimitive.Overlay>) {\n\treturn (\n\t\t<DrawerPrimitive.Overlay\n\t\t\tdata-slot=\"drawer-overlay\"\n\t\t\tclassName={cn(\n\t\t\t\t\"data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 bg-black/50\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction DrawerContent({\n\tclassName,\n\tchildren,\n\t...props\n}: React.ComponentProps<typeof DrawerPrimitive.Content>) {\n\treturn (\n\t\t<DrawerPortal data-slot=\"drawer-portal\">\n\t\t\t<DrawerOverlay />\n\t\t\t<DrawerPrimitive.Content\n\t\t\t\tdata-slot=\"drawer-content\"\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"group/drawer-content bg-background fixed z-50 flex h-auto flex-col\",\n\t\t\t\t\t\"data-[vaul-drawer-direction=top]:inset-x-0 data-[vaul-drawer-direction=top]:top-0 data-[vaul-drawer-direction=top]:mb-24 data-[vaul-drawer-direction=top]:max-h-[80vh] data-[vaul-drawer-direction=top]:rounded-b-lg data-[vaul-drawer-direction=top]:border-b\",\n\t\t\t\t\t\"data-[vaul-drawer-direction=bottom]:inset-x-0 data-[vaul-drawer-direction=bottom]:bottom-0 data-[vaul-drawer-direction=bottom]:mt-24 data-[vaul-drawer-direction=bottom]:max-h-[80vh] data-[vaul-drawer-direction=bottom]:rounded-t-lg data-[vaul-drawer-direction=bottom]:border-t\",\n\t\t\t\t\t\"data-[vaul-drawer-direction=right]:inset-y-0 data-[vaul-drawer-direction=right]:right-0 data-[vaul-drawer-direction=right]:w-3/4 data-[vaul-drawer-direction=right]:border-l data-[vaul-drawer-direction=right]:sm:max-w-sm\",\n\t\t\t\t\t\"data-[vaul-drawer-direction=left]:inset-y-0 data-[vaul-drawer-direction=left]:left-0 data-[vaul-drawer-direction=left]:w-3/4 data-[vaul-drawer-direction=left]:border-r data-[vaul-drawer-direction=left]:sm:max-w-sm\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t<div className=\"bg-muted mx-auto mt-4 hidden h-2 w-[100px] shrink-0 rounded-full group-data-[vaul-drawer-direction=bottom]/drawer-content:block\" />\n\t\t\t\t{children}\n\t\t\t</DrawerPrimitive.Content>\n\t\t</DrawerPortal>\n\t);\n}\n\nfunction DrawerHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n\treturn (\n\t\t<div\n\t\t\tdata-slot=\"drawer-header\"\n\t\t\tclassName={cn(\n\t\t\t\t\"flex flex-col gap-0.5 p-4 group-data-[vaul-drawer-direction=bottom]/drawer-content:text-center group-data-[vaul-drawer-direction=top]/drawer-content:text-center md:gap-1.5 md:text-left\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction DrawerFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n\treturn (\n\t\t<div\n\t\t\tdata-slot=\"drawer-footer\"\n\t\t\tclassName={cn(\"mt-auto flex flex-col gap-2 p-4\", className)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction DrawerTitle({\n\tclassName,\n\t...props\n}: React.ComponentProps<typeof DrawerPrimitive.Title>) {\n\treturn (\n\t\t<DrawerPrimitive.Title\n\t\t\tdata-slot=\"drawer-title\"\n\t\t\tclassName={cn(\"text-foreground font-semibold\", className)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction DrawerDescription({\n\tclassName,\n\t...props\n}: React.ComponentProps<typeof DrawerPrimitive.Description>) {\n\treturn (\n\t\t<DrawerPrimitive.Description\n\t\t\tdata-slot=\"drawer-description\"\n\t\t\tclassName={cn(\"text-muted-foreground text-sm\", className)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nexport {\n\tDrawer,\n\tDrawerPortal,\n\tDrawerOverlay,\n\tDrawerTrigger,\n\tDrawerClose,\n\tDrawerContent,\n\tDrawerHeader,\n\tDrawerFooter,\n\tDrawerTitle,\n\tDrawerDescription,\n};\n","/**\n * @name AvatarEditorDialog\n * @description A complete avatar editing experience with a preview display and edit dialog.\n * Shows a large avatar with an edit button. Opens fullscreen dialog on mobile, modal on desktop.\n * Handles save/upload callbacks with success/error feedback.\n *\n * @example\n * ```tsx\n * import { AvatarEditorDialog } from \"@/components/avatar-editor-dialog\"\n *\n * export default function ProfilePage() {\n * const [avatar, setAvatar] = useState<string | null>(null)\n *\n * const handleSave = async (dataUrl: string) => {\n * await uploadAvatar(dataUrl)\n * }\n *\n * return (\n * <AvatarEditorDialog\n * value={avatar}\n * onChange={setAvatar}\n * onSave={handleSave}\n * />\n * )\n * }\n * ```\n */\n\"use client\";\nimport { useState, useCallback, useEffect } from \"react\";\nimport { Pencil, User, X, Check, Loader2 } from \"lucide-react\";\nimport { AvatarEditor, type AvatarEditorLabels } from \"./AvatarEditor\";\nimport { SafeImage } from \"./media/SafeImage\";\nimport { Button } from \"./ui/button\";\nimport {\n\tDialog,\n\tDialogContent,\n\tDialogHeader,\n\tDialogTitle,\n\tDialogFooter,\n\tDialogClose,\n} from \"./ui/dialog\";\nimport {\n\tDrawer,\n\tDrawerContent,\n\tDrawerHeader,\n\tDrawerTitle,\n\tDrawerFooter,\n\tDrawerClose,\n} from \"./ui/drawer\";\nimport { cn } from \"../lib/utils\";\nimport { motion, AnimatePresence } from \"framer-motion\";\n\nexport interface AvatarEditorDialogProps {\n\t/** Current avatar URL or data URL */\n\tvalue?: string | null;\n\t/** Callback when avatar changes (after accepting) */\n\tonChange?: (dataUrl: string | null) => void;\n\t/** Async callback for saving/uploading - return true for success, false for failure */\n\tonSave?: (dataUrl: string) => Promise<boolean> | boolean;\n\t/** Size of the displayed avatar in pixels */\n\tdisplaySize?: number;\n\t/** Size of the editor in the dialog */\n\teditorSize?: number;\n\t/** Output image size */\n\toutputSize?: number;\n\t/** Placeholder text when no avatar */\n\tplaceholder?: string;\n\t/** Edit button label for accessibility */\n\teditLabel?: string;\n\t/** Dialog title */\n\tdialogTitle?: string;\n\t/** Accept button text */\n\tacceptText?: string;\n\t/** Cancel button text */\n\tcancelText?: string;\n\t/** Saving button text while upload is in progress */\n\tsavingText?: string;\n\t/** Saved button text after a successful save */\n\tsavedText?: string;\n\t/** Success message */\n\tsuccessMessage?: string;\n\t/** Error message */\n\terrorMessage?: string;\n\t/** Additional class names */\n\tclassName?: string;\n\t/** Override AvatarEditor chrome strings */\n\teditorLabels?: AvatarEditorLabels;\n}\n\nfunction useMediaQuery(query: string): boolean {\n\tconst [matches, setMatches] = useState(false);\n\n\tuseEffect(() => {\n\t\tconst media = window.matchMedia(query);\n\t\tif (media.matches !== matches) {\n\t\t\tsetMatches(media.matches);\n\t\t}\n\t\tconst listener = () => setMatches(media.matches);\n\t\tmedia.addEventListener(\"change\", listener);\n\t\treturn () => media.removeEventListener(\"change\", listener);\n\t}, [matches, query]);\n\n\treturn matches;\n}\n\nexport function AvatarEditorDialog({\n\tvalue,\n\tonChange,\n\tonSave,\n\tdisplaySize = 120,\n\teditorSize = 280,\n\toutputSize = 256,\n\tplaceholder = \"Add Photo\",\n\teditLabel = \"Edit avatar\",\n\tdialogTitle = \"Edit Avatar\",\n\tacceptText = \"Accept\",\n\tcancelText = \"Cancel\",\n\tsavingText = \"Saving...\",\n\tsavedText = \"Saved!\",\n\tsuccessMessage = \"Avatar saved successfully!\",\n\terrorMessage = \"Failed to save avatar. Please try again.\",\n\tclassName,\n\teditorLabels,\n}: AvatarEditorDialogProps) {\n\tconst [isOpen, setIsOpen] = useState(false);\n\tconst [editedValue, setEditedValue] = useState<string | null>(value ?? null);\n\tconst [displaySrc, setDisplaySrc] = useState<string | null>(value ?? null);\n\tconst [isSaving, setIsSaving] = useState(false);\n\tconst [feedback, setFeedback] = useState<{\n\t\ttype: \"success\" | \"error\";\n\t\tmessage: string;\n\t} | null>(null);\n\n\tuseEffect(() => {\n\t\tsetDisplaySrc(value ?? null);\n\t}, [value]);\n\n\tconst isMobile = useMediaQuery(\"(max-width: 640px)\");\n\tconst caption = (placeholder ?? \"\").trim();\n\n\t// Sync edited value when dialog opens\n\tconst handleOpenChange = useCallback(\n\t\t(open: boolean) => {\n\t\t\tif (open) {\n\t\t\t\tsetEditedValue(value ?? null);\n\t\t\t\tsetFeedback(null);\n\t\t\t}\n\t\t\tsetIsOpen(open);\n\t\t},\n\t\t[value],\n\t);\n\n\t// Handle accept/save\n\tconst handleAccept = useCallback(async () => {\n\t\tif (!editedValue) return;\n\n\t\tsetIsSaving(true);\n\t\tsetFeedback(null);\n\n\t\ttry {\n\t\t\tif (onSave) {\n\t\t\t\tconst result = await onSave(editedValue);\n\t\t\t\tif (result) {\n\t\t\t\t\tsetDisplaySrc(editedValue);\n\t\t\t\t\tonChange?.(editedValue);\n\t\t\t\t\tsetFeedback({ type: \"success\", message: successMessage });\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\tsetIsOpen(false);\n\t\t\t\t\t\tsetFeedback(null);\n\t\t\t\t\t}, 1500);\n\t\t\t\t} else {\n\t\t\t\t\tsetFeedback({ type: \"error\", message: errorMessage });\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tsetDisplaySrc(editedValue);\n\t\t\t\tonChange?.(editedValue);\n\t\t\t\tsetFeedback({ type: \"success\", message: successMessage });\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tsetIsOpen(false);\n\t\t\t\t\tsetFeedback(null);\n\t\t\t\t}, 1500);\n\t\t\t}\n\t\t} catch {\n\t\t\tsetFeedback({ type: \"error\", message: errorMessage });\n\t\t} finally {\n\t\t\tsetIsSaving(false);\n\t\t}\n\t}, [editedValue, onChange, onSave, successMessage, errorMessage]);\n\n\t// Avatar display component\n\tconst AvatarDisplay = (\n\t\t<div\n\t\t\tclassName={cn(\"relative group\", className)}\n\t\t\tstyle={{ width: displaySize, height: displaySize }}\n\t\t>\n\t\t\t{/* Avatar circle */}\n\t\t\t<div\n\t\t\t\tclassName=\"relative w-full h-full rounded-full overflow-hidden bg-muted border-2 border-border flex items-center justify-center\"\n\t\t\t\tstyle={{ width: displaySize, height: displaySize }}\n\t\t\t>\n\t\t\t\t<SafeImage\n\t\t\t\t\tsrc={displaySrc}\n\t\t\t\t\talt=\"Avatar\"\n\t\t\t\t\tclassName=\"absolute inset-0 h-full w-full object-cover\"\n\t\t\t\t\tfallback={\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\"flex flex-col items-center justify-center text-muted-foreground\",\n\t\t\t\t\t\t\t\tcaption ? \"gap-1\" : \"gap-0\",\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<User\n\t\t\t\t\t\t\t\tclassName=\"h-1/2 w-1/2 max-h-[55%] max-w-[55%] shrink-0\"\n\t\t\t\t\t\t\t\taria-hidden\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t{caption ? (\n\t\t\t\t\t\t\t\t<span className=\"text-xs text-center px-1\">{caption}</span>\n\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t}\n\t\t\t\t/>\n\t\t\t</div>\n\n\t\t\t{/* Edit button - bottom right */}\n\t\t\t<button\n\t\t\t\tonClick={() => handleOpenChange(true)}\n\t\t\t\tclassName=\"absolute bottom-0 right-0 w-8 h-8 rounded-full bg-primary text-primary-foreground flex items-center justify-center shadow-lg hover:bg-primary/90 transition-colors focus:outline-none focus:ring-2 focus:ring-primary focus:ring-offset-2\"\n\t\t\t\taria-label={editLabel}\n\t\t\t\ttype=\"button\"\n\t\t\t>\n\t\t\t\t<Pencil className=\"w-4 h-4\" />\n\t\t\t</button>\n\t\t</div>\n\t);\n\n\tconst mobileEditorSize = isMobile\n\t\t? Math.min(editorSize + 40, window.innerWidth - 48)\n\t\t: editorSize;\n\n\t// Editor content (shared between dialog and drawer)\n\tconst EditorContent = (\n\t\t<div className=\"flex flex-col items-center gap-4\">\n\t\t\t<AvatarEditor\n\t\t\t\tvalue={editedValue}\n\t\t\t\tonChange={setEditedValue}\n\t\t\t\tsize={mobileEditorSize}\n\t\t\t\toutputSize={outputSize}\n\t\t\t\tcontrolSize={isMobile ? \"large\" : \"default\"}\n\t\t\t\tlabels={editorLabels}\n\t\t\t/>\n\n\t\t\t{/* Feedback message */}\n\t\t\t<AnimatePresence>\n\t\t\t\t{feedback && (\n\t\t\t\t\t<motion.div\n\t\t\t\t\t\tinitial={{ opacity: 0, y: -10 }}\n\t\t\t\t\t\tanimate={{ opacity: 1, y: 0 }}\n\t\t\t\t\t\texit={{ opacity: 0, y: -10 }}\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\"flex items-center gap-2 rounded-lg font-medium\",\n\t\t\t\t\t\t\tisMobile ? \"px-5 py-3 text-base\" : \"px-4 py-2 text-sm\",\n\t\t\t\t\t\t\tfeedback.type === \"success\"\n\t\t\t\t\t\t\t\t? \"bg-green-100 text-green-800 dark:bg-green-900/30 dark:text-green-400\"\n\t\t\t\t\t\t\t\t: \"bg-red-100 text-red-800 dark:bg-red-900/30 dark:text-red-400\",\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t{feedback.type === \"success\" ? (\n\t\t\t\t\t\t\t<Check className={isMobile ? \"w-5 h-5\" : \"w-4 h-4\"} />\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<X className={isMobile ? \"w-5 h-5\" : \"w-4 h-4\"} />\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{feedback.message}\n\t\t\t\t\t</motion.div>\n\t\t\t\t)}\n\t\t\t</AnimatePresence>\n\t\t</div>\n\t);\n\n\t// Footer buttons (shared)\n\tconst FooterButtons = (\n\t\t<>\n\t\t\t{isMobile ? (\n\t\t\t\t<DrawerClose asChild>\n\t\t\t\t\t<Button\n\t\t\t\t\t\tvariant=\"outline\"\n\t\t\t\t\t\tdisabled={isSaving}\n\t\t\t\t\t\tsize=\"lg\"\n\t\t\t\t\t\tclassName=\"flex-1 bg-transparent\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{cancelText}\n\t\t\t\t\t</Button>\n\t\t\t\t</DrawerClose>\n\t\t\t) : (\n\t\t\t\t<DialogClose asChild>\n\t\t\t\t\t<Button variant=\"outline\" disabled={isSaving}>\n\t\t\t\t\t\t{cancelText}\n\t\t\t\t\t</Button>\n\t\t\t\t</DialogClose>\n\t\t\t)}\n\t\t\t<Button\n\t\t\t\tonClick={handleAccept}\n\t\t\t\tdisabled={!editedValue || isSaving || feedback?.type === \"success\"}\n\t\t\t\tsize={isMobile ? \"lg\" : \"default\"}\n\t\t\t\tclassName={isMobile ? \"flex-1\" : \"\"}\n\t\t\t>\n\t\t\t\t{isSaving ? (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<Loader2\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\"mr-2 animate-spin\",\n\t\t\t\t\t\t\t\tisMobile ? \"w-5 h-5\" : \"w-4 h-4\",\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t{savingText}\n\t\t\t\t\t</>\n\t\t\t\t) : feedback?.type === \"success\" ? (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<Check className={cn(\"mr-2\", isMobile ? \"w-5 h-5\" : \"w-4 h-4\")} />\n\t\t\t\t\t\t{savedText}\n\t\t\t\t\t</>\n\t\t\t\t) : (\n\t\t\t\t\tacceptText\n\t\t\t\t)}\n\t\t\t</Button>\n\t\t</>\n\t);\n\n\t// Mobile: Drawer (fullscreen-like)\n\tif (isMobile) {\n\t\treturn (\n\t\t\t<>\n\t\t\t\t{AvatarDisplay}\n\t\t\t\t<Drawer open={isOpen} onOpenChange={handleOpenChange}>\n\t\t\t\t\t<DrawerContent className=\"max-h-[96vh]\">\n\t\t\t\t\t\t<DrawerHeader className=\"text-center\">\n\t\t\t\t\t\t\t<DrawerTitle className=\"text-xl\">{dialogTitle}</DrawerTitle>\n\t\t\t\t\t\t</DrawerHeader>\n\t\t\t\t\t\t<div className=\"px-6 pb-6 overflow-y-auto\">{EditorContent}</div>\n\t\t\t\t\t\t<DrawerFooter className=\"flex-row gap-3 px-6 pb-8\">\n\t\t\t\t\t\t\t{FooterButtons}\n\t\t\t\t\t\t</DrawerFooter>\n\t\t\t\t\t</DrawerContent>\n\t\t\t\t</Drawer>\n\t\t\t</>\n\t\t);\n\t}\n\n\t// Desktop: Dialog (modal)\n\treturn (\n\t\t<>\n\t\t\t{AvatarDisplay}\n\t\t\t<Dialog open={isOpen} onOpenChange={handleOpenChange}>\n\t\t\t\t<DialogContent className=\"sm:max-w-md\">\n\t\t\t\t\t<DialogHeader>\n\t\t\t\t\t\t<DialogTitle>{dialogTitle}</DialogTitle>\n\t\t\t\t\t</DialogHeader>\n\t\t\t\t\t<div className=\"flex justify-center py-4\">{EditorContent}</div>\n\t\t\t\t\t<DialogFooter className=\"sm:gap-3\">{FooterButtons}</DialogFooter>\n\t\t\t\t</DialogContent>\n\t\t\t</Dialog>\n\t\t</>\n\t);\n}\n","export type PartRange = {\n\tpartNumber: number;\n\tstart: number;\n\tend: number;\n};\n\nexport function partRanges(fileSize: number, partSize: number): PartRange[] {\n\tif (partSize <= 0) {\n\t\tthrow new Error(\"partSize must be greater than 0\");\n\t}\n\tif (fileSize <= 0) {\n\t\treturn [{ partNumber: 1, start: 0, end: 0 }];\n\t}\n\tconst count = Math.ceil(fileSize / partSize);\n\treturn Array.from({ length: count }, (_, index) => {\n\t\tconst start = index * partSize;\n\t\treturn {\n\t\t\tpartNumber: index + 1,\n\t\t\tstart,\n\t\t\tend: Math.min(fileSize, start + partSize),\n\t\t};\n\t});\n}\n\nconst BYTE_UNITS = [\"B\", \"KB\", \"MB\", \"GB\", \"TB\"] as const;\n\nexport function formatUploadBytes(bytes: number): string {\n\tif (!Number.isFinite(bytes) || bytes <= 0) {\n\t\treturn \"0 B\";\n\t}\n\tlet value = bytes;\n\tlet unit = 0;\n\twhile (value >= 1024 && unit < BYTE_UNITS.length - 1) {\n\t\tvalue /= 1024;\n\t\tunit += 1;\n\t}\n\tif (unit === 0 || value >= 10) {\n\t\treturn `${Math.round(value)} ${BYTE_UNITS[unit]}`;\n\t}\n\tconst tenths = Math.round(value * 10) / 10;\n\tconst label = Number.isInteger(tenths) ? String(tenths) : tenths.toFixed(1);\n\treturn `${label} ${BYTE_UNITS[unit]}`;\n}\n\nexport function progressFromBytes(\n\tloaded: number,\n\ttotal: number,\n): { loaded: number; total: number; percent: number } {\n\tconst safeTotal = Math.max(0, total);\n\tconst safeLoaded = Math.min(Math.max(0, loaded), safeTotal);\n\tconst percent =\n\t\tsafeTotal > 0 ? Math.round((safeLoaded / safeTotal) * 100) : 0;\n\treturn { loaded: safeLoaded, total: safeTotal, percent };\n}\n\nexport function fileMatchesAccept(file: File, accept?: string): boolean {\n\tif (!accept?.trim()) return true;\n\tconst type = file.type.toLowerCase();\n\tconst name = file.name.toLowerCase();\n\treturn accept.split(\",\").some((token) => {\n\t\tconst trimmed = token.trim().toLowerCase();\n\t\tif (!trimmed) return false;\n\t\tif (trimmed.endsWith(\"/*\")) {\n\t\t\treturn type.startsWith(trimmed.slice(0, -1));\n\t\t}\n\t\tif (trimmed.startsWith(\".\")) {\n\t\t\treturn name.endsWith(trimmed);\n\t\t}\n\t\treturn type === trimmed;\n\t});\n}\n","export type MultipartUploadPart = {\n\tpartNumber: number;\n\tetag: string;\n};\n\nexport type MultipartUploadAdapter = {\n\trequestPartUrl: (partNumber: number) => Promise<string>;\n\tcomplete: (parts: MultipartUploadPart[]) => Promise<void>;\n\tabort?: () => Promise<void>;\n};\n\nexport type UploadProgress = {\n\tloaded: number;\n\ttotal: number;\n\tpercent: number;\n};\n\nexport type UploadControllerStatus =\n\t| \"idle\"\n\t| \"uploading\"\n\t| \"paused\"\n\t| \"completing\"\n\t| \"completed\"\n\t| \"cancelled\"\n\t| \"error\";\n\nexport type UploadJobStatus = Exclude<UploadControllerStatus, \"idle\">;\n\nexport type UploadJob = {\n\tid: string;\n\tname: string;\n\tstatus: UploadJobStatus;\n\tloaded: number;\n\ttotal: number;\n\tpercent: number;\n\terror?: string;\n};\n\nexport type FileDropzoneLabels = {\n\tidle: string;\n\thint: string;\n\tbrowse: string;\n\trejectType: string;\n\trejectSize: string;\n};\n\nexport type FileUploadTrayLabels = {\n\ttitle: string;\n\tpause: string;\n\tresume: string;\n\tcancel: string;\n\tuploading: string;\n\tpaused: string;\n\tcompleting: string;\n\tcompleted: string;\n\tcancelled: string;\n\terror: string;\n};\n\nexport const DEFAULT_FILE_DROPZONE_LABELS: FileDropzoneLabels = {\n\tidle: \"Drop a file here or browse\",\n\thint: \"Click or press Enter to choose a file\",\n\tbrowse: \"Browse\",\n\trejectType: \"This file type is not allowed\",\n\trejectSize: \"This file is too large\",\n};\n\nexport const DEFAULT_FILE_UPLOAD_TRAY_LABELS: FileUploadTrayLabels = {\n\ttitle: \"Uploads\",\n\tpause: \"Pause\",\n\tresume: \"Resume\",\n\tcancel: \"Cancel\",\n\tuploading: \"Uploading\",\n\tpaused: \"Paused\",\n\tcompleting: \"Finishing\",\n\tcompleted: \"Uploaded\",\n\tcancelled: \"Cancelled\",\n\terror: \"Failed\",\n};\n\nexport const DEFAULT_FILE_UPLOAD_LABELS = {\n\tdropzone: DEFAULT_FILE_DROPZONE_LABELS,\n\ttray: DEFAULT_FILE_UPLOAD_TRAY_LABELS,\n};\n","\"use client\";\n\nimport {\n\tuseId,\n\tuseRef,\n\tuseState,\n\ttype DragEvent,\n\ttype KeyboardEvent,\n} from \"react\";\n\nimport { cn } from \"../../lib/utils\";\nimport { fileMatchesAccept } from \"./part-math\";\nimport { DEFAULT_FILE_DROPZONE_LABELS, type FileDropzoneLabels } from \"./types\";\n\nexport type FileDropzoneProps = {\n\taccept?: string;\n\tmaxSize?: number;\n\tdisabled?: boolean;\n\tlabels?: Partial<FileDropzoneLabels>;\n\tonFile: (file: File) => void;\n\tonReject?: (reason: \"type\" | \"size\") => void;\n\tclassName?: string;\n};\n\nexport function FileDropzone({\n\taccept,\n\tmaxSize,\n\tdisabled = false,\n\tlabels: labelOverrides,\n\tonFile,\n\tonReject,\n\tclassName,\n}: FileDropzoneProps) {\n\tconst labels = { ...DEFAULT_FILE_DROPZONE_LABELS, ...labelOverrides };\n\tconst inputId = useId();\n\tconst inputRef = useRef<HTMLInputElement>(null);\n\tconst [dragging, setDragging] = useState(false);\n\tconst [message, setMessage] = useState<string | null>(null);\n\n\tfunction takeFile(file: File | undefined) {\n\t\tif (!file || disabled) return;\n\t\tif (!fileMatchesAccept(file, accept)) {\n\t\t\tsetMessage(labels.rejectType);\n\t\t\tonReject?.(\"type\");\n\t\t\treturn;\n\t\t}\n\t\tif (maxSize != null && file.size > maxSize) {\n\t\t\tsetMessage(labels.rejectSize);\n\t\t\tonReject?.(\"size\");\n\t\t\treturn;\n\t\t}\n\t\tsetMessage(null);\n\t\tonFile(file);\n\t}\n\n\tfunction onDrop(event: DragEvent<HTMLDivElement>) {\n\t\tevent.preventDefault();\n\t\tsetDragging(false);\n\t\ttakeFile(event.dataTransfer.files[0]);\n\t}\n\n\tfunction onKeyDown(event: KeyboardEvent<HTMLDivElement>) {\n\t\tif (disabled) return;\n\t\tif (event.key === \"Enter\" || event.key === \" \") {\n\t\t\tevent.preventDefault();\n\t\t\tinputRef.current?.click();\n\t\t}\n\t}\n\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\"relative flex w-full min-w-0 flex-col gap-2\", className)}\n\t\t>\n\t\t\t<div\n\t\t\t\trole=\"button\"\n\t\t\t\ttabIndex={disabled ? -1 : 0}\n\t\t\t\taria-disabled={disabled}\n\t\t\t\taria-describedby={message ? `${inputId}-message` : `${inputId}-hint`}\n\t\t\t\taria-controls={inputId}\n\t\t\t\tdata-dragging={dragging || undefined}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"border-input bg-background focus-visible:border-ring focus-visible:ring-ring/50 w-full min-w-0 rounded-lg border border-dashed px-4 py-8 text-center outline-none focus-visible:ring-[3px]\",\n\t\t\t\t\tdragging && \"border-primary bg-primary/5\",\n\t\t\t\t\tdisabled && \"pointer-events-none opacity-50\",\n\t\t\t\t)}\n\t\t\t\tonClick={() => {\n\t\t\t\t\tif (!disabled) inputRef.current?.click();\n\t\t\t\t}}\n\t\t\t\tonKeyDown={onKeyDown}\n\t\t\t\tonDragEnter={(event) => {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\tif (!disabled) setDragging(true);\n\t\t\t\t}}\n\t\t\t\tonDragOver={(event) => {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t}}\n\t\t\t\tonDragLeave={(event) => {\n\t\t\t\t\tif (event.currentTarget.contains(event.relatedTarget as Node)) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tsetDragging(false);\n\t\t\t\t}}\n\t\t\t\tonDrop={onDrop}\n\t\t\t>\n\t\t\t\t<p className=\"text-sm font-medium\">{labels.idle}</p>\n\t\t\t\t<p\n\t\t\t\t\tid={`${inputId}-hint`}\n\t\t\t\t\tclassName=\"text-muted-foreground mt-1 text-xs\"\n\t\t\t\t>\n\t\t\t\t\t{labels.hint}\n\t\t\t\t</p>\n\t\t\t\t<span className=\"text-primary mt-3 inline-flex text-sm font-medium underline-offset-4\">\n\t\t\t\t\t{labels.browse}\n\t\t\t\t</span>\n\t\t\t</div>\n\t\t\t<input\n\t\t\t\tid={inputId}\n\t\t\t\tref={inputRef}\n\t\t\t\ttype=\"file\"\n\t\t\t\taccept={accept}\n\t\t\t\tdisabled={disabled}\n\t\t\t\taria-label={labels.browse}\n\t\t\t\tclassName=\"sr-only\"\n\t\t\t\tonChange={(event) => {\n\t\t\t\t\ttakeFile(event.target.files?.[0]);\n\t\t\t\t\tevent.target.value = \"\";\n\t\t\t\t}}\n\t\t\t/>\n\t\t\t{message ? (\n\t\t\t\t<p\n\t\t\t\t\tid={`${inputId}-message`}\n\t\t\t\t\trole=\"alert\"\n\t\t\t\t\tclassName=\"text-destructive text-sm\"\n\t\t\t\t>\n\t\t\t\t\t{message}\n\t\t\t\t</p>\n\t\t\t) : null}\n\t\t</div>\n\t);\n}\n","\"use client\";\n\nimport { Pause, Play, X } from \"lucide-react\";\n\nimport { cn } from \"../../lib/utils\";\nimport { Button } from \"../ui/button\";\nimport { formatUploadBytes } from \"./part-math\";\nimport {\n\tDEFAULT_FILE_UPLOAD_TRAY_LABELS,\n\ttype FileUploadTrayLabels,\n\ttype UploadJob,\n} from \"./types\";\n\nexport type FileUploadTrayProps = {\n\tjobs: UploadJob[];\n\tlabels?: Partial<FileUploadTrayLabels>;\n\tonPause: (id: string) => void;\n\tonResume: (id: string) => void;\n\tonCancel: (id: string) => void;\n\tclassName?: string;\n};\n\nfunction statusLabel(\n\tstatus: UploadJob[\"status\"],\n\tlabels: FileUploadTrayLabels,\n): string {\n\tswitch (status) {\n\t\tcase \"uploading\":\n\t\t\treturn labels.uploading;\n\t\tcase \"paused\":\n\t\t\treturn labels.paused;\n\t\tcase \"completing\":\n\t\t\treturn labels.completing;\n\t\tcase \"completed\":\n\t\t\treturn labels.completed;\n\t\tcase \"cancelled\":\n\t\t\treturn labels.cancelled;\n\t\tcase \"error\":\n\t\t\treturn labels.error;\n\t\tdefault: {\n\t\t\tconst _exhaustive: never = status;\n\t\t\treturn _exhaustive;\n\t\t}\n\t}\n}\n\nfunction progressLabel(job: UploadJob): string {\n\treturn `${job.percent}% · ${formatUploadBytes(job.loaded)} / ${formatUploadBytes(job.total)}`;\n}\n\nexport function FileUploadTray({\n\tjobs,\n\tlabels: labelOverrides,\n\tonPause,\n\tonResume,\n\tonCancel,\n\tclassName,\n}: FileUploadTrayProps) {\n\tconst labels = { ...DEFAULT_FILE_UPLOAD_TRAY_LABELS, ...labelOverrides };\n\tconst visible = jobs.filter((job) => job.status !== \"cancelled\");\n\tif (visible.length === 0) return null;\n\n\treturn (\n\t\t<section\n\t\t\taria-label={labels.title}\n\t\t\tclassName={cn(\"grid min-w-0 gap-3\", className)}\n\t\t>\n\t\t\t<ul className=\"grid min-w-0 gap-3\">\n\t\t\t\t{visible.map((job) => {\n\t\t\t\t\tconst active =\n\t\t\t\t\t\tjob.status === \"uploading\" || job.status === \"completing\";\n\t\t\t\t\tconst canPause = job.status === \"uploading\";\n\t\t\t\t\tconst canResume = job.status === \"paused\";\n\t\t\t\t\tconst canCancel =\n\t\t\t\t\t\tjob.status === \"uploading\" ||\n\t\t\t\t\t\tjob.status === \"paused\" ||\n\t\t\t\t\t\tjob.status === \"error\";\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<li key={job.id} className=\"grid min-w-0 gap-1.5\">\n\t\t\t\t\t\t\t<p\n\t\t\t\t\t\t\t\tclassName=\"min-w-0 line-clamp-3 text-sm leading-5 font-medium break-all\"\n\t\t\t\t\t\t\t\ttitle={job.name}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{job.name}\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t<div className=\"flex min-w-0 items-center gap-2\">\n\t\t\t\t\t\t\t\t<p className=\"text-muted-foreground shrink-0 text-xs\">\n\t\t\t\t\t\t\t\t\t{statusLabel(job.status, labels)}\n\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t<p className=\"text-muted-foreground shrink-0 text-xs tabular-nums\">\n\t\t\t\t\t\t\t\t\t{progressLabel(job)}\n\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t<span className=\"min-w-0 flex-1\" />\n\t\t\t\t\t\t\t\t{canPause ? (\n\t\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\t\t\t\t\tsize=\"icon-sm\"\n\t\t\t\t\t\t\t\t\t\tclassName=\"shrink-0\"\n\t\t\t\t\t\t\t\t\t\taria-label={`${labels.pause} ${job.name}`}\n\t\t\t\t\t\t\t\t\t\tonClick={() => onPause(job.id)}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<Pause />\n\t\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t{canResume ? (\n\t\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\t\t\t\t\tsize=\"icon-sm\"\n\t\t\t\t\t\t\t\t\t\tclassName=\"shrink-0\"\n\t\t\t\t\t\t\t\t\t\taria-label={`${labels.resume} ${job.name}`}\n\t\t\t\t\t\t\t\t\t\tonClick={() => onResume(job.id)}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<Play />\n\t\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t{canCancel ? (\n\t\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\t\t\t\t\tsize=\"icon-sm\"\n\t\t\t\t\t\t\t\t\t\tclassName=\"shrink-0\"\n\t\t\t\t\t\t\t\t\t\taria-label={`${labels.cancel} ${job.name}`}\n\t\t\t\t\t\t\t\t\t\tonClick={() => onCancel(job.id)}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<X />\n\t\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\trole=\"progressbar\"\n\t\t\t\t\t\t\t\taria-valuemin={0}\n\t\t\t\t\t\t\t\taria-valuemax={100}\n\t\t\t\t\t\t\t\taria-valuenow={job.percent}\n\t\t\t\t\t\t\t\taria-label={job.name}\n\t\t\t\t\t\t\t\tclassName=\"bg-muted h-2 overflow-hidden rounded-full\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\"bg-primary h-full\",\n\t\t\t\t\t\t\t\t\t\tactive && \"motion-safe:transition-[width]\",\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\tstyle={{ width: `${job.percent}%` }}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t{job.error ? (\n\t\t\t\t\t\t\t\t<p role=\"alert\" className=\"text-destructive text-xs\">\n\t\t\t\t\t\t\t\t\t{job.error}\n\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t</li>\n\t\t\t\t\t);\n\t\t\t\t})}\n\t\t\t</ul>\n\t\t</section>\n\t);\n}\n","\"use client\";\n\nimport { Upload } from \"lucide-react\";\nimport { useState } from \"react\";\n\nimport { cn } from \"../../lib/utils\";\nimport { Button } from \"../ui/button\";\nimport {\n\tDropdownMenu,\n\tDropdownMenuContent,\n\tDropdownMenuTrigger,\n} from \"../ui/dropdown-menu\";\nimport { FileUploadTray } from \"./FileUploadTray\";\nimport {\n\tDEFAULT_FILE_UPLOAD_TRAY_LABELS,\n\ttype FileUploadTrayLabels,\n\ttype UploadJob,\n} from \"./types\";\n\nexport type FileUploadMenuProps = {\n\tjobs: UploadJob[];\n\tlabels?: Partial<FileUploadTrayLabels>;\n\tonPause: (id: string) => void;\n\tonResume: (id: string) => void;\n\tonCancel: (id: string) => void;\n\topen?: boolean;\n\tonOpenChange?: (open: boolean) => void;\n\talign?: \"start\" | \"end\";\n\tclassName?: string;\n};\n\nfunction formatActiveBadge(count: number): string {\n\treturn count > 9 ? \"9+\" : String(count);\n}\n\nfunction isActiveStatus(status: UploadJob[\"status\"]): boolean {\n\treturn (\n\t\tstatus === \"uploading\" || status === \"paused\" || status === \"completing\"\n\t);\n}\n\nexport function FileUploadMenu({\n\tjobs,\n\tlabels: labelOverrides,\n\tonPause,\n\tonResume,\n\tonCancel,\n\topen,\n\tonOpenChange,\n\talign = \"end\",\n\tclassName,\n}: FileUploadMenuProps) {\n\tconst labels = { ...DEFAULT_FILE_UPLOAD_TRAY_LABELS, ...labelOverrides };\n\tconst visible = jobs.filter((job) => job.status !== \"cancelled\");\n\tconst [uncontrolledOpen, setUncontrolledOpen] = useState(false);\n\tconst isControlled = open !== undefined;\n\tconst resolvedOpen = isControlled ? open : uncontrolledOpen;\n\n\tfunction setResolvedOpen(next: boolean) {\n\t\tif (!isControlled) setUncontrolledOpen(next);\n\t\tonOpenChange?.(next);\n\t}\n\n\tif (visible.length === 0) return null;\n\n\tconst activeCount = visible.filter((job) =>\n\t\tisActiveStatus(job.status),\n\t).length;\n\n\treturn (\n\t\t<DropdownMenu\n\t\t\tmodal={false}\n\t\t\topen={resolvedOpen}\n\t\t\tonOpenChange={setResolvedOpen}\n\t\t>\n\t\t\t<DropdownMenuTrigger asChild>\n\t\t\t\t<Button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\tclassName={cn(\"relative size-9\", className)}\n\t\t\t\t\taria-label={labels.title}\n\t\t\t\t>\n\t\t\t\t\t<Upload className=\"size-4\" />\n\t\t\t\t\t{activeCount > 0 ? (\n\t\t\t\t\t\t<span className=\"bg-destructive text-destructive-foreground absolute -top-0.5 -right-0.5 flex size-4 items-center justify-center rounded-full text-[10px] leading-none font-medium tabular-nums\">\n\t\t\t\t\t\t\t{formatActiveBadge(activeCount)}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t) : null}\n\t\t\t\t</Button>\n\t\t\t</DropdownMenuTrigger>\n\t\t\t<DropdownMenuContent\n\t\t\t\talign={align}\n\t\t\t\tclassName=\"w-80 min-w-0 max-w-[calc(100vw-2rem)] overflow-x-hidden p-0\"\n\t\t\t>\n\t\t\t\t<div className=\"flex items-center justify-between border-b px-4 py-3\">\n\t\t\t\t\t<h4 className=\"font-semibold\">{labels.title}</h4>\n\t\t\t\t</div>\n\t\t\t\t<div className=\"max-h-80 min-w-0 overflow-x-hidden overflow-y-auto p-3\">\n\t\t\t\t\t<FileUploadTray\n\t\t\t\t\t\tjobs={visible}\n\t\t\t\t\t\tlabels={labels}\n\t\t\t\t\t\tonPause={onPause}\n\t\t\t\t\t\tonResume={onResume}\n\t\t\t\t\t\tonCancel={onCancel}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</DropdownMenuContent>\n\t\t</DropdownMenu>\n\t);\n}\n","import { partRanges, progressFromBytes } from \"./part-math\";\nimport type {\n\tMultipartUploadAdapter,\n\tMultipartUploadPart,\n\tUploadControllerStatus,\n\tUploadProgress,\n} from \"./types\";\n\nconst PART_ATTEMPTS = 3;\nconst PART_RETRY_BACKOFF_MS = [500, 1500] as const;\n\nexport type CreateMultipartUploadControllerOptions = {\n\tfile: Blob;\n\tpartSize: number;\n\tadapter: MultipartUploadAdapter;\n\tonProgress?: (progress: UploadProgress) => void;\n\txhrFactory?: () => XMLHttpRequest;\n\tsleep?: (ms: number) => Promise<void>;\n\tcompletedParts?: MultipartUploadPart[];\n};\n\nexport type MultipartUploadController = {\n\tstart: () => Promise<void>;\n\tpause: () => void;\n\tresume: () => Promise<void>;\n\tcancel: () => Promise<void>;\n\tgetStatus: () => UploadControllerStatus;\n};\n\nfunction defaultSleep(ms: number): Promise<void> {\n\treturn new Promise((resolve) => {\n\t\tsetTimeout(resolve, ms);\n\t});\n}\n\nfunction isAbortError(error: unknown): boolean {\n\treturn error instanceof DOMException && error.name === \"AbortError\";\n}\n\nfunction isMissingEtagError(error: unknown): boolean {\n\treturn error instanceof Error && error.message.includes(\"missing ETag\");\n}\n\nfunction isRetryableStatus(status: number): boolean {\n\treturn (\n\t\tstatus === 0 ||\n\t\tstatus === 403 ||\n\t\tstatus === 408 ||\n\t\tstatus === 429 ||\n\t\tstatus >= 500\n\t);\n}\n\nfunction putPartFailure(partNumber: number, status: number): Error {\n\treturn new Error(`Upload failed (part ${partNumber}, status ${status})`);\n}\n\nfunction parsePutStatus(error: unknown): number | null {\n\tif (!(error instanceof Error)) return null;\n\tconst match = error.message.match(/status (\\d+)\\)$/);\n\tif (!match?.[1]) return null;\n\treturn Number(match[1]);\n}\n\nfunction isRetryablePutError(error: unknown): boolean {\n\tif (isAbortError(error) || isMissingEtagError(error)) return false;\n\tconst status = parsePutStatus(error);\n\tif (status === null) return false;\n\treturn isRetryableStatus(status);\n}\n\nfunction readEtag(xhr: XMLHttpRequest): string {\n\tconst raw =\n\t\txhr.getResponseHeader(\"ETag\") ?? xhr.getResponseHeader(\"etag\") ?? \"\";\n\tconst etag = raw.trim();\n\tif (!etag) {\n\t\tthrow new Error(\"Upload part missing ETag\");\n\t}\n\treturn etag;\n}\n\nfunction putPart(input: {\n\turl: string;\n\tbody: Blob;\n\txhr: XMLHttpRequest;\n\tpartNumber: number;\n\tonProgress: (loaded: number) => void;\n}): Promise<string> {\n\treturn new Promise((resolve, reject) => {\n\t\tinput.xhr.open(\"PUT\", input.url);\n\t\tinput.xhr.upload.onprogress = (event) => {\n\t\t\tinput.onProgress(event.loaded);\n\t\t};\n\t\tinput.xhr.onload = () => {\n\t\t\tif (input.xhr.status >= 200 && input.xhr.status < 300) {\n\t\t\t\ttry {\n\t\t\t\t\tresolve(readEtag(input.xhr));\n\t\t\t\t} catch (error) {\n\t\t\t\t\treject(error);\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t\treject(putPartFailure(input.partNumber, input.xhr.status));\n\t\t};\n\t\tinput.xhr.onerror = () => {\n\t\t\treject(putPartFailure(input.partNumber, 0));\n\t\t};\n\t\tinput.xhr.onabort = () => {\n\t\t\treject(new DOMException(\"The operation was aborted.\", \"AbortError\"));\n\t\t};\n\t\tinput.xhr.send(input.body);\n\t});\n}\n\nexport function createMultipartUploadController(\n\toptions: CreateMultipartUploadControllerOptions,\n): MultipartUploadController {\n\tconst ranges = partRanges(options.file.size, options.partSize);\n\tconst sleep = options.sleep ?? defaultSleep;\n\tconst state = { status: \"idle\" as UploadControllerStatus };\n\tconst seeded = new Map<number, MultipartUploadPart>();\n\tfor (const part of options.completedParts ?? []) {\n\t\tif (part.partNumber < 1 || part.partNumber > ranges.length) continue;\n\t\tseeded.set(part.partNumber, part);\n\t}\n\tconst completed: MultipartUploadPart[] = [...seeded.values()].sort(\n\t\t(left, right) => left.partNumber - right.partNumber,\n\t);\n\tconst done = new Set(completed.map((part) => part.partNumber));\n\tlet currentXhr: XMLHttpRequest | null = null;\n\tlet run: Promise<void> | null = null;\n\tlet resumeIndex = ranges.findIndex((range) => !done.has(range.partNumber));\n\tif (resumeIndex < 0) resumeIndex = ranges.length;\n\n\tfunction currentStatus(): UploadControllerStatus {\n\t\treturn state.status;\n\t}\n\n\tfunction isStopped(): boolean {\n\t\tconst status = currentStatus();\n\t\treturn status === \"paused\" || status === \"cancelled\";\n\t}\n\n\tfunction emitProgress(currentPartLoaded = 0) {\n\t\tconst completedBytes = completed.reduce((sum, part) => {\n\t\t\tconst range = ranges[part.partNumber - 1];\n\t\t\treturn sum + (range ? range.end - range.start : 0);\n\t\t}, 0);\n\t\toptions.onProgress?.(\n\t\t\tprogressFromBytes(completedBytes + currentPartLoaded, options.file.size),\n\t\t);\n\t}\n\n\tasync function putPartWithRetry(\n\t\tpartNumber: number,\n\t\tbody: Blob,\n\t): Promise<string> {\n\t\tlet lastError: unknown;\n\t\tfor (let attempt = 1; attempt <= PART_ATTEMPTS; attempt += 1) {\n\t\t\tif (state.status !== \"uploading\") {\n\t\t\t\tthrow (\n\t\t\t\t\tlastError ??\n\t\t\t\t\tnew DOMException(\"The operation was aborted.\", \"AbortError\")\n\t\t\t\t);\n\t\t\t}\n\t\t\tconst url = await options.adapter.requestPartUrl(partNumber);\n\t\t\tif (state.status !== \"uploading\") {\n\t\t\t\tthrow new DOMException(\"The operation was aborted.\", \"AbortError\");\n\t\t\t}\n\t\t\tconst xhr = options.xhrFactory\n\t\t\t\t? options.xhrFactory()\n\t\t\t\t: new XMLHttpRequest();\n\t\t\tcurrentXhr = xhr;\n\t\t\ttry {\n\t\t\t\treturn await putPart({\n\t\t\t\t\turl,\n\t\t\t\t\tbody,\n\t\t\t\t\txhr,\n\t\t\t\t\tpartNumber,\n\t\t\t\t\tonProgress: (loaded) => emitProgress(loaded),\n\t\t\t\t});\n\t\t\t} catch (error) {\n\t\t\t\tlastError = error;\n\t\t\t\tif (currentXhr === xhr) currentXhr = null;\n\t\t\t\tif (\n\t\t\t\t\tisStopped() ||\n\t\t\t\t\t!isRetryablePutError(error) ||\n\t\t\t\t\tattempt === PART_ATTEMPTS\n\t\t\t\t) {\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t\tconst delay =\n\t\t\t\t\tPART_RETRY_BACKOFF_MS[attempt - 1] ??\n\t\t\t\t\tPART_RETRY_BACKOFF_MS[PART_RETRY_BACKOFF_MS.length - 1];\n\t\t\t\tawait sleep(delay);\n\t\t\t} finally {\n\t\t\t\tif (currentXhr === xhr) currentXhr = null;\n\t\t\t}\n\t\t}\n\t\tthrow lastError;\n\t}\n\n\tasync function uploadFrom(startIndex: number): Promise<void> {\n\t\tstate.status = \"uploading\";\n\t\tfor (let index = startIndex; index < ranges.length; index += 1) {\n\t\t\tif (state.status !== \"uploading\") return;\n\t\t\tresumeIndex = index;\n\t\t\tconst range = ranges[index];\n\t\t\tif (!range) continue;\n\t\t\tif (done.has(range.partNumber)) continue;\n\t\t\tconst body = options.file.slice(range.start, range.end);\n\t\t\ttry {\n\t\t\t\tconst etag = await putPartWithRetry(range.partNumber, body);\n\t\t\t\tif (state.status !== \"uploading\") return;\n\t\t\t\tcompleted.push({ partNumber: range.partNumber, etag });\n\t\t\t\tdone.add(range.partNumber);\n\t\t\t\temitProgress(0);\n\t\t\t} catch (error) {\n\t\t\t\tcurrentXhr = null;\n\t\t\t\tif (isStopped()) return;\n\t\t\t\tstate.status = \"error\";\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t}\n\n\t\tif (state.status !== \"uploading\") return;\n\t\tstate.status = \"completing\";\n\t\tawait options.adapter.complete([...completed]);\n\t\tstate.status = \"completed\";\n\t\temitProgress(0);\n\t}\n\n\tasync function start(): Promise<void> {\n\t\tif (run) return run;\n\t\temitProgress(0);\n\t\trun = uploadFrom(resumeIndex).catch((error) => {\n\t\t\tif (isStopped()) return;\n\t\t\tstate.status = \"error\";\n\t\t\tthrow error;\n\t\t});\n\t\treturn run;\n\t}\n\n\tfunction pause(): void {\n\t\tif (state.status !== \"uploading\") return;\n\t\tstate.status = \"paused\";\n\t\tcurrentXhr?.abort();\n\t}\n\n\tasync function resume(): Promise<void> {\n\t\tif (state.status !== \"paused\") return;\n\t\trun = uploadFrom(resumeIndex).catch((error) => {\n\t\t\tif (isStopped()) return;\n\t\t\tstate.status = \"error\";\n\t\t\tthrow error;\n\t\t});\n\t\treturn run;\n\t}\n\n\tasync function cancel(): Promise<void> {\n\t\tif (\n\t\t\tstate.status === \"completed\" ||\n\t\t\tstate.status === \"cancelled\" ||\n\t\t\tstate.status === \"idle\"\n\t\t) {\n\t\t\tstate.status = \"cancelled\";\n\t\t\treturn;\n\t\t}\n\t\tstate.status = \"cancelled\";\n\t\tcurrentXhr?.abort();\n\t\tawait options.adapter.abort?.();\n\t}\n\n\treturn {\n\t\tstart,\n\t\tpause,\n\t\tresume,\n\t\tcancel,\n\t\tgetStatus: () => state.status,\n\t};\n}\n","\"use client\";\n\nimport { useEffect, useState } from \"react\";\n\nexport function useMediaQuery(query: string): boolean {\n\tconst [matches, setMatches] = useState(false);\n\n\tuseEffect(() => {\n\t\tif (typeof window === \"undefined\" || !window.matchMedia) return;\n\t\tconst mql = window.matchMedia(query);\n\t\tconst onChange = () => setMatches(mql.matches);\n\t\tonChange();\n\t\tmql.addEventListener(\"change\", onChange);\n\t\treturn () => mql.removeEventListener(\"change\", onChange);\n\t}, [query]);\n\n\treturn matches;\n}\n","/** Neutral fallback when the name is empty. */\nconst EMPTY_COLORS = {\n\tbackgroundColor: \"#9ca3af\",\n\tcolor: \"#111111\",\n} as const;\n\n/**\n * Curated mid-lightness palette — professional, calm hues that stay\n * distinct when hashed by name and contrast well with black or white text.\n */\nconst AVATAR_PALETTE = [\n\t\"#4f6d8c\", // slate blue\n\t\"#3d7a6a\", // teal\n\t\"#6b5b8a\", // muted purple\n\t\"#8a5a4a\", // warm brown\n\t\"#4a7a8a\", // steel cyan\n\t\"#7a6b4a\", // olive\n\t\"#5a6b8a\", // periwinkle\n\t\"#8a4a5a\", // rose\n\t\"#4a8a6b\", // green\n\t\"#6b4a7a\", // plum\n\t\"#8a6b4a\", // amber brown\n\t\"#4a5a8a\", // indigo\n\t\"#7a4a6b\", // mauve\n\t\"#5a8a4a\", // leaf\n\t\"#8a5a7a\", // dusty pink\n\t\"#3d6b7a\", // deep teal\n] as const;\n\nexport type AvatarColors = {\n\tbackgroundColor: string;\n\tcolor: string;\n};\n\n/** FNV-1a 32-bit hash — stable across runtimes for the same string. */\nfunction hashString(input: string): number {\n\tlet hash = 0x811c9dc5;\n\tfor (let i = 0; i < input.length; i++) {\n\t\thash ^= input.charCodeAt(i);\n\t\thash = Math.imul(hash, 0x01000193);\n\t}\n\treturn hash >>> 0;\n}\n\nfunction srgbToLinear(channel: number): number {\n\tconst c = channel / 255;\n\treturn c <= 0.04045 ? c / 12.92 : ((c + 0.055) / 1.055) ** 2.4;\n}\n\n/** Relative luminance (WCAG) for a hex color like `#rrggbb`. */\nfunction relativeLuminance(hex: string): number {\n\tconst normalized = hex.replace(\"#\", \"\");\n\tconst r = Number.parseInt(normalized.slice(0, 2), 16);\n\tconst g = Number.parseInt(normalized.slice(2, 4), 16);\n\tconst b = Number.parseInt(normalized.slice(4, 6), 16);\n\treturn (\n\t\t0.2126 * srgbToLinear(r) +\n\t\t0.7152 * srgbToLinear(g) +\n\t\t0.0722 * srgbToLinear(b)\n\t);\n}\n\nfunction contrastingTextColor(backgroundHex: string): \"#ffffff\" | \"#111111\" {\n\t// Threshold ~0.179 ≈ contrast preference for mid tones (WCAG-inspired).\n\treturn relativeLuminance(backgroundHex) > 0.179 ? \"#111111\" : \"#ffffff\";\n}\n\n/**\n * Word-based initials from a display name (max letters, default 2).\n * Empty / whitespace-only names yield `\"?\"`.\n */\nexport function getInitials(name: string, max = 2): string {\n\tconst parts = name.trim().split(/\\s+/).filter(Boolean);\n\tif (parts.length === 0) return \"?\";\n\treturn parts\n\t\t.slice(0, Math.max(1, max))\n\t\t.map((part) => part.charAt(0))\n\t\t.join(\"\")\n\t\t.toUpperCase();\n}\n\n/**\n * Deterministic background + contrasting foreground from a full name.\n * Same name (case-insensitive) always maps to the same colors.\n */\nexport function getAvatarColors(name: string): AvatarColors {\n\tconst normalized = name.trim().toLowerCase();\n\tif (!normalized) {\n\t\treturn { ...EMPTY_COLORS };\n\t}\n\tconst backgroundColor =\n\t\tAVATAR_PALETTE[hashString(normalized) % AVATAR_PALETTE.length]!;\n\treturn {\n\t\tbackgroundColor,\n\t\tcolor: contrastingTextColor(backgroundColor),\n\t};\n}\n\n/** CSS style object for `AvatarFallback` (or any letter-avatar container). */\nexport function avatarFallbackStyle(\n\tname: string,\n): Pick<AvatarColors, \"backgroundColor\" | \"color\"> {\n\treturn getAvatarColors(name);\n}\n","\"use client\";\n\nimport * as React from \"react\";\n\nimport { cn } from \"../../lib/utils\";\n\nexport type StatHighlightCardProps = {\n\tlabel: string;\n\tvalue: React.ReactNode;\n\thint?: string;\n\tdelta?: string;\n\tdeltaTone?: \"up\" | \"down\" | \"neutral\";\n\tclassName?: string;\n};\n\nexport function StatHighlightCard({\n\tlabel,\n\tvalue,\n\thint,\n\tdelta,\n\tdeltaTone = \"neutral\",\n\tclassName,\n}: StatHighlightCardProps) {\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\t\"bg-card text-card-foreground rounded-xl border p-6 shadow-sm\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t<p className=\"text-muted-foreground text-sm\">{label}</p>\n\t\t\t<p className=\"mt-2 text-2xl font-semibold tracking-tight\">{value}</p>\n\t\t\t{delta ? (\n\t\t\t\t<p\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"mt-1 text-sm\",\n\t\t\t\t\t\tdeltaTone === \"up\" && \"text-emerald-600 dark:text-emerald-400\",\n\t\t\t\t\t\tdeltaTone === \"down\" && \"text-destructive\",\n\t\t\t\t\t\tdeltaTone === \"neutral\" && \"text-muted-foreground\",\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t{delta}\n\t\t\t\t</p>\n\t\t\t) : null}\n\t\t\t{hint ? (\n\t\t\t\t<p className=\"text-muted-foreground mt-1 text-xs\">{hint}</p>\n\t\t\t) : null}\n\t\t</div>\n\t);\n}\n","\"use client\";\n\nimport * as React from \"react\";\n\nimport { cn } from \"../../lib/utils\";\n\nexport type MetricChartCardProps = {\n\ttitle: string;\n\tdescription?: string;\n\taction?: React.ReactNode;\n\tchildren: React.ReactNode;\n\tclassName?: string;\n};\n\nexport function MetricChartCard({\n\ttitle,\n\tdescription,\n\taction,\n\tchildren,\n\tclassName,\n}: MetricChartCardProps) {\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\t\"bg-card text-card-foreground rounded-xl border shadow-sm\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t<div className=\"flex items-start justify-between gap-3 p-6 pb-2\">\n\t\t\t\t<div>\n\t\t\t\t\t<h3 className=\"leading-none font-semibold tracking-tight\">{title}</h3>\n\t\t\t\t\t{description ? (\n\t\t\t\t\t\t<p className=\"text-muted-foreground mt-1.5 text-sm\">\n\t\t\t\t\t\t\t{description}\n\t\t\t\t\t\t</p>\n\t\t\t\t\t) : null}\n\t\t\t\t</div>\n\t\t\t\t{action}\n\t\t\t</div>\n\t\t\t<div className=\"p-6 pt-4\">{children}</div>\n\t\t</div>\n\t);\n}\n","\"use client\";\n\nimport * as React from \"react\";\n\nimport { useMediaQuery } from \"../../hooks/useMediaQuery\";\nimport { cn } from \"../../lib/utils\";\n\nexport type SparklineStatProps = {\n\tlabel: string;\n\tvalue: React.ReactNode;\n\tpoints: number[];\n\tclassName?: string;\n};\n\nfunction polyline(points: number[]): string {\n\tif (points.length === 0) return \"\";\n\tconst min = Math.min(...points);\n\tconst max = Math.max(...points);\n\tconst span = max - min || 1;\n\treturn points\n\t\t.map((point, index) => {\n\t\t\tconst x = points.length === 1 ? 50 : (index / (points.length - 1)) * 100;\n\t\t\tconst y = 28 - ((point - min) / span) * 24;\n\t\t\treturn `${x.toFixed(2)},${y.toFixed(2)}`;\n\t\t})\n\t\t.join(\" \");\n}\n\nexport function SparklineStat({\n\tlabel,\n\tvalue,\n\tpoints,\n\tclassName,\n}: SparklineStatProps) {\n\tconst reduced = useMediaQuery(\"(prefers-reduced-motion: reduce)\");\n\tconst path = polyline(points);\n\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\t\"bg-card text-card-foreground flex items-end justify-between gap-3 rounded-xl border p-4 shadow-sm\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t<div>\n\t\t\t\t<p className=\"text-muted-foreground text-xs\">{label}</p>\n\t\t\t\t<p className=\"mt-1 text-lg font-semibold tracking-tight\">{value}</p>\n\t\t\t</div>\n\t\t\t{path ? (\n\t\t\t\t<svg\n\t\t\t\t\tviewBox=\"0 0 100 32\"\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"text-primary h-8 w-24\",\n\t\t\t\t\t\t!reduced && \"motion-safe:transition-opacity\",\n\t\t\t\t\t)}\n\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t>\n\t\t\t\t\t<polyline\n\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\tstrokeWidth=\"2\"\n\t\t\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\tpoints={path}\n\t\t\t\t\t/>\n\t\t\t\t</svg>\n\t\t\t) : null}\n\t\t</div>\n\t);\n}\n","\"use client\";\n\nimport * as React from \"react\";\n\nimport { cn } from \"../../lib/utils\";\nimport { Button } from \"../ui/button\";\n\nexport const TIME_RANGE_OPTIONS = [\"day\", \"week\", \"month\", \"year\"] as const;\n\nexport type TimeRange = (typeof TIME_RANGE_OPTIONS)[number];\n\nexport type TimeRangePickerLabels = Partial<Record<TimeRange, string>>;\n\nexport type TimeRangePickerProps = {\n\tvalue: TimeRange;\n\tonChange: (value: TimeRange) => void;\n\tlabels?: TimeRangePickerLabels;\n\tclassName?: string;\n};\n\nconst DEFAULT_LABELS: Record<TimeRange, string> = {\n\tday: \"Day\",\n\tweek: \"Week\",\n\tmonth: \"Month\",\n\tyear: \"Year\",\n};\n\nexport function TimeRangePicker({\n\tvalue,\n\tonChange,\n\tlabels,\n\tclassName,\n}: TimeRangePickerProps) {\n\tconst copy = { ...DEFAULT_LABELS, ...labels };\n\n\treturn (\n\t\t<div\n\t\t\trole=\"group\"\n\t\t\taria-label=\"Time range\"\n\t\t\tclassName={cn(\"flex flex-wrap gap-1\", className)}\n\t\t>\n\t\t\t{TIME_RANGE_OPTIONS.map((option) => {\n\t\t\t\tconst selected = option === value;\n\t\t\t\treturn (\n\t\t\t\t\t<Button\n\t\t\t\t\t\tkey={option}\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\tvariant={selected ? \"default\" : \"outline\"}\n\t\t\t\t\t\taria-pressed={selected}\n\t\t\t\t\t\tonClick={() => onChange(option)}\n\t\t\t\t\t>\n\t\t\t\t\t\t{copy[option]}\n\t\t\t\t\t</Button>\n\t\t\t\t);\n\t\t\t})}\n\t\t</div>\n\t);\n}\n","\"use client\";\n\nimport * as React from \"react\";\n\nimport { cn } from \"../../lib/utils\";\n\nexport type DimensionBreakdownRow = {\n\tid: string;\n\tlabel: string;\n\tvalue: React.ReactNode;\n\tshare?: string;\n};\n\nexport type DimensionBreakdownTableProps = {\n\ttitle?: string;\n\trows: DimensionBreakdownRow[];\n\tempty?: React.ReactNode;\n\tclassName?: string;\n};\n\nexport function DimensionBreakdownTable({\n\ttitle,\n\trows,\n\tempty,\n\tclassName,\n}: DimensionBreakdownTableProps) {\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\t\"bg-card text-card-foreground overflow-hidden rounded-xl border shadow-sm\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t{title ? (\n\t\t\t\t<h3 className=\"px-6 pt-6 text-sm font-semibold tracking-tight\">\n\t\t\t\t\t{title}\n\t\t\t\t</h3>\n\t\t\t) : null}\n\t\t\t{rows.length === 0 ? (\n\t\t\t\t<div className=\"p-6\">{empty}</div>\n\t\t\t) : (\n\t\t\t\t<table className=\"w-full text-sm\">\n\t\t\t\t\t<tbody>\n\t\t\t\t\t\t{rows.map((row) => (\n\t\t\t\t\t\t\t<tr key={row.id} className=\"border-t first:border-t-0\">\n\t\t\t\t\t\t\t\t<th scope=\"row\" className=\"px-6 py-3 text-left font-medium\">\n\t\t\t\t\t\t\t\t\t{row.label}\n\t\t\t\t\t\t\t\t</th>\n\t\t\t\t\t\t\t\t<td className=\"px-6 py-3 text-right tabular-nums\">\n\t\t\t\t\t\t\t\t\t{row.value}\n\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t{row.share ? (\n\t\t\t\t\t\t\t\t\t<td className=\"text-muted-foreground px-6 py-3 text-right tabular-nums\">\n\t\t\t\t\t\t\t\t\t\t{row.share}\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</tbody>\n\t\t\t\t</table>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","\"use client\";\n\nimport * as React from \"react\";\n\nimport { cn } from \"../../lib/utils\";\n\nexport type CostBreakdownItem = {\n\tid: string;\n\tlabel: string;\n\tamount: React.ReactNode;\n\tbasis?: string;\n};\n\nexport type CostBreakdownCardProps = {\n\ttitle: string;\n\ttotal?: React.ReactNode;\n\titems: CostBreakdownItem[];\n\tclassName?: string;\n};\n\nexport function CostBreakdownCard({\n\ttitle,\n\ttotal,\n\titems,\n\tclassName,\n}: CostBreakdownCardProps) {\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\t\"bg-card text-card-foreground rounded-xl border p-6 shadow-sm\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t<div className=\"flex items-baseline justify-between gap-3\">\n\t\t\t\t<h3 className=\"font-semibold tracking-tight\">{title}</h3>\n\t\t\t\t{total ? (\n\t\t\t\t\t<p className=\"text-lg font-semibold tabular-nums\">{total}</p>\n\t\t\t\t) : null}\n\t\t\t</div>\n\t\t\t<ul className=\"mt-4 space-y-2\">\n\t\t\t\t{items.map((item) => (\n\t\t\t\t\t<li\n\t\t\t\t\t\tkey={item.id}\n\t\t\t\t\t\tclassName=\"flex items-baseline justify-between gap-3 text-sm\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t<p>{item.label}</p>\n\t\t\t\t\t\t\t{item.basis ? (\n\t\t\t\t\t\t\t\t<p className=\"text-muted-foreground text-xs\">{item.basis}</p>\n\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<p className=\"tabular-nums\">{item.amount}</p>\n\t\t\t\t\t</li>\n\t\t\t\t))}\n\t\t\t</ul>\n\t\t</div>\n\t);\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { BarChart3 } from \"lucide-react\";\n\nimport { EmptyState, type EmptyStateIcon } from \"../EmptyState\";\n\nexport type MetricEmptyStateProps = {\n\ttitle: string;\n\tdescription?: string;\n\taction?: React.ReactNode;\n\ticon?: EmptyStateIcon;\n\tclassName?: string;\n};\n\nexport function MetricEmptyState({\n\ttitle,\n\tdescription,\n\taction,\n\ticon = BarChart3,\n\tclassName,\n}: MetricEmptyStateProps) {\n\treturn (\n\t\t<EmptyState\n\t\t\ttitle={title}\n\t\t\tdescription={description}\n\t\t\taction={action}\n\t\t\ticon={icon}\n\t\t\tclassName={className}\n\t\t/>\n\t);\n}\n","\"use client\";\n\nimport * as React from \"react\";\n\nimport { useMediaQuery } from \"../../hooks/useMediaQuery\";\nimport { cn } from \"../../lib/utils\";\n\nexport type MetricSkeletonProps = {\n\tclassName?: string;\n\tbars?: number;\n};\n\nexport function MetricSkeleton({ className, bars = 4 }: MetricSkeletonProps) {\n\tconst reduced = useMediaQuery(\"(prefers-reduced-motion: reduce)\");\n\tconst count = Math.max(1, bars);\n\n\treturn (\n\t\t<div\n\t\t\trole=\"status\"\n\t\t\taria-live=\"polite\"\n\t\t\tclassName={cn(\"bg-card rounded-xl border p-6 shadow-sm\", className)}\n\t\t>\n\t\t\t<div\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"bg-muted mb-4 h-4 w-32 rounded\",\n\t\t\t\t\t!reduced && \"animate-pulse\",\n\t\t\t\t)}\n\t\t\t/>\n\t\t\t<div className=\"flex h-32 items-end gap-2\">\n\t\t\t\t{Array.from({ length: count }, (_, index) => (\n\t\t\t\t\t<div\n\t\t\t\t\t\tkey={index}\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\"bg-muted flex-1 rounded-t\",\n\t\t\t\t\t\t\t!reduced && \"animate-pulse\",\n\t\t\t\t\t\t)}\n\t\t\t\t\t\tstyle={{ height: `${40 + ((index * 17) % 50)}%` }}\n\t\t\t\t\t/>\n\t\t\t\t))}\n\t\t\t</div>\n\t\t\t<span className=\"sr-only\">Loading metrics</span>\n\t\t</div>\n\t);\n}\n","export const COOKIE_CONSENT_NAME = \"yenio-cookie-consent\";\n\nexport const COOKIE_CONSENT_VALUES = [\"necessary\", \"all\"] as const;\n\nexport type CookieConsentValue = (typeof COOKIE_CONSENT_VALUES)[number];\n\n/** ~180 days, matching contracts §1.2. */\nexport const COOKIE_CONSENT_MAX_AGE = 180 * 24 * 60 * 60;\n\nexport type WriteCookieConsentOptions = {\n\tdomain?: string;\n\tsecure?: boolean;\n\tmaxAge?: number;\n};\n\nexport function isCookieConsentValue(\n\tvalue: unknown,\n): value is CookieConsentValue {\n\treturn (\n\t\ttypeof value === \"string\" &&\n\t\t(COOKIE_CONSENT_VALUES as readonly string[]).includes(value)\n\t);\n}\n\nexport function cookieConsentAllowsReplay(\n\tvalue: CookieConsentValue | null | undefined,\n): boolean {\n\treturn value === \"all\";\n}\n\nexport function cookieDomainFromHostname(hostname: string): string | undefined {\n\tconst host = hostname.toLowerCase();\n\tif (host === \"localhost\" || host === \"127.0.0.1\") return undefined;\n\tif (host.endsWith(\".yenio.mx\") || host === \"yenio.mx\") return \".yenio.mx\";\n\tif (\n\t\thost.endsWith(\".yenio-pld.workers.dev\") ||\n\t\thost === \"yenio-pld.workers.dev\"\n\t) {\n\t\treturn \".yenio-pld.workers.dev\";\n\t}\n\treturn undefined;\n}\n\nfunction readCookieMap(cookieSource: string): Map<string, string> {\n\tconst map = new Map<string, string>();\n\tfor (const part of cookieSource.split(\";\")) {\n\t\tconst trimmed = part.trim();\n\t\tif (!trimmed) continue;\n\t\tconst eq = trimmed.indexOf(\"=\");\n\t\tif (eq < 0) continue;\n\t\tconst name = trimmed.slice(0, eq).trim();\n\t\tconst raw = trimmed.slice(eq + 1).trim();\n\t\tmap.set(name, decodeURIComponent(raw));\n\t}\n\treturn map;\n}\n\nexport function parseCookieConsent(\n\tcookieSource: string,\n): CookieConsentValue | null {\n\tconst raw = readCookieMap(cookieSource).get(COOKIE_CONSENT_NAME);\n\treturn isCookieConsentValue(raw) ? raw : null;\n}\n\nexport function readCookieConsent(): CookieConsentValue | null {\n\tif (typeof document === \"undefined\") return null;\n\treturn parseCookieConsent(document.cookie);\n}\n\nexport function serializeCookieConsent(\n\tvalue: CookieConsentValue,\n\toptions: WriteCookieConsentOptions = {},\n): string {\n\tconst maxAge = options.maxAge ?? COOKIE_CONSENT_MAX_AGE;\n\tconst secure =\n\t\toptions.secure ??\n\t\t(typeof window !== \"undefined\" && window.location.protocol === \"https:\");\n\tconst parts = [\n\t\t`${COOKIE_CONSENT_NAME}=${encodeURIComponent(value)}`,\n\t\t\"Path=/\",\n\t\t`Max-Age=${maxAge}`,\n\t\t\"SameSite=Lax\",\n\t];\n\tif (options.domain) {\n\t\tparts.push(`Domain=${options.domain}`);\n\t}\n\tif (secure) {\n\t\tparts.push(\"Secure\");\n\t}\n\treturn parts.join(\"; \");\n}\n\nexport function writeCookieConsent(\n\tvalue: CookieConsentValue,\n\toptions: WriteCookieConsentOptions = {},\n): void {\n\tif (typeof document === \"undefined\") return;\n\tdocument.cookie = serializeCookieConsent(value, options);\n}\n\nexport function isEmbeddedWindow(): boolean {\n\tif (typeof window === \"undefined\") return false;\n\ttry {\n\t\treturn window.self !== window.top;\n\t} catch {\n\t\treturn true;\n\t}\n}\n","\"use client\";\n\nimport { useEffect, useState } from \"react\";\n\nimport { cn } from \"../lib/utils\";\nimport { Button } from \"./ui/button\";\nimport {\n\ttype CookieConsentValue,\n\tcookieDomainFromHostname,\n\tisEmbeddedWindow,\n\treadCookieConsent,\n\twriteCookieConsent,\n} from \"../lib/cookie-consent\";\n\nexport type CookieConsentBannerLabels = {\n\tmessage: string;\n\tacceptAll: string;\n\tnecessaryOnly: string;\n\tpolicy: string;\n};\n\nexport const DEFAULT_COOKIE_CONSENT_BANNER_LABELS: CookieConsentBannerLabels = {\n\tmessage:\n\t\t\"We use necessary cookies to run Yenio. Extra cookies can be used for diagnostics if you opt in.\",\n\tacceptAll: \"Accept all\",\n\tnecessaryOnly: \"Necessary only\",\n\tpolicy: \"Cookies policy\",\n};\n\nexport type CookieConsentBannerProps = {\n\tdomain?: string;\n\tpolicyHref?: string;\n\tlabels?: Partial<CookieConsentBannerLabels>;\n\tonChoice?: (value: CookieConsentValue) => void;\n\tvariant?: \"default\" | \"embed\";\n\tclassName?: string;\n};\n\nexport function CookieConsentBanner({\n\tdomain,\n\tpolicyHref,\n\tlabels,\n\tonChoice,\n\tvariant = \"default\",\n\tclassName,\n}: CookieConsentBannerProps) {\n\tconst copy = { ...DEFAULT_COOKIE_CONSENT_BANNER_LABELS, ...labels };\n\tconst [consent, setConsent] = useState<CookieConsentValue | null | \"pending\">(\n\t\t\"pending\",\n\t);\n\n\tuseEffect(() => {\n\t\tif (variant === \"embed\" || isEmbeddedWindow()) {\n\t\t\tsetConsent(\"necessary\");\n\t\t\treturn;\n\t\t}\n\t\tsetConsent(readCookieConsent());\n\t}, [variant]);\n\n\tif (variant === \"embed\") return null;\n\tif (consent === \"pending\" || consent) return null;\n\n\tconst choose = (value: CookieConsentValue) => {\n\t\tconst resolvedDomain =\n\t\t\tdomain ??\n\t\t\t(typeof window === \"undefined\"\n\t\t\t\t? undefined\n\t\t\t\t: cookieDomainFromHostname(window.location.hostname));\n\t\twriteCookieConsent(value, { domain: resolvedDomain });\n\t\tsetConsent(value);\n\t\tonChoice?.(value);\n\t};\n\n\treturn (\n\t\t<div\n\t\t\trole=\"dialog\"\n\t\t\taria-label={copy.message}\n\t\t\tclassName={cn(\n\t\t\t\t\"fixed inset-x-0 bottom-0 z-50 border-t bg-background/95 p-4 shadow-lg backdrop-blur-sm\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t<div className=\"mx-auto flex w-full max-w-5xl flex-col gap-3 sm:flex-row sm:items-center sm:justify-between\">\n\t\t\t\t<p className=\"text-sm text-muted-foreground\">\n\t\t\t\t\t{copy.message}\n\t\t\t\t\t{policyHref ? (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t{\" \"}\n\t\t\t\t\t\t\t<a\n\t\t\t\t\t\t\t\thref={policyHref}\n\t\t\t\t\t\t\t\tclassName=\"text-foreground underline underline-offset-4\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{copy.policy}\n\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t</>\n\t\t\t\t\t) : null}\n\t\t\t\t</p>\n\t\t\t\t<div className=\"flex shrink-0 flex-wrap gap-2\">\n\t\t\t\t\t<Button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tvariant=\"outline\"\n\t\t\t\t\t\tonClick={() => choose(\"necessary\")}\n\t\t\t\t\t>\n\t\t\t\t\t\t{copy.necessaryOnly}\n\t\t\t\t\t</Button>\n\t\t\t\t\t<Button type=\"button\" onClick={() => choose(\"all\")}>\n\t\t\t\t\t\t{copy.acceptAll}\n\t\t\t\t\t</Button>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n","import type { ReactNode } from \"react\";\n\nfunction LegalDocLink({\n\thref,\n\tchildren,\n}: {\n\thref: string;\n\tchildren: ReactNode;\n}) {\n\treturn (\n\t\t<a\n\t\t\thref={href}\n\t\t\ttarget=\"_blank\"\n\t\t\trel=\"noopener noreferrer\"\n\t\t\tclassName=\"underline underline-offset-4\"\n\t\t>\n\t\t\t{children}\n\t\t</a>\n\t);\n}\n\nfunction wrapPhrases(\n\tlabel: string,\n\tterms: string,\n\tprivacy: string,\n\ttermsHref: string,\n\tprivacyHref: string,\n): ReactNode {\n\ttype Hit = { start: number; end: number; href: string; text: string };\n\tconst hits: Hit[] = [];\n\tif (terms) {\n\t\tconst start = label.indexOf(terms);\n\t\tif (start >= 0) {\n\t\t\thits.push({\n\t\t\t\tstart,\n\t\t\t\tend: start + terms.length,\n\t\t\t\thref: termsHref,\n\t\t\t\ttext: terms,\n\t\t\t});\n\t\t}\n\t}\n\tif (privacy) {\n\t\tconst start = label.indexOf(privacy);\n\t\tif (start >= 0) {\n\t\t\thits.push({\n\t\t\t\tstart,\n\t\t\t\tend: start + privacy.length,\n\t\t\t\thref: privacyHref,\n\t\t\t\ttext: privacy,\n\t\t\t});\n\t\t}\n\t}\n\thits.sort((a, b) => a.start - b.start || b.end - b.start - (a.end - a.start));\n\tconst kept: Hit[] = [];\n\tfor (const hit of hits) {\n\t\tconst last = kept[kept.length - 1];\n\t\tif (last && hit.start < last.end) {\n\t\t\tif (hit.end - hit.start > last.end - last.start) {\n\t\t\t\tkept[kept.length - 1] = hit;\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\t\tkept.push(hit);\n\t}\n\tif (kept.length === 0) {\n\t\treturn (\n\t\t\t<>\n\t\t\t\t{label} <LegalDocLink href={termsHref}>{terms}</LegalDocLink>\n\t\t\t\t{\" · \"}\n\t\t\t\t<LegalDocLink href={privacyHref}>{privacy}</LegalDocLink>\n\t\t\t</>\n\t\t);\n\t}\n\tconst nodes: ReactNode[] = [];\n\tlet cursor = 0;\n\tkept.forEach((hit, index) => {\n\t\tif (hit.start > cursor) {\n\t\t\tnodes.push(label.slice(cursor, hit.start));\n\t\t}\n\t\tnodes.push(\n\t\t\t<LegalDocLink key={`${hit.text}-${index}`} href={hit.href}>\n\t\t\t\t{hit.text}\n\t\t\t</LegalDocLink>,\n\t\t);\n\t\tcursor = hit.end;\n\t});\n\tif (cursor < label.length) {\n\t\tnodes.push(label.slice(cursor));\n\t}\n\treturn nodes;\n}\n\nexport function renderLegalAcceptLabel(\n\tlabel: string,\n\tterms: string,\n\tprivacy: string,\n\ttermsHref: string,\n\tprivacyHref: string,\n): ReactNode {\n\tif (label.includes(\"{terms}\") || label.includes(\"{privacy}\")) {\n\t\treturn label.split(/(\\{terms\\}|\\{privacy\\})/g).map((part, index) => {\n\t\t\tif (part === \"{terms}\") {\n\t\t\t\treturn (\n\t\t\t\t\t<LegalDocLink key={`terms-${index}`} href={termsHref}>\n\t\t\t\t\t\t{terms}\n\t\t\t\t\t</LegalDocLink>\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (part === \"{privacy}\") {\n\t\t\t\treturn (\n\t\t\t\t\t<LegalDocLink key={`privacy-${index}`} href={privacyHref}>\n\t\t\t\t\t\t{privacy}\n\t\t\t\t\t</LegalDocLink>\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn part;\n\t\t});\n\t}\n\treturn wrapPhrases(label, terms, privacy, termsHref, privacyHref);\n}\n","\"use client\";\n\nimport { renderLegalAcceptLabel } from \"../lib/legal-accept-label\";\nimport { Button } from \"./ui/button\";\nimport {\n\tAlertDialog,\n\tAlertDialogContent,\n\tAlertDialogDescription,\n\tAlertDialogFooter,\n\tAlertDialogHeader,\n\tAlertDialogTitle,\n} from \"./ui/alert-dialog\";\n\nexport type LegalAcceptDialogLabels = {\n\ttitle: string;\n\tdescription: string;\n\taccept: string;\n\tterms: string;\n\tprivacy: string;\n};\n\nexport const DEFAULT_LEGAL_ACCEPT_DIALOG_LABELS: LegalAcceptDialogLabels = {\n\ttitle: \"Updated terms\",\n\tdescription:\n\t\t\"We updated the Terms of Service and Privacy Policy. Please accept to continue.\",\n\taccept: \"Accept\",\n\tterms: \"Terms of Service\",\n\tprivacy: \"Privacy Policy\",\n};\n\nexport type LegalAcceptDialogProps = {\n\topen: boolean;\n\ttermsHref: string;\n\tprivacyHref: string;\n\tsummary?: string;\n\taccepting?: boolean;\n\tlabels?: Partial<LegalAcceptDialogLabels>;\n\tonAccept: () => void;\n};\n\nexport function LegalAcceptDialog({\n\topen,\n\ttermsHref,\n\tprivacyHref,\n\tsummary,\n\taccepting = false,\n\tlabels,\n\tonAccept,\n}: LegalAcceptDialogProps) {\n\tconst copy = { ...DEFAULT_LEGAL_ACCEPT_DIALOG_LABELS, ...labels };\n\n\treturn (\n\t\t<AlertDialog\n\t\t\topen={open}\n\t\t\tonOpenChange={(next) => {\n\t\t\t\tif (next) return;\n\t\t\t}}\n\t\t>\n\t\t\t<AlertDialogContent\n\t\t\t\tonEscapeKeyDown={(event) => {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t<AlertDialogHeader>\n\t\t\t\t\t<AlertDialogTitle>{copy.title}</AlertDialogTitle>\n\t\t\t\t\t<AlertDialogDescription>\n\t\t\t\t\t\t{renderLegalAcceptLabel(\n\t\t\t\t\t\t\tcopy.description,\n\t\t\t\t\t\t\tcopy.terms,\n\t\t\t\t\t\t\tcopy.privacy,\n\t\t\t\t\t\t\ttermsHref,\n\t\t\t\t\t\t\tprivacyHref,\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{summary ? ` ${summary}` : \"\"}\n\t\t\t\t\t</AlertDialogDescription>\n\t\t\t\t</AlertDialogHeader>\n\t\t\t\t<AlertDialogFooter>\n\t\t\t\t\t<Button type=\"button\" disabled={accepting} onClick={onAccept}>\n\t\t\t\t\t\t{copy.accept}\n\t\t\t\t\t</Button>\n\t\t\t\t</AlertDialogFooter>\n\t\t\t</AlertDialogContent>\n\t\t</AlertDialog>\n\t);\n}\n","import { cn } from \"../lib/utils\";\nimport { renderLegalAcceptLabel } from \"../lib/legal-accept-label\";\n\nexport type LegalAcceptCheckboxLabels = {\n\tlabel: string;\n\tterms: string;\n\tprivacy: string;\n};\n\nexport const DEFAULT_LEGAL_ACCEPT_CHECKBOX_LABELS: LegalAcceptCheckboxLabels = {\n\tlabel: \"I agree to the {terms} and {privacy}\",\n\tterms: \"Terms of Service\",\n\tprivacy: \"Privacy Policy\",\n};\n\nexport type LegalAcceptCheckboxProps = {\n\tid?: string;\n\tchecked: boolean;\n\tonCheckedChange: (checked: boolean) => void;\n\ttermsHref: string;\n\tprivacyHref: string;\n\tlabels?: Partial<LegalAcceptCheckboxLabels>;\n\tdisabled?: boolean;\n\tclassName?: string;\n};\n\nexport function LegalAcceptCheckbox({\n\tid = \"legal-accept\",\n\tchecked,\n\tonCheckedChange,\n\ttermsHref,\n\tprivacyHref,\n\tlabels,\n\tdisabled = false,\n\tclassName,\n}: LegalAcceptCheckboxProps) {\n\tconst copy = { ...DEFAULT_LEGAL_ACCEPT_CHECKBOX_LABELS, ...labels };\n\n\treturn (\n\t\t<div className={cn(\"flex items-start gap-3\", className)}>\n\t\t\t<input\n\t\t\t\tid={id}\n\t\t\t\ttype=\"checkbox\"\n\t\t\t\tchecked={checked}\n\t\t\t\tdisabled={disabled}\n\t\t\t\tonChange={(event) => onCheckedChange(event.target.checked)}\n\t\t\t\tclassName=\"mt-1 size-4 shrink-0 accent-primary\"\n\t\t\t/>\n\t\t\t<label htmlFor={id} className=\"text-sm leading-5\">\n\t\t\t\t{renderLegalAcceptLabel(\n\t\t\t\t\tcopy.label,\n\t\t\t\t\tcopy.terms,\n\t\t\t\t\tcopy.privacy,\n\t\t\t\t\ttermsHref,\n\t\t\t\t\tprivacyHref,\n\t\t\t\t)}\n\t\t\t</label>\n\t\t</div>\n\t);\n}\n","import type { ReactNode } from \"react\";\n\nimport { cn } from \"../lib/utils\";\n\nexport type LegalMarkdownProps = {\n\tmarkdown: string;\n\tclassName?: string;\n};\n\nfunction sanitizeHref(href: string): string | null {\n\tconst trimmed = href.trim();\n\tif (/^https?:\\/\\//i.test(trimmed) || /^mailto:/i.test(trimmed)) {\n\t\treturn trimmed;\n\t}\n\tif (trimmed.startsWith(\"/\") && !trimmed.startsWith(\"//\")) {\n\t\treturn trimmed;\n\t}\n\treturn null;\n}\n\nfunction renderInline(text: string): ReactNode[] {\n\tconst nodes: ReactNode[] = [];\n\tconst pattern = /(\\*\\*[^*]+\\*\\*|\\*[^*]+\\*|`[^`]+`|\\[[^\\]]+\\]\\([^)]+\\))/g;\n\tlet last = 0;\n\tlet match: RegExpExecArray | null;\n\tlet key = 0;\n\twhile ((match = pattern.exec(text)) !== null) {\n\t\tif (match.index > last) {\n\t\t\tnodes.push(text.slice(last, match.index));\n\t\t}\n\t\tconst token = match[0];\n\t\tif (token.startsWith(\"**\")) {\n\t\t\tnodes.push(<strong key={key}>{token.slice(2, -2)}</strong>);\n\t\t} else if (token.startsWith(\"*\")) {\n\t\t\tnodes.push(<em key={key}>{token.slice(1, -1)}</em>);\n\t\t} else if (token.startsWith(\"`\")) {\n\t\t\tnodes.push(\n\t\t\t\t<code key={key} className=\"rounded bg-muted px-1 py-0.5 text-[0.9em]\">\n\t\t\t\t\t{token.slice(1, -1)}\n\t\t\t\t</code>,\n\t\t\t);\n\t\t} else {\n\t\t\tconst link = token.match(/^\\[([^\\]]+)\\]\\(([^)]+)\\)$/);\n\t\t\tconst href = link ? sanitizeHref(link[2] ?? \"\") : null;\n\t\t\tif (link && href) {\n\t\t\t\tnodes.push(\n\t\t\t\t\t<a\n\t\t\t\t\t\tkey={key}\n\t\t\t\t\t\thref={href}\n\t\t\t\t\t\tclassName=\"underline underline-offset-4\"\n\t\t\t\t\t\trel=\"noopener noreferrer\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{link[1]}\n\t\t\t\t\t</a>,\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tnodes.push(token);\n\t\t\t}\n\t\t}\n\t\tkey += 1;\n\t\tlast = match.index + token.length;\n\t}\n\tif (last < text.length) {\n\t\tnodes.push(text.slice(last));\n\t}\n\treturn nodes;\n}\n\nfunction headingTag(\n\tline: string,\n): { Tag: \"h1\" | \"h2\" | \"h3\"; text: string } | null {\n\tif (line.startsWith(\"### \")) return { Tag: \"h3\", text: line.slice(4) };\n\tif (line.startsWith(\"## \")) return { Tag: \"h2\", text: line.slice(3) };\n\tif (line.startsWith(\"# \")) return { Tag: \"h1\", text: line.slice(2) };\n\treturn null;\n}\n\nfunction isUnorderedItem(line: string): boolean {\n\treturn /^[-*] /.test(line);\n}\n\nfunction isOrderedItem(line: string): boolean {\n\treturn /^\\d+\\. /.test(line);\n}\n\nexport function LegalMarkdown({ markdown, className }: LegalMarkdownProps) {\n\tconst blocks = markdown\n\t\t.replace(/\\r\\n/g, \"\\n\")\n\t\t.trim()\n\t\t.split(/\\n{2,}/);\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\t\"legal-markdown space-y-4 text-sm leading-6 [&_h1]:text-3xl [&_h1]:font-semibold [&_h2]:text-xl [&_h2]:font-semibold [&_h3]:text-lg [&_h3]:font-semibold [&_ul]:list-disc [&_ul]:pl-5 [&_ol]:list-decimal [&_ol]:pl-5\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t{blocks.map((block, index) => {\n\t\t\t\tconst lines = block.split(\"\\n\");\n\t\t\t\tconst heading = headingTag(lines[0] ?? \"\");\n\t\t\t\tif (heading && lines.length === 1) {\n\t\t\t\t\tconst { Tag, text } = heading;\n\t\t\t\t\treturn <Tag key={index}>{renderInline(text)}</Tag>;\n\t\t\t\t}\n\t\t\t\tif (lines.every(isUnorderedItem)) {\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<ul key={index}>\n\t\t\t\t\t\t\t{lines.map((line, itemIndex) => (\n\t\t\t\t\t\t\t\t<li key={itemIndex}>\n\t\t\t\t\t\t\t\t\t{renderInline(line.replace(/^[-*] /, \"\"))}\n\t\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</ul>\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tif (lines.every(isOrderedItem)) {\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<ol key={index}>\n\t\t\t\t\t\t\t{lines.map((line, itemIndex) => (\n\t\t\t\t\t\t\t\t<li key={itemIndex}>\n\t\t\t\t\t\t\t\t\t{renderInline(line.replace(/^\\d+\\. /, \"\"))}\n\t\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</ol>\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\treturn <p key={index}>{renderInline(lines.join(\" \"))}</p>;\n\t\t\t})}\n\t\t</div>\n\t);\n}\n","/** Matches `next-themes` default `storageKey`. */\nexport const THEME_STORAGE_KEY = \"theme\";\n\nexport const THEME_INIT_SCRIPT_ID = \"yenio-theme-init\";\n\n/**\n * Blocking script for the root layout.\n * `next-themes` contract: `attribute=\"class\"`, `storageKey=\"theme\"`, default `system`.\n * The provider injects the class too late for first paint.\n */\nexport const THEME_INIT_SCRIPT = `(function(){var t=\"light\";var s;try{s=localStorage.getItem(\"${THEME_STORAGE_KEY}\")}catch(e){}if(s===\"dark\"||s===\"light\"){t=s}else{try{if(window.matchMedia(\"(prefers-color-scheme: dark)\").matches)t=\"dark\"}catch(e){}}var r=document.documentElement;r.classList.add(t);r.style.colorScheme=t})();`;\n","\"use client\";\n\nimport type { ReactNode } from \"react\";\n\nimport { cn } from \"../lib/utils\";\nimport { EmptyState } from \"./EmptyState\";\n\nexport type AuditActor = {\n\tkind: string;\n\tid: string;\n\torganizationRole?: string | null;\n};\n\nexport type AuditSubject = {\n\ttype: string;\n\tid: string;\n};\n\nexport type AuditTimelineItem = {\n\tid: string;\n\ttype: string;\n\toccurredAt: number;\n\tactor: AuditActor;\n\tsubject: AuditSubject;\n\tsummary: string;\n};\n\nexport type AuditTimelineLabels = {\n\temptyTitle: string;\n\temptyDescription: string;\n\tactor: string;\n\tsubject: string;\n};\n\nexport const DEFAULT_AUDIT_TIMELINE_LABELS: AuditTimelineLabels = {\n\temptyTitle: \"No events\",\n\temptyDescription: \"Audited activity will appear here.\",\n\tactor: \"Actor\",\n\tsubject: \"Subject\",\n};\n\nexport type AuditTimelineProps = {\n\titems: AuditTimelineItem[];\n\tlabels?: Partial<AuditTimelineLabels>;\n\t/** Single primary action shown only when the timeline is empty. */\n\temptyAction?: ReactNode;\n\tclassName?: string;\n\tformatOccurredAt?: (occurredAt: number) => string;\n};\n\nfunction formatOccurredAt(occurredAt: number): string {\n\tconst date = new Date(occurredAt);\n\tif (Number.isNaN(date.getTime())) return String(occurredAt);\n\treturn new Intl.DateTimeFormat(\"en\", {\n\t\tdateStyle: \"medium\",\n\t\ttimeStyle: \"short\",\n\t\ttimeZone: \"America/Mexico_City\",\n\t}).format(date);\n}\n\nfunction actorLine(actor: AuditActor): string {\n\tconst role = actor.organizationRole ? ` (${actor.organizationRole})` : \"\";\n\treturn `${actor.kind} ${actor.id}${role}`;\n}\n\nexport function AuditTimeline({\n\titems,\n\tlabels,\n\temptyAction,\n\tclassName,\n\tformatOccurredAt: format = formatOccurredAt,\n}: AuditTimelineProps) {\n\tconst copy = { ...DEFAULT_AUDIT_TIMELINE_LABELS, ...labels };\n\n\tif (items.length === 0) {\n\t\treturn (\n\t\t\t<EmptyState\n\t\t\t\tclassName={className}\n\t\t\t\ttitle={copy.emptyTitle}\n\t\t\t\tdescription={copy.emptyDescription}\n\t\t\t\taction={emptyAction}\n\t\t\t/>\n\t\t);\n\t}\n\n\treturn (\n\t\t<ol className={cn(\"flex flex-col gap-3\", className)}>\n\t\t\t{items.map((item) => {\n\t\t\t\tconst occurred = new Date(item.occurredAt);\n\t\t\t\tconst iso = Number.isNaN(occurred.getTime())\n\t\t\t\t\t? undefined\n\t\t\t\t\t: occurred.toISOString();\n\t\t\t\treturn (\n\t\t\t\t\t<li\n\t\t\t\t\t\tkey={item.id}\n\t\t\t\t\t\tclassName=\"rounded-xl border border-border bg-card p-4 text-card-foreground\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<div className=\"flex flex-wrap items-baseline justify-between gap-2\">\n\t\t\t\t\t\t\t<p className=\"font-mono text-sm font-medium\">{item.type}</p>\n\t\t\t\t\t\t\t<time className=\"text-xs text-muted-foreground\" dateTime={iso}>\n\t\t\t\t\t\t\t\t{format(item.occurredAt)}\n\t\t\t\t\t\t\t</time>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<p className=\"mt-2 text-sm\">{item.summary}</p>\n\t\t\t\t\t\t<p className=\"mt-2 text-xs text-muted-foreground\">\n\t\t\t\t\t\t\t{copy.actor}: {actorLine(item.actor)}\n\t\t\t\t\t\t</p>\n\t\t\t\t\t\t<p className=\"text-xs text-muted-foreground\">\n\t\t\t\t\t\t\t{copy.subject}: {item.subject.type} {item.subject.id}\n\t\t\t\t\t\t</p>\n\t\t\t\t\t</li>\n\t\t\t\t);\n\t\t\t})}\n\t\t</ol>\n\t);\n}\n","\"use client\";\n\nimport { cn } from \"../lib/utils\";\n\nexport type RiskSeverity = \"low\" | \"medium\" | \"high\";\n\nexport type RiskBadgeLabels = {\n\tlow: string;\n\tmedium: string;\n\thigh: string;\n\tunverifiedRule: string;\n};\n\nexport const DEFAULT_RISK_BADGE_LABELS: RiskBadgeLabels = {\n\tlow: \"Low\",\n\tmedium: \"Medium\",\n\thigh: \"High\",\n\tunverifiedRule: \"Unverified rule\",\n};\n\nexport type RiskBadgeProps = {\n\tseverity: RiskSeverity;\n\t/** When false, the badge also shows the unverified-rule label. */\n\tsmeVerified?: boolean;\n\tlabels?: Partial<RiskBadgeLabels>;\n\tclassName?: string;\n};\n\nconst tone: Record<RiskSeverity, string> = {\n\tlow: \"bg-muted text-muted-foreground\",\n\tmedium: \"bg-accent text-accent-foreground\",\n\thigh: \"bg-destructive/15 text-destructive\",\n};\n\nfunction severityLabel(\n\tseverity: RiskSeverity,\n\tlabels: RiskBadgeLabels,\n): string {\n\tswitch (severity) {\n\t\tcase \"low\":\n\t\t\treturn labels.low;\n\t\tcase \"medium\":\n\t\t\treturn labels.medium;\n\t\tcase \"high\":\n\t\t\treturn labels.high;\n\t\tdefault: {\n\t\t\tconst exhaustive: never = severity;\n\t\t\treturn exhaustive;\n\t\t}\n\t}\n}\n\nexport function RiskBadge({\n\tseverity,\n\tsmeVerified,\n\tlabels,\n\tclassName,\n}: RiskBadgeProps) {\n\tconst copy = { ...DEFAULT_RISK_BADGE_LABELS, ...labels };\n\n\treturn (\n\t\t<span className={cn(\"inline-flex flex-wrap items-center gap-2\", className)}>\n\t\t\t<span\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"inline-flex items-center rounded-md px-2 py-0.5 text-xs font-medium\",\n\t\t\t\t\ttone[severity],\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t{severityLabel(severity, copy)}\n\t\t\t</span>\n\t\t\t{smeVerified === false ? (\n\t\t\t\t<span className=\"text-xs text-muted-foreground\">\n\t\t\t\t\t{copy.unverifiedRule}\n\t\t\t\t</span>\n\t\t\t) : null}\n\t\t</span>\n\t);\n}\n","\"use client\";\n\nimport type { ReactNode } from \"react\";\n\nimport { cn } from \"../lib/utils\";\nimport { EmptyState } from \"./EmptyState\";\n\nexport type EntityGraphNode = {\n\tid: string;\n\tlabel: string;\n\tkind: string;\n};\n\nexport type ControlKind = \"ownership\" | \"other_means\" | \"senior_manager\";\n\nexport type EntityGraphEdge = {\n\tfrom: string;\n\tto: string;\n\tcontrolKind: ControlKind;\n\townershipBps?: number;\n};\n\nexport type EntityGraphLabels = {\n\temptyTitle: string;\n\temptyDescription: string;\n\townership: string;\n\totherMeans: string;\n\tseniorManager: string;\n};\n\nexport const DEFAULT_ENTITY_GRAPH_LABELS: EntityGraphLabels = {\n\temptyTitle: \"No beneficial owners\",\n\temptyDescription: \"Ownership and control relationships will appear here.\",\n\townership: \"Ownership\",\n\totherMeans: \"Other means\",\n\tseniorManager: \"Senior manager\",\n};\n\nexport type EntityGraphProps = {\n\tnodes: EntityGraphNode[];\n\tedges: EntityGraphEdge[];\n\tlabels?: Partial<EntityGraphLabels>;\n\temptyAction?: ReactNode;\n\tclassName?: string;\n};\n\nfunction controlLabel(\n\tcontrolKind: ControlKind,\n\tlabels: EntityGraphLabels,\n): string {\n\tswitch (controlKind) {\n\t\tcase \"ownership\":\n\t\t\treturn labels.ownership;\n\t\tcase \"other_means\":\n\t\t\treturn labels.otherMeans;\n\t\tcase \"senior_manager\":\n\t\t\treturn labels.seniorManager;\n\t\tdefault: {\n\t\t\tconst exhaustive: never = controlKind;\n\t\t\treturn exhaustive;\n\t\t}\n\t}\n}\n\nfunction formatOwnership(bps: number): string {\n\tconst percent = bps / 100;\n\tconst text = Number.isInteger(percent) ? String(percent) : percent.toFixed(2);\n\treturn `${text}% (${bps} bps)`;\n}\n\nfunction nodeLabel(nodes: EntityGraphNode[], id: string): string {\n\treturn nodes.find((node) => node.id === id)?.label ?? id;\n}\n\nexport function EntityGraph({\n\tnodes,\n\tedges,\n\tlabels,\n\temptyAction,\n\tclassName,\n}: EntityGraphProps) {\n\tconst copy = { ...DEFAULT_ENTITY_GRAPH_LABELS, ...labels };\n\n\tif (nodes.length === 0 && edges.length === 0) {\n\t\treturn (\n\t\t\t<EmptyState\n\t\t\t\tclassName={className}\n\t\t\t\ttitle={copy.emptyTitle}\n\t\t\t\tdescription={copy.emptyDescription}\n\t\t\t\taction={emptyAction}\n\t\t\t/>\n\t\t);\n\t}\n\n\tconst nodeIds = new Set(nodes.map((node) => node.id));\n\tconst unattached = edges.filter((edge) => !nodeIds.has(edge.from));\n\n\treturn (\n\t\t<div className={cn(\"flex flex-col gap-3\", className)}>\n\t\t\t{nodes.map((node) => {\n\t\t\t\tconst outgoing = edges.filter((edge) => edge.from === node.id);\n\t\t\t\treturn (\n\t\t\t\t\t<section\n\t\t\t\t\t\tkey={node.id}\n\t\t\t\t\t\tclassName=\"rounded-xl border border-border bg-card p-4 text-card-foreground\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<h3 className=\"text-sm font-medium\">{node.label}</h3>\n\t\t\t\t\t\t<p className=\"text-xs text-muted-foreground\">{node.kind}</p>\n\t\t\t\t\t\t{outgoing.length > 0 ? (\n\t\t\t\t\t\t\t<ul className=\"mt-3 flex flex-col gap-1 text-sm\">\n\t\t\t\t\t\t\t\t{outgoing.map((edge) => (\n\t\t\t\t\t\t\t\t\t<li key={`${edge.from}-${edge.to}-${edge.controlKind}`}>\n\t\t\t\t\t\t\t\t\t\t{node.label} → {nodeLabel(nodes, edge.to)}:{\" \"}\n\t\t\t\t\t\t\t\t\t\t{controlLabel(edge.controlKind, copy)}\n\t\t\t\t\t\t\t\t\t\t{typeof edge.ownershipBps === \"number\"\n\t\t\t\t\t\t\t\t\t\t\t? ` ${formatOwnership(edge.ownershipBps)}`\n\t\t\t\t\t\t\t\t\t\t\t: null}\n\t\t\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t</ul>\n\t\t\t\t\t\t) : null}\n\t\t\t\t\t</section>\n\t\t\t\t);\n\t\t\t})}\n\t\t\t{unattached.length > 0 ? (\n\t\t\t\t<ul className=\"flex flex-col gap-1 text-sm\">\n\t\t\t\t\t{unattached.map((edge) => (\n\t\t\t\t\t\t<li key={`${edge.from}-${edge.to}-${edge.controlKind}`}>\n\t\t\t\t\t\t\t{nodeLabel(nodes, edge.from)} → {nodeLabel(nodes, edge.to)}:{\" \"}\n\t\t\t\t\t\t\t{controlLabel(edge.controlKind, copy)}\n\t\t\t\t\t\t\t{typeof edge.ownershipBps === \"number\"\n\t\t\t\t\t\t\t\t? ` ${formatOwnership(edge.ownershipBps)}`\n\t\t\t\t\t\t\t\t: null}\n\t\t\t\t\t\t</li>\n\t\t\t\t\t))}\n\t\t\t\t</ul>\n\t\t\t) : null}\n\t\t</div>\n\t);\n}\n","\"use client\";\n\nimport { useId, useState, type ReactNode } from \"react\";\n\nimport { cn } from \"../lib/utils\";\nimport { Button } from \"./ui/button\";\nimport { EmptyState } from \"./EmptyState\";\n\nexport type MatchReviewSource = {\n\turl: string;\n\ttitle: string;\n};\n\nexport type MatchReviewStatus = \"pending\" | \"confirmed\" | \"dismissed\";\n\nexport type MatchReviewHit = {\n\tsource: string;\n\tscore?: number;\n\tmatchedFields: string[];\n\tstatus: MatchReviewStatus;\n\tunverified?: boolean;\n\tsources?: MatchReviewSource[];\n};\n\nexport type MatchReviewLabels = {\n\temptyTitle: string;\n\temptyDescription: string;\n\tsource: string;\n\tscore: string;\n\tmatchedFields: string;\n\tnoMatchedFields: string;\n\tstatus: string;\n\tunverified: string;\n\treason: string;\n\treasonPlaceholder: string;\n\tconfirm: string;\n\tdismiss: string;\n};\n\nexport const DEFAULT_MATCH_REVIEW_LABELS: MatchReviewLabels = {\n\temptyTitle: \"No match\",\n\temptyDescription: \"There is no hit to review.\",\n\tsource: \"Source\",\n\tscore: \"Score\",\n\tmatchedFields: \"Matched fields\",\n\tnoMatchedFields: \"None\",\n\tstatus: \"Status\",\n\tunverified: \"Unverified\",\n\treason: \"Reason\",\n\treasonPlaceholder: \"Why this decision\",\n\tconfirm: \"Confirm\",\n\tdismiss: \"Dismiss\",\n};\n\nexport type MatchReviewProps = {\n\thit: MatchReviewHit | null;\n\tonResolve: (status: \"confirmed\" | \"dismissed\", reason: string) => void;\n\tlabels?: Partial<MatchReviewLabels>;\n\t/** Optional map from source identifiers such as `sat69b` to display copy. */\n\tsourceLabels?: Record<string, string>;\n\temptyAction?: ReactNode;\n\tclassName?: string;\n};\n\nexport function sourceUrlIsHttps(url: string): boolean {\n\ttry {\n\t\treturn new URL(url).protocol === \"https:\";\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nexport function matchClaimIsUnverified(hit: MatchReviewHit): boolean {\n\tif (hit.unverified === true) return true;\n\treturn (hit.sources ?? []).some((source) => !sourceUrlIsHttps(source.url));\n}\n\ntype Appearance = \"unverified\" | MatchReviewStatus;\n\nfunction appearanceOf(hit: MatchReviewHit): Appearance {\n\tif (matchClaimIsUnverified(hit)) return \"unverified\";\n\treturn hit.status;\n}\n\nconst appearanceClass: Record<Appearance, string> = {\n\tunverified: \"border-dashed border-border bg-muted/40\",\n\tpending: \"border-border bg-card\",\n\tconfirmed: \"border-primary bg-primary/5\",\n\tdismissed: \"border-border bg-muted/30\",\n};\n\nexport function MatchReview({\n\thit,\n\tonResolve,\n\tlabels,\n\tsourceLabels,\n\temptyAction,\n\tclassName,\n}: MatchReviewProps) {\n\tconst copy = { ...DEFAULT_MATCH_REVIEW_LABELS, ...labels };\n\tconst reasonId = useId();\n\tconst [reason, setReason] = useState(\"\");\n\tconst trimmed = reason.trim();\n\n\tif (!hit) {\n\t\treturn (\n\t\t\t<EmptyState\n\t\t\t\tclassName={className}\n\t\t\t\ttitle={copy.emptyTitle}\n\t\t\t\tdescription={copy.emptyDescription}\n\t\t\t\taction={emptyAction}\n\t\t\t/>\n\t\t);\n\t}\n\n\tconst appearance = appearanceOf(hit);\n\tconst sourceLabel = sourceLabels?.[hit.source] ?? hit.source;\n\n\tfunction resolve(status: \"confirmed\" | \"dismissed\") {\n\t\tif (trimmed.length === 0) return;\n\t\tonResolve(status, trimmed);\n\t}\n\n\treturn (\n\t\t<article\n\t\t\tdata-appearance={appearance}\n\t\t\tclassName={cn(\n\t\t\t\t\"flex flex-col gap-3 rounded-xl border p-4 text-card-foreground motion-reduce:transition-none\",\n\t\t\t\tappearanceClass[appearance],\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t<div className=\"flex flex-wrap items-center gap-2\">\n\t\t\t\t<p className=\"text-sm font-medium\">\n\t\t\t\t\t{copy.source}: {sourceLabel}\n\t\t\t\t</p>\n\t\t\t\t{appearance === \"unverified\" ? (\n\t\t\t\t\t<span className=\"rounded-md bg-muted px-2 py-0.5 text-xs text-muted-foreground\">\n\t\t\t\t\t\t{copy.unverified}\n\t\t\t\t\t</span>\n\t\t\t\t) : null}\n\t\t\t</div>\n\t\t\t<dl className=\"grid grid-cols-[max-content_1fr] gap-x-3 gap-y-1 text-sm\">\n\t\t\t\t{typeof hit.score === \"number\" ? (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<dt className=\"text-muted-foreground\">{copy.score}</dt>\n\t\t\t\t\t\t<dd>{hit.score}</dd>\n\t\t\t\t\t</>\n\t\t\t\t) : null}\n\t\t\t\t<dt className=\"text-muted-foreground\">{copy.matchedFields}</dt>\n\t\t\t\t<dd>\n\t\t\t\t\t{hit.matchedFields.length > 0\n\t\t\t\t\t\t? hit.matchedFields.join(\", \")\n\t\t\t\t\t\t: copy.noMatchedFields}\n\t\t\t\t</dd>\n\t\t\t\t<dt className=\"text-muted-foreground\">{copy.status}</dt>\n\t\t\t\t<dd>{hit.status}</dd>\n\t\t\t</dl>\n\t\t\t{hit.sources && hit.sources.length > 0 ? (\n\t\t\t\t<ul className=\"flex flex-col gap-1 text-sm\">\n\t\t\t\t\t{hit.sources.map((source) =>\n\t\t\t\t\t\tsourceUrlIsHttps(source.url) ? (\n\t\t\t\t\t\t\t<li key={`${source.title}-${source.url}`}>\n\t\t\t\t\t\t\t\t<a\n\t\t\t\t\t\t\t\t\tclassName=\"underline underline-offset-2\"\n\t\t\t\t\t\t\t\t\thref={source.url}\n\t\t\t\t\t\t\t\t\trel=\"noreferrer\"\n\t\t\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{source.title}\n\t\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<li key={`${source.title}-${source.url}`}>\n\t\t\t\t\t\t\t\t{source.title} ({copy.unverified})\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t),\n\t\t\t\t\t)}\n\t\t\t\t</ul>\n\t\t\t) : null}\n\t\t\t<div className=\"flex flex-col gap-1\">\n\t\t\t\t<label className=\"text-sm font-medium\" htmlFor={reasonId}>\n\t\t\t\t\t{copy.reason}\n\t\t\t\t</label>\n\t\t\t\t<textarea\n\t\t\t\t\tid={reasonId}\n\t\t\t\t\tclassName=\"min-h-20 rounded-md border border-input bg-background px-3 py-2 text-sm\"\n\t\t\t\t\tvalue={reason}\n\t\t\t\t\tplaceholder={copy.reasonPlaceholder}\n\t\t\t\t\tonChange={(event) => setReason(event.target.value)}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t\t<div className=\"flex flex-wrap gap-2\">\n\t\t\t\t<Button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tdisabled={trimmed.length === 0}\n\t\t\t\t\tonClick={() => resolve(\"confirmed\")}\n\t\t\t\t>\n\t\t\t\t\t{copy.confirm}\n\t\t\t\t</Button>\n\t\t\t\t<Button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tvariant=\"outline\"\n\t\t\t\t\tdisabled={trimmed.length === 0}\n\t\t\t\t\tonClick={() => resolve(\"dismissed\")}\n\t\t\t\t>\n\t\t\t\t\t{copy.dismiss}\n\t\t\t\t</Button>\n\t\t\t</div>\n\t\t</article>\n\t);\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/contexts/index.ts","../src/components/patterns.tsx","../src/lib/utils.ts","../src/components/EmptyState.tsx","../src/ui/empty.tsx","../src/components/ConfirmDestructiveDialog.tsx","../src/components/NotificationBell.tsx","../src/components/editable/types.ts","../src/components/editable/useEditableSection.ts","../src/components/editable/EditableSection.tsx","../src/components/editable/DataList.tsx","../src/components/editable/FieldMessage.tsx","../src/components/media/SafeImage.tsx","../src/components/ThemeSwitcher.tsx","../src/components/LanguageSwitcher.tsx","../src/components/AvatarEditor.tsx","../src/components/AvatarEditorDialog.tsx","../src/components/upload/part-math.ts","../src/components/upload/types.ts","../src/components/upload/FileDropzone.tsx","../src/components/upload/FileUploadTray.tsx","../src/components/upload/FileUploadMenu.tsx","../src/components/upload/createMultipartUploadController.ts","../src/hooks/useMediaQuery.ts","../src/lib/avatar.ts","../src/components/metrics/StatHighlightCard.tsx","../src/components/metrics/MetricChartCard.tsx","../src/components/metrics/SparklineStat.tsx","../src/components/metrics/TimeRangePicker.tsx","../src/components/metrics/DimensionBreakdownTable.tsx","../src/components/metrics/CostBreakdownCard.tsx","../src/components/metrics/MetricEmptyState.tsx","../src/components/metrics/MetricSkeleton.tsx","../src/lib/cookie-consent.ts","../src/components/CookieConsentBanner.tsx","../src/lib/legal-accept-label.tsx","../src/components/LegalAcceptDialog.tsx","../src/components/LegalAcceptCheckbox.tsx","../src/components/LegalMarkdown.tsx","../src/theme-init.ts","../src/components/AuditTimeline.tsx","../src/components/RiskBadge.tsx","../src/components/EntityGraph.tsx","../src/components/MatchReview.tsx"],"names":["createContext","useContext","jsxs","jsx","Skeleton","_","twMerge","clsx","Loader2","AlertTriangle","Inbox","Empty","EmptyHeader","EmptyMedia","EmptyTitle","EmptyDescription","EmptyContent","cva","AlertDialog","AlertDialogContent","AlertDialogHeader","AlertDialogTitle","AlertDialogDescription","AlertDialogFooter","AlertDialogCancel","AlertDialogAction","DropdownMenu","DropdownMenuTrigger","Button","Bell","DropdownMenuContent","useState","useRef","useId","useEffect","useCallback","Fragment","useLayoutEffect","Monitor","Sun","Moon","useTheme","miniMenuContentDefaults","miniMenuContentClassName","DropdownMenuItem","sizeClasses","shapeClasses","iconTriggerClassName","Languages","Upload","Move","ZoomOut","Slider","ZoomIn","RotateCcw","RotateCw","Toggle","Grid3X3","RefreshCw","X","User","Pencil","AnimatePresence","motion","Check","DrawerClose","DialogClose","Drawer","DrawerContent","DrawerHeader","DrawerTitle","DrawerFooter","Dialog","DialogContent","DialogHeader","DialogTitle","DialogFooter","Pause","Play","useMediaQuery","DEFAULT_LABELS","BarChart3"],"mappings":";;;;;;;;;;;;;;;;;;;;AA2CO,IAAM,eAAA,GAAkBA,oBAA2C,IAAI;AAMvE,SAAS,kBAAA,GAAkD;AACjE,EAAA,OAAOC,iBAAW,eAAe,CAAA;AAClC;AC/CO,SAAS,SAAA,CAAU;AAAA,EACzB,KAAA;AAAA,EACA;AACD,CAAA,EAGG;AACF,EAAA,uBACCC,eAAA,CAAC,QAAA,EAAA,EAAO,SAAA,EAAU,qBAAA,EACjB,QAAA,EAAA;AAAA,oBAAAC,cAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,uCAAA,EAAyC,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,IAC5D,8BACAA,cAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,+BAAA,EAAiC,uBAAY,CAAA,GACvD;AAAA,GAAA,EACL,CAAA;AAEF;AAEO,SAAS,KAAA,CAAM;AAAA,EACrB,KAAA;AAAA,EACA;AACD,CAAA,EAGG;AACF,EAAA,uBACCD,eAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,6BAAA,EAChB,QAAA,EAAA;AAAA,oBAAAC,cAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,aAAA,EAAe,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,IACpC;AAAA,GAAA,EACF,CAAA;AAEF;AAEO,SAAS,YAAA,GAAe;AAC9B,EAAA,uBACCD,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qBAAA,EAAsB,eAAY,MAAA,EAChD,QAAA,EAAA;AAAA,oBAAAC,cAAA,CAACC,oBAAA,EAAA,EAAS,WAAU,UAAA,EAAW,CAAA;AAAA,oBAC/BD,cAAA,CAACC,oBAAA,EAAA,EAAS,SAAA,EAAU,aAAA,EAAc,CAAA;AAAA,oBAClCD,cAAA,CAACC,oBAAA,EAAA,EAAS,SAAA,EAAU,aAAA,EAAc,CAAA;AAAA,oBAClCD,cAAA,CAACC,oBAAA,EAAA,EAAS,SAAA,EAAU,aAAA,EAAc,CAAA;AAAA,oBAClCD,cAAA,CAACC,oBAAA,EAAA,EAAS,SAAA,EAAU,aAAA,EAAc;AAAA,GAAA,EACnC,CAAA;AAEF;AAEO,SAAS,aAAA,CAAc;AAAA,EAC7B,OAAA;AAAA,EACA,IAAA,GAAO;AACR,CAAA,EAGG;AACF,EAAA,sCACE,KAAA,EAAA,EAAI,WAAA,EAAU,MAAA,EAAO,SAAA,EAAU,uBAC9B,QAAA,EAAA,KAAA,CAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,MAAK,EAAG,CAAC,CAAA,EAAG,GAAA,oCAChC,KAAA,EAAA,EAAc,SAAA,EAAU,YAAA,EACvB,QAAA,EAAA,KAAA,CAAM,KAAK,EAAE,MAAA,EAAQ,OAAA,EAAQ,EAAG,CAACC,EAAAA,EAAG,MAAA,qBACpCF,cAAA,CAACC,oBAAA,EAAA,EAAsB,WAAU,YAAA,EAAA,EAAlB,MAA+B,CAC9C,CAAA,EAAA,EAHQ,GAIV,CACA,CAAA,EACF,CAAA;AAEF;AC/DO,SAAS,MAAM,MAAA,EAAsB;AAC3C,EAAA,OAAOE,qBAAA,CAAQC,SAAA,CAAK,MAAM,CAAC,CAAA;AAC5B;ACUO,SAAS,YAAA,CAAa;AAAA,EAC5B,KAAA,GAAQ,eAAA;AAAA,EACR;AACD,CAAA,EAGG;AACF,EAAA,uBACCL,eAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACA,IAAA,EAAK,QAAA;AAAA,MACL,WAAA,EAAU,QAAA;AAAA,MACV,SAAA,EAAW,EAAA;AAAA,QACV,4EAAA;AAAA,QACA;AAAA,OACD;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAC,cAAAA,CAACK,mBAAA,EAAA,EAAQ,SAAA,EAAU,qBAAA,EAAsB,eAAY,MAAA,EAAO,CAAA;AAAA,wBAC5DL,cAAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,KAAA,EAAM;AAAA;AAAA;AAAA,GACd;AAEF;AAEO,SAAS,UAAA,CAAW;AAAA,EAC1B,KAAA,GAAQ,sBAAA;AAAA,EACR,WAAA;AAAA,EACA,MAAA;AAAA,EACA;AACD,CAAA,EAKG;AACF,EAAA,uBACCD,eAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACA,IAAA,EAAK,OAAA;AAAA,MACL,SAAA,EAAW,EAAA;AAAA,QACV,2HAAA;AAAA,QACA;AAAA,OACD;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAC,cAAAA,CAACM,yBAAA,EAAA,EAAc,SAAA,EAAU,yBAAA,EAA0B,eAAY,MAAA,EAAO,CAAA;AAAA,wBACtEP,gBAAC,KAAA,EAAA,EACA,QAAA,EAAA;AAAA,0BAAAC,cAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,aAAA,EAAe,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,UACjC,8BACAA,cAAAA,CAAC,OAAE,SAAA,EAAU,oCAAA,EAAsC,uBAAY,CAAA,GAC5D;AAAA,SAAA,EACL,CAAA;AAAA,QACC;AAAA;AAAA;AAAA,GACF;AAEF;AAkBO,SAAS,UAAA,CAAW;AAAA,EAC1B,KAAA;AAAA,EACA,WAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAM,IAAA,GAAOO,iBAAA;AAAA,EACb,OAAA,GAAU,SAAA;AAAA,EACV;AACD,CAAA,EAAoB;AACnB,EAAA,MAAM,YAAY,OAAA,KAAY,SAAA;AAE9B,EAAA,uBACCR,eAAAA;AAAA,IAACS,cAAA;AAAA,IAAA;AAAA,MACA,SAAA,EAAW,EAAA;AAAA,QACV,OAAA;AAAA,QACA,YACG,kCAAA,GACA,sDAAA;AAAA,QACH;AAAA,OACD;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAT,eAAAA,CAACU,oBAAA,EAAA,EAAY,SAAA,EAAU,OAAA,EACtB,QAAA,EAAA;AAAA,0BAAAT,cAAAA;AAAA,YAACU,mBAAA;AAAA,YAAA;AAAA,cACA,OAAA,EAAQ,MAAA;AAAA,cACR,SAAA,EAAW,EAAA;AAAA,gBACV,2CAAA;AAAA,gBACA,YACG,mEAAA,GACA;AAAA,eACJ;AAAA,cAEA,QAAA,kBAAAV,cAAAA,CAAC,IAAA,EAAA,EAAK,aAAA,EAAY,MAAA,EAAO;AAAA;AAAA,WAC1B;AAAA,0BACAA,cAAAA;AAAA,YAACW,mBAAA;AAAA,YAAA;AAAA,cACA,SAAA,EAAW,EAAA;AAAA,gBACV,6BAAA;AAAA,gBACA,YAAY,SAAA,GAAY;AAAA,eACzB;AAAA,cAEC,QAAA,EAAA;AAAA;AAAA,WACF;AAAA,UACC,8BACAX,cAAAA,CAACY,6BAAiB,SAAA,EAAU,MAAA,EAAQ,uBAAY,CAAA,GAC7C;AAAA,SAAA,EACL,CAAA;AAAA,QACC,yBAASZ,cAAAA,CAACa,yBAAa,SAAA,EAAU,OAAA,EAAS,kBAAO,CAAA,GAAkB;AAAA;AAAA;AAAA,GACrE;AAEF;AC5HA,SAASL,MAAAA,CAAM,EAAE,SAAA,EAAW,GAAG,OAAM,EAAgC;AACpE,EAAA,uBACCR,cAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACA,WAAA,EAAU,OAAA;AAAA,MACV,SAAA,EAAW,EAAA;AAAA,QACV,gHAAA;AAAA,QACA;AAAA,OACD;AAAA,MACC,GAAG;AAAA;AAAA,GACL;AAEF;AAEA,SAASS,YAAAA,CAAY,EAAE,SAAA,EAAW,GAAG,OAAM,EAAgC;AAC1E,EAAA,uBACCT,cAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACA,WAAA,EAAU,cAAA;AAAA,MACV,SAAA,EAAW,EAAA;AAAA,QACV,uDAAA;AAAA,QACA;AAAA,OACD;AAAA,MACC,GAAG;AAAA;AAAA,GACL;AAEF;AAEA,IAAM,kBAAA,GAAqBc,0BAAA;AAAA,EAC1B,6FAAA;AAAA,EACA;AAAA,IACC,QAAA,EAAU;AAAA,MACT,OAAA,EAAS;AAAA,QACR,OAAA,EAAS,gBAAA;AAAA,QACT,IAAA,EAAM;AAAA;AACP,KACD;AAAA,IACA,eAAA,EAAiB;AAAA,MAChB,OAAA,EAAS;AAAA;AACV;AAEF,CAAA;AAEA,SAASJ,WAAAA,CAAW;AAAA,EACnB,SAAA;AAAA,EACA,OAAA,GAAU,SAAA;AAAA,EACV,GAAG;AACJ,CAAA,EAA0E;AACzE,EAAA,uBACCV,cAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACA,WAAA,EAAU,YAAA;AAAA,MACV,cAAA,EAAc,OAAA;AAAA,MACd,WAAW,EAAA,CAAG,kBAAA,CAAmB,EAAE,OAAA,EAAS,SAAA,EAAW,CAAC,CAAA;AAAA,MACvD,GAAG;AAAA;AAAA,GACL;AAEF;AAEA,SAASW,WAAAA,CAAW,EAAE,SAAA,EAAW,GAAG,OAAM,EAAgC;AACzE,EAAA,uBACCX,cAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACA,WAAA,EAAU,aAAA;AAAA,MACV,SAAA,EAAW,EAAA,CAAG,oCAAA,EAAsC,SAAS,CAAA;AAAA,MAC5D,GAAG;AAAA;AAAA,GACL;AAEF;AAEA,SAASY,iBAAAA,CAAiB,EAAE,SAAA,EAAW,GAAG,OAAM,EAA8B;AAC7E,EAAA,uBACCZ,cAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACA,WAAA,EAAU,mBAAA;AAAA,MACV,SAAA,EAAW,EAAA;AAAA,QACV,yGAAA;AAAA,QACA;AAAA,OACD;AAAA,MACC,GAAG;AAAA;AAAA,GACL;AAEF;AAEA,SAASa,aAAAA,CAAa,EAAE,SAAA,EAAW,GAAG,OAAM,EAAgC;AAC3E,EAAA,uBACCb,cAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACA,WAAA,EAAU,eAAA;AAAA,MACV,SAAA,EAAW,EAAA;AAAA,QACV,+EAAA;AAAA,QACA;AAAA,OACD;AAAA,MACC,GAAG;AAAA;AAAA,GACL;AAEF;ACtEO,SAAS,wBAAA,CAAyB;AAAA,EACxC,IAAA;AAAA,EACA,YAAA;AAAA,EACA,KAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAA,GAAe,QAAA;AAAA,EACf,WAAA,GAAc,QAAA;AAAA,EACd;AACD,CAAA,EAAkC;AACjC,EAAA,uBACCA,eAACe,0BAAA,EAAA,EAAY,IAAA,EAAY,cACxB,QAAA,kBAAAhB,eAAAA,CAACiB,iCAAA,EAAA,EAAmB,IAAA,EAAK,IAAA,EACxB,QAAA,EAAA;AAAA,oBAAAjB,gBAACkB,gCAAA,EAAA,EACA,QAAA,EAAA;AAAA,sBAAAjB,cAAAA,CAACkB,mCAAkB,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,sBACzBlB,cAAAA,CAACmB,qCAAA,EAAA,EAAwB,QAAA,EAAA,WAAA,EAAY;AAAA,KAAA,EACtC,CAAA;AAAA,oBACApB,gBAACqB,gCAAA,EAAA,EACA,QAAA,EAAA;AAAA,sBAAApB,cAAAA,CAACqB,oCAAmB,QAAA,EAAA,WAAA,EAAY,CAAA;AAAA,sBAChCrB,cAAAA;AAAA,QAACsB,gCAAA;AAAA,QAAA;AAAA,UACA,OAAA,EAAQ,aAAA;AAAA,UACR,SAAS,MAAM;AACd,YAAA,SAAA,EAAU;AACV,YAAA,YAAA,CAAa,KAAK,CAAA;AAAA,UACnB,CAAA;AAAA,UAEC,QAAA,EAAA;AAAA;AAAA;AACF,KAAA,EACD;AAAA,GAAA,EACD,CAAA,EACD,CAAA;AAEF;AC/BO,IAAM,gCAAA,GAA2D;AAAA,EACvE,KAAA,EAAO,eAAA;AAAA,EACP,KAAA,EAAO,uBAAA;AAAA,EACP,OAAA,EAAS;AACV;AAcA,SAAS,kBAAkB,KAAA,EAAuB;AACjD,EAAA,OAAO,KAAA,GAAQ,CAAA,GAAI,IAAA,GAAO,MAAA,CAAO,KAAK,CAAA;AACvC;AAEA,SAAS,kBAAkB,GAAA,EAAqB;AAC/C,EAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,GAAG,CAAA;AACzB,EAAA,IAAI,OAAO,KAAA,CAAM,IAAA,CAAK,OAAA,EAAS,GAAG,OAAO,GAAA;AACzC,EAAA,OAAO,IAAA,CAAK,eAAe,MAAA,EAAW;AAAA,IACrC,SAAA,EAAW,OAAA;AAAA,IACX,SAAA,EAAW;AAAA,GACX,CAAA;AACF;AAEA,SAAS,wBAAA,CAAyB,EAAE,IAAA,GAAO,CAAA,EAAE,EAAsB;AAClE,EAAA,uBACCtB,cAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,eAAA,EAAgB,aAAA,EAAY,QACzC,QAAA,EAAA,KAAA,CAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,MAAK,EAAG,CAAC,GAAG,KAAA,qBACjCD,gBAAC,KAAA,EAAA,EACA,QAAA,EAAA;AAAA,oBAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qBAAA,EACd,QAAA,EAAA;AAAA,sBAAAC,cAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACA,WAAA,EAAU,UAAA;AAAA,UACV,SAAA,EAAU;AAAA;AAAA,OACX;AAAA,sBACAA,cAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACA,WAAA,EAAU,UAAA;AAAA,UACV,SAAA,EAAU;AAAA;AAAA,OACX;AAAA,sBACAA,cAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACA,WAAA,EAAU,UAAA;AAAA,UACV,SAAA,EAAU;AAAA;AAAA;AACX,KAAA,EACD,CAAA;AAAA,IACC,KAAA,GAAQ,OAAO,CAAA,mBAAIA,eAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kBAAiB,CAAA,GAAK;AAAA,GAAA,EAAA,EAfhD,KAgBV,CACA,CAAA,EACF,CAAA;AAEF;AAEO,SAAS,gBAAA,CAAiB;AAAA,EAChC,KAAA;AAAA,EACA,WAAA;AAAA,EACA,SAAA,GAAY,KAAA;AAAA,EACZ,MAAA,EAAQ,cAAA;AAAA,EACR,WAAA;AAAA,EACA,UAAA,GAAa,iBAAA;AAAA,EACb,YAAA;AAAA,EACA,KAAA,GAAQ,KAAA;AAAA,EACR;AACD,CAAA,EAA0B;AACzB,EAAA,MAAM,MAAA,GAAS,EAAE,GAAG,gCAAA,EAAkC,GAAG,cAAA,EAAe;AAExE,EAAA,uBACCD,eAAAA;AAAA,IAACwB,4BAAA;AAAA,IAAA;AAAA,MACA,YAAA,EAAc,CAAC,IAAA,KAAS;AACvB,QAAA,YAAA,GAAe,IAAI,CAAA;AAAA,MACpB,CAAA;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAxB,eAAAA;AAAA,UAACyB,mCAAA;AAAA,UAAA;AAAA,YACA,wBACCxB,cAAAA;AAAA,cAACyB,gBAAA;AAAA,cAAA;AAAA,gBACA,IAAA,EAAK,QAAA;AAAA,gBACL,OAAA,EAAQ,OAAA;AAAA,gBACR,IAAA,EAAK,MAAA;AAAA,gBACL,SAAA,EAAW,EAAA,CAAG,iBAAA,EAAmB,SAAS,CAAA;AAAA,gBAC1C,cAAY,MAAA,CAAO;AAAA;AAAA,aACpB;AAAA,YAGD,QAAA,EAAA;AAAA,8BAAAzB,cAAAA,CAAC0B,gBAAA,EAAA,EAAK,SAAA,EAAU,QAAA,EAAS,CAAA;AAAA,cACxB,WAAA,GAAc,CAAA,mBACd1B,cAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,gLAAA,EACd,QAAA,EAAA,iBAAA,CAAkB,WAAW,CAAA,EAC/B,CAAA,GACG;AAAA;AAAA;AAAA,SACL;AAAA,wBACAD,eAAAA,CAAC4B,mCAAA,EAAA,EAAoB,KAAA,EAAc,WAAU,UAAA,EAC5C,QAAA,EAAA;AAAA,0BAAA3B,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sDAAA,EACd,QAAA,kBAAAA,cAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,eAAA,EAAiB,QAAA,EAAA,MAAA,CAAO,KAAA,EAAM,CAAA,EAC7C,CAAA;AAAA,0BACAA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0BAAA,EACb,QAAA,EAAA,SAAA,mBACAA,cAAAA,CAAC,wBAAA,EAAA,EAAyB,CAAA,GACvB,KAAA,CAAM,MAAA,KAAW,oBACpBA,cAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,qDAAA,EACX,QAAA,EAAA,MAAA,CAAO,KAAA,EACT,CAAA,mBAEAA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,eAAA,EACb,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,MAAM,KAAA,KAAU;AAC3B,YAAA,MAAM,IAAA,mBACLD,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,kBAAA,EACd,QAAA,EAAA;AAAA,8BAAAC,cAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,kCAAA,EACX,eAAK,KAAA,EACP,CAAA;AAAA,8BACAA,cAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,4CAAA,EACX,eAAK,OAAA,EACP,CAAA;AAAA,8BACAA,eAAC,GAAA,EAAA,EAAE,SAAA,EAAU,oCACX,QAAA,EAAA,UAAA,CAAW,IAAA,CAAK,SAAS,CAAA,EAC3B;AAAA,aAAA,EACD,CAAA;AAED,YAAA,uBACCD,gBAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,cAAA,IAAA,CAAK,uBACLC,cAAAA;AAAA,gBAAC,GAAA;AAAA,gBAAA;AAAA,kBACA,MAAM,IAAA,CAAK,IAAA;AAAA,kBACX,SAAA,EAAW,EAAA;AAAA,oBACV,sEAAA;AAAA,oBACA,CAAC,KAAK,IAAA,IAAQ;AAAA,mBACf;AAAA,kBAEC,QAAA,EAAA;AAAA;AAAA,kCAGFA,cAAAA;AAAA,gBAAC,KAAA;AAAA,gBAAA;AAAA,kBACA,SAAA,EAAW,EAAA;AAAA,oBACV,sBAAA;AAAA,oBACA,CAAC,KAAK,IAAA,IAAQ;AAAA,mBACf;AAAA,kBAEC,QAAA,EAAA;AAAA;AAAA,eACF;AAAA,cAEA,KAAA,GAAQ,MAAM,MAAA,GAAS,CAAA,mBACvBA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EAAiB,CAAA,GAC7B;AAAA,aAAA,EAAA,EAvBK,KAAK,EAwBf,CAAA;AAAA,UAEF,CAAC,GACF,CAAA,EAEF,CAAA;AAAA,0BACAA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sBACd,QAAA,kBAAAA,cAAAA;AAAA,YAAC,GAAA;AAAA,YAAA;AAAA,cACA,IAAA,EAAM,WAAA;AAAA,cACN,SAAA,EAAU,oEAAA;AAAA,cAET,QAAA,EAAA,MAAA,CAAO;AAAA;AAAA,WACT,EACD;AAAA,SAAA,EACD;AAAA;AAAA;AAAA,GACD;AAEF;;;ACrKO,IAAM,+BAAA,GAAkC;AAAA,EAC9C,IAAA,EAAM,MAAA;AAAA,EACN,IAAA,EAAM,MAAA;AAAA,EACN,MAAA,EAAQ,cAAA;AAAA,EACR,MAAA,EAAQ,QAAA;AAAA,EACR,KAAA,EAAO,OAAA;AAAA,EACP,YAAA,EAAc,kBAAA;AAAA,EACd,kBAAA,EAAoB,iDAAA;AAAA,EACpB,cAAA,EAAgB,SAAA;AAAA,EAChB,aAAA,EAAe;AAChB;;;ACuDA,SAAS,gBAAgB,SAAA,EAA+B;AACvD,EAAA,IAAI,CAAC,SAAA,EAAW;AAChB,EAAA,MAAM,SAAS,SAAA,CAAU,aAAA;AAAA,IACxB;AAAA,GACD;AACA,EAAA,MAAA,EAAQ,KAAA,EAAM;AACf;AAEO,SAAS,kBAAA,CAAmB;AAAA,EAClC,MAAA;AAAA,EACA,SAAA;AAAA,EACA,OAAA,GAAU,KAAA;AAAA,EACV,UAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA;AAAA,EACA,YAAA,GAAe;AAChB,CAAA,EAAwD;AACvD,EAAA,MAAM,cAAA,GAAiB;AAAA,IACtB,GAAG,+BAAA;AAAA,IACH,GAAG;AAAA,GACJ;AACA,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAI4B,eAA8B,SAAS,CAAA;AAC/D,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,eAAwB,IAAI,CAAA;AACxD,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,eAAS,KAAK,CAAA;AACpD,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,eAA6B,MAAS,CAAA;AAE5E,EAAA,MAAM,UAAA,GAAaC,aAA2B,IAAI,CAAA;AAClD,EAAA,MAAM,aAAA,GAAgBA,aAAiC,IAAI,CAAA;AAC3D,EAAA,MAAM,iBAAA,GAAoBA,aAAO,CAAC,CAAA;AAClC,EAAA,MAAM,kBAAA,GAAqBA,aAAO,KAAK,CAAA;AACvC,EAAA,MAAM,wBAAA,GAA2BA,aAAO,KAAK,CAAA;AAC7C,EAAA,MAAM,eAAeC,WAAA,EAAM;AAC3B,EAAA,MAAM,gBAAgBA,WAAA,EAAM;AAC5B,EAAA,MAAM,SAAA,GAAY,IAAA,KAAS,SAAA,IAAa,IAAA,KAAS,QAAA;AACjD,EAAA,MAAM,WAAW,IAAA,KAAS,QAAA;AAE1B,EAAAC,eAAA,CAAU,MAAM;AACf,IAAA,IAAI,IAAA,KAAS,SAAA,IAAa,kBAAA,CAAmB,OAAA,EAAS;AACrD,MAAA,kBAAA,CAAmB,OAAA,GAAU,KAAA;AAC7B,MAAA,aAAA,CAAc,SAAS,KAAA,EAAM;AAC7B,MAAA;AAAA,IACD;AACA,IAAA,IAAI,IAAA,KAAS,SAAA,IAAa,wBAAA,CAAyB,OAAA,EAAS;AAC3D,MAAA,wBAAA,CAAyB,OAAA,GAAU,KAAA;AACnC,MAAA,MAAM,OAAA,GAAU,WAAW,OAAA,EAAS,aAAA;AAAA,QACnC;AAAA,OACD;AACA,MAAA,IAAI,OAAA,EAAS;AACZ,QAAA,OAAA,CAAQ,KAAA,EAAM;AACd,QAAA;AAAA,MACD;AACA,MAAA,eAAA,CAAgB,WAAW,OAAO,CAAA;AAAA,IACnC;AAAA,EACD,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AAET,EAAA,MAAM,aAAA,GAAgBC,kBAAY,MAAM;AACvC,IAAA,cAAA,CAAe,KAAK,CAAA;AACpB,IAAA,kBAAA,CAAmB,OAAA,GAAU,IAAA;AAC7B,IAAA,OAAA,CAAQ,SAAS,CAAA;AACjB,IAAA,SAAA,IAAY;AAAA,EACb,CAAA,EAAG,CAAC,SAAS,CAAC,CAAA;AAEd,EAAA,MAAM,SAAA,GAAYA,kBAAY,MAAM;AACnC,IAAA,SAAA,CAAU,IAAI,CAAA;AACd,IAAA,wBAAA,CAAyB,OAAA,GAAU,IAAA;AACnC,IAAA,OAAA,CAAQ,SAAS,CAAA;AAAA,EAClB,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,aAAA,GAAgBA,kBAAY,MAAM;AACvC,IAAA,IAAI,QAAA,EAAU;AACd,IAAA,IAAI,OAAA,EAAS;AACZ,MAAA,cAAA,CAAe,IAAI,CAAA;AACnB,MAAA;AAAA,IACD;AACA,IAAA,aAAA,EAAc;AAAA,EACf,CAAA,EAAG,CAAC,aAAA,EAAe,OAAA,EAAS,QAAQ,CAAC,CAAA;AAErC,EAAA,MAAM,YAAA,GAAeA,iBAAA;AAAA,IACpB,CAAC,KAAA,KAAsC;AACtC,MAAA,KAAA,CAAM,cAAA,EAAe;AACrB,MAAA,IAAI,QAAA,EAAU;AAEd,MAAA,KAAA,CAAM,YAAY;AACjB,QAAA,OAAA,CAAQ,QAAQ,CAAA;AAChB,QAAA,SAAA,CAAU,IAAI,CAAA;AACd,QAAA,IAAI;AACH,UAAA,MAAM,MAAA,EAAO;AACb,UAAA,SAAA,CAAU,eAAe,KAAK,CAAA;AAC9B,UAAA,kBAAA,CAAmB,OAAA,GAAU,IAAA;AAC7B,UAAA,OAAA,CAAQ,SAAS,CAAA;AAAA,QAClB,CAAA,CAAA,MAAQ;AACP,UAAA,wBAAA,CAAyB,OAAA,GAAU,IAAA;AACnC,UAAA,OAAA,CAAQ,SAAS,CAAA;AAAA,QAClB;AAAA,MACD,CAAA,GAAG;AAAA,IACJ,CAAA;AAAA,IACA,CAAC,QAAA,EAAU,MAAA,EAAQ,cAAA,CAAe,KAAK;AAAA,GACxC;AAEA,EAAA,MAAM,iBAAA,GAAoBA,iBAAA;AAAA,IACzB,CAAC,KAAA,KAA0C;AAC1C,MAAA,IAAI,KAAA,CAAM,QAAQ,QAAA,EAAU;AAC5B,MAAA,KAAA,CAAM,cAAA,EAAe;AACrB,MAAA,aAAA,EAAc;AAAA,IACf,CAAA;AAAA,IACA,CAAC,aAAa;AAAA,GACf;AAEA,EAAAD,eAAA,CAAU,MAAM;AACf,IAAA,IAAI,CAAC,YAAA,IAAgB,CAAC,SAAA,EAAW;AACjC,IAAA,MAAM,KAAK,UAAA,CAAW,OAAA;AACtB,IAAA,IAAI,CAAC,EAAA,EAAI;AAET,IAAA,MAAM,UAAU,MAAM;AACrB,MAAA,MAAM,MAAA,GAAS,EAAA,CAAG,qBAAA,EAAsB,CAAE,MAAA;AAC1C,MAAA,IAAI,MAAA,GAAS,kBAAkB,OAAA,EAAS;AACvC,QAAA,iBAAA,CAAkB,OAAA,GAAU,MAAA;AAC5B,QAAA,cAAA,CAAe,MAAM,CAAA;AAAA,MACtB;AAAA,IACD,CAAA;AAEA,IAAA,OAAA,EAAQ;AACR,IAAA,MAAM,QAAA,GAAW,IAAI,cAAA,CAAe,OAAO,CAAA;AAC3C,IAAA,QAAA,CAAS,QAAQ,EAAE,CAAA;AACnB,IAAA,OAAO,MAAM,SAAS,UAAA,EAAW;AAAA,EAClC,CAAA,EAAG,CAAC,SAAA,EAAW,YAAY,CAAC,CAAA;AAE5B,EAAA,MAAM,mBAAA,GACL,UAAA,IAAc,IAAA,GACX,EAAE,iBAAA,EAAmB,CAAA,EAAG,UAAU,CAAA,CAAA,EAAI,YAAY,CAAA,CAAA,EAAY,GAC9D,KAAA,IAAS,IAAA,IAAQ,KAAA,CAAM,MAAA,GAAS,CAAA,GAC/B,EAAE,YAAA,EAAc,CAAA,EAAG,cAAA,CAAe,IAAI,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,EAAY,GAC3D,EAAE,YAAA,EAAc,cAAA,CAAe,IAAA,EAAK;AAEzC,EAAA,OAAO;AAAA,IACN,IAAA;AAAA,IACA,SAAA;AAAA,IACA,QAAA;AAAA,IACA,SAAA;AAAA,IACA,aAAA;AAAA,IACA,SAAA,EAAW;AAAA,MACV,QAAA,EAAU,YAAA;AAAA,MACV,SAAA,EAAW,iBAAA;AAAA,MACX,UAAA,EAAY;AAAA,KACb;AAAA,IACA,UAAA;AAAA,IACA,aAAA;AAAA,IACA,aAAA;AAAA,IACA,eAAA,EAAiB;AAAA,MAChB,IAAA,EAAM,QAAA;AAAA,MACN,EAAA,EAAI,YAAA;AAAA,MACJ,OAAA,EAAS,SAAA;AAAA,MACT,GAAA,EAAK,aAAA;AAAA,MACL,GAAG;AAAA,KACJ;AAAA,IACA,eAAA,EAAiB;AAAA,MAChB,IAAA,EAAM,QAAA;AAAA,MACN,QAAA,EAAU;AAAA,KACX;AAAA,IACA,iBAAA,EAAmB;AAAA,MAClB,IAAA,EAAM,QAAA;AAAA,MACN,OAAA,EAAS,aAAA;AAAA,MACT,QAAA,EAAU;AAAA,KACX;AAAA,IACA,MAAA;AAAA,IACA,WAAA,EAAa;AAAA,MACZ,IAAA,EAAM,QAAA;AAAA,MACN,WAAA,EAAa,QAAA;AAAA,MACb,SAAA,EAAW;AAAA,KACZ;AAAA,IACA,cAAA,EAAgB;AAAA,MACf,IAAA,EAAM,WAAA;AAAA,MACN,YAAA,EAAc,cAAA;AAAA,MACd,OAAO,cAAA,CAAe,YAAA;AAAA,MACtB,aAAa,cAAA,CAAe,kBAAA;AAAA,MAC5B,cAAc,cAAA,CAAe,cAAA;AAAA,MAC7B,aAAa,cAAA,CAAe,aAAA;AAAA,MAC5B,SAAA,EAAW;AAAA,KACZ;AAAA,IACA,cAAA;AAAA,IACA,cACC,YAAA,IAAgB,WAAA,IAAe,OAC5B,EAAE,SAAA,EAAW,aAAY,GACzB,MAAA;AAAA,IACJ,gBAAA,EACC;AAAA,GACF;AACD;AC5OO,SAAS,eAAA,CAAgB;AAAA,EAC/B,QAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,GAAG;AACJ,CAAA,EAAyB;AACxB,EAAA,MAAM,OAAA,GAAU,mBAAmB,OAAO,CAAA;AAC1C,EAAA,MAAM;AAAA,IACL,SAAA;AAAA,IACA,QAAA;AAAA,IACA,SAAA;AAAA,IACA,UAAA;AAAA,IACA,aAAA;AAAA,IACA,eAAA;AAAA,IACA,eAAA;AAAA,IACA,iBAAA;AAAA,IACA,MAAA;AAAA,IACA,WAAA;AAAA,IACA,cAAA;AAAA,IACA,cAAA;AAAA,IACA,YAAA;AAAA,IACA,gBAAA;AAAA,IACA;AAAA,GACD,GAAI,OAAA;AAEJ,EAAA,MAAM,gBAAgB,CAAC,SAAA,mBACtB/B,cAAAA,CAACyB,gBAAAA,EAAA,EAAO,OAAA,EAAQ,SAAA,EAAU,IAAA,EAAK,IAAA,EAAM,GAAG,eAAA,EACtC,QAAA,EAAA,cAAA,CAAe,MACjB,CAAA,mBAEA1B,gBAAAkC,mBAAA,EAAA,EACC,QAAA,EAAA;AAAA,oBAAAjC,cAAAA,CAACyB,gBAAAA,EAAA,EAAO,OAAA,EAAQ,SAAA,EAAU,MAAK,IAAA,EAAM,GAAG,iBAAA,EACtC,QAAA,EAAA,cAAA,CAAe,MAAA,EACjB,CAAA;AAAA,oBACAzB,cAAAA;AAAA,MAACyB,gBAAAA;AAAA,MAAA;AAAA,QACA,IAAA,EAAK,IAAA;AAAA,QACL,IAAA,EAAK,QAAA;AAAA,QACL,IAAA,EAAM,aAAA;AAAA,QACN,UAAU,eAAA,CAAgB,QAAA;AAAA,QAEzB,QAAA,EAAA,QAAA,GAAW,cAAA,CAAe,MAAA,GAAS,cAAA,CAAe;AAAA;AAAA;AACpD,GAAA,EACD,CAAA;AAGD,EAAA,MAAM,OAAA,mBACLzB,cAAAA,CAAC,KAAA,EAAA,EAAI,aAAU,0BAAA,EAA2B,SAAA,EAAW,kBACnD,QAAA,EAAA,aAAA,EACF,CAAA;AAGD,EAAA,MAAM,OAAA,GAAU,4BACfA,cAAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACA,EAAA,EAAI,aAAA;AAAA,MACJ,GAAA,EAAK,UAAA;AAAA,MACL,WAAA,EAAU,0BAAA;AAAA,MACV,SAAA,EAAW,GAAG,0CAA0C,CAAA;AAAA,MACxD,KAAA,EAAO,YAAA;AAAA,MACN,GAAG,SAAA;AAAA,MAEH,QAAA,EAAA,QAAA;AAAS;AAAA,sBAGXA,cAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACA,GAAA,EAAK,UAAA;AAAA,MACL,WAAA,EAAU,0BAAA;AAAA,MACV,SAAA,EAAU,gCAAA;AAAA,MACV,KAAA,EAAO,YAAA;AAAA,MAEN,QAAA,EAAA,QAAA;AAAS;AAAA,GACX;AAGD,EAAA,MAAM,UAAA,mBACLA,cAAAA,CAAC,MAAA,EAAA,EAAM,GAAG,WAAA,EAAa,WAAA,EAAU,2BAC/B,QAAA,EAAA,MAAA,EACF,CAAA;AAGD,EAAA,MAAM,yBACLA,cAAAA;AAAA,IAAC,wBAAA;AAAA,IAAA;AAAA,MACA,MAAM,cAAA,CAAe,IAAA;AAAA,MACrB,cAAc,cAAA,CAAe,YAAA;AAAA,MAC7B,OAAO,cAAA,CAAe,KAAA;AAAA,MACtB,aAAa,cAAA,CAAe,WAAA;AAAA,MAC5B,cAAc,cAAA,CAAe,YAAA;AAAA,MAC7B,aAAa,cAAA,CAAe,WAAA;AAAA,MAC5B,WAAW,cAAA,CAAe;AAAA;AAAA,GAC3B;AAGD,EAAA,IAAI,QAAA,EAAU;AACb,IAAA,uBACCD,gBAAAkC,mBAAA,EAAA,EACE,QAAA,EAAA;AAAA,MAAA,QAAA,CAAS;AAAA,QACT,OAAA;AAAA,QACA,OAAA;AAAA,QACA,MAAA,EAAQ,UAAA;AAAA,QACR,IAAA;AAAA,QACA,QAAA;AAAA,QACA;AAAA,OACA,CAAA;AAAA,MACA;AAAA,KAAA,EACF,CAAA;AAAA,EAEF;AAEA,EAAA,uBACClC,gBAAC,KAAA,EAAA,EAAI,WAAA,EAAU,oBAAmB,SAAA,EAAW,EAAA,CAAG,WAAA,EAAa,SAAS,CAAA,EACpE,QAAA,EAAA;AAAA,IAAA,OAAA;AAAA,IACA,OAAA;AAAA,IACA,UAAA;AAAA,IACA;AAAA,GAAA,EACF,CAAA;AAEF;AChJO,SAAS,QAAA,CAAS,EAAE,SAAA,EAAW,GAAG,OAAM,EAAkB;AAChE,EAAA,uBACCC,cAAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACA,WAAA,EAAU,WAAA;AAAA,MACV,SAAA,EAAW,EAAA,CAAG,2BAAA,EAA6B,SAAS,CAAA;AAAA,MACnD,GAAG;AAAA;AAAA,GACL;AAEF;AAYO,SAAS,YAAA,CAAa;AAAA,EAC5B,KAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA,GAAQ,QAAA;AAAA,EACR,SAAA;AAAA,EACA,cAAA;AAAA,EACA;AACD,CAAA,EAAsB;AACrB,EAAA,MAAM,OAAA,GACL,QAAA,IAAY,IAAA,IACZ,QAAA,KAAa,KAAA,IACZ,OAAO,QAAA,KAAa,QAAA,IAAY,QAAA,CAAS,IAAA,EAAK,CAAE,MAAA,KAAW,CAAA;AAE7D,EAAA,uBACCD,eAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACA,WAAA,EAAU,gBAAA;AAAA,MACV,SAAA,EAAW,EAAA,CAAG,uBAAA,EAAyB,SAAS,CAAA;AAAA,MAEhD,QAAA,EAAA;AAAA,wBAAAC,cAAAA;AAAA,UAAC,IAAA;AAAA,UAAA;AAAA,YACA,SAAA,EAAW,EAAA;AAAA,cACV,4FAAA;AAAA,cACA;AAAA,aACD;AAAA,YAEC,QAAA,EAAA;AAAA;AAAA,SACF;AAAA,wBACAA,cAAAA;AAAA,UAAC,IAAA;AAAA,UAAA;AAAA,YACA,SAAA,EAAW,EAAA;AAAA,cACV,yBAAA;AAAA,cACA,OAAA,IAAW,uBAAA;AAAA,cACX;AAAA,aACD;AAAA,YAEC,oBAAU,KAAA,GAAQ;AAAA;AAAA;AACpB;AAAA;AAAA,GACD;AAEF;AClDO,SAAS,YAAA,CAAa;AAAA,EAC5B,EAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,GAAG;AACJ,CAAA,EAAsB;AACrB,EAAA,MAAM,UAAA,GACL,QAAA,IAAY,IAAA,IACZ,QAAA,KAAa,KAAA,IACb,EAAE,OAAO,QAAA,KAAa,QAAA,IAAY,QAAA,CAAS,IAAA,EAAK,CAAE,MAAA,KAAW,CAAA,CAAA;AAE9D,EAAA,uBACCA,cAAAA;AAAA,IAAC,GAAA;AAAA,IAAA;AAAA,MACA,EAAA;AAAA,MACA,IAAA,EAAM,aAAa,OAAA,GAAU,MAAA;AAAA,MAC7B,WAAA,EAAU,eAAA;AAAA,MACV,SAAA,EAAW,EAAA,CAAG,kCAAA,EAAoC,SAAS,CAAA;AAAA,MAC1D,GAAG,KAAA;AAAA,MAEH,uBAAa,QAAA,GAAW;AAAA;AAAA,GAC1B;AAEF;ACrBA,SAAS,cAAc,GAAA,EAAgC;AAGtD,EAAA,OAAO,GAAA,CAAI,QAAA,IAAY,GAAA,CAAI,YAAA,KAAiB,CAAA;AAC7C;AAMO,SAAS,SAAA,CAAU;AAAA,EACzB,GAAA;AAAA,EACA,QAAA;AAAA,EACA,GAAA,GAAM,EAAA;AAAA,EACN,OAAA;AAAA,EACA,GAAG;AACJ,CAAA,EAAmB;AAClB,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAI4B,eAAS,KAAK,CAAA;AAC1C,EAAA,MAAM,MAAA,GAASC,aAAgC,IAAI,CAAA;AACnD,EAAA,MAAM,cAAc,OAAO,GAAA,KAAQ,YAAY,GAAA,CAAI,MAAA,GAAS,IAAI,GAAA,GAAM,IAAA;AAEtE,EAAAK,qBAAA,CAAgB,MAAM;AACrB,IAAA,SAAA,CAAU,KAAK,CAAA;AAAA,EAChB,CAAA,EAAG,CAAC,WAAW,CAAC,CAAA;AAEhB,EAAAA,qBAAA,CAAgB,MAAM;AACrB,IAAA,MAAM,MAAM,MAAA,CAAO,OAAA;AACnB,IAAA,IAAI,GAAA,IAAO,aAAA,CAAc,GAAG,CAAA,EAAG;AAC9B,MAAA,SAAA,CAAU,IAAI,CAAA;AAAA,IACf;AAAA,EACD,CAAA,EAAG,CAAC,WAAA,EAAa,MAAM,CAAC,CAAA;AAExB,EAAA,IAAI,CAAC,eAAe,MAAA,EAAQ;AAC3B,IAAA,uBAAOlC,cAAAA,CAAAiC,mBAAAA,EAAA,EAAG,QAAA,EAAA,QAAA,EAAS,CAAA;AAAA,EACpB;AAEA,EAAA,uBACCjC,cAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAG,QAAA;AAAA,MACJ,GAAA,EAAK,MAAA;AAAA,MACL,GAAA,EAAK,WAAA;AAAA,MACL,GAAA;AAAA,MACA,OAAA,EAAS,CAAC,KAAA,KAAU;AACnB,QAAA,SAAA,CAAU,IAAI,CAAA;AACd,QAAA,OAAA,GAAU,KAAK,CAAA;AAAA,MAChB;AAAA;AAAA,GACD;AAEF;ACxCA,IAAM,aAAA,GAA+C;AAAA,EACpD,KAAA,EAAO,OAAA;AAAA,EACP,MAAA,EAAQ,QAAA;AAAA,EACR,KAAA,EAAO,OAAA;AAAA,EACP,IAAA,EAAM;AACP,CAAA;AA2BA,IAAM,WAAA,GAAc;AAAA,EACnB,EAAA,EAAI,EAAE,MAAA,EAAQ,QAAA,EAAU,MAAM,QAAA,EAAS;AAAA,EACvC,EAAA,EAAI,EAAE,MAAA,EAAQ,QAAA,EAAU,MAAM,QAAA,EAAS;AAAA,EACvC,EAAA,EAAI,EAAE,MAAA,EAAQ,QAAA,EAAU,MAAM,QAAA;AAC/B,CAAA;AAEA,IAAM,YAAA,GAAe;AAAA,EACpB,OAAA,EAAS,YAAA;AAAA,EACT,IAAA,EAAM;AACP,CAAA;AAGA,IAAM,oBAAA,GACL,uMAAA;AAED,IAAM,UAAA,GAAa;AAAA,EAClB,MAAA,EAAQmC,mBAAA;AAAA,EACR,KAAA,EAAOC,eAAA;AAAA,EACP,IAAA,EAAMC;AACP,CAAA;AAEA,IAAM,MAAA,GAAS;AAAA,EACd,EAAE,GAAA,EAAK,QAAA,EAAmB,IAAA,EAAM,WAAW,MAAA,EAAO;AAAA,EAClD,EAAE,GAAA,EAAK,OAAA,EAAkB,IAAA,EAAM,WAAW,KAAA,EAAM;AAAA,EAChD,EAAE,GAAA,EAAK,MAAA,EAAiB,IAAA,EAAM,WAAW,IAAA;AAC1C,CAAA;AAEA,SAAS,YAAY,KAAA,EAAiD;AACrE,EAAA,IAAI,UAAU,QAAA,IAAY,KAAA,KAAU,OAAA,IAAW,KAAA,KAAU,QAAQ,OAAO,KAAA;AACxE,EAAA,OAAO,MAAA;AACR;AAEO,SAAS,aAAA,CAAc;AAAA,EAC7B,SAAA;AAAA,EACA,IAAA,GAAO,IAAA;AAAA,EACP,KAAA,GAAQ,SAAA;AAAA,EACR,KAAA,GAAQ,KAAA;AAAA,EACR,IAAA,GAAO,QAAA;AAAA,EACP,MAAA,EAAQ;AACT,CAAA,EAAuB;AACtB,EAAA,MAAM,EAAE,KAAA,EAAO,QAAA,EAAS,GAAIC,mBAAA,EAAS;AACrC,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIV,eAAS,KAAK,CAAA;AAC5C,EAAA,MAAM,KAAA,GAAQ,YAAY,IAAI,CAAA;AAC9B,EAAA,MAAM,UAAA,GAAa,aAAa,KAAK,CAAA;AACrC,EAAA,MAAM,MAAA,GAAS,EAAE,GAAG,aAAA,EAAe,GAAG,UAAA,EAAW;AAEjD,EAAA,MAAM,gBAAA,GAAmBI,iBAAAA;AAAA,IACxB,CAAC,QAAA,KAAuB;AACvB,MAAA,QAAA,CAAS,QAAQ,CAAA;AAAA,IAClB,CAAA;AAAA,IACA,CAAC,QAAQ;AAAA,GACV;AAEA,EAAAD,gBAAU,MAAM;AACf,IAAA,UAAA,CAAW,IAAI,CAAA;AAAA,EAChB,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,IAAI,CAAC,OAAA,EAAS;AACb,IAAA,uBACC/B,cAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACA,aAAA,EAAW,IAAA;AAAA,QACX,SAAA,EAAW,EAAA;AAAA,UACV,KAAA,CAAM,MAAA;AAAA,UACN,UAAA;AAAA,UACA,oBAAA;AAAA,UACA;AAAA;AACD;AAAA,KACD;AAAA,EAEF;AAEA,EAAA,MAAM,YAAA,GAAe,YAAY,KAAK,CAAA;AACtC,EAAA,MAAM,WAAA,GAAc,YAAA,GAAe,UAAA,CAAW,YAAY,CAAA,GAAImC,mBAAA;AAE9D,EAAA,uBACCpC,eAAAA,CAACwB,4BAAAA,EAAA,EACA,QAAA,EAAA;AAAA,oBAAAvB,cAAAA;AAAA,MAACwB,mCAAAA;AAAA,MAAA;AAAA,QACA,wBACCxB,cAAAA;AAAA,UAACyB,gBAAAA;AAAA,UAAA;AAAA,YACA,aAAA,EAAY,gBAAA;AAAA,YACZ,OAAA,EAAQ,SAAA;AAAA,YACR,IAAA,EAAK,MAAA;AAAA,YACL,cAAY,MAAA,CAAO,KAAA;AAAA,YACnB,SAAA,EAAW,EAAA;AAAA,cACV,KAAA,CAAM,MAAA;AAAA,cACN,UAAA;AAAA,cACA,oBAAA;AAAA,cACA;AAAA;AACD;AAAA,SACD;AAAA,QAGD,QAAA,kBAAAzB,cAAAA,CAAC,WAAA,EAAA,EAAY,SAAA,EAAW,MAAM,IAAA,EAAM;AAAA;AAAA,KACrC;AAAA,oBACAA,cAAAA;AAAA,MAAC2B,mCAAAA;AAAA,MAAA;AAAA,QACA,IAAA;AAAA,QACA,KAAA;AAAA,QACA,YAAYY,uCAAA,CAAwB,UAAA;AAAA,QACpC,kBAAkBA,uCAAA,CAAwB,gBAAA;AAAA,QAC1C,SAAA,EAAWC,wCAAA;AAAA,QAEV,QAAA,EAAA,MAAA,CAAO,IAAI,CAAC,EAAE,KAAK,IAAA,EAAM,IAAA,uBACzBzC,eAAAA;AAAA,UAAC0C,gCAAA;AAAA,UAAA;AAAA,YAEA,OAAA,EAAS,MAAM,gBAAA,CAAiB,GAAG,CAAA;AAAA,YACnC,SAAA,EAAW,EAAA;AAAA,cACV,sBAAA;AAAA,cACA,iBAAiB,GAAA,IAChB;AAAA,aACF;AAAA,YAEA,QAAA,EAAA;AAAA,8BAAAzC,cAAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,QAAA,EAAS,CAAA;AAAA,8BACzBA,cAAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,MAAA,CAAO,GAAG,CAAA,EAAE;AAAA;AAAA,WAAA;AAAA,UATd;AAAA,SAWN;AAAA;AAAA;AACF,GAAA,EACD,CAAA;AAEF;ACnJO,IAAM,gBAAA,GAA+B;AAAA,EAC3C,EAAE,GAAA,EAAK,OAAA,EAAS,KAAA,EAAO,IAAA,EAAM,YAAY,wBAAA,EAAmB;AAAA,EAC5D,EAAE,GAAA,EAAK,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,YAAY,SAAA;AACvC;AA6CA,IAAM0C,YAAAA,GAAc;AAAA,EACnB,EAAA,EAAI,EAAE,MAAA,EAAQ,QAAA,EAAU,MAAM,QAAA,EAAS;AAAA,EACvC,EAAA,EAAI,EAAE,MAAA,EAAQ,QAAA,EAAU,MAAM,QAAA,EAAS;AAAA,EACvC,EAAA,EAAI,EAAE,MAAA,EAAQ,QAAA,EAAU,MAAM,QAAA;AAC/B,CAAA;AAEA,IAAMC,aAAAA,GAAe;AAAA,EACpB,OAAA,EAAS,YAAA;AAAA,EACT,OAAA,EAAS,YAAA;AAAA,EACT,IAAA,EAAM;AACP,CAAA;AAGA,IAAMC,qBAAAA,GACL,uMAAA;AAEM,SAAS,gBAAA,CAAiB;AAAA,EAChC,SAAA,EAAW,aAAA;AAAA,EACX,eAAA,EAAiB,mBAAA;AAAA,EACjB,gBAAA,EAAkB,oBAAA;AAAA,EAClB,SAAS,EAAC;AAAA,EACV,SAAA;AAAA,EACA,IAAA,GAAO,IAAA;AAAA,EACP,KAAA,GAAQ,SAAA;AAAA,EACR,KAAA,GAAQ,KAAA;AAAA,EACR,IAAA,GAAO;AACR,CAAA,EAA0B;AACzB,EAAA,MAAM,UAAU,kBAAA,EAAmB;AAEnC,EAAA,MAAM,gBAAA,GAAmB,OAAA,EAAS,SAAA,EAAW,GAAA,CAAI,CAAC,IAAA,MAAU;AAAA,IAC3D,KAAK,IAAA,CAAK,IAAA;AAAA,IACV,KAAA,EAAO,IAAA,CAAK,IAAA,CAAK,WAAA,EAAY;AAAA,IAC7B,YAAY,IAAA,CAAK;AAAA,GAClB,CAAE,CAAA;AAEF,EAAA,MAAM,SAAA,GAAY,iBAAiB,gBAAA,IAAoB,gBAAA;AACvD,EAAA,MAAM,eAAA,GAAkB,mBAAA,IAAuB,OAAA,EAAS,QAAA,IAAY,IAAA;AACpE,EAAA,MAAM,gBAAA,GAAmB,wBAAwB,OAAA,EAAS,WAAA;AAE1D,EAAA,MAAM,KAAA,GAAQF,aAAY,IAAI,CAAA;AAC9B,EAAA,MAAM,UAAA,GAAaC,cAAa,KAAK,CAAA;AACrC,EAAA,MAAM,cAAA,GAAiB,OAAO,QAAA,IAAY,UAAA;AAE1C,EAAA,uBACC5C,eAAAA,CAACwB,4BAAAA,EAAA,EACA,QAAA,EAAA;AAAA,oBAAAvB,cAAAA;AAAA,MAACwB,mCAAAA;AAAA,MAAA;AAAA,QACA,wBACCxB,cAAAA;AAAA,UAACyB,gBAAAA;AAAA,UAAA;AAAA,YACA,OAAA,EAAQ,SAAA;AAAA,YACR,IAAA,EAAK,MAAA;AAAA,YACL,YAAA,EAAY,cAAA;AAAA,YACZ,SAAA,EAAW,EAAA;AAAA,cACV,KAAA,CAAM,MAAA;AAAA,cACN,UAAA;AAAA,cACAmB,qBAAAA;AAAA,cACA;AAAA;AACD;AAAA,SACD;AAAA,QAGD,QAAA,kBAAA5C,cAAAA,CAAC6C,qBAAA,EAAA,EAAU,SAAA,EAAW,MAAM,IAAA,EAAM;AAAA;AAAA,KACnC;AAAA,oBACA7C,cAAAA;AAAA,MAAC2B,mCAAAA;AAAA,MAAA;AAAA,QACA,IAAA;AAAA,QACA,KAAA;AAAA,QACA,YAAYY,uCAAAA,CAAwB,UAAA;AAAA,QACpC,kBAAkBA,uCAAAA,CAAwB,gBAAA;AAAA,QAC1C,SAAA,EAAW,EAAA,CAAGC,wCAAAA,EAA0B,gBAAgB,CAAA;AAAA,QAEvD,oBAAU,GAAA,CAAI,CAAC,EAAE,GAAA,EAAK,UAAA,uBACtBxC,cAAAA;AAAA,UAACyC,gCAAAA;AAAA,UAAA;AAAA,YAEA,OAAA,EAAS,MAAM,gBAAA,GAAmB,GAAG,CAAA;AAAA,YACrC,SAAA,EAAW,EAAA;AAAA,cACV,0DAAA;AAAA,cACA,oBAAoB,GAAA,IAAO;AAAA,aAC5B;AAAA,YAEC,QAAA,EAAA;AAAA,WAAA;AAAA,UAPI;AAAA,SASN;AAAA;AAAA;AACF,GAAA,EACD,CAAA;AAEF;AC9EA,IAAM,cAAA,GAA+C;AAAA,EACpD,UAAA,EAAY,cAAA;AAAA,EACZ,UAAA,EAAY,iBAAA;AAAA,EACZ,aAAA,EAAe,qBAAA;AAAA,EACf,QAAA,EAAU,UAAA;AAAA,EACV,OAAA,EAAS,UAAA;AAAA,EACT,MAAA,EAAQ,SAAA;AAAA,EACR,SAAA,EAAW,YAAA;AAAA,EACX,UAAA,EAAY,wBAAA;AAAA,EACZ,WAAA,EAAa,yBAAA;AAAA,EACb,UAAA,EAAY,qBAAA;AAAA,EACZ,KAAA,EAAO,sBAAA;AAAA,EACP,OAAA,EAAS,kBAAA;AAAA,EACT,OAAA,EAAS;AACV,CAAA;AAyBO,SAAS,YAAA,CAAa;AAAA,EAC5B,KAAA,EAAO,MAAA;AAAA,EACP,QAAA;AAAA,EACA,IAAA,GAAO,GAAA;AAAA,EACP,UAAU,eAAA,GAAkB,KAAA;AAAA,EAC5B,UAAA,GAAa,GAAA;AAAA,EACb,YAAA,GAAe,KAAA;AAAA,EACf,aAAA,GAAgB,IAAA;AAAA,EAChB,SAAA;AAAA,EACA,WAAA,GAAc,SAAA;AAAA,EACd;AACD,CAAA,EAAsB;AACrB,EAAA,MAAM,CAAA,GAAI,EAAE,GAAG,cAAA,EAAgB,GAAG,MAAA,EAAO;AACzC,EAAA,MAAM,SAAA,GAAYZ,aAA0B,IAAI,CAAA;AAChD,EAAA,MAAM,YAAA,GAAeA,aAAyB,IAAI,CAAA;AAClD,EAAA,MAAM,YAAA,GAAeA,aAAuB,IAAI,CAAA;AAEhD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAID,eAAkC,IAAI,CAAA;AAChE,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,eAAS,KAAK,CAAA;AACpD,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIA,eAAS,CAAC,CAAA;AAClC,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,eAAS,CAAC,CAAA;AAC1C,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,cAAAA,CAAS,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA;AACvD,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIA,eAAS,KAAK,CAAA;AAClD,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,cAAAA,CAAS,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA;AACzD,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,eAAS,eAAe,CAAA;AAExD,EAAA,MAAM,cAAA,GAAiBI,kBAAY,MAAM;AACxC,IAAA,IAAI,CAAC,SAAA,CAAU,OAAA,IAAW,CAAC,OAAO,OAAO,IAAA;AAEzC,IAAA,MAAM,YAAA,GAAe,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AACpD,IAAA,YAAA,CAAa,KAAA,GAAQ,UAAA;AACrB,IAAA,YAAA,CAAa,MAAA,GAAS,UAAA;AACtB,IAAA,MAAM,GAAA,GAAM,YAAA,CAAa,UAAA,CAAW,IAAI,CAAA;AACxC,IAAA,IAAI,CAAC,KAAK,OAAO,IAAA;AAEjB,IAAA,GAAA,CAAI,UAAU,SAAA,CAAU,OAAA,EAAS,CAAA,EAAG,CAAA,EAAG,YAAY,UAAU,CAAA;AAE7D,IAAA,MAAM,QAAA,GAAW,SAAS,YAAY,CAAA,CAAA;AACtC,IAAA,OAAO,YAAA,CAAa,SAAA,CAAU,QAAA,EAAU,aAAa,CAAA;AAAA,EACtD,GAAG,CAAC,KAAA,EAAO,UAAA,EAAY,YAAA,EAAc,aAAa,CAAC,CAAA;AAEnD,EAAAD,gBAAU,MAAM;AACf,IAAA,IAAI,CAAC,SAAA,CAAU,OAAA,IAAW,CAAC,KAAA,IAAS,CAAC,WAAA,EAAa;AAElD,IAAA,MAAM,SAAS,SAAA,CAAU,OAAA;AACzB,IAAA,MAAM,GAAA,GAAM,MAAA,CAAO,UAAA,CAAW,IAAI,CAAA;AAClC,IAAA,IAAI,CAAC,GAAA,EAAK;AAEV,IAAA,MAAM,WAAA,GAAc,IAAA;AACpB,IAAA,MAAA,CAAO,KAAA,GAAQ,WAAA;AACf,IAAA,MAAA,CAAO,MAAA,GAAS,WAAA;AAIhB,IAAA,GAAA,CAAI,SAAA,CAAU,CAAA,EAAG,CAAA,EAAG,WAAA,EAAa,WAAW,CAAA;AAE5C,IAAA,GAAA,CAAI,IAAA,EAAK;AACT,IAAA,GAAA,CAAI,SAAA,CAAU,WAAA,GAAc,CAAA,EAAG,WAAA,GAAc,CAAC,CAAA;AAC9C,IAAA,GAAA,CAAI,MAAA,CAAQ,QAAA,GAAW,IAAA,CAAK,EAAA,GAAM,GAAG,CAAA;AAErC,IAAA,MAAM,KAAA,GAAQ,IAAA;AACd,IAAA,MAAM,SAAA,GAAY,KAAA,CAAM,KAAA,GAAQ,KAAA,CAAM,MAAA;AACtC,IAAA,IAAI,SAAA,EAAW,UAAA;AAEf,IAAA,IAAI,YAAY,CAAA,EAAG;AAClB,MAAA,UAAA,GAAa,WAAA,GAAc,KAAA;AAC3B,MAAA,SAAA,GAAY,UAAA,GAAa,SAAA;AAAA,IAC1B,CAAA,MAAO;AACN,MAAA,SAAA,GAAY,WAAA,GAAc,KAAA;AAC1B,MAAA,UAAA,GAAa,SAAA,GAAY,SAAA;AAAA,IAC1B;AAEA,IAAA,GAAA,CAAI,SAAA;AAAA,MACH,KAAA;AAAA,MACA,CAAC,SAAA,GAAY,CAAA,GAAI,QAAA,CAAS,CAAA;AAAA,MAC1B,CAAC,UAAA,GAAa,CAAA,GAAI,QAAA,CAAS,CAAA;AAAA,MAC3B,SAAA;AAAA,MACA;AAAA,KACD;AACA,IAAA,GAAA,CAAI,OAAA,EAAQ;AAEZ,IAAA,MAAM,UAAU,cAAA,EAAe;AAC/B,IAAA,IAAI,OAAA,EAAS;AACZ,MAAA,QAAA,GAAW,OAAO,CAAA;AAAA,IACnB;AAAA,EACD,CAAA,EAAG;AAAA,IACF,KAAA;AAAA,IACA,WAAA;AAAA,IACA,IAAA;AAAA,IACA,QAAA;AAAA,IACA,QAAA;AAAA,IACA,IAAA;AAAA,IACA,cAAA;AAAA,IACA;AAAA,GACA,CAAA;AAED,EAAA,MAAM,eAAA,GAAkBC,kBAAY,MAAM;AACzC,IAAA,OAAA,CAAQ,CAAC,CAAA;AACT,IAAA,WAAA,CAAY,CAAC,CAAA;AACb,IAAA,WAAA,CAAY,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA;AAAA,EAC3B,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,gBAAA,GAAmBA,iBAAAA;AAAA,IACxB,CAAC,CAAA,KAA2C;AAC3C,MAAA,MAAM,IAAA,GAAO,CAAA,CAAE,MAAA,CAAO,KAAA,GAAQ,CAAC,CAAA;AAC/B,MAAA,IAAI,CAAC,IAAA,EAAM;AAEX,MAAA,MAAM,MAAA,GAAS,IAAI,UAAA,EAAW;AAC9B,MAAA,MAAA,CAAO,MAAA,GAAS,CAAC,KAAA,KAAU;AAC1B,QAAA,MAAM,GAAA,GAAM,IAAI,KAAA,EAAM;AACtB,QAAA,GAAA,CAAI,WAAA,GAAc,WAAA;AAClB,QAAA,GAAA,CAAI,SAAS,MAAM;AAClB,UAAA,QAAA,CAAS,GAAG,CAAA;AACZ,UAAA,cAAA,CAAe,IAAI,CAAA;AACnB,UAAA,eAAA,EAAgB;AAAA,QACjB,CAAA;AACA,QAAA,GAAA,CAAI,GAAA,GAAM,MAAM,MAAA,EAAQ,MAAA;AAAA,MACzB,CAAA;AACA,MAAA,MAAA,CAAO,cAAc,IAAI,CAAA;AAAA,IAC1B,CAAA;AAAA,IACA,CAAC,eAAe;AAAA,GACjB;AAEA,EAAA,MAAM,eAAA,GAAkBA,iBAAAA;AAAA,IACvB,CAAC,CAAA,KAAwB;AACxB,MAAA,IAAI,CAAC,WAAA,EAAa;AAClB,MAAA,aAAA,CAAc,IAAI,CAAA;AAClB,MAAA,YAAA,CAAa,EAAE,CAAA,EAAG,CAAA,CAAE,OAAA,GAAU,QAAA,CAAS,CAAA,EAAG,CAAA,EAAG,CAAA,CAAE,OAAA,GAAU,QAAA,CAAS,CAAA,EAAG,CAAA;AAAA,IACtE,CAAA;AAAA,IACA,CAAC,aAAa,QAAQ;AAAA,GACvB;AAEA,EAAA,MAAM,eAAA,GAAkBA,iBAAAA;AAAA,IACvB,CAAC,CAAA,KAAwB;AACxB,MAAA,IAAI,CAAC,UAAA,EAAY;AACjB,MAAA,WAAA,CAAY;AAAA,QACX,CAAA,EAAG,CAAA,CAAE,OAAA,GAAU,SAAA,CAAU,CAAA;AAAA,QACzB,CAAA,EAAG,CAAA,CAAE,OAAA,GAAU,SAAA,CAAU;AAAA,OACzB,CAAA;AAAA,IACF,CAAA;AAAA,IACA,CAAC,YAAY,SAAS;AAAA,GACvB;AAEA,EAAA,MAAM,aAAA,GAAgBA,kBAAY,MAAM;AACvC,IAAA,aAAA,CAAc,KAAK,CAAA;AAAA,EACpB,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,gBAAA,GAAmBA,iBAAAA;AAAA,IACxB,CAAC,CAAA,KAAwB;AACxB,MAAA,IAAI,CAAC,WAAA,EAAa;AAClB,MAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA;AACzB,MAAA,aAAA,CAAc,IAAI,CAAA;AAClB,MAAA,YAAA,CAAa;AAAA,QACZ,CAAA,EAAG,KAAA,CAAM,OAAA,GAAU,QAAA,CAAS,CAAA;AAAA,QAC5B,CAAA,EAAG,KAAA,CAAM,OAAA,GAAU,QAAA,CAAS;AAAA,OAC5B,CAAA;AAAA,IACF,CAAA;AAAA,IACA,CAAC,aAAa,QAAQ;AAAA,GACvB;AAEA,EAAA,MAAM,eAAA,GAAkBA,iBAAAA;AAAA,IACvB,CAAC,CAAA,KAAwB;AACxB,MAAA,IAAI,CAAC,UAAA,EAAY;AACjB,MAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA;AACzB,MAAA,WAAA,CAAY;AAAA,QACX,CAAA,EAAG,KAAA,CAAM,OAAA,GAAU,SAAA,CAAU,CAAA;AAAA,QAC7B,CAAA,EAAG,KAAA,CAAM,OAAA,GAAU,SAAA,CAAU;AAAA,OAC7B,CAAA;AAAA,IACF,CAAA;AAAA,IACA,CAAC,YAAY,SAAS;AAAA,GACvB;AAEA,EAAA,MAAM,aAAA,GAAgBA,kBAAY,MAAM;AACvC,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,cAAA,CAAe,KAAK,CAAA;AACpB,IAAA,eAAA,EAAgB;AAChB,IAAA,IAAI,aAAa,OAAA,EAAS;AACzB,MAAA,YAAA,CAAa,QAAQ,KAAA,GAAQ,EAAA;AAAA,IAC9B;AACA,IAAA,QAAA,GAAW,IAAI,CAAA;AAAA,EAChB,CAAA,EAAG,CAAC,eAAA,EAAiB,QAAQ,CAAC,CAAA;AAE9B,EAAA,MAAM,YAAA,GAAe,MAAM,OAAA,CAAQ,CAAC,CAAA,KAAM,KAAK,GAAA,CAAI,CAAA,GAAI,GAAA,EAAK,CAAC,CAAC,CAAA;AAC9D,EAAA,MAAM,aAAA,GAAgB,MAAM,OAAA,CAAQ,CAAC,CAAA,KAAM,KAAK,GAAA,CAAI,CAAA,GAAI,GAAA,EAAK,GAAG,CAAC,CAAA;AACjE,EAAA,MAAM,mBAAmB,MAAM,WAAA,CAAY,CAAC,CAAA,KAAM,IAAI,EAAE,CAAA;AACxD,EAAA,MAAM,oBAAoB,MAAM,WAAA,CAAY,CAAC,CAAA,KAAM,IAAI,EAAE,CAAA;AAEzD,EAAA,MAAM,UAAU,WAAA,KAAgB,OAAA;AAChC,EAAA,MAAM,UAAA,GAAa,UAAU,WAAA,GAAc,SAAA;AAC3C,EAAA,MAAM,QAAA,GAAW,UAAU,SAAA,GAAY,SAAA;AACvC,EAAA,MAAM,aAAA,GAAgB,UAAU,SAAA,GAAY,SAAA;AAC5C,EAAA,MAAM,QAAA,GAAW,UAAU,SAAA,GAAY,SAAA;AACvC,EAAA,MAAM,cAAA,GAAiB,UAAU,WAAA,GAAc,SAAA;AAC/C,EAAA,MAAM,mBAAA,GAAsB,UAAU,WAAA,GAAc,WAAA;AACpD,EAAA,MAAM,OAAA,GAAU,UAAU,OAAA,GAAU,OAAA;AACpC,EAAA,MAAM,UAAA,GAAa,UAAU,OAAA,GAAU,OAAA;AACvC,EAAA,MAAM,YAAA,GAAe,UAClB,6CAAA,GACA,EAAA;AACH,EAAA,MAAM,WAAA,GAAc,OAAO,CAAA,GAAI,CAAA;AAC/B,EAAA,MAAM,cAAc,IAAA,GAAO,CAAA;AAE3B,EAAA,uBACCjC,eAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACA,SAAA,EAAW,EAAA,CAAG,eAAA,EAAiB,OAAA,EAAS,SAAS,CAAA;AAAA,MACjD,KAAA,EAAO,EAAE,KAAA,EAAO,IAAA,EAAK;AAAA,MAGrB,QAAA,EAAA;AAAA,wBAAAA,eAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACA,GAAA,EAAK,YAAA;AAAA,YACL,SAAA,EAAU,+CAAA;AAAA,YACV,KAAA,EAAO,EAAE,KAAA,EAAO,IAAA,EAAM,QAAQ,IAAA,EAAK;AAAA,YAGlC,QAAA,EAAA;AAAA,cAAA,CAAC,+BACDA,eAAAA;AAAA,gBAAC,QAAA;AAAA,gBAAA;AAAA,kBACA,OAAA,EAAS,MAAM,YAAA,CAAa,OAAA,EAAS,KAAA,EAAM;AAAA,kBAC3C,SAAA,EAAW,EAAA;AAAA,oBACV,gKAAA;AAAA,oBACA,UAAU,OAAA,GAAU;AAAA,mBACrB;AAAA,kBACA,cAAY,CAAA,CAAE,UAAA;AAAA,kBACd,IAAA,EAAK,QAAA;AAAA,kBAEL,QAAA,EAAA;AAAA,oCAAAC,cAAAA;AAAA,sBAAC,KAAA;AAAA,sBAAA;AAAA,wBACA,SAAA,EAAW,EAAA;AAAA,0BACV,6DAAA;AAAA,0BACA;AAAA,yBACD;AAAA,wBAEA,0BAAAA,cAAAA,CAAC8C,kBAAA,EAAA,EAAO,WAAW,EAAA,CAAG,cAAA,EAAgB,cAAc,CAAA,EAAG;AAAA;AAAA,qBACxD;AAAA,oCACA9C,cAAAA;AAAA,sBAAC,MAAA;AAAA,sBAAA;AAAA,wBACA,SAAA,EAAW,EAAA,CAAG,aAAA,EAAe,OAAA,GAAU,cAAc,SAAS,CAAA;AAAA,wBAE7D,QAAA,EAAA,CAAA,CAAE;AAAA;AAAA,qBACJ;AAAA,oCACAA,eAAC,MAAA,EAAA,EAAK,SAAA,EAAW,GAAG,uBAAA,EAAyB,QAAQ,CAAA,EACnD,QAAA,EAAA,CAAA,CAAE,aAAA,EACJ;AAAA;AAAA;AAAA,eACD;AAAA,8BAIDA,cAAAA;AAAA,gBAAC,QAAA;AAAA,gBAAA;AAAA,kBACA,GAAA,EAAK,SAAA;AAAA,kBACL,SAAA,EAAW,EAAA;AAAA,oBACV,kBAAA;AAAA,oBACA,cAAc,aAAA,GAAgB;AAAA,mBAC/B;AAAA,kBACA,KAAA,EAAO,EAAE,KAAA,EAAO,IAAA,EAAM,QAAQ,IAAA,EAAK;AAAA,kBACnC,WAAA,EAAa,eAAA;AAAA,kBACb,WAAA,EAAa,eAAA;AAAA,kBACb,SAAA,EAAW,aAAA;AAAA,kBACX,YAAA,EAAc,aAAA;AAAA,kBACd,YAAA,EAAc,gBAAA;AAAA,kBACd,WAAA,EAAa,eAAA;AAAA,kBACb,UAAA,EAAY;AAAA;AAAA,eACb;AAAA,cAGC,+BACAD,eAAAA;AAAA,gBAAC,KAAA;AAAA,gBAAA;AAAA,kBACA,KAAA,EAAO,IAAA;AAAA,kBACP,MAAA,EAAQ,IAAA;AAAA,kBACR,SAAA,EAAU,sCAAA;AAAA,kBACV,aAAA,EAAY,MAAA;AAAA,kBAEZ,QAAA,EAAA;AAAA,oCAAAC,cAAAA;AAAA,sBAAC,MAAA;AAAA,sBAAA;AAAA,wBACA,CAAA,EAAG,CAAA,KAAA,EAAQ,IAAI,CAAA,CAAA,EAAI,IAAI,QAAQ,WAAA,GAAc,WAAW,CAAA,CAAA,EAAI,WAAW,CAAA,CAAA,EAAI,WAAW,IAAI,WAAW,CAAA,OAAA,EAAU,WAAA,GAAc,CAAC,CAAA,GAAA,EAAM,WAAW,IAAI,WAAW,CAAA,OAAA,EAAU,CAAC,WAAA,GAAc,CAAC,CAAA,EAAA,CAAA;AAAA,wBACxL,IAAA,EAAK,mBAAA;AAAA,wBACL,QAAA,EAAS;AAAA;AAAA,qBACV;AAAA,oCACAA,cAAAA;AAAA,sBAAC,QAAA;AAAA,sBAAA;AAAA,wBACA,EAAA,EAAI,WAAA;AAAA,wBACJ,EAAA,EAAI,WAAA;AAAA,wBACJ,CAAA,EAAG,WAAA;AAAA,wBACH,IAAA,EAAK,MAAA;AAAA,wBACL,MAAA,EAAO,qBAAA;AAAA,wBACP,WAAA,EAAY;AAAA;AAAA;AACb;AAAA;AAAA,eACD;AAAA,cAIA,QAAA,IAAY,+BACZA,cAAAA;AAAA,gBAAC,KAAA;AAAA,gBAAA;AAAA,kBACA,SAAA,EAAU,sCAAA;AAAA,kBACV,KAAA,EAAO,EAAE,KAAA,EAAO,IAAA,EAAM,QAAQ,IAAA,EAAK;AAAA,kBAEnC,QAAA,kBAAAD,gBAAC,KAAA,EAAA,EAAI,KAAA,EAAO,MAAM,MAAA,EAAQ,IAAA,EAAM,WAAU,YAAA,EACzC,QAAA,EAAA;AAAA,oCAAAC,cAAAA;AAAA,sBAAC,MAAA;AAAA,sBAAA;AAAA,wBACA,IAAI,IAAA,GAAO,CAAA;AAAA,wBACX,EAAA,EAAI,CAAA;AAAA,wBACJ,IAAI,IAAA,GAAO,CAAA;AAAA,wBACX,EAAA,EAAI,IAAA;AAAA,wBACJ,MAAA,EAAO,OAAA;AAAA,wBACP,WAAA,EAAY;AAAA;AAAA,qBACb;AAAA,oCACAA,cAAAA;AAAA,sBAAC,MAAA;AAAA,sBAAA;AAAA,wBACA,EAAA,EAAK,OAAO,CAAA,GAAK,CAAA;AAAA,wBACjB,EAAA,EAAI,CAAA;AAAA,wBACJ,EAAA,EAAK,OAAO,CAAA,GAAK,CAAA;AAAA,wBACjB,EAAA,EAAI,IAAA;AAAA,wBACJ,MAAA,EAAO,OAAA;AAAA,wBACP,WAAA,EAAY;AAAA;AAAA,qBACb;AAAA,oCACAA,cAAAA;AAAA,sBAAC,MAAA;AAAA,sBAAA;AAAA,wBACA,EAAA,EAAI,CAAA;AAAA,wBACJ,IAAI,IAAA,GAAO,CAAA;AAAA,wBACX,EAAA,EAAI,IAAA;AAAA,wBACJ,IAAI,IAAA,GAAO,CAAA;AAAA,wBACX,MAAA,EAAO,OAAA;AAAA,wBACP,WAAA,EAAY;AAAA;AAAA,qBACb;AAAA,oCACAA,cAAAA;AAAA,sBAAC,MAAA;AAAA,sBAAA;AAAA,wBACA,EAAA,EAAI,CAAA;AAAA,wBACJ,EAAA,EAAK,OAAO,CAAA,GAAK,CAAA;AAAA,wBACjB,EAAA,EAAI,IAAA;AAAA,wBACJ,EAAA,EAAK,OAAO,CAAA,GAAK,CAAA;AAAA,wBACjB,MAAA,EAAO,OAAA;AAAA,wBACP,WAAA,EAAY;AAAA;AAAA,qBACb;AAAA,oCACAA,cAAAA;AAAA,sBAAC,MAAA;AAAA,sBAAA;AAAA,wBACA,EAAA,EAAI,OAAO,CAAA,GAAI,EAAA;AAAA,wBACf,IAAI,IAAA,GAAO,CAAA;AAAA,wBACX,EAAA,EAAI,OAAO,CAAA,GAAI,EAAA;AAAA,wBACf,IAAI,IAAA,GAAO,CAAA;AAAA,wBACX,MAAA,EAAO,OAAA;AAAA,wBACP,WAAA,EAAY;AAAA;AAAA,qBACb;AAAA,oCACAA,cAAAA;AAAA,sBAAC,MAAA;AAAA,sBAAA;AAAA,wBACA,IAAI,IAAA,GAAO,CAAA;AAAA,wBACX,EAAA,EAAI,OAAO,CAAA,GAAI,EAAA;AAAA,wBACf,IAAI,IAAA,GAAO,CAAA;AAAA,wBACX,EAAA,EAAI,OAAO,CAAA,GAAI,EAAA;AAAA,wBACf,MAAA,EAAO,OAAA;AAAA,wBACP,WAAA,EAAY;AAAA;AAAA;AACb,mBAAA,EACD;AAAA;AAAA,eACD;AAAA,cAIA,WAAA,IAAe,8BACfD,eAAAA;AAAA,gBAAC,KAAA;AAAA,gBAAA;AAAA,kBACA,SAAA,EAAW,EAAA;AAAA,oBACV,2FAAA;AAAA,oBACA,UAAU,yBAAA,GAA4B;AAAA,mBACvC;AAAA,kBAEA,QAAA,EAAA;AAAA,oCAAAC,cAAAA,CAAC+C,gBAAA,EAAA,EAAK,SAAA,EAAW,aAAA,EAAe,CAAA;AAAA,oBAC/B,CAAA,CAAE;AAAA;AAAA;AAAA;AACJ;AAAA;AAAA,SAEF;AAAA,QAGC,WAAA,oBACAhD,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAW,EAAA,CAAG,WAAA,EAAa,OAAA,IAAW,WAAW,CAAA,EAErD,QAAA,EAAA;AAAA,0BAAAA,gBAAC,KAAA,EAAA,EAAI,SAAA,EAAW,EAAA,CAAG,mBAAA,EAAqB,UAAU,CAAA,EACjD,QAAA,EAAA;AAAA,4BAAAC,cAAAA;AAAA,cAACyB,gBAAAA;AAAA,cAAA;AAAA,gBACA,OAAA,EAAQ,OAAA;AAAA,gBACR,IAAA,EAAK,MAAA;AAAA,gBACL,SAAA,EAAW,EAAA,CAAG,UAAA,EAAY,UAAU,CAAA;AAAA,gBACpC,OAAA,EAAS,aAAA;AAAA,gBACT,cAAY,CAAA,CAAE,OAAA;AAAA,gBACd,IAAA,EAAK,QAAA;AAAA,gBAEL,QAAA,kBAAAzB,cAAAA,CAACgD,mBAAA,EAAA,EAAQ,SAAA,EAAW,QAAA,EAAU;AAAA;AAAA,aAC/B;AAAA,4BACAhD,cAAAA;AAAA,cAACiD,gBAAA;AAAA,cAAA;AAAA,gBACA,KAAA,EAAO,CAAC,IAAI,CAAA;AAAA,gBACZ,eAAe,CAAC,CAAC,CAAC,CAAA,KAAM,QAAQ,CAAC,CAAA;AAAA,gBACjC,GAAA,EAAK,GAAA;AAAA,gBACL,GAAA,EAAK,CAAA;AAAA,gBACL,IAAA,EAAM,IAAA;AAAA,gBACN,SAAA,EAAW,EAAA,CAAG,QAAA,EAAU,YAAY,CAAA;AAAA,gBACpC,cAAY,CAAA,CAAE;AAAA;AAAA,aACf;AAAA,4BACAjD,cAAAA;AAAA,cAACyB,gBAAAA;AAAA,cAAA;AAAA,gBACA,OAAA,EAAQ,OAAA;AAAA,gBACR,IAAA,EAAK,MAAA;AAAA,gBACL,SAAA,EAAW,EAAA,CAAG,UAAA,EAAY,UAAU,CAAA;AAAA,gBACpC,OAAA,EAAS,YAAA;AAAA,gBACT,cAAY,CAAA,CAAE,MAAA;AAAA,gBACd,IAAA,EAAK,QAAA;AAAA,gBAEL,QAAA,kBAAAzB,cAAAA,CAACkD,kBAAA,EAAA,EAAO,SAAA,EAAW,QAAA,EAAU;AAAA;AAAA;AAC9B,WAAA,EACD,CAAA;AAAA,0BAGAnD,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAW,EAAA,CAAG,mCAAA,EAAqC,UAAU,CAAA,EACjE,QAAA,EAAA;AAAA,4BAAAA,eAAAA;AAAA,cAAC,KAAA;AAAA,cAAA;AAAA,gBACA,SAAA,EAAW,EAAA,CAAG,mBAAA,EAAqB,OAAA,GAAU,UAAU,OAAO,CAAA;AAAA,gBAE9D,QAAA,EAAA;AAAA,kCAAAC,cAAAA;AAAA,oBAACyB,gBAAAA;AAAA,oBAAA;AAAA,sBACA,OAAA,EAAQ,OAAA;AAAA,sBACR,IAAA,EAAK,MAAA;AAAA,sBACL,SAAA,EAAW,UAAA;AAAA,sBACX,OAAA,EAAS,gBAAA;AAAA,sBACT,cAAY,CAAA,CAAE,UAAA;AAAA,sBACd,IAAA,EAAK,QAAA;AAAA,sBAEL,QAAA,kBAAAzB,cAAAA,CAACmD,qBAAA,EAAA,EAAU,SAAA,EAAW,QAAA,EAAU;AAAA;AAAA,mBACjC;AAAA,kCACApD,eAAAA;AAAA,oBAAC,MAAA;AAAA,oBAAA;AAAA,sBACA,SAAA,EAAW,EAAA;AAAA,wBACV,gDAAA;AAAA,wBACA,QAAA;AAAA,wBACA,UAAU,MAAA,GAAS;AAAA,uBACpB;AAAA,sBAEC,QAAA,EAAA;AAAA,wBAAA,QAAA;AAAA,wBAAS;AAAA;AAAA;AAAA,mBACX;AAAA,kCACAC,cAAAA;AAAA,oBAACyB,gBAAAA;AAAA,oBAAA;AAAA,sBACA,OAAA,EAAQ,OAAA;AAAA,sBACR,IAAA,EAAK,MAAA;AAAA,sBACL,SAAA,EAAW,UAAA;AAAA,sBACX,OAAA,EAAS,iBAAA;AAAA,sBACT,cAAY,CAAA,CAAE,WAAA;AAAA,sBACd,IAAA,EAAK,QAAA;AAAA,sBAEL,QAAA,kBAAAzB,cAAAA,CAACoD,oBAAA,EAAA,EAAS,SAAA,EAAW,QAAA,EAAU;AAAA;AAAA;AAChC;AAAA;AAAA,aACD;AAAA,4BAEArD,eAAAA;AAAA,cAAC,KAAA;AAAA,cAAA;AAAA,gBACA,SAAA,EAAW,EAAA,CAAG,mBAAA,EAAqB,OAAA,GAAU,UAAU,OAAO,CAAA;AAAA,gBAE9D,QAAA,EAAA;AAAA,kCAAAC,cAAAA;AAAA,oBAACqD,gBAAA;AAAA,oBAAA;AAAA,sBACA,OAAA,EAAS,QAAA;AAAA,sBACT,eAAA,EAAiB,WAAA;AAAA,sBACjB,IAAA,EAAK,IAAA;AAAA,sBACL,SAAA,EAAW,EAAA,CAAG,UAAA,EAAY,KAAK,CAAA;AAAA,sBAC/B,cAAY,CAAA,CAAE,UAAA;AAAA,sBAEd,QAAA,kBAAArD,cAAAA,CAACsD,mBAAA,EAAA,EAAQ,SAAA,EAAW,QAAA,EAAU;AAAA;AAAA,mBAC/B;AAAA,kCACAtD,cAAAA;AAAA,oBAACyB,gBAAAA;AAAA,oBAAA;AAAA,sBACA,OAAA,EAAQ,OAAA;AAAA,sBACR,IAAA,EAAK,MAAA;AAAA,sBACL,SAAA,EAAW,UAAA;AAAA,sBACX,OAAA,EAAS,eAAA;AAAA,sBACT,cAAY,CAAA,CAAE,KAAA;AAAA,sBACd,IAAA,EAAK,QAAA;AAAA,sBAEL,QAAA,kBAAAzB,cAAAA,CAACuD,qBAAA,EAAA,EAAU,SAAA,EAAW,QAAA,EAAU;AAAA;AAAA,mBACjC;AAAA,kCACAvD,cAAAA;AAAA,oBAACyB,gBAAAA;AAAA,oBAAA;AAAA,sBACA,OAAA,EAAQ,OAAA;AAAA,sBACR,IAAA,EAAK,MAAA;AAAA,sBACL,SAAA,EAAW,UAAA;AAAA,sBACX,OAAA,EAAS,MAAM,YAAA,CAAa,OAAA,EAAS,KAAA,EAAM;AAAA,sBAC3C,cAAY,CAAA,CAAE,OAAA;AAAA,sBACd,IAAA,EAAK,QAAA;AAAA,sBAEL,QAAA,kBAAAzB,cAAAA,CAAC8C,kBAAA,EAAA,EAAO,SAAA,EAAW,QAAA,EAAU;AAAA;AAAA,mBAC9B;AAAA,kCAEA9C,cAAAA;AAAA,oBAACyB,gBAAAA;AAAA,oBAAA;AAAA,sBACA,OAAA,EAAQ,OAAA;AAAA,sBACR,IAAA,EAAK,MAAA;AAAA,sBACL,SAAA,EAAW,EAAA;AAAA,wBACV,UAAA;AAAA,wBACA;AAAA,uBACD;AAAA,sBACA,OAAA,EAAS,aAAA;AAAA,sBACT,cAAY,CAAA,CAAE,OAAA;AAAA,sBACd,IAAA,EAAK,QAAA;AAAA,sBAEL,QAAA,kBAAAzB,cAAAA,CAACwD,aAAA,EAAA,EAAE,SAAA,EAAW,QAAA,EAAU;AAAA;AAAA;AACzB;AAAA;AAAA;AACD,WAAA,EACD;AAAA,SAAA,EACD,CAAA;AAAA,wBAIDxD,cAAAA;AAAA,UAAC,OAAA;AAAA,UAAA;AAAA,YACA,GAAA,EAAK,YAAA;AAAA,YACL,IAAA,EAAK,MAAA;AAAA,YACL,MAAA,EAAO,SAAA;AAAA,YACP,QAAA,EAAU,gBAAA;AAAA,YACV,SAAA,EAAU,QAAA;AAAA,YACV,aAAA,EAAY;AAAA;AAAA;AACb;AAAA;AAAA,GACD;AAEF;AC/gBA,SAAS,cAAc,KAAA,EAAwB;AAC9C,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAI4B,eAAS,KAAK,CAAA;AAE5C,EAAAG,gBAAU,MAAM;AACf,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,UAAA,CAAW,KAAK,CAAA;AACrC,IAAA,IAAI,KAAA,CAAM,YAAY,OAAA,EAAS;AAC9B,MAAA,UAAA,CAAW,MAAM,OAAO,CAAA;AAAA,IACzB;AACA,IAAA,MAAM,QAAA,GAAW,MAAM,UAAA,CAAW,KAAA,CAAM,OAAO,CAAA;AAC/C,IAAA,KAAA,CAAM,gBAAA,CAAiB,UAAU,QAAQ,CAAA;AACzC,IAAA,OAAO,MAAM,KAAA,CAAM,mBAAA,CAAoB,QAAA,EAAU,QAAQ,CAAA;AAAA,EAC1D,CAAA,EAAG,CAAC,OAAA,EAAS,KAAK,CAAC,CAAA;AAEnB,EAAA,OAAO,OAAA;AACR;AAEO,SAAS,kBAAA,CAAmB;AAAA,EAClC,KAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA,WAAA,GAAc,GAAA;AAAA,EACd,UAAA,GAAa,GAAA;AAAA,EACb,UAAA,GAAa,GAAA;AAAA,EACb,WAAA,GAAc,WAAA;AAAA,EACd,SAAA,GAAY,aAAA;AAAA,EACZ,WAAA,GAAc,aAAA;AAAA,EACd,UAAA,GAAa,QAAA;AAAA,EACb,UAAA,GAAa,QAAA;AAAA,EACb,UAAA,GAAa,WAAA;AAAA,EACb,SAAA,GAAY,QAAA;AAAA,EACZ,cAAA,GAAiB,4BAAA;AAAA,EACjB,YAAA,GAAe,0CAAA;AAAA,EACf,SAAA;AAAA,EACA;AACD,CAAA,EAA4B;AAC3B,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIH,eAAS,KAAK,CAAA;AAC1C,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,cAAAA,CAAwB,SAAS,IAAI,CAAA;AAC3E,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIA,cAAAA,CAAwB,SAAS,IAAI,CAAA;AACzE,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,eAAS,KAAK,CAAA;AAC9C,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,eAGtB,IAAI,CAAA;AAEd,EAAAG,gBAAU,MAAM;AACf,IAAA,aAAA,CAAc,SAAS,IAAI,CAAA;AAAA,EAC5B,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAEV,EAAA,MAAM,QAAA,GAAW,cAAc,oBAAoB,CAAA;AACnD,EAAA,MAAM,OAAA,GAAA,CAAW,WAAA,IAAe,EAAA,EAAI,IAAA,EAAK;AAGzC,EAAA,MAAM,gBAAA,GAAmBC,iBAAAA;AAAA,IACxB,CAAC,IAAA,KAAkB;AAClB,MAAA,IAAI,IAAA,EAAM;AACT,QAAA,cAAA,CAAe,SAAS,IAAI,CAAA;AAC5B,QAAA,WAAA,CAAY,IAAI,CAAA;AAAA,MACjB;AACA,MAAA,SAAA,CAAU,IAAI,CAAA;AAAA,IACf,CAAA;AAAA,IACA,CAAC,KAAK;AAAA,GACP;AAGA,EAAA,MAAM,YAAA,GAAeA,kBAAY,YAAY;AAC5C,IAAA,IAAI,CAAC,WAAA,EAAa;AAElB,IAAA,WAAA,CAAY,IAAI,CAAA;AAChB,IAAA,WAAA,CAAY,IAAI,CAAA;AAEhB,IAAA,IAAI;AACH,MAAA,IAAI,MAAA,EAAQ;AACX,QAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,WAAW,CAAA;AACvC,QAAA,IAAI,MAAA,EAAQ;AACX,UAAA,aAAA,CAAc,WAAW,CAAA;AACzB,UAAA,QAAA,GAAW,WAAW,CAAA;AACtB,UAAA,WAAA,CAAY,EAAE,IAAA,EAAM,SAAA,EAAW,OAAA,EAAS,gBAAgB,CAAA;AACxD,UAAA,UAAA,CAAW,MAAM;AAChB,YAAA,SAAA,CAAU,KAAK,CAAA;AACf,YAAA,WAAA,CAAY,IAAI,CAAA;AAAA,UACjB,GAAG,IAAI,CAAA;AAAA,QACR,CAAA,MAAO;AACN,UAAA,WAAA,CAAY,EAAE,IAAA,EAAM,OAAA,EAAS,OAAA,EAAS,cAAc,CAAA;AAAA,QACrD;AAAA,MACD,CAAA,MAAO;AACN,QAAA,aAAA,CAAc,WAAW,CAAA;AACzB,QAAA,QAAA,GAAW,WAAW,CAAA;AACtB,QAAA,WAAA,CAAY,EAAE,IAAA,EAAM,SAAA,EAAW,OAAA,EAAS,gBAAgB,CAAA;AACxD,QAAA,UAAA,CAAW,MAAM;AAChB,UAAA,SAAA,CAAU,KAAK,CAAA;AACf,UAAA,WAAA,CAAY,IAAI,CAAA;AAAA,QACjB,GAAG,IAAI,CAAA;AAAA,MACR;AAAA,IACD,CAAA,CAAA,MAAQ;AACP,MAAA,WAAA,CAAY,EAAE,IAAA,EAAM,OAAA,EAAS,OAAA,EAAS,cAAc,CAAA;AAAA,IACrD,CAAA,SAAE;AACD,MAAA,WAAA,CAAY,KAAK,CAAA;AAAA,IAClB;AAAA,EACD,GAAG,CAAC,WAAA,EAAa,UAAU,MAAA,EAAQ,cAAA,EAAgB,YAAY,CAAC,CAAA;AAGhE,EAAA,MAAM,gCACLjC,eAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACA,SAAA,EAAW,EAAA,CAAG,gBAAA,EAAkB,SAAS,CAAA;AAAA,MACzC,KAAA,EAAO,EAAE,KAAA,EAAO,WAAA,EAAa,QAAQ,WAAA,EAAY;AAAA,MAGjD,QAAA,EAAA;AAAA,wBAAAC,cAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACA,SAAA,EAAU,sHAAA;AAAA,YACV,KAAA,EAAO,EAAE,KAAA,EAAO,WAAA,EAAa,QAAQ,WAAA,EAAY;AAAA,YAEjD,QAAA,kBAAAA,cAAAA;AAAA,cAAC,SAAA;AAAA,cAAA;AAAA,gBACA,GAAA,EAAK,UAAA;AAAA,gBACL,GAAA,EAAI,QAAA;AAAA,gBACJ,SAAA,EAAU,6CAAA;AAAA,gBACV,0BACCD,eAAAA;AAAA,kBAAC,KAAA;AAAA,kBAAA;AAAA,oBACA,SAAA,EAAW,EAAA;AAAA,sBACV,iEAAA;AAAA,sBACA,UAAU,OAAA,GAAU;AAAA,qBACrB;AAAA,oBAEA,QAAA,EAAA;AAAA,sCAAAC,cAAAA;AAAA,wBAACyD,gBAAA;AAAA,wBAAA;AAAA,0BACA,SAAA,EAAU,8CAAA;AAAA,0BACV,aAAA,EAAW;AAAA;AAAA,uBACZ;AAAA,sBACC,0BACAzD,cAAAA,CAAC,UAAK,SAAA,EAAU,0BAAA,EAA4B,mBAAQ,CAAA,GACjD;AAAA;AAAA;AAAA;AACL;AAAA;AAEF;AAAA,SACD;AAAA,wBAGAA,cAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACA,OAAA,EAAS,MAAM,gBAAA,CAAiB,IAAI,CAAA;AAAA,YACpC,SAAA,EAAU,2OAAA;AAAA,YACV,YAAA,EAAY,SAAA;AAAA,YACZ,IAAA,EAAK,QAAA;AAAA,YAEL,QAAA,kBAAAA,cAAAA,CAAC0D,kBAAA,EAAA,EAAO,SAAA,EAAU,SAAA,EAAU;AAAA;AAAA;AAC7B;AAAA;AAAA,GACD;AAGD,EAAA,MAAM,gBAAA,GAAmB,WACtB,IAAA,CAAK,GAAA,CAAI,aAAa,EAAA,EAAI,MAAA,CAAO,UAAA,GAAa,EAAE,CAAA,GAChD,UAAA;AAGH,EAAA,MAAM,aAAA,mBACL3D,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,kCAAA,EACd,QAAA,EAAA;AAAA,oBAAAC,cAAAA;AAAA,MAAC,YAAA;AAAA,MAAA;AAAA,QACA,KAAA,EAAO,WAAA;AAAA,QACP,QAAA,EAAU,cAAA;AAAA,QACV,IAAA,EAAM,gBAAA;AAAA,QACN,UAAA;AAAA,QACA,WAAA,EAAa,WAAW,OAAA,GAAU,SAAA;AAAA,QAClC,MAAA,EAAQ;AAAA;AAAA,KACT;AAAA,oBAGAA,cAAAA,CAAC2D,4BAAA,EAAA,EACC,QAAA,EAAA,QAAA,oBACA5D,eAAAA;AAAA,MAAC6D,mBAAA,CAAO,GAAA;AAAA,MAAP;AAAA,QACA,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA,EAAG,GAAG,GAAA,EAAI;AAAA,QAC9B,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA,EAAG,GAAG,CAAA,EAAE;AAAA,QAC5B,IAAA,EAAM,EAAE,OAAA,EAAS,CAAA,EAAG,GAAG,GAAA,EAAI;AAAA,QAC3B,SAAA,EAAW,EAAA;AAAA,UACV,gDAAA;AAAA,UACA,WAAW,qBAAA,GAAwB,mBAAA;AAAA,UACnC,QAAA,CAAS,IAAA,KAAS,SAAA,GACf,sEAAA,GACA;AAAA,SACJ;AAAA,QAEC,QAAA,EAAA;AAAA,UAAA,QAAA,CAAS,SAAS,SAAA,mBAClB5D,cAAAA,CAAC6D,iBAAA,EAAA,EAAM,WAAW,QAAA,GAAW,SAAA,GAAY,SAAA,EAAW,CAAA,mBAEpD7D,cAAAA,CAACwD,aAAAA,EAAA,EAAE,SAAA,EAAW,QAAA,GAAW,YAAY,SAAA,EAAW,CAAA;AAAA,UAEhD,QAAA,CAAS;AAAA;AAAA;AAAA,KACX,EAEF;AAAA,GAAA,EACD,CAAA;AAID,EAAA,MAAM,aAAA,mBACLzD,eAAAA,CAAAkC,mBAAAA,EAAA,EACE,QAAA,EAAA;AAAA,IAAA,QAAA,mBACAjC,cAAAA,CAAC8D,qBAAA,EAAA,EAAY,OAAA,EAAO,MACnB,QAAA,kBAAA9D,cAAAA;AAAA,MAACyB,gBAAAA;AAAA,MAAA;AAAA,QACA,OAAA,EAAQ,SAAA;AAAA,QACR,QAAA,EAAU,QAAA;AAAA,QACV,IAAA,EAAK,IAAA;AAAA,QACL,SAAA,EAAU,uBAAA;AAAA,QAET,QAAA,EAAA;AAAA;AAAA,OAEH,CAAA,mBAEAzB,cAAAA,CAAC+D,qBAAA,EAAA,EAAY,SAAO,IAAA,EACnB,QAAA,kBAAA/D,cAAAA,CAACyB,gBAAAA,EAAA,EAAO,OAAA,EAAQ,SAAA,EAAU,QAAA,EAAU,QAAA,EAClC,sBACF,CAAA,EACD,CAAA;AAAA,oBAEDzB,cAAAA;AAAA,MAACyB,gBAAAA;AAAA,MAAA;AAAA,QACA,OAAA,EAAS,YAAA;AAAA,QACT,QAAA,EAAU,CAAC,WAAA,IAAe,QAAA,IAAY,UAAU,IAAA,KAAS,SAAA;AAAA,QACzD,IAAA,EAAM,WAAW,IAAA,GAAO,SAAA;AAAA,QACxB,SAAA,EAAW,WAAW,QAAA,GAAW,EAAA;AAAA,QAEhC,QAAA,EAAA,QAAA,mBACA1B,eAAAA,CAAAkC,mBAAAA,EAAA,EACC,QAAA,EAAA;AAAA,0BAAAjC,cAAAA;AAAA,YAACK,mBAAAA;AAAA,YAAA;AAAA,cACA,SAAA,EAAW,EAAA;AAAA,gBACV,mBAAA;AAAA,gBACA,WAAW,SAAA,GAAY;AAAA;AACxB;AAAA,WACD;AAAA,UACC;AAAA,SAAA,EACF,IACG,QAAA,EAAU,IAAA,KAAS,4BACtBN,eAAAA,CAAAkC,qBAAA,EACC,QAAA,EAAA;AAAA,0BAAAjC,cAAAA,CAAC6D,qBAAM,SAAA,EAAW,EAAA,CAAG,QAAQ,QAAA,GAAW,SAAA,GAAY,SAAS,CAAA,EAAG,CAAA;AAAA,UAC/D;AAAA,SAAA,EACF,CAAA,GAEA;AAAA;AAAA;AAEF,GAAA,EACD,CAAA;AAID,EAAA,IAAI,QAAA,EAAU;AACb,IAAA,uBACC9D,eAAAA,CAAAkC,mBAAAA,EAAA,EACE,QAAA,EAAA;AAAA,MAAA,aAAA;AAAA,sBACDjC,cAAAA,CAACgE,gBAAA,EAAA,EAAO,IAAA,EAAM,MAAA,EAAQ,YAAA,EAAc,gBAAA,EACnC,QAAA,kBAAAjE,eAAAA,CAACkE,uBAAA,EAAA,EAAc,SAAA,EAAU,cAAA,EACxB,QAAA,EAAA;AAAA,wBAAAjE,cAAAA,CAACkE,sBAAA,EAAA,EAAa,SAAA,EAAU,aAAA,EACvB,QAAA,kBAAAlE,eAACmE,qBAAA,EAAA,EAAY,SAAA,EAAU,SAAA,EAAW,QAAA,EAAA,WAAA,EAAY,CAAA,EAC/C,CAAA;AAAA,wBACAnE,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6BAA6B,QAAA,EAAA,aAAA,EAAc,CAAA;AAAA,wBAC1DA,cAAAA,CAACoE,sBAAA,EAAA,EAAa,SAAA,EAAU,4BACtB,QAAA,EAAA,aAAA,EACF;AAAA,OAAA,EACD,CAAA,EACD;AAAA,KAAA,EACD,CAAA;AAAA,EAEF;AAGA,EAAA,uBACCrE,eAAAA,CAAAkC,mBAAAA,EAAA,EACE,QAAA,EAAA;AAAA,IAAA,aAAA;AAAA,oBACDjC,cAAAA,CAACqE,gBAAA,EAAA,EAAO,IAAA,EAAM,MAAA,EAAQ,YAAA,EAAc,gBAAA,EACnC,QAAA,kBAAAtE,eAAAA,CAACuE,uBAAA,EAAA,EAAc,SAAA,EAAU,aAAA,EACxB,QAAA,EAAA;AAAA,sBAAAtE,eAACuE,sBAAA,EAAA,EACA,QAAA,kBAAAvE,cAAAA,CAACwE,qBAAA,EAAA,EAAa,uBAAY,CAAA,EAC3B,CAAA;AAAA,sBACAxE,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4BAA4B,QAAA,EAAA,aAAA,EAAc,CAAA;AAAA,sBACzDA,cAAAA,CAACyE,sBAAA,EAAA,EAAa,SAAA,EAAU,YAAY,QAAA,EAAA,aAAA,EAAc;AAAA,KAAA,EACnD,CAAA,EACD;AAAA,GAAA,EACD,CAAA;AAEF;;;ACpWO,SAAS,UAAA,CAAW,UAAkB,QAAA,EAA+B;AAC3E,EAAA,IAAI,YAAY,CAAA,EAAG;AAClB,IAAA,MAAM,IAAI,MAAM,iCAAiC,CAAA;AAAA,EAClD;AACA,EAAA,IAAI,YAAY,CAAA,EAAG;AAClB,IAAA,OAAO,CAAC,EAAE,UAAA,EAAY,CAAA,EAAG,OAAO,CAAA,EAAG,GAAA,EAAK,GAAG,CAAA;AAAA,EAC5C;AACA,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,IAAA,CAAK,QAAA,GAAW,QAAQ,CAAA;AAC3C,EAAA,OAAO,KAAA,CAAM,KAAK,EAAE,MAAA,EAAQ,OAAM,EAAG,CAAC,GAAG,KAAA,KAAU;AAClD,IAAA,MAAM,QAAQ,KAAA,GAAQ,QAAA;AACtB,IAAA,OAAO;AAAA,MACN,YAAY,KAAA,GAAQ,CAAA;AAAA,MACpB,KAAA;AAAA,MACA,GAAA,EAAK,IAAA,CAAK,GAAA,CAAI,QAAA,EAAU,QAAQ,QAAQ;AAAA,KACzC;AAAA,EACD,CAAC,CAAA;AACF;AAEA,IAAM,aAAa,CAAC,GAAA,EAAK,IAAA,EAAM,IAAA,EAAM,MAAM,IAAI,CAAA;AAExC,SAAS,kBAAkB,KAAA,EAAuB;AACxD,EAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA,IAAK,SAAS,CAAA,EAAG;AAC1C,IAAA,OAAO,KAAA;AAAA,EACR;AACA,EAAA,IAAI,KAAA,GAAQ,KAAA;AACZ,EAAA,IAAI,IAAA,GAAO,CAAA;AACX,EAAA,OAAO,KAAA,IAAS,IAAA,IAAQ,IAAA,GAAO,UAAA,CAAW,SAAS,CAAA,EAAG;AACrD,IAAA,KAAA,IAAS,IAAA;AACT,IAAA,IAAA,IAAQ,CAAA;AAAA,EACT;AACA,EAAA,IAAI,IAAA,KAAS,CAAA,IAAK,KAAA,IAAS,EAAA,EAAI;AAC9B,IAAA,OAAO,CAAA,EAAG,KAAK,KAAA,CAAM,KAAK,CAAC,CAAA,CAAA,EAAI,UAAA,CAAW,IAAI,CAAC,CAAA,CAAA;AAAA,EAChD;AACA,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,KAAA,GAAQ,EAAE,CAAA,GAAI,EAAA;AACxC,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,SAAA,CAAU,MAAM,CAAA,GAAI,OAAO,MAAM,CAAA,GAAI,MAAA,CAAO,OAAA,CAAQ,CAAC,CAAA;AAC1E,EAAA,OAAO,CAAA,EAAG,KAAK,CAAA,CAAA,EAAI,UAAA,CAAW,IAAI,CAAC,CAAA,CAAA;AACpC;AAEO,SAAS,iBAAA,CACf,QACA,KAAA,EACqD;AACrD,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,KAAK,CAAA;AACnC,EAAA,MAAM,UAAA,GAAa,KAAK,GAAA,CAAI,IAAA,CAAK,IAAI,CAAA,EAAG,MAAM,GAAG,SAAS,CAAA;AAC1D,EAAA,MAAM,OAAA,GACL,YAAY,CAAA,GAAI,IAAA,CAAK,MAAO,UAAA,GAAa,SAAA,GAAa,GAAG,CAAA,GAAI,CAAA;AAC9D,EAAA,OAAO,EAAE,MAAA,EAAQ,UAAA,EAAY,KAAA,EAAO,WAAW,OAAA,EAAQ;AACxD;AAEO,SAAS,iBAAA,CAAkB,MAAY,MAAA,EAA0B;AACvE,EAAA,IAAI,CAAC,MAAA,EAAQ,IAAA,EAAK,EAAG,OAAO,IAAA;AAC5B,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,IAAA,CAAK,WAAA,EAAY;AACnC,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,IAAA,CAAK,WAAA,EAAY;AACnC,EAAA,OAAO,OAAO,KAAA,CAAM,GAAG,CAAA,CAAE,IAAA,CAAK,CAAC,KAAA,KAAU;AACxC,IAAA,MAAM,OAAA,GAAU,KAAA,CAAM,IAAA,EAAK,CAAE,WAAA,EAAY;AACzC,IAAA,IAAI,CAAC,SAAS,OAAO,KAAA;AACrB,IAAA,IAAI,OAAA,CAAQ,QAAA,CAAS,IAAI,CAAA,EAAG;AAC3B,MAAA,OAAO,KAAK,UAAA,CAAW,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA;AAAA,IAC5C;AACA,IAAA,IAAI,OAAA,CAAQ,UAAA,CAAW,GAAG,CAAA,EAAG;AAC5B,MAAA,OAAO,IAAA,CAAK,SAAS,OAAO,CAAA;AAAA,IAC7B;AACA,IAAA,OAAO,IAAA,KAAS,OAAA;AAAA,EACjB,CAAC,CAAA;AACF;;;ACXO,IAAM,4BAAA,GAAmD;AAAA,EAC/D,IAAA,EAAM,4BAAA;AAAA,EACN,IAAA,EAAM,uCAAA;AAAA,EACN,MAAA,EAAQ,QAAA;AAAA,EACR,UAAA,EAAY,+BAAA;AAAA,EACZ,UAAA,EAAY;AACb;AAEO,IAAM,+BAAA,GAAwD;AAAA,EACpE,KAAA,EAAO,SAAA;AAAA,EACP,KAAA,EAAO,OAAA;AAAA,EACP,MAAA,EAAQ,QAAA;AAAA,EACR,MAAA,EAAQ,QAAA;AAAA,EACR,SAAA,EAAW,WAAA;AAAA,EACX,MAAA,EAAQ,QAAA;AAAA,EACR,UAAA,EAAY,WAAA;AAAA,EACZ,SAAA,EAAW,UAAA;AAAA,EACX,SAAA,EAAW,WAAA;AAAA,EACX,KAAA,EAAO;AACR;AAEO,IAAM,0BAAA,GAA6B;AAAA,EACzC,QAAA,EAAU,4BAAA;AAAA,EACV,IAAA,EAAM;AACP;AC3DO,SAAS,YAAA,CAAa;AAAA,EAC5B,MAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA,GAAW,KAAA;AAAA,EACX,MAAA,EAAQ,cAAA;AAAA,EACR,MAAA;AAAA,EACA,QAAA;AAAA,EACA;AACD,CAAA,EAAsB;AACrB,EAAA,MAAM,MAAA,GAAS,EAAE,GAAG,4BAAA,EAA8B,GAAG,cAAA,EAAe;AACpE,EAAA,MAAM,UAAU3C,WAAAA,EAAM;AACtB,EAAA,MAAM,QAAA,GAAWD,aAAyB,IAAI,CAAA;AAC9C,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAID,eAAS,KAAK,CAAA;AAC9C,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,eAAwB,IAAI,CAAA;AAE1D,EAAA,SAAS,SAAS,IAAA,EAAwB;AACzC,IAAA,IAAI,CAAC,QAAQ,QAAA,EAAU;AACvB,IAAA,IAAI,CAAC,iBAAA,CAAkB,IAAA,EAAM,MAAM,CAAA,EAAG;AACrC,MAAA,UAAA,CAAW,OAAO,UAAU,CAAA;AAC5B,MAAA,QAAA,GAAW,MAAM,CAAA;AACjB,MAAA;AAAA,IACD;AACA,IAAA,IAAI,OAAA,IAAW,IAAA,IAAQ,IAAA,CAAK,IAAA,GAAO,OAAA,EAAS;AAC3C,MAAA,UAAA,CAAW,OAAO,UAAU,CAAA;AAC5B,MAAA,QAAA,GAAW,MAAM,CAAA;AACjB,MAAA;AAAA,IACD;AACA,IAAA,UAAA,CAAW,IAAI,CAAA;AACf,IAAA,MAAA,CAAO,IAAI,CAAA;AAAA,EACZ;AAEA,EAAA,SAAS,OAAO,KAAA,EAAkC;AACjD,IAAA,KAAA,CAAM,cAAA,EAAe;AACrB,IAAA,WAAA,CAAY,KAAK,CAAA;AACjB,IAAA,QAAA,CAAS,KAAA,CAAM,YAAA,CAAa,KAAA,CAAM,CAAC,CAAC,CAAA;AAAA,EACrC;AAEA,EAAA,SAAS,UAAU,KAAA,EAAsC;AACxD,IAAA,IAAI,QAAA,EAAU;AACd,IAAA,IAAI,KAAA,CAAM,GAAA,KAAQ,OAAA,IAAW,KAAA,CAAM,QAAQ,GAAA,EAAK;AAC/C,MAAA,KAAA,CAAM,cAAA,EAAe;AACrB,MAAA,QAAA,CAAS,SAAS,KAAA,EAAM;AAAA,IACzB;AAAA,EACD;AAEA,EAAA,uBACC7B,eAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACA,SAAA,EAAW,EAAA,CAAG,6CAAA,EAA+C,SAAS,CAAA;AAAA,MAEtE,QAAA,EAAA;AAAA,wBAAAA,eAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACA,IAAA,EAAK,QAAA;AAAA,YACL,QAAA,EAAU,WAAW,EAAA,GAAK,CAAA;AAAA,YAC1B,eAAA,EAAe,QAAA;AAAA,YACf,oBAAkB,OAAA,GAAU,CAAA,EAAG,OAAO,CAAA,QAAA,CAAA,GAAa,GAAG,OAAO,CAAA,KAAA,CAAA;AAAA,YAC7D,eAAA,EAAe,OAAA;AAAA,YACf,iBAAe,QAAA,IAAY,MAAA;AAAA,YAC3B,SAAA,EAAW,EAAA;AAAA,cACV,4LAAA;AAAA,cACA,QAAA,IAAY,6BAAA;AAAA,cACZ,QAAA,IAAY;AAAA,aACb;AAAA,YACA,SAAS,MAAM;AACd,cAAA,IAAI,CAAC,QAAA,EAAU,QAAA,CAAS,OAAA,EAAS,KAAA,EAAM;AAAA,YACxC,CAAA;AAAA,YACA,SAAA;AAAA,YACA,WAAA,EAAa,CAAC,KAAA,KAAU;AACvB,cAAA,KAAA,CAAM,cAAA,EAAe;AACrB,cAAA,IAAI,CAAC,QAAA,EAAU,WAAA,CAAY,IAAI,CAAA;AAAA,YAChC,CAAA;AAAA,YACA,UAAA,EAAY,CAAC,KAAA,KAAU;AACtB,cAAA,KAAA,CAAM,cAAA,EAAe;AAAA,YACtB,CAAA;AAAA,YACA,WAAA,EAAa,CAAC,KAAA,KAAU;AACvB,cAAA,IAAI,KAAA,CAAM,aAAA,CAAc,QAAA,CAAS,KAAA,CAAM,aAAqB,CAAA,EAAG;AAC9D,gBAAA;AAAA,cACD;AACA,cAAA,WAAA,CAAY,KAAK,CAAA;AAAA,YAClB,CAAA;AAAA,YACA,MAAA;AAAA,YAEA,QAAA,EAAA;AAAA,8BAAAC,cAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,qBAAA,EAAuB,iBAAO,IAAA,EAAK,CAAA;AAAA,8BAChDA,cAAAA;AAAA,gBAAC,GAAA;AAAA,gBAAA;AAAA,kBACA,EAAA,EAAI,GAAG,OAAO,CAAA,KAAA,CAAA;AAAA,kBACd,SAAA,EAAU,oCAAA;AAAA,kBAET,QAAA,EAAA,MAAA,CAAO;AAAA;AAAA,eACT;AAAA,8BACAA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,sEAAA,EACd,iBAAO,MAAA,EACT;AAAA;AAAA;AAAA,SACD;AAAA,wBACAA,cAAAA;AAAA,UAAC,OAAA;AAAA,UAAA;AAAA,YACA,EAAA,EAAI,OAAA;AAAA,YACJ,GAAA,EAAK,QAAA;AAAA,YACL,IAAA,EAAK,MAAA;AAAA,YACL,MAAA;AAAA,YACA,QAAA;AAAA,YACA,cAAY,MAAA,CAAO,MAAA;AAAA,YACnB,SAAA,EAAU,SAAA;AAAA,YACV,QAAA,EAAU,CAAC,KAAA,KAAU;AACpB,cAAA,QAAA,CAAS,KAAA,CAAM,MAAA,CAAO,KAAA,GAAQ,CAAC,CAAC,CAAA;AAChC,cAAA,KAAA,CAAM,OAAO,KAAA,GAAQ,EAAA;AAAA,YACtB;AAAA;AAAA,SACD;AAAA,QACC,0BACAA,cAAAA;AAAA,UAAC,GAAA;AAAA,UAAA;AAAA,YACA,EAAA,EAAI,GAAG,OAAO,CAAA,QAAA,CAAA;AAAA,YACd,IAAA,EAAK,OAAA;AAAA,YACL,SAAA,EAAU,0BAAA;AAAA,YAET,QAAA,EAAA;AAAA;AAAA,SACF,GACG;AAAA;AAAA;AAAA,GACL;AAEF;ACrHA,SAAS,WAAA,CACR,QACA,MAAA,EACS;AACT,EAAA,QAAQ,MAAA;AAAQ,IACf,KAAK,WAAA;AACJ,MAAA,OAAO,MAAA,CAAO,SAAA;AAAA,IACf,KAAK,QAAA;AACJ,MAAA,OAAO,MAAA,CAAO,MAAA;AAAA,IACf,KAAK,YAAA;AACJ,MAAA,OAAO,MAAA,CAAO,UAAA;AAAA,IACf,KAAK,WAAA;AACJ,MAAA,OAAO,MAAA,CAAO,SAAA;AAAA,IACf,KAAK,WAAA;AACJ,MAAA,OAAO,MAAA,CAAO,SAAA;AAAA,IACf,KAAK,OAAA;AACJ,MAAA,OAAO,MAAA,CAAO,KAAA;AAAA,IACf,SAAS;AACR,MAAA,MAAM,WAAA,GAAqB,MAAA;AAC3B,MAAA,OAAO,WAAA;AAAA,IACR;AAAA;AAEF;AAEA,SAAS,cAAc,GAAA,EAAwB;AAC9C,EAAA,OAAO,CAAA,EAAG,GAAA,CAAI,OAAO,CAAA,OAAA,EAAO,iBAAA,CAAkB,GAAA,CAAI,MAAM,CAAC,CAAA,GAAA,EAAM,iBAAA,CAAkB,GAAA,CAAI,KAAK,CAAC,CAAA,CAAA;AAC5F;AAEO,SAAS,cAAA,CAAe;AAAA,EAC9B,IAAA;AAAA,EACA,MAAA,EAAQ,cAAA;AAAA,EACR,OAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA;AACD,CAAA,EAAwB;AACvB,EAAA,MAAM,MAAA,GAAS,EAAE,GAAG,+BAAA,EAAiC,GAAG,cAAA,EAAe;AACvE,EAAA,MAAM,UAAU,IAAA,CAAK,MAAA,CAAO,CAAC,GAAA,KAAQ,GAAA,CAAI,WAAW,WAAW,CAAA;AAC/D,EAAA,IAAI,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAEjC,EAAA,uBACCA,cAAAA;AAAA,IAAC,SAAA;AAAA,IAAA;AAAA,MACA,cAAY,MAAA,CAAO,KAAA;AAAA,MACnB,SAAA,EAAW,EAAA,CAAG,oBAAA,EAAsB,SAAS,CAAA;AAAA,MAE7C,QAAA,kBAAAA,eAAC,IAAA,EAAA,EAAG,SAAA,EAAU,sBACZ,QAAA,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAC,GAAA,KAAQ;AACrB,QAAA,MAAM,MAAA,GACL,GAAA,CAAI,MAAA,KAAW,WAAA,IAAe,IAAI,MAAA,KAAW,YAAA;AAC9C,QAAA,MAAM,QAAA,GAAW,IAAI,MAAA,KAAW,WAAA;AAChC,QAAA,MAAM,SAAA,GAAY,IAAI,MAAA,KAAW,QAAA;AACjC,QAAA,MAAM,SAAA,GACL,IAAI,MAAA,KAAW,WAAA,IACf,IAAI,MAAA,KAAW,QAAA,IACf,IAAI,MAAA,KAAW,OAAA;AAChB,QAAA,uBACCD,eAAAA,CAAC,IAAA,EAAA,EAAgB,SAAA,EAAU,sBAAA,EAC1B,QAAA,EAAA;AAAA,0BAAAC,cAAAA;AAAA,YAAC,GAAA;AAAA,YAAA;AAAA,cACA,SAAA,EAAU,8DAAA;AAAA,cACV,OAAO,GAAA,CAAI,IAAA;AAAA,cAEV,QAAA,EAAA,GAAA,CAAI;AAAA;AAAA,WACN;AAAA,0BACAD,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iCAAA,EACd,QAAA,EAAA;AAAA,4BAAAC,cAAAA,CAAC,OAAE,SAAA,EAAU,wCAAA,EACX,sBAAY,GAAA,CAAI,MAAA,EAAQ,MAAM,CAAA,EAChC,CAAA;AAAA,4BACAA,cAAAA,CAAC,GAAA,EAAA,EAAE,WAAU,qDAAA,EACX,QAAA,EAAA,aAAA,CAAc,GAAG,CAAA,EACnB,CAAA;AAAA,4BACAA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gBAAA,EAAiB,CAAA;AAAA,YAChC,2BACAA,cAAAA;AAAA,cAACyB,gBAAAA;AAAA,cAAA;AAAA,gBACA,IAAA,EAAK,QAAA;AAAA,gBACL,OAAA,EAAQ,OAAA;AAAA,gBACR,IAAA,EAAK,SAAA;AAAA,gBACL,SAAA,EAAU,UAAA;AAAA,gBACV,cAAY,CAAA,EAAG,MAAA,CAAO,KAAK,CAAA,CAAA,EAAI,IAAI,IAAI,CAAA,CAAA;AAAA,gBACvC,OAAA,EAAS,MAAM,OAAA,CAAQ,GAAA,CAAI,EAAE,CAAA;AAAA,gBAE7B,QAAA,kBAAAzB,eAAC0E,iBAAA,EAAA,EAAM;AAAA;AAAA,aACR,GACG,IAAA;AAAA,YACH,4BACA1E,cAAAA;AAAA,cAACyB,gBAAAA;AAAA,cAAA;AAAA,gBACA,IAAA,EAAK,QAAA;AAAA,gBACL,OAAA,EAAQ,OAAA;AAAA,gBACR,IAAA,EAAK,SAAA;AAAA,gBACL,SAAA,EAAU,UAAA;AAAA,gBACV,cAAY,CAAA,EAAG,MAAA,CAAO,MAAM,CAAA,CAAA,EAAI,IAAI,IAAI,CAAA,CAAA;AAAA,gBACxC,OAAA,EAAS,MAAM,QAAA,CAAS,GAAA,CAAI,EAAE,CAAA;AAAA,gBAE9B,QAAA,kBAAAzB,eAAC2E,gBAAA,EAAA,EAAK;AAAA;AAAA,aACP,GACG,IAAA;AAAA,YACH,4BACA3E,cAAAA;AAAA,cAACyB,gBAAAA;AAAA,cAAA;AAAA,gBACA,IAAA,EAAK,QAAA;AAAA,gBACL,OAAA,EAAQ,OAAA;AAAA,gBACR,IAAA,EAAK,SAAA;AAAA,gBACL,SAAA,EAAU,UAAA;AAAA,gBACV,cAAY,CAAA,EAAG,MAAA,CAAO,MAAM,CAAA,CAAA,EAAI,IAAI,IAAI,CAAA,CAAA;AAAA,gBACxC,OAAA,EAAS,MAAM,QAAA,CAAS,GAAA,CAAI,EAAE,CAAA;AAAA,gBAE9B,QAAA,kBAAAzB,cAAAA,CAACwD,aAAAA,EAAA,EAAE;AAAA;AAAA,aACJ,GACG;AAAA,WAAA,EACL,CAAA;AAAA,0BACAxD,cAAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACA,IAAA,EAAK,aAAA;AAAA,cACL,eAAA,EAAe,CAAA;AAAA,cACf,eAAA,EAAe,GAAA;AAAA,cACf,iBAAe,GAAA,CAAI,OAAA;AAAA,cACnB,cAAY,GAAA,CAAI,IAAA;AAAA,cAChB,SAAA,EAAU,2CAAA;AAAA,cAEV,QAAA,kBAAAA,cAAAA;AAAA,gBAAC,KAAA;AAAA,gBAAA;AAAA,kBACA,SAAA,EAAW,EAAA;AAAA,oBACV,mBAAA;AAAA,oBACA,MAAA,IAAU;AAAA,mBACX;AAAA,kBACA,OAAO,EAAE,KAAA,EAAO,CAAA,EAAG,GAAA,CAAI,OAAO,CAAA,CAAA,CAAA;AAAI;AAAA;AACnC;AAAA,WACD;AAAA,UACC,GAAA,CAAI,KAAA,mBACJA,cAAAA,CAAC,GAAA,EAAA,EAAE,IAAA,EAAK,OAAA,EAAQ,SAAA,EAAU,0BAAA,EACxB,QAAA,EAAA,GAAA,CAAI,KAAA,EACN,CAAA,GACG;AAAA,SAAA,EAAA,EAxEI,IAAI,EAyEb,CAAA;AAAA,MAEF,CAAC,CAAA,EACF;AAAA;AAAA,GACD;AAEF;AC9HA,SAAS,kBAAkB,KAAA,EAAuB;AACjD,EAAA,OAAO,KAAA,GAAQ,CAAA,GAAI,IAAA,GAAO,MAAA,CAAO,KAAK,CAAA;AACvC;AAEA,SAAS,eAAe,MAAA,EAAsC;AAC7D,EAAA,OACC,MAAA,KAAW,WAAA,IAAe,MAAA,KAAW,QAAA,IAAY,MAAA,KAAW,YAAA;AAE9D;AAEO,SAAS,cAAA,CAAe;AAAA,EAC9B,IAAA;AAAA,EACA,MAAA,EAAQ,cAAA;AAAA,EACR,OAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,IAAA;AAAA,EACA,YAAA;AAAA,EACA,KAAA,GAAQ,KAAA;AAAA,EACR;AACD,CAAA,EAAwB;AACvB,EAAA,MAAM,MAAA,GAAS,EAAE,GAAG,+BAAA,EAAiC,GAAG,cAAA,EAAe;AACvE,EAAA,MAAM,UAAU,IAAA,CAAK,MAAA,CAAO,CAAC,GAAA,KAAQ,GAAA,CAAI,WAAW,WAAW,CAAA;AAC/D,EAAA,MAAM,CAAC,gBAAA,EAAkB,mBAAmB,CAAA,GAAI4B,eAAS,KAAK,CAAA;AAC9D,EAAA,MAAM,eAAe,IAAA,KAAS,MAAA;AAC9B,EAAA,MAAM,YAAA,GAAe,eAAe,IAAA,GAAO,gBAAA;AAE3C,EAAA,SAAS,gBAAgB,IAAA,EAAe;AACvC,IAAA,IAAI,CAAC,YAAA,EAAc,mBAAA,CAAoB,IAAI,CAAA;AAC3C,IAAA,YAAA,GAAe,IAAI,CAAA;AAAA,EACpB;AAEA,EAAA,IAAI,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAEjC,EAAA,MAAM,cAAc,OAAA,CAAQ,MAAA;AAAA,IAAO,CAAC,GAAA,KACnC,cAAA,CAAe,GAAA,CAAI,MAAM;AAAA,GAC1B,CAAE,MAAA;AAEF,EAAA,uBACC7B,eAAAA,CAACwB,4BAAAA,EAAA,EAAa,IAAA,EAAM,YAAA,EAAc,cAAc,eAAA,EAC/C,QAAA,EAAA;AAAA,oBAAAxB,eAAAA;AAAA,MAACyB,mCAAAA;AAAA,MAAA;AAAA,QACA,wBACCxB,cAAAA;AAAA,UAACyB,gBAAAA;AAAA,UAAA;AAAA,YACA,IAAA,EAAK,QAAA;AAAA,YACL,OAAA,EAAQ,OAAA;AAAA,YACR,IAAA,EAAK,MAAA;AAAA,YACL,SAAA,EAAW,EAAA,CAAG,iBAAA,EAAmB,SAAS,CAAA;AAAA,YAC1C,cAAY,MAAA,CAAO;AAAA;AAAA,SACpB;AAAA,QAGD,QAAA,EAAA;AAAA,0BAAAzB,cAAAA,CAAC8C,kBAAAA,EAAA,EAAO,SAAA,EAAU,QAAA,EAAS,CAAA;AAAA,UAC1B,WAAA,GAAc,CAAA,mBACd9C,cAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,gLAAA,EACd,QAAA,EAAA,iBAAA,CAAkB,WAAW,CAAA,EAC/B,CAAA,GACG;AAAA;AAAA;AAAA,KACL;AAAA,oBACAD,eAAAA;AAAA,MAAC4B,mCAAAA;AAAA,MAAA;AAAA,QACA,KAAA;AAAA,QACA,SAAA,EAAU,6DAAA;AAAA,QAEV,QAAA,EAAA;AAAA,0BAAA3B,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sDAAA,EACd,QAAA,kBAAAA,cAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,eAAA,EAAiB,QAAA,EAAA,MAAA,CAAO,KAAA,EAAM,CAAA,EAC7C,CAAA;AAAA,0BACAA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0DACd,QAAA,kBAAAA,cAAAA;AAAA,YAAC,cAAA;AAAA,YAAA;AAAA,cACA,IAAA,EAAM,OAAA;AAAA,cACN,MAAA;AAAA,cACA,OAAA;AAAA,cACA,QAAA;AAAA,cACA;AAAA;AAAA,WACD,EACD;AAAA;AAAA;AAAA;AACD,GAAA,EACD,CAAA;AAEF;;;ACpGA,IAAM,aAAA,GAAgB,CAAA;AACtB,IAAM,qBAAA,GAAwB,CAAC,GAAA,EAAK,IAAI,CAAA;AAoBxC,SAAS,aAAa,EAAA,EAA2B;AAChD,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,KAAY;AAC/B,IAAA,UAAA,CAAW,SAAS,EAAE,CAAA;AAAA,EACvB,CAAC,CAAA;AACF;AAEA,SAAS,aAAa,KAAA,EAAyB;AAC9C,EAAA,OAAO,KAAA,YAAiB,YAAA,IAAgB,KAAA,CAAM,IAAA,KAAS,YAAA;AACxD;AAEA,SAAS,mBAAmB,KAAA,EAAyB;AACpD,EAAA,OAAO,KAAA,YAAiB,KAAA,IAAS,KAAA,CAAM,OAAA,CAAQ,SAAS,cAAc,CAAA;AACvE;AAEA,SAAS,kBAAkB,MAAA,EAAyB;AACnD,EAAA,OACC,MAAA,KAAW,KACX,MAAA,KAAW,GAAA,IACX,WAAW,GAAA,IACX,MAAA,KAAW,OACX,MAAA,IAAU,GAAA;AAEZ;AAEA,SAAS,cAAA,CAAe,YAAoB,MAAA,EAAuB;AAClE,EAAA,OAAO,IAAI,KAAA,CAAM,CAAA,oBAAA,EAAuB,UAAU,CAAA,SAAA,EAAY,MAAM,CAAA,CAAA,CAAG,CAAA;AACxE;AAEA,SAAS,eAAe,KAAA,EAA+B;AACtD,EAAA,IAAI,EAAE,KAAA,YAAiB,KAAA,CAAA,EAAQ,OAAO,IAAA;AACtC,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,OAAA,CAAQ,KAAA,CAAM,iBAAiB,CAAA;AACnD,EAAA,IAAI,CAAC,KAAA,GAAQ,CAAC,CAAA,EAAG,OAAO,IAAA;AACxB,EAAA,OAAO,MAAA,CAAO,KAAA,CAAM,CAAC,CAAC,CAAA;AACvB;AAEA,SAAS,oBAAoB,KAAA,EAAyB;AACrD,EAAA,IAAI,aAAa,KAAK,CAAA,IAAK,kBAAA,CAAmB,KAAK,GAAG,OAAO,KAAA;AAC7D,EAAA,MAAM,MAAA,GAAS,eAAe,KAAK,CAAA;AACnC,EAAA,IAAI,MAAA,KAAW,MAAM,OAAO,KAAA;AAC5B,EAAA,OAAO,kBAAkB,MAAM,CAAA;AAChC;AAEA,SAAS,SAAS,GAAA,EAA6B;AAC9C,EAAA,MAAM,GAAA,GACL,IAAI,iBAAA,CAAkB,MAAM,KAAK,GAAA,CAAI,iBAAA,CAAkB,MAAM,CAAA,IAAK,EAAA;AACnE,EAAA,MAAM,IAAA,GAAO,IAAI,IAAA,EAAK;AACtB,EAAA,IAAI,CAAC,IAAA,EAAM;AACV,IAAA,MAAM,IAAI,MAAM,0BAA0B,CAAA;AAAA,EAC3C;AACA,EAAA,OAAO,IAAA;AACR;AAEA,SAAS,QAAQ,KAAA,EAMG;AACnB,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAA,KAAW;AACvC,IAAA,KAAA,CAAM,GAAA,CAAI,IAAA,CAAK,KAAA,EAAO,KAAA,CAAM,GAAG,CAAA;AAC/B,IAAA,KAAA,CAAM,GAAA,CAAI,MAAA,CAAO,UAAA,GAAa,CAAC,KAAA,KAAU;AACxC,MAAA,KAAA,CAAM,UAAA,CAAW,MAAM,MAAM,CAAA;AAAA,IAC9B,CAAA;AACA,IAAA,KAAA,CAAM,GAAA,CAAI,SAAS,MAAM;AACxB,MAAA,IAAI,MAAM,GAAA,CAAI,MAAA,IAAU,OAAO,KAAA,CAAM,GAAA,CAAI,SAAS,GAAA,EAAK;AACtD,QAAA,IAAI;AACH,UAAA,OAAA,CAAQ,QAAA,CAAS,KAAA,CAAM,GAAG,CAAC,CAAA;AAAA,QAC5B,SAAS,KAAA,EAAO;AACf,UAAA,MAAA,CAAO,KAAK,CAAA;AAAA,QACb;AACA,QAAA;AAAA,MACD;AACA,MAAA,MAAA,CAAO,eAAe,KAAA,CAAM,UAAA,EAAY,KAAA,CAAM,GAAA,CAAI,MAAM,CAAC,CAAA;AAAA,IAC1D,CAAA;AACA,IAAA,KAAA,CAAM,GAAA,CAAI,UAAU,MAAM;AACzB,MAAA,MAAA,CAAO,cAAA,CAAe,KAAA,CAAM,UAAA,EAAY,CAAC,CAAC,CAAA;AAAA,IAC3C,CAAA;AACA,IAAA,KAAA,CAAM,GAAA,CAAI,UAAU,MAAM;AACzB,MAAA,MAAA,CAAO,IAAI,YAAA,CAAa,4BAAA,EAA8B,YAAY,CAAC,CAAA;AAAA,IACpE,CAAA;AACA,IAAA,KAAA,CAAM,GAAA,CAAI,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAAA,EAC1B,CAAC,CAAA;AACF;AAEO,SAAS,gCACf,OAAA,EAC4B;AAC5B,EAAA,MAAM,SAAS,UAAA,CAAW,OAAA,CAAQ,IAAA,CAAK,IAAA,EAAM,QAAQ,QAAQ,CAAA;AAC7D,EAAA,MAAM,KAAA,GAAQ,QAAQ,KAAA,IAAS,YAAA;AAC/B,EAAA,MAAM,KAAA,GAAQ,EAAE,MAAA,EAAQ,MAAA,EAAiC;AACzD,EAAA,MAAM,MAAA,uBAAa,GAAA,EAAiC;AACpD,EAAA,KAAA,MAAW,IAAA,IAAQ,OAAA,CAAQ,cAAA,IAAkB,EAAC,EAAG;AAChD,IAAA,IAAI,KAAK,UAAA,GAAa,CAAA,IAAK,IAAA,CAAK,UAAA,GAAa,OAAO,MAAA,EAAQ;AAC5D,IAAA,MAAA,CAAO,GAAA,CAAI,IAAA,CAAK,UAAA,EAAY,IAAI,CAAA;AAAA,EACjC;AACA,EAAA,MAAM,YAAmC,CAAC,GAAG,MAAA,CAAO,MAAA,EAAQ,CAAA,CAAE,IAAA;AAAA,IAC7D,CAAC,IAAA,EAAM,KAAA,KAAU,IAAA,CAAK,aAAa,KAAA,CAAM;AAAA,GAC1C;AACA,EAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,SAAA,CAAU,IAAI,CAAC,IAAA,KAAS,IAAA,CAAK,UAAU,CAAC,CAAA;AAC7D,EAAA,IAAI,UAAA,GAAoC,IAAA;AACxC,EAAA,IAAI,GAAA,GAA4B,IAAA;AAChC,EAAA,IAAI,WAAA,GAAc,MAAA,CAAO,SAAA,CAAU,CAAC,KAAA,KAAU,CAAC,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,UAAU,CAAC,CAAA;AACzE,EAAA,IAAI,WAAA,GAAc,CAAA,EAAG,WAAA,GAAc,MAAA,CAAO,MAAA;AAE1C,EAAA,SAAS,aAAA,GAAwC;AAChD,IAAA,OAAO,KAAA,CAAM,MAAA;AAAA,EACd;AAEA,EAAA,SAAS,SAAA,GAAqB;AAC7B,IAAA,MAAM,SAAS,aAAA,EAAc;AAC7B,IAAA,OAAO,MAAA,KAAW,YAAY,MAAA,KAAW,WAAA;AAAA,EAC1C;AAEA,EAAA,SAAS,YAAA,CAAa,oBAAoB,CAAA,EAAG;AAC5C,IAAA,MAAM,cAAA,GAAiB,SAAA,CAAU,MAAA,CAAO,CAAC,KAAK,IAAA,KAAS;AACtD,MAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,IAAA,CAAK,UAAA,GAAa,CAAC,CAAA;AACxC,MAAA,OAAO,GAAA,IAAO,KAAA,GAAQ,KAAA,CAAM,GAAA,GAAM,MAAM,KAAA,GAAQ,CAAA,CAAA;AAAA,IACjD,GAAG,CAAC,CAAA;AACJ,IAAA,OAAA,CAAQ,UAAA;AAAA,MACP,iBAAA,CAAkB,cAAA,GAAiB,iBAAA,EAAmB,OAAA,CAAQ,KAAK,IAAI;AAAA,KACxE;AAAA,EACD;AAEA,EAAA,eAAe,gBAAA,CACd,YACA,IAAA,EACkB;AAClB,IAAA,IAAI,SAAA;AACJ,IAAA,KAAA,IAAS,OAAA,GAAU,CAAA,EAAG,OAAA,IAAW,aAAA,EAAe,WAAW,CAAA,EAAG;AAC7D,MAAA,IAAI,KAAA,CAAM,WAAW,WAAA,EAAa;AACjC,QAAA,MACC,SAAA,IACA,IAAI,YAAA,CAAa,4BAAA,EAA8B,YAAY,CAAA;AAAA,MAE7D;AACA,MAAA,MAAM,GAAA,GAAM,MAAM,OAAA,CAAQ,OAAA,CAAQ,eAAe,UAAU,CAAA;AAC3D,MAAA,IAAI,KAAA,CAAM,WAAW,WAAA,EAAa;AACjC,QAAA,MAAM,IAAI,YAAA,CAAa,4BAAA,EAA8B,YAAY,CAAA;AAAA,MAClE;AACA,MAAA,MAAM,MAAM,OAAA,CAAQ,UAAA,GACjB,QAAQ,UAAA,EAAW,GACnB,IAAI,cAAA,EAAe;AACtB,MAAA,UAAA,GAAa,GAAA;AACb,MAAA,IAAI;AACH,QAAA,OAAO,MAAM,OAAA,CAAQ;AAAA,UACpB,GAAA;AAAA,UACA,IAAA;AAAA,UACA,GAAA;AAAA,UACA,UAAA;AAAA,UACA,UAAA,EAAY,CAAC,MAAA,KAAW,YAAA,CAAa,MAAM;AAAA,SAC3C,CAAA;AAAA,MACF,SAAS,KAAA,EAAO;AACf,QAAA,SAAA,GAAY,KAAA;AACZ,QAAA,IAAI,UAAA,KAAe,KAAK,UAAA,GAAa,IAAA;AACrC,QAAA,IACC,WAAU,IACV,CAAC,oBAAoB,KAAK,CAAA,IAC1B,YAAY,aAAA,EACX;AACD,UAAA,MAAM,KAAA;AAAA,QACP;AACA,QAAA,MAAM,KAAA,GACL,sBAAsB,OAAA,GAAU,CAAC,KACjC,qBAAA,CAAsB,qBAAA,CAAsB,SAAS,CAAC,CAAA;AACvD,QAAA,MAAM,MAAM,KAAK,CAAA;AAAA,MAClB,CAAA,SAAE;AACD,QAAA,IAAI,UAAA,KAAe,KAAK,UAAA,GAAa,IAAA;AAAA,MACtC;AAAA,IACD;AACA,IAAA,MAAM,SAAA;AAAA,EACP;AAEA,EAAA,eAAe,WAAW,UAAA,EAAmC;AAC5D,IAAA,KAAA,CAAM,MAAA,GAAS,WAAA;AACf,IAAA,KAAA,IAAS,QAAQ,UAAA,EAAY,KAAA,GAAQ,MAAA,CAAO,MAAA,EAAQ,SAAS,CAAA,EAAG;AAC/D,MAAA,IAAI,KAAA,CAAM,WAAW,WAAA,EAAa;AAClC,MAAA,WAAA,GAAc,KAAA;AACd,MAAA,MAAM,KAAA,GAAQ,OAAO,KAAK,CAAA;AAC1B,MAAA,IAAI,CAAC,KAAA,EAAO;AACZ,MAAA,IAAI,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,UAAU,CAAA,EAAG;AAChC,MAAA,MAAM,OAAO,OAAA,CAAQ,IAAA,CAAK,MAAM,KAAA,CAAM,KAAA,EAAO,MAAM,GAAG,CAAA;AACtD,MAAA,IAAI;AACH,QAAA,MAAM,IAAA,GAAO,MAAM,gBAAA,CAAiB,KAAA,CAAM,YAAY,IAAI,CAAA;AAC1D,QAAA,IAAI,KAAA,CAAM,WAAW,WAAA,EAAa;AAClC,QAAA,SAAA,CAAU,KAAK,EAAE,UAAA,EAAY,KAAA,CAAM,UAAA,EAAY,MAAM,CAAA;AACrD,QAAA,IAAA,CAAK,GAAA,CAAI,MAAM,UAAU,CAAA;AACzB,QAAA,YAAA,CAAa,CAAC,CAAA;AAAA,MACf,SAAS,KAAA,EAAO;AACf,QAAA,UAAA,GAAa,IAAA;AACb,QAAA,IAAI,WAAU,EAAG;AACjB,QAAA,KAAA,CAAM,MAAA,GAAS,OAAA;AACf,QAAA,MAAM,KAAA;AAAA,MACP;AAAA,IACD;AAEA,IAAA,IAAI,KAAA,CAAM,WAAW,WAAA,EAAa;AAClC,IAAA,KAAA,CAAM,MAAA,GAAS,YAAA;AACf,IAAA,MAAM,QAAQ,OAAA,CAAQ,QAAA,CAAS,CAAC,GAAG,SAAS,CAAC,CAAA;AAC7C,IAAA,KAAA,CAAM,MAAA,GAAS,WAAA;AACf,IAAA,YAAA,CAAa,CAAC,CAAA;AAAA,EACf;AAEA,EAAA,eAAe,KAAA,GAAuB;AACrC,IAAA,IAAI,KAAK,OAAO,GAAA;AAChB,IAAA,YAAA,CAAa,CAAC,CAAA;AACd,IAAA,GAAA,GAAM,UAAA,CAAW,WAAW,CAAA,CAAE,KAAA,CAAM,CAAC,KAAA,KAAU;AAC9C,MAAA,IAAI,WAAU,EAAG;AACjB,MAAA,KAAA,CAAM,MAAA,GAAS,OAAA;AACf,MAAA,MAAM,KAAA;AAAA,IACP,CAAC,CAAA;AACD,IAAA,OAAO,GAAA;AAAA,EACR;AAEA,EAAA,SAAS,KAAA,GAAc;AACtB,IAAA,IAAI,KAAA,CAAM,WAAW,WAAA,EAAa;AAClC,IAAA,KAAA,CAAM,MAAA,GAAS,QAAA;AACf,IAAA,UAAA,EAAY,KAAA,EAAM;AAAA,EACnB;AAEA,EAAA,eAAe,MAAA,GAAwB;AACtC,IAAA,IAAI,KAAA,CAAM,WAAW,QAAA,EAAU;AAC/B,IAAA,GAAA,GAAM,UAAA,CAAW,WAAW,CAAA,CAAE,KAAA,CAAM,CAAC,KAAA,KAAU;AAC9C,MAAA,IAAI,WAAU,EAAG;AACjB,MAAA,KAAA,CAAM,MAAA,GAAS,OAAA;AACf,MAAA,MAAM,KAAA;AAAA,IACP,CAAC,CAAA;AACD,IAAA,OAAO,GAAA;AAAA,EACR;AAEA,EAAA,eAAe,MAAA,GAAwB;AACtC,IAAA,IACC,KAAA,CAAM,WAAW,WAAA,IACjB,KAAA,CAAM,WAAW,WAAA,IACjB,KAAA,CAAM,WAAW,MAAA,EAChB;AACD,MAAA,KAAA,CAAM,MAAA,GAAS,WAAA;AACf,MAAA;AAAA,IACD;AACA,IAAA,KAAA,CAAM,MAAA,GAAS,WAAA;AACf,IAAA,UAAA,EAAY,KAAA,EAAM;AAClB,IAAA,MAAM,OAAA,CAAQ,QAAQ,KAAA,IAAQ;AAAA,EAC/B;AAEA,EAAA,OAAO;AAAA,IACN,KAAA;AAAA,IACA,KAAA;AAAA,IACA,MAAA;AAAA,IACA,MAAA;AAAA,IACA,SAAA,EAAW,MAAM,KAAA,CAAM;AAAA,GACxB;AACD;ACpRO,SAAS4E,eAAc,KAAA,EAAwB;AACrD,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIhD,eAAS,KAAK,CAAA;AAE5C,EAAAG,gBAAU,MAAM;AACf,IAAA,IAAI,OAAO,MAAA,KAAW,WAAA,IAAe,CAAC,OAAO,UAAA,EAAY;AACzD,IAAA,MAAM,GAAA,GAAM,MAAA,CAAO,UAAA,CAAW,KAAK,CAAA;AACnC,IAAA,MAAM,QAAA,GAAW,MAAM,UAAA,CAAW,GAAA,CAAI,OAAO,CAAA;AAC7C,IAAA,QAAA,EAAS;AACT,IAAA,GAAA,CAAI,gBAAA,CAAiB,UAAU,QAAQ,CAAA;AACvC,IAAA,OAAO,MAAM,GAAA,CAAI,mBAAA,CAAoB,QAAA,EAAU,QAAQ,CAAA;AAAA,EACxD,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAEV,EAAA,OAAO,OAAA;AACR;;;AChBA,IAAM,YAAA,GAAe;AAAA,EACpB,eAAA,EAAiB,SAAA;AAAA,EACjB,KAAA,EAAO;AACR,CAAA;AAMA,IAAM,cAAA,GAAiB;AAAA,EACtB,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA;AAAA;AACD,CAAA;AAQA,SAAS,WAAW,KAAA,EAAuB;AAC1C,EAAA,IAAI,IAAA,GAAO,UAAA;AACX,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACtC,IAAA,IAAA,IAAQ,KAAA,CAAM,WAAW,CAAC,CAAA;AAC1B,IAAA,IAAA,GAAO,IAAA,CAAK,IAAA,CAAK,IAAA,EAAM,QAAU,CAAA;AAAA,EAClC;AACA,EAAA,OAAO,IAAA,KAAS,CAAA;AACjB;AAEA,SAAS,aAAa,OAAA,EAAyB;AAC9C,EAAA,MAAM,IAAI,OAAA,GAAU,GAAA;AACpB,EAAA,OAAO,KAAK,OAAA,GAAU,CAAA,GAAI,KAAA,GAAA,CAAA,CAAU,CAAA,GAAI,SAAS,KAAA,KAAU,GAAA;AAC5D;AAGA,SAAS,kBAAkB,GAAA,EAAqB;AAC/C,EAAA,MAAM,UAAA,GAAa,GAAA,CAAI,OAAA,CAAQ,GAAA,EAAK,EAAE,CAAA;AACtC,EAAA,MAAM,CAAA,GAAI,OAAO,QAAA,CAAS,UAAA,CAAW,MAAM,CAAA,EAAG,CAAC,GAAG,EAAE,CAAA;AACpD,EAAA,MAAM,CAAA,GAAI,OAAO,QAAA,CAAS,UAAA,CAAW,MAAM,CAAA,EAAG,CAAC,GAAG,EAAE,CAAA;AACpD,EAAA,MAAM,CAAA,GAAI,OAAO,QAAA,CAAS,UAAA,CAAW,MAAM,CAAA,EAAG,CAAC,GAAG,EAAE,CAAA;AACpD,EAAA,OACC,MAAA,GAAS,YAAA,CAAa,CAAC,CAAA,GACvB,MAAA,GAAS,aAAa,CAAC,CAAA,GACvB,MAAA,GAAS,YAAA,CAAa,CAAC,CAAA;AAEzB;AAEA,SAAS,qBAAqB,aAAA,EAA8C;AAE3E,EAAA,OAAO,iBAAA,CAAkB,aAAa,CAAA,GAAI,KAAA,GAAQ,SAAA,GAAY,SAAA;AAC/D;AAMO,SAAS,WAAA,CAAY,IAAA,EAAc,GAAA,GAAM,CAAA,EAAW;AAC1D,EAAA,MAAM,KAAA,GAAQ,KAAK,IAAA,EAAK,CAAE,MAAM,KAAK,CAAA,CAAE,OAAO,OAAO,CAAA;AACrD,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,GAAA;AAC/B,EAAA,OAAO,KAAA,CACL,MAAM,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA,EAAG,GAAG,CAAC,CAAA,CACzB,GAAA,CAAI,CAAC,IAAA,KAAS,IAAA,CAAK,OAAO,CAAC,CAAC,EAC5B,IAAA,CAAK,EAAE,EACP,WAAA,EAAY;AACf;AAMO,SAAS,gBAAgB,IAAA,EAA4B;AAC3D,EAAA,MAAM,UAAA,GAAa,IAAA,CAAK,IAAA,EAAK,CAAE,WAAA,EAAY;AAC3C,EAAA,IAAI,CAAC,UAAA,EAAY;AAChB,IAAA,OAAO,EAAE,GAAG,YAAA,EAAa;AAAA,EAC1B;AACA,EAAA,MAAM,kBACL,cAAA,CAAe,UAAA,CAAW,UAAU,CAAA,GAAI,eAAe,MAAM,CAAA;AAC9D,EAAA,OAAO;AAAA,IACN,eAAA;AAAA,IACA,KAAA,EAAO,qBAAqB,eAAe;AAAA,GAC5C;AACD;AAGO,SAAS,oBACf,IAAA,EACkD;AAClD,EAAA,OAAO,gBAAgB,IAAI,CAAA;AAC5B;ACxFO,SAAS,iBAAA,CAAkB;AAAA,EACjC,KAAA;AAAA,EACA,KAAA;AAAA,EACA,IAAA;AAAA,EACA,KAAA;AAAA,EACA,SAAA,GAAY,SAAA;AAAA,EACZ;AACD,CAAA,EAA2B;AAC1B,EAAA,uBACChC,eAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACA,SAAA,EAAW,EAAA;AAAA,QACV,8DAAA;AAAA,QACA;AAAA,OACD;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAC,cAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,+BAAA,EAAiC,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,wBACpDA,cAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,8CAA8C,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,QAChE,wBACAA,cAAAA;AAAA,UAAC,GAAA;AAAA,UAAA;AAAA,YACA,SAAA,EAAW,EAAA;AAAA,cACV,cAAA;AAAA,cACA,cAAc,IAAA,IAAQ,wCAAA;AAAA,cACtB,cAAc,MAAA,IAAU,kBAAA;AAAA,cACxB,cAAc,SAAA,IAAa;AAAA,aAC5B;AAAA,YAEC,QAAA,EAAA;AAAA;AAAA,SACF,GACG,IAAA;AAAA,QACH,uBACAA,cAAAA,CAAC,OAAE,SAAA,EAAU,oCAAA,EAAsC,gBAAK,CAAA,GACrD;AAAA;AAAA;AAAA,GACL;AAEF;ACnCO,SAAS,eAAA,CAAgB;AAAA,EAC/B,KAAA;AAAA,EACA,WAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA;AACD,CAAA,EAAyB;AACxB,EAAA,uBACCD,eAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACA,SAAA,EAAW,EAAA;AAAA,QACV,0DAAA;AAAA,QACA;AAAA,OACD;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iDAAA,EACd,QAAA,EAAA;AAAA,0BAAAA,gBAAC,KAAA,EAAA,EACA,QAAA,EAAA;AAAA,4BAAAC,cAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,2CAAA,EAA6C,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,YAChE,8BACAA,cAAAA,CAAC,OAAE,SAAA,EAAU,sCAAA,EACX,uBACF,CAAA,GACG;AAAA,WAAA,EACL,CAAA;AAAA,UACC;AAAA,SAAA,EACF,CAAA;AAAA,wBACAA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,YAAY,QAAA,EAAS;AAAA;AAAA;AAAA,GACrC;AAEF;AC5BA,SAAS,SAAS,MAAA,EAA0B;AAC3C,EAAA,IAAI,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG,OAAO,EAAA;AAChC,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,GAAG,MAAM,CAAA;AAC9B,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,GAAG,MAAM,CAAA;AAC9B,EAAA,MAAM,IAAA,GAAO,MAAM,GAAA,IAAO,CAAA;AAC1B,EAAA,OAAO,MAAA,CACL,GAAA,CAAI,CAAC,KAAA,EAAO,KAAA,KAAU;AACtB,IAAA,MAAM,CAAA,GAAI,OAAO,MAAA,KAAW,CAAA,GAAI,KAAM,KAAA,IAAS,MAAA,CAAO,SAAS,CAAA,CAAA,GAAM,GAAA;AACrE,IAAA,MAAM,CAAA,GAAI,EAAA,GAAA,CAAO,KAAA,GAAQ,GAAA,IAAO,IAAA,GAAQ,EAAA;AACxC,IAAA,OAAO,CAAA,EAAG,EAAE,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,EAAI,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA;AAAA,EACvC,CAAC,CAAA,CACA,IAAA,CAAK,GAAG,CAAA;AACX;AAEO,SAAS,aAAA,CAAc;AAAA,EAC7B,KAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA;AAAA,EACA;AACD,CAAA,EAAuB;AACtB,EAAA,MAAM,OAAA,GAAU4E,eAAc,kCAAkC,CAAA;AAChE,EAAA,MAAM,IAAA,GAAO,SAAS,MAAM,CAAA;AAE5B,EAAA,uBACC7E,eAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACA,SAAA,EAAW,EAAA;AAAA,QACV,mGAAA;AAAA,QACA;AAAA,OACD;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAA,gBAAC,KAAA,EAAA,EACA,QAAA,EAAA;AAAA,0BAAAC,cAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,+BAAA,EAAiC,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,0BACpDA,cAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,6CAA6C,QAAA,EAAA,KAAA,EAAM;AAAA,SAAA,EACjE,CAAA;AAAA,QACC,uBACAA,cAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACA,OAAA,EAAQ,YAAA;AAAA,YACR,SAAA,EAAW,EAAA;AAAA,cACV,uBAAA;AAAA,cACA,CAAC,OAAA,IAAW;AAAA,aACb;AAAA,YACA,aAAA,EAAY,MAAA;AAAA,YAEZ,QAAA,kBAAAA,cAAAA;AAAA,cAAC,UAAA;AAAA,cAAA;AAAA,gBACA,IAAA,EAAK,MAAA;AAAA,gBACL,MAAA,EAAO,cAAA;AAAA,gBACP,WAAA,EAAY,GAAA;AAAA,gBACZ,cAAA,EAAe,OAAA;AAAA,gBACf,aAAA,EAAc,OAAA;AAAA,gBACd,MAAA,EAAQ;AAAA;AAAA;AACT;AAAA,SACD,GACG;AAAA;AAAA;AAAA,GACL;AAEF;AC9DO,IAAM,kBAAA,GAAqB,CAAC,KAAA,EAAO,MAAA,EAAQ,SAAS,MAAM;AAajE,IAAM6E,eAAAA,GAA4C;AAAA,EACjD,GAAA,EAAK,KAAA;AAAA,EACL,IAAA,EAAM,MAAA;AAAA,EACN,KAAA,EAAO,OAAA;AAAA,EACP,IAAA,EAAM;AACP,CAAA;AAEO,SAAS,eAAA,CAAgB;AAAA,EAC/B,KAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA;AACD,CAAA,EAAyB;AACxB,EAAA,MAAM,IAAA,GAAO,EAAE,GAAGA,eAAAA,EAAgB,GAAG,MAAA,EAAO;AAE5C,EAAA,uBACC7E,cAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACA,IAAA,EAAK,OAAA;AAAA,MACL,YAAA,EAAW,YAAA;AAAA,MACX,SAAA,EAAW,EAAA,CAAG,sBAAA,EAAwB,SAAS,CAAA;AAAA,MAE9C,QAAA,EAAA,kBAAA,CAAmB,GAAA,CAAI,CAAC,MAAA,KAAW;AACnC,QAAA,MAAM,WAAW,MAAA,KAAW,KAAA;AAC5B,QAAA,uBACCA,cAAAA;AAAA,UAACyB,gBAAAA;AAAA,UAAA;AAAA,YAEA,IAAA,EAAK,QAAA;AAAA,YACL,IAAA,EAAK,IAAA;AAAA,YACL,OAAA,EAAS,WAAW,SAAA,GAAY,SAAA;AAAA,YAChC,cAAA,EAAc,QAAA;AAAA,YACd,OAAA,EAAS,MAAM,QAAA,CAAS,MAAM,CAAA;AAAA,YAE7B,eAAK,MAAM;AAAA,WAAA;AAAA,UAPP;AAAA,SAQN;AAAA,MAEF,CAAC;AAAA;AAAA,GACF;AAEF;ACtCO,SAAS,uBAAA,CAAwB;AAAA,EACvC,KAAA;AAAA,EACA,IAAA;AAAA,EACA,KAAA;AAAA,EACA;AACD,CAAA,EAAiC;AAChC,EAAA,uBACC1B,eAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACA,SAAA,EAAW,EAAA;AAAA,QACV,0EAAA;AAAA,QACA;AAAA,OACD;AAAA,MAEC,QAAA,EAAA;AAAA,QAAA,KAAA,mBACAC,cAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,gDAAA,EACZ,iBACF,CAAA,GACG,IAAA;AAAA,QACH,IAAA,CAAK,MAAA,KAAW,CAAA,mBAChBA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,KAAA,EAAO,QAAA,EAAA,KAAA,EAAM,CAAA,mBAE5BA,cAAAA,CAAC,OAAA,EAAA,EAAM,WAAU,gBAAA,EAChB,QAAA,kBAAAA,cAAAA,CAAC,OAAA,EAAA,EACC,QAAA,EAAA,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,qBACVD,eAAAA,CAAC,IAAA,EAAA,EAAgB,SAAA,EAAU,2BAAA,EAC1B,QAAA,EAAA;AAAA,0BAAAC,eAAC,IAAA,EAAA,EAAG,KAAA,EAAM,OAAM,SAAA,EAAU,iCAAA,EACxB,cAAI,KAAA,EACN,CAAA;AAAA,0BACAA,cAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,mCAAA,EACZ,cAAI,KAAA,EACN,CAAA;AAAA,UACC,GAAA,CAAI,wBACJA,cAAAA,CAAC,QAAG,SAAA,EAAU,yDAAA,EACZ,QAAA,EAAA,GAAA,CAAI,KAAA,EACN,CAAA,GACG;AAAA,SAAA,EAAA,EAXI,GAAA,CAAI,EAYb,CACA,CAAA,EACF,CAAA,EACD;AAAA;AAAA;AAAA,GAEF;AAEF;AC3CO,SAAS,iBAAA,CAAkB;AAAA,EACjC,KAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAA;AAAA,EACA;AACD,CAAA,EAA2B;AAC1B,EAAA,uBACCD,eAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACA,SAAA,EAAW,EAAA;AAAA,QACV,8DAAA;AAAA,QACA;AAAA,OACD;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2CAAA,EACd,QAAA,EAAA;AAAA,0BAAAC,cAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,8BAAA,EAAgC,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,UACnD,wBACAA,cAAAA,CAAC,OAAE,SAAA,EAAU,oCAAA,EAAsC,iBAAM,CAAA,GACtD;AAAA,SAAA,EACL,CAAA;AAAA,wBACAA,eAAC,IAAA,EAAA,EAAG,SAAA,EAAU,kBACZ,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,qBACXD,eAAAA;AAAA,UAAC,IAAA;AAAA,UAAA;AAAA,YAEA,SAAA,EAAU,mDAAA;AAAA,YAEV,QAAA,EAAA;AAAA,8BAAAA,gBAAC,KAAA,EAAA,EACA,QAAA,EAAA;AAAA,gCAAAC,cAAAA,CAAC,GAAA,EAAA,EAAG,QAAA,EAAA,IAAA,CAAK,KAAA,EAAM,CAAA;AAAA,gBACd,IAAA,CAAK,wBACLA,cAAAA,CAAC,OAAE,SAAA,EAAU,+BAAA,EAAiC,QAAA,EAAA,IAAA,CAAK,KAAA,EAAM,CAAA,GACtD;AAAA,eAAA,EACL,CAAA;AAAA,8BACAA,cAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,cAAA,EAAgB,eAAK,MAAA,EAAO;AAAA;AAAA,WAAA;AAAA,UATpC,IAAA,CAAK;AAAA,SAWX,CAAA,EACF;AAAA;AAAA;AAAA,GACD;AAEF;AC1CO,SAAS,gBAAA,CAAiB;AAAA,EAChC,KAAA;AAAA,EACA,WAAA;AAAA,EACA,MAAA;AAAA,EACA,IAAA,GAAO8E,qBAAA;AAAA,EACP;AACD,CAAA,EAA0B;AACzB,EAAA,uBACC9E,cAAAA;AAAA,IAAC,UAAA;AAAA,IAAA;AAAA,MACA,KAAA;AAAA,MACA,WAAA;AAAA,MACA,MAAA;AAAA,MACA,IAAA;AAAA,MACA;AAAA;AAAA,GACD;AAEF;ACnBO,SAAS,cAAA,CAAe,EAAE,SAAA,EAAW,IAAA,GAAO,GAAE,EAAwB;AAC5E,EAAA,MAAM,OAAA,GAAU4E,eAAc,kCAAkC,CAAA;AAChE,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAI,CAAA;AAE9B,EAAA,uBACC7E,eAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACA,IAAA,EAAK,QAAA;AAAA,MACL,WAAA,EAAU,QAAA;AAAA,MACV,SAAA,EAAW,EAAA,CAAG,yCAAA,EAA2C,SAAS,CAAA;AAAA,MAElE,QAAA,EAAA;AAAA,wBAAAC,cAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACA,SAAA,EAAW,EAAA;AAAA,cACV,gCAAA;AAAA,cACA,CAAC,OAAA,IAAW;AAAA;AACb;AAAA,SACD;AAAA,wBACAA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6BACb,QAAA,EAAA,KAAA,CAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,KAAA,EAAM,EAAG,CAAC,CAAA,EAAG,0BAClCA,cAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YAEA,SAAA,EAAW,EAAA;AAAA,cACV,2BAAA;AAAA,cACA,CAAC,OAAA,IAAW;AAAA,aACb;AAAA,YACA,KAAA,EAAO,EAAE,MAAA,EAAQ,CAAA,EAAG,KAAO,KAAA,GAAQ,EAAA,GAAM,EAAG,CAAA,CAAA,CAAA;AAAI,WAAA;AAAA,UAL3C;AAAA,SAON,CAAA,EACF,CAAA;AAAA,wBACAA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,WAAU,QAAA,EAAA,iBAAA,EAAe;AAAA;AAAA;AAAA,GAC1C;AAEF;;;AC3CO,IAAM,mBAAA,GAAsB;AAE5B,IAAM,qBAAA,GAAwB,CAAC,WAAA,EAAa,KAAK;AAKjD,IAAM,sBAAA,GAAyB,GAAA,GAAM,EAAA,GAAK,EAAA,GAAK;AAQ/C,SAAS,qBACf,KAAA,EAC8B;AAC9B,EAAA,OACC,OAAO,KAAA,KAAU,QAAA,IAChB,qBAAA,CAA4C,SAAS,KAAK,CAAA;AAE7D;AAEO,SAAS,0BACf,KAAA,EACU;AACV,EAAA,OAAO,KAAA,KAAU,KAAA;AAClB;AAEO,SAAS,yBAAyB,QAAA,EAAsC;AAC9E,EAAA,MAAM,IAAA,GAAO,SAAS,WAAA,EAAY;AAClC,EAAA,IAAI,IAAA,KAAS,WAAA,IAAe,IAAA,KAAS,WAAA,EAAa,OAAO,MAAA;AACzD,EAAA,IAAI,KAAK,QAAA,CAAS,WAAW,CAAA,IAAK,IAAA,KAAS,YAAY,OAAO,WAAA;AAC9D,EAAA,IACC,IAAA,CAAK,QAAA,CAAS,wBAAwB,CAAA,IACtC,SAAS,uBAAA,EACR;AACD,IAAA,OAAO,wBAAA;AAAA,EACR;AACA,EAAA,OAAO,MAAA;AACR;AAEA,SAAS,cAAc,YAAA,EAA2C;AACjE,EAAA,MAAM,GAAA,uBAAU,GAAA,EAAoB;AACpC,EAAA,KAAA,MAAW,IAAA,IAAQ,YAAA,CAAa,KAAA,CAAM,GAAG,CAAA,EAAG;AAC3C,IAAA,MAAM,OAAA,GAAU,KAAK,IAAA,EAAK;AAC1B,IAAA,IAAI,CAAC,OAAA,EAAS;AACd,IAAA,MAAM,EAAA,GAAK,OAAA,CAAQ,OAAA,CAAQ,GAAG,CAAA;AAC9B,IAAA,IAAI,KAAK,CAAA,EAAG;AACZ,IAAA,MAAM,OAAO,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,EAAE,EAAE,IAAA,EAAK;AACvC,IAAA,MAAM,MAAM,OAAA,CAAQ,KAAA,CAAM,EAAA,GAAK,CAAC,EAAE,IAAA,EAAK;AACvC,IAAA,GAAA,CAAI,GAAA,CAAI,IAAA,EAAM,kBAAA,CAAmB,GAAG,CAAC,CAAA;AAAA,EACtC;AACA,EAAA,OAAO,GAAA;AACR;AAEO,SAAS,mBACf,YAAA,EAC4B;AAC5B,EAAA,MAAM,GAAA,GAAM,aAAA,CAAc,YAAY,CAAA,CAAE,IAAI,mBAAmB,CAAA;AAC/D,EAAA,OAAO,oBAAA,CAAqB,GAAG,CAAA,GAAI,GAAA,GAAM,IAAA;AAC1C;AAEO,SAAS,iBAAA,GAA+C;AAC9D,EAAA,IAAI,OAAO,QAAA,KAAa,WAAA,EAAa,OAAO,IAAA;AAC5C,EAAA,OAAO,kBAAA,CAAmB,SAAS,MAAM,CAAA;AAC1C;AAEO,SAAS,sBAAA,CACf,KAAA,EACA,OAAA,GAAqC,EAAC,EAC7B;AACT,EAAA,MAAM,MAAA,GAAS,QAAQ,MAAA,IAAU,sBAAA;AACjC,EAAA,MAAM,MAAA,GACL,QAAQ,MAAA,KACP,OAAO,WAAW,WAAA,IAAe,MAAA,CAAO,SAAS,QAAA,KAAa,QAAA,CAAA;AAChE,EAAA,MAAM,KAAA,GAAQ;AAAA,IACb,CAAA,EAAG,mBAAmB,CAAA,CAAA,EAAI,kBAAA,CAAmB,KAAK,CAAC,CAAA,CAAA;AAAA,IACnD,QAAA;AAAA,IACA,WAAW,MAAM,CAAA,CAAA;AAAA,IACjB;AAAA,GACD;AACA,EAAA,IAAI,QAAQ,MAAA,EAAQ;AACnB,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,OAAA,EAAU,OAAA,CAAQ,MAAM,CAAA,CAAE,CAAA;AAAA,EACtC;AACA,EAAA,IAAI,MAAA,EAAQ;AACX,IAAA,KAAA,CAAM,KAAK,QAAQ,CAAA;AAAA,EACpB;AACA,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACvB;AAEO,SAAS,kBAAA,CACf,KAAA,EACA,OAAA,GAAqC,EAAC,EAC/B;AACP,EAAA,IAAI,OAAO,aAAa,WAAA,EAAa;AACrC,EAAA,QAAA,CAAS,MAAA,GAAS,sBAAA,CAAuB,KAAA,EAAO,OAAO,CAAA;AACxD;AAEO,SAAS,gBAAA,GAA4B;AAC3C,EAAA,IAAI,OAAO,MAAA,KAAW,WAAA,EAAa,OAAO,KAAA;AAC1C,EAAA,IAAI;AACH,IAAA,OAAO,MAAA,CAAO,SAAS,MAAA,CAAO,GAAA;AAAA,EAC/B,CAAA,CAAA,MAAQ;AACP,IAAA,OAAO,IAAA;AAAA,EACR;AACD;ACtFO,IAAM,oCAAA,GAAkE;AAAA,EAC9E,OAAA,EACC,iGAAA;AAAA,EACD,SAAA,EAAW,YAAA;AAAA,EACX,aAAA,EAAe,gBAAA;AAAA,EACf,MAAA,EAAQ;AACT;AAWO,SAAS,mBAAA,CAAoB;AAAA,EACnC,MAAA;AAAA,EACA,UAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA,GAAU,SAAA;AAAA,EACV;AACD,CAAA,EAA6B;AAC5B,EAAA,MAAM,IAAA,GAAO,EAAE,GAAG,oCAAA,EAAsC,GAAG,MAAA,EAAO;AAClE,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAI4B,cAAAA;AAAA,IAC7B;AAAA,GACD;AAEA,EAAAG,gBAAU,MAAM;AACf,IAAA,IAAI,OAAA,KAAY,OAAA,IAAW,gBAAA,EAAiB,EAAG;AAC9C,MAAA,UAAA,CAAW,WAAW,CAAA;AACtB,MAAA;AAAA,IACD;AACA,IAAA,UAAA,CAAW,mBAAmB,CAAA;AAAA,EAC/B,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAEZ,EAAA,IAAI,OAAA,KAAY,SAAS,OAAO,IAAA;AAChC,EAAA,IAAI,OAAA,KAAY,SAAA,IAAa,OAAA,EAAS,OAAO,IAAA;AAE7C,EAAA,MAAM,MAAA,GAAS,CAAC,KAAA,KAA8B;AAC7C,IAAA,MAAM,cAAA,GACL,WACC,OAAO,MAAA,KAAW,cAChB,MAAA,GACA,wBAAA,CAAyB,MAAA,CAAO,QAAA,CAAS,QAAQ,CAAA,CAAA;AACrD,IAAA,kBAAA,CAAmB,KAAA,EAAO,EAAE,MAAA,EAAQ,cAAA,EAAgB,CAAA;AACpD,IAAA,UAAA,CAAW,KAAK,CAAA;AAChB,IAAA,QAAA,GAAW,KAAK,CAAA;AAAA,EACjB,CAAA;AAEA,EAAA,uBACC/B,cAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACA,IAAA,EAAK,QAAA;AAAA,MACL,cAAY,IAAA,CAAK,OAAA;AAAA,MACjB,SAAA,EAAW,EAAA;AAAA,QACV,wFAAA;AAAA,QACA;AAAA,OACD;AAAA,MAEA,QAAA,kBAAAD,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6FAAA,EACd,QAAA,EAAA;AAAA,wBAAAA,eAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,+BAAA,EACX,QAAA,EAAA;AAAA,UAAA,IAAA,CAAK,OAAA;AAAA,UACL,UAAA,mBACAA,eAAAA,CAAAkC,mBAAAA,EAAA,EACE,QAAA,EAAA;AAAA,YAAA,GAAA;AAAA,4BACDjC,cAAAA;AAAA,cAAC,GAAA;AAAA,cAAA;AAAA,gBACA,IAAA,EAAM,UAAA;AAAA,gBACN,SAAA,EAAU,8CAAA;AAAA,gBAET,QAAA,EAAA,IAAA,CAAK;AAAA;AAAA;AACP,WAAA,EACD,CAAA,GACG;AAAA,SAAA,EACL,CAAA;AAAA,wBACAD,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+BAAA,EACd,QAAA,EAAA;AAAA,0BAAAC,cAAAA;AAAA,YAACyB,gBAAAA;AAAA,YAAA;AAAA,cACA,IAAA,EAAK,QAAA;AAAA,cACL,OAAA,EAAQ,SAAA;AAAA,cACR,OAAA,EAAS,MAAM,MAAA,CAAO,WAAW,CAAA;AAAA,cAEhC,QAAA,EAAA,IAAA,CAAK;AAAA;AAAA,WACP;AAAA,0BACAzB,cAAAA,CAACyB,gBAAAA,EAAA,EAAO,IAAA,EAAK,QAAA,EAAS,OAAA,EAAS,MAAM,MAAA,CAAO,KAAK,CAAA,EAC/C,QAAA,EAAA,IAAA,CAAK,SAAA,EACP;AAAA,SAAA,EACD;AAAA,OAAA,EACD;AAAA;AAAA,GACD;AAEF;AC9GA,SAAS,YAAA,CAAa;AAAA,EACrB,IAAA;AAAA,EACA;AACD,CAAA,EAGG;AACF,EAAA,uBACCzB,cAAAA;AAAA,IAAC,GAAA;AAAA,IAAA;AAAA,MACA,IAAA;AAAA,MACA,MAAA,EAAO,QAAA;AAAA,MACP,GAAA,EAAI,qBAAA;AAAA,MACJ,SAAA,EAAU,8BAAA;AAAA,MAET;AAAA;AAAA,GACF;AAEF;AAEA,SAAS,WAAA,CACR,KAAA,EACA,KAAA,EACA,OAAA,EACA,WACA,WAAA,EACY;AAEZ,EAAA,MAAM,OAAc,EAAC;AACrB,EAAA,IAAI,KAAA,EAAO;AACV,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA;AACjC,IAAA,IAAI,SAAS,CAAA,EAAG;AACf,MAAA,IAAA,CAAK,IAAA,CAAK;AAAA,QACT,KAAA;AAAA,QACA,GAAA,EAAK,QAAQ,KAAA,CAAM,MAAA;AAAA,QACnB,IAAA,EAAM,SAAA;AAAA,QACN,IAAA,EAAM;AAAA,OACN,CAAA;AAAA,IACF;AAAA,EACD;AACA,EAAA,IAAI,OAAA,EAAS;AACZ,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA;AACnC,IAAA,IAAI,SAAS,CAAA,EAAG;AACf,MAAA,IAAA,CAAK,IAAA,CAAK;AAAA,QACT,KAAA;AAAA,QACA,GAAA,EAAK,QAAQ,OAAA,CAAQ,MAAA;AAAA,QACrB,IAAA,EAAM,WAAA;AAAA,QACN,IAAA,EAAM;AAAA,OACN,CAAA;AAAA,IACF;AAAA,EACD;AACA,EAAA,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,EAAE,KAAA,GAAQ,CAAA,CAAE,KAAA,IAAS,CAAA,CAAE,MAAM,CAAA,CAAE,KAAA,IAAS,CAAA,CAAE,GAAA,GAAM,EAAE,KAAA,CAAM,CAAA;AAC5E,EAAA,MAAM,OAAc,EAAC;AACrB,EAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACvB,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,IAAA,CAAK,MAAA,GAAS,CAAC,CAAA;AACjC,IAAA,IAAI,IAAA,IAAQ,GAAA,CAAI,KAAA,GAAQ,IAAA,CAAK,GAAA,EAAK;AACjC,MAAA,IAAI,IAAI,GAAA,GAAM,GAAA,CAAI,QAAQ,IAAA,CAAK,GAAA,GAAM,KAAK,KAAA,EAAO;AAChD,QAAA,IAAA,CAAK,IAAA,CAAK,MAAA,GAAS,CAAC,CAAA,GAAI,GAAA;AAAA,MACzB;AACA,MAAA;AAAA,IACD;AACA,IAAA,IAAA,CAAK,KAAK,GAAG,CAAA;AAAA,EACd;AACA,EAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACtB,IAAA,uBACCD,eAAAA,CAAAkC,mBAAAA,EAAA,EACE,QAAA,EAAA;AAAA,MAAA,KAAA;AAAA,MAAM,GAAA;AAAA,sBAACjC,cAAAA,CAAC,YAAA,EAAA,EAAa,IAAA,EAAM,WAAY,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,MAC7C,QAAA;AAAA,sBACDA,cAAAA,CAAC,YAAA,EAAA,EAAa,IAAA,EAAM,aAAc,QAAA,EAAA,OAAA,EAAQ;AAAA,KAAA,EAC3C,CAAA;AAAA,EAEF;AACA,EAAA,MAAM,QAAqB,EAAC;AAC5B,EAAA,IAAI,MAAA,GAAS,CAAA;AACb,EAAA,IAAA,CAAK,OAAA,CAAQ,CAAC,GAAA,EAAK,KAAA,KAAU;AAC5B,IAAA,IAAI,GAAA,CAAI,QAAQ,MAAA,EAAQ;AACvB,MAAA,KAAA,CAAM,KAAK,KAAA,CAAM,KAAA,CAAM,MAAA,EAAQ,GAAA,CAAI,KAAK,CAAC,CAAA;AAAA,IAC1C;AACA,IAAA,KAAA,CAAM,IAAA;AAAA,sBACLA,cAAAA,CAAC,YAAA,EAAA,EAA0C,IAAA,EAAM,GAAA,CAAI,IAAA,EACnD,QAAA,EAAA,GAAA,CAAI,IAAA,EAAA,EADa,CAAA,EAAG,GAAA,CAAI,IAAI,CAAA,CAAA,EAAI,KAAK,CAAA,CAEvC;AAAA,KACD;AACA,IAAA,MAAA,GAAS,GAAA,CAAI,GAAA;AAAA,EACd,CAAC,CAAA;AACD,EAAA,IAAI,MAAA,GAAS,MAAM,MAAA,EAAQ;AAC1B,IAAA,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,MAAM,CAAC,CAAA;AAAA,EAC/B;AACA,EAAA,OAAO,KAAA;AACR;AAEO,SAAS,sBAAA,CACf,KAAA,EACA,KAAA,EACA,OAAA,EACA,WACA,WAAA,EACY;AACZ,EAAA,IAAI,MAAM,QAAA,CAAS,SAAS,KAAK,KAAA,CAAM,QAAA,CAAS,WAAW,CAAA,EAAG;AAC7D,IAAA,OAAO,MAAM,KAAA,CAAM,0BAA0B,EAAE,GAAA,CAAI,CAAC,MAAM,KAAA,KAAU;AACnE,MAAA,IAAI,SAAS,SAAA,EAAW;AACvB,QAAA,uBACCA,eAAC,YAAA,EAAA,EAAoC,IAAA,EAAM,WACzC,QAAA,EAAA,KAAA,EAAA,EADiB,CAAA,MAAA,EAAS,KAAK,CAAA,CAEjC,CAAA;AAAA,MAEF;AACA,MAAA,IAAI,SAAS,WAAA,EAAa;AACzB,QAAA,uBACCA,eAAC,YAAA,EAAA,EAAsC,IAAA,EAAM,aAC3C,QAAA,EAAA,OAAA,EAAA,EADiB,CAAA,QAAA,EAAW,KAAK,CAAA,CAEnC,CAAA;AAAA,MAEF;AACA,MAAA,OAAO,IAAA;AAAA,IACR,CAAC,CAAA;AAAA,EACF;AACA,EAAA,OAAO,WAAA,CAAY,KAAA,EAAO,KAAA,EAAO,OAAA,EAAS,WAAW,WAAW,CAAA;AACjE;AClGO,IAAM,kCAAA,GAA8D;AAAA,EAC1E,KAAA,EAAO,eAAA;AAAA,EACP,WAAA,EACC,gFAAA;AAAA,EACD,MAAA,EAAQ,QAAA;AAAA,EACR,KAAA,EAAO,kBAAA;AAAA,EACP,OAAA,EAAS;AACV;AAYO,SAAS,iBAAA,CAAkB;AAAA,EACjC,IAAA;AAAA,EACA,SAAA;AAAA,EACA,WAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA,GAAY,KAAA;AAAA,EACZ,MAAA;AAAA,EACA;AACD,CAAA,EAA2B;AAC1B,EAAA,MAAM,IAAA,GAAO,EAAE,GAAG,kCAAA,EAAoC,GAAG,MAAA,EAAO;AAEhE,EAAA,uBACCA,cAAAA;AAAA,IAACe,0BAAAA;AAAA,IAAA;AAAA,MACA,IAAA;AAAA,MACA,YAAA,EAAc,CAAC,IAAA,KAAS;AACvB,QAAA,IAAI,IAAA,EAAM;AAAA,MACX,CAAA;AAAA,MAEA,QAAA,kBAAAhB,eAAAA;AAAA,QAACiB,iCAAAA;AAAA,QAAA;AAAA,UACA,eAAA,EAAiB,CAAC,KAAA,KAAU;AAC3B,YAAA,KAAA,CAAM,cAAA,EAAe;AAAA,UACtB,CAAA;AAAA,UAEA,QAAA,EAAA;AAAA,4BAAAjB,eAAAA,CAACkB,kCAAA,EACA,QAAA,EAAA;AAAA,8BAAAjB,cAAAA,CAACkB,+BAAAA,EAAA,EAAkB,QAAA,EAAA,IAAA,CAAK,KAAA,EAAM,CAAA;AAAA,8BAC9BnB,eAAAA,CAACoB,qCAAAA,EAAA,EACC,QAAA,EAAA;AAAA,gBAAA,sBAAA;AAAA,kBACA,IAAA,CAAK,WAAA;AAAA,kBACL,IAAA,CAAK,KAAA;AAAA,kBACL,IAAA,CAAK,OAAA;AAAA,kBACL,SAAA;AAAA,kBACA;AAAA,iBACD;AAAA,gBACC,OAAA,GAAU,CAAA,CAAA,EAAI,OAAO,CAAA,CAAA,GAAK;AAAA,eAAA,EAC5B;AAAA,aAAA,EACD,CAAA;AAAA,4BACAnB,cAAAA,CAACoB,gCAAAA,EAAA,EACA,QAAA,kBAAApB,eAACyB,gBAAAA,EAAA,EAAO,IAAA,EAAK,QAAA,EAAS,UAAU,SAAA,EAAW,OAAA,EAAS,QAAA,EAClD,QAAA,EAAA,IAAA,CAAK,QACP,CAAA,EACD;AAAA;AAAA;AAAA;AACD;AAAA,GACD;AAEF;AC3EO,IAAM,oCAAA,GAAkE;AAAA,EAC9E,KAAA,EAAO,sCAAA;AAAA,EACP,KAAA,EAAO,kBAAA;AAAA,EACP,OAAA,EAAS;AACV;AAaO,SAAS,mBAAA,CAAoB;AAAA,EACnC,EAAA,GAAK,cAAA;AAAA,EACL,OAAA;AAAA,EACA,eAAA;AAAA,EACA,SAAA;AAAA,EACA,WAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA,GAAW,KAAA;AAAA,EACX;AACD,CAAA,EAA6B;AAC5B,EAAA,MAAM,IAAA,GAAO,EAAE,GAAG,oCAAA,EAAsC,GAAG,MAAA,EAAO;AAElE,EAAA,uBACC1B,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAW,EAAA,CAAG,wBAAA,EAA0B,SAAS,CAAA,EACrD,QAAA,EAAA;AAAA,oBAAAC,cAAAA;AAAA,MAAC,OAAA;AAAA,MAAA;AAAA,QACA,EAAA;AAAA,QACA,IAAA,EAAK,UAAA;AAAA,QACL,OAAA;AAAA,QACA,QAAA;AAAA,QACA,UAAU,CAAC,KAAA,KAAU,eAAA,CAAgB,KAAA,CAAM,OAAO,OAAO,CAAA;AAAA,QACzD,SAAA,EAAU;AAAA;AAAA,KACX;AAAA,oBACAA,cAAAA,CAAC,OAAA,EAAA,EAAM,OAAA,EAAS,EAAA,EAAI,WAAU,mBAAA,EAC5B,QAAA,EAAA,sBAAA;AAAA,MACA,IAAA,CAAK,KAAA;AAAA,MACL,IAAA,CAAK,KAAA;AAAA,MACL,IAAA,CAAK,OAAA;AAAA,MACL,SAAA;AAAA,MACA;AAAA,KACD,EACD;AAAA,GAAA,EACD,CAAA;AAEF;AClDA,SAAS,aAAa,IAAA,EAA6B;AAClD,EAAA,MAAM,OAAA,GAAU,KAAK,IAAA,EAAK;AAC1B,EAAA,IAAI,gBAAgB,IAAA,CAAK,OAAO,KAAK,WAAA,CAAY,IAAA,CAAK,OAAO,CAAA,EAAG;AAC/D,IAAA,OAAO,OAAA;AAAA,EACR;AACA,EAAA,IAAI,OAAA,CAAQ,WAAW,GAAG,CAAA,IAAK,CAAC,OAAA,CAAQ,UAAA,CAAW,IAAI,CAAA,EAAG;AACzD,IAAA,OAAO,OAAA;AAAA,EACR;AACA,EAAA,OAAO,IAAA;AACR;AAEA,SAAS,aAAa,IAAA,EAA2B;AAChD,EAAA,MAAM,QAAqB,EAAC;AAC5B,EAAA,MAAM,OAAA,GAAU,wDAAA;AAChB,EAAA,IAAI,IAAA,GAAO,CAAA;AACX,EAAA,IAAI,KAAA;AACJ,EAAA,IAAI,GAAA,GAAM,CAAA;AACV,EAAA,OAAA,CAAQ,KAAA,GAAQ,OAAA,CAAQ,IAAA,CAAK,IAAI,OAAO,IAAA,EAAM;AAC7C,IAAA,IAAI,KAAA,CAAM,QAAQ,IAAA,EAAM;AACvB,MAAA,KAAA,CAAM,KAAK,IAAA,CAAK,KAAA,CAAM,IAAA,EAAM,KAAA,CAAM,KAAK,CAAC,CAAA;AAAA,IACzC;AACA,IAAA,MAAM,KAAA,GAAQ,MAAM,CAAC,CAAA;AACrB,IAAA,IAAI,KAAA,CAAM,UAAA,CAAW,IAAI,CAAA,EAAG;AAC3B,MAAA,KAAA,CAAM,IAAA,iBAAKA,cAAAA,CAAC,QAAA,EAAA,EAAkB,QAAA,EAAA,KAAA,CAAM,MAAM,CAAA,EAAG,EAAE,CAAA,EAAA,EAAvB,GAAyB,CAAS,CAAA;AAAA,IAC3D,CAAA,MAAA,IAAW,KAAA,CAAM,UAAA,CAAW,GAAG,CAAA,EAAG;AACjC,MAAA,KAAA,CAAM,IAAA,iBAAKA,cAAAA,CAAC,IAAA,EAAA,EAAc,QAAA,EAAA,KAAA,CAAM,MAAM,CAAA,EAAG,EAAE,CAAA,EAAA,EAAvB,GAAyB,CAAK,CAAA;AAAA,IACnD,CAAA,MAAA,IAAW,KAAA,CAAM,UAAA,CAAW,GAAG,CAAA,EAAG;AACjC,MAAA,KAAA,CAAM,IAAA;AAAA,wBACLA,cAAAA,CAAC,MAAA,EAAA,EAAe,SAAA,EAAU,2CAAA,EACxB,gBAAM,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,EAAA,EADR,GAEX;AAAA,OACD;AAAA,IACD,CAAA,MAAO;AACN,MAAA,MAAM,IAAA,GAAO,KAAA,CAAM,KAAA,CAAM,2BAA2B,CAAA;AACpD,MAAA,MAAM,OAAO,IAAA,GAAO,YAAA,CAAa,KAAK,CAAC,CAAA,IAAK,EAAE,CAAA,GAAI,IAAA;AAClD,MAAA,IAAI,QAAQ,IAAA,EAAM;AACjB,QAAA,KAAA,CAAM,IAAA;AAAA,0BACLA,cAAAA;AAAA,YAAC,GAAA;AAAA,YAAA;AAAA,cAEA,IAAA;AAAA,cACA,SAAA,EAAU,8BAAA;AAAA,cACV,GAAA,EAAI,qBAAA;AAAA,cAEH,eAAK,CAAC;AAAA,aAAA;AAAA,YALF;AAAA;AAMN,SACD;AAAA,MACD,CAAA,MAAO;AACN,QAAA,KAAA,CAAM,KAAK,KAAK,CAAA;AAAA,MACjB;AAAA,IACD;AACA,IAAA,GAAA,IAAO,CAAA;AACP,IAAA,IAAA,GAAO,KAAA,CAAM,QAAQ,KAAA,CAAM,MAAA;AAAA,EAC5B;AACA,EAAA,IAAI,IAAA,GAAO,KAAK,MAAA,EAAQ;AACvB,IAAA,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,IAAI,CAAC,CAAA;AAAA,EAC5B;AACA,EAAA,OAAO,KAAA;AACR;AAEA,SAAS,WACR,IAAA,EACmD;AACnD,EAAA,IAAI,IAAA,CAAK,UAAA,CAAW,MAAM,CAAA,EAAG,OAAO,EAAE,GAAA,EAAK,IAAA,EAAM,IAAA,EAAM,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA,EAAE;AACrE,EAAA,IAAI,IAAA,CAAK,UAAA,CAAW,KAAK,CAAA,EAAG,OAAO,EAAE,GAAA,EAAK,IAAA,EAAM,IAAA,EAAM,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA,EAAE;AACpE,EAAA,IAAI,IAAA,CAAK,UAAA,CAAW,IAAI,CAAA,EAAG,OAAO,EAAE,GAAA,EAAK,IAAA,EAAM,IAAA,EAAM,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA,EAAE;AACnE,EAAA,OAAO,IAAA;AACR;AAEA,SAAS,gBAAgB,IAAA,EAAuB;AAC/C,EAAA,OAAO,QAAA,CAAS,KAAK,IAAI,CAAA;AAC1B;AAEA,SAAS,cAAc,IAAA,EAAuB;AAC7C,EAAA,OAAO,SAAA,CAAU,KAAK,IAAI,CAAA;AAC3B;AAEO,SAAS,aAAA,CAAc,EAAE,QAAA,EAAU,SAAA,EAAU,EAAuB;AAC1E,EAAA,MAAM,MAAA,GAAS,SACb,OAAA,CAAQ,OAAA,EAAS,IAAI,CAAA,CACrB,IAAA,EAAK,CACL,KAAA,CAAM,QAAQ,CAAA;AAChB,EAAA,uBACCA,cAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACA,SAAA,EAAW,EAAA;AAAA,QACV,sNAAA;AAAA,QACA;AAAA,OACD;AAAA,MAEC,QAAA,EAAA,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,EAAO,KAAA,KAAU;AAC7B,QAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,KAAA,CAAM,IAAI,CAAA;AAC9B,QAAA,MAAM,OAAA,GAAU,UAAA,CAAW,KAAA,CAAM,CAAC,KAAK,EAAE,CAAA;AACzC,QAAA,IAAI,OAAA,IAAW,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG;AAClC,UAAA,MAAM,EAAE,GAAA,EAAK,IAAA,EAAK,GAAI,OAAA;AACtB,UAAA,uBAAOA,cAAAA,CAAC,GAAA,EAAA,EAAiB,QAAA,EAAA,YAAA,CAAa,IAAI,KAAzB,KAA2B,CAAA;AAAA,QAC7C;AACA,QAAA,IAAI,KAAA,CAAM,KAAA,CAAM,eAAe,CAAA,EAAG;AACjC,UAAA,uBACCA,eAAC,IAAA,EAAA,EACC,QAAA,EAAA,KAAA,CAAM,IAAI,CAAC,IAAA,EAAM,8BACjBA,cAAAA,CAAC,QACC,QAAA,EAAA,YAAA,CAAa,IAAA,CAAK,QAAQ,QAAA,EAAU,EAAE,CAAC,CAAA,EAAA,EADhC,SAET,CACA,CAAA,EAAA,EALO,KAMT,CAAA;AAAA,QAEF;AACA,QAAA,IAAI,KAAA,CAAM,KAAA,CAAM,aAAa,CAAA,EAAG;AAC/B,UAAA,uBACCA,eAAC,IAAA,EAAA,EACC,QAAA,EAAA,KAAA,CAAM,IAAI,CAAC,IAAA,EAAM,8BACjBA,cAAAA,CAAC,QACC,QAAA,EAAA,YAAA,CAAa,IAAA,CAAK,QAAQ,SAAA,EAAW,EAAE,CAAC,CAAA,EAAA,EADjC,SAET,CACA,CAAA,EAAA,EALO,KAMT,CAAA;AAAA,QAEF;AACA,QAAA,uBAAOA,eAAC,GAAA,EAAA,EAAe,QAAA,EAAA,YAAA,CAAa,MAAM,IAAA,CAAK,GAAG,CAAC,CAAA,EAAA,EAApC,KAAsC,CAAA;AAAA,MACtD,CAAC;AAAA;AAAA,GACF;AAEF;;;ACjIO,IAAM,iBAAA,GAAoB;AAE1B,IAAM,oBAAA,GAAuB;AAO7B,IAAM,iBAAA,GAAoB,+DAA+D,iBAAiB,CAAA,mNAAA;ACwB1G,IAAM,6BAAA,GAAqD;AAAA,EACjE,UAAA,EAAY,WAAA;AAAA,EACZ,gBAAA,EAAkB,oCAAA;AAAA,EAClB,KAAA,EAAO,OAAA;AAAA,EACP,OAAA,EAAS;AACV;AAWA,SAAS,iBAAiB,UAAA,EAA4B;AACrD,EAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,UAAU,CAAA;AAChC,EAAA,IAAI,MAAA,CAAO,MAAM,IAAA,CAAK,OAAA,EAAS,CAAA,EAAG,OAAO,OAAO,UAAU,CAAA;AAC1D,EAAA,OAAO,IAAI,IAAA,CAAK,cAAA,CAAe,IAAA,EAAM;AAAA,IACpC,SAAA,EAAW,QAAA;AAAA,IACX,SAAA,EAAW,OAAA;AAAA,IACX,QAAA,EAAU;AAAA,GACV,CAAA,CAAE,MAAA,CAAO,IAAI,CAAA;AACf;AAEA,SAAS,UAAU,KAAA,EAA2B;AAC7C,EAAA,MAAM,OAAO,KAAA,CAAM,gBAAA,GAAmB,CAAA,EAAA,EAAK,KAAA,CAAM,gBAAgB,CAAA,CAAA,CAAA,GAAM,EAAA;AACvE,EAAA,OAAO,GAAG,KAAA,CAAM,IAAI,IAAI,KAAA,CAAM,EAAE,GAAG,IAAI,CAAA,CAAA;AACxC;AAEO,SAAS,aAAA,CAAc;AAAA,EAC7B,KAAA;AAAA,EACA,MAAA;AAAA,EACA,WAAA;AAAA,EACA,SAAA;AAAA,EACA,kBAAkB,MAAA,GAAS;AAC5B,CAAA,EAAuB;AACtB,EAAA,MAAM,IAAA,GAAO,EAAE,GAAG,6BAAA,EAA+B,GAAG,MAAA,EAAO;AAE3D,EAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACvB,IAAA,uBACCA,cAAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACA,SAAA;AAAA,QACA,OAAO,IAAA,CAAK,UAAA;AAAA,QACZ,aAAa,IAAA,CAAK,gBAAA;AAAA,QAClB,MAAA,EAAQ;AAAA;AAAA,KACT;AAAA,EAEF;AAEA,EAAA,uBACCA,cAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAW,EAAA,CAAG,qBAAA,EAAuB,SAAS,CAAA,EAChD,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS;AACpB,IAAA,MAAM,QAAA,GAAW,IAAI,IAAA,CAAK,IAAA,CAAK,UAAU,CAAA;AACzC,IAAA,MAAM,GAAA,GAAM,OAAO,KAAA,CAAM,QAAA,CAAS,SAAS,CAAA,GACxC,MAAA,GACA,QAAA,CAAS,WAAA,EAAY;AACxB,IAAA,uBACCD,eAAAA;AAAA,MAAC,IAAA;AAAA,MAAA;AAAA,QAEA,SAAA,EAAU,kEAAA;AAAA,QAEV,QAAA,EAAA;AAAA,0BAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qDAAA,EACd,QAAA,EAAA;AAAA,4BAAAC,cAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,+BAAA,EAAiC,eAAK,IAAA,EAAK,CAAA;AAAA,4BACxDA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,+BAAA,EAAgC,UAAU,GAAA,EACxD,QAAA,EAAA,MAAA,CAAO,IAAA,CAAK,UAAU,CAAA,EACxB;AAAA,WAAA,EACD,CAAA;AAAA,0BACAA,cAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,cAAA,EAAgB,eAAK,OAAA,EAAQ,CAAA;AAAA,0BAC1CD,eAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,oCAAA,EACX,QAAA,EAAA;AAAA,YAAA,IAAA,CAAK,KAAA;AAAA,YAAM,IAAA;AAAA,YAAG,SAAA,CAAU,KAAK,KAAK;AAAA,WAAA,EACpC,CAAA;AAAA,0BACAA,eAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,+BAAA,EACX,QAAA,EAAA;AAAA,YAAA,IAAA,CAAK,OAAA;AAAA,YAAQ,IAAA;AAAA,YAAG,KAAK,OAAA,CAAQ,IAAA;AAAA,YAAK,GAAA;AAAA,YAAE,KAAK,OAAA,CAAQ;AAAA,WAAA,EACnD;AAAA;AAAA,OAAA;AAAA,MAfK,IAAA,CAAK;AAAA,KAgBX;AAAA,EAEF,CAAC,CAAA,EACF,CAAA;AAEF;ACtGO,IAAM,yBAAA,GAA6C;AAAA,EACzD,GAAA,EAAK,KAAA;AAAA,EACL,MAAA,EAAQ,QAAA;AAAA,EACR,IAAA,EAAM,MAAA;AAAA,EACN,cAAA,EAAgB;AACjB;AAUA,IAAM,IAAA,GAAqC;AAAA,EAC1C,GAAA,EAAK,gCAAA;AAAA,EACL,MAAA,EAAQ,kCAAA;AAAA,EACR,IAAA,EAAM;AACP,CAAA;AAEA,SAAS,aAAA,CACR,UACA,MAAA,EACS;AACT,EAAA,QAAQ,QAAA;AAAU,IACjB,KAAK,KAAA;AACJ,MAAA,OAAO,MAAA,CAAO,GAAA;AAAA,IACf,KAAK,QAAA;AACJ,MAAA,OAAO,MAAA,CAAO,MAAA;AAAA,IACf,KAAK,MAAA;AACJ,MAAA,OAAO,MAAA,CAAO,IAAA;AAAA,IACf,SAAS;AACR,MAAA,MAAM,UAAA,GAAoB,QAAA;AAC1B,MAAA,OAAO,UAAA;AAAA,IACR;AAAA;AAEF;AAEO,SAAS,SAAA,CAAU;AAAA,EACzB,QAAA;AAAA,EACA,WAAA;AAAA,EACA,MAAA;AAAA,EACA;AACD,CAAA,EAAmB;AAClB,EAAA,MAAM,IAAA,GAAO,EAAE,GAAG,yBAAA,EAA2B,GAAG,MAAA,EAAO;AAEvD,EAAA,uBACCA,eAAAA,CAAC,MAAA,EAAA,EAAK,WAAW,EAAA,CAAG,0CAAA,EAA4C,SAAS,CAAA,EACxE,QAAA,EAAA;AAAA,oBAAAC,cAAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACA,SAAA,EAAW,EAAA;AAAA,UACV,qEAAA;AAAA,UACA,KAAK,QAAQ;AAAA,SACd;AAAA,QAEC,QAAA,EAAA,aAAA,CAAc,UAAU,IAAI;AAAA;AAAA,KAC9B;AAAA,IACC,WAAA,KAAgB,wBAChBA,cAAAA,CAAC,UAAK,SAAA,EAAU,+BAAA,EACd,QAAA,EAAA,IAAA,CAAK,cAAA,EACP,CAAA,GACG;AAAA,GAAA,EACL,CAAA;AAEF;AC/CO,IAAM,2BAAA,GAAiD;AAAA,EAC7D,UAAA,EAAY,sBAAA;AAAA,EACZ,gBAAA,EAAkB,uDAAA;AAAA,EAClB,SAAA,EAAW,WAAA;AAAA,EACX,UAAA,EAAY,aAAA;AAAA,EACZ,aAAA,EAAe;AAChB;AAUA,SAAS,YAAA,CACR,aACA,MAAA,EACS;AACT,EAAA,QAAQ,WAAA;AAAa,IACpB,KAAK,WAAA;AACJ,MAAA,OAAO,MAAA,CAAO,SAAA;AAAA,IACf,KAAK,aAAA;AACJ,MAAA,OAAO,MAAA,CAAO,UAAA;AAAA,IACf,KAAK,gBAAA;AACJ,MAAA,OAAO,MAAA,CAAO,aAAA;AAAA,IACf,SAAS;AACR,MAAA,MAAM,UAAA,GAAoB,WAAA;AAC1B,MAAA,OAAO,UAAA;AAAA,IACR;AAAA;AAEF;AAEA,SAAS,gBAAgB,GAAA,EAAqB;AAC7C,EAAA,MAAM,UAAU,GAAA,GAAM,GAAA;AACtB,EAAA,MAAM,IAAA,GAAO,MAAA,CAAO,SAAA,CAAU,OAAO,CAAA,GAAI,OAAO,OAAO,CAAA,GAAI,OAAA,CAAQ,OAAA,CAAQ,CAAC,CAAA;AAC5E,EAAA,OAAO,CAAA,EAAG,IAAI,CAAA,GAAA,EAAM,GAAG,CAAA,KAAA,CAAA;AACxB;AAEA,SAAS,SAAA,CAAU,OAA0B,EAAA,EAAoB;AAChE,EAAA,OAAO,KAAA,CAAM,KAAK,CAAC,IAAA,KAAS,KAAK,EAAA,KAAO,EAAE,GAAG,KAAA,IAAS,EAAA;AACvD;AAEO,SAAS,WAAA,CAAY;AAAA,EAC3B,KAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA;AAAA,EACA,WAAA;AAAA,EACA;AACD,CAAA,EAAqB;AACpB,EAAA,MAAM,IAAA,GAAO,EAAE,GAAG,2BAAA,EAA6B,GAAG,MAAA,EAAO;AAEzD,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,IAAK,KAAA,CAAM,WAAW,CAAA,EAAG;AAC7C,IAAA,uBACCA,cAAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACA,SAAA;AAAA,QACA,OAAO,IAAA,CAAK,UAAA;AAAA,QACZ,aAAa,IAAA,CAAK,gBAAA;AAAA,QAClB,MAAA,EAAQ;AAAA;AAAA,KACT;AAAA,EAEF;AAEA,EAAA,MAAM,OAAA,GAAU,IAAI,GAAA,CAAI,KAAA,CAAM,IAAI,CAAC,IAAA,KAAS,IAAA,CAAK,EAAE,CAAC,CAAA;AACpD,EAAA,MAAM,UAAA,GAAa,KAAA,CAAM,MAAA,CAAO,CAAC,IAAA,KAAS,CAAC,OAAA,CAAQ,GAAA,CAAI,IAAA,CAAK,IAAI,CAAC,CAAA;AAEjE,EAAA,uBACCD,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAW,EAAA,CAAG,qBAAA,EAAuB,SAAS,CAAA,EACjD,QAAA,EAAA;AAAA,IAAA,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS;AACpB,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,CAAC,SAAS,IAAA,CAAK,IAAA,KAAS,KAAK,EAAE,CAAA;AAC7D,MAAA,uBACCA,eAAAA;AAAA,QAAC,SAAA;AAAA,QAAA;AAAA,UAEA,SAAA,EAAU,kEAAA;AAAA,UAEV,QAAA,EAAA;AAAA,4BAAAC,cAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,qBAAA,EAAuB,eAAK,KAAA,EAAM,CAAA;AAAA,4BAChDA,cAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,+BAAA,EAAiC,eAAK,IAAA,EAAK,CAAA;AAAA,YACvD,QAAA,CAAS,MAAA,GAAS,CAAA,mBAClBA,eAAC,IAAA,EAAA,EAAG,SAAA,EAAU,kCAAA,EACZ,QAAA,EAAA,QAAA,CAAS,GAAA,CAAI,CAAC,IAAA,qBACdD,gBAAC,IAAA,EAAA,EACC,QAAA,EAAA;AAAA,cAAA,IAAA,CAAK,KAAA;AAAA,cAAM,UAAA;AAAA,cAAI,SAAA,CAAU,KAAA,EAAO,IAAA,CAAK,EAAE,CAAA;AAAA,cAAE,GAAA;AAAA,cAAE,GAAA;AAAA,cAC3C,YAAA,CAAa,IAAA,CAAK,WAAA,EAAa,IAAI,CAAA;AAAA,cACnC,OAAO,KAAK,YAAA,KAAiB,QAAA,GAC3B,IAAI,eAAA,CAAgB,IAAA,CAAK,YAAY,CAAC,CAAA,CAAA,GACtC;AAAA,aAAA,EAAA,EALK,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA,CAAA,EAAI,IAAA,CAAK,EAAE,CAAA,CAAA,EAAI,IAAA,CAAK,WAAW,CAAA,CAMpD,CACA,CAAA,EACF,CAAA,GACG;AAAA;AAAA,SAAA;AAAA,QAjBC,IAAA,CAAK;AAAA,OAkBX;AAAA,IAEF,CAAC,CAAA;AAAA,IACA,UAAA,CAAW,MAAA,GAAS,CAAA,mBACpBC,eAAC,IAAA,EAAA,EAAG,SAAA,EAAU,6BAAA,EACZ,QAAA,EAAA,UAAA,CAAW,GAAA,CAAI,CAAC,IAAA,qBAChBD,gBAAC,IAAA,EAAA,EACC,QAAA,EAAA;AAAA,MAAA,SAAA,CAAU,KAAA,EAAO,KAAK,IAAI,CAAA;AAAA,MAAE,UAAA;AAAA,MAAI,SAAA,CAAU,KAAA,EAAO,IAAA,CAAK,EAAE,CAAA;AAAA,MAAE,GAAA;AAAA,MAAE,GAAA;AAAA,MAC5D,YAAA,CAAa,IAAA,CAAK,WAAA,EAAa,IAAI,CAAA;AAAA,MACnC,OAAO,KAAK,YAAA,KAAiB,QAAA,GAC3B,IAAI,eAAA,CAAgB,IAAA,CAAK,YAAY,CAAC,CAAA,CAAA,GACtC;AAAA,KAAA,EAAA,EALK,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA,CAAA,EAAI,IAAA,CAAK,EAAE,CAAA,CAAA,EAAI,IAAA,CAAK,WAAW,CAAA,CAMpD,CACA,CAAA,EACF,CAAA,GACG;AAAA,GAAA,EACL,CAAA;AAEF;ACpGO,IAAM,2BAAA,GAAiD;AAAA,EAC7D,UAAA,EAAY,UAAA;AAAA,EACZ,gBAAA,EAAkB,4BAAA;AAAA,EAClB,MAAA,EAAQ,QAAA;AAAA,EACR,KAAA,EAAO,OAAA;AAAA,EACP,aAAA,EAAe,gBAAA;AAAA,EACf,eAAA,EAAiB,MAAA;AAAA,EACjB,MAAA,EAAQ,QAAA;AAAA,EACR,UAAA,EAAY,YAAA;AAAA,EACZ,MAAA,EAAQ,QAAA;AAAA,EACR,iBAAA,EAAmB,mBAAA;AAAA,EACnB,OAAA,EAAS,SAAA;AAAA,EACT,OAAA,EAAS;AACV;AAYO,SAAS,iBAAiB,GAAA,EAAsB;AACtD,EAAA,IAAI;AACH,IAAA,OAAO,IAAI,GAAA,CAAI,GAAG,CAAA,CAAE,QAAA,KAAa,QAAA;AAAA,EAClC,CAAA,CAAA,MAAQ;AACP,IAAA,OAAO,KAAA;AAAA,EACR;AACD;AAEO,SAAS,uBAAuB,GAAA,EAA8B;AACpE,EAAA,IAAI,GAAA,CAAI,UAAA,KAAe,IAAA,EAAM,OAAO,IAAA;AACpC,EAAA,OAAA,CAAQ,GAAA,CAAI,OAAA,IAAW,EAAC,EAAG,IAAA,CAAK,CAAC,MAAA,KAAW,CAAC,gBAAA,CAAiB,MAAA,CAAO,GAAG,CAAC,CAAA;AAC1E;AAIA,SAAS,aAAa,GAAA,EAAiC;AACtD,EAAA,IAAI,sBAAA,CAAuB,GAAG,CAAA,EAAG,OAAO,YAAA;AACxC,EAAA,OAAO,GAAA,CAAI,MAAA;AACZ;AAEA,IAAM,eAAA,GAA8C;AAAA,EACnD,UAAA,EAAY,yCAAA;AAAA,EACZ,OAAA,EAAS,uBAAA;AAAA,EACT,SAAA,EAAW,6BAAA;AAAA,EACX,SAAA,EAAW;AACZ,CAAA;AAEO,SAAS,WAAA,CAAY;AAAA,EAC3B,GAAA;AAAA,EACA,SAAA;AAAA,EACA,MAAA;AAAA,EACA,YAAA;AAAA,EACA,WAAA;AAAA,EACA;AACD,CAAA,EAAqB;AACpB,EAAA,MAAM,IAAA,GAAO,EAAE,GAAG,2BAAA,EAA6B,GAAG,MAAA,EAAO;AACzD,EAAA,MAAM,WAAW+B,WAAAA,EAAM;AACvB,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIF,eAAS,EAAE,CAAA;AACvC,EAAA,MAAM,OAAA,GAAU,OAAO,IAAA,EAAK;AAE5B,EAAA,IAAI,CAAC,GAAA,EAAK;AACT,IAAA,uBACC5B,cAAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACA,SAAA;AAAA,QACA,OAAO,IAAA,CAAK,UAAA;AAAA,QACZ,aAAa,IAAA,CAAK,gBAAA;AAAA,QAClB,MAAA,EAAQ;AAAA;AAAA,KACT;AAAA,EAEF;AAEA,EAAA,MAAM,UAAA,GAAa,aAAa,GAAG,CAAA;AACnC,EAAA,MAAM,WAAA,GAAc,YAAA,GAAe,GAAA,CAAI,MAAM,KAAK,GAAA,CAAI,MAAA;AAEtD,EAAA,SAAS,QAAQ,MAAA,EAAmC;AACnD,IAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AAC1B,IAAA,SAAA,CAAU,QAAQ,OAAO,CAAA;AAAA,EAC1B;AAEA,EAAA,uBACCD,eAAAA;AAAA,IAAC,SAAA;AAAA,IAAA;AAAA,MACA,iBAAA,EAAiB,UAAA;AAAA,MACjB,SAAA,EAAW,EAAA;AAAA,QACV,8FAAA;AAAA,QACA,gBAAgB,UAAU,CAAA;AAAA,QAC1B;AAAA,OACD;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mCAAA,EACd,QAAA,EAAA;AAAA,0BAAAA,eAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,qBAAA,EACX,QAAA,EAAA;AAAA,YAAA,IAAA,CAAK,MAAA;AAAA,YAAO,IAAA;AAAA,YAAG;AAAA,WAAA,EACjB,CAAA;AAAA,UACC,UAAA,KAAe,+BACfC,cAAAA,CAAC,UAAK,SAAA,EAAU,+DAAA,EACd,QAAA,EAAA,IAAA,CAAK,UAAA,EACP,CAAA,GACG;AAAA,SAAA,EACL,CAAA;AAAA,wBACAD,eAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,0DAAA,EACZ,QAAA,EAAA;AAAA,UAAA,OAAO,IAAI,KAAA,KAAU,QAAA,mBACrBA,eAAAA,CAAAkC,qBAAA,EACC,QAAA,EAAA;AAAA,4BAAAjC,cAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,uBAAA,EAAyB,eAAK,KAAA,EAAM,CAAA;AAAA,4BAClDA,cAAAA,CAAC,IAAA,EAAA,EAAI,QAAA,EAAA,GAAA,CAAI,KAAA,EAAM;AAAA,WAAA,EAChB,CAAA,GACG,IAAA;AAAA,0BACJA,cAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,uBAAA,EAAyB,eAAK,aAAA,EAAc,CAAA;AAAA,0BAC1DA,cAAAA,CAAC,IAAA,EAAA,EACC,QAAA,EAAA,GAAA,CAAI,aAAA,CAAc,MAAA,GAAS,CAAA,GACzB,GAAA,CAAI,aAAA,CAAc,IAAA,CAAK,IAAI,CAAA,GAC3B,KAAK,eAAA,EACT,CAAA;AAAA,0BACAA,cAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,uBAAA,EAAyB,eAAK,MAAA,EAAO,CAAA;AAAA,0BACnDA,cAAAA,CAAC,IAAA,EAAA,EAAI,QAAA,EAAA,GAAA,CAAI,MAAA,EAAO;AAAA,SAAA,EACjB,CAAA;AAAA,QACC,GAAA,CAAI,OAAA,IAAW,GAAA,CAAI,OAAA,CAAQ,MAAA,GAAS,CAAA,mBACpCA,cAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,6BAAA,EACZ,QAAA,EAAA,GAAA,CAAI,OAAA,CAAQ,GAAA;AAAA,UAAI,CAAC,WACjB,gBAAA,CAAiB,MAAA,CAAO,GAAG,CAAA,mBAC1BA,cAAAA,CAAC,IAAA,EAAA,EACA,QAAA,kBAAAA,cAAAA;AAAA,YAAC,GAAA;AAAA,YAAA;AAAA,cACA,SAAA,EAAU,8BAAA;AAAA,cACV,MAAM,MAAA,CAAO,GAAA;AAAA,cACb,GAAA,EAAI,YAAA;AAAA,cACJ,MAAA,EAAO,QAAA;AAAA,cAEN,QAAA,EAAA,MAAA,CAAO;AAAA;AAAA,WACT,EAAA,EARQ,CAAA,EAAG,MAAA,CAAO,KAAK,CAAA,CAAA,EAAI,MAAA,CAAO,GAAG,CAAA,CAStC,CAAA,mBAEAD,eAAAA,CAAC,IAAA,EAAA,EACC,QAAA,EAAA;AAAA,YAAA,MAAA,CAAO,KAAA;AAAA,YAAM,IAAA;AAAA,YAAG,IAAA,CAAK,UAAA;AAAA,YAAW;AAAA,WAAA,EAAA,EADzB,GAAG,MAAA,CAAO,KAAK,CAAA,CAAA,EAAI,MAAA,CAAO,GAAG,CAAA,CAEtC;AAAA,WAGH,CAAA,GACG,IAAA;AAAA,wBACJA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qBAAA,EACd,QAAA,EAAA;AAAA,0BAAAC,eAAC,OAAA,EAAA,EAAM,SAAA,EAAU,uBAAsB,OAAA,EAAS,QAAA,EAC9C,eAAK,MAAA,EACP,CAAA;AAAA,0BACAA,cAAAA;AAAA,YAAC,UAAA;AAAA,YAAA;AAAA,cACA,EAAA,EAAI,QAAA;AAAA,cACJ,SAAA,EAAU,yEAAA;AAAA,cACV,KAAA,EAAO,MAAA;AAAA,cACP,aAAa,IAAA,CAAK,iBAAA;AAAA,cAClB,UAAU,CAAC,KAAA,KAAU,SAAA,CAAU,KAAA,CAAM,OAAO,KAAK;AAAA;AAAA;AAClD,SAAA,EACD,CAAA;AAAA,wBACAD,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sBAAA,EACd,QAAA,EAAA;AAAA,0BAAAC,cAAAA;AAAA,YAACyB,gBAAAA;AAAA,YAAA;AAAA,cACA,IAAA,EAAK,QAAA;AAAA,cACL,QAAA,EAAU,QAAQ,MAAA,KAAW,CAAA;AAAA,cAC7B,OAAA,EAAS,MAAM,OAAA,CAAQ,WAAW,CAAA;AAAA,cAEjC,QAAA,EAAA,IAAA,CAAK;AAAA;AAAA,WACP;AAAA,0BACAzB,cAAAA;AAAA,YAACyB,gBAAAA;AAAA,YAAA;AAAA,cACA,IAAA,EAAK,QAAA;AAAA,cACL,OAAA,EAAQ,SAAA;AAAA,cACR,QAAA,EAAU,QAAQ,MAAA,KAAW,CAAA;AAAA,cAC7B,OAAA,EAAS,MAAM,OAAA,CAAQ,WAAW,CAAA;AAAA,cAEjC,QAAA,EAAA,IAAA,CAAK;AAAA;AAAA;AACP,SAAA,EACD;AAAA;AAAA;AAAA,GACD;AAEF","file":"index.cjs","sourcesContent":["\"use client\";\n\nimport { createContext, useContext } from \"react\";\n\n/**\n * Blocks Context Interfaces\n *\n * These interfaces define the contract that consuming apps must implement\n * to provide context to blocks components. Components will automatically\n * consume these contexts when available, falling back to props otherwise.\n */\n\n// =============================================================================\n// Language Context\n// =============================================================================\n\n/**\n * Language definition for the language switcher.\n */\nexport interface BlocksLanguage {\n\tcode: string;\n\tname: string;\n\tflag?: string;\n}\n\n/**\n * Language context value interface.\n * Consuming apps implement this interface to provide language state\n * and actions to blocks components.\n */\nexport interface LanguageContextValue {\n\t/** Current language code (e.g., \"en\", \"es\") */\n\tlanguage: string;\n\t/** Function to change the language */\n\tsetLanguage: (lang: string) => void;\n\t/** Available languages (optional, components have defaults) */\n\tlanguages?: BlocksLanguage[];\n}\n\n/**\n * React context for language.\n * Blocks components will consume this context when available.\n */\nexport const LanguageContext = createContext<LanguageContextValue | null>(null);\n\n/**\n * Hook to consume the language context.\n * Returns null if no provider is present (components should fall back to props).\n */\nexport function useLanguageContext(): LanguageContextValue | null {\n\treturn useContext(LanguageContext);\n}\n","import type { ReactNode } from \"react\";\n\nimport { Skeleton } from \"../ui/skeleton\";\n\nexport function PageTitle({\n\ttitle,\n\tdescription,\n}: {\n\ttitle: string;\n\tdescription?: string;\n}) {\n\treturn (\n\t\t<header className=\"flex flex-col gap-1\">\n\t\t\t<h1 className=\"text-2xl font-semibold tracking-tight\">{title}</h1>\n\t\t\t{description ? (\n\t\t\t\t<p className=\"text-sm text-muted-foreground\">{description}</p>\n\t\t\t) : null}\n\t\t</header>\n\t);\n}\n\nexport function Field({\n\tlabel,\n\tchildren,\n}: {\n\tlabel: string;\n\tchildren: ReactNode;\n}) {\n\treturn (\n\t\t<label className=\"flex flex-col gap-1 text-sm\">\n\t\t\t<span className=\"font-medium\">{label}</span>\n\t\t\t{children}\n\t\t</label>\n\t);\n}\n\nexport function ListSkeleton() {\n\treturn (\n\t\t<div className=\"flex flex-col gap-3\" aria-hidden=\"true\">\n\t\t\t<Skeleton className=\"h-8 w-48\" />\n\t\t\t<Skeleton className=\"h-10 w-full\" />\n\t\t\t<Skeleton className=\"h-16 w-full\" />\n\t\t\t<Skeleton className=\"h-16 w-full\" />\n\t\t\t<Skeleton className=\"h-16 w-full\" />\n\t\t</div>\n\t);\n}\n\nexport function TableSkeleton({\n\tcolumns,\n\trows = 5,\n}: {\n\tcolumns: number;\n\trows?: number;\n}) {\n\treturn (\n\t\t<div aria-busy=\"true\" className=\"flex flex-col gap-2\">\n\t\t\t{Array.from({ length: rows }, (_, row) => (\n\t\t\t\t<div key={row} className=\"flex gap-2\">\n\t\t\t\t\t{Array.from({ length: columns }, (_, column) => (\n\t\t\t\t\t\t<Skeleton key={column} className=\"h-8 flex-1\" />\n\t\t\t\t\t))}\n\t\t\t\t</div>\n\t\t\t))}\n\t\t</div>\n\t);\n}\n","import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n\treturn twMerge(clsx(inputs));\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { AlertTriangle, Inbox, Loader2 } from \"lucide-react\";\n\nimport { cn } from \"../lib/utils\";\nimport {\n\tEmpty,\n\tEmptyContent,\n\tEmptyDescription,\n\tEmptyHeader,\n\tEmptyMedia,\n\tEmptyTitle,\n} from \"../ui/empty\";\n\nexport function LoadingState({\n\tlabel = \"Loading…\",\n\tclassName,\n}: {\n\tlabel?: string;\n\tclassName?: string;\n}) {\n\treturn (\n\t\t<div\n\t\t\trole=\"status\"\n\t\t\taria-live=\"polite\"\n\t\t\tclassName={cn(\n\t\t\t\t\"flex items-center justify-center gap-2 py-12 text-sm text-muted-foreground\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t<Loader2 className=\"size-4 animate-spin\" aria-hidden=\"true\" />\n\t\t\t<span>{label}</span>\n\t\t</div>\n\t);\n}\n\nexport function ErrorState({\n\ttitle = \"Something went wrong\",\n\tdescription,\n\taction,\n\tclassName,\n}: {\n\ttitle?: string;\n\tdescription?: string;\n\taction?: React.ReactNode;\n\tclassName?: string;\n}) {\n\treturn (\n\t\t<div\n\t\t\trole=\"alert\"\n\t\t\tclassName={cn(\n\t\t\t\t\"flex flex-col items-center gap-3 rounded-xl border border-dashed border-destructive/40 bg-destructive/5 py-12 text-center\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t<AlertTriangle className=\"size-6 text-destructive\" aria-hidden=\"true\" />\n\t\t\t<div>\n\t\t\t\t<p className=\"font-medium\">{title}</p>\n\t\t\t\t{description ? (\n\t\t\t\t\t<p className=\"mt-1 text-sm text-muted-foreground\">{description}</p>\n\t\t\t\t) : null}\n\t\t\t</div>\n\t\t\t{action}\n\t\t</div>\n\t);\n}\n\n/** Accept any icon component with a className prop — avoids LucideIcon\n * version skew between blocks peers and consuming apps. */\nexport type EmptyStateIcon = React.ComponentType<{\n\tclassName?: string;\n\t\"aria-hidden\"?: boolean | \"true\" | \"false\";\n}>;\n\nexport type EmptyStateProps = {\n\ttitle: string;\n\tdescription?: string;\n\taction?: React.ReactNode;\n\ticon?: EmptyStateIcon;\n\tvariant?: \"default\" | \"compact\";\n\tclassName?: string;\n};\n\nexport function EmptyState({\n\ttitle,\n\tdescription,\n\taction,\n\ticon: Icon = Inbox,\n\tvariant = \"default\",\n\tclassName,\n}: EmptyStateProps) {\n\tconst isCompact = variant === \"compact\";\n\n\treturn (\n\t\t<Empty\n\t\t\tclassName={cn(\n\t\t\t\t\"gap-3\",\n\t\t\t\tisCompact\n\t\t\t\t\t? \"flex-none rounded-none px-4 py-6\"\n\t\t\t\t\t: \"flex-none rounded-xl border border-dashed px-6 py-12\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t<EmptyHeader className=\"gap-3\">\n\t\t\t\t<EmptyMedia\n\t\t\t\t\tvariant=\"icon\"\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"mb-0 bg-transparent text-muted-foreground\",\n\t\t\t\t\t\tisCompact\n\t\t\t\t\t\t\t? \"size-auto [&_svg:not([class*='size-'])]:size-8 [&_svg]:opacity-50\"\n\t\t\t\t\t\t\t: \"size-auto [&_svg:not([class*='size-'])]:size-6\",\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t<Icon aria-hidden=\"true\" />\n\t\t\t\t</EmptyMedia>\n\t\t\t\t<EmptyTitle\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"font-medium tracking-normal\",\n\t\t\t\t\t\tisCompact ? \"text-sm\" : \"text-base\",\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t{title}\n\t\t\t\t</EmptyTitle>\n\t\t\t\t{description ? (\n\t\t\t\t\t<EmptyDescription className=\"mt-0\">{description}</EmptyDescription>\n\t\t\t\t) : null}\n\t\t\t</EmptyHeader>\n\t\t\t{action ? <EmptyContent className=\"gap-0\">{action}</EmptyContent> : null}\n\t\t</Empty>\n\t);\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\n\nimport { cn } from \"../lib/utils\";\n\nfunction Empty({ className, ...props }: React.ComponentProps<\"div\">) {\n\treturn (\n\t\t<div\n\t\t\tdata-slot=\"empty\"\n\t\t\tclassName={cn(\n\t\t\t\t\"flex min-w-0 flex-1 flex-col items-center justify-center gap-6 rounded-lg p-6 text-center text-balance md:p-12\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction EmptyHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n\treturn (\n\t\t<div\n\t\t\tdata-slot=\"empty-header\"\n\t\t\tclassName={cn(\n\t\t\t\t\"flex max-w-sm flex-col items-center gap-2 text-center\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nconst emptyMediaVariants = cva(\n\t\"mb-2 flex shrink-0 items-center justify-center [&_svg]:pointer-events-none [&_svg]:shrink-0\",\n\t{\n\t\tvariants: {\n\t\t\tvariant: {\n\t\t\t\tdefault: \"bg-transparent\",\n\t\t\t\ticon: \"flex size-10 shrink-0 items-center justify-center rounded-lg bg-muted text-foreground [&_svg:not([class*='size-'])]:size-6\",\n\t\t\t},\n\t\t},\n\t\tdefaultVariants: {\n\t\t\tvariant: \"default\",\n\t\t},\n\t},\n);\n\nfunction EmptyMedia({\n\tclassName,\n\tvariant = \"default\",\n\t...props\n}: React.ComponentProps<\"div\"> & VariantProps<typeof emptyMediaVariants>) {\n\treturn (\n\t\t<div\n\t\t\tdata-slot=\"empty-icon\"\n\t\t\tdata-variant={variant}\n\t\t\tclassName={cn(emptyMediaVariants({ variant, className }))}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction EmptyTitle({ className, ...props }: React.ComponentProps<\"div\">) {\n\treturn (\n\t\t<div\n\t\t\tdata-slot=\"empty-title\"\n\t\t\tclassName={cn(\"text-lg font-medium tracking-tight\", className)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction EmptyDescription({ className, ...props }: React.ComponentProps<\"p\">) {\n\treturn (\n\t\t<div\n\t\t\tdata-slot=\"empty-description\"\n\t\t\tclassName={cn(\n\t\t\t\t\"text-sm/relaxed text-muted-foreground [&>a]:underline [&>a]:underline-offset-4 [&>a:hover]:text-primary\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction EmptyContent({ className, ...props }: React.ComponentProps<\"div\">) {\n\treturn (\n\t\t<div\n\t\t\tdata-slot=\"empty-content\"\n\t\t\tclassName={cn(\n\t\t\t\t\"flex w-full max-w-sm min-w-0 flex-col items-center gap-4 text-sm text-balance\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nexport {\n\tEmpty,\n\tEmptyHeader,\n\tEmptyTitle,\n\tEmptyDescription,\n\tEmptyContent,\n\tEmptyMedia,\n};\n","\"use client\";\n\nimport {\n\tAlertDialog,\n\tAlertDialogAction,\n\tAlertDialogCancel,\n\tAlertDialogContent,\n\tAlertDialogDescription,\n\tAlertDialogFooter,\n\tAlertDialogHeader,\n\tAlertDialogTitle,\n} from \"../ui/alert-dialog\";\n\nexport type ConfirmDestructiveDialogProps = {\n\topen: boolean;\n\tonOpenChange: (open: boolean) => void;\n\ttitle: string;\n\tdescription: string;\n\tconfirmLabel?: string;\n\tcancelLabel?: string;\n\tonConfirm: () => void;\n};\n\n/**\n * Shared confirm step for destructive actions (delete, mute, etc.).\n * Prefer this over window.confirm so focus stays in the app and copy is clear.\n */\nexport function ConfirmDestructiveDialog({\n\topen,\n\tonOpenChange,\n\ttitle,\n\tdescription,\n\tconfirmLabel = \"Delete\",\n\tcancelLabel = \"Cancel\",\n\tonConfirm,\n}: ConfirmDestructiveDialogProps) {\n\treturn (\n\t\t<AlertDialog open={open} onOpenChange={onOpenChange}>\n\t\t\t<AlertDialogContent size=\"sm\">\n\t\t\t\t<AlertDialogHeader>\n\t\t\t\t\t<AlertDialogTitle>{title}</AlertDialogTitle>\n\t\t\t\t\t<AlertDialogDescription>{description}</AlertDialogDescription>\n\t\t\t\t</AlertDialogHeader>\n\t\t\t\t<AlertDialogFooter>\n\t\t\t\t\t<AlertDialogCancel>{cancelLabel}</AlertDialogCancel>\n\t\t\t\t\t<AlertDialogAction\n\t\t\t\t\t\tvariant=\"destructive\"\n\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\tonConfirm();\n\t\t\t\t\t\t\tonOpenChange(false);\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t{confirmLabel}\n\t\t\t\t\t</AlertDialogAction>\n\t\t\t\t</AlertDialogFooter>\n\t\t\t</AlertDialogContent>\n\t\t</AlertDialog>\n\t);\n}\n","\"use client\";\n\nimport { Bell } from \"lucide-react\";\n\nimport { cn } from \"../lib/utils\";\nimport { Button } from \"../ui/button\";\nimport {\n\tDropdownMenu,\n\tDropdownMenuContent,\n\tDropdownMenuTrigger,\n} from \"../ui/dropdown-menu\";\n\nexport type NotificationBellItem = {\n\tid: string;\n\ttitle: string;\n\tmessage: string;\n\tread: boolean;\n\tcreatedAt: string;\n\thref?: string | null;\n};\n\nexport type NotificationBellLabels = {\n\ttitle: string;\n\tempty: string;\n\tviewAll: string;\n};\n\nexport const DEFAULT_NOTIFICATION_BELL_LABELS: NotificationBellLabels = {\n\ttitle: \"Notifications\",\n\tempty: \"You're all caught up.\",\n\tviewAll: \"View all\",\n};\n\nexport type NotificationBellProps = {\n\titems: NotificationBellItem[];\n\tunreadCount: number;\n\tisLoading?: boolean;\n\tlabels?: Partial<NotificationBellLabels>;\n\tviewAllHref: string;\n\tformatTime?: (iso: string) => string;\n\tonOpenChange?: (open: boolean) => void;\n\talign?: \"start\" | \"end\";\n\tclassName?: string;\n};\n\nfunction formatUnreadBadge(count: number): string {\n\treturn count > 9 ? \"9+\" : String(count);\n}\n\nfunction defaultFormatTime(iso: string): string {\n\tconst date = new Date(iso);\n\tif (Number.isNaN(date.getTime())) return iso;\n\treturn date.toLocaleString(undefined, {\n\t\tdateStyle: \"short\",\n\t\ttimeStyle: \"short\",\n\t});\n}\n\nfunction NotificationListSkeleton({ rows = 3 }: { rows?: number }) {\n\treturn (\n\t\t<div className=\"flex flex-col\" aria-hidden=\"true\">\n\t\t\t{Array.from({ length: rows }, (_, index) => (\n\t\t\t\t<div key={index}>\n\t\t\t\t\t<div className=\"space-y-2 px-4 py-3\">\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tdata-slot=\"skeleton\"\n\t\t\t\t\t\t\tclassName=\"bg-muted h-4 w-36 animate-pulse rounded-md motion-reduce:animate-none\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tdata-slot=\"skeleton\"\n\t\t\t\t\t\t\tclassName=\"bg-muted h-3 w-full animate-pulse rounded-md motion-reduce:animate-none\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tdata-slot=\"skeleton\"\n\t\t\t\t\t\t\tclassName=\"bg-muted h-3 w-20 animate-pulse rounded-md motion-reduce:animate-none\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t\t{index < rows - 1 ? <div className=\"bg-border h-px\" /> : null}\n\t\t\t\t</div>\n\t\t\t))}\n\t\t</div>\n\t);\n}\n\nexport function NotificationBell({\n\titems,\n\tunreadCount,\n\tisLoading = false,\n\tlabels: labelOverrides,\n\tviewAllHref,\n\tformatTime = defaultFormatTime,\n\tonOpenChange,\n\talign = \"end\",\n\tclassName,\n}: NotificationBellProps) {\n\tconst labels = { ...DEFAULT_NOTIFICATION_BELL_LABELS, ...labelOverrides };\n\n\treturn (\n\t\t<DropdownMenu\n\t\t\tonOpenChange={(open) => {\n\t\t\t\tonOpenChange?.(open);\n\t\t\t}}\n\t\t>\n\t\t\t<DropdownMenuTrigger\n\t\t\t\trender={\n\t\t\t\t\t<Button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\t\tclassName={cn(\"relative size-9\", className)}\n\t\t\t\t\t\taria-label={labels.title}\n\t\t\t\t\t/>\n\t\t\t\t}\n\t\t\t>\n\t\t\t\t<Bell className=\"size-4\" />\n\t\t\t\t{unreadCount > 0 ? (\n\t\t\t\t\t<span className=\"bg-destructive text-destructive-foreground absolute -top-0.5 -right-0.5 flex size-4 items-center justify-center rounded-full text-[10px] leading-none font-medium tabular-nums\">\n\t\t\t\t\t\t{formatUnreadBadge(unreadCount)}\n\t\t\t\t\t</span>\n\t\t\t\t) : null}\n\t\t\t</DropdownMenuTrigger>\n\t\t\t<DropdownMenuContent align={align} className=\"w-80 p-0\">\n\t\t\t\t<div className=\"flex items-center justify-between border-b px-4 py-3\">\n\t\t\t\t\t<h4 className=\"font-semibold\">{labels.title}</h4>\n\t\t\t\t</div>\n\t\t\t\t<div className=\"max-h-80 overflow-y-auto\">\n\t\t\t\t\t{isLoading ? (\n\t\t\t\t\t\t<NotificationListSkeleton />\n\t\t\t\t\t) : items.length === 0 ? (\n\t\t\t\t\t\t<p className=\"text-muted-foreground px-4 py-8 text-center text-sm\">\n\t\t\t\t\t\t\t{labels.empty}\n\t\t\t\t\t\t</p>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<div className=\"flex flex-col\">\n\t\t\t\t\t\t\t{items.map((item, index) => {\n\t\t\t\t\t\t\t\tconst body = (\n\t\t\t\t\t\t\t\t\t<div className=\"flex-1 space-y-1\">\n\t\t\t\t\t\t\t\t\t\t<p className=\"text-sm leading-none font-medium\">\n\t\t\t\t\t\t\t\t\t\t\t{item.title}\n\t\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t\t<p className=\"text-muted-foreground line-clamp-2 text-xs\">\n\t\t\t\t\t\t\t\t\t\t\t{item.message}\n\t\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t\t<p className=\"text-muted-foreground/70 text-xs\">\n\t\t\t\t\t\t\t\t\t\t\t{formatTime(item.createdAt)}\n\t\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t<div key={item.id}>\n\t\t\t\t\t\t\t\t\t\t{item.href ? (\n\t\t\t\t\t\t\t\t\t\t\t<a\n\t\t\t\t\t\t\t\t\t\t\t\thref={item.href}\n\t\t\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\"hover:bg-muted/50 flex gap-3 px-4 py-3 motion-safe:transition-colors\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t!item.read && \"bg-muted/30\",\n\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t{body}\n\t\t\t\t\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\"flex gap-3 px-4 py-3\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t!item.read && \"bg-muted/30\",\n\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t{body}\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t{index < items.length - 1 ? (\n\t\t\t\t\t\t\t\t\t\t\t<div className=\"bg-border h-px\" />\n\t\t\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t\t<div className=\"border-t px-4 py-2\">\n\t\t\t\t\t<a\n\t\t\t\t\t\thref={viewAllHref}\n\t\t\t\t\t\tclassName=\"text-primary block text-center text-sm font-medium hover:underline\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{labels.viewAll}\n\t\t\t\t\t</a>\n\t\t\t\t</div>\n\t\t\t</DropdownMenuContent>\n\t\t</DropdownMenu>\n\t);\n}\n","\"use client\";\n\nexport type EditableSectionMode = \"reading\" | \"editing\" | \"saving\";\n\nexport type EditableSectionLabels = {\n\t/** Visible Edit button label. Default: \"Edit\" */\n\tedit?: string;\n\t/** Visible Save button label. Default: \"Save\" */\n\tsave?: string;\n\t/** Visible Save button label while pending. Default: \"Saving…\" */\n\tsaving?: string;\n\t/** Visible Cancel button label. Default: \"Cancel\" */\n\tcancel?: string;\n\t/** Polite live-region message after a successful save. Default: \"Saved\" */\n\tsaved?: string;\n\t/** ConfirmDestructiveDialog title when discarding dirty edits. */\n\tdiscardTitle?: string;\n\t/** ConfirmDestructiveDialog description when discarding dirty edits. */\n\tdiscardDescription?: string;\n\t/** ConfirmDestructiveDialog confirm label. Default: \"Discard\" */\n\tdiscardConfirm?: string;\n\t/** ConfirmDestructiveDialog cancel label. Default: \"Keep editing\" */\n\tdiscardCancel?: string;\n};\n\nexport const DEFAULT_EDITABLE_SECTION_LABELS = {\n\tedit: \"Edit\",\n\tsave: \"Save\",\n\tsaving: \"Saving…\",\n\tcancel: \"Cancel\",\n\tsaved: \"Saved\",\n\tdiscardTitle: \"Discard changes?\",\n\tdiscardDescription: \"If you leave now, unsaved changes will be lost.\",\n\tdiscardConfirm: \"Discard\",\n\tdiscardCancel: \"Keep editing\",\n} as const satisfies Required<EditableSectionLabels>;\n","\"use client\";\n\nimport {\n\tuseCallback,\n\tuseEffect,\n\tuseId,\n\tuseRef,\n\tuseState,\n\ttype CSSProperties,\n\ttype FormEvent,\n\ttype KeyboardEvent,\n\ttype RefObject,\n} from \"react\";\n\nimport {\n\tDEFAULT_EDITABLE_SECTION_LABELS,\n\ttype EditableSectionLabels,\n\ttype EditableSectionMode,\n} from \"./types\";\n\nexport type UseEditableSectionOptions = {\n\tonSave: () => Promise<void> | void;\n\t/** Called when edit mode exits without saving (Cancel / Escape / discard confirm). */\n\tonDiscard?: () => void;\n\t/** Whether the in-progress edit has unsaved changes. Defaults to false. */\n\tisDirty?: boolean;\n\t/** Id of an existing heading that names this section (preferred). */\n\tlabelledBy?: string;\n\t/** Fallback accessible name when there is no visible heading. */\n\ttitle?: string;\n\tlabels?: EditableSectionLabels;\n\t/**\n\t * After the first edit entry, keep `min-height` at the tallest measured\n\t * content height so later toggles do not shift. First toggle may still shift.\n\t */\n\tstableHeight?: boolean;\n};\n\nexport type UseEditableSectionResult = {\n\tmode: EditableSectionMode;\n\tisEditing: boolean;\n\tisSaving: boolean;\n\tstartEdit: () => void;\n\trequestCancel: () => void;\n\tformProps: {\n\t\tonSubmit: (event: FormEvent<HTMLFormElement>) => void;\n\t\tonKeyDown: (event: KeyboardEvent<HTMLFormElement>) => void;\n\t\tnoValidate: true;\n\t};\n\tcontentRef: RefObject<HTMLElement | null>;\n\teditButtonRef: RefObject<HTMLButtonElement | null>;\n\t/** Form id for associating external submit buttons via the HTML `form` attribute. */\n\tcontentFormId: string;\n\teditButtonProps: {\n\t\ttype: \"button\";\n\t\tid: string;\n\t\tonClick: () => void;\n\t\tref: RefObject<HTMLButtonElement | null>;\n\t\t\"aria-labelledby\"?: string;\n\t\t\"aria-label\"?: string;\n\t};\n\tsaveButtonProps: {\n\t\ttype: \"submit\";\n\t\tdisabled: boolean;\n\t};\n\tcancelButtonProps: {\n\t\ttype: \"button\";\n\t\tonClick: () => void;\n\t\tdisabled: boolean;\n\t};\n\tstatus: string | null;\n\tstatusProps: {\n\t\trole: \"status\";\n\t\t\"aria-live\": \"polite\";\n\t\tclassName: string;\n\t};\n\tconfirmDiscard: {\n\t\topen: boolean;\n\t\tonOpenChange: (open: boolean) => void;\n\t\ttitle: string;\n\t\tdescription: string;\n\t\tconfirmLabel: string;\n\t\tcancelLabel: string;\n\t\tonConfirm: () => void;\n\t};\n\tresolvedLabels: Required<EditableSectionLabels>;\n\tcontentStyle: CSSProperties | undefined;\n\tactionsClassName: string;\n};\n\nfunction focusFirstField(container: HTMLElement | null) {\n\tif (!container) return;\n\tconst target = container.querySelector<HTMLElement>(\n\t\t\"[data-autofocus], input:not([type='hidden']):not([disabled]), select:not([disabled]), textarea:not([disabled]), [contenteditable='true']\",\n\t);\n\ttarget?.focus();\n}\n\nexport function useEditableSection({\n\tonSave,\n\tonDiscard,\n\tisDirty = false,\n\tlabelledBy,\n\ttitle,\n\tlabels,\n\tstableHeight = false,\n}: UseEditableSectionOptions): UseEditableSectionResult {\n\tconst resolvedLabels = {\n\t\t...DEFAULT_EDITABLE_SECTION_LABELS,\n\t\t...labels,\n\t};\n\tconst [mode, setMode] = useState<EditableSectionMode>(\"reading\");\n\tconst [status, setStatus] = useState<string | null>(null);\n\tconst [confirmOpen, setConfirmOpen] = useState(false);\n\tconst [minHeightPx, setMinHeightPx] = useState<number | undefined>(undefined);\n\n\tconst contentRef = useRef<HTMLElement | null>(null);\n\tconst editButtonRef = useRef<HTMLButtonElement | null>(null);\n\tconst measuredHeightRef = useRef(0);\n\tconst shouldFocusEditRef = useRef(false);\n\tconst shouldFocusFirstFieldRef = useRef(false);\n\tconst editButtonId = useId();\n\tconst contentFormId = useId();\n\tconst isEditing = mode === \"editing\" || mode === \"saving\";\n\tconst isSaving = mode === \"saving\";\n\n\tuseEffect(() => {\n\t\tif (mode === \"reading\" && shouldFocusEditRef.current) {\n\t\t\tshouldFocusEditRef.current = false;\n\t\t\teditButtonRef.current?.focus();\n\t\t\treturn;\n\t\t}\n\t\tif (mode === \"editing\" && shouldFocusFirstFieldRef.current) {\n\t\t\tshouldFocusFirstFieldRef.current = false;\n\t\t\tconst invalid = contentRef.current?.querySelector<HTMLElement>(\n\t\t\t\t\"[aria-invalid='true']\",\n\t\t\t);\n\t\t\tif (invalid) {\n\t\t\t\tinvalid.focus();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tfocusFirstField(contentRef.current);\n\t\t}\n\t}, [mode]);\n\n\tconst exitToReading = useCallback(() => {\n\t\tsetConfirmOpen(false);\n\t\tshouldFocusEditRef.current = true;\n\t\tsetMode(\"reading\");\n\t\tonDiscard?.();\n\t}, [onDiscard]);\n\n\tconst startEdit = useCallback(() => {\n\t\tsetStatus(null);\n\t\tshouldFocusFirstFieldRef.current = true;\n\t\tsetMode(\"editing\");\n\t}, []);\n\n\tconst requestCancel = useCallback(() => {\n\t\tif (isSaving) return;\n\t\tif (isDirty) {\n\t\t\tsetConfirmOpen(true);\n\t\t\treturn;\n\t\t}\n\t\texitToReading();\n\t}, [exitToReading, isDirty, isSaving]);\n\n\tconst handleSubmit = useCallback(\n\t\t(event: FormEvent<HTMLFormElement>) => {\n\t\t\tevent.preventDefault();\n\t\t\tif (isSaving) return;\n\n\t\t\tvoid (async () => {\n\t\t\t\tsetMode(\"saving\");\n\t\t\t\tsetStatus(null);\n\t\t\t\ttry {\n\t\t\t\t\tawait onSave();\n\t\t\t\t\tsetStatus(resolvedLabels.saved);\n\t\t\t\t\tshouldFocusEditRef.current = true;\n\t\t\t\t\tsetMode(\"reading\");\n\t\t\t\t} catch {\n\t\t\t\t\tshouldFocusFirstFieldRef.current = true;\n\t\t\t\t\tsetMode(\"editing\");\n\t\t\t\t}\n\t\t\t})();\n\t\t},\n\t\t[isSaving, onSave, resolvedLabels.saved],\n\t);\n\n\tconst handleFormKeyDown = useCallback(\n\t\t(event: KeyboardEvent<HTMLFormElement>) => {\n\t\t\tif (event.key !== \"Escape\") return;\n\t\t\tevent.preventDefault();\n\t\t\trequestCancel();\n\t\t},\n\t\t[requestCancel],\n\t);\n\n\tuseEffect(() => {\n\t\tif (!stableHeight || !isEditing) return;\n\t\tconst el = contentRef.current;\n\t\tif (!el) return;\n\n\t\tconst measure = () => {\n\t\t\tconst height = el.getBoundingClientRect().height;\n\t\t\tif (height > measuredHeightRef.current) {\n\t\t\t\tmeasuredHeightRef.current = height;\n\t\t\t\tsetMinHeightPx(height);\n\t\t\t}\n\t\t};\n\n\t\tmeasure();\n\t\tconst observer = new ResizeObserver(measure);\n\t\tobserver.observe(el);\n\t\treturn () => observer.disconnect();\n\t}, [isEditing, stableHeight]);\n\n\tconst editButtonNameProps =\n\t\tlabelledBy != null\n\t\t\t? { \"aria-labelledby\": `${labelledBy} ${editButtonId}` as const }\n\t\t\t: title != null && title.length > 0\n\t\t\t\t? { \"aria-label\": `${resolvedLabels.edit} ${title}` as const }\n\t\t\t\t: { \"aria-label\": resolvedLabels.edit };\n\n\treturn {\n\t\tmode,\n\t\tisEditing,\n\t\tisSaving,\n\t\tstartEdit,\n\t\trequestCancel,\n\t\tformProps: {\n\t\t\tonSubmit: handleSubmit,\n\t\t\tonKeyDown: handleFormKeyDown,\n\t\t\tnoValidate: true,\n\t\t},\n\t\tcontentRef,\n\t\teditButtonRef,\n\t\tcontentFormId,\n\t\teditButtonProps: {\n\t\t\ttype: \"button\",\n\t\t\tid: editButtonId,\n\t\t\tonClick: startEdit,\n\t\t\tref: editButtonRef,\n\t\t\t...editButtonNameProps,\n\t\t},\n\t\tsaveButtonProps: {\n\t\t\ttype: \"submit\",\n\t\t\tdisabled: isSaving,\n\t\t},\n\t\tcancelButtonProps: {\n\t\t\ttype: \"button\",\n\t\t\tonClick: requestCancel,\n\t\t\tdisabled: isSaving,\n\t\t},\n\t\tstatus,\n\t\tstatusProps: {\n\t\t\trole: \"status\",\n\t\t\t\"aria-live\": \"polite\",\n\t\t\tclassName: \"sr-only\",\n\t\t},\n\t\tconfirmDiscard: {\n\t\t\topen: confirmOpen,\n\t\t\tonOpenChange: setConfirmOpen,\n\t\t\ttitle: resolvedLabels.discardTitle,\n\t\t\tdescription: resolvedLabels.discardDescription,\n\t\t\tconfirmLabel: resolvedLabels.discardConfirm,\n\t\t\tcancelLabel: resolvedLabels.discardCancel,\n\t\t\tonConfirm: exitToReading,\n\t\t},\n\t\tresolvedLabels,\n\t\tcontentStyle:\n\t\t\tstableHeight && minHeightPx != null\n\t\t\t\t? { minHeight: minHeightPx }\n\t\t\t\t: undefined,\n\t\tactionsClassName:\n\t\t\t\"flex min-h-9 min-w-[11rem] flex-wrap items-center justify-end gap-2\",\n\t};\n}\n","\"use client\";\n\nimport type { ReactNode, Ref } from \"react\";\n\nimport { cn } from \"../../lib/utils\";\nimport { ConfirmDestructiveDialog } from \"../ConfirmDestructiveDialog\";\nimport { Button } from \"../../ui/button\";\nimport {\n\tuseEditableSection,\n\ttype UseEditableSectionOptions,\n\ttype UseEditableSectionResult,\n} from \"./useEditableSection\";\n\nexport type EditableSectionSlots = {\n\tactions: ReactNode;\n\tcontent: ReactNode;\n\tstatus: ReactNode;\n\tmode: UseEditableSectionResult[\"mode\"];\n\tisSaving: boolean;\n\tisEditing: boolean;\n};\n\nexport type EditableSectionProps = UseEditableSectionOptions & {\n\treadView: () => ReactNode;\n\teditView: () => ReactNode;\n\tclassName?: string;\n\t/**\n\t * Compose chrome yourself (Card, dialog, page header, …). Receives the\n\t * stable actions node, the read/edit content, and the live status region.\n\t * When omitted, actions render above content with no surrounding chrome.\n\t */\n\tchildren?: (slots: EditableSectionSlots) => ReactNode;\n};\n\n/**\n * Chrome-free read-first section: semantic text by default, real `<form>` on\n * Edit, pending Save until `onSave` resolves, and ConfirmDestructiveDialog\n * when Cancel/Escape would discard dirty edits.\n *\n * Does not render a Card — place `actions` wherever your layout needs them.\n */\nexport function EditableSection({\n\treadView,\n\teditView,\n\tchildren,\n\tclassName,\n\t...options\n}: EditableSectionProps) {\n\tconst section = useEditableSection(options);\n\tconst {\n\t\tisEditing,\n\t\tisSaving,\n\t\tformProps,\n\t\tcontentRef,\n\t\tcontentFormId,\n\t\teditButtonProps,\n\t\tsaveButtonProps,\n\t\tcancelButtonProps,\n\t\tstatus,\n\t\tstatusProps,\n\t\tconfirmDiscard,\n\t\tresolvedLabels,\n\t\tcontentStyle,\n\t\tactionsClassName,\n\t\tmode,\n\t} = section;\n\n\tconst actionButtons = !isEditing ? (\n\t\t<Button variant=\"outline\" size=\"sm\" {...editButtonProps}>\n\t\t\t{resolvedLabels.edit}\n\t\t</Button>\n\t) : (\n\t\t<>\n\t\t\t<Button variant=\"outline\" size=\"sm\" {...cancelButtonProps}>\n\t\t\t\t{resolvedLabels.cancel}\n\t\t\t</Button>\n\t\t\t<Button\n\t\t\t\tsize=\"sm\"\n\t\t\t\ttype=\"submit\"\n\t\t\t\tform={contentFormId}\n\t\t\t\tdisabled={saveButtonProps.disabled}\n\t\t\t>\n\t\t\t\t{isSaving ? resolvedLabels.saving : resolvedLabels.save}\n\t\t\t</Button>\n\t\t</>\n\t);\n\n\tconst actions = (\n\t\t<div data-slot=\"editable-section-actions\" className={actionsClassName}>\n\t\t\t{actionButtons}\n\t\t</div>\n\t);\n\n\tconst content = isEditing ? (\n\t\t<form\n\t\t\tid={contentFormId}\n\t\t\tref={contentRef as Ref<HTMLFormElement>}\n\t\t\tdata-slot=\"editable-section-content\"\n\t\t\tclassName={cn(\"yenio-editable-section-content space-y-4\")}\n\t\t\tstyle={contentStyle}\n\t\t\t{...formProps}\n\t\t>\n\t\t\t{editView()}\n\t\t</form>\n\t) : (\n\t\t<div\n\t\t\tref={contentRef as Ref<HTMLDivElement>}\n\t\t\tdata-slot=\"editable-section-content\"\n\t\t\tclassName=\"yenio-editable-section-content\"\n\t\t\tstyle={contentStyle}\n\t\t>\n\t\t\t{readView()}\n\t\t</div>\n\t);\n\n\tconst statusNode = (\n\t\t<span {...statusProps} data-slot=\"editable-section-status\">\n\t\t\t{status}\n\t\t</span>\n\t);\n\n\tconst dialog = (\n\t\t<ConfirmDestructiveDialog\n\t\t\topen={confirmDiscard.open}\n\t\t\tonOpenChange={confirmDiscard.onOpenChange}\n\t\t\ttitle={confirmDiscard.title}\n\t\t\tdescription={confirmDiscard.description}\n\t\t\tconfirmLabel={confirmDiscard.confirmLabel}\n\t\t\tcancelLabel={confirmDiscard.cancelLabel}\n\t\t\tonConfirm={confirmDiscard.onConfirm}\n\t\t/>\n\t);\n\n\tif (children) {\n\t\treturn (\n\t\t\t<>\n\t\t\t\t{children({\n\t\t\t\t\tactions,\n\t\t\t\t\tcontent,\n\t\t\t\t\tstatus: statusNode,\n\t\t\t\t\tmode,\n\t\t\t\t\tisSaving,\n\t\t\t\t\tisEditing,\n\t\t\t\t})}\n\t\t\t\t{dialog}\n\t\t\t</>\n\t\t);\n\t}\n\n\treturn (\n\t\t<div data-slot=\"editable-section\" className={cn(\"space-y-4\", className)}>\n\t\t\t{actions}\n\t\t\t{content}\n\t\t\t{statusNode}\n\t\t\t{dialog}\n\t\t</div>\n\t);\n}\n","\"use client\";\n\nimport type { ComponentProps, ReactNode } from \"react\";\n\nimport { cn } from \"../../lib/utils\";\n\n/**\n * Read-mode description list. Column grid and label placement match the\n * typical edit-form field stack (`flex flex-col gap-1.5` + `text-sm` label)\n * so labels and values keep the same x-position across modes.\n */\nexport type DataListProps = ComponentProps<\"dl\">;\n\nexport function DataList({ className, ...props }: DataListProps) {\n\treturn (\n\t\t<dl\n\t\t\tdata-slot=\"data-list\"\n\t\t\tclassName={cn(\"grid gap-4 sm:grid-cols-2\", className)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nexport type DataListItemProps = {\n\tlabel: ReactNode;\n\tchildren?: ReactNode;\n\t/** Shown when `children` is nullish or an empty string. Default: \"—\" */\n\tempty?: ReactNode;\n\tclassName?: string;\n\tlabelClassName?: string;\n\tvalueClassName?: string;\n};\n\nexport function DataListItem({\n\tlabel,\n\tchildren,\n\tempty = \"—\",\n\tclassName,\n\tlabelClassName,\n\tvalueClassName,\n}: DataListItemProps) {\n\tconst isEmpty =\n\t\tchildren == null ||\n\t\tchildren === false ||\n\t\t(typeof children === \"string\" && children.trim().length === 0);\n\n\treturn (\n\t\t<div\n\t\t\tdata-slot=\"data-list-item\"\n\t\t\tclassName={cn(\"flex flex-col gap-1.5\", className)}\n\t\t>\n\t\t\t<dt\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"text-sm leading-none font-medium peer-disabled:cursor-not-allowed peer-disabled:opacity-70\",\n\t\t\t\t\tlabelClassName,\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t{label}\n\t\t\t</dt>\n\t\t\t<dd\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"text-sm wrap-break-word\",\n\t\t\t\t\tisEmpty && \"text-muted-foreground\",\n\t\t\t\t\tvalueClassName,\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t{isEmpty ? empty : children}\n\t\t\t</dd>\n\t\t</div>\n\t);\n}\n","\"use client\";\n\nimport type { ComponentProps, ReactNode } from \"react\";\n\nimport { cn } from \"../../lib/utils\";\n\nexport type FieldMessageProps = Omit<ComponentProps<\"p\">, \"children\"> & {\n\tchildren?: ReactNode;\n\t/**\n\t * Id referenced by the field's `aria-describedby`. Required when the\n\t * message is shown so assistive tech can associate it with the control.\n\t */\n\tid?: string;\n};\n\n/**\n * Reserved slot for field-level validation copy. Always occupies `min-h-5`\n * so async errors do not shift fields under the pointer (CLS outside the\n * 500ms input exclusion window).\n */\nexport function FieldMessage({\n\tid,\n\tchildren,\n\tclassName,\n\t...props\n}: FieldMessageProps) {\n\tconst hasMessage =\n\t\tchildren != null &&\n\t\tchildren !== false &&\n\t\t!(typeof children === \"string\" && children.trim().length === 0);\n\n\treturn (\n\t\t<p\n\t\t\tid={id}\n\t\t\trole={hasMessage ? \"alert\" : undefined}\n\t\t\tdata-slot=\"field-message\"\n\t\t\tclassName={cn(\"min-h-5 text-xs text-destructive\", className)}\n\t\t\t{...props}\n\t\t>\n\t\t\t{hasMessage ? children : \"\\u00a0\"}\n\t\t</p>\n\t);\n}\n","\"use client\";\n\nimport {\n\tuseLayoutEffect,\n\tuseRef,\n\tuseState,\n\ttype ImgHTMLAttributes,\n\ttype ReactNode,\n\ttype SyntheticEvent,\n} from \"react\";\n\nexport type SafeImageProps = Omit<\n\tImgHTMLAttributes<HTMLImageElement>,\n\t\"src\" | \"onError\"\n> & {\n\tsrc?: string | null;\n\t/** Rendered when `src` is missing/empty or the image fails to load. */\n\tfallback: ReactNode;\n\tonError?: (event: SyntheticEvent<HTMLImageElement>) => void;\n};\n\nfunction isBrokenImage(img: HTMLImageElement): boolean {\n\t// Cached failures / races before `onError` attaches often leave\n\t// `complete === true` with a zero natural size instead of firing `error`.\n\treturn img.complete && img.naturalWidth === 0;\n}\n\n/**\n * `<img>` that swaps to `fallback` when the source is missing or fails to load,\n * so the browser never shows its default broken-image glyph.\n */\nexport function SafeImage({\n\tsrc,\n\tfallback,\n\talt = \"\",\n\tonError,\n\t...imgProps\n}: SafeImageProps) {\n\tconst [failed, setFailed] = useState(false);\n\tconst imgRef = useRef<HTMLImageElement | null>(null);\n\tconst resolvedSrc = typeof src === \"string\" && src.length > 0 ? src : null;\n\n\tuseLayoutEffect(() => {\n\t\tsetFailed(false);\n\t}, [resolvedSrc]);\n\n\tuseLayoutEffect(() => {\n\t\tconst img = imgRef.current;\n\t\tif (img && isBrokenImage(img)) {\n\t\t\tsetFailed(true);\n\t\t}\n\t}, [resolvedSrc, failed]);\n\n\tif (!resolvedSrc || failed) {\n\t\treturn <>{fallback}</>;\n\t}\n\n\treturn (\n\t\t<img\n\t\t\t{...imgProps}\n\t\t\tref={imgRef}\n\t\t\tsrc={resolvedSrc}\n\t\t\talt={alt}\n\t\t\tonError={(event) => {\n\t\t\t\tsetFailed(true);\n\t\t\t\tonError?.(event);\n\t\t\t}}\n\t\t/>\n\t);\n}\n","\"use client\";\n\nimport { useTheme } from \"next-themes\";\nimport { Monitor, Moon, Sun } from \"lucide-react\";\nimport { useEffect, useState, useCallback } from \"react\";\nimport {\n\tDropdownMenu,\n\tDropdownMenuContent,\n\tDropdownMenuItem,\n\tDropdownMenuTrigger,\n\tminiMenuContentClassName,\n\tminiMenuContentDefaults,\n} from \"../ui/dropdown-menu\";\nimport { Button } from \"../ui/button\";\nimport { cn } from \"../lib/utils\";\n\ntype ThemeKey = \"system\" | \"light\" | \"dark\";\n\nexport type ThemeSwitcherLabels = {\n\t/** Accessible name for the theme trigger */\n\ttheme?: string;\n\t/** Label for \"System\" option */\n\tsystem?: string;\n\t/** Label for \"Light\" option */\n\tlight?: string;\n\t/** Label for \"Dark\" option */\n\tdark?: string;\n};\n\nconst defaultLabels: Required<ThemeSwitcherLabels> = {\n\ttheme: \"Theme\",\n\tsystem: \"System\",\n\tlight: \"Light\",\n\tdark: \"Dark\",\n};\n\nexport type ThemeSwitcherProps = {\n\tclassName?: string;\n\t/** Size of the trigger */\n\tsize?: \"sm\" | \"md\" | \"lg\";\n\t/** Shape of the trigger */\n\tshape?: \"rounded\" | \"pill\";\n\t/**\n\t * Kept for existing callers. Both variants render the stored theme's icon\n\t * (sun, moon, or monitor) and open the system / light / dark menu.\n\t */\n\tvariant?: \"default\" | \"mini\";\n\t/** Dropdown alignment */\n\talign?: \"start\" | \"center\" | \"end\";\n\t/** Dropdown side */\n\tside?: \"top\" | \"bottom\" | \"left\" | \"right\";\n\t/** @deprecated No longer used; the trigger no longer renders a tooltip. */\n\ttooltipSide?: \"top\" | \"right\" | \"bottom\" | \"left\";\n\t/** @deprecated No longer used; the trigger no longer renders a tooltip. */\n\ttooltipAlign?: \"start\" | \"center\" | \"end\";\n\t/** @deprecated No longer used; the trigger no longer renders a tooltip. */\n\ttooltipSideOffset?: number;\n\t/** Translation labels - consumers can pass their own t() values */\n\tlabels?: ThemeSwitcherLabels;\n};\n\nconst sizeClasses = {\n\tsm: { button: \"size-8\", icon: \"size-4\" },\n\tmd: { button: \"size-8\", icon: \"size-4\" },\n\tlg: { button: \"size-9\", icon: \"size-4\" },\n};\n\nconst shapeClasses = {\n\trounded: \"rounded-md\",\n\tpill: \"rounded-full\",\n};\n\n/** Compact outline icon button: thin border, muted glyph, no fill. */\nconst iconTriggerClassName =\n\t\"border border-border bg-transparent text-muted-foreground shadow-none hover:bg-accent hover:text-foreground dark:border-border dark:bg-transparent dark:text-muted-foreground dark:hover:bg-accent/50\";\n\nconst themeIcons = {\n\tsystem: Monitor,\n\tlight: Sun,\n\tdark: Moon,\n} as const;\n\nconst themes = [\n\t{ key: \"system\" as const, icon: themeIcons.system },\n\t{ key: \"light\" as const, icon: themeIcons.light },\n\t{ key: \"dark\" as const, icon: themeIcons.dark },\n];\n\nfunction storedTheme(value: string | undefined): ThemeKey | undefined {\n\tif (value === \"system\" || value === \"light\" || value === \"dark\") return value;\n\treturn undefined;\n}\n\nexport function ThemeSwitcher({\n\tclassName,\n\tsize = \"sm\",\n\tshape = \"rounded\",\n\talign = \"end\",\n\tside = \"bottom\",\n\tlabels: userLabels,\n}: ThemeSwitcherProps) {\n\tconst { theme, setTheme } = useTheme();\n\tconst [mounted, setMounted] = useState(false);\n\tconst sizes = sizeClasses[size];\n\tconst shapeClass = shapeClasses[shape];\n\tconst labels = { ...defaultLabels, ...userLabels };\n\n\tconst handleThemeClick = useCallback(\n\t\t(themeKey: ThemeKey) => {\n\t\t\tsetTheme(themeKey);\n\t\t},\n\t\t[setTheme],\n\t);\n\n\tuseEffect(() => {\n\t\tsetMounted(true);\n\t}, []);\n\n\tif (!mounted) {\n\t\treturn (\n\t\t\t<div\n\t\t\t\taria-hidden\n\t\t\t\tclassName={cn(\n\t\t\t\t\tsizes.button,\n\t\t\t\t\tshapeClass,\n\t\t\t\t\ticonTriggerClassName,\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t/>\n\t\t);\n\t}\n\n\tconst currentTheme = storedTheme(theme);\n\tconst TriggerIcon = currentTheme ? themeIcons[currentTheme] : Monitor;\n\n\treturn (\n\t\t<DropdownMenu>\n\t\t\t<DropdownMenuTrigger\n\t\t\t\trender={\n\t\t\t\t\t<Button\n\t\t\t\t\t\tdata-testid=\"theme-switcher\"\n\t\t\t\t\t\tvariant=\"outline\"\n\t\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\t\taria-label={labels.theme}\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\tsizes.button,\n\t\t\t\t\t\t\tshapeClass,\n\t\t\t\t\t\t\ticonTriggerClassName,\n\t\t\t\t\t\t\tclassName,\n\t\t\t\t\t\t)}\n\t\t\t\t\t/>\n\t\t\t\t}\n\t\t\t>\n\t\t\t\t<TriggerIcon className={sizes.icon} />\n\t\t\t</DropdownMenuTrigger>\n\t\t\t<DropdownMenuContent\n\t\t\t\tside={side}\n\t\t\t\talign={align}\n\t\t\t\tsideOffset={miniMenuContentDefaults.sideOffset}\n\t\t\t\tcollisionPadding={miniMenuContentDefaults.collisionPadding}\n\t\t\t\tclassName={miniMenuContentClassName}\n\t\t\t>\n\t\t\t\t{themes.map(({ key, icon: Icon }) => (\n\t\t\t\t\t<DropdownMenuItem\n\t\t\t\t\t\tkey={key}\n\t\t\t\t\t\tonClick={() => handleThemeClick(key)}\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\"gap-2 cursor-pointer\",\n\t\t\t\t\t\t\tcurrentTheme === key &&\n\t\t\t\t\t\t\t\t\"bg-accent text-accent-foreground [&_svg]:text-accent-foreground\",\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t<Icon className=\"size-4\" />\n\t\t\t\t\t\t<span>{labels[key]}</span>\n\t\t\t\t\t</DropdownMenuItem>\n\t\t\t\t))}\n\t\t\t</DropdownMenuContent>\n\t\t</DropdownMenu>\n\t);\n}\n","\"use client\";\n\nimport { Languages } from \"lucide-react\";\nimport {\n\tDropdownMenu,\n\tDropdownMenuContent,\n\tDropdownMenuItem,\n\tDropdownMenuTrigger,\n\tminiMenuContentClassName,\n\tminiMenuContentDefaults,\n} from \"../ui/dropdown-menu\";\nimport { Button } from \"../ui/button\";\nimport { cn } from \"../lib/utils\";\nimport { useLanguageContext } from \"../contexts\";\n\nexport type Language = {\n\t/** Language key/code (e.g., \"en\", \"es\") */\n\tkey: string;\n\t/** Short label kept for callers that still pass segmented copy */\n\tlabel: string;\n\t/** Full native name for the menu (e.g., \"English\", \"Español\") */\n\tnativeName: string;\n};\n\nexport type LanguageSwitcherLabels = {\n\t/** Accessible name for the language trigger */\n\tlanguage?: string;\n};\n\n/**\n * Default languages when none are provided via props or context.\n */\nexport const defaultLanguages: Language[] = [\n\t{ key: \"es-MX\", label: \"ES\", nativeName: \"Español (México)\" },\n\t{ key: \"en\", label: \"EN\", nativeName: \"English\" },\n];\n\nexport type LanguageSwitcherProps = {\n\t/**\n\t * Available languages. Optional if using LanguageContext.\n\t * When context is available, context.languages is used; props override context.\n\t * Falls back to defaultLanguages if neither provided.\n\t */\n\tlanguages?: Language[];\n\t/**\n\t * Current selected language key. Optional if using LanguageContext.\n\t * When context is available, context.language is used; props override context.\n\t */\n\tcurrentLanguage?: string;\n\t/**\n\t * Callback when language changes. Optional if using LanguageContext.\n\t * When context is available, context.setLanguage is used; props override context.\n\t */\n\tonLanguageChange?: (languageKey: string) => void;\n\t/** Accessible name for the trigger */\n\tlabels?: LanguageSwitcherLabels;\n\tclassName?: string;\n\t/** Size of the trigger */\n\tsize?: \"sm\" | \"md\" | \"lg\";\n\t/** Shape of the trigger */\n\tshape?: \"rounded\" | \"squared\" | \"pill\";\n\t/**\n\t * Kept for existing callers. Both variants render the languages glyph\n\t * and open the locale menu.\n\t */\n\tvariant?: \"default\" | \"mini\";\n\t/** @deprecated The trigger is always the languages glyph. */\n\tshowIcon?: boolean;\n\t/** Dropdown alignment */\n\talign?: \"start\" | \"center\" | \"end\";\n\t/** Dropdown side */\n\tside?: \"top\" | \"bottom\" | \"left\" | \"right\";\n\t/** @deprecated No longer used; the trigger no longer renders a tooltip. */\n\ttooltipSide?: \"top\" | \"right\" | \"bottom\" | \"left\";\n\t/** @deprecated No longer used; the trigger no longer renders a tooltip. */\n\ttooltipAlign?: \"start\" | \"center\" | \"end\";\n\t/** @deprecated No longer used; the trigger no longer renders a tooltip. */\n\ttooltipSideOffset?: number;\n};\n\nconst sizeClasses = {\n\tsm: { button: \"size-8\", icon: \"size-4\" },\n\tmd: { button: \"size-8\", icon: \"size-4\" },\n\tlg: { button: \"size-9\", icon: \"size-4\" },\n};\n\nconst shapeClasses = {\n\trounded: \"rounded-md\",\n\tsquared: \"rounded-sm\",\n\tpill: \"rounded-full\",\n};\n\n/** Compact outline icon button: thin border, muted glyph, no fill. */\nconst iconTriggerClassName =\n\t\"border border-border bg-transparent text-muted-foreground shadow-none hover:bg-accent hover:text-foreground dark:border-border dark:bg-transparent dark:text-muted-foreground dark:hover:bg-accent/50\";\n\nexport function LanguageSwitcher({\n\tlanguages: propLanguages,\n\tcurrentLanguage: propCurrentLanguage,\n\tonLanguageChange: propOnLanguageChange,\n\tlabels = {},\n\tclassName,\n\tsize = \"sm\",\n\tshape = \"rounded\",\n\talign = \"end\",\n\tside = \"bottom\",\n}: LanguageSwitcherProps) {\n\tconst context = useLanguageContext();\n\n\tconst contextLanguages = context?.languages?.map((lang) => ({\n\t\tkey: lang.code,\n\t\tlabel: lang.code.toUpperCase(),\n\t\tnativeName: lang.name,\n\t}));\n\n\tconst languages = propLanguages ?? contextLanguages ?? defaultLanguages;\n\tconst currentLanguage = propCurrentLanguage ?? context?.language ?? \"en\";\n\tconst onLanguageChange = propOnLanguageChange ?? context?.setLanguage;\n\n\tconst sizes = sizeClasses[size];\n\tconst shapeClass = shapeClasses[shape];\n\tconst accessibleName = labels.language ?? \"Language\";\n\n\treturn (\n\t\t<DropdownMenu>\n\t\t\t<DropdownMenuTrigger\n\t\t\t\trender={\n\t\t\t\t\t<Button\n\t\t\t\t\t\tvariant=\"outline\"\n\t\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\t\taria-label={accessibleName}\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\tsizes.button,\n\t\t\t\t\t\t\tshapeClass,\n\t\t\t\t\t\t\ticonTriggerClassName,\n\t\t\t\t\t\t\tclassName,\n\t\t\t\t\t\t)}\n\t\t\t\t\t/>\n\t\t\t\t}\n\t\t\t>\n\t\t\t\t<Languages className={sizes.icon} />\n\t\t\t</DropdownMenuTrigger>\n\t\t\t<DropdownMenuContent\n\t\t\t\tside={side}\n\t\t\t\talign={align}\n\t\t\t\tsideOffset={miniMenuContentDefaults.sideOffset}\n\t\t\t\tcollisionPadding={miniMenuContentDefaults.collisionPadding}\n\t\t\t\tclassName={cn(miniMenuContentClassName, \"min-w-0 w-auto\")}\n\t\t\t>\n\t\t\t\t{languages.map(({ key, nativeName }) => (\n\t\t\t\t\t<DropdownMenuItem\n\t\t\t\t\t\tkey={key}\n\t\t\t\t\t\tonClick={() => onLanguageChange?.(key)}\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\"justify-center text-xs font-semibold cursor-pointer px-3\",\n\t\t\t\t\t\t\tcurrentLanguage === key && \"bg-accent text-accent-foreground\",\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t{nativeName}\n\t\t\t\t\t</DropdownMenuItem>\n\t\t\t\t))}\n\t\t\t</DropdownMenuContent>\n\t\t</DropdownMenu>\n\t);\n}\n","/**\n * @name AvatarEditor\n * @description A compact, reusable avatar editor that crops to a 1:1 square.\n * Supports zooming, rotating, and repositioning with an optional grid overlay.\n * The editor shows a circular guide in the UI; the exported image stays square\n * (no circular pixel mask). Display avatars as circles with CSS elsewhere.\n * This is a controlled component - the parent manages the image state.\n *\n * @example\n * ```tsx\n * import { AvatarEditor } from \"@/components/avatar-editor\"\n *\n * export default function ProfileForm() {\n * const [avatarData, setAvatarData] = useState<string | null>(null)\n *\n * return (\n * <form>\n * <AvatarEditor\n * value={avatarData}\n * onChange={setAvatarData}\n * size={280}\n * />\n * <button type=\"submit\">Submit Form</button>\n * </form>\n * )\n * }\n * ```\n *\n * @props\n * - `value` - The current cropped image as a data URL (controlled)\n * - `onChange` - Callback when the cropped image changes\n * - `size` - Size of the editor container in pixels (default: 280)\n * - `showGrid` - Whether to show the alignment grid overlay (default: false)\n * - `outputSize` - Size of the square output image in pixels (default: 256)\n * - `outputFormat` - Output format: 'png' | 'jpeg' | 'webp' (default: 'png')\n * - `outputQuality` - Quality for jpeg/webp output 0-1 (default: 0.92)\n * - `className` - Additional class names\n * - `controlSize` - Control size variant - 'default' for desktop, 'large' for mobile/touch devices (default: 'default')\n *\n * @accessibility\n * - Full keyboard navigation support\n * - ARIA labels for all controls\n * - High contrast focus indicators\n *\n * @dependencies\n * - lucide-react (icons)\n * - @/components/ui/button\n * - @/components/ui/slider\n * - @/components/ui/toggle\n */\n\"use client\";\n\nimport type * as React from \"react\";\nimport { useCallback, useRef, useState, useEffect } from \"react\";\nimport {\n\tUpload,\n\tZoomIn,\n\tZoomOut,\n\tRotateCcw,\n\tRotateCw,\n\tGrid3X3,\n\tX,\n\tMove,\n\tRefreshCw,\n} from \"lucide-react\";\nimport { Button } from \"../ui/button\";\nimport { Slider } from \"../ui/slider\";\nimport { Toggle } from \"../ui/toggle\";\nimport { cn } from \"../lib/utils\";\n\nexport type AvatarEditorLabels = {\n\tuploadAria?: string;\n\tuploadHint?: string;\n\tuploadFormats?: string;\n\tdragging?: string;\n\tzoomOut?: string;\n\tzoomIn?: string;\n\tzoomLevel?: string;\n\trotateLeft?: string;\n\trotateRight?: string;\n\ttoggleGrid?: string;\n\treset?: string;\n\treplace?: string;\n\tdiscard?: string;\n};\n\nconst DEFAULT_LABELS: Required<AvatarEditorLabels> = {\n\tuploadAria: \"Upload image\",\n\tuploadHint: \"Click to upload\",\n\tuploadFormats: \"PNG, JPG up to 10MB\",\n\tdragging: \"Dragging\",\n\tzoomOut: \"Zoom out\",\n\tzoomIn: \"Zoom in\",\n\tzoomLevel: \"Zoom level\",\n\trotateLeft: \"Rotate left 15 degrees\",\n\trotateRight: \"Rotate right 15 degrees\",\n\ttoggleGrid: \"Toggle grid overlay\",\n\treset: \"Reset all transforms\",\n\treplace: \"Upload new image\",\n\tdiscard: \"Discard image\",\n};\n\nexport interface AvatarEditorProps {\n\t/** Current cropped image as data URL (controlled) */\n\tvalue?: string | null;\n\t/** Callback when the cropped image changes */\n\tonChange?: (dataUrl: string | null) => void;\n\t/** Size of the editor container in pixels */\n\tsize?: number;\n\t/** Whether to show grid overlay by default */\n\tshowGrid?: boolean;\n\t/** Square output image size in pixels (width === height) */\n\toutputSize?: number;\n\t/** Output format */\n\toutputFormat?: \"png\" | \"jpeg\" | \"webp\";\n\t/** Output quality for jpeg/webp (0-1) */\n\toutputQuality?: number;\n\t/** Additional class names */\n\tclassName?: string;\n\t/** Control size variant - 'default' for desktop, 'large' for mobile/touch devices */\n\tcontrolSize?: \"default\" | \"large\";\n\t/** Override English chrome strings */\n\tlabels?: AvatarEditorLabels;\n}\n\nexport function AvatarEditor({\n\tvalue: _value,\n\tonChange,\n\tsize = 280,\n\tshowGrid: initialShowGrid = false,\n\toutputSize = 256,\n\toutputFormat = \"png\",\n\toutputQuality = 0.92,\n\tclassName,\n\tcontrolSize = \"default\",\n\tlabels,\n}: AvatarEditorProps) {\n\tconst t = { ...DEFAULT_LABELS, ...labels };\n\tconst canvasRef = useRef<HTMLCanvasElement>(null);\n\tconst fileInputRef = useRef<HTMLInputElement>(null);\n\tconst containerRef = useRef<HTMLDivElement>(null);\n\n\tconst [image, setImage] = useState<HTMLImageElement | null>(null);\n\tconst [imageLoaded, setImageLoaded] = useState(false);\n\tconst [zoom, setZoom] = useState(1);\n\tconst [rotation, setRotation] = useState(0);\n\tconst [position, setPosition] = useState({ x: 0, y: 0 });\n\tconst [isDragging, setIsDragging] = useState(false);\n\tconst [dragStart, setDragStart] = useState({ x: 0, y: 0 });\n\tconst [showGrid, setShowGrid] = useState(initialShowGrid);\n\n\tconst generateOutput = useCallback(() => {\n\t\tif (!canvasRef.current || !image) return null;\n\n\t\tconst outputCanvas = document.createElement(\"canvas\");\n\t\toutputCanvas.width = outputSize;\n\t\toutputCanvas.height = outputSize;\n\t\tconst ctx = outputCanvas.getContext(\"2d\");\n\t\tif (!ctx) return null;\n\n\t\tctx.drawImage(canvasRef.current, 0, 0, outputSize, outputSize);\n\n\t\tconst mimeType = `image/${outputFormat}`;\n\t\treturn outputCanvas.toDataURL(mimeType, outputQuality);\n\t}, [image, outputSize, outputFormat, outputQuality]);\n\n\tuseEffect(() => {\n\t\tif (!canvasRef.current || !image || !imageLoaded) return;\n\n\t\tconst canvas = canvasRef.current;\n\t\tconst ctx = canvas.getContext(\"2d\");\n\t\tif (!ctx) return;\n\n\t\tconst displaySize = size;\n\t\tcanvas.width = displaySize;\n\t\tcanvas.height = displaySize;\n\n\t\t// Square crop only — circular mask/guide stays in CSS/SVG overlays so it\n\t\t// never gets baked into the exported data URL.\n\t\tctx.clearRect(0, 0, displaySize, displaySize);\n\n\t\tctx.save();\n\t\tctx.translate(displaySize / 2, displaySize / 2);\n\t\tctx.rotate((rotation * Math.PI) / 180);\n\n\t\tconst scale = zoom;\n\t\tconst imgAspect = image.width / image.height;\n\t\tlet drawWidth, drawHeight;\n\n\t\tif (imgAspect > 1) {\n\t\t\tdrawHeight = displaySize * scale;\n\t\t\tdrawWidth = drawHeight * imgAspect;\n\t\t} else {\n\t\t\tdrawWidth = displaySize * scale;\n\t\t\tdrawHeight = drawWidth / imgAspect;\n\t\t}\n\n\t\tctx.drawImage(\n\t\t\timage,\n\t\t\t-drawWidth / 2 + position.x,\n\t\t\t-drawHeight / 2 + position.y,\n\t\t\tdrawWidth,\n\t\t\tdrawHeight,\n\t\t);\n\t\tctx.restore();\n\n\t\tconst dataUrl = generateOutput();\n\t\tif (dataUrl) {\n\t\t\tonChange?.(dataUrl);\n\t\t}\n\t}, [\n\t\timage,\n\t\timageLoaded,\n\t\tzoom,\n\t\trotation,\n\t\tposition,\n\t\tsize,\n\t\tgenerateOutput,\n\t\tonChange,\n\t]);\n\n\tconst resetTransforms = useCallback(() => {\n\t\tsetZoom(1);\n\t\tsetRotation(0);\n\t\tsetPosition({ x: 0, y: 0 });\n\t}, []);\n\n\tconst handleFileSelect = useCallback(\n\t\t(e: React.ChangeEvent<HTMLInputElement>) => {\n\t\t\tconst file = e.target.files?.[0];\n\t\t\tif (!file) return;\n\n\t\t\tconst reader = new FileReader();\n\t\t\treader.onload = (event) => {\n\t\t\t\tconst img = new Image();\n\t\t\t\timg.crossOrigin = \"anonymous\";\n\t\t\t\timg.onload = () => {\n\t\t\t\t\tsetImage(img);\n\t\t\t\t\tsetImageLoaded(true);\n\t\t\t\t\tresetTransforms();\n\t\t\t\t};\n\t\t\t\timg.src = event.target?.result as string;\n\t\t\t};\n\t\t\treader.readAsDataURL(file);\n\t\t},\n\t\t[resetTransforms],\n\t);\n\n\tconst handleMouseDown = useCallback(\n\t\t(e: React.MouseEvent) => {\n\t\t\tif (!imageLoaded) return;\n\t\t\tsetIsDragging(true);\n\t\t\tsetDragStart({ x: e.clientX - position.x, y: e.clientY - position.y });\n\t\t},\n\t\t[imageLoaded, position],\n\t);\n\n\tconst handleMouseMove = useCallback(\n\t\t(e: React.MouseEvent) => {\n\t\t\tif (!isDragging) return;\n\t\t\tsetPosition({\n\t\t\t\tx: e.clientX - dragStart.x,\n\t\t\t\ty: e.clientY - dragStart.y,\n\t\t\t});\n\t\t},\n\t\t[isDragging, dragStart],\n\t);\n\n\tconst handleMouseUp = useCallback(() => {\n\t\tsetIsDragging(false);\n\t}, []);\n\n\tconst handleTouchStart = useCallback(\n\t\t(e: React.TouchEvent) => {\n\t\t\tif (!imageLoaded) return;\n\t\t\tconst touch = e.touches[0];\n\t\t\tsetIsDragging(true);\n\t\t\tsetDragStart({\n\t\t\t\tx: touch.clientX - position.x,\n\t\t\t\ty: touch.clientY - position.y,\n\t\t\t});\n\t\t},\n\t\t[imageLoaded, position],\n\t);\n\n\tconst handleTouchMove = useCallback(\n\t\t(e: React.TouchEvent) => {\n\t\t\tif (!isDragging) return;\n\t\t\tconst touch = e.touches[0];\n\t\t\tsetPosition({\n\t\t\t\tx: touch.clientX - dragStart.x,\n\t\t\t\ty: touch.clientY - dragStart.y,\n\t\t\t});\n\t\t},\n\t\t[isDragging, dragStart],\n\t);\n\n\tconst handleDiscard = useCallback(() => {\n\t\tsetImage(null);\n\t\tsetImageLoaded(false);\n\t\tresetTransforms();\n\t\tif (fileInputRef.current) {\n\t\t\tfileInputRef.current.value = \"\";\n\t\t}\n\t\tonChange?.(null);\n\t}, [resetTransforms, onChange]);\n\n\tconst handleZoomIn = () => setZoom((z) => Math.min(z + 0.1, 3));\n\tconst handleZoomOut = () => setZoom((z) => Math.max(z - 0.1, 0.5));\n\tconst handleRotateLeft = () => setRotation((r) => r - 15);\n\tconst handleRotateRight = () => setRotation((r) => r + 15);\n\n\tconst isLarge = controlSize === \"large\";\n\tconst buttonSize = isLarge ? \"h-12 w-12\" : \"h-8 w-8\";\n\tconst iconSize = isLarge ? \"w-6 h-6\" : \"w-4 h-4\";\n\tconst smallIconSize = isLarge ? \"w-5 h-5\" : \"w-3 h-3\";\n\tconst textSize = isLarge ? \"text-sm\" : \"text-xs\";\n\tconst uploadIconSize = isLarge ? \"w-12 h-12\" : \"w-8 h-8\";\n\tconst uploadContainerSize = isLarge ? \"w-24 h-24\" : \"w-16 h-16\";\n\tconst gapSize = isLarge ? \"gap-6\" : \"gap-4\";\n\tconst controlGap = isLarge ? \"gap-3\" : \"gap-2\";\n\tconst sliderHeight = isLarge\n\t\t? \"[&_[role=slider]]:h-6 [&_[role=slider]]:w-6\"\n\t\t: \"\";\n\tconst guideRadius = size / 2 - 2;\n\tconst guideCenter = size / 2;\n\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\"flex flex-col\", gapSize, className)}\n\t\t\tstyle={{ width: size }}\n\t\t>\n\t\t\t{/* Canvas Container */}\n\t\t\t<div\n\t\t\t\tref={containerRef}\n\t\t\t\tclassName=\"relative bg-muted rounded-2xl overflow-hidden\"\n\t\t\t\tstyle={{ width: size, height: size }}\n\t\t\t>\n\t\t\t\t{/* Upload placeholder */}\n\t\t\t\t{!imageLoaded && (\n\t\t\t\t\t<button\n\t\t\t\t\t\tonClick={() => fileInputRef.current?.click()}\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\"absolute inset-0 z-10 flex flex-col items-center justify-center text-muted-foreground hover:text-foreground hover:bg-muted/80 transition-colors cursor-pointer\",\n\t\t\t\t\t\t\tisLarge ? \"gap-4\" : \"gap-3\",\n\t\t\t\t\t\t)}\n\t\t\t\t\t\taria-label={t.uploadAria}\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\"rounded-full bg-primary/10 flex items-center justify-center\",\n\t\t\t\t\t\t\t\tuploadContainerSize,\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Upload className={cn(\"text-primary\", uploadIconSize)} />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<span\n\t\t\t\t\t\t\tclassName={cn(\"font-medium\", isLarge ? \"text-base\" : \"text-sm\")}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{t.uploadHint}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t<span className={cn(\"text-muted-foreground\", textSize)}>\n\t\t\t\t\t\t\t{t.uploadFormats}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</button>\n\t\t\t\t)}\n\n\t\t\t\t{/* Canvas — full square pixels (what gets exported) */}\n\t\t\t\t<canvas\n\t\t\t\t\tref={canvasRef}\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"absolute inset-0\",\n\t\t\t\t\t\timageLoaded ? \"cursor-move\" : \"pointer-events-none opacity-0\",\n\t\t\t\t\t)}\n\t\t\t\t\tstyle={{ width: size, height: size }}\n\t\t\t\t\tonMouseDown={handleMouseDown}\n\t\t\t\t\tonMouseMove={handleMouseMove}\n\t\t\t\t\tonMouseUp={handleMouseUp}\n\t\t\t\t\tonMouseLeave={handleMouseUp}\n\t\t\t\t\tonTouchStart={handleTouchStart}\n\t\t\t\t\tonTouchMove={handleTouchMove}\n\t\t\t\t\tonTouchEnd={handleMouseUp}\n\t\t\t\t/>\n\n\t\t\t\t{/* Circular guide + dimmed corners (CSS/SVG only — not in export) */}\n\t\t\t\t{imageLoaded && (\n\t\t\t\t\t<svg\n\t\t\t\t\t\twidth={size}\n\t\t\t\t\t\theight={size}\n\t\t\t\t\t\tclassName=\"pointer-events-none absolute inset-0\"\n\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<path\n\t\t\t\t\t\t\td={`M0 0H${size}V${size}H0Z M${guideCenter - guideRadius} ${guideCenter}a${guideRadius} ${guideRadius} 0 1 0 ${guideRadius * 2} 0a${guideRadius} ${guideRadius} 0 1 0 ${-guideRadius * 2} 0`}\n\t\t\t\t\t\t\tfill=\"rgb(0 0 0 / 0.45)\"\n\t\t\t\t\t\t\tfillRule=\"evenodd\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<circle\n\t\t\t\t\t\t\tcx={guideCenter}\n\t\t\t\t\t\t\tcy={guideCenter}\n\t\t\t\t\t\t\tr={guideRadius}\n\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\tstroke=\"hsl(var(--primary))\"\n\t\t\t\t\t\t\tstrokeWidth=\"3\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</svg>\n\t\t\t\t)}\n\n\t\t\t\t{/* Grid Overlay */}\n\t\t\t\t{showGrid && imageLoaded && (\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName=\"absolute inset-0 pointer-events-none\"\n\t\t\t\t\t\tstyle={{ width: size, height: size }}\n\t\t\t\t\t>\n\t\t\t\t\t\t<svg width={size} height={size} className=\"opacity-30\">\n\t\t\t\t\t\t\t<line\n\t\t\t\t\t\t\t\tx1={size / 3}\n\t\t\t\t\t\t\t\ty1={0}\n\t\t\t\t\t\t\t\tx2={size / 3}\n\t\t\t\t\t\t\t\ty2={size}\n\t\t\t\t\t\t\t\tstroke=\"white\"\n\t\t\t\t\t\t\t\tstrokeWidth=\"1\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t<line\n\t\t\t\t\t\t\t\tx1={(size * 2) / 3}\n\t\t\t\t\t\t\t\ty1={0}\n\t\t\t\t\t\t\t\tx2={(size * 2) / 3}\n\t\t\t\t\t\t\t\ty2={size}\n\t\t\t\t\t\t\t\tstroke=\"white\"\n\t\t\t\t\t\t\t\tstrokeWidth=\"1\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t<line\n\t\t\t\t\t\t\t\tx1={0}\n\t\t\t\t\t\t\t\ty1={size / 3}\n\t\t\t\t\t\t\t\tx2={size}\n\t\t\t\t\t\t\t\ty2={size / 3}\n\t\t\t\t\t\t\t\tstroke=\"white\"\n\t\t\t\t\t\t\t\tstrokeWidth=\"1\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t<line\n\t\t\t\t\t\t\t\tx1={0}\n\t\t\t\t\t\t\t\ty1={(size * 2) / 3}\n\t\t\t\t\t\t\t\tx2={size}\n\t\t\t\t\t\t\t\ty2={(size * 2) / 3}\n\t\t\t\t\t\t\t\tstroke=\"white\"\n\t\t\t\t\t\t\t\tstrokeWidth=\"1\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t<line\n\t\t\t\t\t\t\t\tx1={size / 2 - 10}\n\t\t\t\t\t\t\t\ty1={size / 2}\n\t\t\t\t\t\t\t\tx2={size / 2 + 10}\n\t\t\t\t\t\t\t\ty2={size / 2}\n\t\t\t\t\t\t\t\tstroke=\"white\"\n\t\t\t\t\t\t\t\tstrokeWidth=\"1\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t<line\n\t\t\t\t\t\t\t\tx1={size / 2}\n\t\t\t\t\t\t\t\ty1={size / 2 - 10}\n\t\t\t\t\t\t\t\tx2={size / 2}\n\t\t\t\t\t\t\t\ty2={size / 2 + 10}\n\t\t\t\t\t\t\t\tstroke=\"white\"\n\t\t\t\t\t\t\t\tstrokeWidth=\"1\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</svg>\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\n\t\t\t\t{/* Drag indicator */}\n\t\t\t\t{imageLoaded && isDragging && (\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\"absolute top-2 left-1/2 -translate-x-1/2 bg-black/60 rounded text-white flex items-center\",\n\t\t\t\t\t\t\tisLarge ? \"px-3 py-2 text-sm gap-2\" : \"px-2 py-1 text-xs gap-1\",\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t<Move className={smallIconSize} />\n\t\t\t\t\t\t{t.dragging}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</div>\n\n\t\t\t{/* Controls - only show when image is loaded */}\n\t\t\t{imageLoaded && (\n\t\t\t\t<div className={cn(\"space-y-4\", isLarge && \"space-y-5\")}>\n\t\t\t\t\t{/* Zoom Slider */}\n\t\t\t\t\t<div className={cn(\"flex items-center\", controlGap)}>\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\t\t\tclassName={cn(buttonSize, \"shrink-0\")}\n\t\t\t\t\t\t\tonClick={handleZoomOut}\n\t\t\t\t\t\t\taria-label={t.zoomOut}\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<ZoomOut className={iconSize} />\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t<Slider\n\t\t\t\t\t\t\tvalue={[zoom]}\n\t\t\t\t\t\t\tonValueChange={([v]) => setZoom(v)}\n\t\t\t\t\t\t\tmin={0.5}\n\t\t\t\t\t\t\tmax={3}\n\t\t\t\t\t\t\tstep={0.01}\n\t\t\t\t\t\t\tclassName={cn(\"flex-1\", sliderHeight)}\n\t\t\t\t\t\t\taria-label={t.zoomLevel}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\t\t\tclassName={cn(buttonSize, \"shrink-0\")}\n\t\t\t\t\t\t\tonClick={handleZoomIn}\n\t\t\t\t\t\t\taria-label={t.zoomIn}\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<ZoomIn className={iconSize} />\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t{/* Rotation & Grid Controls */}\n\t\t\t\t\t<div className={cn(\"flex items-center justify-between\", controlGap)}>\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclassName={cn(\"flex items-center\", isLarge ? \"gap-2\" : \"gap-1\")}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\t\t\t\tclassName={buttonSize}\n\t\t\t\t\t\t\t\tonClick={handleRotateLeft}\n\t\t\t\t\t\t\t\taria-label={t.rotateLeft}\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<RotateCcw className={iconSize} />\n\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\"text-muted-foreground text-center tabular-nums\",\n\t\t\t\t\t\t\t\t\ttextSize,\n\t\t\t\t\t\t\t\t\tisLarge ? \"w-16\" : \"w-12\",\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{rotation}°\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\t\t\t\tclassName={buttonSize}\n\t\t\t\t\t\t\t\tonClick={handleRotateRight}\n\t\t\t\t\t\t\t\taria-label={t.rotateRight}\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<RotateCw className={iconSize} />\n\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclassName={cn(\"flex items-center\", isLarge ? \"gap-2\" : \"gap-1\")}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Toggle\n\t\t\t\t\t\t\t\tpressed={showGrid}\n\t\t\t\t\t\t\t\tonPressedChange={setShowGrid}\n\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\tclassName={cn(buttonSize, \"p-0\")}\n\t\t\t\t\t\t\t\taria-label={t.toggleGrid}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<Grid3X3 className={iconSize} />\n\t\t\t\t\t\t\t</Toggle>\n\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\t\t\t\tclassName={buttonSize}\n\t\t\t\t\t\t\t\tonClick={resetTransforms}\n\t\t\t\t\t\t\t\taria-label={t.reset}\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<RefreshCw className={iconSize} />\n\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\t\t\t\tclassName={buttonSize}\n\t\t\t\t\t\t\t\tonClick={() => fileInputRef.current?.click()}\n\t\t\t\t\t\t\t\taria-label={t.replace}\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<Upload className={iconSize} />\n\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t{/* Discard button */}\n\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\tbuttonSize,\n\t\t\t\t\t\t\t\t\t\"text-destructive hover:text-destructive hover:bg-destructive/10\",\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\tonClick={handleDiscard}\n\t\t\t\t\t\t\t\taria-label={t.discard}\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<X className={iconSize} />\n\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t)}\n\n\t\t\t{/* Hidden file input */}\n\t\t\t<input\n\t\t\t\tref={fileInputRef}\n\t\t\t\ttype=\"file\"\n\t\t\t\taccept=\"image/*\"\n\t\t\t\tonChange={handleFileSelect}\n\t\t\t\tclassName=\"hidden\"\n\t\t\t\taria-hidden=\"true\"\n\t\t\t/>\n\t\t</div>\n\t);\n}\n","/**\n * @name AvatarEditorDialog\n * @description A complete avatar editing experience with a preview display and edit dialog.\n * Shows a large avatar with an edit button. Opens fullscreen dialog on mobile, modal on desktop.\n * Handles save/upload callbacks with success/error feedback.\n *\n * @example\n * ```tsx\n * import { AvatarEditorDialog } from \"@/components/avatar-editor-dialog\"\n *\n * export default function ProfilePage() {\n * const [avatar, setAvatar] = useState<string | null>(null)\n *\n * const handleSave = async (dataUrl: string) => {\n * await uploadAvatar(dataUrl)\n * }\n *\n * return (\n * <AvatarEditorDialog\n * value={avatar}\n * onChange={setAvatar}\n * onSave={handleSave}\n * />\n * )\n * }\n * ```\n */\n\"use client\";\nimport { useState, useCallback, useEffect } from \"react\";\nimport { Pencil, User, X, Check, Loader2 } from \"lucide-react\";\nimport { AvatarEditor, type AvatarEditorLabels } from \"./AvatarEditor\";\nimport { SafeImage } from \"./media/SafeImage\";\nimport { Button } from \"../ui/button\";\nimport {\n\tDialog,\n\tDialogContent,\n\tDialogHeader,\n\tDialogTitle,\n\tDialogFooter,\n\tDialogClose,\n} from \"../ui/dialog\";\nimport {\n\tDrawer,\n\tDrawerContent,\n\tDrawerHeader,\n\tDrawerTitle,\n\tDrawerFooter,\n\tDrawerClose,\n} from \"../ui/drawer\";\nimport { cn } from \"../lib/utils\";\nimport { motion, AnimatePresence } from \"framer-motion\";\n\nexport interface AvatarEditorDialogProps {\n\t/** Current avatar URL or data URL */\n\tvalue?: string | null;\n\t/** Callback when avatar changes (after accepting) */\n\tonChange?: (dataUrl: string | null) => void;\n\t/** Async callback for saving/uploading - return true for success, false for failure */\n\tonSave?: (dataUrl: string) => Promise<boolean> | boolean;\n\t/** Size of the displayed avatar in pixels */\n\tdisplaySize?: number;\n\t/** Size of the editor in the dialog */\n\teditorSize?: number;\n\t/** Output image size */\n\toutputSize?: number;\n\t/** Placeholder text when no avatar */\n\tplaceholder?: string;\n\t/** Edit button label for accessibility */\n\teditLabel?: string;\n\t/** Dialog title */\n\tdialogTitle?: string;\n\t/** Accept button text */\n\tacceptText?: string;\n\t/** Cancel button text */\n\tcancelText?: string;\n\t/** Saving button text while upload is in progress */\n\tsavingText?: string;\n\t/** Saved button text after a successful save */\n\tsavedText?: string;\n\t/** Success message */\n\tsuccessMessage?: string;\n\t/** Error message */\n\terrorMessage?: string;\n\t/** Additional class names */\n\tclassName?: string;\n\t/** Override AvatarEditor chrome strings */\n\teditorLabels?: AvatarEditorLabels;\n}\n\nfunction useMediaQuery(query: string): boolean {\n\tconst [matches, setMatches] = useState(false);\n\n\tuseEffect(() => {\n\t\tconst media = window.matchMedia(query);\n\t\tif (media.matches !== matches) {\n\t\t\tsetMatches(media.matches);\n\t\t}\n\t\tconst listener = () => setMatches(media.matches);\n\t\tmedia.addEventListener(\"change\", listener);\n\t\treturn () => media.removeEventListener(\"change\", listener);\n\t}, [matches, query]);\n\n\treturn matches;\n}\n\nexport function AvatarEditorDialog({\n\tvalue,\n\tonChange,\n\tonSave,\n\tdisplaySize = 120,\n\teditorSize = 280,\n\toutputSize = 256,\n\tplaceholder = \"Add Photo\",\n\teditLabel = \"Edit avatar\",\n\tdialogTitle = \"Edit Avatar\",\n\tacceptText = \"Accept\",\n\tcancelText = \"Cancel\",\n\tsavingText = \"Saving...\",\n\tsavedText = \"Saved!\",\n\tsuccessMessage = \"Avatar saved successfully!\",\n\terrorMessage = \"Failed to save avatar. Please try again.\",\n\tclassName,\n\teditorLabels,\n}: AvatarEditorDialogProps) {\n\tconst [isOpen, setIsOpen] = useState(false);\n\tconst [editedValue, setEditedValue] = useState<string | null>(value ?? null);\n\tconst [displaySrc, setDisplaySrc] = useState<string | null>(value ?? null);\n\tconst [isSaving, setIsSaving] = useState(false);\n\tconst [feedback, setFeedback] = useState<{\n\t\ttype: \"success\" | \"error\";\n\t\tmessage: string;\n\t} | null>(null);\n\n\tuseEffect(() => {\n\t\tsetDisplaySrc(value ?? null);\n\t}, [value]);\n\n\tconst isMobile = useMediaQuery(\"(max-width: 640px)\");\n\tconst caption = (placeholder ?? \"\").trim();\n\n\t// Sync edited value when dialog opens\n\tconst handleOpenChange = useCallback(\n\t\t(open: boolean) => {\n\t\t\tif (open) {\n\t\t\t\tsetEditedValue(value ?? null);\n\t\t\t\tsetFeedback(null);\n\t\t\t}\n\t\t\tsetIsOpen(open);\n\t\t},\n\t\t[value],\n\t);\n\n\t// Handle accept/save\n\tconst handleAccept = useCallback(async () => {\n\t\tif (!editedValue) return;\n\n\t\tsetIsSaving(true);\n\t\tsetFeedback(null);\n\n\t\ttry {\n\t\t\tif (onSave) {\n\t\t\t\tconst result = await onSave(editedValue);\n\t\t\t\tif (result) {\n\t\t\t\t\tsetDisplaySrc(editedValue);\n\t\t\t\t\tonChange?.(editedValue);\n\t\t\t\t\tsetFeedback({ type: \"success\", message: successMessage });\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\tsetIsOpen(false);\n\t\t\t\t\t\tsetFeedback(null);\n\t\t\t\t\t}, 1500);\n\t\t\t\t} else {\n\t\t\t\t\tsetFeedback({ type: \"error\", message: errorMessage });\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tsetDisplaySrc(editedValue);\n\t\t\t\tonChange?.(editedValue);\n\t\t\t\tsetFeedback({ type: \"success\", message: successMessage });\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tsetIsOpen(false);\n\t\t\t\t\tsetFeedback(null);\n\t\t\t\t}, 1500);\n\t\t\t}\n\t\t} catch {\n\t\t\tsetFeedback({ type: \"error\", message: errorMessage });\n\t\t} finally {\n\t\t\tsetIsSaving(false);\n\t\t}\n\t}, [editedValue, onChange, onSave, successMessage, errorMessage]);\n\n\t// Avatar display component\n\tconst AvatarDisplay = (\n\t\t<div\n\t\t\tclassName={cn(\"relative group\", className)}\n\t\t\tstyle={{ width: displaySize, height: displaySize }}\n\t\t>\n\t\t\t{/* Avatar circle */}\n\t\t\t<div\n\t\t\t\tclassName=\"relative w-full h-full rounded-full overflow-hidden bg-muted border-2 border-border flex items-center justify-center\"\n\t\t\t\tstyle={{ width: displaySize, height: displaySize }}\n\t\t\t>\n\t\t\t\t<SafeImage\n\t\t\t\t\tsrc={displaySrc}\n\t\t\t\t\talt=\"Avatar\"\n\t\t\t\t\tclassName=\"absolute inset-0 h-full w-full object-cover\"\n\t\t\t\t\tfallback={\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\"flex flex-col items-center justify-center text-muted-foreground\",\n\t\t\t\t\t\t\t\tcaption ? \"gap-1\" : \"gap-0\",\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<User\n\t\t\t\t\t\t\t\tclassName=\"h-1/2 w-1/2 max-h-[55%] max-w-[55%] shrink-0\"\n\t\t\t\t\t\t\t\taria-hidden\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t{caption ? (\n\t\t\t\t\t\t\t\t<span className=\"text-xs text-center px-1\">{caption}</span>\n\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t}\n\t\t\t\t/>\n\t\t\t</div>\n\n\t\t\t{/* Edit button - bottom right */}\n\t\t\t<button\n\t\t\t\tonClick={() => handleOpenChange(true)}\n\t\t\t\tclassName=\"absolute bottom-0 right-0 w-8 h-8 rounded-full bg-primary text-primary-foreground flex items-center justify-center shadow-lg hover:bg-primary/90 transition-colors focus:outline-none focus:ring-2 focus:ring-primary focus:ring-offset-2\"\n\t\t\t\taria-label={editLabel}\n\t\t\t\ttype=\"button\"\n\t\t\t>\n\t\t\t\t<Pencil className=\"w-4 h-4\" />\n\t\t\t</button>\n\t\t</div>\n\t);\n\n\tconst mobileEditorSize = isMobile\n\t\t? Math.min(editorSize + 40, window.innerWidth - 48)\n\t\t: editorSize;\n\n\t// Editor content (shared between dialog and drawer)\n\tconst EditorContent = (\n\t\t<div className=\"flex flex-col items-center gap-4\">\n\t\t\t<AvatarEditor\n\t\t\t\tvalue={editedValue}\n\t\t\t\tonChange={setEditedValue}\n\t\t\t\tsize={mobileEditorSize}\n\t\t\t\toutputSize={outputSize}\n\t\t\t\tcontrolSize={isMobile ? \"large\" : \"default\"}\n\t\t\t\tlabels={editorLabels}\n\t\t\t/>\n\n\t\t\t{/* Feedback message */}\n\t\t\t<AnimatePresence>\n\t\t\t\t{feedback && (\n\t\t\t\t\t<motion.div\n\t\t\t\t\t\tinitial={{ opacity: 0, y: -10 }}\n\t\t\t\t\t\tanimate={{ opacity: 1, y: 0 }}\n\t\t\t\t\t\texit={{ opacity: 0, y: -10 }}\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\"flex items-center gap-2 rounded-lg font-medium\",\n\t\t\t\t\t\t\tisMobile ? \"px-5 py-3 text-base\" : \"px-4 py-2 text-sm\",\n\t\t\t\t\t\t\tfeedback.type === \"success\"\n\t\t\t\t\t\t\t\t? \"bg-green-100 text-green-800 dark:bg-green-900/30 dark:text-green-400\"\n\t\t\t\t\t\t\t\t: \"bg-red-100 text-red-800 dark:bg-red-900/30 dark:text-red-400\",\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t{feedback.type === \"success\" ? (\n\t\t\t\t\t\t\t<Check className={isMobile ? \"w-5 h-5\" : \"w-4 h-4\"} />\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<X className={isMobile ? \"w-5 h-5\" : \"w-4 h-4\"} />\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{feedback.message}\n\t\t\t\t\t</motion.div>\n\t\t\t\t)}\n\t\t\t</AnimatePresence>\n\t\t</div>\n\t);\n\n\t// Footer buttons (shared)\n\tconst FooterButtons = (\n\t\t<>\n\t\t\t{isMobile ? (\n\t\t\t\t<DrawerClose asChild>\n\t\t\t\t\t<Button\n\t\t\t\t\t\tvariant=\"outline\"\n\t\t\t\t\t\tdisabled={isSaving}\n\t\t\t\t\t\tsize=\"lg\"\n\t\t\t\t\t\tclassName=\"flex-1 bg-transparent\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{cancelText}\n\t\t\t\t\t</Button>\n\t\t\t\t</DrawerClose>\n\t\t\t) : (\n\t\t\t\t<DialogClose asChild>\n\t\t\t\t\t<Button variant=\"outline\" disabled={isSaving}>\n\t\t\t\t\t\t{cancelText}\n\t\t\t\t\t</Button>\n\t\t\t\t</DialogClose>\n\t\t\t)}\n\t\t\t<Button\n\t\t\t\tonClick={handleAccept}\n\t\t\t\tdisabled={!editedValue || isSaving || feedback?.type === \"success\"}\n\t\t\t\tsize={isMobile ? \"lg\" : \"default\"}\n\t\t\t\tclassName={isMobile ? \"flex-1\" : \"\"}\n\t\t\t>\n\t\t\t\t{isSaving ? (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<Loader2\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\"mr-2 animate-spin\",\n\t\t\t\t\t\t\t\tisMobile ? \"w-5 h-5\" : \"w-4 h-4\",\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t{savingText}\n\t\t\t\t\t</>\n\t\t\t\t) : feedback?.type === \"success\" ? (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<Check className={cn(\"mr-2\", isMobile ? \"w-5 h-5\" : \"w-4 h-4\")} />\n\t\t\t\t\t\t{savedText}\n\t\t\t\t\t</>\n\t\t\t\t) : (\n\t\t\t\t\tacceptText\n\t\t\t\t)}\n\t\t\t</Button>\n\t\t</>\n\t);\n\n\t// Mobile: Drawer (fullscreen-like)\n\tif (isMobile) {\n\t\treturn (\n\t\t\t<>\n\t\t\t\t{AvatarDisplay}\n\t\t\t\t<Drawer open={isOpen} onOpenChange={handleOpenChange}>\n\t\t\t\t\t<DrawerContent className=\"max-h-[96vh]\">\n\t\t\t\t\t\t<DrawerHeader className=\"text-center\">\n\t\t\t\t\t\t\t<DrawerTitle className=\"text-xl\">{dialogTitle}</DrawerTitle>\n\t\t\t\t\t\t</DrawerHeader>\n\t\t\t\t\t\t<div className=\"px-6 pb-6 overflow-y-auto\">{EditorContent}</div>\n\t\t\t\t\t\t<DrawerFooter className=\"flex-row gap-3 px-6 pb-8\">\n\t\t\t\t\t\t\t{FooterButtons}\n\t\t\t\t\t\t</DrawerFooter>\n\t\t\t\t\t</DrawerContent>\n\t\t\t\t</Drawer>\n\t\t\t</>\n\t\t);\n\t}\n\n\t// Desktop: Dialog (modal)\n\treturn (\n\t\t<>\n\t\t\t{AvatarDisplay}\n\t\t\t<Dialog open={isOpen} onOpenChange={handleOpenChange}>\n\t\t\t\t<DialogContent className=\"sm:max-w-md\">\n\t\t\t\t\t<DialogHeader>\n\t\t\t\t\t\t<DialogTitle>{dialogTitle}</DialogTitle>\n\t\t\t\t\t</DialogHeader>\n\t\t\t\t\t<div className=\"flex justify-center py-4\">{EditorContent}</div>\n\t\t\t\t\t<DialogFooter className=\"sm:gap-3\">{FooterButtons}</DialogFooter>\n\t\t\t\t</DialogContent>\n\t\t\t</Dialog>\n\t\t</>\n\t);\n}\n","export type PartRange = {\n\tpartNumber: number;\n\tstart: number;\n\tend: number;\n};\n\nexport function partRanges(fileSize: number, partSize: number): PartRange[] {\n\tif (partSize <= 0) {\n\t\tthrow new Error(\"partSize must be greater than 0\");\n\t}\n\tif (fileSize <= 0) {\n\t\treturn [{ partNumber: 1, start: 0, end: 0 }];\n\t}\n\tconst count = Math.ceil(fileSize / partSize);\n\treturn Array.from({ length: count }, (_, index) => {\n\t\tconst start = index * partSize;\n\t\treturn {\n\t\t\tpartNumber: index + 1,\n\t\t\tstart,\n\t\t\tend: Math.min(fileSize, start + partSize),\n\t\t};\n\t});\n}\n\nconst BYTE_UNITS = [\"B\", \"KB\", \"MB\", \"GB\", \"TB\"] as const;\n\nexport function formatUploadBytes(bytes: number): string {\n\tif (!Number.isFinite(bytes) || bytes <= 0) {\n\t\treturn \"0 B\";\n\t}\n\tlet value = bytes;\n\tlet unit = 0;\n\twhile (value >= 1024 && unit < BYTE_UNITS.length - 1) {\n\t\tvalue /= 1024;\n\t\tunit += 1;\n\t}\n\tif (unit === 0 || value >= 10) {\n\t\treturn `${Math.round(value)} ${BYTE_UNITS[unit]}`;\n\t}\n\tconst tenths = Math.round(value * 10) / 10;\n\tconst label = Number.isInteger(tenths) ? String(tenths) : tenths.toFixed(1);\n\treturn `${label} ${BYTE_UNITS[unit]}`;\n}\n\nexport function progressFromBytes(\n\tloaded: number,\n\ttotal: number,\n): { loaded: number; total: number; percent: number } {\n\tconst safeTotal = Math.max(0, total);\n\tconst safeLoaded = Math.min(Math.max(0, loaded), safeTotal);\n\tconst percent =\n\t\tsafeTotal > 0 ? Math.round((safeLoaded / safeTotal) * 100) : 0;\n\treturn { loaded: safeLoaded, total: safeTotal, percent };\n}\n\nexport function fileMatchesAccept(file: File, accept?: string): boolean {\n\tif (!accept?.trim()) return true;\n\tconst type = file.type.toLowerCase();\n\tconst name = file.name.toLowerCase();\n\treturn accept.split(\",\").some((token) => {\n\t\tconst trimmed = token.trim().toLowerCase();\n\t\tif (!trimmed) return false;\n\t\tif (trimmed.endsWith(\"/*\")) {\n\t\t\treturn type.startsWith(trimmed.slice(0, -1));\n\t\t}\n\t\tif (trimmed.startsWith(\".\")) {\n\t\t\treturn name.endsWith(trimmed);\n\t\t}\n\t\treturn type === trimmed;\n\t});\n}\n","export type MultipartUploadPart = {\n\tpartNumber: number;\n\tetag: string;\n};\n\nexport type MultipartUploadAdapter = {\n\trequestPartUrl: (partNumber: number) => Promise<string>;\n\tcomplete: (parts: MultipartUploadPart[]) => Promise<void>;\n\tabort?: () => Promise<void>;\n};\n\nexport type UploadProgress = {\n\tloaded: number;\n\ttotal: number;\n\tpercent: number;\n};\n\nexport type UploadControllerStatus =\n\t| \"idle\"\n\t| \"uploading\"\n\t| \"paused\"\n\t| \"completing\"\n\t| \"completed\"\n\t| \"cancelled\"\n\t| \"error\";\n\nexport type UploadJobStatus = Exclude<UploadControllerStatus, \"idle\">;\n\nexport type UploadJob = {\n\tid: string;\n\tname: string;\n\tstatus: UploadJobStatus;\n\tloaded: number;\n\ttotal: number;\n\tpercent: number;\n\terror?: string;\n};\n\nexport type FileDropzoneLabels = {\n\tidle: string;\n\thint: string;\n\tbrowse: string;\n\trejectType: string;\n\trejectSize: string;\n};\n\nexport type FileUploadTrayLabels = {\n\ttitle: string;\n\tpause: string;\n\tresume: string;\n\tcancel: string;\n\tuploading: string;\n\tpaused: string;\n\tcompleting: string;\n\tcompleted: string;\n\tcancelled: string;\n\terror: string;\n};\n\nexport const DEFAULT_FILE_DROPZONE_LABELS: FileDropzoneLabels = {\n\tidle: \"Drop a file here or browse\",\n\thint: \"Click or press Enter to choose a file\",\n\tbrowse: \"Browse\",\n\trejectType: \"This file type is not allowed\",\n\trejectSize: \"This file is too large\",\n};\n\nexport const DEFAULT_FILE_UPLOAD_TRAY_LABELS: FileUploadTrayLabels = {\n\ttitle: \"Uploads\",\n\tpause: \"Pause\",\n\tresume: \"Resume\",\n\tcancel: \"Cancel\",\n\tuploading: \"Uploading\",\n\tpaused: \"Paused\",\n\tcompleting: \"Finishing\",\n\tcompleted: \"Uploaded\",\n\tcancelled: \"Cancelled\",\n\terror: \"Failed\",\n};\n\nexport const DEFAULT_FILE_UPLOAD_LABELS = {\n\tdropzone: DEFAULT_FILE_DROPZONE_LABELS,\n\ttray: DEFAULT_FILE_UPLOAD_TRAY_LABELS,\n};\n","\"use client\";\n\nimport {\n\tuseId,\n\tuseRef,\n\tuseState,\n\ttype DragEvent,\n\ttype KeyboardEvent,\n} from \"react\";\n\nimport { cn } from \"../../lib/utils\";\nimport { fileMatchesAccept } from \"./part-math\";\nimport { DEFAULT_FILE_DROPZONE_LABELS, type FileDropzoneLabels } from \"./types\";\n\nexport type FileDropzoneProps = {\n\taccept?: string;\n\tmaxSize?: number;\n\tdisabled?: boolean;\n\tlabels?: Partial<FileDropzoneLabels>;\n\tonFile: (file: File) => void;\n\tonReject?: (reason: \"type\" | \"size\") => void;\n\tclassName?: string;\n};\n\nexport function FileDropzone({\n\taccept,\n\tmaxSize,\n\tdisabled = false,\n\tlabels: labelOverrides,\n\tonFile,\n\tonReject,\n\tclassName,\n}: FileDropzoneProps) {\n\tconst labels = { ...DEFAULT_FILE_DROPZONE_LABELS, ...labelOverrides };\n\tconst inputId = useId();\n\tconst inputRef = useRef<HTMLInputElement>(null);\n\tconst [dragging, setDragging] = useState(false);\n\tconst [message, setMessage] = useState<string | null>(null);\n\n\tfunction takeFile(file: File | undefined) {\n\t\tif (!file || disabled) return;\n\t\tif (!fileMatchesAccept(file, accept)) {\n\t\t\tsetMessage(labels.rejectType);\n\t\t\tonReject?.(\"type\");\n\t\t\treturn;\n\t\t}\n\t\tif (maxSize != null && file.size > maxSize) {\n\t\t\tsetMessage(labels.rejectSize);\n\t\t\tonReject?.(\"size\");\n\t\t\treturn;\n\t\t}\n\t\tsetMessage(null);\n\t\tonFile(file);\n\t}\n\n\tfunction onDrop(event: DragEvent<HTMLDivElement>) {\n\t\tevent.preventDefault();\n\t\tsetDragging(false);\n\t\ttakeFile(event.dataTransfer.files[0]);\n\t}\n\n\tfunction onKeyDown(event: KeyboardEvent<HTMLDivElement>) {\n\t\tif (disabled) return;\n\t\tif (event.key === \"Enter\" || event.key === \" \") {\n\t\t\tevent.preventDefault();\n\t\t\tinputRef.current?.click();\n\t\t}\n\t}\n\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\"relative flex w-full min-w-0 flex-col gap-2\", className)}\n\t\t>\n\t\t\t<div\n\t\t\t\trole=\"button\"\n\t\t\t\ttabIndex={disabled ? -1 : 0}\n\t\t\t\taria-disabled={disabled}\n\t\t\t\taria-describedby={message ? `${inputId}-message` : `${inputId}-hint`}\n\t\t\t\taria-controls={inputId}\n\t\t\t\tdata-dragging={dragging || undefined}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"border-input bg-background focus-visible:border-ring focus-visible:ring-ring/50 w-full min-w-0 rounded-lg border border-dashed px-4 py-8 text-center outline-none focus-visible:ring-[3px]\",\n\t\t\t\t\tdragging && \"border-primary bg-primary/5\",\n\t\t\t\t\tdisabled && \"pointer-events-none opacity-50\",\n\t\t\t\t)}\n\t\t\t\tonClick={() => {\n\t\t\t\t\tif (!disabled) inputRef.current?.click();\n\t\t\t\t}}\n\t\t\t\tonKeyDown={onKeyDown}\n\t\t\t\tonDragEnter={(event) => {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\tif (!disabled) setDragging(true);\n\t\t\t\t}}\n\t\t\t\tonDragOver={(event) => {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t}}\n\t\t\t\tonDragLeave={(event) => {\n\t\t\t\t\tif (event.currentTarget.contains(event.relatedTarget as Node)) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tsetDragging(false);\n\t\t\t\t}}\n\t\t\t\tonDrop={onDrop}\n\t\t\t>\n\t\t\t\t<p className=\"text-sm font-medium\">{labels.idle}</p>\n\t\t\t\t<p\n\t\t\t\t\tid={`${inputId}-hint`}\n\t\t\t\t\tclassName=\"text-muted-foreground mt-1 text-xs\"\n\t\t\t\t>\n\t\t\t\t\t{labels.hint}\n\t\t\t\t</p>\n\t\t\t\t<span className=\"text-primary mt-3 inline-flex text-sm font-medium underline-offset-4\">\n\t\t\t\t\t{labels.browse}\n\t\t\t\t</span>\n\t\t\t</div>\n\t\t\t<input\n\t\t\t\tid={inputId}\n\t\t\t\tref={inputRef}\n\t\t\t\ttype=\"file\"\n\t\t\t\taccept={accept}\n\t\t\t\tdisabled={disabled}\n\t\t\t\taria-label={labels.browse}\n\t\t\t\tclassName=\"sr-only\"\n\t\t\t\tonChange={(event) => {\n\t\t\t\t\ttakeFile(event.target.files?.[0]);\n\t\t\t\t\tevent.target.value = \"\";\n\t\t\t\t}}\n\t\t\t/>\n\t\t\t{message ? (\n\t\t\t\t<p\n\t\t\t\t\tid={`${inputId}-message`}\n\t\t\t\t\trole=\"alert\"\n\t\t\t\t\tclassName=\"text-destructive text-sm\"\n\t\t\t\t>\n\t\t\t\t\t{message}\n\t\t\t\t</p>\n\t\t\t) : null}\n\t\t</div>\n\t);\n}\n","\"use client\";\n\nimport { Pause, Play, X } from \"lucide-react\";\n\nimport { cn } from \"../../lib/utils\";\nimport { Button } from \"../../ui/button\";\nimport { formatUploadBytes } from \"./part-math\";\nimport {\n\tDEFAULT_FILE_UPLOAD_TRAY_LABELS,\n\ttype FileUploadTrayLabels,\n\ttype UploadJob,\n} from \"./types\";\n\nexport type FileUploadTrayProps = {\n\tjobs: UploadJob[];\n\tlabels?: Partial<FileUploadTrayLabels>;\n\tonPause: (id: string) => void;\n\tonResume: (id: string) => void;\n\tonCancel: (id: string) => void;\n\tclassName?: string;\n};\n\nfunction statusLabel(\n\tstatus: UploadJob[\"status\"],\n\tlabels: FileUploadTrayLabels,\n): string {\n\tswitch (status) {\n\t\tcase \"uploading\":\n\t\t\treturn labels.uploading;\n\t\tcase \"paused\":\n\t\t\treturn labels.paused;\n\t\tcase \"completing\":\n\t\t\treturn labels.completing;\n\t\tcase \"completed\":\n\t\t\treturn labels.completed;\n\t\tcase \"cancelled\":\n\t\t\treturn labels.cancelled;\n\t\tcase \"error\":\n\t\t\treturn labels.error;\n\t\tdefault: {\n\t\t\tconst _exhaustive: never = status;\n\t\t\treturn _exhaustive;\n\t\t}\n\t}\n}\n\nfunction progressLabel(job: UploadJob): string {\n\treturn `${job.percent}% · ${formatUploadBytes(job.loaded)} / ${formatUploadBytes(job.total)}`;\n}\n\nexport function FileUploadTray({\n\tjobs,\n\tlabels: labelOverrides,\n\tonPause,\n\tonResume,\n\tonCancel,\n\tclassName,\n}: FileUploadTrayProps) {\n\tconst labels = { ...DEFAULT_FILE_UPLOAD_TRAY_LABELS, ...labelOverrides };\n\tconst visible = jobs.filter((job) => job.status !== \"cancelled\");\n\tif (visible.length === 0) return null;\n\n\treturn (\n\t\t<section\n\t\t\taria-label={labels.title}\n\t\t\tclassName={cn(\"grid min-w-0 gap-3\", className)}\n\t\t>\n\t\t\t<ul className=\"grid min-w-0 gap-3\">\n\t\t\t\t{visible.map((job) => {\n\t\t\t\t\tconst active =\n\t\t\t\t\t\tjob.status === \"uploading\" || job.status === \"completing\";\n\t\t\t\t\tconst canPause = job.status === \"uploading\";\n\t\t\t\t\tconst canResume = job.status === \"paused\";\n\t\t\t\t\tconst canCancel =\n\t\t\t\t\t\tjob.status === \"uploading\" ||\n\t\t\t\t\t\tjob.status === \"paused\" ||\n\t\t\t\t\t\tjob.status === \"error\";\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<li key={job.id} className=\"grid min-w-0 gap-1.5\">\n\t\t\t\t\t\t\t<p\n\t\t\t\t\t\t\t\tclassName=\"min-w-0 line-clamp-3 text-sm leading-5 font-medium break-all\"\n\t\t\t\t\t\t\t\ttitle={job.name}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{job.name}\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t<div className=\"flex min-w-0 items-center gap-2\">\n\t\t\t\t\t\t\t\t<p className=\"text-muted-foreground shrink-0 text-xs\">\n\t\t\t\t\t\t\t\t\t{statusLabel(job.status, labels)}\n\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t<p className=\"text-muted-foreground shrink-0 text-xs tabular-nums\">\n\t\t\t\t\t\t\t\t\t{progressLabel(job)}\n\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t<span className=\"min-w-0 flex-1\" />\n\t\t\t\t\t\t\t\t{canPause ? (\n\t\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\t\t\t\t\tsize=\"icon-sm\"\n\t\t\t\t\t\t\t\t\t\tclassName=\"shrink-0\"\n\t\t\t\t\t\t\t\t\t\taria-label={`${labels.pause} ${job.name}`}\n\t\t\t\t\t\t\t\t\t\tonClick={() => onPause(job.id)}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<Pause />\n\t\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t{canResume ? (\n\t\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\t\t\t\t\tsize=\"icon-sm\"\n\t\t\t\t\t\t\t\t\t\tclassName=\"shrink-0\"\n\t\t\t\t\t\t\t\t\t\taria-label={`${labels.resume} ${job.name}`}\n\t\t\t\t\t\t\t\t\t\tonClick={() => onResume(job.id)}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<Play />\n\t\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t{canCancel ? (\n\t\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\t\t\t\t\tsize=\"icon-sm\"\n\t\t\t\t\t\t\t\t\t\tclassName=\"shrink-0\"\n\t\t\t\t\t\t\t\t\t\taria-label={`${labels.cancel} ${job.name}`}\n\t\t\t\t\t\t\t\t\t\tonClick={() => onCancel(job.id)}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<X />\n\t\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\trole=\"progressbar\"\n\t\t\t\t\t\t\t\taria-valuemin={0}\n\t\t\t\t\t\t\t\taria-valuemax={100}\n\t\t\t\t\t\t\t\taria-valuenow={job.percent}\n\t\t\t\t\t\t\t\taria-label={job.name}\n\t\t\t\t\t\t\t\tclassName=\"bg-muted h-2 overflow-hidden rounded-full\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\"bg-primary h-full\",\n\t\t\t\t\t\t\t\t\t\tactive && \"motion-safe:transition-[width]\",\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\tstyle={{ width: `${job.percent}%` }}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t{job.error ? (\n\t\t\t\t\t\t\t\t<p role=\"alert\" className=\"text-destructive text-xs\">\n\t\t\t\t\t\t\t\t\t{job.error}\n\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t</li>\n\t\t\t\t\t);\n\t\t\t\t})}\n\t\t\t</ul>\n\t\t</section>\n\t);\n}\n","\"use client\";\n\nimport { Upload } from \"lucide-react\";\nimport { useState } from \"react\";\n\nimport { cn } from \"../../lib/utils\";\nimport { Button } from \"../../ui/button\";\nimport {\n\tDropdownMenu,\n\tDropdownMenuContent,\n\tDropdownMenuTrigger,\n} from \"../../ui/dropdown-menu\";\nimport { FileUploadTray } from \"./FileUploadTray\";\nimport {\n\tDEFAULT_FILE_UPLOAD_TRAY_LABELS,\n\ttype FileUploadTrayLabels,\n\ttype UploadJob,\n} from \"./types\";\n\nexport type FileUploadMenuProps = {\n\tjobs: UploadJob[];\n\tlabels?: Partial<FileUploadTrayLabels>;\n\tonPause: (id: string) => void;\n\tonResume: (id: string) => void;\n\tonCancel: (id: string) => void;\n\topen?: boolean;\n\tonOpenChange?: (open: boolean) => void;\n\talign?: \"start\" | \"end\";\n\tclassName?: string;\n};\n\nfunction formatActiveBadge(count: number): string {\n\treturn count > 9 ? \"9+\" : String(count);\n}\n\nfunction isActiveStatus(status: UploadJob[\"status\"]): boolean {\n\treturn (\n\t\tstatus === \"uploading\" || status === \"paused\" || status === \"completing\"\n\t);\n}\n\nexport function FileUploadMenu({\n\tjobs,\n\tlabels: labelOverrides,\n\tonPause,\n\tonResume,\n\tonCancel,\n\topen,\n\tonOpenChange,\n\talign = \"end\",\n\tclassName,\n}: FileUploadMenuProps) {\n\tconst labels = { ...DEFAULT_FILE_UPLOAD_TRAY_LABELS, ...labelOverrides };\n\tconst visible = jobs.filter((job) => job.status !== \"cancelled\");\n\tconst [uncontrolledOpen, setUncontrolledOpen] = useState(false);\n\tconst isControlled = open !== undefined;\n\tconst resolvedOpen = isControlled ? open : uncontrolledOpen;\n\n\tfunction setResolvedOpen(next: boolean) {\n\t\tif (!isControlled) setUncontrolledOpen(next);\n\t\tonOpenChange?.(next);\n\t}\n\n\tif (visible.length === 0) return null;\n\n\tconst activeCount = visible.filter((job) =>\n\t\tisActiveStatus(job.status),\n\t).length;\n\n\treturn (\n\t\t<DropdownMenu open={resolvedOpen} onOpenChange={setResolvedOpen}>\n\t\t\t<DropdownMenuTrigger\n\t\t\t\trender={\n\t\t\t\t\t<Button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\t\tclassName={cn(\"relative size-9\", className)}\n\t\t\t\t\t\taria-label={labels.title}\n\t\t\t\t\t/>\n\t\t\t\t}\n\t\t\t>\n\t\t\t\t<Upload className=\"size-4\" />\n\t\t\t\t{activeCount > 0 ? (\n\t\t\t\t\t<span className=\"bg-destructive text-destructive-foreground absolute -top-0.5 -right-0.5 flex size-4 items-center justify-center rounded-full text-[10px] leading-none font-medium tabular-nums\">\n\t\t\t\t\t\t{formatActiveBadge(activeCount)}\n\t\t\t\t\t</span>\n\t\t\t\t) : null}\n\t\t\t</DropdownMenuTrigger>\n\t\t\t<DropdownMenuContent\n\t\t\t\talign={align}\n\t\t\t\tclassName=\"w-80 min-w-0 max-w-[calc(100vw-2rem)] overflow-x-hidden p-0\"\n\t\t\t>\n\t\t\t\t<div className=\"flex items-center justify-between border-b px-4 py-3\">\n\t\t\t\t\t<h4 className=\"font-semibold\">{labels.title}</h4>\n\t\t\t\t</div>\n\t\t\t\t<div className=\"max-h-80 min-w-0 overflow-x-hidden overflow-y-auto p-3\">\n\t\t\t\t\t<FileUploadTray\n\t\t\t\t\t\tjobs={visible}\n\t\t\t\t\t\tlabels={labels}\n\t\t\t\t\t\tonPause={onPause}\n\t\t\t\t\t\tonResume={onResume}\n\t\t\t\t\t\tonCancel={onCancel}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</DropdownMenuContent>\n\t\t</DropdownMenu>\n\t);\n}\n","import { partRanges, progressFromBytes } from \"./part-math\";\nimport type {\n\tMultipartUploadAdapter,\n\tMultipartUploadPart,\n\tUploadControllerStatus,\n\tUploadProgress,\n} from \"./types\";\n\nconst PART_ATTEMPTS = 3;\nconst PART_RETRY_BACKOFF_MS = [500, 1500] as const;\n\nexport type CreateMultipartUploadControllerOptions = {\n\tfile: Blob;\n\tpartSize: number;\n\tadapter: MultipartUploadAdapter;\n\tonProgress?: (progress: UploadProgress) => void;\n\txhrFactory?: () => XMLHttpRequest;\n\tsleep?: (ms: number) => Promise<void>;\n\tcompletedParts?: MultipartUploadPart[];\n};\n\nexport type MultipartUploadController = {\n\tstart: () => Promise<void>;\n\tpause: () => void;\n\tresume: () => Promise<void>;\n\tcancel: () => Promise<void>;\n\tgetStatus: () => UploadControllerStatus;\n};\n\nfunction defaultSleep(ms: number): Promise<void> {\n\treturn new Promise((resolve) => {\n\t\tsetTimeout(resolve, ms);\n\t});\n}\n\nfunction isAbortError(error: unknown): boolean {\n\treturn error instanceof DOMException && error.name === \"AbortError\";\n}\n\nfunction isMissingEtagError(error: unknown): boolean {\n\treturn error instanceof Error && error.message.includes(\"missing ETag\");\n}\n\nfunction isRetryableStatus(status: number): boolean {\n\treturn (\n\t\tstatus === 0 ||\n\t\tstatus === 403 ||\n\t\tstatus === 408 ||\n\t\tstatus === 429 ||\n\t\tstatus >= 500\n\t);\n}\n\nfunction putPartFailure(partNumber: number, status: number): Error {\n\treturn new Error(`Upload failed (part ${partNumber}, status ${status})`);\n}\n\nfunction parsePutStatus(error: unknown): number | null {\n\tif (!(error instanceof Error)) return null;\n\tconst match = error.message.match(/status (\\d+)\\)$/);\n\tif (!match?.[1]) return null;\n\treturn Number(match[1]);\n}\n\nfunction isRetryablePutError(error: unknown): boolean {\n\tif (isAbortError(error) || isMissingEtagError(error)) return false;\n\tconst status = parsePutStatus(error);\n\tif (status === null) return false;\n\treturn isRetryableStatus(status);\n}\n\nfunction readEtag(xhr: XMLHttpRequest): string {\n\tconst raw =\n\t\txhr.getResponseHeader(\"ETag\") ?? xhr.getResponseHeader(\"etag\") ?? \"\";\n\tconst etag = raw.trim();\n\tif (!etag) {\n\t\tthrow new Error(\"Upload part missing ETag\");\n\t}\n\treturn etag;\n}\n\nfunction putPart(input: {\n\turl: string;\n\tbody: Blob;\n\txhr: XMLHttpRequest;\n\tpartNumber: number;\n\tonProgress: (loaded: number) => void;\n}): Promise<string> {\n\treturn new Promise((resolve, reject) => {\n\t\tinput.xhr.open(\"PUT\", input.url);\n\t\tinput.xhr.upload.onprogress = (event) => {\n\t\t\tinput.onProgress(event.loaded);\n\t\t};\n\t\tinput.xhr.onload = () => {\n\t\t\tif (input.xhr.status >= 200 && input.xhr.status < 300) {\n\t\t\t\ttry {\n\t\t\t\t\tresolve(readEtag(input.xhr));\n\t\t\t\t} catch (error) {\n\t\t\t\t\treject(error);\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t\treject(putPartFailure(input.partNumber, input.xhr.status));\n\t\t};\n\t\tinput.xhr.onerror = () => {\n\t\t\treject(putPartFailure(input.partNumber, 0));\n\t\t};\n\t\tinput.xhr.onabort = () => {\n\t\t\treject(new DOMException(\"The operation was aborted.\", \"AbortError\"));\n\t\t};\n\t\tinput.xhr.send(input.body);\n\t});\n}\n\nexport function createMultipartUploadController(\n\toptions: CreateMultipartUploadControllerOptions,\n): MultipartUploadController {\n\tconst ranges = partRanges(options.file.size, options.partSize);\n\tconst sleep = options.sleep ?? defaultSleep;\n\tconst state = { status: \"idle\" as UploadControllerStatus };\n\tconst seeded = new Map<number, MultipartUploadPart>();\n\tfor (const part of options.completedParts ?? []) {\n\t\tif (part.partNumber < 1 || part.partNumber > ranges.length) continue;\n\t\tseeded.set(part.partNumber, part);\n\t}\n\tconst completed: MultipartUploadPart[] = [...seeded.values()].sort(\n\t\t(left, right) => left.partNumber - right.partNumber,\n\t);\n\tconst done = new Set(completed.map((part) => part.partNumber));\n\tlet currentXhr: XMLHttpRequest | null = null;\n\tlet run: Promise<void> | null = null;\n\tlet resumeIndex = ranges.findIndex((range) => !done.has(range.partNumber));\n\tif (resumeIndex < 0) resumeIndex = ranges.length;\n\n\tfunction currentStatus(): UploadControllerStatus {\n\t\treturn state.status;\n\t}\n\n\tfunction isStopped(): boolean {\n\t\tconst status = currentStatus();\n\t\treturn status === \"paused\" || status === \"cancelled\";\n\t}\n\n\tfunction emitProgress(currentPartLoaded = 0) {\n\t\tconst completedBytes = completed.reduce((sum, part) => {\n\t\t\tconst range = ranges[part.partNumber - 1];\n\t\t\treturn sum + (range ? range.end - range.start : 0);\n\t\t}, 0);\n\t\toptions.onProgress?.(\n\t\t\tprogressFromBytes(completedBytes + currentPartLoaded, options.file.size),\n\t\t);\n\t}\n\n\tasync function putPartWithRetry(\n\t\tpartNumber: number,\n\t\tbody: Blob,\n\t): Promise<string> {\n\t\tlet lastError: unknown;\n\t\tfor (let attempt = 1; attempt <= PART_ATTEMPTS; attempt += 1) {\n\t\t\tif (state.status !== \"uploading\") {\n\t\t\t\tthrow (\n\t\t\t\t\tlastError ??\n\t\t\t\t\tnew DOMException(\"The operation was aborted.\", \"AbortError\")\n\t\t\t\t);\n\t\t\t}\n\t\t\tconst url = await options.adapter.requestPartUrl(partNumber);\n\t\t\tif (state.status !== \"uploading\") {\n\t\t\t\tthrow new DOMException(\"The operation was aborted.\", \"AbortError\");\n\t\t\t}\n\t\t\tconst xhr = options.xhrFactory\n\t\t\t\t? options.xhrFactory()\n\t\t\t\t: new XMLHttpRequest();\n\t\t\tcurrentXhr = xhr;\n\t\t\ttry {\n\t\t\t\treturn await putPart({\n\t\t\t\t\turl,\n\t\t\t\t\tbody,\n\t\t\t\t\txhr,\n\t\t\t\t\tpartNumber,\n\t\t\t\t\tonProgress: (loaded) => emitProgress(loaded),\n\t\t\t\t});\n\t\t\t} catch (error) {\n\t\t\t\tlastError = error;\n\t\t\t\tif (currentXhr === xhr) currentXhr = null;\n\t\t\t\tif (\n\t\t\t\t\tisStopped() ||\n\t\t\t\t\t!isRetryablePutError(error) ||\n\t\t\t\t\tattempt === PART_ATTEMPTS\n\t\t\t\t) {\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t\tconst delay =\n\t\t\t\t\tPART_RETRY_BACKOFF_MS[attempt - 1] ??\n\t\t\t\t\tPART_RETRY_BACKOFF_MS[PART_RETRY_BACKOFF_MS.length - 1];\n\t\t\t\tawait sleep(delay);\n\t\t\t} finally {\n\t\t\t\tif (currentXhr === xhr) currentXhr = null;\n\t\t\t}\n\t\t}\n\t\tthrow lastError;\n\t}\n\n\tasync function uploadFrom(startIndex: number): Promise<void> {\n\t\tstate.status = \"uploading\";\n\t\tfor (let index = startIndex; index < ranges.length; index += 1) {\n\t\t\tif (state.status !== \"uploading\") return;\n\t\t\tresumeIndex = index;\n\t\t\tconst range = ranges[index];\n\t\t\tif (!range) continue;\n\t\t\tif (done.has(range.partNumber)) continue;\n\t\t\tconst body = options.file.slice(range.start, range.end);\n\t\t\ttry {\n\t\t\t\tconst etag = await putPartWithRetry(range.partNumber, body);\n\t\t\t\tif (state.status !== \"uploading\") return;\n\t\t\t\tcompleted.push({ partNumber: range.partNumber, etag });\n\t\t\t\tdone.add(range.partNumber);\n\t\t\t\temitProgress(0);\n\t\t\t} catch (error) {\n\t\t\t\tcurrentXhr = null;\n\t\t\t\tif (isStopped()) return;\n\t\t\t\tstate.status = \"error\";\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t}\n\n\t\tif (state.status !== \"uploading\") return;\n\t\tstate.status = \"completing\";\n\t\tawait options.adapter.complete([...completed]);\n\t\tstate.status = \"completed\";\n\t\temitProgress(0);\n\t}\n\n\tasync function start(): Promise<void> {\n\t\tif (run) return run;\n\t\temitProgress(0);\n\t\trun = uploadFrom(resumeIndex).catch((error) => {\n\t\t\tif (isStopped()) return;\n\t\t\tstate.status = \"error\";\n\t\t\tthrow error;\n\t\t});\n\t\treturn run;\n\t}\n\n\tfunction pause(): void {\n\t\tif (state.status !== \"uploading\") return;\n\t\tstate.status = \"paused\";\n\t\tcurrentXhr?.abort();\n\t}\n\n\tasync function resume(): Promise<void> {\n\t\tif (state.status !== \"paused\") return;\n\t\trun = uploadFrom(resumeIndex).catch((error) => {\n\t\t\tif (isStopped()) return;\n\t\t\tstate.status = \"error\";\n\t\t\tthrow error;\n\t\t});\n\t\treturn run;\n\t}\n\n\tasync function cancel(): Promise<void> {\n\t\tif (\n\t\t\tstate.status === \"completed\" ||\n\t\t\tstate.status === \"cancelled\" ||\n\t\t\tstate.status === \"idle\"\n\t\t) {\n\t\t\tstate.status = \"cancelled\";\n\t\t\treturn;\n\t\t}\n\t\tstate.status = \"cancelled\";\n\t\tcurrentXhr?.abort();\n\t\tawait options.adapter.abort?.();\n\t}\n\n\treturn {\n\t\tstart,\n\t\tpause,\n\t\tresume,\n\t\tcancel,\n\t\tgetStatus: () => state.status,\n\t};\n}\n","\"use client\";\n\nimport { useEffect, useState } from \"react\";\n\nexport function useMediaQuery(query: string): boolean {\n\tconst [matches, setMatches] = useState(false);\n\n\tuseEffect(() => {\n\t\tif (typeof window === \"undefined\" || !window.matchMedia) return;\n\t\tconst mql = window.matchMedia(query);\n\t\tconst onChange = () => setMatches(mql.matches);\n\t\tonChange();\n\t\tmql.addEventListener(\"change\", onChange);\n\t\treturn () => mql.removeEventListener(\"change\", onChange);\n\t}, [query]);\n\n\treturn matches;\n}\n","/** Neutral fallback when the name is empty. */\nconst EMPTY_COLORS = {\n\tbackgroundColor: \"#9ca3af\",\n\tcolor: \"#111111\",\n} as const;\n\n/**\n * Curated mid-lightness palette — professional, calm hues that stay\n * distinct when hashed by name and contrast well with black or white text.\n */\nconst AVATAR_PALETTE = [\n\t\"#4f6d8c\", // slate blue\n\t\"#3d7a6a\", // teal\n\t\"#6b5b8a\", // muted purple\n\t\"#8a5a4a\", // warm brown\n\t\"#4a7a8a\", // steel cyan\n\t\"#7a6b4a\", // olive\n\t\"#5a6b8a\", // periwinkle\n\t\"#8a4a5a\", // rose\n\t\"#4a8a6b\", // green\n\t\"#6b4a7a\", // plum\n\t\"#8a6b4a\", // amber brown\n\t\"#4a5a8a\", // indigo\n\t\"#7a4a6b\", // mauve\n\t\"#5a8a4a\", // leaf\n\t\"#8a5a7a\", // dusty pink\n\t\"#3d6b7a\", // deep teal\n] as const;\n\nexport type AvatarColors = {\n\tbackgroundColor: string;\n\tcolor: string;\n};\n\n/** FNV-1a 32-bit hash — stable across runtimes for the same string. */\nfunction hashString(input: string): number {\n\tlet hash = 0x811c9dc5;\n\tfor (let i = 0; i < input.length; i++) {\n\t\thash ^= input.charCodeAt(i);\n\t\thash = Math.imul(hash, 0x01000193);\n\t}\n\treturn hash >>> 0;\n}\n\nfunction srgbToLinear(channel: number): number {\n\tconst c = channel / 255;\n\treturn c <= 0.04045 ? c / 12.92 : ((c + 0.055) / 1.055) ** 2.4;\n}\n\n/** Relative luminance (WCAG) for a hex color like `#rrggbb`. */\nfunction relativeLuminance(hex: string): number {\n\tconst normalized = hex.replace(\"#\", \"\");\n\tconst r = Number.parseInt(normalized.slice(0, 2), 16);\n\tconst g = Number.parseInt(normalized.slice(2, 4), 16);\n\tconst b = Number.parseInt(normalized.slice(4, 6), 16);\n\treturn (\n\t\t0.2126 * srgbToLinear(r) +\n\t\t0.7152 * srgbToLinear(g) +\n\t\t0.0722 * srgbToLinear(b)\n\t);\n}\n\nfunction contrastingTextColor(backgroundHex: string): \"#ffffff\" | \"#111111\" {\n\t// Threshold ~0.179 ≈ contrast preference for mid tones (WCAG-inspired).\n\treturn relativeLuminance(backgroundHex) > 0.179 ? \"#111111\" : \"#ffffff\";\n}\n\n/**\n * Word-based initials from a display name (max letters, default 2).\n * Empty / whitespace-only names yield `\"?\"`.\n */\nexport function getInitials(name: string, max = 2): string {\n\tconst parts = name.trim().split(/\\s+/).filter(Boolean);\n\tif (parts.length === 0) return \"?\";\n\treturn parts\n\t\t.slice(0, Math.max(1, max))\n\t\t.map((part) => part.charAt(0))\n\t\t.join(\"\")\n\t\t.toUpperCase();\n}\n\n/**\n * Deterministic background + contrasting foreground from a full name.\n * Same name (case-insensitive) always maps to the same colors.\n */\nexport function getAvatarColors(name: string): AvatarColors {\n\tconst normalized = name.trim().toLowerCase();\n\tif (!normalized) {\n\t\treturn { ...EMPTY_COLORS };\n\t}\n\tconst backgroundColor =\n\t\tAVATAR_PALETTE[hashString(normalized) % AVATAR_PALETTE.length]!;\n\treturn {\n\t\tbackgroundColor,\n\t\tcolor: contrastingTextColor(backgroundColor),\n\t};\n}\n\n/** CSS style object for `AvatarFallback` (or any letter-avatar container). */\nexport function avatarFallbackStyle(\n\tname: string,\n): Pick<AvatarColors, \"backgroundColor\" | \"color\"> {\n\treturn getAvatarColors(name);\n}\n","\"use client\";\n\nimport * as React from \"react\";\n\nimport { cn } from \"../../lib/utils\";\n\nexport type StatHighlightCardProps = {\n\tlabel: string;\n\tvalue: React.ReactNode;\n\thint?: string;\n\tdelta?: string;\n\tdeltaTone?: \"up\" | \"down\" | \"neutral\";\n\tclassName?: string;\n};\n\nexport function StatHighlightCard({\n\tlabel,\n\tvalue,\n\thint,\n\tdelta,\n\tdeltaTone = \"neutral\",\n\tclassName,\n}: StatHighlightCardProps) {\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\t\"bg-card text-card-foreground rounded-xl border p-6 shadow-sm\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t<p className=\"text-muted-foreground text-sm\">{label}</p>\n\t\t\t<p className=\"mt-2 text-2xl font-semibold tracking-tight\">{value}</p>\n\t\t\t{delta ? (\n\t\t\t\t<p\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"mt-1 text-sm\",\n\t\t\t\t\t\tdeltaTone === \"up\" && \"text-emerald-600 dark:text-emerald-400\",\n\t\t\t\t\t\tdeltaTone === \"down\" && \"text-destructive\",\n\t\t\t\t\t\tdeltaTone === \"neutral\" && \"text-muted-foreground\",\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t{delta}\n\t\t\t\t</p>\n\t\t\t) : null}\n\t\t\t{hint ? (\n\t\t\t\t<p className=\"text-muted-foreground mt-1 text-xs\">{hint}</p>\n\t\t\t) : null}\n\t\t</div>\n\t);\n}\n","\"use client\";\n\nimport * as React from \"react\";\n\nimport { cn } from \"../../lib/utils\";\n\nexport type MetricChartCardProps = {\n\ttitle: string;\n\tdescription?: string;\n\taction?: React.ReactNode;\n\tchildren: React.ReactNode;\n\tclassName?: string;\n};\n\nexport function MetricChartCard({\n\ttitle,\n\tdescription,\n\taction,\n\tchildren,\n\tclassName,\n}: MetricChartCardProps) {\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\t\"bg-card text-card-foreground rounded-xl border shadow-sm\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t<div className=\"flex items-start justify-between gap-3 p-6 pb-2\">\n\t\t\t\t<div>\n\t\t\t\t\t<h3 className=\"leading-none font-semibold tracking-tight\">{title}</h3>\n\t\t\t\t\t{description ? (\n\t\t\t\t\t\t<p className=\"text-muted-foreground mt-1.5 text-sm\">\n\t\t\t\t\t\t\t{description}\n\t\t\t\t\t\t</p>\n\t\t\t\t\t) : null}\n\t\t\t\t</div>\n\t\t\t\t{action}\n\t\t\t</div>\n\t\t\t<div className=\"p-6 pt-4\">{children}</div>\n\t\t</div>\n\t);\n}\n","\"use client\";\n\nimport * as React from \"react\";\n\nimport { useMediaQuery } from \"../../hooks/useMediaQuery\";\nimport { cn } from \"../../lib/utils\";\n\nexport type SparklineStatProps = {\n\tlabel: string;\n\tvalue: React.ReactNode;\n\tpoints: number[];\n\tclassName?: string;\n};\n\nfunction polyline(points: number[]): string {\n\tif (points.length === 0) return \"\";\n\tconst min = Math.min(...points);\n\tconst max = Math.max(...points);\n\tconst span = max - min || 1;\n\treturn points\n\t\t.map((point, index) => {\n\t\t\tconst x = points.length === 1 ? 50 : (index / (points.length - 1)) * 100;\n\t\t\tconst y = 28 - ((point - min) / span) * 24;\n\t\t\treturn `${x.toFixed(2)},${y.toFixed(2)}`;\n\t\t})\n\t\t.join(\" \");\n}\n\nexport function SparklineStat({\n\tlabel,\n\tvalue,\n\tpoints,\n\tclassName,\n}: SparklineStatProps) {\n\tconst reduced = useMediaQuery(\"(prefers-reduced-motion: reduce)\");\n\tconst path = polyline(points);\n\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\t\"bg-card text-card-foreground flex items-end justify-between gap-3 rounded-xl border p-4 shadow-sm\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t<div>\n\t\t\t\t<p className=\"text-muted-foreground text-xs\">{label}</p>\n\t\t\t\t<p className=\"mt-1 text-lg font-semibold tracking-tight\">{value}</p>\n\t\t\t</div>\n\t\t\t{path ? (\n\t\t\t\t<svg\n\t\t\t\t\tviewBox=\"0 0 100 32\"\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"text-primary h-8 w-24\",\n\t\t\t\t\t\t!reduced && \"motion-safe:transition-opacity\",\n\t\t\t\t\t)}\n\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t>\n\t\t\t\t\t<polyline\n\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\tstrokeWidth=\"2\"\n\t\t\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\tpoints={path}\n\t\t\t\t\t/>\n\t\t\t\t</svg>\n\t\t\t) : null}\n\t\t</div>\n\t);\n}\n","\"use client\";\n\nimport * as React from \"react\";\n\nimport { cn } from \"../../lib/utils\";\nimport { Button } from \"../../ui/button\";\n\nexport const TIME_RANGE_OPTIONS = [\"day\", \"week\", \"month\", \"year\"] as const;\n\nexport type TimeRange = (typeof TIME_RANGE_OPTIONS)[number];\n\nexport type TimeRangePickerLabels = Partial<Record<TimeRange, string>>;\n\nexport type TimeRangePickerProps = {\n\tvalue: TimeRange;\n\tonChange: (value: TimeRange) => void;\n\tlabels?: TimeRangePickerLabels;\n\tclassName?: string;\n};\n\nconst DEFAULT_LABELS: Record<TimeRange, string> = {\n\tday: \"Day\",\n\tweek: \"Week\",\n\tmonth: \"Month\",\n\tyear: \"Year\",\n};\n\nexport function TimeRangePicker({\n\tvalue,\n\tonChange,\n\tlabels,\n\tclassName,\n}: TimeRangePickerProps) {\n\tconst copy = { ...DEFAULT_LABELS, ...labels };\n\n\treturn (\n\t\t<div\n\t\t\trole=\"group\"\n\t\t\taria-label=\"Time range\"\n\t\t\tclassName={cn(\"flex flex-wrap gap-1\", className)}\n\t\t>\n\t\t\t{TIME_RANGE_OPTIONS.map((option) => {\n\t\t\t\tconst selected = option === value;\n\t\t\t\treturn (\n\t\t\t\t\t<Button\n\t\t\t\t\t\tkey={option}\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\tvariant={selected ? \"default\" : \"outline\"}\n\t\t\t\t\t\taria-pressed={selected}\n\t\t\t\t\t\tonClick={() => onChange(option)}\n\t\t\t\t\t>\n\t\t\t\t\t\t{copy[option]}\n\t\t\t\t\t</Button>\n\t\t\t\t);\n\t\t\t})}\n\t\t</div>\n\t);\n}\n","\"use client\";\n\nimport * as React from \"react\";\n\nimport { cn } from \"../../lib/utils\";\n\nexport type DimensionBreakdownRow = {\n\tid: string;\n\tlabel: string;\n\tvalue: React.ReactNode;\n\tshare?: string;\n};\n\nexport type DimensionBreakdownTableProps = {\n\ttitle?: string;\n\trows: DimensionBreakdownRow[];\n\tempty?: React.ReactNode;\n\tclassName?: string;\n};\n\nexport function DimensionBreakdownTable({\n\ttitle,\n\trows,\n\tempty,\n\tclassName,\n}: DimensionBreakdownTableProps) {\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\t\"bg-card text-card-foreground overflow-hidden rounded-xl border shadow-sm\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t{title ? (\n\t\t\t\t<h3 className=\"px-6 pt-6 text-sm font-semibold tracking-tight\">\n\t\t\t\t\t{title}\n\t\t\t\t</h3>\n\t\t\t) : null}\n\t\t\t{rows.length === 0 ? (\n\t\t\t\t<div className=\"p-6\">{empty}</div>\n\t\t\t) : (\n\t\t\t\t<table className=\"w-full text-sm\">\n\t\t\t\t\t<tbody>\n\t\t\t\t\t\t{rows.map((row) => (\n\t\t\t\t\t\t\t<tr key={row.id} className=\"border-t first:border-t-0\">\n\t\t\t\t\t\t\t\t<th scope=\"row\" className=\"px-6 py-3 text-left font-medium\">\n\t\t\t\t\t\t\t\t\t{row.label}\n\t\t\t\t\t\t\t\t</th>\n\t\t\t\t\t\t\t\t<td className=\"px-6 py-3 text-right tabular-nums\">\n\t\t\t\t\t\t\t\t\t{row.value}\n\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t{row.share ? (\n\t\t\t\t\t\t\t\t\t<td className=\"text-muted-foreground px-6 py-3 text-right tabular-nums\">\n\t\t\t\t\t\t\t\t\t\t{row.share}\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</tbody>\n\t\t\t\t</table>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","\"use client\";\n\nimport * as React from \"react\";\n\nimport { cn } from \"../../lib/utils\";\n\nexport type CostBreakdownItem = {\n\tid: string;\n\tlabel: string;\n\tamount: React.ReactNode;\n\tbasis?: string;\n};\n\nexport type CostBreakdownCardProps = {\n\ttitle: string;\n\ttotal?: React.ReactNode;\n\titems: CostBreakdownItem[];\n\tclassName?: string;\n};\n\nexport function CostBreakdownCard({\n\ttitle,\n\ttotal,\n\titems,\n\tclassName,\n}: CostBreakdownCardProps) {\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\t\"bg-card text-card-foreground rounded-xl border p-6 shadow-sm\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t<div className=\"flex items-baseline justify-between gap-3\">\n\t\t\t\t<h3 className=\"font-semibold tracking-tight\">{title}</h3>\n\t\t\t\t{total ? (\n\t\t\t\t\t<p className=\"text-lg font-semibold tabular-nums\">{total}</p>\n\t\t\t\t) : null}\n\t\t\t</div>\n\t\t\t<ul className=\"mt-4 space-y-2\">\n\t\t\t\t{items.map((item) => (\n\t\t\t\t\t<li\n\t\t\t\t\t\tkey={item.id}\n\t\t\t\t\t\tclassName=\"flex items-baseline justify-between gap-3 text-sm\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t<p>{item.label}</p>\n\t\t\t\t\t\t\t{item.basis ? (\n\t\t\t\t\t\t\t\t<p className=\"text-muted-foreground text-xs\">{item.basis}</p>\n\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<p className=\"tabular-nums\">{item.amount}</p>\n\t\t\t\t\t</li>\n\t\t\t\t))}\n\t\t\t</ul>\n\t\t</div>\n\t);\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { BarChart3 } from \"lucide-react\";\n\nimport { EmptyState, type EmptyStateIcon } from \"../EmptyState\";\n\nexport type MetricEmptyStateProps = {\n\ttitle: string;\n\tdescription?: string;\n\taction?: React.ReactNode;\n\ticon?: EmptyStateIcon;\n\tclassName?: string;\n};\n\nexport function MetricEmptyState({\n\ttitle,\n\tdescription,\n\taction,\n\ticon = BarChart3,\n\tclassName,\n}: MetricEmptyStateProps) {\n\treturn (\n\t\t<EmptyState\n\t\t\ttitle={title}\n\t\t\tdescription={description}\n\t\t\taction={action}\n\t\t\ticon={icon}\n\t\t\tclassName={className}\n\t\t/>\n\t);\n}\n","\"use client\";\n\nimport * as React from \"react\";\n\nimport { useMediaQuery } from \"../../hooks/useMediaQuery\";\nimport { cn } from \"../../lib/utils\";\n\nexport type MetricSkeletonProps = {\n\tclassName?: string;\n\tbars?: number;\n};\n\nexport function MetricSkeleton({ className, bars = 4 }: MetricSkeletonProps) {\n\tconst reduced = useMediaQuery(\"(prefers-reduced-motion: reduce)\");\n\tconst count = Math.max(1, bars);\n\n\treturn (\n\t\t<div\n\t\t\trole=\"status\"\n\t\t\taria-live=\"polite\"\n\t\t\tclassName={cn(\"bg-card rounded-xl border p-6 shadow-sm\", className)}\n\t\t>\n\t\t\t<div\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"bg-muted mb-4 h-4 w-32 rounded\",\n\t\t\t\t\t!reduced && \"animate-pulse\",\n\t\t\t\t)}\n\t\t\t/>\n\t\t\t<div className=\"flex h-32 items-end gap-2\">\n\t\t\t\t{Array.from({ length: count }, (_, index) => (\n\t\t\t\t\t<div\n\t\t\t\t\t\tkey={index}\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\"bg-muted flex-1 rounded-t\",\n\t\t\t\t\t\t\t!reduced && \"animate-pulse\",\n\t\t\t\t\t\t)}\n\t\t\t\t\t\tstyle={{ height: `${40 + ((index * 17) % 50)}%` }}\n\t\t\t\t\t/>\n\t\t\t\t))}\n\t\t\t</div>\n\t\t\t<span className=\"sr-only\">Loading metrics</span>\n\t\t</div>\n\t);\n}\n","export const COOKIE_CONSENT_NAME = \"yenio-cookie-consent\";\n\nexport const COOKIE_CONSENT_VALUES = [\"necessary\", \"all\"] as const;\n\nexport type CookieConsentValue = (typeof COOKIE_CONSENT_VALUES)[number];\n\n/** ~180 days, matching contracts §1.2. */\nexport const COOKIE_CONSENT_MAX_AGE = 180 * 24 * 60 * 60;\n\nexport type WriteCookieConsentOptions = {\n\tdomain?: string;\n\tsecure?: boolean;\n\tmaxAge?: number;\n};\n\nexport function isCookieConsentValue(\n\tvalue: unknown,\n): value is CookieConsentValue {\n\treturn (\n\t\ttypeof value === \"string\" &&\n\t\t(COOKIE_CONSENT_VALUES as readonly string[]).includes(value)\n\t);\n}\n\nexport function cookieConsentAllowsReplay(\n\tvalue: CookieConsentValue | null | undefined,\n): boolean {\n\treturn value === \"all\";\n}\n\nexport function cookieDomainFromHostname(hostname: string): string | undefined {\n\tconst host = hostname.toLowerCase();\n\tif (host === \"localhost\" || host === \"127.0.0.1\") return undefined;\n\tif (host.endsWith(\".yenio.mx\") || host === \"yenio.mx\") return \".yenio.mx\";\n\tif (\n\t\thost.endsWith(\".yenio-pld.workers.dev\") ||\n\t\thost === \"yenio-pld.workers.dev\"\n\t) {\n\t\treturn \".yenio-pld.workers.dev\";\n\t}\n\treturn undefined;\n}\n\nfunction readCookieMap(cookieSource: string): Map<string, string> {\n\tconst map = new Map<string, string>();\n\tfor (const part of cookieSource.split(\";\")) {\n\t\tconst trimmed = part.trim();\n\t\tif (!trimmed) continue;\n\t\tconst eq = trimmed.indexOf(\"=\");\n\t\tif (eq < 0) continue;\n\t\tconst name = trimmed.slice(0, eq).trim();\n\t\tconst raw = trimmed.slice(eq + 1).trim();\n\t\tmap.set(name, decodeURIComponent(raw));\n\t}\n\treturn map;\n}\n\nexport function parseCookieConsent(\n\tcookieSource: string,\n): CookieConsentValue | null {\n\tconst raw = readCookieMap(cookieSource).get(COOKIE_CONSENT_NAME);\n\treturn isCookieConsentValue(raw) ? raw : null;\n}\n\nexport function readCookieConsent(): CookieConsentValue | null {\n\tif (typeof document === \"undefined\") return null;\n\treturn parseCookieConsent(document.cookie);\n}\n\nexport function serializeCookieConsent(\n\tvalue: CookieConsentValue,\n\toptions: WriteCookieConsentOptions = {},\n): string {\n\tconst maxAge = options.maxAge ?? COOKIE_CONSENT_MAX_AGE;\n\tconst secure =\n\t\toptions.secure ??\n\t\t(typeof window !== \"undefined\" && window.location.protocol === \"https:\");\n\tconst parts = [\n\t\t`${COOKIE_CONSENT_NAME}=${encodeURIComponent(value)}`,\n\t\t\"Path=/\",\n\t\t`Max-Age=${maxAge}`,\n\t\t\"SameSite=Lax\",\n\t];\n\tif (options.domain) {\n\t\tparts.push(`Domain=${options.domain}`);\n\t}\n\tif (secure) {\n\t\tparts.push(\"Secure\");\n\t}\n\treturn parts.join(\"; \");\n}\n\nexport function writeCookieConsent(\n\tvalue: CookieConsentValue,\n\toptions: WriteCookieConsentOptions = {},\n): void {\n\tif (typeof document === \"undefined\") return;\n\tdocument.cookie = serializeCookieConsent(value, options);\n}\n\nexport function isEmbeddedWindow(): boolean {\n\tif (typeof window === \"undefined\") return false;\n\ttry {\n\t\treturn window.self !== window.top;\n\t} catch {\n\t\treturn true;\n\t}\n}\n","\"use client\";\n\nimport { useEffect, useState } from \"react\";\n\nimport { cn } from \"../lib/utils\";\nimport { Button } from \"../ui/button\";\nimport {\n\ttype CookieConsentValue,\n\tcookieDomainFromHostname,\n\tisEmbeddedWindow,\n\treadCookieConsent,\n\twriteCookieConsent,\n} from \"../lib/cookie-consent\";\n\nexport type CookieConsentBannerLabels = {\n\tmessage: string;\n\tacceptAll: string;\n\tnecessaryOnly: string;\n\tpolicy: string;\n};\n\nexport const DEFAULT_COOKIE_CONSENT_BANNER_LABELS: CookieConsentBannerLabels = {\n\tmessage:\n\t\t\"We use necessary cookies to run Yenio. Extra cookies can be used for diagnostics if you opt in.\",\n\tacceptAll: \"Accept all\",\n\tnecessaryOnly: \"Necessary only\",\n\tpolicy: \"Cookies policy\",\n};\n\nexport type CookieConsentBannerProps = {\n\tdomain?: string;\n\tpolicyHref?: string;\n\tlabels?: Partial<CookieConsentBannerLabels>;\n\tonChoice?: (value: CookieConsentValue) => void;\n\tvariant?: \"default\" | \"embed\";\n\tclassName?: string;\n};\n\nexport function CookieConsentBanner({\n\tdomain,\n\tpolicyHref,\n\tlabels,\n\tonChoice,\n\tvariant = \"default\",\n\tclassName,\n}: CookieConsentBannerProps) {\n\tconst copy = { ...DEFAULT_COOKIE_CONSENT_BANNER_LABELS, ...labels };\n\tconst [consent, setConsent] = useState<CookieConsentValue | null | \"pending\">(\n\t\t\"pending\",\n\t);\n\n\tuseEffect(() => {\n\t\tif (variant === \"embed\" || isEmbeddedWindow()) {\n\t\t\tsetConsent(\"necessary\");\n\t\t\treturn;\n\t\t}\n\t\tsetConsent(readCookieConsent());\n\t}, [variant]);\n\n\tif (variant === \"embed\") return null;\n\tif (consent === \"pending\" || consent) return null;\n\n\tconst choose = (value: CookieConsentValue) => {\n\t\tconst resolvedDomain =\n\t\t\tdomain ??\n\t\t\t(typeof window === \"undefined\"\n\t\t\t\t? undefined\n\t\t\t\t: cookieDomainFromHostname(window.location.hostname));\n\t\twriteCookieConsent(value, { domain: resolvedDomain });\n\t\tsetConsent(value);\n\t\tonChoice?.(value);\n\t};\n\n\treturn (\n\t\t<div\n\t\t\trole=\"dialog\"\n\t\t\taria-label={copy.message}\n\t\t\tclassName={cn(\n\t\t\t\t\"fixed inset-x-0 bottom-0 z-50 border-t bg-background/95 p-4 shadow-lg backdrop-blur-sm\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t<div className=\"mx-auto flex w-full max-w-5xl flex-col gap-3 sm:flex-row sm:items-center sm:justify-between\">\n\t\t\t\t<p className=\"text-sm text-muted-foreground\">\n\t\t\t\t\t{copy.message}\n\t\t\t\t\t{policyHref ? (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t{\" \"}\n\t\t\t\t\t\t\t<a\n\t\t\t\t\t\t\t\thref={policyHref}\n\t\t\t\t\t\t\t\tclassName=\"text-foreground underline underline-offset-4\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{copy.policy}\n\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t</>\n\t\t\t\t\t) : null}\n\t\t\t\t</p>\n\t\t\t\t<div className=\"flex shrink-0 flex-wrap gap-2\">\n\t\t\t\t\t<Button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tvariant=\"outline\"\n\t\t\t\t\t\tonClick={() => choose(\"necessary\")}\n\t\t\t\t\t>\n\t\t\t\t\t\t{copy.necessaryOnly}\n\t\t\t\t\t</Button>\n\t\t\t\t\t<Button type=\"button\" onClick={() => choose(\"all\")}>\n\t\t\t\t\t\t{copy.acceptAll}\n\t\t\t\t\t</Button>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n","import type { ReactNode } from \"react\";\n\nfunction LegalDocLink({\n\thref,\n\tchildren,\n}: {\n\thref: string;\n\tchildren: ReactNode;\n}) {\n\treturn (\n\t\t<a\n\t\t\thref={href}\n\t\t\ttarget=\"_blank\"\n\t\t\trel=\"noopener noreferrer\"\n\t\t\tclassName=\"underline underline-offset-4\"\n\t\t>\n\t\t\t{children}\n\t\t</a>\n\t);\n}\n\nfunction wrapPhrases(\n\tlabel: string,\n\tterms: string,\n\tprivacy: string,\n\ttermsHref: string,\n\tprivacyHref: string,\n): ReactNode {\n\ttype Hit = { start: number; end: number; href: string; text: string };\n\tconst hits: Hit[] = [];\n\tif (terms) {\n\t\tconst start = label.indexOf(terms);\n\t\tif (start >= 0) {\n\t\t\thits.push({\n\t\t\t\tstart,\n\t\t\t\tend: start + terms.length,\n\t\t\t\thref: termsHref,\n\t\t\t\ttext: terms,\n\t\t\t});\n\t\t}\n\t}\n\tif (privacy) {\n\t\tconst start = label.indexOf(privacy);\n\t\tif (start >= 0) {\n\t\t\thits.push({\n\t\t\t\tstart,\n\t\t\t\tend: start + privacy.length,\n\t\t\t\thref: privacyHref,\n\t\t\t\ttext: privacy,\n\t\t\t});\n\t\t}\n\t}\n\thits.sort((a, b) => a.start - b.start || b.end - b.start - (a.end - a.start));\n\tconst kept: Hit[] = [];\n\tfor (const hit of hits) {\n\t\tconst last = kept[kept.length - 1];\n\t\tif (last && hit.start < last.end) {\n\t\t\tif (hit.end - hit.start > last.end - last.start) {\n\t\t\t\tkept[kept.length - 1] = hit;\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\t\tkept.push(hit);\n\t}\n\tif (kept.length === 0) {\n\t\treturn (\n\t\t\t<>\n\t\t\t\t{label} <LegalDocLink href={termsHref}>{terms}</LegalDocLink>\n\t\t\t\t{\" · \"}\n\t\t\t\t<LegalDocLink href={privacyHref}>{privacy}</LegalDocLink>\n\t\t\t</>\n\t\t);\n\t}\n\tconst nodes: ReactNode[] = [];\n\tlet cursor = 0;\n\tkept.forEach((hit, index) => {\n\t\tif (hit.start > cursor) {\n\t\t\tnodes.push(label.slice(cursor, hit.start));\n\t\t}\n\t\tnodes.push(\n\t\t\t<LegalDocLink key={`${hit.text}-${index}`} href={hit.href}>\n\t\t\t\t{hit.text}\n\t\t\t</LegalDocLink>,\n\t\t);\n\t\tcursor = hit.end;\n\t});\n\tif (cursor < label.length) {\n\t\tnodes.push(label.slice(cursor));\n\t}\n\treturn nodes;\n}\n\nexport function renderLegalAcceptLabel(\n\tlabel: string,\n\tterms: string,\n\tprivacy: string,\n\ttermsHref: string,\n\tprivacyHref: string,\n): ReactNode {\n\tif (label.includes(\"{terms}\") || label.includes(\"{privacy}\")) {\n\t\treturn label.split(/(\\{terms\\}|\\{privacy\\})/g).map((part, index) => {\n\t\t\tif (part === \"{terms}\") {\n\t\t\t\treturn (\n\t\t\t\t\t<LegalDocLink key={`terms-${index}`} href={termsHref}>\n\t\t\t\t\t\t{terms}\n\t\t\t\t\t</LegalDocLink>\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (part === \"{privacy}\") {\n\t\t\t\treturn (\n\t\t\t\t\t<LegalDocLink key={`privacy-${index}`} href={privacyHref}>\n\t\t\t\t\t\t{privacy}\n\t\t\t\t\t</LegalDocLink>\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn part;\n\t\t});\n\t}\n\treturn wrapPhrases(label, terms, privacy, termsHref, privacyHref);\n}\n","\"use client\";\n\nimport { renderLegalAcceptLabel } from \"../lib/legal-accept-label\";\nimport { Button } from \"../ui/button\";\nimport {\n\tAlertDialog,\n\tAlertDialogContent,\n\tAlertDialogDescription,\n\tAlertDialogFooter,\n\tAlertDialogHeader,\n\tAlertDialogTitle,\n} from \"../ui/alert-dialog\";\n\nexport type LegalAcceptDialogLabels = {\n\ttitle: string;\n\tdescription: string;\n\taccept: string;\n\tterms: string;\n\tprivacy: string;\n};\n\nexport const DEFAULT_LEGAL_ACCEPT_DIALOG_LABELS: LegalAcceptDialogLabels = {\n\ttitle: \"Updated terms\",\n\tdescription:\n\t\t\"We updated the Terms of Service and Privacy Policy. Please accept to continue.\",\n\taccept: \"Accept\",\n\tterms: \"Terms of Service\",\n\tprivacy: \"Privacy Policy\",\n};\n\nexport type LegalAcceptDialogProps = {\n\topen: boolean;\n\ttermsHref: string;\n\tprivacyHref: string;\n\tsummary?: string;\n\taccepting?: boolean;\n\tlabels?: Partial<LegalAcceptDialogLabels>;\n\tonAccept: () => void;\n};\n\nexport function LegalAcceptDialog({\n\topen,\n\ttermsHref,\n\tprivacyHref,\n\tsummary,\n\taccepting = false,\n\tlabels,\n\tonAccept,\n}: LegalAcceptDialogProps) {\n\tconst copy = { ...DEFAULT_LEGAL_ACCEPT_DIALOG_LABELS, ...labels };\n\n\treturn (\n\t\t<AlertDialog\n\t\t\topen={open}\n\t\t\tonOpenChange={(next) => {\n\t\t\t\tif (next) return;\n\t\t\t}}\n\t\t>\n\t\t\t<AlertDialogContent\n\t\t\t\tonEscapeKeyDown={(event) => {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t<AlertDialogHeader>\n\t\t\t\t\t<AlertDialogTitle>{copy.title}</AlertDialogTitle>\n\t\t\t\t\t<AlertDialogDescription>\n\t\t\t\t\t\t{renderLegalAcceptLabel(\n\t\t\t\t\t\t\tcopy.description,\n\t\t\t\t\t\t\tcopy.terms,\n\t\t\t\t\t\t\tcopy.privacy,\n\t\t\t\t\t\t\ttermsHref,\n\t\t\t\t\t\t\tprivacyHref,\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{summary ? ` ${summary}` : \"\"}\n\t\t\t\t\t</AlertDialogDescription>\n\t\t\t\t</AlertDialogHeader>\n\t\t\t\t<AlertDialogFooter>\n\t\t\t\t\t<Button type=\"button\" disabled={accepting} onClick={onAccept}>\n\t\t\t\t\t\t{copy.accept}\n\t\t\t\t\t</Button>\n\t\t\t\t</AlertDialogFooter>\n\t\t\t</AlertDialogContent>\n\t\t</AlertDialog>\n\t);\n}\n","import { cn } from \"../lib/utils\";\nimport { renderLegalAcceptLabel } from \"../lib/legal-accept-label\";\n\nexport type LegalAcceptCheckboxLabels = {\n\tlabel: string;\n\tterms: string;\n\tprivacy: string;\n};\n\nexport const DEFAULT_LEGAL_ACCEPT_CHECKBOX_LABELS: LegalAcceptCheckboxLabels = {\n\tlabel: \"I agree to the {terms} and {privacy}\",\n\tterms: \"Terms of Service\",\n\tprivacy: \"Privacy Policy\",\n};\n\nexport type LegalAcceptCheckboxProps = {\n\tid?: string;\n\tchecked: boolean;\n\tonCheckedChange: (checked: boolean) => void;\n\ttermsHref: string;\n\tprivacyHref: string;\n\tlabels?: Partial<LegalAcceptCheckboxLabels>;\n\tdisabled?: boolean;\n\tclassName?: string;\n};\n\nexport function LegalAcceptCheckbox({\n\tid = \"legal-accept\",\n\tchecked,\n\tonCheckedChange,\n\ttermsHref,\n\tprivacyHref,\n\tlabels,\n\tdisabled = false,\n\tclassName,\n}: LegalAcceptCheckboxProps) {\n\tconst copy = { ...DEFAULT_LEGAL_ACCEPT_CHECKBOX_LABELS, ...labels };\n\n\treturn (\n\t\t<div className={cn(\"flex items-start gap-3\", className)}>\n\t\t\t<input\n\t\t\t\tid={id}\n\t\t\t\ttype=\"checkbox\"\n\t\t\t\tchecked={checked}\n\t\t\t\tdisabled={disabled}\n\t\t\t\tonChange={(event) => onCheckedChange(event.target.checked)}\n\t\t\t\tclassName=\"mt-1 size-4 shrink-0 accent-primary\"\n\t\t\t/>\n\t\t\t<label htmlFor={id} className=\"text-sm leading-5\">\n\t\t\t\t{renderLegalAcceptLabel(\n\t\t\t\t\tcopy.label,\n\t\t\t\t\tcopy.terms,\n\t\t\t\t\tcopy.privacy,\n\t\t\t\t\ttermsHref,\n\t\t\t\t\tprivacyHref,\n\t\t\t\t)}\n\t\t\t</label>\n\t\t</div>\n\t);\n}\n","import type { ReactNode } from \"react\";\n\nimport { cn } from \"../lib/utils\";\n\nexport type LegalMarkdownProps = {\n\tmarkdown: string;\n\tclassName?: string;\n};\n\nfunction sanitizeHref(href: string): string | null {\n\tconst trimmed = href.trim();\n\tif (/^https?:\\/\\//i.test(trimmed) || /^mailto:/i.test(trimmed)) {\n\t\treturn trimmed;\n\t}\n\tif (trimmed.startsWith(\"/\") && !trimmed.startsWith(\"//\")) {\n\t\treturn trimmed;\n\t}\n\treturn null;\n}\n\nfunction renderInline(text: string): ReactNode[] {\n\tconst nodes: ReactNode[] = [];\n\tconst pattern = /(\\*\\*[^*]+\\*\\*|\\*[^*]+\\*|`[^`]+`|\\[[^\\]]+\\]\\([^)]+\\))/g;\n\tlet last = 0;\n\tlet match: RegExpExecArray | null;\n\tlet key = 0;\n\twhile ((match = pattern.exec(text)) !== null) {\n\t\tif (match.index > last) {\n\t\t\tnodes.push(text.slice(last, match.index));\n\t\t}\n\t\tconst token = match[0];\n\t\tif (token.startsWith(\"**\")) {\n\t\t\tnodes.push(<strong key={key}>{token.slice(2, -2)}</strong>);\n\t\t} else if (token.startsWith(\"*\")) {\n\t\t\tnodes.push(<em key={key}>{token.slice(1, -1)}</em>);\n\t\t} else if (token.startsWith(\"`\")) {\n\t\t\tnodes.push(\n\t\t\t\t<code key={key} className=\"rounded bg-muted px-1 py-0.5 text-[0.9em]\">\n\t\t\t\t\t{token.slice(1, -1)}\n\t\t\t\t</code>,\n\t\t\t);\n\t\t} else {\n\t\t\tconst link = token.match(/^\\[([^\\]]+)\\]\\(([^)]+)\\)$/);\n\t\t\tconst href = link ? sanitizeHref(link[2] ?? \"\") : null;\n\t\t\tif (link && href) {\n\t\t\t\tnodes.push(\n\t\t\t\t\t<a\n\t\t\t\t\t\tkey={key}\n\t\t\t\t\t\thref={href}\n\t\t\t\t\t\tclassName=\"underline underline-offset-4\"\n\t\t\t\t\t\trel=\"noopener noreferrer\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{link[1]}\n\t\t\t\t\t</a>,\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tnodes.push(token);\n\t\t\t}\n\t\t}\n\t\tkey += 1;\n\t\tlast = match.index + token.length;\n\t}\n\tif (last < text.length) {\n\t\tnodes.push(text.slice(last));\n\t}\n\treturn nodes;\n}\n\nfunction headingTag(\n\tline: string,\n): { Tag: \"h1\" | \"h2\" | \"h3\"; text: string } | null {\n\tif (line.startsWith(\"### \")) return { Tag: \"h3\", text: line.slice(4) };\n\tif (line.startsWith(\"## \")) return { Tag: \"h2\", text: line.slice(3) };\n\tif (line.startsWith(\"# \")) return { Tag: \"h1\", text: line.slice(2) };\n\treturn null;\n}\n\nfunction isUnorderedItem(line: string): boolean {\n\treturn /^[-*] /.test(line);\n}\n\nfunction isOrderedItem(line: string): boolean {\n\treturn /^\\d+\\. /.test(line);\n}\n\nexport function LegalMarkdown({ markdown, className }: LegalMarkdownProps) {\n\tconst blocks = markdown\n\t\t.replace(/\\r\\n/g, \"\\n\")\n\t\t.trim()\n\t\t.split(/\\n{2,}/);\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\t\"legal-markdown space-y-4 text-sm leading-6 [&_h1]:text-3xl [&_h1]:font-semibold [&_h2]:text-xl [&_h2]:font-semibold [&_h3]:text-lg [&_h3]:font-semibold [&_ul]:list-disc [&_ul]:pl-5 [&_ol]:list-decimal [&_ol]:pl-5\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t{blocks.map((block, index) => {\n\t\t\t\tconst lines = block.split(\"\\n\");\n\t\t\t\tconst heading = headingTag(lines[0] ?? \"\");\n\t\t\t\tif (heading && lines.length === 1) {\n\t\t\t\t\tconst { Tag, text } = heading;\n\t\t\t\t\treturn <Tag key={index}>{renderInline(text)}</Tag>;\n\t\t\t\t}\n\t\t\t\tif (lines.every(isUnorderedItem)) {\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<ul key={index}>\n\t\t\t\t\t\t\t{lines.map((line, itemIndex) => (\n\t\t\t\t\t\t\t\t<li key={itemIndex}>\n\t\t\t\t\t\t\t\t\t{renderInline(line.replace(/^[-*] /, \"\"))}\n\t\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</ul>\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tif (lines.every(isOrderedItem)) {\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<ol key={index}>\n\t\t\t\t\t\t\t{lines.map((line, itemIndex) => (\n\t\t\t\t\t\t\t\t<li key={itemIndex}>\n\t\t\t\t\t\t\t\t\t{renderInline(line.replace(/^\\d+\\. /, \"\"))}\n\t\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</ol>\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\treturn <p key={index}>{renderInline(lines.join(\" \"))}</p>;\n\t\t\t})}\n\t\t</div>\n\t);\n}\n","/** Matches `next-themes` default `storageKey`. */\nexport const THEME_STORAGE_KEY = \"theme\";\n\nexport const THEME_INIT_SCRIPT_ID = \"yenio-theme-init\";\n\n/**\n * Blocking script for the root layout.\n * `next-themes` contract: `attribute=\"class\"`, `storageKey=\"theme\"`, default `system`.\n * The provider injects the class too late for first paint.\n */\nexport const THEME_INIT_SCRIPT = `(function(){var t=\"light\";var s;try{s=localStorage.getItem(\"${THEME_STORAGE_KEY}\")}catch(e){}if(s===\"dark\"||s===\"light\"){t=s}else{try{if(window.matchMedia(\"(prefers-color-scheme: dark)\").matches)t=\"dark\"}catch(e){}}var r=document.documentElement;r.classList.add(t);r.style.colorScheme=t})();`;\n","\"use client\";\n\nimport type { ReactNode } from \"react\";\n\nimport { cn } from \"../lib/utils\";\nimport { EmptyState } from \"./EmptyState\";\n\nexport type AuditActor = {\n\tkind: string;\n\tid: string;\n\torganizationRole?: string | null;\n};\n\nexport type AuditSubject = {\n\ttype: string;\n\tid: string;\n};\n\nexport type AuditTimelineItem = {\n\tid: string;\n\ttype: string;\n\toccurredAt: number;\n\tactor: AuditActor;\n\tsubject: AuditSubject;\n\tsummary: string;\n};\n\nexport type AuditTimelineLabels = {\n\temptyTitle: string;\n\temptyDescription: string;\n\tactor: string;\n\tsubject: string;\n};\n\nexport const DEFAULT_AUDIT_TIMELINE_LABELS: AuditTimelineLabels = {\n\temptyTitle: \"No events\",\n\temptyDescription: \"Audited activity will appear here.\",\n\tactor: \"Actor\",\n\tsubject: \"Subject\",\n};\n\nexport type AuditTimelineProps = {\n\titems: AuditTimelineItem[];\n\tlabels?: Partial<AuditTimelineLabels>;\n\t/** Single primary action shown only when the timeline is empty. */\n\temptyAction?: ReactNode;\n\tclassName?: string;\n\tformatOccurredAt?: (occurredAt: number) => string;\n};\n\nfunction formatOccurredAt(occurredAt: number): string {\n\tconst date = new Date(occurredAt);\n\tif (Number.isNaN(date.getTime())) return String(occurredAt);\n\treturn new Intl.DateTimeFormat(\"en\", {\n\t\tdateStyle: \"medium\",\n\t\ttimeStyle: \"short\",\n\t\ttimeZone: \"America/Mexico_City\",\n\t}).format(date);\n}\n\nfunction actorLine(actor: AuditActor): string {\n\tconst role = actor.organizationRole ? ` (${actor.organizationRole})` : \"\";\n\treturn `${actor.kind} ${actor.id}${role}`;\n}\n\nexport function AuditTimeline({\n\titems,\n\tlabels,\n\temptyAction,\n\tclassName,\n\tformatOccurredAt: format = formatOccurredAt,\n}: AuditTimelineProps) {\n\tconst copy = { ...DEFAULT_AUDIT_TIMELINE_LABELS, ...labels };\n\n\tif (items.length === 0) {\n\t\treturn (\n\t\t\t<EmptyState\n\t\t\t\tclassName={className}\n\t\t\t\ttitle={copy.emptyTitle}\n\t\t\t\tdescription={copy.emptyDescription}\n\t\t\t\taction={emptyAction}\n\t\t\t/>\n\t\t);\n\t}\n\n\treturn (\n\t\t<ol className={cn(\"flex flex-col gap-3\", className)}>\n\t\t\t{items.map((item) => {\n\t\t\t\tconst occurred = new Date(item.occurredAt);\n\t\t\t\tconst iso = Number.isNaN(occurred.getTime())\n\t\t\t\t\t? undefined\n\t\t\t\t\t: occurred.toISOString();\n\t\t\t\treturn (\n\t\t\t\t\t<li\n\t\t\t\t\t\tkey={item.id}\n\t\t\t\t\t\tclassName=\"rounded-xl border border-border bg-card p-4 text-card-foreground\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<div className=\"flex flex-wrap items-baseline justify-between gap-2\">\n\t\t\t\t\t\t\t<p className=\"font-mono text-sm font-medium\">{item.type}</p>\n\t\t\t\t\t\t\t<time className=\"text-xs text-muted-foreground\" dateTime={iso}>\n\t\t\t\t\t\t\t\t{format(item.occurredAt)}\n\t\t\t\t\t\t\t</time>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<p className=\"mt-2 text-sm\">{item.summary}</p>\n\t\t\t\t\t\t<p className=\"mt-2 text-xs text-muted-foreground\">\n\t\t\t\t\t\t\t{copy.actor}: {actorLine(item.actor)}\n\t\t\t\t\t\t</p>\n\t\t\t\t\t\t<p className=\"text-xs text-muted-foreground\">\n\t\t\t\t\t\t\t{copy.subject}: {item.subject.type} {item.subject.id}\n\t\t\t\t\t\t</p>\n\t\t\t\t\t</li>\n\t\t\t\t);\n\t\t\t})}\n\t\t</ol>\n\t);\n}\n","\"use client\";\n\nimport { cn } from \"../lib/utils\";\n\nexport type RiskSeverity = \"low\" | \"medium\" | \"high\";\n\nexport type RiskBadgeLabels = {\n\tlow: string;\n\tmedium: string;\n\thigh: string;\n\tunverifiedRule: string;\n};\n\nexport const DEFAULT_RISK_BADGE_LABELS: RiskBadgeLabels = {\n\tlow: \"Low\",\n\tmedium: \"Medium\",\n\thigh: \"High\",\n\tunverifiedRule: \"Unverified rule\",\n};\n\nexport type RiskBadgeProps = {\n\tseverity: RiskSeverity;\n\t/** When false, the badge also shows the unverified-rule label. */\n\tsmeVerified?: boolean;\n\tlabels?: Partial<RiskBadgeLabels>;\n\tclassName?: string;\n};\n\nconst tone: Record<RiskSeverity, string> = {\n\tlow: \"bg-muted text-muted-foreground\",\n\tmedium: \"bg-accent text-accent-foreground\",\n\thigh: \"bg-destructive/15 text-destructive\",\n};\n\nfunction severityLabel(\n\tseverity: RiskSeverity,\n\tlabels: RiskBadgeLabels,\n): string {\n\tswitch (severity) {\n\t\tcase \"low\":\n\t\t\treturn labels.low;\n\t\tcase \"medium\":\n\t\t\treturn labels.medium;\n\t\tcase \"high\":\n\t\t\treturn labels.high;\n\t\tdefault: {\n\t\t\tconst exhaustive: never = severity;\n\t\t\treturn exhaustive;\n\t\t}\n\t}\n}\n\nexport function RiskBadge({\n\tseverity,\n\tsmeVerified,\n\tlabels,\n\tclassName,\n}: RiskBadgeProps) {\n\tconst copy = { ...DEFAULT_RISK_BADGE_LABELS, ...labels };\n\n\treturn (\n\t\t<span className={cn(\"inline-flex flex-wrap items-center gap-2\", className)}>\n\t\t\t<span\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"inline-flex items-center rounded-md px-2 py-0.5 text-xs font-medium\",\n\t\t\t\t\ttone[severity],\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t{severityLabel(severity, copy)}\n\t\t\t</span>\n\t\t\t{smeVerified === false ? (\n\t\t\t\t<span className=\"text-xs text-muted-foreground\">\n\t\t\t\t\t{copy.unverifiedRule}\n\t\t\t\t</span>\n\t\t\t) : null}\n\t\t</span>\n\t);\n}\n","\"use client\";\n\nimport type { ReactNode } from \"react\";\n\nimport { cn } from \"../lib/utils\";\nimport { EmptyState } from \"./EmptyState\";\n\nexport type EntityGraphNode = {\n\tid: string;\n\tlabel: string;\n\tkind: string;\n};\n\nexport type ControlKind = \"ownership\" | \"other_means\" | \"senior_manager\";\n\nexport type EntityGraphEdge = {\n\tfrom: string;\n\tto: string;\n\tcontrolKind: ControlKind;\n\townershipBps?: number;\n};\n\nexport type EntityGraphLabels = {\n\temptyTitle: string;\n\temptyDescription: string;\n\townership: string;\n\totherMeans: string;\n\tseniorManager: string;\n};\n\nexport const DEFAULT_ENTITY_GRAPH_LABELS: EntityGraphLabels = {\n\temptyTitle: \"No beneficial owners\",\n\temptyDescription: \"Ownership and control relationships will appear here.\",\n\townership: \"Ownership\",\n\totherMeans: \"Other means\",\n\tseniorManager: \"Senior manager\",\n};\n\nexport type EntityGraphProps = {\n\tnodes: EntityGraphNode[];\n\tedges: EntityGraphEdge[];\n\tlabels?: Partial<EntityGraphLabels>;\n\temptyAction?: ReactNode;\n\tclassName?: string;\n};\n\nfunction controlLabel(\n\tcontrolKind: ControlKind,\n\tlabels: EntityGraphLabels,\n): string {\n\tswitch (controlKind) {\n\t\tcase \"ownership\":\n\t\t\treturn labels.ownership;\n\t\tcase \"other_means\":\n\t\t\treturn labels.otherMeans;\n\t\tcase \"senior_manager\":\n\t\t\treturn labels.seniorManager;\n\t\tdefault: {\n\t\t\tconst exhaustive: never = controlKind;\n\t\t\treturn exhaustive;\n\t\t}\n\t}\n}\n\nfunction formatOwnership(bps: number): string {\n\tconst percent = bps / 100;\n\tconst text = Number.isInteger(percent) ? String(percent) : percent.toFixed(2);\n\treturn `${text}% (${bps} bps)`;\n}\n\nfunction nodeLabel(nodes: EntityGraphNode[], id: string): string {\n\treturn nodes.find((node) => node.id === id)?.label ?? id;\n}\n\nexport function EntityGraph({\n\tnodes,\n\tedges,\n\tlabels,\n\temptyAction,\n\tclassName,\n}: EntityGraphProps) {\n\tconst copy = { ...DEFAULT_ENTITY_GRAPH_LABELS, ...labels };\n\n\tif (nodes.length === 0 && edges.length === 0) {\n\t\treturn (\n\t\t\t<EmptyState\n\t\t\t\tclassName={className}\n\t\t\t\ttitle={copy.emptyTitle}\n\t\t\t\tdescription={copy.emptyDescription}\n\t\t\t\taction={emptyAction}\n\t\t\t/>\n\t\t);\n\t}\n\n\tconst nodeIds = new Set(nodes.map((node) => node.id));\n\tconst unattached = edges.filter((edge) => !nodeIds.has(edge.from));\n\n\treturn (\n\t\t<div className={cn(\"flex flex-col gap-3\", className)}>\n\t\t\t{nodes.map((node) => {\n\t\t\t\tconst outgoing = edges.filter((edge) => edge.from === node.id);\n\t\t\t\treturn (\n\t\t\t\t\t<section\n\t\t\t\t\t\tkey={node.id}\n\t\t\t\t\t\tclassName=\"rounded-xl border border-border bg-card p-4 text-card-foreground\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<h3 className=\"text-sm font-medium\">{node.label}</h3>\n\t\t\t\t\t\t<p className=\"text-xs text-muted-foreground\">{node.kind}</p>\n\t\t\t\t\t\t{outgoing.length > 0 ? (\n\t\t\t\t\t\t\t<ul className=\"mt-3 flex flex-col gap-1 text-sm\">\n\t\t\t\t\t\t\t\t{outgoing.map((edge) => (\n\t\t\t\t\t\t\t\t\t<li key={`${edge.from}-${edge.to}-${edge.controlKind}`}>\n\t\t\t\t\t\t\t\t\t\t{node.label} → {nodeLabel(nodes, edge.to)}:{\" \"}\n\t\t\t\t\t\t\t\t\t\t{controlLabel(edge.controlKind, copy)}\n\t\t\t\t\t\t\t\t\t\t{typeof edge.ownershipBps === \"number\"\n\t\t\t\t\t\t\t\t\t\t\t? ` ${formatOwnership(edge.ownershipBps)}`\n\t\t\t\t\t\t\t\t\t\t\t: null}\n\t\t\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t</ul>\n\t\t\t\t\t\t) : null}\n\t\t\t\t\t</section>\n\t\t\t\t);\n\t\t\t})}\n\t\t\t{unattached.length > 0 ? (\n\t\t\t\t<ul className=\"flex flex-col gap-1 text-sm\">\n\t\t\t\t\t{unattached.map((edge) => (\n\t\t\t\t\t\t<li key={`${edge.from}-${edge.to}-${edge.controlKind}`}>\n\t\t\t\t\t\t\t{nodeLabel(nodes, edge.from)} → {nodeLabel(nodes, edge.to)}:{\" \"}\n\t\t\t\t\t\t\t{controlLabel(edge.controlKind, copy)}\n\t\t\t\t\t\t\t{typeof edge.ownershipBps === \"number\"\n\t\t\t\t\t\t\t\t? ` ${formatOwnership(edge.ownershipBps)}`\n\t\t\t\t\t\t\t\t: null}\n\t\t\t\t\t\t</li>\n\t\t\t\t\t))}\n\t\t\t\t</ul>\n\t\t\t) : null}\n\t\t</div>\n\t);\n}\n","\"use client\";\n\nimport { useId, useState, type ReactNode } from \"react\";\n\nimport { cn } from \"../lib/utils\";\nimport { Button } from \"../ui/button\";\nimport { EmptyState } from \"./EmptyState\";\n\nexport type MatchReviewSource = {\n\turl: string;\n\ttitle: string;\n};\n\nexport type MatchReviewStatus = \"pending\" | \"confirmed\" | \"dismissed\";\n\nexport type MatchReviewHit = {\n\tsource: string;\n\tscore?: number;\n\tmatchedFields: string[];\n\tstatus: MatchReviewStatus;\n\tunverified?: boolean;\n\tsources?: MatchReviewSource[];\n};\n\nexport type MatchReviewLabels = {\n\temptyTitle: string;\n\temptyDescription: string;\n\tsource: string;\n\tscore: string;\n\tmatchedFields: string;\n\tnoMatchedFields: string;\n\tstatus: string;\n\tunverified: string;\n\treason: string;\n\treasonPlaceholder: string;\n\tconfirm: string;\n\tdismiss: string;\n};\n\nexport const DEFAULT_MATCH_REVIEW_LABELS: MatchReviewLabels = {\n\temptyTitle: \"No match\",\n\temptyDescription: \"There is no hit to review.\",\n\tsource: \"Source\",\n\tscore: \"Score\",\n\tmatchedFields: \"Matched fields\",\n\tnoMatchedFields: \"None\",\n\tstatus: \"Status\",\n\tunverified: \"Unverified\",\n\treason: \"Reason\",\n\treasonPlaceholder: \"Why this decision\",\n\tconfirm: \"Confirm\",\n\tdismiss: \"Dismiss\",\n};\n\nexport type MatchReviewProps = {\n\thit: MatchReviewHit | null;\n\tonResolve: (status: \"confirmed\" | \"dismissed\", reason: string) => void;\n\tlabels?: Partial<MatchReviewLabels>;\n\t/** Optional map from source identifiers such as `sat69b` to display copy. */\n\tsourceLabels?: Record<string, string>;\n\temptyAction?: ReactNode;\n\tclassName?: string;\n};\n\nexport function sourceUrlIsHttps(url: string): boolean {\n\ttry {\n\t\treturn new URL(url).protocol === \"https:\";\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nexport function matchClaimIsUnverified(hit: MatchReviewHit): boolean {\n\tif (hit.unverified === true) return true;\n\treturn (hit.sources ?? []).some((source) => !sourceUrlIsHttps(source.url));\n}\n\ntype Appearance = \"unverified\" | MatchReviewStatus;\n\nfunction appearanceOf(hit: MatchReviewHit): Appearance {\n\tif (matchClaimIsUnverified(hit)) return \"unverified\";\n\treturn hit.status;\n}\n\nconst appearanceClass: Record<Appearance, string> = {\n\tunverified: \"border-dashed border-border bg-muted/40\",\n\tpending: \"border-border bg-card\",\n\tconfirmed: \"border-primary bg-primary/5\",\n\tdismissed: \"border-border bg-muted/30\",\n};\n\nexport function MatchReview({\n\thit,\n\tonResolve,\n\tlabels,\n\tsourceLabels,\n\temptyAction,\n\tclassName,\n}: MatchReviewProps) {\n\tconst copy = { ...DEFAULT_MATCH_REVIEW_LABELS, ...labels };\n\tconst reasonId = useId();\n\tconst [reason, setReason] = useState(\"\");\n\tconst trimmed = reason.trim();\n\n\tif (!hit) {\n\t\treturn (\n\t\t\t<EmptyState\n\t\t\t\tclassName={className}\n\t\t\t\ttitle={copy.emptyTitle}\n\t\t\t\tdescription={copy.emptyDescription}\n\t\t\t\taction={emptyAction}\n\t\t\t/>\n\t\t);\n\t}\n\n\tconst appearance = appearanceOf(hit);\n\tconst sourceLabel = sourceLabels?.[hit.source] ?? hit.source;\n\n\tfunction resolve(status: \"confirmed\" | \"dismissed\") {\n\t\tif (trimmed.length === 0) return;\n\t\tonResolve(status, trimmed);\n\t}\n\n\treturn (\n\t\t<article\n\t\t\tdata-appearance={appearance}\n\t\t\tclassName={cn(\n\t\t\t\t\"flex flex-col gap-3 rounded-xl border p-4 text-card-foreground motion-reduce:transition-none\",\n\t\t\t\tappearanceClass[appearance],\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t<div className=\"flex flex-wrap items-center gap-2\">\n\t\t\t\t<p className=\"text-sm font-medium\">\n\t\t\t\t\t{copy.source}: {sourceLabel}\n\t\t\t\t</p>\n\t\t\t\t{appearance === \"unverified\" ? (\n\t\t\t\t\t<span className=\"rounded-md bg-muted px-2 py-0.5 text-xs text-muted-foreground\">\n\t\t\t\t\t\t{copy.unverified}\n\t\t\t\t\t</span>\n\t\t\t\t) : null}\n\t\t\t</div>\n\t\t\t<dl className=\"grid grid-cols-[max-content_1fr] gap-x-3 gap-y-1 text-sm\">\n\t\t\t\t{typeof hit.score === \"number\" ? (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<dt className=\"text-muted-foreground\">{copy.score}</dt>\n\t\t\t\t\t\t<dd>{hit.score}</dd>\n\t\t\t\t\t</>\n\t\t\t\t) : null}\n\t\t\t\t<dt className=\"text-muted-foreground\">{copy.matchedFields}</dt>\n\t\t\t\t<dd>\n\t\t\t\t\t{hit.matchedFields.length > 0\n\t\t\t\t\t\t? hit.matchedFields.join(\", \")\n\t\t\t\t\t\t: copy.noMatchedFields}\n\t\t\t\t</dd>\n\t\t\t\t<dt className=\"text-muted-foreground\">{copy.status}</dt>\n\t\t\t\t<dd>{hit.status}</dd>\n\t\t\t</dl>\n\t\t\t{hit.sources && hit.sources.length > 0 ? (\n\t\t\t\t<ul className=\"flex flex-col gap-1 text-sm\">\n\t\t\t\t\t{hit.sources.map((source) =>\n\t\t\t\t\t\tsourceUrlIsHttps(source.url) ? (\n\t\t\t\t\t\t\t<li key={`${source.title}-${source.url}`}>\n\t\t\t\t\t\t\t\t<a\n\t\t\t\t\t\t\t\t\tclassName=\"underline underline-offset-2\"\n\t\t\t\t\t\t\t\t\thref={source.url}\n\t\t\t\t\t\t\t\t\trel=\"noreferrer\"\n\t\t\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{source.title}\n\t\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<li key={`${source.title}-${source.url}`}>\n\t\t\t\t\t\t\t\t{source.title} ({copy.unverified})\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t),\n\t\t\t\t\t)}\n\t\t\t\t</ul>\n\t\t\t) : null}\n\t\t\t<div className=\"flex flex-col gap-1\">\n\t\t\t\t<label className=\"text-sm font-medium\" htmlFor={reasonId}>\n\t\t\t\t\t{copy.reason}\n\t\t\t\t</label>\n\t\t\t\t<textarea\n\t\t\t\t\tid={reasonId}\n\t\t\t\t\tclassName=\"min-h-20 rounded-md border border-input bg-background px-3 py-2 text-sm\"\n\t\t\t\t\tvalue={reason}\n\t\t\t\t\tplaceholder={copy.reasonPlaceholder}\n\t\t\t\t\tonChange={(event) => setReason(event.target.value)}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t\t<div className=\"flex flex-wrap gap-2\">\n\t\t\t\t<Button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tdisabled={trimmed.length === 0}\n\t\t\t\t\tonClick={() => resolve(\"confirmed\")}\n\t\t\t\t>\n\t\t\t\t\t{copy.confirm}\n\t\t\t\t</Button>\n\t\t\t\t<Button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tvariant=\"outline\"\n\t\t\t\t\tdisabled={trimmed.length === 0}\n\t\t\t\t\tonClick={() => resolve(\"dismissed\")}\n\t\t\t\t>\n\t\t\t\t\t{copy.dismiss}\n\t\t\t\t</Button>\n\t\t\t</div>\n\t\t</article>\n\t);\n}\n"]}
|