@firecms/media_manager 3.1.0-canary.1df3b2c

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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.es.js","sources":["../src/MediaManagerProvider.tsx","../src/useMediaManagerController.tsx","../src/components/MediaAssetCard.tsx","../src/components/MediaAssetDetails.tsx","../src/components/MediaUploadDialog.tsx","../src/components/MediaLibraryView.tsx","../src/useMediaManagerPlugin.tsx","../src/components/MediaLibraryCard.tsx"],"sourcesContent":["import React, { createContext, PropsWithChildren, useContext } from \"react\";\nimport { MediaManagerController } from \"./types\";\n\nconst MediaManagerContext = createContext<MediaManagerController | undefined>(undefined);\n\n/**\n * Hook to access the MediaManagerController from context.\n * Must be used within a MediaManagerProvider.\n */\nexport function useMediaManager(): MediaManagerController {\n const context = useContext(MediaManagerContext);\n if (!context) {\n throw new Error(\"useMediaManager must be used within a MediaManagerProvider\");\n }\n return context;\n}\n\nexport interface MediaManagerProviderProps {\n controller: MediaManagerController;\n}\n\n/**\n * Provider component that makes the MediaManagerController available to all children.\n */\nexport function MediaManagerProvider({\n controller,\n children\n}: PropsWithChildren<MediaManagerProviderProps>) {\n return (\n <MediaManagerContext.Provider value={controller}>\n {children}\n </MediaManagerContext.Provider>\n );\n}\n","import { useCallback, useEffect, useState } from \"react\";\nimport { DataSourceDelegate, StorageSource } from \"@firecms/core\";\nimport { MediaAsset, MediaManagerController, ThumbnailSize } from \"./types\";\nimport Compressor from \"compressorjs\";\n\nexport interface UseMediaManagerControllerProps {\n storageSource: StorageSource;\n dataSourceDelegate: DataSourceDelegate;\n storagePath: string;\n collectionPath: string;\n bucket?: string;\n /** Thumbnail sizes to generate on upload */\n thumbnailSizes?: ThumbnailSize[];\n /** Path prefix for thumbnails. Default: \"thumbs\" */\n thumbnailPath?: string;\n}\n\nconst DEFAULT_THUMBNAIL_PATH = \"thumbs\";\n\n/**\n * Hook that creates a MediaManagerController for managing media assets.\n * Handles all CRUD operations for files and their metadata.\n */\nexport function useMediaManagerController({\n storageSource,\n dataSourceDelegate,\n storagePath,\n collectionPath,\n bucket,\n thumbnailSizes,\n thumbnailPath = DEFAULT_THUMBNAIL_PATH\n}: UseMediaManagerControllerProps): MediaManagerController {\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<Error | undefined>();\n const [assets, setAssets] = useState<MediaAsset[]>([]);\n const [selectedAsset, setSelectedAsset] = useState<MediaAsset | undefined>();\n const [searchQuery, setSearchQuery] = useState(\"\");\n\n // Helper to fetch download URL for an asset\n const fetchDownloadURL = useCallback(async (asset: Omit<MediaAsset, \"downloadURL\">): Promise<MediaAsset> => {\n try {\n const downloadConfig = await storageSource.getDownloadURL(asset.storagePath, asset.bucket);\n return {\n ...asset,\n downloadURL: downloadConfig.url ?? undefined\n };\n } catch (err) {\n console.warn(`Failed to get download URL for ${asset.storagePath}:`, err);\n return { ...asset, downloadURL: undefined };\n }\n }, [storageSource]);\n\n // Fetch assets from the database\n const refreshAssets = useCallback(async () => {\n setLoading(true);\n setError(undefined);\n try {\n console.log(\"Fetching media assets from:\", collectionPath);\n const entities = await dataSourceDelegate.fetchCollection<Record<string, any>>({\n path: collectionPath,\n orderBy: \"createdAt\",\n order: \"desc\"\n });\n\n console.log(\"Fetched entities:\", entities.length);\n\n if (entities.length === 0) {\n setAssets([]);\n return;\n }\n\n // Convert entities to assets and fetch download URLs\n const loadedAssets: MediaAsset[] = await Promise.all(\n entities.map(async (entity) => {\n const values = entity.values;\n const baseAsset: Omit<MediaAsset, \"downloadURL\"> = {\n id: entity.id,\n fileName: values.fileName,\n storagePath: values.storagePath,\n mimeType: values.mimeType,\n size: values.size,\n dimensions: values.dimensions,\n title: values.title,\n altText: values.altText,\n caption: values.caption,\n tags: values.tags,\n bucket: values.bucket,\n createdAt: values.createdAt instanceof Date\n ? values.createdAt\n : (values.createdAt?.toDate ? values.createdAt.toDate() : new Date(values.createdAt)),\n updatedAt: values.updatedAt instanceof Date\n ? values.updatedAt\n : (values.updatedAt?.toDate ? values.updatedAt.toDate() : new Date(values.updatedAt))\n };\n\n // Fetch download URL for images\n if (baseAsset.mimeType?.startsWith(\"image/\") || baseAsset.mimeType?.startsWith(\"video/\")) {\n return await fetchDownloadURL(baseAsset);\n }\n return { ...baseAsset, downloadURL: undefined };\n })\n );\n\n console.log(\"Loaded assets with URLs:\", loadedAssets.length);\n setAssets(loadedAssets);\n } catch (err) {\n console.error(\"Error fetching media assets:\", err);\n setError(err instanceof Error ? err : new Error(String(err)));\n } finally {\n setLoading(false);\n }\n }, [dataSourceDelegate, collectionPath, fetchDownloadURL]);\n\n // Initial load\n useEffect(() => {\n refreshAssets();\n }, [refreshAssets]);\n\n // Upload a new file\n const uploadFile = useCallback(async (\n file: File,\n metadata?: Partial<Pick<MediaAsset, \"title\" | \"altText\" | \"caption\" | \"tags\">>\n ): Promise<MediaAsset> => {\n console.log(\"Uploading file:\", file.name, \"to path:\", storagePath);\n\n // Upload to storage\n const uploadResult = await storageSource.uploadFile({\n file,\n fileName: file.name,\n path: storagePath,\n bucket\n });\n\n console.log(\"Upload result:\", uploadResult);\n\n // Get download URL immediately after upload\n let downloadURL: string | undefined;\n try {\n const downloadConfig = await storageSource.getDownloadURL(uploadResult.path, uploadResult.bucket);\n downloadURL = downloadConfig.url ?? undefined;\n console.log(\"Got download URL:\", downloadURL);\n } catch (err) {\n console.warn(\"Failed to get download URL after upload:\", err);\n }\n\n // Get dimensions for images\n let dimensions: { width: number; height: number } | undefined;\n if (file.type.startsWith(\"image/\")) {\n try {\n dimensions = await getImageDimensions(file);\n } catch (err) {\n console.warn(\"Failed to get image dimensions:\", err);\n }\n }\n\n // Generate thumbnails if configured and file is a raster image (skip SVGs)\n const thumbnails: Record<string, string> = {};\n const isRasterImage = file.type.startsWith(\"image/\") && file.type !== \"image/svg+xml\";\n if (thumbnailSizes && thumbnailSizes.length > 0 && isRasterImage) {\n console.log(\"Generating thumbnails for sizes:\", thumbnailSizes.map(s => s.name));\n\n for (const size of thumbnailSizes) {\n try {\n const thumbnailBlob = await generateThumbnail(file, size.width, size.height, size.quality ?? 0.8);\n const thumbFileName = `${Date.now()}_${size.name}_${file.name}`;\n const thumbPath = `${storagePath}/${thumbnailPath}/${size.name}`;\n\n // Upload thumbnail\n const thumbUploadResult = await storageSource.uploadFile({\n file: new File([thumbnailBlob], thumbFileName, { type: \"image/jpeg\" }),\n fileName: thumbFileName,\n path: thumbPath,\n bucket\n });\n\n // Get download URL for thumbnail\n const thumbDownloadConfig = await storageSource.getDownloadURL(thumbUploadResult.path, thumbUploadResult.bucket);\n if (thumbDownloadConfig.url) {\n thumbnails[size.name] = thumbDownloadConfig.url;\n console.log(`Generated ${size.name} thumbnail:`, thumbDownloadConfig.url);\n }\n } catch (err) {\n console.warn(`Failed to generate ${size.name} thumbnail:`, err);\n }\n }\n }\n\n const now = new Date();\n\n // Build asset data, only including defined values (Firestore doesn't allow undefined)\n const assetData: Record<string, any> = {\n fileName: file.name,\n storagePath: uploadResult.path,\n mimeType: file.type,\n size: file.size,\n createdAt: now,\n updatedAt: now\n };\n\n // Only add optional fields if they are defined\n if (dimensions) assetData.dimensions = dimensions;\n if (metadata?.title) assetData.title = metadata.title;\n if (metadata?.altText) assetData.altText = metadata.altText;\n if (metadata?.caption) assetData.caption = metadata.caption;\n if (metadata?.tags && metadata.tags.length > 0) assetData.tags = metadata.tags;\n if (uploadResult.bucket) assetData.bucket = uploadResult.bucket;\n // Store downloadURL in database for quick access later\n if (downloadURL) assetData.downloadURL = downloadURL;\n // Store thumbnails if any were generated\n if (Object.keys(thumbnails).length > 0) assetData.thumbnails = thumbnails;\n\n console.log(\"Saving asset data to database:\", assetData);\n\n // Save metadata to database\n const entity = await dataSourceDelegate.saveEntity<Record<string, any>>({\n path: collectionPath,\n values: assetData,\n status: \"new\"\n });\n\n console.log(\"Saved entity:\", entity.id);\n\n const newAsset: MediaAsset = {\n id: entity.id,\n fileName: file.name,\n storagePath: uploadResult.path,\n downloadURL,\n mimeType: file.type,\n size: file.size,\n createdAt: now,\n updatedAt: now,\n dimensions,\n title: metadata?.title,\n altText: metadata?.altText,\n caption: metadata?.caption,\n tags: metadata?.tags,\n bucket: uploadResult.bucket,\n thumbnails: Object.keys(thumbnails).length > 0 ? thumbnails : undefined\n };\n\n setAssets(prev => [newAsset, ...prev]);\n return newAsset;\n }, [storageSource, dataSourceDelegate, storagePath, collectionPath, bucket, thumbnailSizes, thumbnailPath]);\n\n // Delete an asset\n const deleteAsset = useCallback(async (assetId: string): Promise<void> => {\n const asset = assets.find(a => a.id === assetId);\n if (!asset) {\n throw new Error(`Asset with id ${assetId} not found`);\n }\n\n console.log(\"Deleting asset:\", assetId, asset.storagePath);\n\n // Delete from storage\n try {\n await storageSource.deleteFile(asset.storagePath, asset.bucket);\n } catch (err) {\n console.warn(\"Failed to delete from storage (may not exist):\", err);\n }\n\n // Delete from database\n await dataSourceDelegate.deleteEntity({\n entity: {\n id: assetId,\n path: collectionPath,\n values: asset\n }\n });\n\n setAssets(prev => prev.filter(a => a.id !== assetId));\n if (selectedAsset?.id === assetId) {\n setSelectedAsset(undefined);\n }\n }, [assets, storageSource, dataSourceDelegate, collectionPath, selectedAsset]);\n\n // Update asset metadata\n const updateAsset = useCallback(async (\n assetId: string,\n data: Partial<MediaAsset>\n ): Promise<void> => {\n const asset = assets.find(a => a.id === assetId);\n if (!asset) {\n throw new Error(`Asset with id ${assetId} not found`);\n }\n\n // Filter out undefined values\n const cleanData: Record<string, any> = {};\n Object.entries(data).forEach(([key, value]) => {\n if (value !== undefined) {\n cleanData[key] = value;\n }\n });\n cleanData.updatedAt = new Date();\n\n console.log(\"Updating asset:\", assetId, cleanData);\n\n await dataSourceDelegate.saveEntity({\n path: collectionPath,\n entityId: assetId,\n values: cleanData,\n previousValues: asset,\n status: \"existing\"\n });\n\n setAssets(prev => prev.map(a =>\n a.id === assetId ? { ...a, ...cleanData } : a\n ));\n\n if (selectedAsset?.id === assetId) {\n setSelectedAsset(prev => prev ? { ...prev, ...cleanData } : prev);\n }\n }, [assets, dataSourceDelegate, collectionPath, selectedAsset]);\n\n // Search assets (client-side filtering for now)\n const searchAssets = useCallback((query: string) => {\n setSearchQuery(query);\n }, []);\n\n const selectAsset = useCallback((asset: MediaAsset | undefined) => {\n setSelectedAsset(asset);\n }, []);\n\n // Filter assets based on search query\n const filteredAssets = searchQuery\n ? assets.filter(asset =>\n asset.fileName.toLowerCase().includes(searchQuery.toLowerCase()) ||\n asset.title?.toLowerCase().includes(searchQuery.toLowerCase()) ||\n asset.tags?.some(tag => tag.toLowerCase().includes(searchQuery.toLowerCase()))\n )\n : assets;\n\n return {\n loading,\n error,\n assets: filteredAssets,\n totalCount: assets.length,\n selectedAsset,\n selectAsset,\n uploadFile,\n deleteAsset,\n updateAsset,\n refreshAssets,\n searchAssets,\n storagePath,\n collectionPath\n };\n}\n\n/**\n * Helper to get image dimensions from a File\n */\nfunction getImageDimensions(file: File): Promise<{ width: number; height: number }> {\n return new Promise((resolve, reject) => {\n const img = new Image();\n img.onload = () => {\n resolve({ width: img.width, height: img.height });\n URL.revokeObjectURL(img.src);\n };\n img.onerror = reject;\n img.src = URL.createObjectURL(file);\n });\n}\n\n/**\n * Generate a thumbnail from an image file using compressorjs.\n * Uses the same library as the core FireCMS image resize implementation.\n * Maintains aspect ratio while fitting within maxWidth x maxHeight.\n */\nasync function generateThumbnail(\n file: File,\n maxWidth: number,\n maxHeight: number,\n quality: number\n): Promise<Blob> {\n return new Promise<Blob>((resolve, reject) => {\n new Compressor(file, {\n quality,\n maxWidth,\n maxHeight,\n mimeType: \"image/jpeg\",\n success: (result) => {\n resolve(result);\n },\n error: reject,\n });\n });\n}\n","import React from \"react\";\nimport {\n Card,\n Typography,\n cls,\n ImageIcon,\n DescriptionIcon,\n VideoLibraryIcon,\n AudiotrackIcon,\n CheckIcon,\n defaultBorderMixin\n} from \"@firecms/ui\";\nimport { MediaAsset } from \"../types\";\n\nexport interface MediaAssetCardProps {\n asset: MediaAsset;\n viewMode: \"grid\" | \"list\";\n onClick: () => void;\n selected?: boolean;\n /** Preferred thumbnail size to display (e.g., \"small\", \"medium\") */\n thumbnailSize?: string;\n}\n\n/**\n * Card component for displaying a media asset in the grid or list.\n */\nexport function MediaAssetCard({\n asset,\n viewMode,\n onClick,\n selected,\n thumbnailSize = \"small\"\n}: MediaAssetCardProps) {\n const isImage = asset.mimeType.startsWith(\"image/\");\n const isVideo = asset.mimeType.startsWith(\"video/\");\n const isAudio = asset.mimeType.startsWith(\"audio/\");\n\n const FileIcon = isImage ? ImageIcon\n : isVideo ? VideoLibraryIcon\n : isAudio ? AudiotrackIcon\n : DescriptionIcon;\n\n const formatSize = (bytes: number): string => {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n };\n\n // Use thumbnail if available, fallback to downloadURL\n const imageUrl = asset.thumbnails?.[thumbnailSize] ?? asset.downloadURL;\n\n const thumbnail = isImage && imageUrl ? (\n <img\n src={imageUrl}\n alt={asset.altText || asset.fileName}\n className=\"w-full h-full object-cover transition-transform duration-200 group-hover:scale-105\"\n loading=\"lazy\"\n />\n ) : (\n <div className=\"w-full h-full flex items-center justify-center bg-surface-100 dark:bg-surface-800\">\n <FileIcon size=\"large\" className=\"text-surface-400 dark:text-surface-500\" />\n </div>\n );\n\n if (viewMode === \"list\") {\n return (\n <div\n className={cls(\n \"p-3 cursor-pointer flex items-center gap-3 rounded-lg\",\n \"hover:bg-surface-100 dark:hover:bg-surface-800\",\n \"transition-colors duration-150\",\n `border ${defaultBorderMixin}`,\n selected && \"ring-2 ring-primary bg-primary/5\"\n )}\n onClick={onClick}\n >\n <div className=\"w-12 h-12 rounded-md overflow-hidden flex-shrink-0 bg-surface-100 dark:bg-surface-800\">\n {thumbnail}\n </div>\n <div className=\"flex-1 min-w-0\">\n <Typography variant=\"body2\" className=\"font-medium truncate text-surface-900 dark:text-white\">\n {asset.title || asset.fileName}\n </Typography>\n <Typography variant=\"caption\" color=\"secondary\">\n {formatSize(asset.size)} • {asset.mimeType.split(\"/\")[1]?.toUpperCase()}\n </Typography>\n </div>\n {selected && (\n <div className=\"w-6 h-6 rounded-full bg-primary flex items-center justify-center flex-shrink-0\">\n <CheckIcon size=\"smallest\" className=\"text-white\" />\n </div>\n )}\n </div>\n );\n }\n\n return (\n <Card\n className={cls(\n \"cursor-pointer overflow-hidden group relative\",\n \"transition-all duration-200\",\n \"hover:shadow-lg hover:-translate-y-0.5\",\n selected && \"ring-2 ring-primary\"\n )}\n onClick={onClick}\n >\n <div className=\"aspect-square relative overflow-hidden bg-surface-100 dark:bg-surface-800\">\n {thumbnail}\n\n {/* Hover overlay */}\n <div className={cls(\n \"absolute inset-0 bg-black/0 group-hover:bg-black/20\",\n \"transition-colors duration-200\"\n )} />\n\n {/* Selection indicator */}\n {selected && (\n <div className=\"absolute top-2 right-2 w-6 h-6 rounded-full bg-primary flex items-center justify-center shadow-md\">\n <CheckIcon size=\"smallest\" className=\"text-white\" />\n </div>\n )}\n </div>\n\n <div className=\"p-3\">\n <Typography variant=\"body2\" className=\"font-medium truncate text-surface-900 dark:text-white\">\n {asset.title || asset.fileName}\n </Typography>\n <Typography variant=\"caption\" color=\"secondary\" className=\"truncate block mt-0.5\">\n {formatSize(asset.size)} • {asset.mimeType.split(\"/\")[1]?.toUpperCase()}\n </Typography>\n </div>\n </Card>\n );\n}\n","import React, { useCallback, useState } from \"react\";\nimport { useCreateFormex } from \"@firecms/formex\";\nimport {\n Button,\n Typography,\n cls,\n CloseIcon,\n DeleteIcon,\n DownloadIcon,\n IconButton,\n TextField,\n Chip,\n CircularProgress,\n Dialog,\n DialogActions,\n DialogContent\n} from \"@firecms/ui\";\nimport { useSnackbarController, useStorageSource } from \"@firecms/core\";\nimport { MediaAsset } from \"../types\";\n\nexport interface MediaAssetDetailsProps {\n asset: MediaAsset;\n onClose: () => void;\n onUpdate: (assetId: string, data: Partial<MediaAsset>) => Promise<void>;\n onDelete: (assetId: string) => Promise<void>;\n}\n\n/**\n * Side panel component for viewing and editing media asset details.\n */\nexport function MediaAssetDetails({\n asset,\n onClose,\n onUpdate,\n onDelete\n}: MediaAssetDetailsProps) {\n const snackbarController = useSnackbarController();\n const storageSource = useStorageSource();\n const [saving, setSaving] = useState(false);\n const [deleting, setDeleting] = useState(false);\n const [deleteDialogOpen, setDeleteDialogOpen] = useState(false);\n const [tagInput, setTagInput] = useState(\"\");\n\n const { values, setFieldValue, dirty } = useCreateFormex<Partial<MediaAsset>>({\n initialValues: {\n title: asset.title ?? \"\",\n altText: asset.altText ?? \"\",\n caption: asset.caption ?? \"\",\n tags: asset.tags ?? []\n }\n });\n\n const handleSave = useCallback(async () => {\n setSaving(true);\n try {\n await onUpdate(asset.id, values);\n snackbarController.open({\n type: \"success\",\n message: \"Asset updated successfully\"\n });\n } catch (error) {\n snackbarController.open({\n type: \"error\",\n message: `Error updating asset: ${error instanceof Error ? error.message : String(error)}`\n });\n } finally {\n setSaving(false);\n }\n }, [asset.id, values, onUpdate, snackbarController]);\n\n const handleDelete = useCallback(async () => {\n setDeleting(true);\n try {\n await onDelete(asset.id);\n snackbarController.open({\n type: \"success\",\n message: \"Asset deleted successfully\"\n });\n onClose();\n } catch (error) {\n snackbarController.open({\n type: \"error\",\n message: `Error deleting asset: ${error instanceof Error ? error.message : String(error)}`\n });\n } finally {\n setDeleting(false);\n setDeleteDialogOpen(false);\n }\n }, [asset.id, onDelete, snackbarController, onClose]);\n\n const handleDownload = useCallback(async () => {\n try {\n const downloadConfig = await storageSource.getDownloadURL(asset.storagePath, asset.bucket);\n if (downloadConfig.url) {\n window.open(downloadConfig.url, \"_blank\");\n }\n } catch (error) {\n snackbarController.open({\n type: \"error\",\n message: \"Error getting download URL\"\n });\n }\n }, [asset, storageSource, snackbarController]);\n\n const handleAddTag = useCallback(() => {\n const tag = tagInput.trim();\n if (tag && !values.tags?.includes(tag)) {\n setFieldValue(\"tags\", [...(values.tags ?? []), tag]);\n setTagInput(\"\");\n }\n }, [tagInput, values.tags, setFieldValue]);\n\n const handleRemoveTag = useCallback((tagToRemove: string) => {\n setFieldValue(\"tags\", values.tags?.filter((t: string) => t !== tagToRemove) ?? []);\n }, [values.tags, setFieldValue]);\n\n const formatSize = (bytes: number): string => {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n };\n\n const formatDate = (date: Date): string => {\n return new Intl.DateTimeFormat(undefined, {\n year: \"numeric\",\n month: \"short\",\n day: \"numeric\"\n }).format(date);\n };\n\n const isImage = asset.mimeType.startsWith(\"image/\");\n const isVideo = asset.mimeType.startsWith(\"video/\");\n\n return (\n <>\n <div className={cls(\n \"fixed inset-y-0 right-0 w-full sm:w-96 lg:w-[480px]\",\n \"bg-surface-50 dark:bg-surface-900\",\n \"border-l border-surface-accent-200 dark:border-surface-accent-700\",\n \"shadow-xl z-50\",\n \"flex flex-col\",\n \"animate-slide-in-right\"\n )}>\n {/* Header */}\n <div className=\"flex items-center justify-between p-4 border-b border-surface-accent-200 dark:border-surface-accent-700\">\n <Typography variant=\"subtitle1\" className=\"font-medium truncate flex-1 mr-2\">\n {asset.title || asset.fileName}\n </Typography>\n <div className=\"flex items-center gap-1\">\n <IconButton onClick={handleDownload}>\n <DownloadIcon size=\"small\" />\n </IconButton>\n <IconButton\n onClick={() => setDeleteDialogOpen(true)}\n className=\"text-red-500 hover:bg-red-50 dark:hover:bg-red-900/20\"\n >\n <DeleteIcon size=\"small\" />\n </IconButton>\n <IconButton onClick={onClose}>\n <CloseIcon size=\"small\" />\n </IconButton>\n </div>\n </div>\n\n {/* Preview */}\n <div className=\"p-4 bg-surface-accent-100 dark:bg-surface-accent-800 flex items-center justify-center min-h-48 max-h-64\">\n {isImage && asset.downloadURL ? (\n <img\n src={asset.downloadURL}\n alt={asset.altText || asset.fileName}\n className=\"max-w-full max-h-full object-contain\"\n />\n ) : isVideo && asset.downloadURL ? (\n <video\n src={asset.downloadURL}\n className=\"max-w-full max-h-full\"\n controls\n />\n ) : (\n <div className=\"text-surface-accent-400\">\n Preview not available\n </div>\n )}\n </div>\n\n {/* Content */}\n <div className=\"flex-1 overflow-auto p-4 space-y-4\">\n {/* Metadata */}\n <div className=\"grid grid-cols-2 gap-3\">\n {asset.dimensions && (\n <div>\n <Typography variant=\"caption\" className=\"text-surface-accent-500\">\n Dimensions\n </Typography>\n <Typography variant=\"body2\">\n {asset.dimensions.width} × {asset.dimensions.height} px\n </Typography>\n </div>\n )}\n <div>\n <Typography variant=\"caption\" className=\"text-surface-accent-500\">\n Size\n </Typography>\n <Typography variant=\"body2\">\n {formatSize(asset.size)}\n </Typography>\n </div>\n <div>\n <Typography variant=\"caption\" className=\"text-surface-accent-500\">\n Type\n </Typography>\n <Typography variant=\"body2\">\n {asset.mimeType}\n </Typography>\n </div>\n <div>\n <Typography variant=\"caption\" className=\"text-surface-accent-500\">\n Created\n </Typography>\n <Typography variant=\"body2\">\n {formatDate(asset.createdAt)}\n </Typography>\n </div>\n </div>\n\n <hr className=\"border-surface-accent-200 dark:border-surface-accent-700\" />\n\n {/* Editable Fields */}\n <TextField\n label=\"File Name\"\n value={asset.fileName}\n disabled\n size=\"small\"\n />\n\n <TextField\n label=\"Title\"\n value={values.title ?? \"\"}\n onChange={(e) => setFieldValue(\"title\", e.target.value)}\n size=\"small\"\n />\n\n <div>\n <TextField\n label=\"Alt Text\"\n value={values.altText ?? \"\"}\n onChange={(e) => setFieldValue(\"altText\", e.target.value)}\n size=\"small\"\n />\n <Typography variant=\"caption\" className=\"text-surface-accent-500 mt-1\">\n Recommended for SEO\n </Typography>\n </div>\n\n <TextField\n label=\"Caption\"\n value={values.caption ?? \"\"}\n onChange={(e) => setFieldValue(\"caption\", e.target.value)}\n size=\"small\"\n multiline\n />\n\n {/* Tags */}\n <div>\n <Typography variant=\"caption\" className=\"text-surface-accent-500 mb-1 block\">\n Tags\n </Typography>\n <div className=\"flex flex-wrap gap-1 mb-2\">\n {values.tags?.map((tag: string) => (\n <Chip\n key={tag}\n size=\"small\"\n colorScheme=\"blueLighter\"\n onClick={() => handleRemoveTag(tag)}\n >\n {tag} ×\n </Chip>\n ))}\n </div>\n <div className=\"flex gap-2\">\n <TextField\n placeholder=\"Add a tag...\"\n value={tagInput}\n onChange={(e) => setTagInput(e.target.value)}\n size=\"small\"\n className=\"flex-1\"\n onKeyDown={(e) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n handleAddTag();\n }\n }}\n />\n <Button\n variant=\"text\"\n size=\"small\"\n onClick={handleAddTag}\n disabled={!tagInput.trim()}\n >\n Add\n </Button>\n </div>\n </div>\n </div>\n\n {/* Footer */}\n <div className=\"flex-shrink-0 p-4 border-t border-surface-accent-200 dark:border-surface-accent-700\">\n <Button\n variant=\"filled\"\n onClick={handleSave}\n disabled={!dirty || saving}\n className=\"w-full\"\n >\n {saving ? <CircularProgress size=\"small\" /> : \"Save Changes\"}\n </Button>\n </div>\n </div>\n\n {/* Delete Confirmation Dialog */}\n <Dialog\n open={deleteDialogOpen}\n onOpenChange={setDeleteDialogOpen}\n >\n <DialogContent>\n <Typography variant=\"subtitle1\" className=\"font-medium mb-2\">\n Delete Asset?\n </Typography>\n <Typography className=\"text-surface-accent-600 dark:text-surface-accent-400\">\n Are you sure you want to delete \"{asset.title || asset.fileName}\"?\n This action cannot be undone.\n </Typography>\n </DialogContent>\n <DialogActions>\n <Button\n variant=\"text\"\n onClick={() => setDeleteDialogOpen(false)}\n disabled={deleting}\n >\n Cancel\n </Button>\n <Button\n variant=\"filled\"\n color=\"error\"\n onClick={handleDelete}\n disabled={deleting}\n >\n {deleting ? <CircularProgress size=\"small\" /> : \"Delete\"}\n </Button>\n </DialogActions>\n </Dialog>\n </>\n );\n}\n","import React, { useCallback, useState } from \"react\";\nimport {\n Button,\n Typography,\n cls,\n Dialog,\n DialogActions,\n DialogContent,\n CloudUploadIcon,\n CircularProgress\n} from \"@firecms/ui\";\n\nexport interface MediaUploadDialogProps {\n open: boolean;\n onClose: () => void;\n onUpload: (files: File[]) => Promise<void>;\n maxFileSize?: number;\n acceptedMimeTypes?: string[];\n}\n\n/**\n * Dialog component for uploading files to the media library.\n * Supports drag-and-drop and file browser selection.\n */\nexport function MediaUploadDialog({\n open,\n onClose,\n onUpload,\n maxFileSize = 52428800, // 50MB default\n acceptedMimeTypes\n}: MediaUploadDialogProps) {\n const [isDragging, setIsDragging] = useState(false);\n const [uploading, setUploading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [selectedFiles, setSelectedFiles] = useState<File[]>([]);\n\n const validateFiles = useCallback((files: File[]): { valid: File[]; errors: string[] } => {\n const valid: File[] = [];\n const errors: string[] = [];\n\n for (const file of files) {\n if (maxFileSize && file.size > maxFileSize) {\n errors.push(`${file.name}: File too large (max ${formatSize(maxFileSize)})`);\n continue;\n }\n if (acceptedMimeTypes && !acceptedMimeTypes.some(type => {\n if (type.endsWith(\"/*\")) {\n return file.type.startsWith(type.slice(0, -1));\n }\n return file.type === type;\n })) {\n errors.push(`${file.name}: File type not allowed`);\n continue;\n }\n valid.push(file);\n }\n\n return { valid, errors };\n }, [maxFileSize, acceptedMimeTypes]);\n\n const handleDragOver = useCallback((e: React.DragEvent) => {\n e.preventDefault();\n setIsDragging(true);\n }, []);\n\n const handleDragLeave = useCallback((e: React.DragEvent) => {\n e.preventDefault();\n setIsDragging(false);\n }, []);\n\n const handleDrop = useCallback((e: React.DragEvent) => {\n e.preventDefault();\n setIsDragging(false);\n\n const files = Array.from(e.dataTransfer.files);\n const { valid, errors } = validateFiles(files);\n\n if (errors.length > 0) {\n setError(errors.join(\"\\n\"));\n } else {\n setError(null);\n }\n\n setSelectedFiles(prev => [...prev, ...valid]);\n }, [validateFiles]);\n\n const handleFileSelect = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\n const files = Array.from(e.target.files ?? []);\n const { valid, errors } = validateFiles(files);\n\n if (errors.length > 0) {\n setError(errors.join(\"\\n\"));\n } else {\n setError(null);\n }\n\n setSelectedFiles(prev => [...prev, ...valid]);\n }, [validateFiles]);\n\n const handleRemoveFile = useCallback((index: number) => {\n setSelectedFiles(prev => prev.filter((_, i) => i !== index));\n }, []);\n\n const handleUpload = useCallback(async () => {\n if (selectedFiles.length === 0) return;\n\n setUploading(true);\n setError(null);\n\n try {\n await onUpload(selectedFiles);\n setSelectedFiles([]);\n onClose();\n } catch (err) {\n setError(err instanceof Error ? err.message : \"Upload failed\");\n } finally {\n setUploading(false);\n }\n }, [selectedFiles, onUpload, onClose]);\n\n const handleClose = useCallback(() => {\n if (!uploading) {\n setSelectedFiles([]);\n setError(null);\n onClose();\n }\n }, [uploading, onClose]);\n\n const formatSize = (bytes: number): string => {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n };\n\n return (\n <Dialog\n open={open}\n onOpenChange={(open) => !open && handleClose()}\n maxWidth=\"md\"\n >\n <DialogContent className=\"p-0\">\n <div className=\"p-4 border-b border-surface-accent-200 dark:border-surface-accent-700\">\n <Typography variant=\"h6\">\n Upload Files\n </Typography>\n </div>\n\n <div className=\"p-4\">\n {/* Drop Zone */}\n <div\n className={cls(\n \"border-2 border-dashed rounded-lg p-8\",\n \"flex flex-col items-center justify-center gap-4\",\n \"transition-colors duration-150\",\n isDragging\n ? \"border-primary bg-primary/5\"\n : \"border-surface-accent-300 dark:border-surface-accent-600\",\n \"hover:border-primary hover:bg-primary/5\",\n \"cursor-pointer\"\n )}\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n onDrop={handleDrop}\n onClick={() => document.getElementById(\"file-upload-input\")?.click()}\n >\n <CloudUploadIcon\n size=\"large\"\n className={cls(\n isDragging ? \"text-primary\" : \"text-surface-accent-400\"\n )}\n />\n <div className=\"text-center\">\n <Typography variant=\"body1\" className=\"font-medium\">\n Drop files here or click to browse\n </Typography>\n <Typography variant=\"caption\" className=\"text-surface-accent-500\">\n Maximum file size: {formatSize(maxFileSize)}\n </Typography>\n </div>\n <input\n id=\"file-upload-input\"\n type=\"file\"\n multiple\n accept={acceptedMimeTypes?.join(\",\")}\n onChange={handleFileSelect}\n className=\"hidden\"\n />\n </div>\n\n {/* Error Display */}\n {error && (\n <Typography variant=\"caption\" className=\"text-red-500 mt-2 block whitespace-pre-line\">\n {error}\n </Typography>\n )}\n\n {/* Selected Files */}\n {selectedFiles.length > 0 && (\n <div className=\"mt-4 space-y-2\">\n <Typography variant=\"caption\" className=\"text-surface-accent-500\">\n Selected files ({selectedFiles.length})\n </Typography>\n <div className=\"max-h-40 overflow-auto space-y-1\">\n {selectedFiles.map((file, index) => (\n <div\n key={`${file.name}-${index}`}\n className={cls(\n \"flex items-center justify-between p-2 rounded\",\n \"bg-surface-accent-50 dark:bg-surface-accent-800\"\n )}\n >\n <div className=\"flex-1 min-w-0 mr-2\">\n <Typography variant=\"body2\" className=\"truncate\">\n {file.name}\n </Typography>\n <Typography variant=\"caption\" className=\"text-surface-accent-500\">\n {formatSize(file.size)}\n </Typography>\n </div>\n <Button\n variant=\"text\"\n size=\"small\"\n onClick={(e) => {\n e.stopPropagation();\n handleRemoveFile(index);\n }}\n disabled={uploading}\n >\n Remove\n </Button>\n </div>\n ))}\n </div>\n </div>\n )}\n </div>\n </DialogContent>\n\n <DialogActions>\n <Button\n variant=\"text\"\n onClick={handleClose}\n disabled={uploading}\n >\n Cancel\n </Button>\n <Button\n variant=\"filled\"\n onClick={handleUpload}\n disabled={selectedFiles.length === 0 || uploading}\n >\n {uploading ? (\n <>\n <CircularProgress size=\"smallest\" />\n Uploading...\n </>\n ) : (\n `Upload ${selectedFiles.length > 0 ? `(${selectedFiles.length})` : \"\"}`\n )}\n </Button>\n </DialogActions>\n </Dialog>\n );\n}\n","import React, { useCallback, useRef, useState } from \"react\";\nimport {\n Button,\n Container,\n SearchBar,\n Typography,\n cls,\n AddIcon,\n CircularProgress,\n RefreshIcon,\n IconButton,\n Tooltip,\n AppsIcon,\n Icon\n} from \"@firecms/ui\";\nimport { useMediaManager } from \"../MediaManagerProvider\";\nimport { MediaAssetCard } from \"./MediaAssetCard\";\nimport { MediaAssetDetails } from \"./MediaAssetDetails\";\nimport { MediaUploadDialog } from \"./MediaUploadDialog\";\n\nexport interface MediaLibraryViewProps {\n maxFileSize?: number;\n acceptedMimeTypes?: string[];\n}\n\n/**\n * Main view component for the Media Library.\n * Displays a grid of assets with search, upload, and management capabilities.\n */\nexport function MediaLibraryView({\n maxFileSize,\n acceptedMimeTypes\n }: MediaLibraryViewProps) {\n const controller = useMediaManager();\n const [uploadDialogOpen, setUploadDialogOpen] = useState(false);\n const [viewMode, setViewMode] = useState<\"grid\" | \"list\">(\"grid\");\n const fileInputRef = useRef<HTMLInputElement>(null);\n\n const handleSearch = useCallback((query?: string) => {\n controller.searchAssets(query ?? \"\");\n }, [controller]);\n\n const handleUploadClick = useCallback(() => {\n setUploadDialogOpen(true);\n }, []);\n\n const handleFileSelect = useCallback(async (files: File[]) => {\n for (const file of files) {\n await controller.uploadFile(file);\n }\n setUploadDialogOpen(false);\n }, [controller]);\n\n const handleRefresh = useCallback(() => {\n controller.refreshAssets();\n }, [controller]);\n\n return (\n <div className=\"h-full flex flex-col overflow-hidden\">\n {/* Header */}\n <div\n className=\"flex-shrink-0 border-b border-surface-accent-200 dark:border-surface-accent-700 bg-surface-50 dark:bg-surface-900\">\n <Container maxWidth=\"6xl\" className=\"py-4\">\n <div className=\"flex flex-col sm:flex-row gap-4 items-start sm:items-center justify-between\">\n <div className=\"flex items-center gap-3\">\n <Typography variant=\"h5\" className=\"font-semibold\">\n Media Library\n </Typography>\n {controller.totalCount !== undefined && (\n <Typography\n variant=\"caption\"\n className=\"bg-surface-accent-100 dark:bg-surface-accent-800 px-2 py-0.5 rounded-full\"\n >\n {controller.totalCount} assets\n </Typography>\n )}\n </div>\n\n <div className=\"flex items-center gap-2 w-full sm:w-auto\">\n <SearchBar\n onTextSearch={handleSearch}\n placeholder=\"Search assets...\"\n className=\"flex-1 sm:w-64\"\n />\n\n <div\n className=\"flex items-center gap-1 border-l border-surface-accent-200 dark:border-surface-accent-700 pl-2 ml-2\">\n <Tooltip title=\"Grid view\">\n <IconButton\n onClick={() => setViewMode(\"grid\")}\n className={cls(\n viewMode === \"grid\" && \"bg-surface-accent-100 dark:bg-surface-accent-800\"\n )}\n >\n <AppsIcon size=\"small\"/>\n </IconButton>\n </Tooltip>\n <Tooltip title=\"List view\">\n <IconButton\n onClick={() => setViewMode(\"list\")}\n className={cls(\n viewMode === \"list\" && \"bg-surface-accent-100 dark:bg-surface-accent-800\"\n )}\n >\n <Icon iconKey=\"list\" size=\"small\"/>\n </IconButton>\n </Tooltip>\n </div>\n\n <Tooltip title=\"Refresh\">\n <IconButton onClick={handleRefresh} disabled={controller.loading}>\n <RefreshIcon size=\"small\"/>\n </IconButton>\n </Tooltip>\n\n <Button\n variant=\"filled\"\n onClick={handleUploadClick}\n >\n <AddIcon size=\"small\"/>\n Upload\n </Button>\n </div>\n </div>\n </Container>\n </div>\n\n {/* Content */}\n <div className=\"flex-1 overflow-auto\">\n <Container maxWidth=\"6xl\" className=\"py-6\">\n {controller.loading && controller.assets.length === 0 ? (\n <div className=\"flex items-center justify-center h-64\">\n <CircularProgress/>\n </div>\n ) : controller.error ? (\n <div className=\"flex flex-col items-center justify-center h-64 gap-4\">\n <Typography className=\"text-red-500\">\n Error loading assets: {controller.error.message}\n </Typography>\n <Button onClick={handleRefresh}>\n Try Again\n </Button>\n </div>\n ) : controller.assets.length === 0 ? (\n <div className=\"flex flex-col items-center justify-center h-64 gap-4\">\n <Typography className=\"text-surface-accent-500\">\n No media assets yet\n </Typography>\n <Button onClick={handleUploadClick}>\n <AddIcon size=\"small\"/>\n Upload your first file\n </Button>\n </div>\n ) : (\n <div className={cls(\n viewMode === \"grid\"\n ? \"grid grid-cols-2 sm:grid-cols-3 md:grid-cols-4 lg:grid-cols-5 gap-4\"\n : \"flex flex-col gap-2\"\n )}>\n {controller.assets.map(asset => (\n <MediaAssetCard\n key={asset.id}\n asset={asset}\n viewMode={viewMode}\n onClick={() => controller.selectAsset(asset)}\n selected={controller.selectedAsset?.id === asset.id}\n />\n ))}\n </div>\n )}\n </Container>\n </div>\n\n {/* Details Panel */}\n {controller.selectedAsset && (\n <MediaAssetDetails\n asset={controller.selectedAsset}\n onClose={() => controller.selectAsset(undefined)}\n onUpdate={controller.updateAsset}\n onDelete={controller.deleteAsset}\n />\n )}\n\n {/* Upload Dialog */}\n <MediaUploadDialog\n open={uploadDialogOpen}\n onClose={() => setUploadDialogOpen(false)}\n onUpload={handleFileSelect}\n maxFileSize={maxFileSize}\n acceptedMimeTypes={acceptedMimeTypes}\n />\n </div>\n );\n}\n","import React, { useMemo, createContext, useContext, PropsWithChildren } from \"react\";\nimport { FireCMSPlugin, CMSView } from \"@firecms/core\";\nimport { MediaManagerConfig } from \"./types\";\nimport { MediaManagerProvider } from \"./MediaManagerProvider\";\nimport { useMediaManagerController } from \"./useMediaManagerController\";\nimport { MediaLibraryCard } from \"./components/MediaLibraryCard\";\nimport { MediaLibraryView } from \"./components/MediaLibraryView\";\n\nconst DEFAULT_STORAGE_PATH = \"media\";\nconst DEFAULT_COLLECTION_PATH = \"media_assets\";\n\nexport interface MediaManagerPluginProps extends MediaManagerConfig { }\n\n// Context to store the config\nconst MediaManagerConfigContext = createContext<MediaManagerConfig | null>(null);\n\nfunction useMediaManagerConfig(): MediaManagerConfig {\n const config = useContext(MediaManagerConfigContext);\n if (!config) {\n throw new Error(\"useMediaManagerConfig must be used within MediaManagerConfigProvider\");\n }\n return config;\n}\n\n/**\n * Internal wrapper that reads config from context\n */\nfunction MediaLibraryViewInternal() {\n const config = useMediaManagerConfig();\n const controller = useMediaManagerController({\n storageSource: config.storageSource,\n dataSourceDelegate: config.dataSourceDelegate,\n storagePath: config.storagePath ?? DEFAULT_STORAGE_PATH,\n collectionPath: config.collectionPath ?? DEFAULT_COLLECTION_PATH,\n bucket: config.bucket,\n thumbnailSizes: config.thumbnailSizes,\n thumbnailPath: config.thumbnailPath\n });\n\n return (\n <MediaManagerProvider controller={controller}>\n <MediaLibraryView\n maxFileSize={config.maxFileSize}\n acceptedMimeTypes={config.acceptedMimeTypes}\n />\n </MediaManagerProvider>\n );\n}\n\n/**\n * Build the media view - this is a static object that doesn't change\n */\nfunction buildMediaView(): CMSView {\n return {\n path: \"media\",\n name: \"Media Library\",\n description: \"Manage your media files and assets\",\n group: \"Media\",\n icon: \"perm_media\",\n view: <MediaLibraryViewInternal />\n };\n}\n\n// Single static instance of the view\nconst MEDIA_VIEW = buildMediaView();\n\n/**\n * Hook to create the Media Manager plugin for FireCMS.\n *\n * The plugin automatically registers the Media Library view in the navigation.\n *\n * @example\n * ```tsx\n * const { plugin: mediaManagerPlugin } = useMediaManagerPlugin({\n * storageSource,\n * dataSourceDelegate: firestoreDelegate,\n * storagePath: \"media\",\n * collectionPath: \"media_assets\"\n * });\n *\n * // Add plugin to your plugins array - view is auto-registered\n * const plugins = [mediaManagerPlugin, ...otherPlugins];\n * ```\n */\nexport function useMediaManagerPlugin(props: MediaManagerPluginProps): FireCMSPlugin {\n return useMemo(() => ({\n key: \"media_manager\",\n views: [MEDIA_VIEW],\n provider: {\n Component: ({ children }: PropsWithChildren) => (\n <MediaManagerConfigContext.Provider value={props}>\n {children}\n </MediaManagerConfigContext.Provider>\n )\n }\n } satisfies FireCMSPlugin), []);\n}\n","import React from \"react\";\nimport { Link } from \"react-router-dom\";\nimport {\n Card,\n Typography,\n cls,\n ImageIcon\n} from \"@firecms/ui\";\n\nexport interface MediaLibraryCardProps {\n group?: string;\n context?: unknown;\n}\n\n/**\n * Card component displayed on the home page that links to the Media Library.\n */\nexport function MediaLibraryCard({ group }: MediaLibraryCardProps) {\n // Only render in the \"Media\" group\n if (group !== \"Media\") return null;\n\n return (\n <Link to=\"/media\" className=\"no-underline\">\n <Card\n className={cls(\n \"p-4 cursor-pointer\",\n \"hover:bg-surface-accent-100 dark:hover:bg-surface-accent-800\",\n \"transition-colors duration-200\",\n \"flex flex-col gap-2\"\n )}\n >\n <div className=\"flex items-center gap-3\">\n <div className={cls(\n \"w-10 h-10 rounded-lg\",\n \"bg-primary/10 dark:bg-primary/20\",\n \"flex items-center justify-center\"\n )}>\n <ImageIcon className=\"text-primary\" size=\"medium\" />\n </div>\n <div className=\"flex-1\">\n <Typography variant=\"subtitle2\" className=\"font-medium\">\n Media Library\n </Typography>\n <Typography\n variant=\"caption\"\n className=\"text-surface-accent-600 dark:text-surface-accent-400\"\n >\n Manage images and files\n </Typography>\n </div>\n </div>\n </Card>\n </Link>\n );\n}\n"],"names":["MediaManagerContext","createContext","undefined","useMediaManager","context","useContext","Error","MediaManagerProvider","t0","$","_c","controller","children","t1","DEFAULT_THUMBNAIL_PATH","useMediaManagerController","storageSource","dataSourceDelegate","storagePath","collectionPath","bucket","thumbnailSizes","thumbnailPath","loading","setLoading","useState","error","setError","assets","setAssets","selectedAsset","setSelectedAsset","searchQuery","setSearchQuery","fetchDownloadURL","useCallback","asset","downloadConfig","getDownloadURL","downloadURL","url","err","console","warn","refreshAssets","log","entities","fetchCollection","path","orderBy","order","length","loadedAssets","Promise","all","map","entity","values","baseAsset","id","fileName","mimeType","size","dimensions","title","altText","caption","tags","createdAt","Date","toDate","updatedAt","startsWith","String","useEffect","uploadFile","file","metadata","name","uploadResult","type","getImageDimensions","thumbnails","isRasterImage","s","thumbnailBlob","generateThumbnail","width","height","quality","thumbFileName","now","thumbPath","thumbUploadResult","File","thumbDownloadConfig","assetData","Object","keys","saveEntity","status","newAsset","prev","deleteAsset","assetId","find","a","deleteFile","deleteEntity","filter","updateAsset","data","cleanData","entries","forEach","key","value","entityId","previousValues","searchAssets","query","selectAsset","filteredAssets","toLowerCase","includes","some","tag","totalCount","resolve","reject","img","Image","onload","URL","revokeObjectURL","src","onerror","createObjectURL","maxWidth","maxHeight","Compressor","success","result","MediaAssetCard","viewMode","onClick","selected","thumbnailSize","t2","isImage","isVideo","isAudio","FileIcon","ImageIcon","VideoLibraryIcon","AudiotrackIcon","DescriptionIcon","formatSize","_temp","imageUrl","t3","thumbnail","t4","t5","cls","defaultBorderMixin","t6","t7","t8","t9","t10","split","toUpperCase","t11","t12","t13","t14","Symbol","for","t15","bytes","toFixed","MediaAssetDetails","onClose","onUpdate","onDelete","snackbarController","useSnackbarController","useStorageSource","saving","setSaving","deleting","setDeleting","deleteDialogOpen","setDeleteDialogOpen","tagInput","setTagInput","setFieldValue","dirty","useCreateFormex","initialValues","handleSave","open","message","handleDelete","handleDownload","window","handleAddTag","trim","handleRemoveTag","tagToRemove","t","formatDate","date","Intl","DateTimeFormat","year","month","day","format","e","target","preventDefault","MediaUploadDialog","onUpload","maxFileSize","acceptedMimeTypes","isDragging","setIsDragging","uploading","setUploading","selectedFiles","setSelectedFiles","validateFiles","files","valid","errors","push","endsWith","slice","handleDragOver","handleDragLeave","handleDrop","Array","from","dataTransfer","join","handleFileSelect","handleRemoveFile","index","_","i","handleUpload","handleClose","document","getElementById","click","stopPropagation","MediaLibraryView","uploadDialogOpen","setUploadDialogOpen","setViewMode","useRef","handleSearch","handleUploadClick","handleRefresh","t16","t17","t18","t19","t20","t21","t22","t23","t24","t25","t26","t27","t28","t29","DEFAULT_STORAGE_PATH","DEFAULT_COLLECTION_PATH","MediaManagerConfigContext","useMediaManagerConfig","config","MediaLibraryViewInternal","buildMediaView","description","group","icon","view","MEDIA_VIEW","useMediaManagerPlugin","props","useMemo","views","provider","Component","MediaLibraryCard"],"mappings":";;;;;;;;AAGA,MAAMA,sBAAsBC,cAAkDC,MAAS;AAMhF,SAAAC,kBAAA;AACH,QAAAC,UAAgBC,WAAAL,mBAA8B;AAAE,MAAA,CAC3CI,SAAO;AAAA,UAAA,IAAAE,MACQ,4DAA4D;AAAA,EAAA;AAAA,SAEzEF;AAAO;AAUX,SAAAG,qBAAAC,IAAA;AAAA,QAAAC,IAAAC,EAAA,CAAA;AAA8B,QAAA;AAAA,IAAAC;AAAAA,IAAAC;AAAAA,EAAAA,IAAAJ;AAGU,MAAAK;AAAA,MAAAJ,EAAA,CAAA,MAAAG,YAAAH,SAAAE,YAAA;AAEvCE,6BAAA,oBAAA,UAAA,EAAqCF,OAAAA,YAChCC,UACL;AAA+BH,WAAAG;AAAAH,WAAAE;AAAAF,WAAAI;AAAAA,EAAA,OAAA;AAAAA,SAAAJ,EAAA,CAAA;AAAA,EAAA;AAAA,SAF/BI;AAE+B;ACdvC,MAAMC,yBAAyB;AAMxB,SAASC,0BAA0B;AAAA,EACtCC;AAAAA,EACAC;AAAAA,EACAC;AAAAA,EACAC;AAAAA,EACAC;AAAAA,EACAC;AAAAA,EACAC,gBAAgBR;AACY,GAA2B;AACvD,QAAM,CAACS,SAASC,UAAU,IAAIC,SAAS,IAAI;AAC3C,QAAM,CAACC,OAAOC,QAAQ,IAAIF,SAAAA;AAC1B,QAAM,CAACG,QAAQC,SAAS,IAAIJ,SAAuB,CAAA,CAAE;AACrD,QAAM,CAACK,eAAeC,gBAAgB,IAAIN,SAAAA;AAC1C,QAAM,CAACO,aAAaC,cAAc,IAAIR,SAAS,EAAE;AAGjD,QAAMS,mBAAmBC,YAAY,OAAOC,UAAgE;AACxG,QAAI;AACA,YAAMC,iBAAiB,MAAMrB,cAAcsB,eAAeF,MAAMlB,aAAakB,MAAMhB,MAAM;AACzF,aAAO;AAAA,QACH,GAAGgB;AAAAA,QACHG,aAAaF,eAAeG,OAAOtC;AAAAA,MAAAA;AAAAA,IAE3C,SAASuC,KAAK;AACVC,cAAQC,KAAK,kCAAkCP,MAAMlB,WAAW,KAAKuB,GAAG;AACxE,aAAO;AAAA,QAAE,GAAGL;AAAAA,QAAOG,aAAarC;AAAAA,MAAAA;AAAAA,IACpC;AAAA,EACJ,GAAG,CAACc,aAAa,CAAC;AAGlB,QAAM4B,gBAAgBT,YAAY,YAAY;AAC1CX,eAAW,IAAI;AACfG,aAASzB,MAAS;AAClB,QAAI;AACAwC,cAAQG,IAAI,+BAA+B1B,cAAc;AACzD,YAAM2B,WAAW,MAAM7B,mBAAmB8B,gBAAqC;AAAA,QAC3EC,MAAM7B;AAAAA,QACN8B,SAAS;AAAA,QACTC,OAAO;AAAA,MAAA,CACV;AAEDR,cAAQG,IAAI,qBAAqBC,SAASK,MAAM;AAEhD,UAAIL,SAASK,WAAW,GAAG;AACvBtB,kBAAU,CAAA,CAAE;AACZ;AAAA,MACJ;AAGA,YAAMuB,eAA6B,MAAMC,QAAQC,IAC7CR,SAASS,IAAI,OAAOC,WAAW;AAC3B,cAAMC,SAASD,OAAOC;AACtB,cAAMC,YAA6C;AAAA,UAC/CC,IAAIH,OAAOG;AAAAA,UACXC,UAAUH,OAAOG;AAAAA,UACjB1C,aAAauC,OAAOvC;AAAAA,UACpB2C,UAAUJ,OAAOI;AAAAA,UACjBC,MAAML,OAAOK;AAAAA,UACbC,YAAYN,OAAOM;AAAAA,UACnBC,OAAOP,OAAOO;AAAAA,UACdC,SAASR,OAAOQ;AAAAA,UAChBC,SAAST,OAAOS;AAAAA,UAChBC,MAAMV,OAAOU;AAAAA,UACb/C,QAAQqC,OAAOrC;AAAAA,UACfgD,WAAWX,OAAOW,qBAAqBC,OACjCZ,OAAOW,YACNX,OAAOW,WAAWE,SAASb,OAAOW,UAAUE,OAAAA,IAAW,IAAID,KAAKZ,OAAOW,SAAS;AAAA,UACvFG,WAAWd,OAAOc,qBAAqBF,OACjCZ,OAAOc,YACNd,OAAOc,WAAWD,SAASb,OAAOc,UAAUD,OAAAA,IAAW,IAAID,KAAKZ,OAAOc,SAAS;AAAA,QAAA;AAI3F,YAAIb,UAAUG,UAAUW,WAAW,QAAQ,KAAKd,UAAUG,UAAUW,WAAW,QAAQ,GAAG;AACtF,iBAAO,MAAMtC,iBAAiBwB,SAAS;AAAA,QAC3C;AACA,eAAO;AAAA,UAAE,GAAGA;AAAAA,UAAWnB,aAAarC;AAAAA,QAAAA;AAAAA,MACxC,CAAC,CACL;AAEAwC,cAAQG,IAAI,4BAA4BO,aAAaD,MAAM;AAC3DtB,gBAAUuB,YAAY;AAAA,IAC1B,SAASX,OAAK;AACVC,cAAQhB,MAAM,gCAAgCe,KAAG;AACjDd,eAASc,iBAAenC,QAAQmC,QAAM,IAAInC,MAAMmE,OAAOhC,KAAG,CAAC,CAAC;AAAA,IAChE,UAAA;AACIjB,iBAAW,KAAK;AAAA,IACpB;AAAA,EACJ,GAAG,CAACP,oBAAoBE,gBAAgBe,gBAAgB,CAAC;AAGzDwC,YAAU,MAAM;AACZ9B,kBAAAA;AAAAA,EACJ,GAAG,CAACA,aAAa,CAAC;AAGlB,QAAM+B,aAAaxC,YAAY,OAC3ByC,MACAC,aACsB;AACtBnC,YAAQG,IAAI,mBAAmB+B,KAAKE,MAAM,YAAY5D,WAAW;AAGjE,UAAM6D,eAAe,MAAM/D,cAAc2D,WAAW;AAAA,MAChDC;AAAAA,MACAhB,UAAUgB,KAAKE;AAAAA,MACf9B,MAAM9B;AAAAA,MACNE;AAAAA,IAAAA,CACH;AAEDsB,YAAQG,IAAI,kBAAkBkC,YAAY;AAG1C,QAAIxC;AACJ,QAAI;AACA,YAAMF,mBAAiB,MAAMrB,cAAcsB,eAAeyC,aAAa/B,MAAM+B,aAAa3D,MAAM;AAChGmB,oBAAcF,iBAAeG,OAAOtC;AACpCwC,cAAQG,IAAI,qBAAqBN,WAAW;AAAA,IAChD,SAASE,OAAK;AACVC,cAAQC,KAAK,4CAA4CF,KAAG;AAAA,IAChE;AAGA,QAAIsB;AACJ,QAAIa,KAAKI,KAAKR,WAAW,QAAQ,GAAG;AAChC,UAAI;AACAT,qBAAa,MAAMkB,mBAAmBL,IAAI;AAAA,MAC9C,SAASnC,OAAK;AACVC,gBAAQC,KAAK,mCAAmCF,KAAG;AAAA,MACvD;AAAA,IACJ;AAGA,UAAMyC,aAAqC,CAAA;AAC3C,UAAMC,gBAAgBP,KAAKI,KAAKR,WAAW,QAAQ,KAAKI,KAAKI,SAAS;AACtE,QAAI3D,kBAAkBA,eAAe8B,SAAS,KAAKgC,eAAe;AAC9DzC,cAAQG,IAAI,oCAAoCxB,eAAekC,IAAI6B,CAAAA,MAAKA,EAAEN,IAAI,CAAC;AAE/E,iBAAWhB,QAAQzC,gBAAgB;AAC/B,YAAI;AACA,gBAAMgE,gBAAgB,MAAMC,kBAAkBV,MAAMd,KAAKyB,OAAOzB,KAAK0B,QAAQ1B,KAAK2B,WAAW,GAAG;AAChG,gBAAMC,gBAAgB,GAAGrB,KAAKsB,IAAAA,CAAK,IAAI7B,KAAKgB,IAAI,IAAIF,KAAKE,IAAI;AAC7D,gBAAMc,YAAY,GAAG1E,WAAW,IAAII,aAAa,IAAIwC,KAAKgB,IAAI;AAG9D,gBAAMe,oBAAoB,MAAM7E,cAAc2D,WAAW;AAAA,YACrDC,MAAM,IAAIkB,KAAK,CAACT,aAAa,GAAGK,eAAe;AAAA,cAAEV,MAAM;AAAA,YAAA,CAAc;AAAA,YACrEpB,UAAU8B;AAAAA,YACV1C,MAAM4C;AAAAA,YACNxE;AAAAA,UAAAA,CACH;AAGD,gBAAM2E,sBAAsB,MAAM/E,cAAcsB,eAAeuD,kBAAkB7C,MAAM6C,kBAAkBzE,MAAM;AAC/G,cAAI2E,oBAAoBvD,KAAK;AACzB0C,uBAAWpB,KAAKgB,IAAI,IAAIiB,oBAAoBvD;AAC5CE,oBAAQG,IAAI,aAAaiB,KAAKgB,IAAI,eAAeiB,oBAAoBvD,GAAG;AAAA,UAC5E;AAAA,QACJ,SAASC,OAAK;AACVC,kBAAQC,KAAK,sBAAsBmB,KAAKgB,IAAI,eAAerC,KAAG;AAAA,QAClE;AAAA,MACJ;AAAA,IACJ;AAEA,UAAMkD,0BAAUtB,KAAAA;AAGhB,UAAM2B,YAAiC;AAAA,MACnCpC,UAAUgB,KAAKE;AAAAA,MACf5D,aAAa6D,aAAa/B;AAAAA,MAC1Ba,UAAUe,KAAKI;AAAAA,MACflB,MAAMc,KAAKd;AAAAA,MACXM,WAAWuB;AAAAA,MACXpB,WAAWoB;AAAAA,IAAAA;AAIf,QAAI5B,sBAAsBA,aAAaA;AACvC,QAAIc,UAAUb,MAAOgC,WAAUhC,QAAQa,SAASb;AAChD,QAAIa,UAAUZ,QAAS+B,WAAU/B,UAAUY,SAASZ;AACpD,QAAIY,UAAUX,QAAS8B,WAAU9B,UAAUW,SAASX;AACpD,QAAIW,UAAUV,QAAQU,SAASV,KAAKhB,SAAS,EAAG6C,WAAU7B,OAAOU,SAASV;AAC1E,QAAIY,aAAa3D,OAAQ4E,WAAU5E,SAAS2D,aAAa3D;AAEzD,QAAImB,uBAAuBA,cAAcA;AAEzC,QAAI0D,OAAOC,KAAKhB,UAAU,EAAE/B,SAAS,aAAa+B,aAAaA;AAE/DxC,YAAQG,IAAI,kCAAkCmD,SAAS;AAGvD,UAAMxC,WAAS,MAAMvC,mBAAmBkF,WAAgC;AAAA,MACpEnD,MAAM7B;AAAAA,MACNsC,QAAQuC;AAAAA,MACRI,QAAQ;AAAA,IAAA,CACX;AAED1D,YAAQG,IAAI,iBAAiBW,SAAOG,EAAE;AAEtC,UAAM0C,WAAuB;AAAA,MACzB1C,IAAIH,SAAOG;AAAAA,MACXC,UAAUgB,KAAKE;AAAAA,MACf5D,aAAa6D,aAAa/B;AAAAA,MAC1BT;AAAAA,MACAsB,UAAUe,KAAKI;AAAAA,MACflB,MAAMc,KAAKd;AAAAA,MACXM,WAAWuB;AAAAA,MACXpB,WAAWoB;AAAAA,MACX5B;AAAAA,MACAC,OAAOa,UAAUb;AAAAA,MACjBC,SAASY,UAAUZ;AAAAA,MACnBC,SAASW,UAAUX;AAAAA,MACnBC,MAAMU,UAAUV;AAAAA,MAChB/C,QAAQ2D,aAAa3D;AAAAA,MACrB8D,YAAYe,OAAOC,KAAKhB,UAAU,EAAE/B,SAAS,IAAI+B,aAAahF;AAAAA,IAAAA;AAGlE2B,cAAUyE,CAAAA,SAAQ,CAACD,UAAU,GAAGC,IAAI,CAAC;AACrC,WAAOD;AAAAA,EACX,GAAG,CAACrF,eAAeC,oBAAoBC,aAAaC,gBAAgBC,QAAQC,gBAAgBC,aAAa,CAAC;AAG1G,QAAMiF,cAAcpE,YAAY,OAAOqE,YAAmC;AACtE,UAAMpE,UAAQR,OAAO6E,KAAKC,CAAAA,MAAKA,EAAE/C,OAAO6C,OAAO;AAC/C,QAAI,CAACpE,SAAO;AACR,YAAM,IAAI9B,MAAM,iBAAiBkG,OAAO,YAAY;AAAA,IACxD;AAEA9D,YAAQG,IAAI,mBAAmB2D,SAASpE,QAAMlB,WAAW;AAGzD,QAAI;AACA,YAAMF,cAAc2F,WAAWvE,QAAMlB,aAAakB,QAAMhB,MAAM;AAAA,IAClE,SAASqB,OAAK;AACVC,cAAQC,KAAK,kDAAkDF,KAAG;AAAA,IACtE;AAGA,UAAMxB,mBAAmB2F,aAAa;AAAA,MAClCpD,QAAQ;AAAA,QACJG,IAAI6C;AAAAA,QACJxD,MAAM7B;AAAAA,QACNsC,QAAQrB;AAAAA,MAAAA;AAAAA,IACZ,CACH;AAEDP,cAAUyE,YAAQA,OAAKO,OAAOH,SAAKA,IAAE/C,OAAO6C,OAAO,CAAC;AACpD,QAAI1E,eAAe6B,OAAO6C,SAAS;AAC/BzE,uBAAiB7B,MAAS;AAAA,IAC9B;AAAA,EACJ,GAAG,CAAC0B,QAAQZ,eAAeC,oBAAoBE,gBAAgBW,aAAa,CAAC;AAG7E,QAAMgF,cAAc3E,YAAY,OAC5BqE,WACAO,SACgB;AAChB,UAAM3E,UAAQR,OAAO6E,KAAKC,CAAAA,QAAKA,IAAE/C,OAAO6C,SAAO;AAC/C,QAAI,CAACpE,SAAO;AACR,YAAM,IAAI9B,MAAM,iBAAiBkG,SAAO,YAAY;AAAA,IACxD;AAGA,UAAMQ,YAAiC,CAAA;AACvCf,WAAOgB,QAAQF,IAAI,EAAEG,QAAQ,CAAC,CAACC,KAAKC,KAAK,MAAM;AAC3C,UAAIA,UAAUlH,QAAW;AACrB8G,kBAAUG,GAAG,IAAIC;AAAAA,MACrB;AAAA,IACJ,CAAC;AACDJ,cAAUzC,gCAAgBF,KAAAA;AAE1B3B,YAAQG,IAAI,mBAAmB2D,WAASQ,SAAS;AAEjD,UAAM/F,mBAAmBkF,WAAW;AAAA,MAChCnD,MAAM7B;AAAAA,MACNkG,UAAUb;AAAAA,MACV/C,QAAQuD;AAAAA,MACRM,gBAAgBlF;AAAAA,MAChBgE,QAAQ;AAAA,IAAA,CACX;AAEDvE,cAAUyE,YAAQA,OAAK/C,IAAImD,CAAAA,QACvBA,IAAE/C,OAAO6C,YAAU;AAAA,MAAE,GAAGE;AAAAA,MAAG,GAAGM;AAAAA,IAAAA,IAAcN,GAChD,CAAC;AAED,QAAI5E,eAAe6B,OAAO6C,WAAS;AAC/BzE,uBAAiBuE,YAAQA,SAAO;AAAA,QAAE,GAAGA;AAAAA,QAAM,GAAGU;AAAAA,MAAAA,IAAcV,MAAI;AAAA,IACpE;AAAA,EACJ,GAAG,CAAC1E,QAAQX,oBAAoBE,gBAAgBW,aAAa,CAAC;AAG9D,QAAMyF,eAAepF,YAAY,CAACqF,UAAkB;AAChDvF,mBAAeuF,KAAK;AAAA,EACxB,GAAG,CAAA,CAAE;AAEL,QAAMC,cAActF,YAAY,CAACC,YAAkC;AAC/DL,qBAAiBK,OAAK;AAAA,EAC1B,GAAG,CAAA,CAAE;AAGL,QAAMsF,iBAAiB1F,cACjBJ,OAAOiF,OAAOzE,CAAAA,YACZA,QAAMwB,SAAS+D,YAAAA,EAAcC,SAAS5F,YAAY2F,YAAAA,CAAa,KAC/DvF,QAAM4B,OAAO2D,YAAAA,EAAcC,SAAS5F,YAAY2F,aAAa,KAC7DvF,QAAM+B,MAAM0D,KAAKC,CAAAA,QAAOA,IAAIH,YAAAA,EAAcC,SAAS5F,YAAY2F,YAAAA,CAAa,CAAC,CACjF,IACE/F;AAEN,SAAO;AAAA,IACHL;AAAAA,IACAG;AAAAA,IACAE,QAAQ8F;AAAAA,IACRK,YAAYnG,OAAOuB;AAAAA,IACnBrB;AAAAA,IACA2F;AAAAA,IACA9C;AAAAA,IACA4B;AAAAA,IACAO;AAAAA,IACAlE;AAAAA,IACA2E;AAAAA,IACArG;AAAAA,IACAC;AAAAA,EAAAA;AAER;AAKA,SAAS8D,mBAAmBL,MAAwD;AAChF,SAAO,IAAIvB,QAAQ,CAAC2E,SAASC,WAAW;AACpC,UAAMC,MAAM,IAAIC,MAAAA;AAChBD,QAAIE,SAAS,MAAM;AACfJ,cAAQ;AAAA,QAAEzC,OAAO2C,IAAI3C;AAAAA,QAAOC,QAAQ0C,IAAI1C;AAAAA,MAAAA,CAAQ;AAChD6C,UAAIC,gBAAgBJ,IAAIK,GAAG;AAAA,IAC/B;AACAL,QAAIM,UAAUP;AACdC,QAAIK,MAAMF,IAAII,gBAAgB7D,IAAI;AAAA,EACtC,CAAC;AACL;AAOA,eAAeU,kBACXV,MACA8D,UACAC,WACAlD,SACa;AACb,SAAO,IAAIpC,QAAc,CAAC2E,SAASC,WAAW;AAC1C,QAAIW,WAAWhE,MAAM;AAAA,MACjBa;AAAAA,MACAiD;AAAAA,MACAC;AAAAA,MACA9E,UAAU;AAAA,MACVgF,SAAUC,CAAAA,WAAW;AACjBd,gBAAQc,MAAM;AAAA,MAClB;AAAA,MACApH,OAAOuG;AAAAA,IAAAA,CACV;AAAA,EACL,CAAC;AACL;ACxWO,SAAAc,eAAAvI,IAAA;AAAA,QAAAC,IAAAC,EAAA,EAAA;AAAwB,QAAA;AAAA,IAAA0B;AAAAA,IAAA4G;AAAAA,IAAAC;AAAAA,IAAAC;AAAAA,IAAAC,eAAAtI;AAAAA,EAAAA,IAAAL;AAK3B,QAAA2I,gBAAAtI,OAAuBX,SAAP,UAAhBW;AAAuB,MAAAuI;AAAA,MAAA3I,EAAA,CAAA,MAAA2B,MAAAyB,UAAA;AAEPuF,SAAAhH,MAAKyB,SAAAW,WAAqB,QAAQ;AAAC/D,MAAA,CAAA,IAAA2B,MAAAyB;AAAApD,WAAA2I;AAAAA,EAAA,OAAA;AAAAA,SAAA3I,EAAA,CAAA;AAAA,EAAA;AAAnD,QAAA4I,UAAgBD;AAChB,QAAAE,UAAgBlH,MAAKyB,SAAAW,WAAqB,QAAQ;AAClD,QAAA+E,UAAgBnH,MAAKyB,SAAAW,WAAqB,QAAQ;AAElD,QAAAgF,WAAiBH,UAAOI,YAClBH,UAAOI,mBACHH,UAAOI,iBAAAC;AAGjB,QAAAC,aAAAC;AAOA,QAAAC,WAAiB3H,MAAK8C,aAAciE,aAAa,KAAK/G,MAAKG;AAAa,MAAAyH;AAAA,MAAAvJ,SAAA+I,YAAA/I,EAAA,CAAA,MAAA2B,MAAA6B,WAAAxD,SAAA2B,MAAAwB,YAAAnD,SAAAsJ,YAAAtJ,EAAA,CAAA,MAAA4I,SAAA;AAEtDW,SAAAX,WAAWU,WACzB,6BACSA,KAAAA,UACA,KAAA3H,MAAK6B,WAAY7B,MAAKwB,UACjB,WAAA,sFACF,SAAA,OAAA,CAAM,IAGlB,6BAAe,WAAA,qFACX,UAAA,oBAAC,UAAA,EAAc,MAAA,SAAkB,WAAA,yCAAA,CAAwC,GAC7E;AACHnD,WAAA+I;AAAA/I,MAAA,CAAA,IAAA2B,MAAA6B;AAAAxD,MAAA,CAAA,IAAA2B,MAAAwB;AAAAnD,WAAAsJ;AAAAtJ,WAAA4I;AAAA5I,WAAAuJ;AAAAA,EAAA,OAAA;AAAAA,SAAAvJ,EAAA,CAAA;AAAA,EAAA;AAXD,QAAAwJ,YAAkBD;AAWhB,MAEEhB,aAAa,QAAM;AAQP,UAAAkB,MAAAhB,YAAY;AAAkC,QAAAiB;AAAA,QAAA1J,SAAAyJ,KAAA;AALvCC,YAAAC,IACP,yDACA,kDACA,kCACA,UAAAC,kBAAA,IACAH,GACJ;AAACzJ,aAAAyJ;AAAAzJ,aAAA0J;AAAAA,IAAA,OAAA;AAAAA,YAAA1J,EAAA,CAAA;AAAA,IAAA;AAAA,QAAA6J;AAAA,QAAA7J,UAAAwJ,WAAA;AAGDK,YAAA,oBAAA,OAAA,EAAe,WAAA,yFACVL,UAAAA,WACL;AAAMxJ,cAAAwJ;AAAAxJ,cAAA6J;AAAAA,IAAA,OAAA;AAAAA,YAAA7J,EAAA,EAAA;AAAA,IAAA;AAGG,UAAA8J,MAAAnI,MAAK4B,SAAU5B,MAAKwB;AAAS,QAAA4G;AAAA,QAAA/J,UAAA8J,KAAA;AADlCC,gCAAC,YAAA,EAAmB,SAAA,SAAkB,WAAA,yDACjCD,UAAAA,KACL;AAAa9J,cAAA8J;AAAA9J,cAAA+J;AAAAA,IAAA,OAAA;AAAAA,YAAA/J,EAAA,EAAA;AAAA,IAAA;AAER,UAAAgK,MAAAZ,WAAWzH,MAAK0B,IAAK;AAAC,QAAA4G;AAAA,QAAAjK,EAAA,EAAA,MAAA2B,MAAAyB,UAAA;AAAK6G,aAAAtI,MAAKyB,SAAA8G,MAAgB,GAAG,EAAC,CAAA,GAAAC,YAAAA;AAAkBnK,QAAA,EAAA,IAAA2B,MAAAyB;AAAApD,cAAAiK;AAAAA,IAAA,OAAA;AAAAA,aAAAjK,EAAA,EAAA;AAAA,IAAA;AAAA,QAAAoK;AAAA,QAAApK,EAAA,EAAA,MAAAiK,QAAAjK,UAAAgK,KAAA;AAD3EI,aAAA,qBAAC,YAAA,EAAmB,SAAA,WAAgB,OAAA,aAC/BJ,UAAAA;AAAAA,QAAAA;AAAAA,QAAuB;AAAA,QAAIC;AAAAA,MAAAA,GAChC;AAAajK,cAAAiK;AAAAjK,cAAAgK;AAAAhK,cAAAoK;AAAAA,IAAA,OAAA;AAAAA,aAAApK,EAAA,EAAA;AAAA,IAAA;AAAA,QAAAqK;AAAA,QAAArK,EAAA,EAAA,MAAAoK,QAAApK,UAAA+J,KAAA;AANjBM,aAAA,qBAAA,OAAA,EAAe,WAAA,kBACXN,UAAAA;AAAAA,QAAAA;AAAAA,QAGAK;AAAAA,MAAAA,GAGJ;AAAMpK,cAAAoK;AAAApK,cAAA+J;AAAA/J,cAAAqK;AAAAA,IAAA,OAAA;AAAAA,aAAArK,EAAA,EAAA;AAAA,IAAA;AAAA,QAAAsK;AAAA,QAAAtK,UAAAyI,UAAA;AACL6B,aAAA7B,YACG,oBAAA,OAAA,EAAe,WAAA,kFACX,UAAA,oBAAC,WAAA,EAAe,MAAA,YAAqB,WAAA,aAAA,CAAY,GACrD;AACHzI,cAAAyI;AAAAzI,cAAAsK;AAAAA,IAAA,OAAA;AAAAA,aAAAtK,EAAA,EAAA;AAAA,IAAA;AAAA,QAAAuK;AAAA,QAAAvK,EAAA,EAAA,MAAAwI,WAAAxI,EAAA,EAAA,MAAAqK,QAAArK,EAAA,EAAA,MAAAsK,QAAAtK,EAAA,EAAA,MAAA0J,OAAA1J,UAAA6J,KAAA;AAzBLU,aAAA,qBAAA,OAAA,EACe,WAAAb,KAOFlB,SAETqB,UAAAA;AAAAA,QAAAA;AAAAA,QAGAQ;AAAAA,QAQCC;AAAAA,MAAAA,GAKL;AAAMtK,cAAAwI;AAAAxI,cAAAqK;AAAArK,cAAAsK;AAAAtK,cAAA0J;AAAA1J,cAAA6J;AAAA7J,cAAAuK;AAAAA,IAAA,OAAA;AAAAA,aAAAvK,EAAA,EAAA;AAAA,IAAA;AAAA,WA1BNuK;AAAAA,EA0BM;AAUF,QAAAd,KAAAhB,YAAY;AAAqB,MAAAiB;AAAA,MAAA1J,UAAAyJ,IAAA;AAJ1BC,SAAAC,IACP,iDACA,+BACA,0CACAF,EACJ;AAACzJ,YAAAyJ;AAAAzJ,YAAA0J;AAAAA,EAAA,OAAA;AAAAA,SAAA1J,EAAA,EAAA;AAAA,EAAA;AAAA,MAAA6J;AAAA,MAAA7J,EAAA,EAAA,MAAAwK,uBAAAC,IAAA,2BAAA,GAAA;AAOGZ,6BAAA,OAAA,EAAgB,WAAAF,IACZ,uDACA,gCACJ,GAAC;AAAI3J,YAAA6J;AAAAA,EAAA,OAAA;AAAAA,SAAA7J,EAAA,EAAA;AAAA,EAAA;AAAA,MAAA8J;AAAA,MAAA9J,UAAAyI,UAAA;AAGJqB,SAAArB,YACG,oBAAA,OAAA,EAAe,WAAA,qGACX,UAAA,oBAAC,WAAA,EAAe,MAAA,YAAqB,WAAA,aAAA,CAAY,GACrD;AACHzI,YAAAyI;AAAAzI,YAAA8J;AAAAA,EAAA,OAAA;AAAAA,SAAA9J,EAAA,EAAA;AAAA,EAAA;AAAA,MAAA+J;AAAA,MAAA/J,EAAA,EAAA,MAAA8J,MAAA9J,UAAAwJ,WAAA;AAdLO,SAAA,qBAAA,OAAA,EAAe,WAAA,6EACVP,UAAAA;AAAAA,MAAAA;AAAAA,MAGDK;AAAAA,MAMCC;AAAAA,IAAAA,GAKL;AAAM9J,YAAA8J;AAAA9J,YAAAwJ;AAAAxJ,YAAA+J;AAAAA,EAAA,OAAA;AAAAA,SAAA/J,EAAA,EAAA;AAAA,EAAA;AAIG,QAAAgK,KAAArI,MAAK4B,SAAU5B,MAAKwB;AAAS,MAAA8G;AAAA,MAAAjK,UAAAgK,IAAA;AADlCC,8BAAC,YAAA,EAAmB,SAAA,SAAkB,WAAA,yDACjCD,UAAAA,IACL;AAAahK,YAAAgK;AAAAhK,YAAAiK;AAAAA,EAAA,OAAA;AAAAA,UAAAjK,EAAA,EAAA;AAAA,EAAA;AAER,QAAAoK,MAAAhB,WAAWzH,MAAK0B,IAAK;AAAC,MAAAgH;AAAA,MAAArK,EAAA,EAAA,MAAA2B,MAAAyB,UAAA;AAAKiH,UAAA1I,MAAKyB,SAAA8G,MAAgB,GAAG,EAAC,CAAA,GAAAC,YAAAA;AAAkBnK,MAAA,EAAA,IAAA2B,MAAAyB;AAAApD,YAAAqK;AAAAA,EAAA,OAAA;AAAAA,UAAArK,EAAA,EAAA;AAAA,EAAA;AAAA,MAAAsK;AAAA,MAAAtK,EAAA,EAAA,MAAAoK,OAAApK,UAAAqK,KAAA;AAD3EC,+BAAC,YAAA,EAAmB,SAAA,WAAgB,OAAA,aAAsB,WAAA,yBACrDF,UAAAA;AAAAA,MAAAA;AAAAA,MAAuB;AAAA,MAAIC;AAAAA,IAAAA,GAChC;AAAarK,YAAAoK;AAAApK,YAAAqK;AAAArK,YAAAsK;AAAAA,EAAA,OAAA;AAAAA,UAAAtK,EAAA,EAAA;AAAA,EAAA;AAAA,MAAAuK;AAAA,MAAAvK,EAAA,EAAA,MAAAiK,OAAAjK,UAAAsK,KAAA;AANjBC,UAAA,qBAAA,OAAA,EAAe,WAAA,OACXN,UAAAA;AAAAA,MAAAA;AAAAA,MAGAK;AAAAA,IAAAA,GAGJ;AAAMtK,YAAAiK;AAAAjK,YAAAsK;AAAAtK,YAAAuK;AAAAA,EAAA,OAAA;AAAAA,UAAAvK,EAAA,EAAA;AAAA,EAAA;AAAA,MAAA0K;AAAA,MAAA1K,EAAA,EAAA,MAAAwI,WAAAxI,EAAA,EAAA,MAAAuK,OAAAvK,EAAA,EAAA,MAAA0J,MAAA1J,UAAA+J,IAAA;AAjCVW,UAAA,qBAAC,MAAA,EACc,WAAAhB,IAMFlB,SAETuB,UAAAA;AAAAA,MAAAA;AAAAA,MAiBAQ;AAAAA,IAAAA,GAQJ;AAAOvK,YAAAwI;AAAAxI,YAAAuK;AAAAvK,YAAA0J;AAAA1J,YAAA+J;AAAA/J,YAAA0K;AAAAA,EAAA,OAAA;AAAAA,UAAA1K,EAAA,EAAA;AAAA,EAAA;AAAA,SAlCP0K;AAkCO;AAzGR,SAAArB,MAAAsB,OAAA;AAAA,MAiBKA,QAAK,MAAO;AAAA,WAAS,GAAGA,KAAK;AAAA,EAAI;AAAA,MACjCA,QAAK,SAAc;AAAA,WAAS,IAAIA,QAAK,MAAOC,QAAA,CAAW,CAAC;AAAA,EAAK;AAAA,SAC1D,IAAID,QAAK,SAAgBC,QAAA,CAAW,CAAC;AAAK;ACflD,SAASC,kBAAkB;AAAA,EAC9BlJ;AAAAA,EACAmJ;AAAAA,EACAC;AAAAA,EACAC;AACoB,GAAG;AACvB,QAAMC,qBAAqBC,sBAAAA;AAC3B,QAAM3K,gBAAgB4K,iBAAAA;AACtB,QAAM,CAACC,QAAQC,SAAS,IAAIrK,SAAS,KAAK;AAC1C,QAAM,CAACsK,UAAUC,WAAW,IAAIvK,SAAS,KAAK;AAC9C,QAAM,CAACwK,kBAAkBC,mBAAmB,IAAIzK,SAAS,KAAK;AAC9D,QAAM,CAAC0K,UAAUC,WAAW,IAAI3K,SAAS,EAAE;AAE3C,QAAM;AAAA,IAAEgC;AAAAA,IAAQ4I;AAAAA,IAAeC;AAAAA,EAAAA,IAAUC,gBAAqC;AAAA,IAC1EC,eAAe;AAAA,MACXxI,OAAO5B,MAAM4B,SAAS;AAAA,MACtBC,SAAS7B,MAAM6B,WAAW;AAAA,MAC1BC,SAAS9B,MAAM8B,WAAW;AAAA,MAC1BC,MAAM/B,MAAM+B,QAAQ,CAAA;AAAA,IAAA;AAAA,EACxB,CACH;AAED,QAAMsI,aAAatK,YAAY,YAAY;AACvC2J,cAAU,IAAI;AACd,QAAI;AACA,YAAMN,SAASpJ,MAAMuB,IAAIF,MAAM;AAC/BiI,yBAAmBgB,KAAK;AAAA,QACpB1H,MAAM;AAAA,QACN2H,SAAS;AAAA,MAAA,CACZ;AAAA,IACL,SAASjL,OAAO;AACZgK,yBAAmBgB,KAAK;AAAA,QACpB1H,MAAM;AAAA,QACN2H,SAAS,yBAAyBjL,iBAAiBpB,QAAQoB,MAAMiL,UAAUlI,OAAO/C,KAAK,CAAC;AAAA,MAAA,CAC3F;AAAA,IACL,UAAA;AACIoK,gBAAU,KAAK;AAAA,IACnB;AAAA,EACJ,GAAG,CAAC1J,MAAMuB,IAAIF,QAAQ+H,UAAUE,kBAAkB,CAAC;AAEnD,QAAMkB,eAAezK,YAAY,YAAY;AACzC6J,gBAAY,IAAI;AAChB,QAAI;AACA,YAAMP,SAASrJ,MAAMuB,EAAE;AACvB+H,yBAAmBgB,KAAK;AAAA,QACpB1H,MAAM;AAAA,QACN2H,SAAS;AAAA,MAAA,CACZ;AACDpB,cAAAA;AAAAA,IACJ,SAAS7J,SAAO;AACZgK,yBAAmBgB,KAAK;AAAA,QACpB1H,MAAM;AAAA,QACN2H,SAAS,yBAAyBjL,mBAAiBpB,QAAQoB,QAAMiL,UAAUlI,OAAO/C,OAAK,CAAC;AAAA,MAAA,CAC3F;AAAA,IACL,UAAA;AACIsK,kBAAY,KAAK;AACjBE,0BAAoB,KAAK;AAAA,IAC7B;AAAA,EACJ,GAAG,CAAC9J,MAAMuB,IAAI8H,UAAUC,oBAAoBH,OAAO,CAAC;AAEpD,QAAMsB,iBAAiB1K,YAAY,YAAY;AAC3C,QAAI;AACA,YAAME,iBAAiB,MAAMrB,cAAcsB,eAAeF,MAAMlB,aAAakB,MAAMhB,MAAM;AACzF,UAAIiB,eAAeG,KAAK;AACpBsK,eAAOJ,KAAKrK,eAAeG,KAAK,QAAQ;AAAA,MAC5C;AAAA,IACJ,SAASd,SAAO;AACZgK,yBAAmBgB,KAAK;AAAA,QACpB1H,MAAM;AAAA,QACN2H,SAAS;AAAA,MAAA,CACZ;AAAA,IACL;AAAA,EACJ,GAAG,CAACvK,OAAOpB,eAAe0K,kBAAkB,CAAC;AAE7C,QAAMqB,eAAe5K,YAAY,MAAM;AACnC,UAAM2F,MAAMqE,SAASa,KAAAA;AACrB,QAAIlF,OAAO,CAACrE,OAAOU,MAAMyD,SAASE,GAAG,GAAG;AACpCuE,oBAAc,QAAQ,CAAC,GAAI5I,OAAOU,QAAQ,CAAA,GAAK2D,GAAG,CAAC;AACnDsE,kBAAY,EAAE;AAAA,IAClB;AAAA,EACJ,GAAG,CAACD,UAAU1I,OAAOU,MAAMkI,aAAa,CAAC;AAEzC,QAAMY,kBAAkB9K,YAAY,CAAC+K,gBAAwB;AACzDb,kBAAc,QAAQ5I,OAAOU,MAAM0C,OAAO,CAACsG,MAAcA,MAAMD,WAAW,KAAK,EAAE;AAAA,EACrF,GAAG,CAACzJ,OAAOU,MAAMkI,aAAa,CAAC;AAE/B,QAAMxC,aAAaA,CAACuB,UAA0B;AAC1C,QAAIA,QAAQ,KAAM,QAAO,GAAGA,KAAK;AACjC,QAAIA,QAAQ,OAAO,KAAM,QAAO,IAAIA,QAAQ,MAAMC,QAAQ,CAAC,CAAC;AAC5D,WAAO,IAAID,SAAS,OAAO,OAAOC,QAAQ,CAAC,CAAC;AAAA,EAChD;AAEA,QAAM+B,aAAaA,CAACC,SAAuB;AACvC,WAAO,IAAIC,KAAKC,eAAerN,QAAW;AAAA,MACtCsN,MAAM;AAAA,MACNC,OAAO;AAAA,MACPC,KAAK;AAAA,IAAA,CACR,EAAEC,OAAON,IAAI;AAAA,EAClB;AAEA,QAAMhE,UAAUjH,MAAMyB,SAASW,WAAW,QAAQ;AAClD,QAAM8E,UAAUlH,MAAMyB,SAASW,WAAW,QAAQ;AAElD,SACI,qBAAA,UAAA,EACI,UAAA;AAAA,IAAA,qBAAC,OAAA,EAAI,WAAW4F,IACZ,uDACA,qCACA,qEACA,kBACA,iBACA,wBACJ,GAEI,UAAA;AAAA,MAAA,qBAAC,OAAA,EAAI,WAAU,2GACX,UAAA;AAAA,QAAA,oBAAC,YAAA,EAAW,SAAQ,aAAY,WAAU,oCACrChI,UAAAA,MAAM4B,SAAS5B,MAAMwB,SAAAA,CAC1B;AAAA,QACA,qBAAC,OAAA,EAAI,WAAU,2BACX,UAAA;AAAA,UAAA,oBAAC,cAAW,SAASiJ,gBACjB,8BAAC,cAAA,EAAa,MAAK,SAAO,EAAA,CAC9B;AAAA,UACA,oBAAC,YAAA,EACG,SAAS,MAAMX,oBAAoB,IAAI,GACvC,WAAU,yDAEV,UAAA,oBAAC,YAAA,EAAW,MAAK,SAAO,GAC5B;AAAA,UACA,oBAAC,cAAW,SAASX,SACjB,8BAAC,WAAA,EAAU,MAAK,SAAO,EAAA,CAC3B;AAAA,QAAA,EAAA,CACJ;AAAA,MAAA,GACJ;AAAA,0BAGC,OAAA,EAAI,WAAU,2GACVlC,UAAAA,WAAWjH,MAAMG,cACd,oBAAC,OAAA,EACG,KAAKH,MAAMG,aACX,KAAKH,MAAM6B,WAAW7B,MAAMwB,UAC5B,WAAU,uCAAA,CAAsC,IAEpD0F,WAAWlH,MAAMG,cACjB,oBAAC,SAAA,EACG,KAAKH,MAAMG,aACX,WAAU,yBACV,UAAQ,MAAA,IAGZ,oBAAC,SAAI,WAAU,2BAAyB,mCAExC,GAER;AAAA,MAGA,qBAAC,OAAA,EAAI,WAAU,sCAEX,UAAA;AAAA,QAAA,qBAAC,OAAA,EAAI,WAAU,0BACVH,UAAAA;AAAAA,UAAAA,MAAM2B,mCACF,OAAA,EACG,UAAA;AAAA,YAAA,oBAAC,YAAA,EAAW,SAAQ,WAAU,WAAU,2BAAyB,UAAA,cAEjE;AAAA,YACA,qBAAC,YAAA,EAAW,SAAQ,SACf3B,UAAAA;AAAAA,cAAAA,MAAM2B,WAAWwB;AAAAA,cAAM;AAAA,cAAInD,MAAM2B,WAAWyB;AAAAA,cAAO;AAAA,YAAA,EAAA,CACxD;AAAA,UAAA,GACJ;AAAA,+BAEH,OAAA,EACG,UAAA;AAAA,YAAA,oBAAC,YAAA,EAAW,SAAQ,WAAU,WAAU,2BAAyB,UAAA,QAEjE;AAAA,gCACC,YAAA,EAAW,SAAQ,SACfqE,UAAAA,WAAWzH,MAAM0B,IAAI,EAAA,CAC1B;AAAA,UAAA,GACJ;AAAA,+BACC,OAAA,EACG,UAAA;AAAA,YAAA,oBAAC,YAAA,EAAW,SAAQ,WAAU,WAAU,2BAAyB,UAAA,QAEjE;AAAA,YACA,oBAAC,YAAA,EAAW,SAAQ,SACf1B,gBAAMyB,SAAAA,CACX;AAAA,UAAA,GACJ;AAAA,+BACC,OAAA,EACG,UAAA;AAAA,YAAA,oBAAC,YAAA,EAAW,SAAQ,WAAU,WAAU,2BAAyB,UAAA,WAEjE;AAAA,gCACC,YAAA,EAAW,SAAQ,SACfuJ,UAAAA,WAAWhL,MAAMgC,SAAS,EAAA,CAC/B;AAAA,UAAA,EAAA,CACJ;AAAA,QAAA,GACJ;AAAA,QAEA,oBAAC,MAAA,EAAG,WAAU,2DAAA,CAA0D;AAAA,QAGxE,oBAAC,WAAA,EACG,OAAM,aACN,OAAOhC,MAAMwB,UACb,UAAQ,MACR,MAAK,QAAA,CAAO;AAAA,4BAGf,WAAA,EACG,OAAM,SACN,OAAOH,OAAOO,SAAS,IACvB,UAAW4J,CAAAA,MAAMvB,cAAc,SAASuB,EAAEC,OAAOzG,KAAK,GACtD,MAAK,SAAO;AAAA,6BAGf,OAAA,EACG,UAAA;AAAA,UAAA,oBAAC,aACG,OAAM,YACN,OAAO3D,OAAOQ,WAAW,IACzB,UAAW2J,CAAAA,QAAMvB,cAAc,WAAWuB,IAAEC,OAAOzG,KAAK,GACxD,MAAK,SAAO;AAAA,8BAEf,YAAA,EAAW,SAAQ,WAAU,WAAU,gCAA8B,UAAA,sBAAA,CAEtE;AAAA,QAAA,GACJ;AAAA,4BAEC,WAAA,EACG,OAAM,WACN,OAAO3D,OAAOS,WAAW,IACzB,UAAW0J,SAAMvB,cAAc,WAAWuB,IAAEC,OAAOzG,KAAK,GACxD,MAAK,SACL,WAAS,MAAA;AAAA,6BAIZ,OAAA,EACG,UAAA;AAAA,UAAA,oBAAC,YAAA,EAAW,SAAQ,WAAU,WAAU,sCAAoC,UAAA,QAE5E;AAAA,8BACC,OAAA,EAAI,WAAU,6BACV3D,UAAAA,OAAOU,MAAMZ,IAAI,CAACuE,+BACd,MAAA,EAEG,MAAK,SACL,aAAY,eACZ,SAAS,MAAMmF,gBAAgBnF,KAAG,GAEjCA,UAAAA;AAAAA,YAAAA;AAAAA,YAAI;AAAA,UAAA,KALAA,KAMT,CACH,GACL;AAAA,UACA,qBAAC,OAAA,EAAI,WAAU,cACX,UAAA;AAAA,YAAA,oBAAC,aACG,aAAY,gBACZ,OAAOqE,UACP,UAAWyB,CAAAA,QAAMxB,YAAYwB,IAAEC,OAAOzG,KAAK,GAC3C,MAAK,SACL,WAAU,UACV,WAAYwG,CAAAA,QAAM;AACd,kBAAIA,IAAEzG,QAAQ,SAAS;AACnByG,oBAAEE,eAAAA;AACFf,6BAAAA;AAAAA,cACJ;AAAA,YACJ,GAAE;AAAA,YAEN,oBAAC,QAAA,EACG,SAAQ,QACR,MAAK,SACL,SAASA,cACT,UAAU,CAACZ,SAASa,KAAAA,GAAO,UAAA,MAAA,CAG/B;AAAA,UAAA,EAAA,CACJ;AAAA,QAAA,EAAA,CACJ;AAAA,MAAA,GACJ;AAAA,MAGA,oBAAC,SAAI,WAAU,uFACX,8BAAC,QAAA,EACG,SAAQ,UACR,SAASP,YACT,UAAU,CAACH,SAAST,QACpB,WAAU,UAETA,UAAAA,SAAS,oBAAC,oBAAiB,MAAK,QAAA,CAAO,IAAM,eAAA,CAClD,EAAA,CACJ;AAAA,IAAA,GACJ;AAAA,IAGA,qBAAC,QAAA,EACG,MAAMI,kBACN,cAAcC,qBAEd,UAAA;AAAA,MAAA,qBAAC,eAAA,EACG,UAAA;AAAA,QAAA,oBAAC,YAAA,EAAW,SAAQ,aAAY,WAAU,oBAAkB,UAAA,iBAE5D;AAAA,QACA,qBAAC,YAAA,EAAW,WAAU,wDAAsD,UAAA;AAAA,UAAA;AAAA,UACtC9J,MAAM4B,SAAS5B,MAAMwB;AAAAA,UAAS;AAAA,QAAA,EAAA,CAEpE;AAAA,MAAA,GACJ;AAAA,2BACC,eAAA,EACG,UAAA;AAAA,QAAA,oBAAC,QAAA,EACG,SAAQ,QACR,SAAS,MAAMsI,oBAAoB,KAAK,GACxC,UAAUH,UAAS,UAAA,SAAA,CAGvB;AAAA,4BACC,QAAA,EACG,SAAQ,UACR,OAAM,SACN,SAASa,cACT,UAAUb,UAETA,qBAAW,oBAAC,kBAAA,EAAiB,MAAK,SAAO,IAAM,SAAA,CACpD;AAAA,MAAA,EAAA,CACJ;AAAA,IAAA,EAAA,CACJ;AAAA,EAAA,GACJ;AAER;ACxUO,SAASgC,kBAAkB;AAAA,EAC9BrB;AAAAA,EACAnB;AAAAA,EACAyC;AAAAA,EACAC,cAAc;AAAA;AAAA,EACdC;AACoB,GAAG;AACvB,QAAM,CAACC,YAAYC,aAAa,IAAI3M,SAAS,KAAK;AAClD,QAAM,CAAC4M,WAAWC,YAAY,IAAI7M,SAAS,KAAK;AAChD,QAAM,CAACC,OAAOC,QAAQ,IAAIF,SAAwB,IAAI;AACtD,QAAM,CAAC8M,eAAeC,gBAAgB,IAAI/M,SAAiB,CAAA,CAAE;AAE7D,QAAMgN,gBAAgBtM,YAAY,CAACuM,UAAuD;AACtF,UAAMC,QAAgB,CAAA;AACtB,UAAMC,SAAmB,CAAA;AAEzB,eAAWhK,QAAQ8J,OAAO;AACtB,UAAIT,eAAerJ,KAAKd,OAAOmK,aAAa;AACxCW,eAAOC,KAAK,GAAGjK,KAAKE,IAAI,yBAAyB+E,WAAWoE,WAAW,CAAC,GAAG;AAC3E;AAAA,MACJ;AACA,UAAIC,qBAAqB,CAACA,kBAAkBrG,KAAK7C,CAAAA,SAAQ;AACrD,YAAIA,KAAK8J,SAAS,IAAI,GAAG;AACrB,iBAAOlK,KAAKI,KAAKR,WAAWQ,KAAK+J,MAAM,GAAG,EAAE,CAAC;AAAA,QACjD;AACA,eAAOnK,KAAKI,SAASA;AAAAA,MACzB,CAAC,GAAG;AACA4J,eAAOC,KAAK,GAAGjK,KAAKE,IAAI,yBAAyB;AACjD;AAAA,MACJ;AACA6J,YAAME,KAAKjK,IAAI;AAAA,IACnB;AAEA,WAAO;AAAA,MAAE+J;AAAAA,MAAOC;AAAAA,IAAAA;AAAAA,EACpB,GAAG,CAACX,aAAaC,iBAAiB,CAAC;AAEnC,QAAMc,iBAAiB7M,YAAY,CAACyL,MAAuB;AACvDA,MAAEE,eAAAA;AACFM,kBAAc,IAAI;AAAA,EACtB,GAAG,CAAA,CAAE;AAEL,QAAMa,kBAAkB9M,YAAY,CAACyL,QAAuB;AACxDA,QAAEE,eAAAA;AACFM,kBAAc,KAAK;AAAA,EACvB,GAAG,CAAA,CAAE;AAEL,QAAMc,aAAa/M,YAAY,CAACyL,QAAuB;AACnDA,QAAEE,eAAAA;AACFM,kBAAc,KAAK;AAEnB,UAAMM,UAAQS,MAAMC,KAAKxB,IAAEyB,aAAaX,KAAK;AAC7C,UAAM;AAAA,MAAEC,OAAAA;AAAAA,MAAOC,QAAAA;AAAAA,IAAAA,IAAWH,cAAcC,OAAK;AAE7C,QAAIE,SAAOzL,SAAS,GAAG;AACnBxB,eAASiN,SAAOU,KAAK,IAAI,CAAC;AAAA,IAC9B,OAAO;AACH3N,eAAS,IAAI;AAAA,IACjB;AAEA6M,qBAAiBlI,UAAQ,CAAC,GAAGA,MAAM,GAAGqI,OAAK,CAAC;AAAA,EAChD,GAAG,CAACF,aAAa,CAAC;AAElB,QAAMc,mBAAmBpN,YAAY,CAACyL,QAA2C;AAC7E,UAAMc,UAAQS,MAAMC,KAAKxB,IAAEC,OAAOa,SAAS,EAAE;AAC7C,UAAM;AAAA,MAAEC,OAAAA;AAAAA,MAAOC,QAAAA;AAAAA,IAAAA,IAAWH,cAAcC,OAAK;AAE7C,QAAIE,SAAOzL,SAAS,GAAG;AACnBxB,eAASiN,SAAOU,KAAK,IAAI,CAAC;AAAA,IAC9B,OAAO;AACH3N,eAAS,IAAI;AAAA,IACjB;AAEA6M,qBAAiBlI,YAAQ,CAAC,GAAGA,QAAM,GAAGqI,OAAK,CAAC;AAAA,EAChD,GAAG,CAACF,aAAa,CAAC;AAElB,QAAMe,mBAAmBrN,YAAY,CAACsN,UAAkB;AACpDjB,qBAAiBlI,CAAAA,WAAQA,OAAKO,OAAO,CAAC6I,GAAGC,MAAMA,MAAMF,KAAK,CAAC;AAAA,EAC/D,GAAG,CAAA,CAAE;AAEL,QAAMG,eAAezN,YAAY,YAAY;AACzC,QAAIoM,cAAcpL,WAAW,EAAG;AAEhCmL,iBAAa,IAAI;AACjB3M,aAAS,IAAI;AAEb,QAAI;AACA,YAAMqM,SAASO,aAAa;AAC5BC,uBAAiB,CAAA,CAAE;AACnBjD,cAAAA;AAAAA,IACJ,SAAS9I,KAAK;AACVd,eAASc,eAAenC,QAAQmC,IAAIkK,UAAU,eAAe;AAAA,IACjE,UAAA;AACI2B,mBAAa,KAAK;AAAA,IACtB;AAAA,EACJ,GAAG,CAACC,eAAeP,UAAUzC,OAAO,CAAC;AAErC,QAAMsE,cAAc1N,YAAY,MAAM;AAClC,QAAI,CAACkM,WAAW;AACZG,uBAAiB,CAAA,CAAE;AACnB7M,eAAS,IAAI;AACb4J,cAAAA;AAAAA,IACJ;AAAA,EACJ,GAAG,CAAC8C,WAAW9C,OAAO,CAAC;AAEvB,QAAM1B,aAAaA,CAACuB,UAA0B;AAC1C,QAAIA,QAAQ,KAAM,QAAO,GAAGA,KAAK;AACjC,QAAIA,QAAQ,OAAO,KAAM,QAAO,IAAIA,QAAQ,MAAMC,QAAQ,CAAC,CAAC;AAC5D,WAAO,IAAID,SAAS,OAAO,OAAOC,QAAQ,CAAC,CAAC;AAAA,EAChD;AAEA,SACI,qBAAC,QAAA,EACG,MACA,cAAeqB,CAAAA,WAAS,CAACA,UAAQmD,YAAAA,GACjC,UAAS,MAET,UAAA;AAAA,IAAA,qBAAC,eAAA,EAAc,WAAU,OACrB,UAAA;AAAA,MAAA,oBAAC,OAAA,EAAI,WAAU,yEACX,UAAA,oBAAC,cAAW,SAAQ,MAAI,0BAExB,EAAA,CACJ;AAAA,MAEA,qBAAC,OAAA,EAAI,WAAU,OAEX,UAAA;AAAA,QAAA,qBAAC,OAAA,EACG,WAAWzF,IACP,yCACA,mDACA,kCACA+D,aACM,gCACA,4DACN,2CACA,gBACJ,GACA,YAAYa,gBACZ,aAAaC,iBACb,QAAQC,YACR,SAAS,MAAMY,SAASC,eAAe,mBAAmB,GAAGC,MAAAA,GAE7D,UAAA;AAAA,UAAA,oBAAC,iBAAA,EACG,MAAK,SACL,WAAW5F,IACP+D,aAAa,iBAAiB,yBAClC,GAAE;AAAA,UAEN,qBAAC,OAAA,EAAI,WAAU,eACX,UAAA;AAAA,YAAA,oBAAC,YAAA,EAAW,SAAQ,SAAQ,WAAU,eAAa,UAAA,sCAEnD;AAAA,YACA,qBAAC,YAAA,EAAW,SAAQ,WAAU,WAAU,2BAAyB,UAAA;AAAA,cAAA;AAAA,cACzCtE,WAAWoE,WAAW;AAAA,YAAA,EAAA,CAC9C;AAAA,UAAA,GACJ;AAAA,8BACC,SAAA,EACG,IAAG,qBACH,MAAK,QACL,UAAQ,MACR,QAAQC,mBAAmBoB,KAAK,GAAG,GACnC,UAAUC,kBACV,WAAU,SAAA,CAAQ;AAAA,QAAA,GAE1B;AAAA,QAGC7N,SACG,oBAAC,YAAA,EAAW,SAAQ,WAAU,WAAU,+CACnCA,UAAAA,OACL;AAAA,QAIH6M,cAAcpL,SAAS,KACpB,qBAAC,OAAA,EAAI,WAAU,kBACX,UAAA;AAAA,UAAA,qBAAC,YAAA,EAAW,SAAQ,WAAU,WAAU,2BAAyB,UAAA;AAAA,YAAA;AAAA,YAC5CoL,cAAcpL;AAAAA,YAAO;AAAA,UAAA,GAC1C;AAAA,UACA,oBAAC,OAAA,EAAI,WAAU,oCACVoL,wBAAchL,IAAI,CAACqB,QAAM6K,iCACrB,OAAA,EAEG,WAAWrF,IACP,iDACA,iDACJ,GAEA,UAAA;AAAA,YAAA,qBAAC,OAAA,EAAI,WAAU,uBACX,UAAA;AAAA,cAAA,oBAAC,cAAW,SAAQ,SAAQ,WAAU,YACjCxF,iBAAKE,MACV;AAAA,cACA,oBAAC,cAAW,SAAQ,WAAU,WAAU,2BACnC+E,UAAAA,WAAWjF,OAAKd,IAAI,EAAA,CACzB;AAAA,YAAA,GACJ;AAAA,gCACC,QAAA,EACG,SAAQ,QACR,MAAK,SACL,SAAU8J,CAAAA,QAAM;AACZA,kBAAEqC,gBAAAA;AACFT,+BAAiBC,OAAK;AAAA,YAC1B,GACA,UAAUpB,WAAU,UAAA,SAAA,CAGxB;AAAA,UAAA,EAAA,GAxBK,GAAGzJ,OAAKE,IAAI,IAAI2K,OAAK,EAyB9B,CACH,EAAA,CACL;AAAA,QAAA,EAAA,CACJ;AAAA,MAAA,EAAA,CAER;AAAA,IAAA,GACJ;AAAA,yBAEC,eAAA,EACG,UAAA;AAAA,MAAA,oBAAC,UACG,SAAQ,QACR,SAASI,aACT,UAAUxB,WAAU,UAAA,SAAA,CAGxB;AAAA,MACA,oBAAC,QAAA,EACG,SAAQ,UACR,SAASuB,cACT,UAAUrB,cAAcpL,WAAW,KAAKkL,WAEvCA,UAAAA,YACG,qBAAA,UAAA,EACI,UAAA;AAAA,QAAA,oBAAC,kBAAA,EAAiB,MAAK,WAAA,CAAU;AAAA,QAAA;AAAA,MAAA,EAAA,CAErC,IAEA,UAAUE,cAAcpL,SAAS,IAAI,IAAIoL,cAAcpL,MAAM,MAAM,EAAE,GAAA,CAE7E;AAAA,IAAA,EAAA,CACJ;AAAA,EAAA,GACJ;AAER;AC1OO,SAAA+M,iBAAA1P,IAAA;AAAA,QAAAC,IAAAC,EAAA,EAAA;AAA0B,QAAA;AAAA,IAAAuN;AAAAA,IAAAC;AAAAA,EAAAA,IAAA1N;AAI7B,QAAAG,aAAmBR,gBAAAA;AACnB,QAAA,CAAAgQ,kBAAAC,mBAAA,IAAgD3O,cAAc;AAC9D,QAAA,CAAAuH,UAAAqH,WAAA,IAAgC5O,SAA0B,MAAM;AAC3C6O,aAA6B;AAAC,MAAAzP;AAAA,MAAAJ,SAAAE,YAAA;AAElBE,SAAA2G,CAAAA,UAAA;AAC7B7G,iBAAU4G,aAAcC,SAAS,EAAE;AAAA,IAAC;AACvC/G,WAAAE;AAAAF,WAAAI;AAAAA,EAAA,OAAA;AAAAA,SAAAJ,EAAA,CAAA;AAAA,EAAA;AAFD,QAAA8P,eAAqB1P;AAEJ,MAAAuI;AAAA,MAAA3I,EAAA,CAAA,MAAAwK,uBAAAC,IAAA,2BAAA,GAAA;AAEqB9B,SAAAA,MAAA;AAClCgH,8BAAwB;AAAA,IAAC;AAC5B3P,WAAA2I;AAAAA,EAAA,OAAA;AAAAA,SAAA3I,EAAA,CAAA;AAAA,EAAA;AAFD,QAAA+P,oBAA0BpH;AAEnB,MAAAY;AAAA,MAAAvJ,SAAAE,YAAA;AAE8BqJ,gBAAA0E,UAAA;AAAA,iBAC5B9J,QAAc8J,OAAK;AAAA,cACd/N,WAAUgE,WAAYC,IAAI;AAAA,MAAC;AAErCwL,+BAAyB;AAAA,IAAC;AAC7B3P,WAAAE;AAAAF,WAAAuJ;AAAAA,EAAA,OAAA;AAAAA,SAAAvJ,EAAA,CAAA;AAAA,EAAA;AALD,QAAA8O,mBAAyBvF;AAKR,MAAAE;AAAA,MAAAzJ,SAAAE,YAAA;AAEiBuJ,SAAAA,MAAA;AAC9BvJ,iBAAUiC,cAAAA;AAAAA,IAAgB;AAC7BnC,WAAAE;AAAAF,WAAAyJ;AAAAA,EAAA,OAAA;AAAAA,SAAAzJ,EAAA,CAAA;AAAA,EAAA;AAFD,QAAAgQ,gBAAsBvG;AAEL,MAAAC;AAAA,MAAA1J,EAAA,CAAA,MAAAwK,uBAAAC,IAAA,2BAAA,GAAA;AAUOf,6BAAC,YAAA,EAAmB,SAAA,MAAe,WAAA,iBAAgB,UAAA,iBAEnD;AAAa1J,WAAA0J;AAAAA,EAAA,OAAA;AAAAA,SAAA1J,EAAA,CAAA;AAAA,EAAA;AAAA,MAAA6J;AAAA,MAAA7J,EAAA,CAAA,MAAAE,WAAAoH,YAAA;AACZuC,SAAA3J,WAAUoH,eAAA7H,UACP,qBAAC,cACW,SAAA,WACE,WAAA,6EAETS,UAAAA;AAAAA,MAAAA,WAAUoH;AAAAA,MAAY;AAAA,IAAA,GAC3B;AACHtH,MAAA,CAAA,IAAAE,WAAAoH;AAAAtH,WAAA6J;AAAAA,EAAA,OAAA;AAAAA,SAAA7J,EAAA,CAAA;AAAA,EAAA;AAAA,MAAA8J;AAAA,MAAA9J,UAAA6J,IAAA;AAXLC,SAAA,qBAAA,OAAA,EAAe,WAAA,2BACXJ,UAAAA;AAAAA,MAAAA;AAAAA,MAGCG;AAAAA,IAAAA,GAQL;AAAM7J,YAAA6J;AAAA7J,YAAA8J;AAAAA,EAAA,OAAA;AAAAA,SAAA9J,EAAA,EAAA;AAAA,EAAA;AAAA,MAAA+J;AAAA,MAAA/J,UAAA8P,cAAA;AAGF/F,6BAAC,WAAA,EACiB+F,cAAAA,cACF,aAAA,oBACF,WAAA,kBAAgB;AAC5B9P,YAAA8P;AAAA9P,YAAA+J;AAAAA,EAAA,OAAA;AAAAA,SAAA/J,EAAA,EAAA;AAAA,EAAA;AAAA,MAAAgK;AAAA,MAAAhK,EAAA,EAAA,MAAAwK,uBAAAC,IAAA,2BAAA,GAAA;AAMmBT,SAAAA,MAAM4F,YAAY,MAAM;AAAC5P,YAAAgK;AAAAA,EAAA,OAAA;AAAAA,SAAAhK,EAAA,EAAA;AAAA,EAAA;AAE9B,QAAAiK,MAAA1B,aAAa,UAAU;AAAkD,MAAA6B;AAAA,MAAApK,UAAAiK,KAAA;AADlEG,UAAAT,IACPM,GACJ;AAACjK,YAAAiK;AAAAjK,YAAAoK;AAAAA,EAAA,OAAA;AAAAA,UAAApK,EAAA,EAAA;AAAA,EAAA;AAAA,MAAAqK;AAAA,MAAArK,EAAA,EAAA,MAAAwK,uBAAAC,IAAA,2BAAA,GAAA;AAEDJ,8BAAC,UAAA,EAAc,MAAA,QAAA,CAAO;AAAErK,YAAAqK;AAAAA,EAAA,OAAA;AAAAA,UAAArK,EAAA,EAAA;AAAA,EAAA;AAAA,MAAAsK;AAAA,MAAAtK,UAAAoK,KAAA;AAPhCE,UAAA,oBAAC,SAAA,EAAc,OAAA,aACX,UAAA,oBAAC,YAAA,EACY,SAAAN,IACE,WAAAI,KAIXC,UAAAA,IAAAA,CACJ,GACJ;AAAUrK,YAAAoK;AAAApK,YAAAsK;AAAAA,EAAA,OAAA;AAAAA,UAAAtK,EAAA,EAAA;AAAA,EAAA;AAAA,MAAAuK;AAAA,MAAAvK,EAAA,EAAA,MAAAwK,uBAAAC,IAAA,2BAAA,GAAA;AAGOF,UAAAA,MAAMqF,YAAY,MAAM;AAAC5P,YAAAuK;AAAAA,EAAA,OAAA;AAAAA,UAAAvK,EAAA,EAAA;AAAA,EAAA;AAE9B,QAAA0K,MAAAnC,aAAa,UAAU;AAAkD,MAAA0H;AAAA,MAAAjQ,UAAA0K,KAAA;AADlEuF,UAAAtG,IACPe,GACJ;AAAC1K,YAAA0K;AAAA1K,YAAAiQ;AAAAA,EAAA,OAAA;AAAAA,UAAAjQ,EAAA,EAAA;AAAA,EAAA;AAAA,MAAAkQ;AAAA,MAAAlQ,EAAA,EAAA,MAAAwK,uBAAAC,IAAA,2BAAA,GAAA;AAEDyF,UAAA,oBAAC,MAAA,EAAa,SAAA,QAAY,MAAA,SAAO;AAAElQ,YAAAkQ;AAAAA,EAAA,OAAA;AAAAA,UAAAlQ,EAAA,EAAA;AAAA,EAAA;AAAA,MAAAmQ;AAAA,MAAAnQ,UAAAiQ,KAAA;AAP3CE,UAAA,oBAAC,SAAA,EAAc,OAAA,aACX,UAAA,oBAAC,YAAA,EACY,SAAA5F,KACE,WAAA0F,KAIXC,UAAAA,IAAAA,CACJ,GACJ;AAAUlQ,YAAAiQ;AAAAjQ,YAAAmQ;AAAAA,EAAA,OAAA;AAAAA,UAAAnQ,EAAA,EAAA;AAAA,EAAA;AAAA,MAAAoQ;AAAA,MAAApQ,EAAA,EAAA,MAAAsK,OAAAtK,UAAAmQ,KAAA;AArBdC,UAAA,qBAAA,OAAA,EACc,WAAA,uGACV9F,UAAAA;AAAAA,MAAAA;AAAAA,MAUA6F;AAAAA,IAAAA,GAUJ;AAAMnQ,YAAAsK;AAAAtK,YAAAmQ;AAAAnQ,YAAAoQ;AAAAA,EAAA,OAAA;AAAAA,UAAApQ,EAAA,EAAA;AAAA,EAAA;AAAA,MAAAqQ;AAAA,MAAArQ,EAAA,EAAA,MAAAwK,uBAAAC,IAAA,2BAAA,GAAA;AAIE4F,8BAAC,aAAA,EAAiB,MAAA,QAAA,CAAO;AAAErQ,YAAAqQ;AAAAA,EAAA,OAAA;AAAAA,UAAArQ,EAAA,EAAA;AAAA,EAAA;AAAA,MAAAsQ;AAAA,MAAAtQ,UAAAE,WAAAY,WAAAd,UAAAgQ,eAAA;AAFnCM,UAAA,oBAAC,SAAA,EAAc,OAAA,WACX,UAAA,oBAAC,YAAA,EAAoBN,wBAAyB,UAAA9P,WAAUY,SACpDuP,UAAAA,IAAAA,CACJ,GACJ;AAAUrQ,MAAA,EAAA,IAAAE,WAAAY;AAAAd,YAAAgQ;AAAAhQ,YAAAsQ;AAAAA,EAAA,OAAA;AAAAA,UAAAtQ,EAAA,EAAA;AAAA,EAAA;AAAA,MAAAuQ;AAAA,MAAAvQ,EAAA,EAAA,MAAAwK,uBAAAC,IAAA,2BAAA,GAAA;AAEV8F,UAAA,qBAAC,QAAA,EACW,SAAA,UACCR,SAAAA,mBAET,UAAA;AAAA,MAAA,oBAAC,SAAA,EAAa,MAAA,QAAA,CAAO;AAAA,MAAE;AAAA,IAAA,GAE3B;AAAS/P,YAAAuQ;AAAAA,EAAA,OAAA;AAAAA,UAAAvQ,EAAA,EAAA;AAAA,EAAA;AAAA,MAAAwQ;AAAA,MAAAxQ,EAAA,EAAA,MAAAoQ,OAAApQ,UAAAsQ,OAAAtQ,EAAA,EAAA,MAAA+J,IAAA;AA3CbyG,wCAAe,WAAA,4CACXzG,UAAAA;AAAAA,MAAAA;AAAAA,MAMAqG;AAAAA,MAwBAE;AAAAA,MAMAC;AAAAA,IAAAA,GAOJ;AAAMvQ,YAAAoQ;AAAApQ,YAAAsQ;AAAAtQ,YAAA+J;AAAA/J,YAAAwQ;AAAAA,EAAA,OAAA;AAAAA,UAAAxQ,EAAA,EAAA;AAAA,EAAA;AAAA,MAAAyQ;AAAA,MAAAzQ,EAAA,EAAA,MAAAwQ,OAAAxQ,UAAA8J,IAAA;AA9DlB2G,uCACc,WAAA,qHACV,UAAA,oBAAC,WAAA,EAAmB,UAAA,OAAgB,WAAA,QAChC,UAAA,qBAAA,OAAA,EAAe,WAAA,+EACX3G,UAAAA;AAAAA,MAAAA;AAAAA,MAcA0G;AAAAA,IAAAA,EAAAA,CA6CJ,GACJ,GACJ;AAAMxQ,YAAAwQ;AAAAxQ,YAAA8J;AAAA9J,YAAAyQ;AAAAA,EAAA,OAAA;AAAAA,UAAAzQ,EAAA,EAAA;AAAA,EAAA;AAAA,MAAA0Q;AAAA,MAAA1Q,EAAA,EAAA,MAAAE,cAAAF,UAAAgQ,iBAAAhQ,EAAA,EAAA,MAAAuI,UAAA;AAGNmI,UAAA,oBAAA,OAAA,EAAe,WAAA,wBACX,UAAA,oBAAC,WAAA,EAAmB,UAAA,OAAgB,WAAA,QAC/BxQ,UAAAA,WAAUY,WAAYZ,WAAUiB,OAAAuB,eAC7B,oBAAA,OAAA,EAAe,WAAA,yCACX,UAAA,oBAAC,kBAAA,CAAA,IACL,IACAxC,WAAUe,QACV,qBAAA,OAAA,EAAe,WAAA,wDACX,UAAA;AAAA,MAAA,qBAAC,YAAA,EAAqB,WAAA,gBAAe,UAAA;AAAA,QAAA;AAAA,QACVf,WAAUe,MAAAiL;AAAAA,MAAAA,GACrC;AAAA,MACA,oBAAC,QAAA,EAAgB8D,SAAAA,eAAe,UAAA,YAAA,CAEhC;AAAA,IAAA,EAAA,CACJ,IACA9P,WAAUiB,OAAAuB,WAAA,IACV,qBAAA,OAAA,EAAe,WAAA,wDACX,UAAA;AAAA,MAAA,oBAAC,YAAA,EAAqB,WAAA,2BAA0B,UAAA,uBAEhD;AAAA,MACA,qBAAC,QAAA,EAAgBqN,SAAAA,mBACb,UAAA;AAAA,QAAA,oBAAC,SAAA,EAAa,MAAA,QAAA,CAAO;AAAA,QAAE;AAAA,MAAA,EAAA,CAE3B;AAAA,IAAA,EAAA,CACJ,IAEA,6BAAgB,WAAApG,IACZpB,aAAa,SACP,wEACA,qBACV,GACKrI,UAAAA,WAAUiB,OAAA2B,IAAAnB,CAAAA,8BACN,gBAAA,EAEUA,OACG4G,UACD,SAAA,MAAMrI,WAAU8G,YAAarF,KAAK,GACjC,UAAAzB,WAAUmB,eAAA6B,OAAuBvB,MAAKuB,MAJ3CvB,MAAKuB,EAIyC,CAE1D,EAAA,CACL,GAER,GACJ;AAAMlD,YAAAE;AAAAF,YAAAgQ;AAAAhQ,YAAAuI;AAAAvI,YAAA0Q;AAAAA,EAAA,OAAA;AAAAA,UAAA1Q,EAAA,EAAA;AAAA,EAAA;AAAA,MAAA2Q;AAAA,MAAA3Q,UAAAE,YAAA;AAGLyQ,UAAAzQ,WAAUmB,iBACP,oBAAC,qBACU,OAAAnB,WAAUmB,eACR,SAAA,MAAMnB,WAAU8G,YAAAvH,MAAsB,GACrC,UAAAS,WAAUmG,aACV,UAAAnG,WAAU4F,aAAY;AAEvC9F,YAAAE;AAAAF,YAAA2Q;AAAAA,EAAA,OAAA;AAAAA,UAAA3Q,EAAA,EAAA;AAAA,EAAA;AAAA,MAAA4Q;AAAA,MAAA5Q,EAAA,EAAA,MAAAwK,uBAAAC,IAAA,2BAAA,GAAA;AAKYmG,UAAAA,MAAMjB,yBAAyB;AAAC3P,YAAA4Q;AAAAA,EAAA,OAAA;AAAAA,UAAA5Q,EAAA,EAAA;AAAA,EAAA;AAAA,MAAA6Q;AAAA,MAAA7Q,EAAA,EAAA,MAAAyN,qBAAAzN,EAAA,EAAA,MAAA8O,oBAAA9O,EAAA,EAAA,MAAAwN,eAAAxN,UAAA0P,kBAAA;AAF7CmB,UAAA,oBAAC,qBACSnB,MAAAA,kBACG,SAAAkB,KACC9B,UAAAA,kBACGtB,aACMC,kBAAAA,CAAiB;AACtCzN,YAAAyN;AAAAzN,YAAA8O;AAAA9O,YAAAwN;AAAAxN,YAAA0P;AAAA1P,YAAA6Q;AAAAA,EAAA,OAAA;AAAAA,UAAA7Q,EAAA,EAAA;AAAA,EAAA;AAAA,MAAA8Q;AAAA,MAAA9Q,EAAA,EAAA,MAAAyQ,OAAAzQ,EAAA,EAAA,MAAA0Q,OAAA1Q,EAAA,EAAA,MAAA2Q,OAAA3Q,UAAA6Q,KAAA;AApINC,wCAAe,WAAA,wCAEXL,UAAAA;AAAAA,MAAAA;AAAAA,MAoEAC;AAAAA,MA8CCC;AAAAA,MAUDE;AAAAA,IAAAA,GAOJ;AAAM7Q,YAAAyQ;AAAAzQ,YAAA0Q;AAAA1Q,YAAA2Q;AAAA3Q,YAAA6Q;AAAA7Q,YAAA8Q;AAAAA,EAAA,OAAA;AAAAA,UAAA9Q,EAAA,EAAA;AAAA,EAAA;AAAA,SArIN8Q;AAqIM;ACvLd,MAAMC,uBAAuB;AAC7B,MAAMC,0BAA0B;AAKhC,MAAMC,4BAA4BzR,cAAyC,IAAI;AAE/E,SAAA0R,wBAAA;AACI,QAAAC,SAAevR,WAAAqR,yBAAoC;AAAE,MAAA,CAChDE,QAAM;AAAA,UAAA,IAAAtR,MACS,sEAAsE;AAAA,EAAA;AAAA,SAEnFsR;AAAM;AAMjB,SAAAC,2BAAA;AAAA,QAAApR,IAAAC,EAAA,EAAA;AACI,QAAAkR,SAAeD,sBAAAA;AAIE,QAAAnR,KAAAoR,OAAM1Q,eAAAsQ;AACH,QAAA3Q,KAAA+Q,OAAMzQ,kBAAAsQ;AAA0C,MAAArI;AAAA,MAAA3I,EAAA,CAAA,MAAAmR,OAAAxQ,UAAAX,EAAA,CAAA,MAAAmR,OAAA3Q,sBAAAR,EAAA,CAAA,MAAAmR,OAAA5Q,iBAAAP,EAAA,CAAA,MAAAmR,OAAAtQ,iBAAAb,SAAAmR,OAAAvQ,kBAAAZ,EAAA,CAAA,MAAAD,MAAAC,SAAAI,IAAA;AAJvBuI,SAAA;AAAA,MAAApI,eAC1B4Q,OAAM5Q;AAAAA,MAAAC,oBACD2Q,OAAM3Q;AAAAA,MAAAC,aACbV;AAAAA,MAA0CW,gBACvCN;AAAAA,MAAgDO,QACxDwQ,OAAMxQ;AAAAA,MAAAC,gBACEuQ,OAAMvQ;AAAAA,MAAAC,eACPsQ,OAAMtQ;AAAAA,IAAAA;AACxBb,MAAA,CAAA,IAAAmR,OAAAxQ;AAAAX,MAAA,CAAA,IAAAmR,OAAA3Q;AAAAR,MAAA,CAAA,IAAAmR,OAAA5Q;AAAAP,MAAA,CAAA,IAAAmR,OAAAtQ;AAAAb,MAAA,CAAA,IAAAmR,OAAAvQ;AAAAZ,WAAAD;AAAAC,WAAAI;AAAAJ,WAAA2I;AAAAA,EAAA,OAAA;AAAAA,SAAA3I,EAAA,CAAA;AAAA,EAAA;AARD,QAAAE,aAAmBI,0BAA0BqI,EAQ5C;AAAE,MAAAY;AAAA,MAAAvJ,EAAA,CAAA,MAAAmR,OAAA1D,qBAAAzN,EAAA,CAAA,MAAAmR,OAAA3D,aAAA;AAIKjE,6BAAC,kBAAA,EACgB,aAAA4H,OAAM3D,aACA,mBAAA2D,OAAM1D,mBAAkB;AAC7CzN,MAAA,CAAA,IAAAmR,OAAA1D;AAAAzN,MAAA,CAAA,IAAAmR,OAAA3D;AAAAxN,YAAAuJ;AAAAA,EAAA,OAAA;AAAAA,SAAAvJ,EAAA,EAAA;AAAA,EAAA;AAAA,MAAAyJ;AAAA,MAAAzJ,EAAA,EAAA,MAAAE,cAAAF,UAAAuJ,IAAA;AAJNE,SAAA,oBAAC,sBAAA,EAAiCvJ,YAC9BqJ,UAAAA,IAIJ;AAAuBvJ,YAAAE;AAAAF,YAAAuJ;AAAAvJ,YAAAyJ;AAAAA,EAAA,OAAA;AAAAA,SAAAzJ,EAAA,EAAA;AAAA,EAAA;AAAA,SALvByJ;AAKuB;AAO/B,SAAS4H,iBAA0B;AAC/B,SAAO;AAAA,IACH9O,MAAM;AAAA,IACN8B,MAAM;AAAA,IACNiN,aAAa;AAAA,IACbC,OAAO;AAAA,IACPC,MAAM;AAAA,IACNC,0BAAO,0BAAA,CAAA,CAAwB;AAAA,EAAA;AAEvC;AAGA,MAAMC,aAAaL,eAAAA;AAoBZ,SAASM,sBAAsBC,OAA+C;AACjF,SAAOC,QAAQ,OAAO;AAAA,IAClBnL,KAAK;AAAA,IACLoL,OAAO,CAACJ,UAAU;AAAA,IAClBK,UAAU;AAAA,MACNC,WAAWA,CAAC;AAAA,QAAE7R;AAAAA,MAAAA,MACV,oBAAC,0BAA0B,UAA1B,EAAmC,OAAOyR,OACtCzR,SAAAA,CACL;AAAA,IAAA;AAAA,EAER,IACwB,CAAA,CAAE;AAClC;AC/EO,SAAA8R,iBAAAlS,IAAA;AAAA,QAAAC,IAAAC,EAAA,CAAA;AAA0B,QAAA;AAAA,IAAAsR;AAAAA,EAAAA,IAAAxR;AAAgC,MAEzDwR,UAAU,SAAO;AAAA,WAAA;AAAA,EAAA;AAAA,MAAAnR;AAAA,MAAAJ,EAAA,CAAA,MAAAwK,uBAAAC,IAAA,2BAAA,GAAA;AAKErK,SAAAuJ,IACP,sBACA,gEACA,kCACA,qBACJ;AAAC3J,WAAAI;AAAAA,EAAA,OAAA;AAAAA,SAAAJ,EAAA,CAAA;AAAA,EAAA;AAAA,MAAA2I;AAAA,MAAA3I,EAAA,CAAA,MAAAwK,uBAAAC,IAAA,2BAAA,GAAA;AAGG9B,SAAA,oBAAA,OAAA,EAAgB,WAAAgB,IACZ,wBACA,oCACA,kCACJ,GACI,UAAA,oBAAC,WAAA,EAAoB,WAAA,gBAAoB,MAAA,UAAQ,GACrD;AAAM3J,WAAA2I;AAAAA,EAAA,OAAA;AAAAA,SAAA3I,EAAA,CAAA;AAAA,EAAA;AAAA,MAAAuJ;AAAA,MAAAvJ,EAAA,CAAA,MAAAwK,uBAAAC,IAAA,2BAAA,GAAA;AAhBlBlB,6BAAC,MAAA,EAAQ,IAAA,UAAmB,WAAA,gBACxB,UAAA,oBAAC,MAAA,EACc,WAAAnJ,IAOX,UAAA,8BAAe,WAAA,2BACXuI,UAAAA;AAAAA,MAAAA;AAAAA,MAOA,qBAAA,OAAA,EAAe,WAAA,UACX,UAAA;AAAA,QAAA,oBAAC,YAAA,EAAmB,SAAA,aAAsB,WAAA,eAAc,UAAA,iBAExD;AAAA,4BACC,YAAA,EACW,SAAA,WACE,WAAA,wDACb,UAAA,0BAAA,CAED;AAAA,MAAA,EAAA,CACJ;AAAA,IAAA,EAAA,CACJ,GACJ,GACJ;AAAO3I,WAAAuJ;AAAAA,EAAA,OAAA;AAAAA,SAAAvJ,EAAA,CAAA;AAAA,EAAA;AAAA,SA9BPuJ;AA8BO;"}