From 1a17b547dc8b9ff1cbbbe2b8f41cb001a915e30d Mon Sep 17 00:00:00 2001 From: maziggy Date: Mon, 8 Dec 2025 14:52:16 +0000 Subject: [PATCH] - Added maintenance interval type clendar days - Minor improvements to maintenance module --- backend/app/api/routes/maintenance.py | 49 +- backend/app/core/database.py | 18 + backend/app/models/maintenance.py | 4 + backend/app/schemas/maintenance.py | 19 +- frontend/src/api/client.ts | 9 +- frontend/src/pages/MaintenancePage.tsx | 695 +- static/assets/index-6YKRUSex.js | 8611 ++++++++++++++++++++++++ static/assets/index-BOLoyzZ9.js | 8611 ------------------------ static/assets/index-BP1T2ML7.css | 1 + static/assets/index-DO3k-CBG.css | 1 - static/index.html | 4 +- 11 files changed, 9169 insertions(+), 8853 deletions(-) create mode 100644 static/assets/index-6YKRUSex.js delete mode 100644 static/assets/index-BOLoyzZ9.js create mode 100644 static/assets/index-BP1T2ML7.css delete mode 100644 static/assets/index-DO3k-CBG.css diff --git a/backend/app/api/routes/maintenance.py b/backend/app/api/routes/maintenance.py index e461b22ee..aa88e4c44 100644 --- a/backend/app/api/routes/maintenance.py +++ b/backend/app/api/routes/maintenance.py @@ -136,6 +136,7 @@ async def create_maintenance_type( name=data.name, description=data.description, default_interval_hours=data.default_interval_hours, + interval_type=data.interval_type, icon=data.icon, is_system=False, ) @@ -225,11 +226,16 @@ async def _get_printer_maintenance_internal( due_count = 0 warning_count = 0 + now = datetime.utcnow() + for maint_type in all_types: item = existing_items.get(maint_type.id) + default_interval_type = getattr(maint_type, 'interval_type', 'hours') or 'hours' if item: interval = item.custom_interval_hours or maint_type.default_interval_hours + # Use custom interval type if set, otherwise use type's default + interval_type = getattr(item, 'custom_interval_type', None) or default_interval_type enabled = item.enabled last_performed_hours = item.last_performed_hours last_performed_at = item.last_performed_at @@ -246,15 +252,41 @@ async def _get_printer_maintenance_internal( await db.flush() interval = maint_type.default_interval_hours + interval_type = default_interval_type enabled = True last_performed_hours = 0.0 last_performed_at = None item_id = item.id - hours_since = total_hours - last_performed_hours - hours_until = interval - hours_since - is_due = hours_until <= 0 - is_warning = hours_until <= (interval * 0.1) and not is_due + # Calculate status based on interval type + if interval_type == "days": + # Time-based: calculate days since last performed + if last_performed_at: + days_since = (now - last_performed_at).total_seconds() / 86400.0 + else: + # Never performed - consider it due + days_since = interval + 1 + + days_until = interval - days_since + is_due = days_until <= 0 + is_warning = days_until <= (interval * 0.1) and not is_due + + # For compatibility, also set hours values (but they won't be primary) + hours_since = total_hours - last_performed_hours + hours_until = 0 # Not applicable for time-based + else: + # Print-hours based (default) + hours_since = total_hours - last_performed_hours + hours_until = interval - hours_since + is_due = hours_until <= 0 + is_warning = hours_until <= (interval * 0.1) and not is_due + + # Calculate days for reference + if last_performed_at: + days_since = (now - last_performed_at).total_seconds() / 86400.0 + else: + days_since = None + days_until = None if enabled: if is_due: @@ -271,9 +303,12 @@ async def _get_printer_maintenance_internal( maintenance_type_icon=maint_type.icon, enabled=enabled, interval_hours=interval, + interval_type=interval_type, current_hours=total_hours, hours_since_maintenance=hours_since, hours_until_due=hours_until, + days_since_maintenance=days_since if interval_type == "days" else None, + days_until_due=days_until if interval_type == "days" else None, is_due=is_due, is_warning=is_warning, last_performed_at=last_performed_at, @@ -389,6 +424,7 @@ async def perform_maintenance( # Calculate status interval = item.custom_interval_hours or item.maintenance_type.default_interval_hours + interval_type = getattr(item.maintenance_type, 'interval_type', 'hours') or 'hours' hours_since = current_hours - item.last_performed_hours hours_until = interval - hours_since @@ -401,9 +437,12 @@ async def perform_maintenance( maintenance_type_icon=item.maintenance_type.icon, enabled=item.enabled, interval_hours=interval, + interval_type=interval_type, current_hours=current_hours, hours_since_maintenance=hours_since, - hours_until_due=hours_until, + hours_until_due=hours_until if interval_type == "hours" else 0, + days_since_maintenance=0 if interval_type == "days" else None, + days_until_due=interval if interval_type == "days" else None, is_due=False, is_warning=False, last_performed_at=item.last_performed_at, diff --git a/backend/app/core/database.py b/backend/app/core/database.py index c7fb3503a..eee12f62a 100644 --- a/backend/app/core/database.py +++ b/backend/app/core/database.py @@ -109,3 +109,21 @@ async def run_migrations(conn): except Exception: # Column already exists pass + + # Migration: Add interval_type column to maintenance_types + try: + await conn.execute(text( + "ALTER TABLE maintenance_types ADD COLUMN interval_type VARCHAR(20) DEFAULT 'hours'" + )) + except Exception: + # Column already exists + pass + + # Migration: Add custom_interval_type column to printer_maintenance + try: + await conn.execute(text( + "ALTER TABLE printer_maintenance ADD COLUMN custom_interval_type VARCHAR(20)" + )) + except Exception: + # Column already exists + pass diff --git a/backend/app/models/maintenance.py b/backend/app/models/maintenance.py index 4e1fc45d2..ce9d6d239 100644 --- a/backend/app/models/maintenance.py +++ b/backend/app/models/maintenance.py @@ -15,6 +15,8 @@ class MaintenanceType(Base): name: Mapped[str] = mapped_column(String(100)) description: Mapped[str | None] = mapped_column(Text) default_interval_hours: Mapped[float] = mapped_column(Float, default=100.0) + # Interval type: "hours" (print hours) or "days" (calendar days) + interval_type: Mapped[str] = mapped_column(String(20), default="hours") icon: Mapped[str | None] = mapped_column(String(50)) # Icon name for UI is_system: Mapped[bool] = mapped_column(Boolean, default=False) # Pre-defined vs custom created_at: Mapped[datetime] = mapped_column( @@ -37,6 +39,8 @@ class PrinterMaintenance(Base): # Custom interval for this printer (overrides default if set) custom_interval_hours: Mapped[float | None] = mapped_column(Float, nullable=True) + # Custom interval type for this printer (overrides default if set) + custom_interval_type: Mapped[str | None] = mapped_column(String(20), nullable=True) # Tracking enabled: Mapped[bool] = mapped_column(Boolean, default=True) diff --git a/backend/app/schemas/maintenance.py b/backend/app/schemas/maintenance.py index e76790e39..878a04404 100644 --- a/backend/app/schemas/maintenance.py +++ b/backend/app/schemas/maintenance.py @@ -9,6 +9,8 @@ class MaintenanceTypeBase(BaseModel): name: str = Field(..., min_length=1, max_length=100) description: str | None = None default_interval_hours: float = Field(default=100.0, ge=1.0) + # "hours" = print hours, "days" = calendar days + interval_type: str = Field(default="hours", pattern="^(hours|days)$") icon: str | None = None @@ -20,6 +22,7 @@ class MaintenanceTypeUpdate(BaseModel): name: str | None = None description: str | None = None default_interval_hours: float | None = Field(default=None, ge=1.0) + interval_type: str | None = Field(default=None, pattern="^(hours|days)$") icon: str | None = None @@ -46,6 +49,7 @@ class PrinterMaintenanceCreate(PrinterMaintenanceBase): class PrinterMaintenanceUpdate(BaseModel): custom_interval_hours: float | None = None + custom_interval_type: str | None = Field(default=None, pattern="^(hours|days)$") enabled: bool | None = None @@ -94,12 +98,19 @@ class MaintenanceStatus(BaseModel): maintenance_type_name: str maintenance_type_icon: str | None enabled: bool - interval_hours: float # custom or default + # Interval configuration + interval_hours: float # custom or default (hours for print-based, days for time-based) + interval_type: str # "hours" or "days" + # For print-hour based maintenance current_hours: float # total print hours for printer hours_since_maintenance: float # current - last_performed - hours_until_due: float # interval - hours_since - is_due: bool # hours_until_due <= 0 - is_warning: bool # hours_until_due <= 10% of interval + hours_until_due: float # interval - hours_since (for hours type) + # For time-based maintenance + days_since_maintenance: float | None # days since last performed + days_until_due: float | None # for days type + # Status flags + is_due: bool # hours_until_due <= 0 OR days_until_due <= 0 + is_warning: bool # within 10% of interval last_performed_at: datetime | None diff --git a/frontend/src/api/client.ts b/frontend/src/api/client.ts index fda2350ad..cd5e05cdc 100644 --- a/frontend/src/api/client.ts +++ b/frontend/src/api/client.ts @@ -721,6 +721,7 @@ export interface MaintenanceType { name: string; description: string | null; default_interval_hours: number; + interval_type: 'hours' | 'days'; // "hours" = print hours, "days" = calendar days icon: string | null; is_system: boolean; created_at: string; @@ -730,6 +731,7 @@ export interface MaintenanceTypeCreate { name: string; description?: string | null; default_interval_hours?: number; + interval_type?: 'hours' | 'days'; icon?: string | null; } @@ -741,10 +743,13 @@ export interface MaintenanceStatus { maintenance_type_name: string; maintenance_type_icon: string | null; enabled: boolean; - interval_hours: number; + interval_hours: number; // For hours type: print hours; for days type: number of days + interval_type: 'hours' | 'days'; current_hours: number; hours_since_maintenance: number; hours_until_due: number; + days_since_maintenance: number | null; // For days type + days_until_due: number | null; // For days type is_due: boolean; is_warning: boolean; last_performed_at: string | null; @@ -1274,7 +1279,7 @@ export const api = { getMaintenanceOverview: () => request('/maintenance/overview'), getPrinterMaintenance: (printerId: number) => request(`/maintenance/printers/${printerId}`), - updateMaintenanceItem: (itemId: number, data: { custom_interval_hours?: number | null; enabled?: boolean }) => + updateMaintenanceItem: (itemId: number, data: { custom_interval_hours?: number | null; custom_interval_type?: 'hours' | 'days' | null; enabled?: boolean }) => request(`/maintenance/items/${itemId}`, { method: 'PATCH', body: JSON.stringify(data), diff --git a/frontend/src/pages/MaintenancePage.tsx b/frontend/src/pages/MaintenancePage.tsx index 291d4d232..48721f6b4 100644 --- a/frontend/src/pages/MaintenancePage.tsx +++ b/frontend/src/pages/MaintenancePage.tsx @@ -18,9 +18,23 @@ import { Cable, Edit3, RotateCcw, + Calendar, + Timer, + Cog, + Fan, + Zap, + Wind, + Thermometer, + Layers, + Box, + Target, + RefreshCw, + Settings, + Filter, + CircleDot, } from 'lucide-react'; import { api } from '../api/client'; -import type { MaintenanceStatus, PrinterMaintenanceOverview } from '../api/client'; +import type { MaintenanceStatus, PrinterMaintenanceOverview, MaintenanceType } from '../api/client'; import { Card, CardContent } from '../components/Card'; import { Button } from '../components/Button'; import { Toggle } from '../components/Toggle'; @@ -35,6 +49,20 @@ const iconMap: Record> = { Square, Cable, Wrench, + Calendar, + Timer, + Cog, + Fan, + Zap, + Wind, + Thermometer, + Layers, + Box, + Target, + RefreshCw, + Settings, + Filter, + CircleDot, }; function getIcon(iconName: string | null) { @@ -42,27 +70,37 @@ function getIcon(iconName: string | null) { return iconMap[iconName] || Wrench; } -function formatHours(hours: number): string { - if (hours < 1) { - return `${Math.round(hours * 60)}m`; +function formatDuration(value: number, type: 'hours' | 'days'): string { + if (type === 'days') { + if (value < 1) return 'Today'; + if (value === 1) return '1 day'; + if (value < 7) return `${Math.round(value)} days`; + if (value < 30) return `${Math.round(value / 7)} weeks`; + return `${Math.round(value / 30)} months`; + } else { + if (value < 1) return `${Math.round(value * 60)}m`; + if (value < 10) return `${value.toFixed(1)}h`; + return `${Math.round(value)}h`; } - return `${hours.toFixed(1)}h`; } -function formatHoursLong(hours: number): string { - const h = Math.floor(hours); - const m = Math.round((hours - h) * 60); - if (h === 0) { - return `${m} minutes`; +function formatIntervalLabel(value: number, type: 'hours' | 'days'): string { + if (type === 'days') { + if (value === 1) return '1 day'; + if (value === 7) return '1 week'; + if (value === 14) return '2 weeks'; + if (value === 30) return '1 month'; + if (value === 60) return '2 months'; + if (value === 90) return '3 months'; + if (value === 180) return '6 months'; + if (value === 365) return '1 year'; + return `${value} days`; } - if (m === 0) { - return `${h} hours`; - } - return `${h}h ${m}m`; + return `${value}h`; } -// Simple row for a maintenance item -function MaintenanceRow({ +// Maintenance item card - cleaner, more visual design +function MaintenanceCard({ item, onPerform, onToggle, @@ -72,86 +110,129 @@ function MaintenanceRow({ onToggle: (id: number, enabled: boolean) => void; }) { const Icon = getIcon(item.maintenance_type_icon); + const intervalType = item.interval_type || 'hours'; - const progressPercent = Math.max(0, Math.min(100, - ((item.interval_hours - item.hours_until_due) / item.interval_hours) * 100 - )); + // Calculate progress based on interval type + const getProgress = () => { + if (intervalType === 'days') { + const daysSince = item.days_since_maintenance ?? 0; + return Math.max(0, Math.min(100, (daysSince / item.interval_hours) * 100)); + } + return Math.max(0, Math.min(100, + ((item.interval_hours - item.hours_until_due) / item.interval_hours) * 100 + )); + }; + + const progressPercent = getProgress(); const getStatusColor = () => { if (!item.enabled) return 'text-bambu-gray'; if (item.is_due) return 'text-red-400'; - if (item.is_warning) return 'text-yellow-400'; + if (item.is_warning) return 'text-amber-400'; return 'text-bambu-green'; }; const getProgressColor = () => { if (!item.enabled) return 'bg-bambu-gray/30'; if (item.is_due) return 'bg-red-500'; - if (item.is_warning) return 'bg-yellow-500'; + if (item.is_warning) return 'bg-amber-500'; return 'bg-bambu-green'; }; + const getBgColor = () => { + if (!item.enabled) return 'bg-bambu-dark-secondary/50'; + if (item.is_due) return 'bg-red-500/5 border-red-500/20'; + if (item.is_warning) return 'bg-amber-500/5 border-amber-500/20'; + return 'bg-bambu-dark-secondary border-bambu-dark-tertiary'; + }; + const getStatusText = () => { if (!item.enabled) return 'Disabled'; - if (item.is_due) return `Overdue by ${formatHours(Math.abs(item.hours_until_due))}`; - if (item.is_warning) return `Due in ${formatHours(item.hours_until_due)}`; - return `${formatHours(item.hours_until_due)} left`; + + if (intervalType === 'days') { + const daysUntil = item.days_until_due ?? 0; + if (item.is_due) return `Overdue by ${formatDuration(Math.abs(daysUntil), 'days')}`; + if (item.is_warning) return `Due in ${formatDuration(daysUntil, 'days')}`; + return `${formatDuration(daysUntil, 'days')} left`; + } else { + if (item.is_due) return `Overdue by ${formatDuration(Math.abs(item.hours_until_due), 'hours')}`; + if (item.is_warning) return `Due in ${formatDuration(item.hours_until_due, 'hours')}`; + return `${formatDuration(item.hours_until_due, 'hours')} left`; + } }; return ( -
- {/* Icon & Name */} -
- - - {item.maintenance_type_name} - -
+
+
+ {/* Icon with status indicator */} +
+ + {item.enabled && (item.is_due || item.is_warning) && ( + + )} +
- {/* Progress bar */} -
-
-
+
+

+ {item.maintenance_type_name} +

+ {intervalType === 'days' && ( + + + + )} +
+ + {/* Progress bar */} +
+
+
+
+
+ + {/* Status text */} +
+ {item.is_due && } + {item.is_warning && !item.is_due && } + {!item.is_due && !item.is_warning && item.enabled && } + {getStatusText()} +
+
+ + {/* Actions */} +
+ onToggle(item.id, checked)} /> +
- - {/* Status */} -
- {item.is_due && } - {item.is_warning && } - {!item.is_due && !item.is_warning && item.enabled && } - {getStatusText()} -
- - {/* Enable/Disable toggle */} - onToggle(item.id, checked)} - /> - - {/* Reset button */} -
); } -// Printer section +// Printer section with improved visual hierarchy function PrinterSection({ overview, onPerform, @@ -163,27 +244,20 @@ function PrinterSection({ onToggle: (id: number, enabled: boolean) => void; onSetHours: (printerId: number, hours: number) => void; }) { - const [expanded, setExpanded] = useState(false); + const [expanded, setExpanded] = useState(true); const [editingHours, setEditingHours] = useState(false); const [hoursInput, setHoursInput] = useState(overview.total_print_hours.toFixed(1)); - // Sort items: first by maintenance_type_id for consistency, then by urgency const sortedItems = [...overview.maintenance_items].sort((a, b) => { - // Primary sort by maintenance type ID for consistent ordering across printers + // Sort by urgency first, then by type + if (a.is_due && !b.is_due) return -1; + if (!a.is_due && b.is_due) return 1; + if (a.is_warning && !b.is_warning) return -1; + if (!a.is_warning && b.is_warning) return 1; return a.maintenance_type_id - b.maintenance_type_id; }); - // Find the next upcoming task (most urgent enabled item) - const nextTask = [...overview.maintenance_items] - .filter(item => item.enabled) - .sort((a, b) => { - // Sort by urgency: overdue first, then warnings, then by hours until due - if (a.is_due && !b.is_due) return -1; - if (!a.is_due && b.is_due) return 1; - if (a.is_warning && !b.is_warning) return -1; - if (!a.is_warning && b.is_warning) return 1; - return a.hours_until_due - b.hours_until_due; - })[0]; + const nextTask = sortedItems.find(item => item.enabled && (item.is_due || item.is_warning)); const handleSaveHours = () => { const hours = parseFloat(hoursInput); @@ -194,54 +268,49 @@ function PrinterSection({ }; return ( - -
- {/* Header row with printer name and status */} -
-
-

{overview.printer_name}

- {overview.due_count > 0 && ( - - - {overview.due_count} overdue - - )} - {overview.warning_count > 0 && ( - - - {overview.warning_count} due soon - - )} - {overview.due_count === 0 && overview.warning_count === 0 && ( - - - All good - - )} + + {/* Header */} +
+
+
+

{overview.printer_name}

+
+ {overview.due_count > 0 && ( + + + {overview.due_count} overdue + + )} + {overview.warning_count > 0 && ( + + + {overview.warning_count} due soon + + )} + {overview.due_count === 0 && overview.warning_count === 0 && ( + + + All good + + )} +
- {/* Info cards row */} -
- {/* Print Hours Card */} -
-
Total Print Time
+ {/* Quick stats row */} +
+ {/* Print Hours */} +
+
+ +
{editingHours ? (
- hours -
- - -
+ hours + +
) : ( )}
- {/* Next Maintenance Card */} -
-
Next Maintenance
- {nextTask ? ( + {/* Divider */} +
+ + {/* Next Maintenance */} + {nextTask && ( +
+
+ {(() => { + const Icon = getIcon(nextTask.maintenance_type_icon); + return ; + })()} +
-
+
{nextTask.maintenance_type_name}
-
- {nextTask.is_due ? ( - <>Overdue by {formatHours(Math.abs(nextTask.hours_until_due))} - ) : ( - <>Due in {formatHours(nextTask.hours_until_due)} - )} +
+ {nextTask.is_due ? 'Overdue' : 'Due soon'}
- ) : ( -
No tasks enabled
- )} -
+
+ )}
+ {/* Maintenance items */} {expanded && ( - -
+ +
{sortedItems.map((item) => ( - ; - onUpdateInterval: (id: number, customInterval: number | null) => void; - onAddType: (data: { name: string; description?: string; default_interval_hours: number; icon?: string }) => void; + types: MaintenanceType[]; + onUpdateInterval: (id: number, data: { custom_interval_hours?: number | null; custom_interval_type?: 'hours' | 'days' | null }) => void; + onAddType: (data: { name: string; description?: string; default_interval_hours: number; interval_type: 'hours' | 'days'; icon?: string }) => void; + onUpdateType: (id: number, data: { name?: string; default_interval_hours?: number; interval_type?: 'hours' | 'days'; icon?: string }) => void; onDeleteType: (id: number) => void; }) { const [editingInterval, setEditingInterval] = useState(null); const [intervalInput, setIntervalInput] = useState(''); + const [intervalTypeInput, setIntervalTypeInput] = useState<'hours' | 'days'>('hours'); const [showAddType, setShowAddType] = useState(false); const [newTypeName, setNewTypeName] = useState(''); const [newTypeInterval, setNewTypeInterval] = useState('100'); + const [newTypeIntervalType, setNewTypeIntervalType] = useState<'hours' | 'days'>('hours'); const [newTypeIcon, setNewTypeIcon] = useState('Wrench'); - const handleSaveInterval = (itemId: number, defaultInterval: number) => { + // Edit type state + const [editingType, setEditingType] = useState(null); + const [editTypeName, setEditTypeName] = useState(''); + const [editTypeInterval, setEditTypeInterval] = useState(''); + const [editTypeIntervalType, setEditTypeIntervalType] = useState<'hours' | 'days'>('hours'); + const [editTypeIcon, setEditTypeIcon] = useState('Wrench'); + + const startEditType = (type: MaintenanceType) => { + setEditingType(type); + setEditTypeName(type.name); + setEditTypeInterval(type.default_interval_hours.toString()); + setEditTypeIntervalType(type.interval_type || 'hours'); + setEditTypeIcon(type.icon || 'Wrench'); + }; + + const handleSaveEditType = () => { + if (editingType && editTypeName.trim() && parseFloat(editTypeInterval) > 0) { + onUpdateType(editingType.id, { + name: editTypeName.trim(), + default_interval_hours: parseFloat(editTypeInterval), + interval_type: editTypeIntervalType, + icon: editTypeIcon, + }); + setEditingType(null); + } + }; + + const handleSaveInterval = (itemId: number, defaultInterval: number, defaultIntervalType: 'hours' | 'days') => { const newInterval = parseFloat(intervalInput); if (!isNaN(newInterval) && newInterval > 0) { const customInterval = Math.abs(newInterval - defaultInterval) < 0.01 ? null : newInterval; - onUpdateInterval(itemId, customInterval); + const customIntervalType = intervalTypeInput !== defaultIntervalType ? intervalTypeInput : null; + onUpdateInterval(itemId, { + custom_interval_hours: customInterval, + custom_interval_type: customIntervalType + }); } setEditingInterval(null); }; @@ -369,10 +464,12 @@ function SettingsSection({ onAddType({ name: newTypeName.trim(), default_interval_hours: parseFloat(newTypeInterval), + interval_type: newTypeIntervalType, icon: newTypeIcon, }); setNewTypeName(''); setNewTypeInterval('100'); + setNewTypeIntervalType('hours'); setShowAddType(false); } }; @@ -391,8 +488,11 @@ function SettingsSection({ {/* Maintenance Types */}
-

Maintenance Types

- @@ -400,33 +500,56 @@ function SettingsSection({ {/* Add custom type form */} {showAddType && ( - -
+ +
-
-
- +
+
+ setNewTypeName(e.target.value)} - className="w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded text-white text-sm" + className="w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white text-sm focus:border-bambu-green focus:outline-none" placeholder="e.g., Replace HEPA Filter" autoFocus />
-
- +
+ + +
+
+ setNewTypeInterval(e.target.value)} - className="w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded text-white text-sm" + className="w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white text-sm focus:border-bambu-green focus:outline-none" min="1" />
+
+
- +
{Object.keys(iconMap).map((iconName) => { const IconComp = iconMap[iconName]; @@ -435,10 +558,10 @@ function SettingsSection({ key={iconName} type="button" onClick={() => setNewTypeIcon(iconName)} - className={`p-2 rounded ${ + className={`p-2 rounded-lg transition-colors ${ newTypeIcon === iconName ? 'bg-bambu-green text-white' - : 'bg-bambu-dark-tertiary text-bambu-gray hover:text-white' + : 'bg-bambu-dark text-bambu-gray hover:text-white hover:bg-bambu-dark-tertiary' }`} > @@ -448,12 +571,16 @@ function SettingsSection({
- - + +
-
+ )} @@ -462,15 +589,19 @@ function SettingsSection({ {/* System types */} {systemTypes.map((type) => { const Icon = getIcon(type.icon); + const intervalType = type.interval_type || 'hours'; return ( -
+
-
+
{type.name}
-
{type.default_interval_hours}h interval
+
+ {intervalType === 'days' ? : } + {formatIntervalLabel(type.default_interval_hours, intervalType)} +
@@ -479,26 +610,101 @@ function SettingsSection({ {/* Custom types */} {customTypes.map((type) => { const Icon = getIcon(type.icon); + const intervalType = type.interval_type || 'hours'; + const isEditing = editingType?.id === type.id; + + if (isEditing) { + return ( +
+
+ setEditTypeName(e.target.value)} + className="w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white text-sm focus:border-bambu-green focus:outline-none" + placeholder="Name" + autoFocus + /> +
+ + setEditTypeInterval(e.target.value)} + className="w-24 px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white text-sm focus:border-bambu-green focus:outline-none" + min="1" + /> +
+
+ {Object.keys(iconMap).map((iconName) => { + const IconComp = iconMap[iconName]; + return ( + + ); + })} +
+
+ + +
+
+
+ ); + } + return ( -
+
-
+
{type.name} - Custom + + Custom + +
+
+ {intervalType === 'days' ? : } + {formatIntervalLabel(type.default_interval_hours, intervalType)}
-
{type.default_interval_hours}h interval
+ @@ -512,60 +718,76 @@ function SettingsSection({ {/* Per-printer interval overrides */} {printerItems.length > 0 && (
-

Interval Overrides

-

- Set custom intervals per printer. -

-
+
+

Interval Overrides

+

Customize intervals for specific printers

+
+
{printerItems.map((printer) => ( -
+

{printer.printerName}

{printer.items.map((item) => { const Icon = getIcon(item.maintenance_type_icon); const typeInfo = types.find(t => t.id === item.maintenance_type_id); const defaultInterval = typeInfo?.default_interval_hours || item.interval_hours; + const defaultIntervalType = typeInfo?.interval_type || 'hours'; + const intervalType = item.interval_type || 'hours'; const isEditing = editingInterval === item.id; return ( -
+
{item.maintenance_type_name} {isEditing ? (
+ {intervalTypeInput === 'days' ? ( + + ) : ( + + )} + setIntervalInput(e.target.value)} onKeyDown={(e) => { - if (e.key === 'Enter') handleSaveInterval(item.id, defaultInterval); + if (e.key === 'Enter') handleSaveInterval(item.id, defaultInterval, defaultIntervalType); if (e.key === 'Escape') setEditingInterval(null); }} className="w-16 px-2 py-1 bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded text-white text-xs" min="1" - autoFocus /> - +
) : ( )}
); })}
-
+
))}
@@ -610,7 +832,7 @@ export function MaintenancePage() { onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['maintenanceOverview'] }); queryClient.invalidateQueries({ queryKey: ['maintenanceSummary'] }); - showToast('Maintenance marked as done'); + showToast('Maintenance marked as complete'); }, onError: (error: Error) => { showToast(error.message, 'error'); @@ -618,7 +840,7 @@ export function MaintenancePage() { }); const updateMutation = useMutation({ - mutationFn: ({ id, data }: { id: number; data: { custom_interval_hours?: number | null; enabled?: boolean } }) => + mutationFn: ({ id, data }: { id: number; data: { custom_interval_hours?: number | null; custom_interval_type?: 'hours' | 'days' | null; enabled?: boolean } }) => api.updateMaintenanceItem(id, data), onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['maintenanceOverview'] }); @@ -640,6 +862,19 @@ export function MaintenancePage() { }, }); + const updateTypeMutation = useMutation({ + mutationFn: ({ id, data }: { id: number; data: Partial<{ name: string; default_interval_hours: number; interval_type: 'hours' | 'days'; icon: string }> }) => + api.updateMaintenanceType(id, data), + onSuccess: () => { + queryClient.invalidateQueries({ queryKey: ['maintenanceTypes'] }); + queryClient.invalidateQueries({ queryKey: ['maintenanceOverview'] }); + showToast('Maintenance type updated'); + }, + onError: (error: Error) => { + showToast(error.message, 'error'); + }, + }); + const deleteTypeMutation = useMutation({ mutationFn: api.deleteMaintenanceType, onSuccess: () => { @@ -685,7 +920,6 @@ export function MaintenancePage() { ); } - // Calculate totals const totalDue = overview?.reduce((sum, p) => sum + p.due_count, 0) || 0; const totalWarning = overview?.reduce((sum, p) => sum + p.warning_count, 0) || 0; @@ -694,13 +928,13 @@ export function MaintenancePage() { {/* Header */}

Maintenance

-

+

{activeTab === 'status' ? ( <> - {totalDue > 0 && {totalDue} tasks overdue} + {totalDue > 0 && {totalDue} task{totalDue !== 1 ? 's' : ''} overdue} {totalDue > 0 && totalWarning > 0 && ' · '} - {totalWarning > 0 && {totalWarning} due soon} - {totalDue === 0 && totalWarning === 0 && 'All maintenance up to date'} + {totalWarning > 0 && {totalWarning} due soon} + {totalDue === 0 && totalWarning === 0 && All maintenance up to date} ) : ( 'Configure maintenance types and intervals' @@ -734,9 +968,15 @@ export function MaintenancePage() { {/* Tab content */} {activeTab === 'status' ? ( -

+
{overview && overview.length > 0 ? ( - [...overview].sort((a, b) => a.printer_name.localeCompare(b.printer_name)).map((printerOverview) => ( + [...overview].sort((a, b) => { + // Sort printers with issues first + const aScore = a.due_count * 10 + a.warning_count; + const bScore = b.due_count * 10 + b.warning_count; + if (aScore !== bScore) return bScore - aScore; + return a.printer_name.localeCompare(b.printer_name); + }).map((printerOverview) => ( - - -

No printers configured

-

- Add printers to start tracking maintenance -

+ + +

No printers configured

+

Add printers to start tracking maintenance

)} @@ -761,10 +999,11 @@ export function MaintenancePage() { - updateMutation.mutate({ id, data: { custom_interval_hours: customInterval } }) + onUpdateInterval={(id, data) => + updateMutation.mutate({ id, data }) } onAddType={(data) => addTypeMutation.mutate(data)} + onUpdateType={(id, data) => updateTypeMutation.mutate({ id, data })} onDeleteType={(id) => deleteTypeMutation.mutate(id)} /> )} diff --git a/static/assets/index-6YKRUSex.js b/static/assets/index-6YKRUSex.js new file mode 100644 index 000000000..9b46f1465 --- /dev/null +++ b/static/assets/index-6YKRUSex.js @@ -0,0 +1,8611 @@ +function bne(t,e){for(var n=0;nr[i]})}}}return Object.freeze(Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}))}(function(){const e=document.createElement("link").relList;if(e&&e.supports&&e.supports("modulepreload"))return;for(const i of document.querySelectorAll('link[rel="modulepreload"]'))r(i);new MutationObserver(i=>{for(const a of i)if(a.type==="childList")for(const s of a.addedNodes)s.tagName==="LINK"&&s.rel==="modulepreload"&&r(s)}).observe(document,{childList:!0,subtree:!0});function n(i){const a={};return i.integrity&&(a.integrity=i.integrity),i.referrerPolicy&&(a.referrerPolicy=i.referrerPolicy),i.crossOrigin==="use-credentials"?a.credentials="include":i.crossOrigin==="anonymous"?a.credentials="omit":a.credentials="same-origin",a}function r(i){if(i.ep)return;i.ep=!0;const a=n(i);fetch(i.href,a)}})();var Ib=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{};function Js(t){return t&&t.__esModule&&Object.prototype.hasOwnProperty.call(t,"default")?t.default:t}var OA={exports:{}},jg={};var iU;function yne(){if(iU)return jg;iU=1;var t=Symbol.for("react.transitional.element"),e=Symbol.for("react.fragment");function n(r,i,a){var s=null;if(a!==void 0&&(s=""+a),i.key!==void 0&&(s=""+i.key),"key"in i){a={};for(var o in i)o!=="key"&&(a[o]=i[o])}else a=i;return i=a.ref,{$$typeof:t,type:r,key:s,ref:i!==void 0?i:null,props:a}}return jg.Fragment=e,jg.jsx=n,jg.jsxs=n,jg}var aU;function _ne(){return aU||(aU=1,OA.exports=yne()),OA.exports}var f=_ne(),LA={exports:{}},Zt={};var sU;function Sne(){if(sU)return Zt;sU=1;var t=Symbol.for("react.transitional.element"),e=Symbol.for("react.portal"),n=Symbol.for("react.fragment"),r=Symbol.for("react.strict_mode"),i=Symbol.for("react.profiler"),a=Symbol.for("react.consumer"),s=Symbol.for("react.context"),o=Symbol.for("react.forward_ref"),l=Symbol.for("react.suspense"),c=Symbol.for("react.memo"),u=Symbol.for("react.lazy"),h=Symbol.for("react.activity"),g=Symbol.iterator;function m(H){return H===null||typeof H!="object"?null:(H=g&&H[g]||H["@@iterator"],typeof H=="function"?H:null)}var b={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},_=Object.assign,v={};function x(H,W,J){this.props=H,this.context=W,this.refs=v,this.updater=J||b}x.prototype.isReactComponent={},x.prototype.setState=function(H,W){if(typeof H!="object"&&typeof H!="function"&&H!=null)throw Error("takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,H,W,"setState")},x.prototype.forceUpdate=function(H){this.updater.enqueueForceUpdate(this,H,"forceUpdate")};function M(){}M.prototype=x.prototype;function w(H,W,J){this.props=H,this.context=W,this.refs=v,this.updater=J||b}var A=w.prototype=new M;A.constructor=w,_(A,x.prototype),A.isPureReactComponent=!0;var C=Array.isArray;function P(){}var T={H:null,A:null,T:null,S:null},j=Object.prototype.hasOwnProperty;function N(H,W,J){var se=J.ref;return{$$typeof:t,type:H,key:W,ref:se!==void 0?se:null,props:J}}function k(H,W){return N(H.type,W,H.props)}function F(H){return typeof H=="object"&&H!==null&&H.$$typeof===t}function I(H){var W={"=":"=0",":":"=2"};return"$"+H.replace(/[=:]/g,function(J){return W[J]})}var X=/\/+/g;function D(H,W){return typeof H=="object"&&H!==null&&H.key!=null?I(""+H.key):W.toString(36)}function z(H){switch(H.status){case"fulfilled":return H.value;case"rejected":throw H.reason;default:switch(typeof H.status=="string"?H.then(P,P):(H.status="pending",H.then(function(W){H.status==="pending"&&(H.status="fulfilled",H.value=W)},function(W){H.status==="pending"&&(H.status="rejected",H.reason=W)})),H.status){case"fulfilled":return H.value;case"rejected":throw H.reason}}throw H}function G(H,W,J,se,ge){var re=typeof H;(re==="undefined"||re==="boolean")&&(H=null);var pe=!1;if(H===null)pe=!0;else switch(re){case"bigint":case"string":case"number":pe=!0;break;case"object":switch(H.$$typeof){case t:case e:pe=!0;break;case u:return pe=H._init,G(pe(H._payload),W,J,se,ge)}}if(pe)return ge=ge(H),pe=se===""?"."+D(H,0):se,C(ge)?(J="",pe!=null&&(J=pe.replace(X,"$&/")+"/"),G(ge,W,J,"",function(we){return we})):ge!=null&&(F(ge)&&(ge=k(ge,J+(ge.key==null||H&&H.key===ge.key?"":(""+ge.key).replace(X,"$&/")+"/")+pe)),W.push(ge)),1;pe=0;var Ne=se===""?".":se+":";if(C(H))for(var he=0;he>>1,te=G[Y];if(0>>1;Yi(J,Z))sei(ge,J)?(G[Y]=ge,G[se]=Z,Y=se):(G[Y]=J,G[W]=Z,Y=W);else if(sei(ge,Z))G[Y]=ge,G[se]=Z,Y=se;else break e}}return V}function i(G,V){var Z=G.sortIndex-V.sortIndex;return Z!==0?Z:G.id-V.id}if(t.unstable_now=void 0,typeof performance=="object"&&typeof performance.now=="function"){var a=performance;t.unstable_now=function(){return a.now()}}else{var s=Date,o=s.now();t.unstable_now=function(){return s.now()-o}}var l=[],c=[],u=1,h=null,g=3,m=!1,b=!1,_=!1,v=!1,x=typeof setTimeout=="function"?setTimeout:null,M=typeof clearTimeout=="function"?clearTimeout:null,w=typeof setImmediate<"u"?setImmediate:null;function A(G){for(var V=n(c);V!==null;){if(V.callback===null)r(c);else if(V.startTime<=G)r(c),V.sortIndex=V.expirationTime,e(l,V);else break;V=n(c)}}function C(G){if(_=!1,A(G),!b)if(n(l)!==null)b=!0,P||(P=!0,I());else{var V=n(c);V!==null&&z(C,V.startTime-G)}}var P=!1,T=-1,j=5,N=-1;function k(){return v?!0:!(t.unstable_now()-NG&&k());){var Y=h.callback;if(typeof Y=="function"){h.callback=null,g=h.priorityLevel;var te=Y(h.expirationTime<=G);if(G=t.unstable_now(),typeof te=="function"){h.callback=te,A(G),V=!0;break t}h===n(l)&&r(l),A(G)}else r(l);h=n(l)}if(h!==null)V=!0;else{var H=n(c);H!==null&&z(C,H.startTime-G),V=!1}}break e}finally{h=null,g=Z,m=!1}V=void 0}}finally{V?I():P=!1}}}var I;if(typeof w=="function")I=function(){w(F)};else if(typeof MessageChannel<"u"){var X=new MessageChannel,D=X.port2;X.port1.onmessage=F,I=function(){D.postMessage(null)}}else I=function(){x(F,0)};function z(G,V){T=x(function(){G(t.unstable_now())},V)}t.unstable_IdlePriority=5,t.unstable_ImmediatePriority=1,t.unstable_LowPriority=4,t.unstable_NormalPriority=3,t.unstable_Profiling=null,t.unstable_UserBlockingPriority=2,t.unstable_cancelCallback=function(G){G.callback=null},t.unstable_forceFrameRate=function(G){0>G||125Y?(G.sortIndex=Z,e(c,G),n(l)===null&&G===n(c)&&(_?(M(T),T=-1):_=!0,z(C,Z-Y))):(G.sortIndex=te,e(l,G),b||m||(b=!0,P||(P=!0,I()))),G},t.unstable_shouldYield=k,t.unstable_wrapCallback=function(G){var V=g;return function(){var Z=g;g=V;try{return G.apply(this,arguments)}finally{g=Z}}}})(UA)),UA}var cU;function Ene(){return cU||(cU=1,jA.exports=Mne()),jA.exports}var FA={exports:{}},Yi={};var uU;function Ane(){if(uU)return Yi;uU=1;var t=Mm();function e(l){var c="https://react.dev/errors/"+l;if(1"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(t)}catch(e){console.error(e)}}return t(),FA.exports=Ane(),FA.exports}var fU;function Tne(){if(fU)return Ug;fU=1;var t=Ene(),e=Mm(),n=_G();function r(d){var p="https://react.dev/errors/"+d;if(1te||(d.current=Y[te],Y[te]=null,te--)}function J(d,p){te++,Y[te]=d.current,d.current=p}var se=H(null),ge=H(null),re=H(null),pe=H(null);function Ne(d,p){switch(J(re,p),J(ge,d),J(se,null),p.nodeType){case 9:case 11:d=(d=p.documentElement)&&(d=d.namespaceURI)?T4(d):0;break;default:if(d=p.tagName,p=p.namespaceURI)p=T4(p),d=C4(p,d);else switch(d){case"svg":d=1;break;case"math":d=2;break;default:d=0}}W(se),J(se,d)}function he(){W(se),W(ge),W(re)}function we(d){d.memoizedState!==null&&J(pe,d);var p=se.current,y=C4(p,d.type);p!==y&&(J(ge,d),J(se,y))}function De(d){ge.current===d&&(W(se),W(ge)),pe.current===d&&(W(pe),Dg._currentValue=Z)}var de,lt;function $(d){if(de===void 0)try{throw Error()}catch(y){var p=y.stack.trim().match(/\n( *(at )?)/);de=p&&p[1]||"",lt=-1)":-1R||Se[S]!==He[R]){var at=` +`+Se[S].replace(" at new "," at ");return d.displayName&&at.includes("")&&(at=at.replace("",d.displayName)),at}while(1<=S&&0<=R);break}}}finally{B=!1,Error.prepareStackTrace=y}return(y=d?d.displayName||d.name:"")?$(y):""}function K(d,p){switch(d.tag){case 26:case 27:case 5:return $(d.type);case 16:return $("Lazy");case 13:return d.child!==p&&p!==null?$("Suspense Fallback"):$("Suspense");case 19:return $("SuspenseList");case 0:case 15:return ie(d.type,!1);case 11:return ie(d.type.render,!1);case 1:return ie(d.type,!0);case 31:return $("Activity");default:return""}}function Q(d){try{var p="",y=null;do p+=K(d,y),y=d,d=d.return;while(d);return p}catch(S){return` +Error generating stack: `+S.message+` +`+S.stack}}var le=Object.prototype.hasOwnProperty,Re=t.unstable_scheduleCallback,Ee=t.unstable_cancelCallback,ae=t.unstable_shouldYield,U=t.unstable_requestPaint,L=t.unstable_now,ee=t.unstable_getCurrentPriorityLevel,ve=t.unstable_ImmediatePriority,ye=t.unstable_UserBlockingPriority,xe=t.unstable_NormalPriority,et=t.unstable_LowPriority,Ie=t.unstable_IdlePriority,Ke=t.log,st=t.unstable_setDisableYieldValue,je=null,ce=null;function Ze(d){if(typeof Ke=="function"&&st(d),ce&&typeof ce.setStrictMode=="function")try{ce.setStrictMode(je,d)}catch{}}var Fe=Math.clz32?Math.clz32:ue,Xe=Math.log,ct=Math.LN2;function ue(d){return d>>>=0,d===0?32:31-(Xe(d)/ct|0)|0}var Qe=256,me=262144,Le=4194304;function Ae(d){var p=d&42;if(p!==0)return p;switch(d&-d){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:return 64;case 128:return 128;case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:return d&261888;case 262144:case 524288:case 1048576:case 2097152:return d&3932160;case 4194304:case 8388608:case 16777216:case 33554432:return d&62914560;case 67108864:return 67108864;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 0;default:return d}}function be(d,p,y){var S=d.pendingLanes;if(S===0)return 0;var R=0,O=d.suspendedLanes,q=d.pingedLanes;d=d.warmLanes;var oe=S&134217727;return oe!==0?(S=oe&~O,S!==0?R=Ae(S):(q&=oe,q!==0?R=Ae(q):y||(y=oe&~d,y!==0&&(R=Ae(y))))):(oe=S&~O,oe!==0?R=Ae(oe):q!==0?R=Ae(q):y||(y=S&~d,y!==0&&(R=Ae(y)))),R===0?0:p!==0&&p!==R&&(p&O)===0&&(O=R&-R,y=p&-p,O>=y||O===32&&(y&4194048)!==0)?p:R}function $e(d,p){return(d.pendingLanes&~(d.suspendedLanes&~d.pingedLanes)&p)===0}function ft(d,p){switch(d){case 1:case 2:case 4:case 8:case 64:return p+250;case 16:case 32:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return p+5e3;case 4194304:case 8388608:case 16777216:case 33554432:return-1;case 67108864:case 134217728:case 268435456:case 536870912:case 1073741824:return-1;default:return-1}}function yt(){var d=Le;return Le<<=1,(Le&62914560)===0&&(Le=4194304),d}function Pt(d){for(var p=[],y=0;31>y;y++)p.push(d);return p}function cn(d,p){d.pendingLanes|=p,p!==268435456&&(d.suspendedLanes=0,d.pingedLanes=0,d.warmLanes=0)}function Ot(d,p,y,S,R,O){var q=d.pendingLanes;d.pendingLanes=y,d.suspendedLanes=0,d.pingedLanes=0,d.warmLanes=0,d.expiredLanes&=y,d.entangledLanes&=y,d.errorRecoveryDisabledLanes&=y,d.shellSuspendCounter=0;var oe=d.entanglements,Se=d.expirationTimes,He=d.hiddenUpdates;for(y=q&~y;0"u")return null;try{return d.activeElement||d.body}catch{return d.body}}var Cr=/[\n"\\]/g;function Nn(d){return d.replace(Cr,function(p){return"\\"+p.charCodeAt(0).toString(16)+" "})}function no(d,p,y,S,R,O,q,oe){d.name="",q!=null&&typeof q!="function"&&typeof q!="symbol"&&typeof q!="boolean"?d.type=q:d.removeAttribute("type"),p!=null?q==="number"?(p===0&&d.value===""||d.value!=p)&&(d.value=""+dn(p)):d.value!==""+dn(p)&&(d.value=""+dn(p)):q!=="submit"&&q!=="reset"||d.removeAttribute("value"),p!=null?gi(d,q,dn(p)):y!=null?gi(d,q,dn(y)):S!=null&&d.removeAttribute("value"),R==null&&O!=null&&(d.defaultChecked=!!O),R!=null&&(d.checked=R&&typeof R!="function"&&typeof R!="symbol"),oe!=null&&typeof oe!="function"&&typeof oe!="symbol"&&typeof oe!="boolean"?d.name=""+dn(oe):d.removeAttribute("name")}function Pn(d,p,y,S,R,O,q,oe){if(O!=null&&typeof O!="function"&&typeof O!="symbol"&&typeof O!="boolean"&&(d.type=O),p!=null||y!=null){if(!(O!=="submit"&&O!=="reset"||p!=null)){Yt(d);return}y=y!=null?""+dn(y):"",p=p!=null?""+dn(p):y,oe||p===d.value||(d.value=p),d.defaultValue=p}S=S??R,S=typeof S!="function"&&typeof S!="symbol"&&!!S,d.checked=oe?d.checked:!!S,d.defaultChecked=!!S,q!=null&&typeof q!="function"&&typeof q!="symbol"&&typeof q!="boolean"&&(d.name=q),Yt(d)}function gi(d,p,y){p==="number"&&yr(d.ownerDocument)===d||d.defaultValue===""+y||(d.defaultValue=""+y)}function Jr(d,p,y,S){if(d=d.options,p){p={};for(var R=0;R"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),OM=!1;if(pl)try{var Zm={};Object.defineProperty(Zm,"passive",{get:function(){OM=!0}}),window.addEventListener("test",Zm,Zm),window.removeEventListener("test",Zm,Zm)}catch{OM=!1}var Lc=null,LM=null,Cv=null;function CL(){if(Cv)return Cv;var d,p=LM,y=p.length,S,R="value"in Lc?Lc.value:Lc.textContent,O=R.length;for(d=0;d=eg),OL=" ",LL=!1;function IL(d,p){switch(d){case"keyup":return Bee.indexOf(p.keyCode)!==-1;case"keydown":return p.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function jL(d){return d=d.detail,typeof d=="object"&&"data"in d?d.data:null}var th=!1;function $ee(d,p){switch(d){case"compositionend":return jL(p);case"keypress":return p.which!==32?null:(LL=!0,OL);case"textInput":return d=p.data,d===OL&&LL?null:d;default:return null}}function Vee(d,p){if(th)return d==="compositionend"||!zM&&IL(d,p)?(d=CL(),Cv=LM=Lc=null,th=!1,d):null;switch(d){case"paste":return null;case"keypress":if(!(p.ctrlKey||p.altKey||p.metaKey)||p.ctrlKey&&p.altKey){if(p.char&&1=p)return{node:y,offset:p-d};d=S}e:{for(;y;){if(y.nextSibling){y=y.nextSibling;break e}y=y.parentNode}y=void 0}y=GL(y)}}function qL(d,p){return d&&p?d===p?!0:d&&d.nodeType===3?!1:p&&p.nodeType===3?qL(d,p.parentNode):"contains"in d?d.contains(p):d.compareDocumentPosition?!!(d.compareDocumentPosition(p)&16):!1:!1}function XL(d){d=d!=null&&d.ownerDocument!=null&&d.ownerDocument.defaultView!=null?d.ownerDocument.defaultView:window;for(var p=yr(d.document);p instanceof d.HTMLIFrameElement;){try{var y=typeof p.contentWindow.location.href=="string"}catch{y=!1}if(y)d=p.contentWindow;else break;p=yr(d.document)}return p}function $M(d){var p=d&&d.nodeName&&d.nodeName.toLowerCase();return p&&(p==="input"&&(d.type==="text"||d.type==="search"||d.type==="tel"||d.type==="url"||d.type==="password")||p==="textarea"||d.contentEditable==="true")}var Qee=pl&&"documentMode"in document&&11>=document.documentMode,nh=null,VM=null,ig=null,GM=!1;function KL(d,p,y){var S=y.window===y?y.document:y.nodeType===9?y:y.ownerDocument;GM||nh==null||nh!==yr(S)||(S=nh,"selectionStart"in S&&$M(S)?S={start:S.selectionStart,end:S.selectionEnd}:(S=(S.ownerDocument&&S.ownerDocument.defaultView||window).getSelection(),S={anchorNode:S.anchorNode,anchorOffset:S.anchorOffset,focusNode:S.focusNode,focusOffset:S.focusOffset}),ig&&rg(ig,S)||(ig=S,S=_b(VM,"onSelect"),0>=q,R-=q,Do=1<<32-Fe(p)+R|y<en?(vn=Dt,Dt=null):vn=Dt.sibling;var Mn=We(Oe,Dt,Be[en],ot);if(Mn===null){Dt===null&&(Dt=vn);break}d&&Dt&&Mn.alternate===null&&p(Oe,Dt),Te=O(Mn,Te,en),wn===null?jt=Mn:wn.sibling=Mn,wn=Mn,Dt=vn}if(en===Be.length)return y(Oe,Dt),yn&&gl(Oe,en),jt;if(Dt===null){for(;enen?(vn=Dt,Dt=null):vn=Dt.sibling;var ru=We(Oe,Dt,Mn.value,ot);if(ru===null){Dt===null&&(Dt=vn);break}d&&Dt&&ru.alternate===null&&p(Oe,Dt),Te=O(ru,Te,en),wn===null?jt=ru:wn.sibling=ru,wn=ru,Dt=vn}if(Mn.done)return y(Oe,Dt),yn&&gl(Oe,en),jt;if(Dt===null){for(;!Mn.done;en++,Mn=Be.next())Mn=ut(Oe,Mn.value,ot),Mn!==null&&(Te=O(Mn,Te,en),wn===null?jt=Mn:wn.sibling=Mn,wn=Mn);return yn&&gl(Oe,en),jt}for(Dt=S(Dt);!Mn.done;en++,Mn=Be.next())Mn=nt(Dt,Oe,en,Mn.value,ot),Mn!==null&&(d&&Mn.alternate!==null&&Dt.delete(Mn.key===null?en:Mn.key),Te=O(Mn,Te,en),wn===null?jt=Mn:wn.sibling=Mn,wn=Mn);return d&&Dt.forEach(function(vne){return p(Oe,vne)}),yn&&gl(Oe,en),jt}function Fn(Oe,Te,Be,ot){if(typeof Be=="object"&&Be!==null&&Be.type===_&&Be.key===null&&(Be=Be.props.children),typeof Be=="object"&&Be!==null){switch(Be.$$typeof){case m:e:{for(var jt=Be.key;Te!==null;){if(Te.key===jt){if(jt=Be.type,jt===_){if(Te.tag===7){y(Oe,Te.sibling),ot=R(Te,Be.props.children),ot.return=Oe,Oe=ot;break e}}else if(Te.elementType===jt||typeof jt=="object"&&jt!==null&&jt.$$typeof===j&&wd(jt)===Te.type){y(Oe,Te.sibling),ot=R(Te,Be.props),ug(ot,Be),ot.return=Oe,Oe=ot;break e}y(Oe,Te);break}else p(Oe,Te);Te=Te.sibling}Be.type===_?(ot=vd(Be.props.children,Oe.mode,ot,Be.key),ot.return=Oe,Oe=ot):(ot=Uv(Be.type,Be.key,Be.props,null,Oe.mode,ot),ug(ot,Be),ot.return=Oe,Oe=ot)}return q(Oe);case b:e:{for(jt=Be.key;Te!==null;){if(Te.key===jt)if(Te.tag===4&&Te.stateNode.containerInfo===Be.containerInfo&&Te.stateNode.implementation===Be.implementation){y(Oe,Te.sibling),ot=R(Te,Be.children||[]),ot.return=Oe,Oe=ot;break e}else{y(Oe,Te);break}else p(Oe,Te);Te=Te.sibling}ot=QM(Be,Oe.mode,ot),ot.return=Oe,Oe=ot}return q(Oe);case j:return Be=wd(Be),Fn(Oe,Te,Be,ot)}if(z(Be))return Ct(Oe,Te,Be,ot);if(I(Be)){if(jt=I(Be),typeof jt!="function")throw Error(r(150));return Be=jt.call(Be),Ht(Oe,Te,Be,ot)}if(typeof Be.then=="function")return Fn(Oe,Te,Gv(Be),ot);if(Be.$$typeof===w)return Fn(Oe,Te,Bv(Oe,Be),ot);Wv(Oe,Be)}return typeof Be=="string"&&Be!==""||typeof Be=="number"||typeof Be=="bigint"?(Be=""+Be,Te!==null&&Te.tag===6?(y(Oe,Te.sibling),ot=R(Te,Be),ot.return=Oe,Oe=ot):(y(Oe,Te),ot=ZM(Be,Oe.mode,ot),ot.return=Oe,Oe=ot),q(Oe)):y(Oe,Te)}return function(Oe,Te,Be,ot){try{cg=0;var jt=Fn(Oe,Te,Be,ot);return hh=null,jt}catch(Dt){if(Dt===fh||Dt===$v)throw Dt;var wn=Ka(29,Dt,null,Oe.mode);return wn.lanes=ot,wn.return=Oe,wn}finally{}}}var Ed=vI(!0),bI=vI(!1),zc=!1;function uE(d){d.updateQueue={baseState:d.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,lanes:0,hiddenCallbacks:null},callbacks:null}}function dE(d,p){d=d.updateQueue,p.updateQueue===d&&(p.updateQueue={baseState:d.baseState,firstBaseUpdate:d.firstBaseUpdate,lastBaseUpdate:d.lastBaseUpdate,shared:d.shared,callbacks:null})}function Bc(d){return{lane:d,tag:0,payload:null,callback:null,next:null}}function Hc(d,p,y){var S=d.updateQueue;if(S===null)return null;if(S=S.shared,(Cn&2)!==0){var R=S.pending;return R===null?p.next=p:(p.next=R.next,R.next=p),S.pending=p,p=jv(d),nI(d,null,y),p}return Iv(d,S,p,y),jv(d)}function dg(d,p,y){if(p=p.updateQueue,p!==null&&(p=p.shared,(y&4194048)!==0)){var S=p.lanes;S&=d.pendingLanes,y|=S,p.lanes=y,qn(d,y)}}function fE(d,p){var y=d.updateQueue,S=d.alternate;if(S!==null&&(S=S.updateQueue,y===S)){var R=null,O=null;if(y=y.firstBaseUpdate,y!==null){do{var q={lane:y.lane,tag:y.tag,payload:y.payload,callback:null,next:null};O===null?R=O=q:O=O.next=q,y=y.next}while(y!==null);O===null?R=O=p:O=O.next=p}else R=O=p;y={baseState:S.baseState,firstBaseUpdate:R,lastBaseUpdate:O,shared:S.shared,callbacks:S.callbacks},d.updateQueue=y;return}d=y.lastBaseUpdate,d===null?y.firstBaseUpdate=p:d.next=p,y.lastBaseUpdate=p}var hE=!1;function fg(){if(hE){var d=dh;if(d!==null)throw d}}function hg(d,p,y,S){hE=!1;var R=d.updateQueue;zc=!1;var O=R.firstBaseUpdate,q=R.lastBaseUpdate,oe=R.shared.pending;if(oe!==null){R.shared.pending=null;var Se=oe,He=Se.next;Se.next=null,q===null?O=He:q.next=He,q=Se;var at=d.alternate;at!==null&&(at=at.updateQueue,oe=at.lastBaseUpdate,oe!==q&&(oe===null?at.firstBaseUpdate=He:oe.next=He,at.lastBaseUpdate=Se))}if(O!==null){var ut=R.baseState;q=0,at=He=Se=null,oe=O;do{var We=oe.lane&-536870913,nt=We!==oe.lane;if(nt?(xn&We)===We:(S&We)===We){We!==0&&We===uh&&(hE=!0),at!==null&&(at=at.next={lane:0,tag:oe.tag,payload:oe.payload,callback:null,next:null});e:{var Ct=d,Ht=oe;We=p;var Fn=y;switch(Ht.tag){case 1:if(Ct=Ht.payload,typeof Ct=="function"){ut=Ct.call(Fn,ut,We);break e}ut=Ct;break e;case 3:Ct.flags=Ct.flags&-65537|128;case 0:if(Ct=Ht.payload,We=typeof Ct=="function"?Ct.call(Fn,ut,We):Ct,We==null)break e;ut=h({},ut,We);break e;case 2:zc=!0}}We=oe.callback,We!==null&&(d.flags|=64,nt&&(d.flags|=8192),nt=R.callbacks,nt===null?R.callbacks=[We]:nt.push(We))}else nt={lane:We,tag:oe.tag,payload:oe.payload,callback:oe.callback,next:null},at===null?(He=at=nt,Se=ut):at=at.next=nt,q|=We;if(oe=oe.next,oe===null){if(oe=R.shared.pending,oe===null)break;nt=oe,oe=nt.next,nt.next=null,R.lastBaseUpdate=nt,R.shared.pending=null}}while(!0);at===null&&(Se=ut),R.baseState=Se,R.firstBaseUpdate=He,R.lastBaseUpdate=at,O===null&&(R.shared.lanes=0),qc|=q,d.lanes=q,d.memoizedState=ut}}function yI(d,p){if(typeof d!="function")throw Error(r(191,d));d.call(p)}function _I(d,p){var y=d.callbacks;if(y!==null)for(d.callbacks=null,d=0;dO?O:8;var q=G.T,oe={};G.T=oe,kE(d,!1,p,y);try{var Se=R(),He=G.S;if(He!==null&&He(oe,Se),Se!==null&&typeof Se=="object"&&typeof Se.then=="function"){var at=ote(Se,S);gg(d,p,at,es(d))}else gg(d,p,S,es(d))}catch(ut){gg(d,p,{then:function(){},status:"rejected",reason:ut},es())}finally{V.p=O,q!==null&&oe.types!==null&&(q.types=oe.types),G.T=q}}function hte(){}function RE(d,p,y,S){if(d.tag!==5)throw Error(r(476));var R=JI(d).queue;QI(d,R,p,Z,y===null?hte:function(){return ej(d),y(S)})}function JI(d){var p=d.memoizedState;if(p!==null)return p;p={memoizedState:Z,baseState:Z,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:yl,lastRenderedState:Z},next:null};var y={};return p.next={memoizedState:y,baseState:y,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:yl,lastRenderedState:y},next:null},d.memoizedState=p,d=d.alternate,d!==null&&(d.memoizedState=p),p}function ej(d){var p=JI(d);p.next===null&&(p=d.alternate.memoizedState),gg(d,p.next.queue,{},es())}function PE(){return Li(Dg)}function tj(){return Rr().memoizedState}function nj(){return Rr().memoizedState}function pte(d){for(var p=d.return;p!==null;){switch(p.tag){case 24:case 3:var y=es();d=Bc(y);var S=Hc(p,d,y);S!==null&&(Pa(S,p,y),dg(S,p,y)),p={cache:sE()},d.payload=p;return}p=p.return}}function mte(d,p,y){var S=es();y={lane:S,revertLane:0,gesture:null,action:y,hasEagerState:!1,eagerState:null,next:null},nb(d)?ij(p,y):(y=KM(d,p,y,S),y!==null&&(Pa(y,d,S),aj(y,p,S)))}function rj(d,p,y){var S=es();gg(d,p,y,S)}function gg(d,p,y,S){var R={lane:S,revertLane:0,gesture:null,action:y,hasEagerState:!1,eagerState:null,next:null};if(nb(d))ij(p,R);else{var O=d.alternate;if(d.lanes===0&&(O===null||O.lanes===0)&&(O=p.lastRenderedReducer,O!==null))try{var q=p.lastRenderedState,oe=O(q,y);if(R.hasEagerState=!0,R.eagerState=oe,Xa(oe,q))return Iv(d,p,R,0),Xn===null&&Lv(),!1}catch{}finally{}if(y=KM(d,p,R,S),y!==null)return Pa(y,d,S),aj(y,p,S),!0}return!1}function kE(d,p,y,S){if(S={lane:2,revertLane:uA(),gesture:null,action:S,hasEagerState:!1,eagerState:null,next:null},nb(d)){if(p)throw Error(r(479))}else p=KM(d,y,S,2),p!==null&&Pa(p,d,2)}function nb(d){var p=d.alternate;return d===Jt||p!==null&&p===Jt}function ij(d,p){mh=Kv=!0;var y=d.pending;y===null?p.next=p:(p.next=y.next,y.next=p),d.pending=p}function aj(d,p,y){if((y&4194048)!==0){var S=p.lanes;S&=d.pendingLanes,y|=S,p.lanes=y,qn(d,y)}}var xg={readContext:Li,use:Qv,useCallback:_r,useContext:_r,useEffect:_r,useImperativeHandle:_r,useLayoutEffect:_r,useInsertionEffect:_r,useMemo:_r,useReducer:_r,useRef:_r,useState:_r,useDebugValue:_r,useDeferredValue:_r,useTransition:_r,useSyncExternalStore:_r,useId:_r,useHostTransitionStatus:_r,useFormState:_r,useActionState:_r,useOptimistic:_r,useMemoCache:_r,useCacheRefresh:_r};xg.useEffectEvent=_r;var sj={readContext:Li,use:Qv,useCallback:function(d,p){return da().memoizedState=[d,p===void 0?null:p],d},useContext:Li,useEffect:$I,useImperativeHandle:function(d,p,y){y=y!=null?y.concat([d]):null,eb(4194308,4,qI.bind(null,p,d),y)},useLayoutEffect:function(d,p){return eb(4194308,4,d,p)},useInsertionEffect:function(d,p){eb(4,2,d,p)},useMemo:function(d,p){var y=da();p=p===void 0?null:p;var S=d();if(Ad){Ze(!0);try{d()}finally{Ze(!1)}}return y.memoizedState=[S,p],S},useReducer:function(d,p,y){var S=da();if(y!==void 0){var R=y(p);if(Ad){Ze(!0);try{y(p)}finally{Ze(!1)}}}else R=p;return S.memoizedState=S.baseState=R,d={pending:null,lanes:0,dispatch:null,lastRenderedReducer:d,lastRenderedState:R},S.queue=d,d=d.dispatch=mte.bind(null,Jt,d),[S.memoizedState,d]},useRef:function(d){var p=da();return d={current:d},p.memoizedState=d},useState:function(d){d=EE(d);var p=d.queue,y=rj.bind(null,Jt,p);return p.dispatch=y,[d.memoizedState,y]},useDebugValue:CE,useDeferredValue:function(d,p){var y=da();return NE(y,d,p)},useTransition:function(){var d=EE(!1);return d=QI.bind(null,Jt,d.queue,!0,!1),da().memoizedState=d,[!1,d]},useSyncExternalStore:function(d,p,y){var S=Jt,R=da();if(yn){if(y===void 0)throw Error(r(407));y=y()}else{if(y=p(),Xn===null)throw Error(r(349));(xn&127)!==0||TI(S,p,y)}R.memoizedState=y;var O={value:y,getSnapshot:p};return R.queue=O,$I(NI.bind(null,S,O,d),[d]),S.flags|=2048,xh(9,{destroy:void 0},CI.bind(null,S,O,y,p),null),y},useId:function(){var d=da(),p=Xn.identifierPrefix;if(yn){var y=Oo,S=Do;y=(S&~(1<<32-Fe(S)-1)).toString(32)+y,p="_"+p+"R_"+y,y=Yv++,0<\/script>",O=O.removeChild(O.firstChild);break;case"select":O=typeof S.is=="string"?q.createElement("select",{is:S.is}):q.createElement("select"),S.multiple?O.multiple=!0:S.size&&(O.size=S.size);break;default:O=typeof S.is=="string"?q.createElement(R,{is:S.is}):q.createElement(R)}}O[pr]=p,O[Tr]=S;e:for(q=p.child;q!==null;){if(q.tag===5||q.tag===6)O.appendChild(q.stateNode);else if(q.tag!==4&&q.tag!==27&&q.child!==null){q.child.return=q,q=q.child;continue}if(q===p)break e;for(;q.sibling===null;){if(q.return===null||q.return===p)break e;q=q.return}q.sibling.return=q.return,q=q.sibling}p.stateNode=O;e:switch(ji(O,R,S),R){case"button":case"input":case"select":case"textarea":S=!!S.autoFocus;break e;case"img":S=!0;break e;default:S=!1}S&&Sl(p)}}return nr(p),WE(p,p.type,d===null?null:d.memoizedProps,p.pendingProps,y),null;case 6:if(d&&p.stateNode!=null)d.memoizedProps!==S&&Sl(p);else{if(typeof S!="string"&&p.stateNode===null)throw Error(r(166));if(d=re.current,lh(p)){if(d=p.stateNode,y=p.memoizedProps,S=null,R=Oi,R!==null)switch(R.tag){case 27:case 5:S=R.memoizedProps}d[pr]=p,d=!!(d.nodeValue===y||S!==null&&S.suppressHydrationWarning===!0||E4(d.nodeValue,y)),d||Uc(p,!0)}else d=Sb(d).createTextNode(S),d[pr]=p,p.stateNode=d}return nr(p),null;case 31:if(y=p.memoizedState,d===null||d.memoizedState!==null){if(S=lh(p),y!==null){if(d===null){if(!S)throw Error(r(318));if(d=p.memoizedState,d=d!==null?d.dehydrated:null,!d)throw Error(r(557));d[pr]=p}else bd(),(p.flags&128)===0&&(p.memoizedState=null),p.flags|=4;nr(p),d=!1}else y=nE(),d!==null&&d.memoizedState!==null&&(d.memoizedState.hydrationErrors=y),d=!0;if(!d)return p.flags&256?(Za(p),p):(Za(p),null);if((p.flags&128)!==0)throw Error(r(558))}return nr(p),null;case 13:if(S=p.memoizedState,d===null||d.memoizedState!==null&&d.memoizedState.dehydrated!==null){if(R=lh(p),S!==null&&S.dehydrated!==null){if(d===null){if(!R)throw Error(r(318));if(R=p.memoizedState,R=R!==null?R.dehydrated:null,!R)throw Error(r(317));R[pr]=p}else bd(),(p.flags&128)===0&&(p.memoizedState=null),p.flags|=4;nr(p),R=!1}else R=nE(),d!==null&&d.memoizedState!==null&&(d.memoizedState.hydrationErrors=R),R=!0;if(!R)return p.flags&256?(Za(p),p):(Za(p),null)}return Za(p),(p.flags&128)!==0?(p.lanes=y,p):(y=S!==null,d=d!==null&&d.memoizedState!==null,y&&(S=p.child,R=null,S.alternate!==null&&S.alternate.memoizedState!==null&&S.alternate.memoizedState.cachePool!==null&&(R=S.alternate.memoizedState.cachePool.pool),O=null,S.memoizedState!==null&&S.memoizedState.cachePool!==null&&(O=S.memoizedState.cachePool.pool),O!==R&&(S.flags|=2048)),y!==d&&y&&(p.child.flags|=8192),ob(p,p.updateQueue),nr(p),null);case 4:return he(),d===null&&pA(p.stateNode.containerInfo),nr(p),null;case 10:return vl(p.type),nr(p),null;case 19:if(W(Nr),S=p.memoizedState,S===null)return nr(p),null;if(R=(p.flags&128)!==0,O=S.rendering,O===null)if(R)bg(S,!1);else{if(Sr!==0||d!==null&&(d.flags&128)!==0)for(d=p.child;d!==null;){if(O=Xv(d),O!==null){for(p.flags|=128,bg(S,!1),d=O.updateQueue,p.updateQueue=d,ob(p,d),p.subtreeFlags=0,d=y,y=p.child;y!==null;)rI(y,d),y=y.sibling;return J(Nr,Nr.current&1|2),yn&&gl(p,S.treeForkCount),p.child}d=d.sibling}S.tail!==null&&L()>fb&&(p.flags|=128,R=!0,bg(S,!1),p.lanes=4194304)}else{if(!R)if(d=Xv(O),d!==null){if(p.flags|=128,R=!0,d=d.updateQueue,p.updateQueue=d,ob(p,d),bg(S,!0),S.tail===null&&S.tailMode==="hidden"&&!O.alternate&&!yn)return nr(p),null}else 2*L()-S.renderingStartTime>fb&&y!==536870912&&(p.flags|=128,R=!0,bg(S,!1),p.lanes=4194304);S.isBackwards?(O.sibling=p.child,p.child=O):(d=S.last,d!==null?d.sibling=O:p.child=O,S.last=O)}return S.tail!==null?(d=S.tail,S.rendering=d,S.tail=d.sibling,S.renderingStartTime=L(),d.sibling=null,y=Nr.current,J(Nr,R?y&1|2:y&1),yn&&gl(p,S.treeForkCount),d):(nr(p),null);case 22:case 23:return Za(p),mE(),S=p.memoizedState!==null,d!==null?d.memoizedState!==null!==S&&(p.flags|=8192):S&&(p.flags|=8192),S?(y&536870912)!==0&&(p.flags&128)===0&&(nr(p),p.subtreeFlags&6&&(p.flags|=8192)):nr(p),y=p.updateQueue,y!==null&&ob(p,y.retryQueue),y=null,d!==null&&d.memoizedState!==null&&d.memoizedState.cachePool!==null&&(y=d.memoizedState.cachePool.pool),S=null,p.memoizedState!==null&&p.memoizedState.cachePool!==null&&(S=p.memoizedState.cachePool.pool),S!==y&&(p.flags|=2048),d!==null&&W(Sd),null;case 24:return y=null,d!==null&&(y=d.memoizedState.cache),p.memoizedState.cache!==y&&(p.flags|=2048),vl(jr),nr(p),null;case 25:return null;case 30:return null}throw Error(r(156,p.tag))}function yte(d,p){switch(eE(p),p.tag){case 1:return d=p.flags,d&65536?(p.flags=d&-65537|128,p):null;case 3:return vl(jr),he(),d=p.flags,(d&65536)!==0&&(d&128)===0?(p.flags=d&-65537|128,p):null;case 26:case 27:case 5:return De(p),null;case 31:if(p.memoizedState!==null){if(Za(p),p.alternate===null)throw Error(r(340));bd()}return d=p.flags,d&65536?(p.flags=d&-65537|128,p):null;case 13:if(Za(p),d=p.memoizedState,d!==null&&d.dehydrated!==null){if(p.alternate===null)throw Error(r(340));bd()}return d=p.flags,d&65536?(p.flags=d&-65537|128,p):null;case 19:return W(Nr),null;case 4:return he(),null;case 10:return vl(p.type),null;case 22:case 23:return Za(p),mE(),d!==null&&W(Sd),d=p.flags,d&65536?(p.flags=d&-65537|128,p):null;case 24:return vl(jr),null;case 25:return null;default:return null}}function Rj(d,p){switch(eE(p),p.tag){case 3:vl(jr),he();break;case 26:case 27:case 5:De(p);break;case 4:he();break;case 31:p.memoizedState!==null&&Za(p);break;case 13:Za(p);break;case 19:W(Nr);break;case 10:vl(p.type);break;case 22:case 23:Za(p),mE(),d!==null&&W(Sd);break;case 24:vl(jr)}}function yg(d,p){try{var y=p.updateQueue,S=y!==null?y.lastEffect:null;if(S!==null){var R=S.next;y=R;do{if((y.tag&d)===d){S=void 0;var O=y.create,q=y.inst;S=O(),q.destroy=S}y=y.next}while(y!==R)}}catch(oe){Dn(p,p.return,oe)}}function Gc(d,p,y){try{var S=p.updateQueue,R=S!==null?S.lastEffect:null;if(R!==null){var O=R.next;S=O;do{if((S.tag&d)===d){var q=S.inst,oe=q.destroy;if(oe!==void 0){q.destroy=void 0,R=p;var Se=y,He=oe;try{He()}catch(at){Dn(R,Se,at)}}}S=S.next}while(S!==O)}}catch(at){Dn(p,p.return,at)}}function Pj(d){var p=d.updateQueue;if(p!==null){var y=d.stateNode;try{_I(p,y)}catch(S){Dn(d,d.return,S)}}}function kj(d,p,y){y.props=Td(d.type,d.memoizedProps),y.state=d.memoizedState;try{y.componentWillUnmount()}catch(S){Dn(d,p,S)}}function _g(d,p){try{var y=d.ref;if(y!==null){switch(d.tag){case 26:case 27:case 5:var S=d.stateNode;break;case 30:S=d.stateNode;break;default:S=d.stateNode}typeof y=="function"?d.refCleanup=y(S):y.current=S}}catch(R){Dn(d,p,R)}}function Lo(d,p){var y=d.ref,S=d.refCleanup;if(y!==null)if(typeof S=="function")try{S()}catch(R){Dn(d,p,R)}finally{d.refCleanup=null,d=d.alternate,d!=null&&(d.refCleanup=null)}else if(typeof y=="function")try{y(null)}catch(R){Dn(d,p,R)}else y.current=null}function Dj(d){var p=d.type,y=d.memoizedProps,S=d.stateNode;try{e:switch(p){case"button":case"input":case"select":case"textarea":y.autoFocus&&S.focus();break e;case"img":y.src?S.src=y.src:y.srcSet&&(S.srcset=y.srcSet)}}catch(R){Dn(d,d.return,R)}}function qE(d,p,y){try{var S=d.stateNode;Hte(S,d.type,y,p),S[Tr]=p}catch(R){Dn(d,d.return,R)}}function Oj(d){return d.tag===5||d.tag===3||d.tag===26||d.tag===27&&Qc(d.type)||d.tag===4}function XE(d){e:for(;;){for(;d.sibling===null;){if(d.return===null||Oj(d.return))return null;d=d.return}for(d.sibling.return=d.return,d=d.sibling;d.tag!==5&&d.tag!==6&&d.tag!==18;){if(d.tag===27&&Qc(d.type)||d.flags&2||d.child===null||d.tag===4)continue e;d.child.return=d,d=d.child}if(!(d.flags&2))return d.stateNode}}function KE(d,p,y){var S=d.tag;if(S===5||S===6)d=d.stateNode,p?(y.nodeType===9?y.body:y.nodeName==="HTML"?y.ownerDocument.body:y).insertBefore(d,p):(p=y.nodeType===9?y.body:y.nodeName==="HTML"?y.ownerDocument.body:y,p.appendChild(d),y=y._reactRootContainer,y!=null||p.onclick!==null||(p.onclick=hl));else if(S!==4&&(S===27&&Qc(d.type)&&(y=d.stateNode,p=null),d=d.child,d!==null))for(KE(d,p,y),d=d.sibling;d!==null;)KE(d,p,y),d=d.sibling}function lb(d,p,y){var S=d.tag;if(S===5||S===6)d=d.stateNode,p?y.insertBefore(d,p):y.appendChild(d);else if(S!==4&&(S===27&&Qc(d.type)&&(y=d.stateNode),d=d.child,d!==null))for(lb(d,p,y),d=d.sibling;d!==null;)lb(d,p,y),d=d.sibling}function Lj(d){var p=d.stateNode,y=d.memoizedProps;try{for(var S=d.type,R=p.attributes;R.length;)p.removeAttributeNode(R[0]);ji(p,S,y),p[pr]=d,p[Tr]=y}catch(O){Dn(d,d.return,O)}}var wl=!1,zr=!1,YE=!1,Ij=typeof WeakSet=="function"?WeakSet:Set,vi=null;function _te(d,p){if(d=d.containerInfo,xA=Nb,d=XL(d),$M(d)){if("selectionStart"in d)var y={start:d.selectionStart,end:d.selectionEnd};else e:{y=(y=d.ownerDocument)&&y.defaultView||window;var S=y.getSelection&&y.getSelection();if(S&&S.rangeCount!==0){y=S.anchorNode;var R=S.anchorOffset,O=S.focusNode;S=S.focusOffset;try{y.nodeType,O.nodeType}catch{y=null;break e}var q=0,oe=-1,Se=-1,He=0,at=0,ut=d,We=null;t:for(;;){for(var nt;ut!==y||R!==0&&ut.nodeType!==3||(oe=q+R),ut!==O||S!==0&&ut.nodeType!==3||(Se=q+S),ut.nodeType===3&&(q+=ut.nodeValue.length),(nt=ut.firstChild)!==null;)We=ut,ut=nt;for(;;){if(ut===d)break t;if(We===y&&++He===R&&(oe=q),We===O&&++at===S&&(Se=q),(nt=ut.nextSibling)!==null)break;ut=We,We=ut.parentNode}ut=nt}y=oe===-1||Se===-1?null:{start:oe,end:Se}}else y=null}y=y||{start:0,end:0}}else y=null;for(vA={focusedElem:d,selectionRange:y},Nb=!1,vi=p;vi!==null;)if(p=vi,d=p.child,(p.subtreeFlags&1028)!==0&&d!==null)d.return=p,vi=d;else for(;vi!==null;){switch(p=vi,O=p.alternate,d=p.flags,p.tag){case 0:if((d&4)!==0&&(d=p.updateQueue,d=d!==null?d.events:null,d!==null))for(y=0;y title"))),ji(O,S,y),O[pr]=d,Pe(O),S=O;break e;case"link":var q=H4("link","href",R).get(S+(y.href||""));if(q){for(var oe=0;oeFn&&(q=Fn,Fn=Ht,Ht=q);var Oe=WL(oe,Ht),Te=WL(oe,Fn);if(Oe&&Te&&(nt.rangeCount!==1||nt.anchorNode!==Oe.node||nt.anchorOffset!==Oe.offset||nt.focusNode!==Te.node||nt.focusOffset!==Te.offset)){var Be=ut.createRange();Be.setStart(Oe.node,Oe.offset),nt.removeAllRanges(),Ht>Fn?(nt.addRange(Be),nt.extend(Te.node,Te.offset)):(Be.setEnd(Te.node,Te.offset),nt.addRange(Be))}}}}for(ut=[],nt=oe;nt=nt.parentNode;)nt.nodeType===1&&ut.push({element:nt,left:nt.scrollLeft,top:nt.scrollTop});for(typeof oe.focus=="function"&&oe.focus(),oe=0;oey?32:y,G.T=null,y=rA,rA=null;var O=Kc,q=Cl;if(ei=0,Sh=Kc=null,Cl=0,(Cn&6)!==0)throw Error(r(331));var oe=Cn;if(Cn|=4,qj(O.current),Vj(O,O.current,q,y),Cn=oe,Tg(0,!1),ce&&typeof ce.onPostCommitFiberRoot=="function")try{ce.onPostCommitFiberRoot(je,O)}catch{}return!0}finally{V.p=R,G.T=S,d4(d,p)}}function h4(d,p,y){p=bs(y,p),p=IE(d.stateNode,p,2),d=Hc(d,p,2),d!==null&&(cn(d,2),Io(d))}function Dn(d,p,y){if(d.tag===3)h4(d,d,y);else for(;p!==null;){if(p.tag===3){h4(p,d,y);break}else if(p.tag===1){var S=p.stateNode;if(typeof p.type.getDerivedStateFromError=="function"||typeof S.componentDidCatch=="function"&&(Xc===null||!Xc.has(S))){d=bs(y,d),y=pj(2),S=Hc(p,y,2),S!==null&&(mj(y,S,p,d),cn(S,2),Io(S));break}}p=p.return}}function oA(d,p,y){var S=d.pingCache;if(S===null){S=d.pingCache=new Mte;var R=new Set;S.set(p,R)}else R=S.get(p),R===void 0&&(R=new Set,S.set(p,R));R.has(y)||(JE=!0,R.add(y),d=Nte.bind(null,d,p,y),p.then(d,d))}function Nte(d,p,y){var S=d.pingCache;S!==null&&S.delete(p),d.pingedLanes|=d.suspendedLanes&y,d.warmLanes&=~y,Xn===d&&(xn&y)===y&&(Sr===4||Sr===3&&(xn&62914560)===xn&&300>L()-db?(Cn&2)===0&&wh(d,0):eA|=y,_h===xn&&(_h=0)),Io(d)}function p4(d,p){p===0&&(p=yt()),d=xd(d,p),d!==null&&(cn(d,p),Io(d))}function Rte(d){var p=d.memoizedState,y=0;p!==null&&(y=p.retryLane),p4(d,y)}function Pte(d,p){var y=0;switch(d.tag){case 31:case 13:var S=d.stateNode,R=d.memoizedState;R!==null&&(y=R.retryLane);break;case 19:S=d.stateNode;break;case 22:S=d.stateNode._retryCache;break;default:throw Error(r(314))}S!==null&&S.delete(p),p4(d,y)}function kte(d,p){return Re(d,p)}var vb=null,Eh=null,lA=!1,bb=!1,cA=!1,Zc=0;function Io(d){d!==Eh&&d.next===null&&(Eh===null?vb=Eh=d:Eh=Eh.next=d),bb=!0,lA||(lA=!0,Ote())}function Tg(d,p){if(!cA&&bb){cA=!0;do for(var y=!1,S=vb;S!==null;){if(d!==0){var R=S.pendingLanes;if(R===0)var O=0;else{var q=S.suspendedLanes,oe=S.pingedLanes;O=(1<<31-Fe(42|d)+1)-1,O&=R&~(q&~oe),O=O&201326741?O&201326741|1:O?O|2:0}O!==0&&(y=!0,v4(S,O))}else O=xn,O=be(S,S===Xn?O:0,S.cancelPendingCommit!==null||S.timeoutHandle!==-1),(O&3)===0||$e(S,O)||(y=!0,v4(S,O));S=S.next}while(y);cA=!1}}function Dte(){m4()}function m4(){bb=lA=!1;var d=0;Zc!==0&&Vte()&&(d=Zc);for(var p=L(),y=null,S=vb;S!==null;){var R=S.next,O=g4(S,p);O===0?(S.next=null,y===null?vb=R:y.next=R,R===null&&(Eh=y)):(y=S,(d!==0||(O&3)!==0)&&(bb=!0)),S=R}ei!==0&&ei!==5||Tg(d),Zc!==0&&(Zc=0)}function g4(d,p){for(var y=d.suspendedLanes,S=d.pingedLanes,R=d.expirationTimes,O=d.pendingLanes&-62914561;0oe)break;var at=Se.transferSize,ut=Se.initiatorType;at&&A4(ut)&&(Se=Se.responseEnd,q+=at*(Se"u"?null:document;function U4(d,p,y){var S=Ah;if(S&&typeof p=="string"&&p){var R=Nn(p);R='link[rel="'+d+'"][href="'+R+'"]',typeof y=="string"&&(R+='[crossorigin="'+y+'"]'),j4.has(R)||(j4.add(R),d={rel:d,crossOrigin:y,href:p},S.querySelector(R)===null&&(p=S.createElement("link"),ji(p,"link",d),Pe(p),S.head.appendChild(p)))}}function Jte(d){Nl.D(d),U4("dns-prefetch",d,null)}function ene(d,p){Nl.C(d,p),U4("preconnect",d,p)}function tne(d,p,y){Nl.L(d,p,y);var S=Ah;if(S&&d&&p){var R='link[rel="preload"][as="'+Nn(p)+'"]';p==="image"&&y&&y.imageSrcSet?(R+='[imagesrcset="'+Nn(y.imageSrcSet)+'"]',typeof y.imageSizes=="string"&&(R+='[imagesizes="'+Nn(y.imageSizes)+'"]')):R+='[href="'+Nn(d)+'"]';var O=R;switch(p){case"style":O=Th(d);break;case"script":O=Ch(d)}Es.has(O)||(d=h({rel:"preload",href:p==="image"&&y&&y.imageSrcSet?void 0:d,as:p},y),Es.set(O,d),S.querySelector(R)!==null||p==="style"&&S.querySelector(Pg(O))||p==="script"&&S.querySelector(kg(O))||(p=S.createElement("link"),ji(p,"link",d),Pe(p),S.head.appendChild(p)))}}function nne(d,p){Nl.m(d,p);var y=Ah;if(y&&d){var S=p&&typeof p.as=="string"?p.as:"script",R='link[rel="modulepreload"][as="'+Nn(S)+'"][href="'+Nn(d)+'"]',O=R;switch(S){case"audioworklet":case"paintworklet":case"serviceworker":case"sharedworker":case"worker":case"script":O=Ch(d)}if(!Es.has(O)&&(d=h({rel:"modulepreload",href:d},p),Es.set(O,d),y.querySelector(R)===null)){switch(S){case"audioworklet":case"paintworklet":case"serviceworker":case"sharedworker":case"worker":case"script":if(y.querySelector(kg(O)))return}S=y.createElement("link"),ji(S,"link",d),Pe(S),y.head.appendChild(S)}}}function rne(d,p,y){Nl.S(d,p,y);var S=Ah;if(S&&d){var R=ke(S).hoistableStyles,O=Th(d);p=p||"default";var q=R.get(O);if(!q){var oe={loading:0,preload:null};if(q=S.querySelector(Pg(O)))oe.loading=5;else{d=h({rel:"stylesheet",href:d,"data-precedence":p},y),(y=Es.get(O))&&EA(d,y);var Se=q=S.createElement("link");Pe(Se),ji(Se,"link",d),Se._p=new Promise(function(He,at){Se.onload=He,Se.onerror=at}),Se.addEventListener("load",function(){oe.loading|=1}),Se.addEventListener("error",function(){oe.loading|=2}),oe.loading|=4,Mb(q,p,S)}q={type:"stylesheet",instance:q,count:1,state:oe},R.set(O,q)}}}function ine(d,p){Nl.X(d,p);var y=Ah;if(y&&d){var S=ke(y).hoistableScripts,R=Ch(d),O=S.get(R);O||(O=y.querySelector(kg(R)),O||(d=h({src:d,async:!0},p),(p=Es.get(R))&&AA(d,p),O=y.createElement("script"),Pe(O),ji(O,"link",d),y.head.appendChild(O)),O={type:"script",instance:O,count:1,state:null},S.set(R,O))}}function ane(d,p){Nl.M(d,p);var y=Ah;if(y&&d){var S=ke(y).hoistableScripts,R=Ch(d),O=S.get(R);O||(O=y.querySelector(kg(R)),O||(d=h({src:d,async:!0,type:"module"},p),(p=Es.get(R))&&AA(d,p),O=y.createElement("script"),Pe(O),ji(O,"link",d),y.head.appendChild(O)),O={type:"script",instance:O,count:1,state:null},S.set(R,O))}}function F4(d,p,y,S){var R=(R=re.current)?wb(R):null;if(!R)throw Error(r(446));switch(d){case"meta":case"title":return null;case"style":return typeof y.precedence=="string"&&typeof y.href=="string"?(p=Th(y.href),y=ke(R).hoistableStyles,S=y.get(p),S||(S={type:"style",instance:null,count:0,state:null},y.set(p,S)),S):{type:"void",instance:null,count:0,state:null};case"link":if(y.rel==="stylesheet"&&typeof y.href=="string"&&typeof y.precedence=="string"){d=Th(y.href);var O=ke(R).hoistableStyles,q=O.get(d);if(q||(R=R.ownerDocument||R,q={type:"stylesheet",instance:null,count:0,state:{loading:0,preload:null}},O.set(d,q),(O=R.querySelector(Pg(d)))&&!O._p&&(q.instance=O,q.state.loading=5),Es.has(d)||(y={rel:"preload",as:"style",href:y.href,crossOrigin:y.crossOrigin,integrity:y.integrity,media:y.media,hrefLang:y.hrefLang,referrerPolicy:y.referrerPolicy},Es.set(d,y),O||sne(R,d,y,q.state))),p&&S===null)throw Error(r(528,""));return q}if(p&&S!==null)throw Error(r(529,""));return null;case"script":return p=y.async,y=y.src,typeof y=="string"&&p&&typeof p!="function"&&typeof p!="symbol"?(p=Ch(y),y=ke(R).hoistableScripts,S=y.get(p),S||(S={type:"script",instance:null,count:0,state:null},y.set(p,S)),S):{type:"void",instance:null,count:0,state:null};default:throw Error(r(444,d))}}function Th(d){return'href="'+Nn(d)+'"'}function Pg(d){return'link[rel="stylesheet"]['+d+"]"}function z4(d){return h({},d,{"data-precedence":d.precedence,precedence:null})}function sne(d,p,y,S){d.querySelector('link[rel="preload"][as="style"]['+p+"]")?S.loading=1:(p=d.createElement("link"),S.preload=p,p.addEventListener("load",function(){return S.loading|=1}),p.addEventListener("error",function(){return S.loading|=2}),ji(p,"link",y),Pe(p),d.head.appendChild(p))}function Ch(d){return'[src="'+Nn(d)+'"]'}function kg(d){return"script[async]"+d}function B4(d,p,y){if(p.count++,p.instance===null)switch(p.type){case"style":var S=d.querySelector('style[data-href~="'+Nn(y.href)+'"]');if(S)return p.instance=S,Pe(S),S;var R=h({},y,{"data-href":y.href,"data-precedence":y.precedence,href:null,precedence:null});return S=(d.ownerDocument||d).createElement("style"),Pe(S),ji(S,"style",R),Mb(S,y.precedence,d),p.instance=S;case"stylesheet":R=Th(y.href);var O=d.querySelector(Pg(R));if(O)return p.state.loading|=4,p.instance=O,Pe(O),O;S=z4(y),(R=Es.get(R))&&EA(S,R),O=(d.ownerDocument||d).createElement("link"),Pe(O);var q=O;return q._p=new Promise(function(oe,Se){q.onload=oe,q.onerror=Se}),ji(O,"link",S),p.state.loading|=4,Mb(O,y.precedence,d),p.instance=O;case"script":return O=Ch(y.src),(R=d.querySelector(kg(O)))?(p.instance=R,Pe(R),R):(S=y,(R=Es.get(O))&&(S=h({},y),AA(S,R)),d=d.ownerDocument||d,R=d.createElement("script"),Pe(R),ji(R,"link",S),d.head.appendChild(R),p.instance=R);case"void":return null;default:throw Error(r(443,p.type))}else p.type==="stylesheet"&&(p.state.loading&4)===0&&(S=p.instance,p.state.loading|=4,Mb(S,y.precedence,d));return p.instance}function Mb(d,p,y){for(var S=y.querySelectorAll('link[rel="stylesheet"][data-precedence],style[data-precedence]'),R=S.length?S[S.length-1]:null,O=R,q=0;q title"):null)}function one(d,p,y){if(y===1||p.itemProp!=null)return!1;switch(d){case"meta":case"title":return!0;case"style":if(typeof p.precedence!="string"||typeof p.href!="string"||p.href==="")break;return!0;case"link":if(typeof p.rel!="string"||typeof p.href!="string"||p.href===""||p.onLoad||p.onError)break;switch(p.rel){case"stylesheet":return d=p.disabled,typeof p.precedence=="string"&&d==null;default:return!0}case"script":if(p.async&&typeof p.async!="function"&&typeof p.async!="symbol"&&!p.onLoad&&!p.onError&&p.src&&typeof p.src=="string")return!0}return!1}function V4(d){return!(d.type==="stylesheet"&&(d.state.loading&3)===0)}function lne(d,p,y,S){if(y.type==="stylesheet"&&(typeof S.media!="string"||matchMedia(S.media).matches!==!1)&&(y.state.loading&4)===0){if(y.instance===null){var R=Th(S.href),O=p.querySelector(Pg(R));if(O){p=O._p,p!==null&&typeof p=="object"&&typeof p.then=="function"&&(d.count++,d=Ab.bind(d),p.then(d,d)),y.state.loading|=4,y.instance=O,Pe(O);return}O=p.ownerDocument||p,S=z4(S),(R=Es.get(R))&&EA(S,R),O=O.createElement("link"),Pe(O);var q=O;q._p=new Promise(function(oe,Se){q.onload=oe,q.onerror=Se}),ji(O,"link",S),y.instance=O}d.stylesheets===null&&(d.stylesheets=new Map),d.stylesheets.set(y,p),(p=y.state.preload)&&(y.state.loading&3)===0&&(d.count++,y=Ab.bind(d),p.addEventListener("load",y),p.addEventListener("error",y))}}var TA=0;function cne(d,p){return d.stylesheets&&d.count===0&&Cb(d,d.stylesheets),0TA?50:800)+p);return d.unsuspend=y,function(){d.unsuspend=null,clearTimeout(S),clearTimeout(R)}}:null}function Ab(){if(this.count--,this.count===0&&(this.imgCount===0||!this.waitingForImages)){if(this.stylesheets)Cb(this,this.stylesheets);else if(this.unsuspend){var d=this.unsuspend;this.unsuspend=null,d()}}}var Tb=null;function Cb(d,p){d.stylesheets=null,d.unsuspend!==null&&(d.count++,Tb=new Map,p.forEach(une,d),Tb=null,Ab.call(d))}function une(d,p){if(!(p.state.loading&4)){var y=Tb.get(d);if(y)var S=y.get(null);else{y=new Map,Tb.set(d,y);for(var R=d.querySelectorAll("link[data-precedence],style[data-precedence]"),O=0;O"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(t)}catch(e){console.error(e)}}return t(),IA.exports=Tne(),IA.exports}var Nne=Cne();const Gt=t=>typeof t=="string",Fg=()=>{let t,e;const n=new Promise((r,i)=>{t=r,e=i});return n.resolve=t,n.reject=e,n},pU=t=>t==null?"":""+t,Rne=(t,e,n)=>{t.forEach(r=>{e[r]&&(n[r]=e[r])})},Pne=/###/g,mU=t=>t&&t.indexOf("###")>-1?t.replace(Pne,"."):t,gU=t=>!t||Gt(t),wx=(t,e,n)=>{const r=Gt(e)?e.split("."):e;let i=0;for(;i{const{obj:r,k:i}=wx(t,e,Object);if(r!==void 0||e.length===1){r[i]=n;return}let a=e[e.length-1],s=e.slice(0,e.length-1),o=wx(t,s,Object);for(;o.obj===void 0&&s.length;)a=`${s[s.length-1]}.${a}`,s=s.slice(0,s.length-1),o=wx(t,s,Object),o?.obj&&typeof o.obj[`${o.k}.${a}`]<"u"&&(o.obj=void 0);o.obj[`${o.k}.${a}`]=n},kne=(t,e,n,r)=>{const{obj:i,k:a}=wx(t,e,Object);i[a]=i[a]||[],i[a].push(n)},$_=(t,e)=>{const{obj:n,k:r}=wx(t,e);if(n&&Object.prototype.hasOwnProperty.call(n,r))return n[r]},Dne=(t,e,n)=>{const r=$_(t,n);return r!==void 0?r:$_(e,n)},SG=(t,e,n)=>{for(const r in e)r!=="__proto__"&&r!=="constructor"&&(r in t?Gt(t[r])||t[r]instanceof String||Gt(e[r])||e[r]instanceof String?n&&(t[r]=e[r]):SG(t[r],e[r],n):t[r]=e[r]);return t},Rh=t=>t.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&");var One={"&":"&","<":"<",">":">",'"':""","'":"'","/":"/"};const Lne=t=>Gt(t)?t.replace(/[&<>"'\/]/g,e=>One[e]):t;class Ine{constructor(e){this.capacity=e,this.regExpMap=new Map,this.regExpQueue=[]}getRegExp(e){const n=this.regExpMap.get(e);if(n!==void 0)return n;const r=new RegExp(e);return this.regExpQueue.length===this.capacity&&this.regExpMap.delete(this.regExpQueue.shift()),this.regExpMap.set(e,r),this.regExpQueue.push(e),r}}const jne=[" ",",","?","!",";"],Une=new Ine(20),Fne=(t,e,n)=>{e=e||"",n=n||"";const r=jne.filter(s=>e.indexOf(s)<0&&n.indexOf(s)<0);if(r.length===0)return!0;const i=Une.getRegExp(`(${r.map(s=>s==="?"?"\\?":s).join("|")})`);let a=!i.test(t);if(!a){const s=t.indexOf(n);s>0&&!i.test(t.substring(0,s))&&(a=!0)}return a},NN=(t,e,n=".")=>{if(!t)return;if(t[e])return Object.prototype.hasOwnProperty.call(t,e)?t[e]:void 0;const r=e.split(n);let i=t;for(let a=0;a-1&&lt?.replace("_","-"),zne={type:"logger",log(t){this.output("log",t)},warn(t){this.output("warn",t)},error(t){this.output("error",t)},output(t,e){console?.[t]?.apply?.(console,e)}};class V_{constructor(e,n={}){this.init(e,n)}init(e,n={}){this.prefix=n.prefix||"i18next:",this.logger=e||zne,this.options=n,this.debug=n.debug}log(...e){return this.forward(e,"log","",!0)}warn(...e){return this.forward(e,"warn","",!0)}error(...e){return this.forward(e,"error","")}deprecate(...e){return this.forward(e,"warn","WARNING DEPRECATED: ",!0)}forward(e,n,r,i){return i&&!this.debug?null:(Gt(e[0])&&(e[0]=`${r}${this.prefix} ${e[0]}`),this.logger[n](e))}create(e){return new V_(this.logger,{prefix:`${this.prefix}:${e}:`,...this.options})}clone(e){return e=e||this.options,e.prefix=e.prefix||this.prefix,new V_(this.logger,e)}}var qo=new V_;let ew=class{constructor(){this.observers={}}on(e,n){return e.split(" ").forEach(r=>{this.observers[r]||(this.observers[r]=new Map);const i=this.observers[r].get(n)||0;this.observers[r].set(n,i+1)}),this}off(e,n){if(this.observers[e]){if(!n){delete this.observers[e];return}this.observers[e].delete(n)}}emit(e,...n){this.observers[e]&&Array.from(this.observers[e].entries()).forEach(([i,a])=>{for(let s=0;s{for(let s=0;s-1&&this.options.ns.splice(n,1)}getResource(e,n,r,i={}){const a=i.keySeparator!==void 0?i.keySeparator:this.options.keySeparator,s=i.ignoreJSONStructure!==void 0?i.ignoreJSONStructure:this.options.ignoreJSONStructure;let o;e.indexOf(".")>-1?o=e.split("."):(o=[e,n],r&&(Array.isArray(r)?o.push(...r):Gt(r)&&a?o.push(...r.split(a)):o.push(r)));const l=$_(this.data,o);return!l&&!n&&!r&&e.indexOf(".")>-1&&(e=o[0],n=o[1],r=o.slice(2).join(".")),l||!s||!Gt(r)?l:NN(this.data?.[e]?.[n],r,a)}addResource(e,n,r,i,a={silent:!1}){const s=a.keySeparator!==void 0?a.keySeparator:this.options.keySeparator;let o=[e,n];r&&(o=o.concat(s?r.split(s):r)),e.indexOf(".")>-1&&(o=e.split("."),i=n,n=o[1]),this.addNamespaces(n),xU(this.data,o,i),a.silent||this.emit("added",e,n,r,i)}addResources(e,n,r,i={silent:!1}){for(const a in r)(Gt(r[a])||Array.isArray(r[a]))&&this.addResource(e,n,a,r[a],{silent:!0});i.silent||this.emit("added",e,n,r)}addResourceBundle(e,n,r,i,a,s={silent:!1,skipCopy:!1}){let o=[e,n];e.indexOf(".")>-1&&(o=e.split("."),i=r,r=n,n=o[1]),this.addNamespaces(n);let l=$_(this.data,o)||{};s.skipCopy||(r=JSON.parse(JSON.stringify(r))),i?SG(l,r,a):l={...l,...r},xU(this.data,o,l),s.silent||this.emit("added",e,n,r)}removeResourceBundle(e,n){this.hasResourceBundle(e,n)&&delete this.data[e][n],this.removeNamespaces(n),this.emit("removed",e,n)}hasResourceBundle(e,n){return this.getResource(e,n)!==void 0}getResourceBundle(e,n){return n||(n=this.options.defaultNS),this.getResource(e,n)}getDataByLanguage(e){return this.data[e]}hasLanguageSomeTranslations(e){const n=this.getDataByLanguage(e);return!!(n&&Object.keys(n)||[]).find(i=>n[i]&&Object.keys(n[i]).length>0)}toJSON(){return this.data}}var wG={processors:{},addPostProcessor(t){this.processors[t.name]=t},handle(t,e,n,r,i){return t.forEach(a=>{e=this.processors[a]?.process(e,n,r,i)??e}),e}};const MG=Symbol("i18next/PATH_KEY");function Bne(){const t=[],e=Object.create(null);let n;return e.get=(r,i)=>(n?.revoke?.(),i===MG?t:(t.push(i),n=Proxy.revocable(r,e),n.proxy)),Proxy.revocable(Object.create(null),e).proxy}function RN(t,e){const{[MG]:n}=t(Bne());return n.join(e?.keySeparator??".")}const bU={},zA=t=>!Gt(t)&&typeof t!="boolean"&&typeof t!="number";class G_ extends ew{constructor(e,n={}){super(),Rne(["resourceStore","languageUtils","pluralResolver","interpolator","backendConnector","i18nFormat","utils"],e,this),this.options=n,this.options.keySeparator===void 0&&(this.options.keySeparator="."),this.logger=qo.create("translator")}changeLanguage(e){e&&(this.language=e)}exists(e,n={interpolation:{}}){const r={...n};if(e==null)return!1;const i=this.resolve(e,r);if(i?.res===void 0)return!1;const a=zA(i.res);return!(r.returnObjects===!1&&a)}extractFromKey(e,n){let r=n.nsSeparator!==void 0?n.nsSeparator:this.options.nsSeparator;r===void 0&&(r=":");const i=n.keySeparator!==void 0?n.keySeparator:this.options.keySeparator;let a=n.ns||this.options.defaultNS||[];const s=r&&e.indexOf(r)>-1,o=!this.options.userDefinedKeySeparator&&!n.keySeparator&&!this.options.userDefinedNsSeparator&&!n.nsSeparator&&!Fne(e,r,i);if(s&&!o){const l=e.match(this.interpolator.nestingRegexp);if(l&&l.length>0)return{key:e,namespaces:Gt(a)?[a]:a};const c=e.split(r);(r!==i||r===i&&this.options.ns.indexOf(c[0])>-1)&&(a=c.shift()),e=c.join(i)}return{key:e,namespaces:Gt(a)?[a]:a}}translate(e,n,r){let i=typeof n=="object"?{...n}:n;if(typeof i!="object"&&this.options.overloadTranslationOptionHandler&&(i=this.options.overloadTranslationOptionHandler(arguments)),typeof i=="object"&&(i={...i}),i||(i={}),e==null)return"";typeof e=="function"&&(e=RN(e,{...this.options,...i})),Array.isArray(e)||(e=[String(e)]);const a=i.returnDetails!==void 0?i.returnDetails:this.options.returnDetails,s=i.keySeparator!==void 0?i.keySeparator:this.options.keySeparator,{key:o,namespaces:l}=this.extractFromKey(e[e.length-1],i),c=l[l.length-1];let u=i.nsSeparator!==void 0?i.nsSeparator:this.options.nsSeparator;u===void 0&&(u=":");const h=i.lng||this.language,g=i.appendNamespaceToCIMode||this.options.appendNamespaceToCIMode;if(h?.toLowerCase()==="cimode")return g?a?{res:`${c}${u}${o}`,usedKey:o,exactUsedKey:o,usedLng:h,usedNS:c,usedParams:this.getUsedParamsDetails(i)}:`${c}${u}${o}`:a?{res:o,usedKey:o,exactUsedKey:o,usedLng:h,usedNS:c,usedParams:this.getUsedParamsDetails(i)}:o;const m=this.resolve(e,i);let b=m?.res;const _=m?.usedKey||o,v=m?.exactUsedKey||o,x=["[object Number]","[object Function]","[object RegExp]"],M=i.joinArrays!==void 0?i.joinArrays:this.options.joinArrays,w=!this.i18nFormat||this.i18nFormat.handleAsObject,A=i.count!==void 0&&!Gt(i.count),C=G_.hasDefaultValue(i),P=A?this.pluralResolver.getSuffix(h,i.count,i):"",T=i.ordinal&&A?this.pluralResolver.getSuffix(h,i.count,{ordinal:!1}):"",j=A&&!i.ordinal&&i.count===0,N=j&&i[`defaultValue${this.options.pluralSeparator}zero`]||i[`defaultValue${P}`]||i[`defaultValue${T}`]||i.defaultValue;let k=b;w&&!b&&C&&(k=N);const F=zA(k),I=Object.prototype.toString.apply(k);if(w&&k&&F&&x.indexOf(I)<0&&!(Gt(M)&&Array.isArray(k))){if(!i.returnObjects&&!this.options.returnObjects){this.options.returnedObjectHandler||this.logger.warn("accessing an object - but returnObjects options is not enabled!");const X=this.options.returnedObjectHandler?this.options.returnedObjectHandler(_,k,{...i,ns:l}):`key '${o} (${this.language})' returned an object instead of string.`;return a?(m.res=X,m.usedParams=this.getUsedParamsDetails(i),m):X}if(s){const X=Array.isArray(k),D=X?[]:{},z=X?v:_;for(const G in k)if(Object.prototype.hasOwnProperty.call(k,G)){const V=`${z}${s}${G}`;C&&!b?D[G]=this.translate(V,{...i,defaultValue:zA(N)?N[G]:void 0,joinArrays:!1,ns:l}):D[G]=this.translate(V,{...i,joinArrays:!1,ns:l}),D[G]===V&&(D[G]=k[G])}b=D}}else if(w&&Gt(M)&&Array.isArray(b))b=b.join(M),b&&(b=this.extendTranslation(b,e,i,r));else{let X=!1,D=!1;!this.isValidLookup(b)&&C&&(X=!0,b=N),this.isValidLookup(b)||(D=!0,b=o);const G=(i.missingKeyNoValueFallbackToKey||this.options.missingKeyNoValueFallbackToKey)&&D?void 0:b,V=C&&N!==b&&this.options.updateMissing;if(D||X||V){if(this.logger.log(V?"updateKey":"missingKey",h,c,o,V?N:b),s){const H=this.resolve(o,{...i,keySeparator:!1});H&&H.res&&this.logger.warn("Seems the loaded translations were in flat JSON format instead of nested. Either set keySeparator: false on init or make sure your translations are published in nested format.")}let Z=[];const Y=this.languageUtils.getFallbackCodes(this.options.fallbackLng,i.lng||this.language);if(this.options.saveMissingTo==="fallback"&&Y&&Y[0])for(let H=0;H{const se=C&&J!==b?J:G;this.options.missingKeyHandler?this.options.missingKeyHandler(H,c,W,se,V,i):this.backendConnector?.saveMissing&&this.backendConnector.saveMissing(H,c,W,se,V,i),this.emit("missingKey",H,c,W,b)};this.options.saveMissing&&(this.options.saveMissingPlurals&&A?Z.forEach(H=>{const W=this.pluralResolver.getSuffixes(H,i);j&&i[`defaultValue${this.options.pluralSeparator}zero`]&&W.indexOf(`${this.options.pluralSeparator}zero`)<0&&W.push(`${this.options.pluralSeparator}zero`),W.forEach(J=>{te([H],o+J,i[`defaultValue${J}`]||N)})}):te(Z,o,N))}b=this.extendTranslation(b,e,i,m,r),D&&b===o&&this.options.appendNamespaceToMissingKey&&(b=`${c}${u}${o}`),(D||X)&&this.options.parseMissingKeyHandler&&(b=this.options.parseMissingKeyHandler(this.options.appendNamespaceToMissingKey?`${c}${u}${o}`:o,X?b:void 0,i))}return a?(m.res=b,m.usedParams=this.getUsedParamsDetails(i),m):b}extendTranslation(e,n,r,i,a){if(this.i18nFormat?.parse)e=this.i18nFormat.parse(e,{...this.options.interpolation.defaultVariables,...r},r.lng||this.language||i.usedLng,i.usedNS,i.usedKey,{resolved:i});else if(!r.skipInterpolation){r.interpolation&&this.interpolator.init({...r,interpolation:{...this.options.interpolation,...r.interpolation}});const l=Gt(e)&&(r?.interpolation?.skipOnVariables!==void 0?r.interpolation.skipOnVariables:this.options.interpolation.skipOnVariables);let c;if(l){const h=e.match(this.interpolator.nestingRegexp);c=h&&h.length}let u=r.replace&&!Gt(r.replace)?r.replace:r;if(this.options.interpolation.defaultVariables&&(u={...this.options.interpolation.defaultVariables,...u}),e=this.interpolator.interpolate(e,u,r.lng||this.language||i.usedLng,r),l){const h=e.match(this.interpolator.nestingRegexp),g=h&&h.length;ca?.[0]===h[0]&&!r.context?(this.logger.warn(`It seems you are nesting recursively key: ${h[0]} in key: ${n[0]}`),null):this.translate(...h,n),r)),r.interpolation&&this.interpolator.reset()}const s=r.postProcess||this.options.postProcess,o=Gt(s)?[s]:s;return e!=null&&o?.length&&r.applyPostProcessor!==!1&&(e=wG.handle(o,e,n,this.options&&this.options.postProcessPassResolved?{i18nResolved:{...i,usedParams:this.getUsedParamsDetails(r)},...r}:r,this)),e}resolve(e,n={}){let r,i,a,s,o;return Gt(e)&&(e=[e]),e.forEach(l=>{if(this.isValidLookup(r))return;const c=this.extractFromKey(l,n),u=c.key;i=u;let h=c.namespaces;this.options.fallbackNS&&(h=h.concat(this.options.fallbackNS));const g=n.count!==void 0&&!Gt(n.count),m=g&&!n.ordinal&&n.count===0,b=n.context!==void 0&&(Gt(n.context)||typeof n.context=="number")&&n.context!=="",_=n.lngs?n.lngs:this.languageUtils.toResolveHierarchy(n.lng||this.language,n.fallbackLng);h.forEach(v=>{this.isValidLookup(r)||(o=v,!bU[`${_[0]}-${v}`]&&this.utils?.hasLoadedNamespace&&!this.utils?.hasLoadedNamespace(o)&&(bU[`${_[0]}-${v}`]=!0,this.logger.warn(`key "${i}" for languages "${_.join(", ")}" won't get resolved as namespace "${o}" was not yet loaded`,"This means something IS WRONG in your setup. You access the t function before i18next.init / i18next.loadNamespace / i18next.changeLanguage was done. Wait for the callback or Promise to resolve before accessing it!!!")),_.forEach(x=>{if(this.isValidLookup(r))return;s=x;const M=[u];if(this.i18nFormat?.addLookupKeys)this.i18nFormat.addLookupKeys(M,u,x,v,n);else{let A;g&&(A=this.pluralResolver.getSuffix(x,n.count,n));const C=`${this.options.pluralSeparator}zero`,P=`${this.options.pluralSeparator}ordinal${this.options.pluralSeparator}`;if(g&&(n.ordinal&&A.indexOf(P)===0&&M.push(u+A.replace(P,this.options.pluralSeparator)),M.push(u+A),m&&M.push(u+C)),b){const T=`${u}${this.options.contextSeparator||"_"}${n.context}`;M.push(T),g&&(n.ordinal&&A.indexOf(P)===0&&M.push(T+A.replace(P,this.options.pluralSeparator)),M.push(T+A),m&&M.push(T+C))}}let w;for(;w=M.pop();)this.isValidLookup(r)||(a=w,r=this.getResource(x,v,w,n))}))})}),{res:r,usedKey:i,exactUsedKey:a,usedLng:s,usedNS:o}}isValidLookup(e){return e!==void 0&&!(!this.options.returnNull&&e===null)&&!(!this.options.returnEmptyString&&e==="")}getResource(e,n,r,i={}){return this.i18nFormat?.getResource?this.i18nFormat.getResource(e,n,r,i):this.resourceStore.getResource(e,n,r,i)}getUsedParamsDetails(e={}){const n=["defaultValue","ordinal","context","replace","lng","lngs","fallbackLng","ns","keySeparator","nsSeparator","returnObjects","returnDetails","joinArrays","postProcess","interpolation"],r=e.replace&&!Gt(e.replace);let i=r?e.replace:e;if(r&&typeof e.count<"u"&&(i.count=e.count),this.options.interpolation.defaultVariables&&(i={...this.options.interpolation.defaultVariables,...i}),!r){i={...i};for(const a of n)delete i[a]}return i}static hasDefaultValue(e){const n="defaultValue";for(const r in e)if(Object.prototype.hasOwnProperty.call(e,r)&&n===r.substring(0,n.length)&&e[r]!==void 0)return!0;return!1}}class yU{constructor(e){this.options=e,this.supportedLngs=this.options.supportedLngs||!1,this.logger=qo.create("languageUtils")}getScriptPartFromCode(e){if(e=qx(e),!e||e.indexOf("-")<0)return null;const n=e.split("-");return n.length===2||(n.pop(),n[n.length-1].toLowerCase()==="x")?null:this.formatLanguageCode(n.join("-"))}getLanguagePartFromCode(e){if(e=qx(e),!e||e.indexOf("-")<0)return e;const n=e.split("-");return this.formatLanguageCode(n[0])}formatLanguageCode(e){if(Gt(e)&&e.indexOf("-")>-1){let n;try{n=Intl.getCanonicalLocales(e)[0]}catch{}return n&&this.options.lowerCaseLng&&(n=n.toLowerCase()),n||(this.options.lowerCaseLng?e.toLowerCase():e)}return this.options.cleanCode||this.options.lowerCaseLng?e.toLowerCase():e}isSupportedCode(e){return(this.options.load==="languageOnly"||this.options.nonExplicitSupportedLngs)&&(e=this.getLanguagePartFromCode(e)),!this.supportedLngs||!this.supportedLngs.length||this.supportedLngs.indexOf(e)>-1}getBestMatchFromCodes(e){if(!e)return null;let n;return e.forEach(r=>{if(n)return;const i=this.formatLanguageCode(r);(!this.options.supportedLngs||this.isSupportedCode(i))&&(n=i)}),!n&&this.options.supportedLngs&&e.forEach(r=>{if(n)return;const i=this.getScriptPartFromCode(r);if(this.isSupportedCode(i))return n=i;const a=this.getLanguagePartFromCode(r);if(this.isSupportedCode(a))return n=a;n=this.options.supportedLngs.find(s=>{if(s===a)return s;if(!(s.indexOf("-")<0&&a.indexOf("-")<0)&&(s.indexOf("-")>0&&a.indexOf("-")<0&&s.substring(0,s.indexOf("-"))===a||s.indexOf(a)===0&&a.length>1))return s})}),n||(n=this.getFallbackCodes(this.options.fallbackLng)[0]),n}getFallbackCodes(e,n){if(!e)return[];if(typeof e=="function"&&(e=e(n)),Gt(e)&&(e=[e]),Array.isArray(e))return e;if(!n)return e.default||[];let r=e[n];return r||(r=e[this.getScriptPartFromCode(n)]),r||(r=e[this.formatLanguageCode(n)]),r||(r=e[this.getLanguagePartFromCode(n)]),r||(r=e.default),r||[]}toResolveHierarchy(e,n){const r=this.getFallbackCodes((n===!1?[]:n)||this.options.fallbackLng||[],e),i=[],a=s=>{s&&(this.isSupportedCode(s)?i.push(s):this.logger.warn(`rejecting language code not found in supportedLngs: ${s}`))};return Gt(e)&&(e.indexOf("-")>-1||e.indexOf("_")>-1)?(this.options.load!=="languageOnly"&&a(this.formatLanguageCode(e)),this.options.load!=="languageOnly"&&this.options.load!=="currentOnly"&&a(this.getScriptPartFromCode(e)),this.options.load!=="currentOnly"&&a(this.getLanguagePartFromCode(e))):Gt(e)&&a(this.formatLanguageCode(e)),r.forEach(s=>{i.indexOf(s)<0&&a(this.formatLanguageCode(s))}),i}}const _U={zero:0,one:1,two:2,few:3,many:4,other:5},SU={select:t=>t===1?"one":"other",resolvedOptions:()=>({pluralCategories:["one","other"]})};class Hne{constructor(e,n={}){this.languageUtils=e,this.options=n,this.logger=qo.create("pluralResolver"),this.pluralRulesCache={}}addRule(e,n){this.rules[e]=n}clearCache(){this.pluralRulesCache={}}getRule(e,n={}){const r=qx(e==="dev"?"en":e),i=n.ordinal?"ordinal":"cardinal",a=JSON.stringify({cleanedCode:r,type:i});if(a in this.pluralRulesCache)return this.pluralRulesCache[a];let s;try{s=new Intl.PluralRules(r,{type:i})}catch{if(!Intl)return this.logger.error("No Intl support, please use an Intl polyfill!"),SU;if(!e.match(/-|_/))return SU;const l=this.languageUtils.getLanguagePartFromCode(e);s=this.getRule(l,n)}return this.pluralRulesCache[a]=s,s}needsPlural(e,n={}){let r=this.getRule(e,n);return r||(r=this.getRule("dev",n)),r?.resolvedOptions().pluralCategories.length>1}getPluralFormsOfKey(e,n,r={}){return this.getSuffixes(e,r).map(i=>`${n}${i}`)}getSuffixes(e,n={}){let r=this.getRule(e,n);return r||(r=this.getRule("dev",n)),r?r.resolvedOptions().pluralCategories.sort((i,a)=>_U[i]-_U[a]).map(i=>`${this.options.prepend}${n.ordinal?`ordinal${this.options.prepend}`:""}${i}`):[]}getSuffix(e,n,r={}){const i=this.getRule(e,r);return i?`${this.options.prepend}${r.ordinal?`ordinal${this.options.prepend}`:""}${i.select(n)}`:(this.logger.warn(`no plural rule found for: ${e}`),this.getSuffix("dev",n,r))}}const wU=(t,e,n,r=".",i=!0)=>{let a=Dne(t,e,n);return!a&&i&&Gt(n)&&(a=NN(t,n,r),a===void 0&&(a=NN(e,n,r))),a},BA=t=>t.replace(/\$/g,"$$$$");class $ne{constructor(e={}){this.logger=qo.create("interpolator"),this.options=e,this.format=e?.interpolation?.format||(n=>n),this.init(e)}init(e={}){e.interpolation||(e.interpolation={escapeValue:!0});const{escape:n,escapeValue:r,useRawValueToEscape:i,prefix:a,prefixEscaped:s,suffix:o,suffixEscaped:l,formatSeparator:c,unescapeSuffix:u,unescapePrefix:h,nestingPrefix:g,nestingPrefixEscaped:m,nestingSuffix:b,nestingSuffixEscaped:_,nestingOptionsSeparator:v,maxReplaces:x,alwaysFormat:M}=e.interpolation;this.escape=n!==void 0?n:Lne,this.escapeValue=r!==void 0?r:!0,this.useRawValueToEscape=i!==void 0?i:!1,this.prefix=a?Rh(a):s||"{{",this.suffix=o?Rh(o):l||"}}",this.formatSeparator=c||",",this.unescapePrefix=u?"":h||"-",this.unescapeSuffix=this.unescapePrefix?"":u||"",this.nestingPrefix=g?Rh(g):m||Rh("$t("),this.nestingSuffix=b?Rh(b):_||Rh(")"),this.nestingOptionsSeparator=v||",",this.maxReplaces=x||1e3,this.alwaysFormat=M!==void 0?M:!1,this.resetRegExp()}reset(){this.options&&this.init(this.options)}resetRegExp(){const e=(n,r)=>n?.source===r?(n.lastIndex=0,n):new RegExp(r,"g");this.regexp=e(this.regexp,`${this.prefix}(.+?)${this.suffix}`),this.regexpUnescape=e(this.regexpUnescape,`${this.prefix}${this.unescapePrefix}(.+?)${this.unescapeSuffix}${this.suffix}`),this.nestingRegexp=e(this.nestingRegexp,`${this.nestingPrefix}((?:[^()"']+|"[^"]*"|'[^']*'|\\((?:[^()]|"[^"]*"|'[^']*')*\\))*?)${this.nestingSuffix}`)}interpolate(e,n,r,i){let a,s,o;const l=this.options&&this.options.interpolation&&this.options.interpolation.defaultVariables||{},c=m=>{if(m.indexOf(this.formatSeparator)<0){const x=wU(n,l,m,this.options.keySeparator,this.options.ignoreJSONStructure);return this.alwaysFormat?this.format(x,void 0,r,{...i,...n,interpolationkey:m}):x}const b=m.split(this.formatSeparator),_=b.shift().trim(),v=b.join(this.formatSeparator).trim();return this.format(wU(n,l,_,this.options.keySeparator,this.options.ignoreJSONStructure),v,r,{...i,...n,interpolationkey:_})};this.resetRegExp();const u=i?.missingInterpolationHandler||this.options.missingInterpolationHandler,h=i?.interpolation?.skipOnVariables!==void 0?i.interpolation.skipOnVariables:this.options.interpolation.skipOnVariables;return[{regex:this.regexpUnescape,safeValue:m=>BA(m)},{regex:this.regexp,safeValue:m=>this.escapeValue?BA(this.escape(m)):BA(m)}].forEach(m=>{for(o=0;a=m.regex.exec(e);){const b=a[1].trim();if(s=c(b),s===void 0)if(typeof u=="function"){const v=u(e,a,i);s=Gt(v)?v:""}else if(i&&Object.prototype.hasOwnProperty.call(i,b))s="";else if(h){s=a[0];continue}else this.logger.warn(`missed to pass in variable ${b} for interpolating ${e}`),s="";else!Gt(s)&&!this.useRawValueToEscape&&(s=pU(s));const _=m.safeValue(s);if(e=e.replace(a[0],_),h?(m.regex.lastIndex+=s.length,m.regex.lastIndex-=a[0].length):m.regex.lastIndex=0,o++,o>=this.maxReplaces)break}}),e}nest(e,n,r={}){let i,a,s;const o=(l,c)=>{const u=this.nestingOptionsSeparator;if(l.indexOf(u)<0)return l;const h=l.split(new RegExp(`${u}[ ]*{`));let g=`{${h[1]}`;l=h[0],g=this.interpolate(g,s);const m=g.match(/'/g),b=g.match(/"/g);((m?.length??0)%2===0&&!b||b.length%2!==0)&&(g=g.replace(/'/g,'"'));try{s=JSON.parse(g),c&&(s={...c,...s})}catch(_){return this.logger.warn(`failed parsing options string in nesting for key ${l}`,_),`${l}${u}${g}`}return s.defaultValue&&s.defaultValue.indexOf(this.prefix)>-1&&delete s.defaultValue,l};for(;i=this.nestingRegexp.exec(e);){let l=[];s={...r},s=s.replace&&!Gt(s.replace)?s.replace:s,s.applyPostProcessor=!1,delete s.defaultValue;const c=/{.*}/.test(i[1])?i[1].lastIndexOf("}")+1:i[1].indexOf(this.formatSeparator);if(c!==-1&&(l=i[1].slice(c).split(this.formatSeparator).map(u=>u.trim()).filter(Boolean),i[1]=i[1].slice(0,c)),a=n(o.call(this,i[1].trim(),s),s),a&&i[0]===e&&!Gt(a))return a;Gt(a)||(a=pU(a)),a||(this.logger.warn(`missed to resolve ${i[1]} for nesting ${e}`),a=""),l.length&&(a=l.reduce((u,h)=>this.format(u,h,r.lng,{...r,interpolationkey:i[1].trim()}),a.trim())),e=e.replace(i[0],a),this.regexp.lastIndex=0}return e}}const Vne=t=>{let e=t.toLowerCase().trim();const n={};if(t.indexOf("(")>-1){const r=t.split("(");e=r[0].toLowerCase().trim();const i=r[1].substring(0,r[1].length-1);e==="currency"&&i.indexOf(":")<0?n.currency||(n.currency=i.trim()):e==="relativetime"&&i.indexOf(":")<0?n.range||(n.range=i.trim()):i.split(";").forEach(s=>{if(s){const[o,...l]=s.split(":"),c=l.join(":").trim().replace(/^'+|'+$/g,""),u=o.trim();n[u]||(n[u]=c),c==="false"&&(n[u]=!1),c==="true"&&(n[u]=!0),isNaN(c)||(n[u]=parseInt(c,10))}})}return{formatName:e,formatOptions:n}},MU=t=>{const e={};return(n,r,i)=>{let a=i;i&&i.interpolationkey&&i.formatParams&&i.formatParams[i.interpolationkey]&&i[i.interpolationkey]&&(a={...a,[i.interpolationkey]:void 0});const s=r+JSON.stringify(a);let o=e[s];return o||(o=t(qx(r),i),e[s]=o),o(n)}},Gne=t=>(e,n,r)=>t(qx(n),r)(e);class Wne{constructor(e={}){this.logger=qo.create("formatter"),this.options=e,this.init(e)}init(e,n={interpolation:{}}){this.formatSeparator=n.interpolation.formatSeparator||",";const r=n.cacheInBuiltFormats?MU:Gne;this.formats={number:r((i,a)=>{const s=new Intl.NumberFormat(i,{...a});return o=>s.format(o)}),currency:r((i,a)=>{const s=new Intl.NumberFormat(i,{...a,style:"currency"});return o=>s.format(o)}),datetime:r((i,a)=>{const s=new Intl.DateTimeFormat(i,{...a});return o=>s.format(o)}),relativetime:r((i,a)=>{const s=new Intl.RelativeTimeFormat(i,{...a});return o=>s.format(o,a.range||"day")}),list:r((i,a)=>{const s=new Intl.ListFormat(i,{...a});return o=>s.format(o)})}}add(e,n){this.formats[e.toLowerCase().trim()]=n}addCached(e,n){this.formats[e.toLowerCase().trim()]=MU(n)}format(e,n,r,i={}){const a=n.split(this.formatSeparator);if(a.length>1&&a[0].indexOf("(")>1&&a[0].indexOf(")")<0&&a.find(o=>o.indexOf(")")>-1)){const o=a.findIndex(l=>l.indexOf(")")>-1);a[0]=[a[0],...a.splice(1,o)].join(this.formatSeparator)}return a.reduce((o,l)=>{const{formatName:c,formatOptions:u}=Vne(l);if(this.formats[c]){let h=o;try{const g=i?.formatParams?.[i.interpolationkey]||{},m=g.locale||g.lng||i.locale||i.lng||r;h=this.formats[c](o,m,{...u,...i,...g})}catch(g){this.logger.warn(g)}return h}else this.logger.warn(`there was no format function for ${c}`);return o},e)}}const qne=(t,e)=>{t.pending[e]!==void 0&&(delete t.pending[e],t.pendingCount--)};class Xne extends ew{constructor(e,n,r,i={}){super(),this.backend=e,this.store=n,this.services=r,this.languageUtils=r.languageUtils,this.options=i,this.logger=qo.create("backendConnector"),this.waitingReads=[],this.maxParallelReads=i.maxParallelReads||10,this.readingCalls=0,this.maxRetries=i.maxRetries>=0?i.maxRetries:5,this.retryTimeout=i.retryTimeout>=1?i.retryTimeout:350,this.state={},this.queue=[],this.backend?.init?.(r,i.backend,i)}queueLoad(e,n,r,i){const a={},s={},o={},l={};return e.forEach(c=>{let u=!0;n.forEach(h=>{const g=`${c}|${h}`;!r.reload&&this.store.hasResourceBundle(c,h)?this.state[g]=2:this.state[g]<0||(this.state[g]===1?s[g]===void 0&&(s[g]=!0):(this.state[g]=1,u=!1,s[g]===void 0&&(s[g]=!0),a[g]===void 0&&(a[g]=!0),l[h]===void 0&&(l[h]=!0)))}),u||(o[c]=!0)}),(Object.keys(a).length||Object.keys(s).length)&&this.queue.push({pending:s,pendingCount:Object.keys(s).length,loaded:{},errors:[],callback:i}),{toLoad:Object.keys(a),pending:Object.keys(s),toLoadLanguages:Object.keys(o),toLoadNamespaces:Object.keys(l)}}loaded(e,n,r){const i=e.split("|"),a=i[0],s=i[1];n&&this.emit("failedLoading",a,s,n),!n&&r&&this.store.addResourceBundle(a,s,r,void 0,void 0,{skipCopy:!0}),this.state[e]=n?-1:2,n&&r&&(this.state[e]=0);const o={};this.queue.forEach(l=>{kne(l.loaded,[a],s),qne(l,e),n&&l.errors.push(n),l.pendingCount===0&&!l.done&&(Object.keys(l.loaded).forEach(c=>{o[c]||(o[c]={});const u=l.loaded[c];u.length&&u.forEach(h=>{o[c][h]===void 0&&(o[c][h]=!0)})}),l.done=!0,l.errors.length?l.callback(l.errors):l.callback())}),this.emit("loaded",o),this.queue=this.queue.filter(l=>!l.done)}read(e,n,r,i=0,a=this.retryTimeout,s){if(!e.length)return s(null,{});if(this.readingCalls>=this.maxParallelReads){this.waitingReads.push({lng:e,ns:n,fcName:r,tried:i,wait:a,callback:s});return}this.readingCalls++;const o=(c,u)=>{if(this.readingCalls--,this.waitingReads.length>0){const h=this.waitingReads.shift();this.read(h.lng,h.ns,h.fcName,h.tried,h.wait,h.callback)}if(c&&u&&i{this.read.call(this,e,n,r,i+1,a*2,s)},a);return}s(c,u)},l=this.backend[r].bind(this.backend);if(l.length===2){try{const c=l(e,n);c&&typeof c.then=="function"?c.then(u=>o(null,u)).catch(o):o(null,c)}catch(c){o(c)}return}return l(e,n,o)}prepareLoading(e,n,r={},i){if(!this.backend)return this.logger.warn("No backend was added via i18next.use. Will not load resources."),i&&i();Gt(e)&&(e=this.languageUtils.toResolveHierarchy(e)),Gt(n)&&(n=[n]);const a=this.queueLoad(e,n,r,i);if(!a.toLoad.length)return a.pending.length||i(),null;a.toLoad.forEach(s=>{this.loadOne(s)})}load(e,n,r){this.prepareLoading(e,n,{},r)}reload(e,n,r){this.prepareLoading(e,n,{reload:!0},r)}loadOne(e,n=""){const r=e.split("|"),i=r[0],a=r[1];this.read(i,a,"read",void 0,void 0,(s,o)=>{s&&this.logger.warn(`${n}loading namespace ${a} for language ${i} failed`,s),!s&&o&&this.logger.log(`${n}loaded namespace ${a} for language ${i}`,o),this.loaded(e,s,o)})}saveMissing(e,n,r,i,a,s={},o=()=>{}){if(this.services?.utils?.hasLoadedNamespace&&!this.services?.utils?.hasLoadedNamespace(n)){this.logger.warn(`did not save key "${r}" as the namespace "${n}" was not yet loaded`,"This means something IS WRONG in your setup. You access the t function before i18next.init / i18next.loadNamespace / i18next.changeLanguage was done. Wait for the callback or Promise to resolve before accessing it!!!");return}if(!(r==null||r==="")){if(this.backend?.create){const l={...s,isUpdate:a},c=this.backend.create.bind(this.backend);if(c.length<6)try{let u;c.length===5?u=c(e,n,r,i,l):u=c(e,n,r,i),u&&typeof u.then=="function"?u.then(h=>o(null,h)).catch(o):o(null,u)}catch(u){o(u)}else c(e,n,r,i,o,l)}!e||!e[0]||this.store.addResource(e[0],n,r,i)}}}const EU=()=>({debug:!1,initAsync:!0,ns:["translation"],defaultNS:["translation"],fallbackLng:["dev"],fallbackNS:!1,supportedLngs:!1,nonExplicitSupportedLngs:!1,load:"all",preload:!1,simplifyPluralSuffix:!0,keySeparator:".",nsSeparator:":",pluralSeparator:"_",contextSeparator:"_",partialBundledLanguages:!1,saveMissing:!1,updateMissing:!1,saveMissingTo:"fallback",saveMissingPlurals:!0,missingKeyHandler:!1,missingInterpolationHandler:!1,postProcess:!1,postProcessPassResolved:!1,returnNull:!1,returnEmptyString:!0,returnObjects:!1,joinArrays:!1,returnedObjectHandler:!1,parseMissingKeyHandler:!1,appendNamespaceToMissingKey:!1,appendNamespaceToCIMode:!1,overloadTranslationOptionHandler:t=>{let e={};if(typeof t[1]=="object"&&(e=t[1]),Gt(t[1])&&(e.defaultValue=t[1]),Gt(t[2])&&(e.tDescription=t[2]),typeof t[2]=="object"||typeof t[3]=="object"){const n=t[3]||t[2];Object.keys(n).forEach(r=>{e[r]=n[r]})}return e},interpolation:{escapeValue:!0,format:t=>t,prefix:"{{",suffix:"}}",formatSeparator:",",unescapePrefix:"-",nestingPrefix:"$t(",nestingSuffix:")",nestingOptionsSeparator:",",maxReplaces:1e3,skipOnVariables:!0},cacheInBuiltFormats:!0}),AU=t=>(Gt(t.ns)&&(t.ns=[t.ns]),Gt(t.fallbackLng)&&(t.fallbackLng=[t.fallbackLng]),Gt(t.fallbackNS)&&(t.fallbackNS=[t.fallbackNS]),t.supportedLngs?.indexOf?.("cimode")<0&&(t.supportedLngs=t.supportedLngs.concat(["cimode"])),typeof t.initImmediate=="boolean"&&(t.initAsync=t.initImmediate),t),jb=()=>{},Kne=t=>{Object.getOwnPropertyNames(Object.getPrototypeOf(t)).forEach(n=>{typeof t[n]=="function"&&(t[n]=t[n].bind(t))})};class Mx extends ew{constructor(e={},n){if(super(),this.options=AU(e),this.services={},this.logger=qo,this.modules={external:[]},Kne(this),n&&!this.isInitialized&&!e.isClone){if(!this.options.initAsync)return this.init(e,n),this;setTimeout(()=>{this.init(e,n)},0)}}init(e={},n){this.isInitializing=!0,typeof e=="function"&&(n=e,e={}),e.defaultNS==null&&e.ns&&(Gt(e.ns)?e.defaultNS=e.ns:e.ns.indexOf("translation")<0&&(e.defaultNS=e.ns[0]));const r=EU();this.options={...r,...this.options,...AU(e)},this.options.interpolation={...r.interpolation,...this.options.interpolation},e.keySeparator!==void 0&&(this.options.userDefinedKeySeparator=e.keySeparator),e.nsSeparator!==void 0&&(this.options.userDefinedNsSeparator=e.nsSeparator);const i=c=>c?typeof c=="function"?new c:c:null;if(!this.options.isClone){this.modules.logger?qo.init(i(this.modules.logger),this.options):qo.init(null,this.options);let c;this.modules.formatter?c=this.modules.formatter:c=Wne;const u=new yU(this.options);this.store=new vU(this.options.resources,this.options);const h=this.services;h.logger=qo,h.resourceStore=this.store,h.languageUtils=u,h.pluralResolver=new Hne(u,{prepend:this.options.pluralSeparator,simplifyPluralSuffix:this.options.simplifyPluralSuffix}),this.options.interpolation.format&&this.options.interpolation.format!==r.interpolation.format&&this.logger.deprecate("init: you are still using the legacy format function, please use the new approach: https://www.i18next.com/translation-function/formatting"),c&&(!this.options.interpolation.format||this.options.interpolation.format===r.interpolation.format)&&(h.formatter=i(c),h.formatter.init&&h.formatter.init(h,this.options),this.options.interpolation.format=h.formatter.format.bind(h.formatter)),h.interpolator=new $ne(this.options),h.utils={hasLoadedNamespace:this.hasLoadedNamespace.bind(this)},h.backendConnector=new Xne(i(this.modules.backend),h.resourceStore,h,this.options),h.backendConnector.on("*",(m,...b)=>{this.emit(m,...b)}),this.modules.languageDetector&&(h.languageDetector=i(this.modules.languageDetector),h.languageDetector.init&&h.languageDetector.init(h,this.options.detection,this.options)),this.modules.i18nFormat&&(h.i18nFormat=i(this.modules.i18nFormat),h.i18nFormat.init&&h.i18nFormat.init(this)),this.translator=new G_(this.services,this.options),this.translator.on("*",(m,...b)=>{this.emit(m,...b)}),this.modules.external.forEach(m=>{m.init&&m.init(this)})}if(this.format=this.options.interpolation.format,n||(n=jb),this.options.fallbackLng&&!this.services.languageDetector&&!this.options.lng){const c=this.services.languageUtils.getFallbackCodes(this.options.fallbackLng);c.length>0&&c[0]!=="dev"&&(this.options.lng=c[0])}!this.services.languageDetector&&!this.options.lng&&this.logger.warn("init: no languageDetector is used and no lng is defined"),["getResource","hasResourceBundle","getResourceBundle","getDataByLanguage"].forEach(c=>{this[c]=(...u)=>this.store[c](...u)}),["addResource","addResources","addResourceBundle","removeResourceBundle"].forEach(c=>{this[c]=(...u)=>(this.store[c](...u),this)});const o=Fg(),l=()=>{const c=(u,h)=>{this.isInitializing=!1,this.isInitialized&&!this.initializedStoreOnce&&this.logger.warn("init: i18next is already initialized. You should call init just once!"),this.isInitialized=!0,this.options.isClone||this.logger.log("initialized",this.options),this.emit("initialized",this.options),o.resolve(h),n(u,h)};if(this.languages&&!this.isInitialized)return c(null,this.t.bind(this));this.changeLanguage(this.options.lng,c)};return this.options.resources||!this.options.initAsync?l():setTimeout(l,0),o}loadResources(e,n=jb){let r=n;const i=Gt(e)?e:this.language;if(typeof e=="function"&&(r=e),!this.options.resources||this.options.partialBundledLanguages){if(i?.toLowerCase()==="cimode"&&(!this.options.preload||this.options.preload.length===0))return r();const a=[],s=o=>{if(!o||o==="cimode")return;this.services.languageUtils.toResolveHierarchy(o).forEach(c=>{c!=="cimode"&&a.indexOf(c)<0&&a.push(c)})};i?s(i):this.services.languageUtils.getFallbackCodes(this.options.fallbackLng).forEach(l=>s(l)),this.options.preload?.forEach?.(o=>s(o)),this.services.backendConnector.load(a,this.options.ns,o=>{!o&&!this.resolvedLanguage&&this.language&&this.setResolvedLanguage(this.language),r(o)})}else r(null)}reloadResources(e,n,r){const i=Fg();return typeof e=="function"&&(r=e,e=void 0),typeof n=="function"&&(r=n,n=void 0),e||(e=this.languages),n||(n=this.options.ns),r||(r=jb),this.services.backendConnector.reload(e,n,a=>{i.resolve(),r(a)}),i}use(e){if(!e)throw new Error("You are passing an undefined module! Please check the object you are passing to i18next.use()");if(!e.type)throw new Error("You are passing a wrong module! Please check the object you are passing to i18next.use()");return e.type==="backend"&&(this.modules.backend=e),(e.type==="logger"||e.log&&e.warn&&e.error)&&(this.modules.logger=e),e.type==="languageDetector"&&(this.modules.languageDetector=e),e.type==="i18nFormat"&&(this.modules.i18nFormat=e),e.type==="postProcessor"&&wG.addPostProcessor(e),e.type==="formatter"&&(this.modules.formatter=e),e.type==="3rdParty"&&this.modules.external.push(e),this}setResolvedLanguage(e){if(!(!e||!this.languages)&&!(["cimode","dev"].indexOf(e)>-1)){for(let n=0;n-1)&&this.store.hasLanguageSomeTranslations(r)){this.resolvedLanguage=r;break}}!this.resolvedLanguage&&this.languages.indexOf(e)<0&&this.store.hasLanguageSomeTranslations(e)&&(this.resolvedLanguage=e,this.languages.unshift(e))}}changeLanguage(e,n){this.isLanguageChangingTo=e;const r=Fg();this.emit("languageChanging",e);const i=o=>{this.language=o,this.languages=this.services.languageUtils.toResolveHierarchy(o),this.resolvedLanguage=void 0,this.setResolvedLanguage(o)},a=(o,l)=>{l?this.isLanguageChangingTo===e&&(i(l),this.translator.changeLanguage(l),this.isLanguageChangingTo=void 0,this.emit("languageChanged",l),this.logger.log("languageChanged",l)):this.isLanguageChangingTo=void 0,r.resolve((...c)=>this.t(...c)),n&&n(o,(...c)=>this.t(...c))},s=o=>{!e&&!o&&this.services.languageDetector&&(o=[]);const l=Gt(o)?o:o&&o[0],c=this.store.hasLanguageSomeTranslations(l)?l:this.services.languageUtils.getBestMatchFromCodes(Gt(o)?[o]:o);c&&(this.language||i(c),this.translator.language||this.translator.changeLanguage(c),this.services.languageDetector?.cacheUserLanguage?.(c)),this.loadResources(c,u=>{a(u,c)})};return!e&&this.services.languageDetector&&!this.services.languageDetector.async?s(this.services.languageDetector.detect()):!e&&this.services.languageDetector&&this.services.languageDetector.async?this.services.languageDetector.detect.length===0?this.services.languageDetector.detect().then(s):this.services.languageDetector.detect(s):s(e),r}getFixedT(e,n,r){const i=(a,s,...o)=>{let l;typeof s!="object"?l=this.options.overloadTranslationOptionHandler([a,s].concat(o)):l={...s},l.lng=l.lng||i.lng,l.lngs=l.lngs||i.lngs,l.ns=l.ns||i.ns,l.keyPrefix!==""&&(l.keyPrefix=l.keyPrefix||r||i.keyPrefix);const c=this.options.keySeparator||".";let u;return l.keyPrefix&&Array.isArray(a)?u=a.map(h=>(typeof h=="function"&&(h=RN(h,{...this.options,...s})),`${l.keyPrefix}${c}${h}`)):(typeof a=="function"&&(a=RN(a,{...this.options,...s})),u=l.keyPrefix?`${l.keyPrefix}${c}${a}`:a),this.t(u,l)};return Gt(e)?i.lng=e:i.lngs=e,i.ns=n,i.keyPrefix=r,i}t(...e){return this.translator?.translate(...e)}exists(...e){return this.translator?.exists(...e)}setDefaultNamespace(e){this.options.defaultNS=e}hasLoadedNamespace(e,n={}){if(!this.isInitialized)return this.logger.warn("hasLoadedNamespace: i18next was not initialized",this.languages),!1;if(!this.languages||!this.languages.length)return this.logger.warn("hasLoadedNamespace: i18n.languages were undefined or empty",this.languages),!1;const r=n.lng||this.resolvedLanguage||this.languages[0],i=this.options?this.options.fallbackLng:!1,a=this.languages[this.languages.length-1];if(r.toLowerCase()==="cimode")return!0;const s=(o,l)=>{const c=this.services.backendConnector.state[`${o}|${l}`];return c===-1||c===0||c===2};if(n.precheck){const o=n.precheck(this,s);if(o!==void 0)return o}return!!(this.hasResourceBundle(r,e)||!this.services.backendConnector.backend||this.options.resources&&!this.options.partialBundledLanguages||s(r,e)&&(!i||s(a,e)))}loadNamespaces(e,n){const r=Fg();return this.options.ns?(Gt(e)&&(e=[e]),e.forEach(i=>{this.options.ns.indexOf(i)<0&&this.options.ns.push(i)}),this.loadResources(i=>{r.resolve(),n&&n(i)}),r):(n&&n(),Promise.resolve())}loadLanguages(e,n){const r=Fg();Gt(e)&&(e=[e]);const i=this.options.preload||[],a=e.filter(s=>i.indexOf(s)<0&&this.services.languageUtils.isSupportedCode(s));return a.length?(this.options.preload=i.concat(a),this.loadResources(s=>{r.resolve(),n&&n(s)}),r):(n&&n(),Promise.resolve())}dir(e){if(e||(e=this.resolvedLanguage||(this.languages?.length>0?this.languages[0]:this.language)),!e)return"rtl";try{const i=new Intl.Locale(e);if(i&&i.getTextInfo){const a=i.getTextInfo();if(a&&a.direction)return a.direction}}catch{}const n=["ar","shu","sqr","ssh","xaa","yhd","yud","aao","abh","abv","acm","acq","acw","acx","acy","adf","ads","aeb","aec","afb","ajp","apc","apd","arb","arq","ars","ary","arz","auz","avl","ayh","ayl","ayn","ayp","bbz","pga","he","iw","ps","pbt","pbu","pst","prp","prd","ug","ur","ydd","yds","yih","ji","yi","hbo","men","xmn","fa","jpr","peo","pes","prs","dv","sam","ckb"],r=this.services?.languageUtils||new yU(EU());return e.toLowerCase().indexOf("-latn")>1?"ltr":n.indexOf(r.getLanguagePartFromCode(e))>-1||e.toLowerCase().indexOf("-arab")>1?"rtl":"ltr"}static createInstance(e={},n){const r=new Mx(e,n);return r.createInstance=Mx.createInstance,r}cloneInstance(e={},n=jb){const r=e.forkResourceStore;r&&delete e.forkResourceStore;const i={...this.options,...e,isClone:!0},a=new Mx(i);if((e.debug!==void 0||e.prefix!==void 0)&&(a.logger=a.logger.clone(e)),["store","services","language"].forEach(o=>{a[o]=this[o]}),a.services={...this.services},a.services.utils={hasLoadedNamespace:a.hasLoadedNamespace.bind(a)},r){const o=Object.keys(this.store.data).reduce((l,c)=>(l[c]={...this.store.data[c]},l[c]=Object.keys(l[c]).reduce((u,h)=>(u[h]={...l[c][h]},u),l[c]),l),{});a.store=new vU(o,i),a.services.resourceStore=a.store}return a.translator=new G_(a.services,i),a.translator.on("*",(o,...l)=>{a.emit(o,...l)}),a.init(i,n),a.translator.options=i,a.translator.backendConnector.services.utils={hasLoadedNamespace:a.hasLoadedNamespace.bind(a)},a}toJSON(){return{options:this.options,store:this.store,language:this.language,languages:this.languages,resolvedLanguage:this.resolvedLanguage}}}const Ea=Mx.createInstance();Ea.createInstance;Ea.dir;Ea.init;Ea.loadResources;Ea.reloadResources;Ea.use;Ea.changeLanguage;Ea.getFixedT;Ea.t;Ea.exists;Ea.setDefaultNamespace;Ea.hasLoadedNamespace;Ea.loadNamespaces;Ea.loadLanguages;const Yne=(t,e,n,r)=>{const i=[n,{code:e,...r||{}}];if(t?.services?.logger?.forward)return t.services.logger.forward(i,"warn","react-i18next::",!0);Sf(i[0])&&(i[0]=`react-i18next:: ${i[0]}`),t?.services?.logger?.warn?t.services.logger.warn(...i):console?.warn&&console.warn(...i)},TU={},EG=(t,e,n,r)=>{Sf(n)&&TU[n]||(Sf(n)&&(TU[n]=new Date),Yne(t,e,n,r))},AG=(t,e)=>()=>{if(t.isInitialized)e();else{const n=()=>{setTimeout(()=>{t.off("initialized",n)},0),e()};t.on("initialized",n)}},PN=(t,e,n)=>{t.loadNamespaces(e,AG(t,n))},CU=(t,e,n,r)=>{if(Sf(n)&&(n=[n]),t.options.preload&&t.options.preload.indexOf(e)>-1)return PN(t,n,r);n.forEach(i=>{t.options.ns.indexOf(i)<0&&t.options.ns.push(i)}),t.loadLanguages(e,AG(t,r))},Zne=(t,e,n={})=>!e.languages||!e.languages.length?(EG(e,"NO_LANGUAGES","i18n.languages were undefined or empty",{languages:e.languages}),!0):e.hasLoadedNamespace(t,{lng:n.lng,precheck:(r,i)=>{if(n.bindI18n&&n.bindI18n.indexOf("languageChanging")>-1&&r.services.backendConnector.backend&&r.isLanguageChangingTo&&!i(r.isLanguageChangingTo,t))return!1}}),Sf=t=>typeof t=="string",Qne=t=>typeof t=="object"&&t!==null,Jne=/&(?:amp|#38|lt|#60|gt|#62|apos|#39|quot|#34|nbsp|#160|copy|#169|reg|#174|hellip|#8230|#x2F|#47);/g,ere={"&":"&","&":"&","<":"<","<":"<",">":">",">":">","'":"'","'":"'",""":'"',""":'"'," ":" "," ":" ","©":"©","©":"©","®":"®","®":"®","…":"…","…":"…","/":"/","/":"/"},tre=t=>ere[t],nre=t=>t.replace(Jne,tre);let kN={bindI18n:"languageChanged",bindI18nStore:"",transEmptyNodeValue:"",transSupportBasicHtmlNodes:!0,transWrapTextNodes:"",transKeepBasicHtmlNodesFor:["br","strong","i","p"],useSuspense:!0,unescape:nre};const rre=(t={})=>{kN={...kN,...t}},ire=()=>kN;let TG;const are=t=>{TG=t},sre=()=>TG,ore={type:"3rdParty",init(t){rre(t.options.react),are(t)}},lre=E.createContext();class cre{constructor(){this.usedNamespaces={}}addUsedNamespaces(e){e.forEach(n=>{this.usedNamespaces[n]||(this.usedNamespaces[n]=!0)})}getUsedNamespaces(){return Object.keys(this.usedNamespaces)}}var HA={exports:{}},$A={};var NU;function ure(){if(NU)return $A;NU=1;var t=Mm();function e(h,g){return h===g&&(h!==0||1/h===1/g)||h!==h&&g!==g}var n=typeof Object.is=="function"?Object.is:e,r=t.useState,i=t.useEffect,a=t.useLayoutEffect,s=t.useDebugValue;function o(h,g){var m=g(),b=r({inst:{value:m,getSnapshot:g}}),_=b[0].inst,v=b[1];return a(function(){_.value=m,_.getSnapshot=g,l(_)&&v({inst:_})},[h,m,g]),i(function(){return l(_)&&v({inst:_}),h(function(){l(_)&&v({inst:_})})},[h]),s(m),m}function l(h){var g=h.getSnapshot;h=h.value;try{var m=g();return!n(h,m)}catch{return!0}}function c(h,g){return g()}var u=typeof window>"u"||typeof window.document>"u"||typeof window.document.createElement>"u"?c:o;return $A.useSyncExternalStore=t.useSyncExternalStore!==void 0?t.useSyncExternalStore:u,$A}var RU;function CG(){return RU||(RU=1,HA.exports=ure()),HA.exports}var LP=CG();const dre=(t,e)=>Sf(e)?e:Qne(e)&&Sf(e.defaultValue)?e.defaultValue:Array.isArray(t)?t[t.length-1]:t,fre={t:dre,ready:!1},hre=()=>()=>{},IP=(t,e={})=>{const{i18n:n}=e,{i18n:r,defaultNS:i}=E.useContext(lre)||{},a=n||r||sre();a&&!a.reportNamespaces&&(a.reportNamespaces=new cre),a||EG(a,"NO_I18NEXT_INSTANCE","useTranslation: You will need to pass in an i18next instance by using initReactI18next");const s=E.useMemo(()=>({...ire(),...a?.options?.react,...e}),[a,e]),{useSuspense:o,keyPrefix:l}=s,c=i||a?.options?.defaultNS,u=Sf(c)?[c]:c||["translation"],h=E.useMemo(()=>u,u);a?.reportNamespaces?.addUsedNamespaces?.(h);const g=E.useRef(0),m=E.useCallback(N=>{if(!a)return hre;const{bindI18n:k,bindI18nStore:F}=s,I=()=>{g.current+=1,N()};return k&&a.on(k,I),F&&a.store.on(F,I),()=>{k&&k.split(" ").forEach(X=>a.off(X,I)),F&&F.split(" ").forEach(X=>a.store.off(X,I))}},[a,s]),b=E.useRef(),_=E.useCallback(()=>{if(!a)return fre;const N=!!(a.isInitialized||a.initializedStoreOnce)&&h.every(z=>Zne(z,a,s)),k=e.lng||a.language,F=g.current,I=b.current;if(I&&I.ready===N&&I.lng===k&&I.keyPrefix===l&&I.revision===F)return I;const D={t:a.getFixedT(k,s.nsMode==="fallback"?h:h[0],l),ready:N,lng:k,keyPrefix:l,revision:F};return b.current=D,D},[a,h,l,s,e.lng]),[v,x]=E.useState(0),{t:M,ready:w}=LP.useSyncExternalStore(m,_,_);E.useEffect(()=>{if(a&&!w&&!o){const N=()=>x(k=>k+1);e.lng?CU(a,e.lng,h,N):PN(a,h,N)}},[a,e.lng,h,w,o,v]);const A=a||{},C=E.useRef(null),P=E.useRef(),T=N=>{const k=Object.getOwnPropertyDescriptors(N);k.__original&&delete k.__original;const F=Object.create(Object.getPrototypeOf(N),k);if(!Object.prototype.hasOwnProperty.call(F,"__original"))try{Object.defineProperty(F,"__original",{value:N,writable:!1,enumerable:!1,configurable:!1})}catch{}return F},j=E.useMemo(()=>{const N=A,k=N?.language;let F=N;N&&(C.current&&C.current.__original===N?P.current!==k?(F=T(N),C.current=F,P.current=k):F=C.current:(F=T(N),C.current=F,P.current=k));const I=[M,F,w];return I.t=M,I.i18n=F,I.ready=w,I},[M,A,w,A.resolvedLanguage,A.language,A.languages]);if(a&&o&&!w)throw new Promise(N=>{const k=()=>N();e.lng?CU(a,e.lng,h,k):PN(a,h,k)});return j},{slice:pre,forEach:mre}=[];function gre(t){return mre.call(pre.call(arguments,1),e=>{if(e)for(const n in e)t[n]===void 0&&(t[n]=e[n])}),t}function xre(t){return typeof t!="string"?!1:[/<\s*script.*?>/i,/<\s*\/\s*script\s*>/i,/<\s*img.*?on\w+\s*=/i,/<\s*\w+\s*on\w+\s*=.*?>/i,/javascript\s*:/i,/vbscript\s*:/i,/expression\s*\(/i,/eval\s*\(/i,/alert\s*\(/i,/document\.cookie/i,/document\.write\s*\(/i,/window\.location/i,/innerHTML/i].some(n=>n.test(t))}const PU=/^[\u0009\u0020-\u007e\u0080-\u00ff]+$/,vre=function(t,e){const r=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{path:"/"},i=encodeURIComponent(e);let a=`${t}=${i}`;if(r.maxAge>0){const s=r.maxAge-0;if(Number.isNaN(s))throw new Error("maxAge should be a Number");a+=`; Max-Age=${Math.floor(s)}`}if(r.domain){if(!PU.test(r.domain))throw new TypeError("option domain is invalid");a+=`; Domain=${r.domain}`}if(r.path){if(!PU.test(r.path))throw new TypeError("option path is invalid");a+=`; Path=${r.path}`}if(r.expires){if(typeof r.expires.toUTCString!="function")throw new TypeError("option expires is invalid");a+=`; Expires=${r.expires.toUTCString()}`}if(r.httpOnly&&(a+="; HttpOnly"),r.secure&&(a+="; Secure"),r.sameSite)switch(typeof r.sameSite=="string"?r.sameSite.toLowerCase():r.sameSite){case!0:a+="; SameSite=Strict";break;case"lax":a+="; SameSite=Lax";break;case"strict":a+="; SameSite=Strict";break;case"none":a+="; SameSite=None";break;default:throw new TypeError("option sameSite is invalid")}return r.partitioned&&(a+="; Partitioned"),a},kU={create(t,e,n,r){let i=arguments.length>4&&arguments[4]!==void 0?arguments[4]:{path:"/",sameSite:"strict"};n&&(i.expires=new Date,i.expires.setTime(i.expires.getTime()+n*60*1e3)),r&&(i.domain=r),document.cookie=vre(t,e,i)},read(t){const e=`${t}=`,n=document.cookie.split(";");for(let r=0;r-1&&(r=window.location.hash.substring(window.location.hash.indexOf("?")));const a=r.substring(1).split("&");for(let s=0;s0&&a[s].substring(0,o)===e&&(n=a[s].substring(o+1))}}return n}},_re={name:"hash",lookup(t){let{lookupHash:e,lookupFromHashIndex:n}=t,r;if(typeof window<"u"){const{hash:i}=window.location;if(i&&i.length>2){const a=i.substring(1);if(e){const s=a.split("&");for(let o=0;o0&&s[o].substring(0,l)===e&&(r=s[o].substring(l+1))}}if(r)return r;if(!r&&n>-1){const s=i.match(/\/([a-zA-Z-]*)/g);return Array.isArray(s)?s[typeof n=="number"?n:0]?.replace("/",""):void 0}}}return r}};let Ph=null;const DU=()=>{if(Ph!==null)return Ph;try{if(Ph=typeof window<"u"&&window.localStorage!==null,!Ph)return!1;const t="i18next.translate.boo";window.localStorage.setItem(t,"foo"),window.localStorage.removeItem(t)}catch{Ph=!1}return Ph};var Sre={name:"localStorage",lookup(t){let{lookupLocalStorage:e}=t;if(e&&DU())return window.localStorage.getItem(e)||void 0},cacheUserLanguage(t,e){let{lookupLocalStorage:n}=e;n&&DU()&&window.localStorage.setItem(n,t)}};let kh=null;const OU=()=>{if(kh!==null)return kh;try{if(kh=typeof window<"u"&&window.sessionStorage!==null,!kh)return!1;const t="i18next.translate.boo";window.sessionStorage.setItem(t,"foo"),window.sessionStorage.removeItem(t)}catch{kh=!1}return kh};var wre={name:"sessionStorage",lookup(t){let{lookupSessionStorage:e}=t;if(e&&OU())return window.sessionStorage.getItem(e)||void 0},cacheUserLanguage(t,e){let{lookupSessionStorage:n}=e;n&&OU()&&window.sessionStorage.setItem(n,t)}},Mre={name:"navigator",lookup(t){const e=[];if(typeof navigator<"u"){const{languages:n,userLanguage:r,language:i}=navigator;if(n)for(let a=0;a0?e:void 0}},Ere={name:"htmlTag",lookup(t){let{htmlTag:e}=t,n;const r=e||(typeof document<"u"?document.documentElement:null);return r&&typeof r.getAttribute=="function"&&(n=r.getAttribute("lang")),n}},Are={name:"path",lookup(t){let{lookupFromPathIndex:e}=t;if(typeof window>"u")return;const n=window.location.pathname.match(/\/([a-zA-Z-]*)/g);return Array.isArray(n)?n[typeof e=="number"?e:0]?.replace("/",""):void 0}},Tre={name:"subdomain",lookup(t){let{lookupFromSubdomainIndex:e}=t;const n=typeof e=="number"?e+1:1,r=typeof window<"u"&&window.location?.hostname?.match(/^(\w{2,5})\.(([a-z0-9-]{1,63}\.[a-z]{2,6})|localhost)/i);if(r)return r[n]}};let NG=!1;try{document.cookie,NG=!0}catch{}const RG=["querystring","cookie","localStorage","sessionStorage","navigator","htmlTag"];NG||RG.splice(1,1);const Cre=()=>({order:RG,lookupQuerystring:"lng",lookupCookie:"i18next",lookupLocalStorage:"i18nextLng",lookupSessionStorage:"i18nextLng",caches:["localStorage"],excludeCacheFor:["cimode"],convertDetectedLanguage:t=>t});class PG{constructor(e){let n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};this.type="languageDetector",this.detectors={},this.init(e,n)}init(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{languageUtils:{}},n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},r=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{};this.services=e,this.options=gre(n,this.options||{},Cre()),typeof this.options.convertDetectedLanguage=="string"&&this.options.convertDetectedLanguage.indexOf("15897")>-1&&(this.options.convertDetectedLanguage=i=>i.replace("-","_")),this.options.lookupFromUrlIndex&&(this.options.lookupFromPathIndex=this.options.lookupFromUrlIndex),this.i18nOptions=r,this.addDetector(bre),this.addDetector(yre),this.addDetector(Sre),this.addDetector(wre),this.addDetector(Mre),this.addDetector(Ere),this.addDetector(Are),this.addDetector(Tre),this.addDetector(_re)}addDetector(e){return this.detectors[e.name]=e,this}detect(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:this.options.order,n=[];return e.forEach(r=>{if(this.detectors[r]){let i=this.detectors[r].lookup(this.options);i&&typeof i=="string"&&(i=[i]),i&&(n=n.concat(i))}}),n=n.filter(r=>r!=null&&!xre(r)).map(r=>this.options.convertDetectedLanguage(r)),this.services&&this.services.languageUtils&&this.services.languageUtils.getBestMatchFromCodes?n:n.length>0?n[0]:null}cacheUserLanguage(e){let n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:this.options.caches;n&&(this.options.excludeCacheFor&&this.options.excludeCacheFor.indexOf(e)>-1||n.forEach(r=>{this.detectors[r]&&this.detectors[r].cacheUserLanguage(e,this.options)}))}}PG.type="languageDetector";const Nre={nav:{printers:"Printers",archives:"Archives",queue:"Queue",stats:"Statistics",profiles:"Profiles",maintenance:"Maintenance",settings:"Settings",collapseSidebar:"Collapse sidebar",expandSidebar:"Expand sidebar",update:"Update",updateAvailable:"Update available: v{{version}}",viewOnGithub:"View on GitHub",keyboardShortcuts:"Keyboard shortcuts (?)",switchToLight:"Switch to light mode",switchToDark:"Switch to dark mode"},common:{save:"Save",cancel:"Cancel",delete:"Delete",edit:"Edit",add:"Add",close:"Close",confirm:"Confirm",loading:"Loading...",error:"Error",success:"Success",warning:"Warning",enabled:"Enabled",disabled:"Disabled",yes:"Yes",no:"No",on:"On",off:"Off",all:"All",none:"None",search:"Search",filter:"Filter",sort:"Sort",refresh:"Refresh",download:"Download",upload:"Upload",actions:"Actions",status:"Status",name:"Name",description:"Description",date:"Date",time:"Time",hours:"hours",minutes:"minutes",seconds:"seconds",noPrinters:"No printers configured",noData:"No data available",required:"Required",optional:"Optional"},printers:{title:"Printers",addPrinter:"Add Printer",editPrinter:"Edit Printer",deletePrinter:"Delete Printer",printerName:"Printer Name",serialNumber:"Serial Number",ipAddress:"IP Address",accessCode:"Access Code",model:"Model",nozzleCount:"Nozzle Count",autoArchive:"Auto Archive",status:{idle:"Idle",printing:"Printing",paused:"Paused",offline:"Offline",error:"Error",finished:"Finished",unknown:"Unknown"},temperatures:{nozzle:"Nozzle",bed:"Bed",chamber:"Chamber"},progress:"{{percent}}% complete",timeRemaining:"{{time}} remaining",deleteConfirm:'Are you sure you want to delete "{{name}}"?',maintenanceOk:"Maintenance OK",maintenanceWarning:"{{count}} warning",maintenanceWarning_plural:"{{count}} warnings",maintenanceDue:"{{count}} due",maintenanceDue_plural:"{{count}} due"},archives:{title:"Print Archives",searchPlaceholder:"Search archives...",filterByPrinter:"Filter by printer",filterByStatus:"Filter by status",sortBy:"Sort by",sortNewest:"Newest first",sortOldest:"Oldest first",sortName:"Name",sortDuration:"Duration",noArchives:"No archives found",printTime:"Print Time",filamentUsed:"Filament Used",cost:"Cost",reprint:"Reprint",preview:"Preview",deleteArchive:"Delete Archive",deleteConfirm:"Are you sure you want to delete this archive?",favorite:"Favorite",unfavorite:"Remove from favorites",viewDetails:"View Details",status:{completed:"Completed",failed:"Failed",stopped:"Stopped"}},queue:{title:"Print Queue",addToQueue:"Add to Queue",clearQueue:"Clear Queue",emptyQueue:"Queue is empty",position:"Position",scheduledTime:"Scheduled Time",moveUp:"Move Up",moveDown:"Move Down",remove:"Remove",startNow:"Start Now",status:{pending:"Pending",printing:"Printing",completed:"Completed",failed:"Failed",cancelled:"Cancelled"}},stats:{title:"Statistics",overview:"Overview",totalPrints:"Total Prints",successRate:"Success Rate",totalPrintTime:"Total Print Time",totalFilament:"Total Filament Used",totalCost:"Total Cost",averagePrintTime:"Average Print Time",printsPerDay:"Prints per Day",byPrinter:"By Printer",byMaterial:"By Material",byMonth:"By Month",last7Days:"Last 7 Days",last30Days:"Last 30 Days",last90Days:"Last 90 Days",allTime:"All Time"},profiles:{title:"Filament Profiles",addProfile:"Add Profile",editProfile:"Edit Profile",deleteProfile:"Delete Profile",material:"Material",brand:"Brand",color:"Color",diameter:"Diameter",density:"Density",costPerKg:"Cost per kg",spoolWeight:"Spool Weight",noProfiles:"No profiles configured",deleteConfirm:"Are you sure you want to delete this profile?"},maintenance:{title:"Maintenance",overview:"Overview",allOk:"All maintenance up to date",dueCount:"{{count}} item due",dueCount_plural:"{{count}} items due",warningCount:"{{count}} warning",warningCount_plural:"{{count}} warnings",totalPrintTime:"Total Print Time",nextMaintenance:"Next Maintenance",nothingDue:"Nothing due",tasks:"Tasks",lastPerformed:"Last performed",interval:"Interval",hoursRemaining:"{{hours}}h remaining",hoursOverdue:"{{hours}}h overdue",markDone:"Mark as Done",performMaintenance:"Perform Maintenance",history:"History",noHistory:"No maintenance history",editPrintHours:"Edit Print Hours",currentHours:"Current Hours",types:{lubricateRails:"Lubricate Linear Rails",cleanNozzle:"Clean Nozzle/Hotend",checkBelts:"Check Belt Tension",cleanBuildPlate:"Clean Build Plate",checkExtruder:"Check Extruder Gears",checkCooling:"Check Cooling Fans",generalInspection:"General Inspection"}},settings:{title:"Settings",general:"General",appearance:"Appearance",notifications:"Notifications",smartPlugs:"Smart Plugs",spoolman:"Spoolman",updates:"Updates",language:"Language",languageDescription:"Select your preferred language",theme:"Theme",themeLight:"Light",themeDark:"Dark",themeSystem:"System",defaultView:"Default View",defaultViewDescription:"Page to show when opening the app",checkForUpdates:"Check for Updates",autoUpdate:"Auto Update",currentVersion:"Current Version",latestVersion:"Latest Version",upToDate:"You are up to date",updateAvailable:"Update available",notificationLanguage:"Notification Language",notificationLanguageDescription:"Language for push notifications",notificationProviders:"Notification Providers",addProvider:"Add Provider",editProvider:"Edit Provider",providerType:"Provider Type",testNotification:"Test Notification",testSuccess:"Test notification sent successfully",testFailed:"Failed to send test notification",quietHours:"Quiet Hours",quietHoursDescription:"Do not disturb during these hours",quietHoursStart:"Start",quietHoursEnd:"End",events:{title:"Notification Events",printStart:"Print Started",printComplete:"Print Completed",printFailed:"Print Failed",printStopped:"Print Stopped",printProgress:"Progress Milestones",printProgressDescription:"Notify at 25%, 50%, 75%",printerOffline:"Printer Offline",printerError:"Printer Error",filamentLow:"Low Filament",maintenanceDue:"Maintenance Due",maintenanceDueDescription:"Notify when maintenance is needed"},smartPlug:{title:"Smart Plugs",add:"Add Smart Plug",edit:"Edit Smart Plug",name:"Name",ipAddress:"IP Address",linkedPrinter:"Linked Printer",autoOn:"Auto Power On",autoOnDescription:"Turn on when print starts",autoOff:"Auto Power Off",autoOffDescription:"Turn off after print completes",offDelay:"Off Delay",offDelayMinutes:"Minutes after print",offDelayTemp:"When nozzle below temperature",currentState:"Current State",turnOn:"Turn On",turnOff:"Turn Off"},spoolmanEnabled:"Enable Spoolman Integration",spoolmanUrl:"Spoolman URL",spoolmanConnected:"Connected",spoolmanDisconnected:"Disconnected"},notification:{printStarted:{title:"Print Started",body:"{{printer}}: {{filename}} has started printing"},printCompleted:{title:"Print Completed",body:"{{printer}}: {{filename}} completed successfully"},printFailed:{title:"Print Failed",body:"{{printer}}: {{filename}} has failed"},printStopped:{title:"Print Stopped",body:"{{printer}}: {{filename}} was stopped"},printProgress:{title:"Print Progress",body:"{{printer}}: {{filename}} is {{percent}}% complete"},printerOffline:{title:"Printer Offline",body:"{{printer}} is offline"},printerError:{title:"Printer Error",body:"{{printer}}: {{error}}"},filamentLow:{title:"Low Filament",body:"{{printer}}: Filament is running low"},maintenanceDue:{title:"Maintenance Due",body:"{{printer}}: {{items}} need attention"}},errors:{generic:"Something went wrong",networkError:"Network error. Please check your connection.",notFound:"Not found",unauthorized:"Unauthorized",serverError:"Server error",validationError:"Please check your input",printerConnectionFailed:"Failed to connect to printer",saveFailed:"Failed to save changes",deleteFailed:"Failed to delete",loadFailed:"Failed to load data"},confirm:{delete:"Are you sure you want to delete this?",unsavedChanges:"You have unsaved changes. Are you sure you want to leave?",clearQueue:"Are you sure you want to clear the queue?"}},Rre={nav:{printers:"Drucker",archives:"Archiv",queue:"Warteschlange",stats:"Statistiken",profiles:"Profile",maintenance:"Wartung",settings:"Einstellungen",collapseSidebar:"Seitenleiste einklappen",expandSidebar:"Seitenleiste ausklappen",update:"Update",updateAvailable:"Update verfügbar: v{{version}}",viewOnGithub:"Auf GitHub ansehen",keyboardShortcuts:"Tastaturkürzel (?)",switchToLight:"Zum hellen Modus wechseln",switchToDark:"Zum dunklen Modus wechseln"},common:{save:"Speichern",cancel:"Abbrechen",delete:"Löschen",edit:"Bearbeiten",add:"Hinzufügen",close:"Schließen",confirm:"Bestätigen",loading:"Lädt...",error:"Fehler",success:"Erfolg",warning:"Warnung",enabled:"Aktiviert",disabled:"Deaktiviert",yes:"Ja",no:"Nein",on:"An",off:"Aus",all:"Alle",none:"Keine",search:"Suchen",filter:"Filtern",sort:"Sortieren",refresh:"Aktualisieren",download:"Herunterladen",upload:"Hochladen",actions:"Aktionen",status:"Status",name:"Name",description:"Beschreibung",date:"Datum",time:"Zeit",hours:"Stunden",minutes:"Minuten",seconds:"Sekunden",noPrinters:"Keine Drucker konfiguriert",noData:"Keine Daten verfügbar",required:"Erforderlich",optional:"Optional"},printers:{title:"Drucker",addPrinter:"Drucker hinzufügen",editPrinter:"Drucker bearbeiten",deletePrinter:"Drucker löschen",printerName:"Druckername",serialNumber:"Seriennummer",ipAddress:"IP-Adresse",accessCode:"Zugangscode",model:"Modell",nozzleCount:"Düsenanzahl",autoArchive:"Automatische Archivierung",status:{idle:"Bereit",printing:"Druckt",paused:"Pausiert",offline:"Offline",error:"Fehler",finished:"Fertig",unknown:"Unbekannt"},temperatures:{nozzle:"Düse",bed:"Druckbett",chamber:"Kammer"},progress:"{{percent}}% abgeschlossen",timeRemaining:"Noch {{time}}",deleteConfirm:'Möchten Sie "{{name}}" wirklich löschen?',maintenanceOk:"Wartung OK",maintenanceWarning:"{{count}} Warnung",maintenanceWarning_plural:"{{count}} Warnungen",maintenanceDue:"{{count}} fällig",maintenanceDue_plural:"{{count}} fällig"},archives:{title:"Druckarchiv",searchPlaceholder:"Archiv durchsuchen...",filterByPrinter:"Nach Drucker filtern",filterByStatus:"Nach Status filtern",sortBy:"Sortieren nach",sortNewest:"Neueste zuerst",sortOldest:"Älteste zuerst",sortName:"Name",sortDuration:"Dauer",noArchives:"Keine Archive gefunden",printTime:"Druckzeit",filamentUsed:"Verbrauchtes Filament",cost:"Kosten",reprint:"Erneut drucken",preview:"Vorschau",deleteArchive:"Archiv löschen",deleteConfirm:"Möchten Sie dieses Archiv wirklich löschen?",favorite:"Favorit",unfavorite:"Aus Favoriten entfernen",viewDetails:"Details anzeigen",status:{completed:"Abgeschlossen",failed:"Fehlgeschlagen",stopped:"Gestoppt"}},queue:{title:"Druckwarteschlange",addToQueue:"Zur Warteschlange hinzufügen",clearQueue:"Warteschlange leeren",emptyQueue:"Warteschlange ist leer",position:"Position",scheduledTime:"Geplante Zeit",moveUp:"Nach oben",moveDown:"Nach unten",remove:"Entfernen",startNow:"Jetzt starten",status:{pending:"Ausstehend",printing:"Druckt",completed:"Abgeschlossen",failed:"Fehlgeschlagen",cancelled:"Abgebrochen"}},stats:{title:"Statistiken",overview:"Übersicht",totalPrints:"Gesamtdrucke",successRate:"Erfolgsrate",totalPrintTime:"Gesamtdruckzeit",totalFilament:"Gesamtverbrauch Filament",totalCost:"Gesamtkosten",averagePrintTime:"Durchschnittliche Druckzeit",printsPerDay:"Drucke pro Tag",byPrinter:"Nach Drucker",byMaterial:"Nach Material",byMonth:"Nach Monat",last7Days:"Letzte 7 Tage",last30Days:"Letzte 30 Tage",last90Days:"Letzte 90 Tage",allTime:"Gesamt"},profiles:{title:"Filament-Profile",addProfile:"Profil hinzufügen",editProfile:"Profil bearbeiten",deleteProfile:"Profil löschen",material:"Material",brand:"Marke",color:"Farbe",diameter:"Durchmesser",density:"Dichte",costPerKg:"Kosten pro kg",spoolWeight:"Spulengewicht",noProfiles:"Keine Profile konfiguriert",deleteConfirm:"Möchten Sie dieses Profil wirklich löschen?"},maintenance:{title:"Wartung",overview:"Übersicht",allOk:"Alle Wartungen aktuell",dueCount:"{{count}} Aufgabe fällig",dueCount_plural:"{{count}} Aufgaben fällig",warningCount:"{{count}} Warnung",warningCount_plural:"{{count}} Warnungen",totalPrintTime:"Gesamtdruckzeit",nextMaintenance:"Nächste Wartung",nothingDue:"Nichts fällig",tasks:"Aufgaben",lastPerformed:"Zuletzt durchgeführt",interval:"Intervall",hoursRemaining:"{{hours}}h verbleibend",hoursOverdue:"{{hours}}h überfällig",markDone:"Als erledigt markieren",performMaintenance:"Wartung durchführen",history:"Verlauf",noHistory:"Kein Wartungsverlauf",editPrintHours:"Druckstunden bearbeiten",currentHours:"Aktuelle Stunden",types:{lubricateRails:"Linearschienen schmieren",cleanNozzle:"Düse/Hotend reinigen",checkBelts:"Riemenspannung prüfen",cleanBuildPlate:"Druckbett reinigen",checkExtruder:"Extruderzahnräder prüfen",checkCooling:"Kühlungslüfter prüfen",generalInspection:"Allgemeine Inspektion"}},settings:{title:"Einstellungen",general:"Allgemein",appearance:"Erscheinungsbild",notifications:"Benachrichtigungen",smartPlugs:"Smart Plugs",spoolman:"Spoolman",updates:"Updates",language:"Sprache",languageDescription:"Wählen Sie Ihre bevorzugte Sprache",theme:"Design",themeLight:"Hell",themeDark:"Dunkel",themeSystem:"System",defaultView:"Standardansicht",defaultViewDescription:"Seite, die beim Öffnen der App angezeigt wird",checkForUpdates:"Nach Updates suchen",autoUpdate:"Automatische Updates",currentVersion:"Aktuelle Version",latestVersion:"Neueste Version",upToDate:"Sie sind auf dem neuesten Stand",updateAvailable:"Update verfügbar",notificationLanguage:"Benachrichtigungssprache",notificationLanguageDescription:"Sprache für Push-Benachrichtigungen",notificationProviders:"Benachrichtigungsanbieter",addProvider:"Anbieter hinzufügen",editProvider:"Anbieter bearbeiten",providerType:"Anbietertyp",testNotification:"Testbenachrichtigung",testSuccess:"Testbenachrichtigung erfolgreich gesendet",testFailed:"Testbenachrichtigung konnte nicht gesendet werden",quietHours:"Ruhezeiten",quietHoursDescription:"Keine Störungen während dieser Zeiten",quietHoursStart:"Beginn",quietHoursEnd:"Ende",events:{title:"Benachrichtigungsereignisse",printStart:"Druck gestartet",printComplete:"Druck abgeschlossen",printFailed:"Druck fehlgeschlagen",printStopped:"Druck gestoppt",printProgress:"Fortschrittsmeldungen",printProgressDescription:"Bei 25%, 50%, 75% benachrichtigen",printerOffline:"Drucker offline",printerError:"Druckerfehler",filamentLow:"Filament niedrig",maintenanceDue:"Wartung fällig",maintenanceDueDescription:"Benachrichtigen, wenn Wartung erforderlich"},smartPlug:{title:"Smart Plugs",add:"Smart Plug hinzufügen",edit:"Smart Plug bearbeiten",name:"Name",ipAddress:"IP-Adresse",linkedPrinter:"Verknüpfter Drucker",autoOn:"Automatisch einschalten",autoOnDescription:"Einschalten beim Druckstart",autoOff:"Automatisch ausschalten",autoOffDescription:"Ausschalten nach Druckende",offDelay:"Ausschaltverzögerung",offDelayMinutes:"Minuten nach Druck",offDelayTemp:"Wenn Düse unter Temperatur",currentState:"Aktueller Status",turnOn:"Einschalten",turnOff:"Ausschalten"},spoolmanEnabled:"Spoolman-Integration aktivieren",spoolmanUrl:"Spoolman URL",spoolmanConnected:"Verbunden",spoolmanDisconnected:"Nicht verbunden"},notification:{printStarted:{title:"Druck gestartet",body:"{{printer}}: {{filename}} wird gedruckt"},printCompleted:{title:"Druck abgeschlossen",body:"{{printer}}: {{filename}} erfolgreich abgeschlossen"},printFailed:{title:"Druck fehlgeschlagen",body:"{{printer}}: {{filename}} ist fehlgeschlagen"},printStopped:{title:"Druck gestoppt",body:"{{printer}}: {{filename}} wurde gestoppt"},printProgress:{title:"Druckfortschritt",body:"{{printer}}: {{filename}} ist zu {{percent}}% abgeschlossen"},printerOffline:{title:"Drucker offline",body:"{{printer}} ist offline"},printerError:{title:"Druckerfehler",body:"{{printer}}: {{error}}"},filamentLow:{title:"Filament niedrig",body:"{{printer}}: Filament geht zur Neige"},maintenanceDue:{title:"Wartung fällig",body:"{{printer}}: {{items}} benötigen Aufmerksamkeit"}},errors:{generic:"Etwas ist schiefgelaufen",networkError:"Netzwerkfehler. Bitte überprüfen Sie Ihre Verbindung.",notFound:"Nicht gefunden",unauthorized:"Nicht autorisiert",serverError:"Serverfehler",validationError:"Bitte überprüfen Sie Ihre Eingabe",printerConnectionFailed:"Verbindung zum Drucker fehlgeschlagen",saveFailed:"Speichern fehlgeschlagen",deleteFailed:"Löschen fehlgeschlagen",loadFailed:"Laden der Daten fehlgeschlagen"},confirm:{delete:"Möchten Sie dies wirklich löschen?",unsavedChanges:"Sie haben ungespeicherte Änderungen. Möchten Sie wirklich verlassen?",clearQueue:"Möchten Sie die Warteschlange wirklich leeren?"}},Pre={en:{translation:Nre},de:{translation:Rre}};Ea.use(PG).use(ore).init({resources:Pre,fallbackLng:"en",supportedLngs:["en","de"],detection:{order:["localStorage","navigator","htmlTag"],lookupLocalStorage:"bambutrack_language",caches:["localStorage"]},interpolation:{escapeValue:!1},react:{useSuspense:!1}});const LU=[{code:"en",name:"English",nativeName:"English"},{code:"de",name:"German",nativeName:"Deutsch"}];var IU="popstate";function kre(t={}){function e(r,i){let{pathname:a,search:s,hash:o}=r.location;return DN("",{pathname:a,search:s,hash:o},i.state&&i.state.usr||null,i.state&&i.state.key||"default")}function n(r,i){return typeof i=="string"?i:Xx(i)}return Ore(e,n,null,t)}function gr(t,e){if(t===!1||t===null||typeof t>"u")throw new Error(e)}function Mo(t,e){if(!t){typeof console<"u"&&console.warn(e);try{throw new Error(e)}catch{}}}function Dre(){return Math.random().toString(36).substring(2,10)}function jU(t,e){return{usr:t.state,key:t.key,idx:e}}function DN(t,e,n=null,r){return{pathname:typeof t=="string"?t:t.pathname,search:"",hash:"",...typeof e=="string"?Em(e):e,state:n,key:e&&e.key||r||Dre()}}function Xx({pathname:t="/",search:e="",hash:n=""}){return e&&e!=="?"&&(t+=e.charAt(0)==="?"?e:"?"+e),n&&n!=="#"&&(t+=n.charAt(0)==="#"?n:"#"+n),t}function Em(t){let e={};if(t){let n=t.indexOf("#");n>=0&&(e.hash=t.substring(n),t=t.substring(0,n));let r=t.indexOf("?");r>=0&&(e.search=t.substring(r),t=t.substring(0,r)),t&&(e.pathname=t)}return e}function Ore(t,e,n,r={}){let{window:i=document.defaultView,v5Compat:a=!1}=r,s=i.history,o="POP",l=null,c=u();c==null&&(c=0,s.replaceState({...s.state,idx:c},""));function u(){return(s.state||{idx:null}).idx}function h(){o="POP";let v=u(),x=v==null?null:v-c;c=v,l&&l({action:o,location:_.location,delta:x})}function g(v,x){o="PUSH";let M=DN(_.location,v,x);c=u()+1;let w=jU(M,c),A=_.createHref(M);try{s.pushState(w,"",A)}catch(C){if(C instanceof DOMException&&C.name==="DataCloneError")throw C;i.location.assign(A)}a&&l&&l({action:o,location:_.location,delta:1})}function m(v,x){o="REPLACE";let M=DN(_.location,v,x);c=u();let w=jU(M,c),A=_.createHref(M);s.replaceState(w,"",A),a&&l&&l({action:o,location:_.location,delta:0})}function b(v){return Lre(v)}let _={get action(){return o},get location(){return t(i,s)},listen(v){if(l)throw new Error("A history only accepts one active listener");return i.addEventListener(IU,h),l=v,()=>{i.removeEventListener(IU,h),l=null}},createHref(v){return e(i,v)},createURL:b,encodeLocation(v){let x=b(v);return{pathname:x.pathname,search:x.search,hash:x.hash}},push:g,replace:m,go(v){return s.go(v)}};return _}function Lre(t,e=!1){let n="http://localhost";typeof window<"u"&&(n=window.location.origin!=="null"?window.location.origin:window.location.href),gr(n,"No window.location.(origin|href) available to create URL");let r=typeof t=="string"?t:Xx(t);return r=r.replace(/ $/,"%20"),!e&&r.startsWith("//")&&(r=n+r),new URL(r,n)}function kG(t,e,n="/"){return Ire(t,e,n,!1)}function Ire(t,e,n,r){let i=typeof e=="string"?Em(e):e,a=pc(i.pathname||"/",n);if(a==null)return null;let s=DG(t);jre(s);let o=null;for(let l=0;o==null&&l{let u={relativePath:c===void 0?s.path||"":c,caseSensitive:s.caseSensitive===!0,childrenIndex:o,route:s};if(u.relativePath.startsWith("/")){if(!u.relativePath.startsWith(r)&&l)return;gr(u.relativePath.startsWith(r),`Absolute route path "${u.relativePath}" nested under path "${r}" is not valid. An absolute child route path must start with the combined path of all its parent routes.`),u.relativePath=u.relativePath.slice(r.length)}let h=sc([r,u.relativePath]),g=n.concat(u);s.children&&s.children.length>0&&(gr(s.index!==!0,`Index routes must not have child routes. Please remove all child routes from route path "${h}".`),DG(s.children,e,g,h,l)),!(s.path==null&&!s.index)&&e.push({path:h,score:Vre(h,s.index),routesMeta:g})};return t.forEach((s,o)=>{if(s.path===""||!s.path?.includes("?"))a(s,o);else for(let l of OG(s.path))a(s,o,!0,l)}),e}function OG(t){let e=t.split("/");if(e.length===0)return[];let[n,...r]=e,i=n.endsWith("?"),a=n.replace(/\?$/,"");if(r.length===0)return i?[a,""]:[a];let s=OG(r.join("/")),o=[];return o.push(...s.map(l=>l===""?a:[a,l].join("/"))),i&&o.push(...s),o.map(l=>t.startsWith("/")&&l===""?"/":l)}function jre(t){t.sort((e,n)=>e.score!==n.score?n.score-e.score:Gre(e.routesMeta.map(r=>r.childrenIndex),n.routesMeta.map(r=>r.childrenIndex)))}var Ure=/^:[\w-]+$/,Fre=3,zre=2,Bre=1,Hre=10,$re=-2,UU=t=>t==="*";function Vre(t,e){let n=t.split("/"),r=n.length;return n.some(UU)&&(r+=$re),e&&(r+=zre),n.filter(i=>!UU(i)).reduce((i,a)=>i+(Ure.test(a)?Fre:a===""?Bre:Hre),r)}function Gre(t,e){return t.length===e.length&&t.slice(0,-1).every((r,i)=>r===e[i])?t[t.length-1]-e[e.length-1]:0}function Wre(t,e,n=!1){let{routesMeta:r}=t,i={},a="/",s=[];for(let o=0;o{if(u==="*"){let b=o[g]||"";s=a.slice(0,a.length-b.length).replace(/(.)\/+$/,"$1")}const m=o[g];return h&&!m?c[u]=void 0:c[u]=(m||"").replace(/%2F/g,"/"),c},{}),pathname:a,pathnameBase:s,pattern:t}}function qre(t,e=!1,n=!0){Mo(t==="*"||!t.endsWith("*")||t.endsWith("/*"),`Route path "${t}" will be treated as if it were "${t.replace(/\*$/,"/*")}" because the \`*\` character must always follow a \`/\` in the pattern. To get rid of this warning, please change the route path to "${t.replace(/\*$/,"/*")}".`);let r=[],i="^"+t.replace(/\/*\*?$/,"").replace(/^\/*/,"/").replace(/[\\.*+^${}|()[\]]/g,"\\$&").replace(/\/:([\w-]+)(\?)?/g,(s,o,l)=>(r.push({paramName:o,isOptional:l!=null}),l?"/?([^\\/]+)?":"/([^\\/]+)")).replace(/\/([\w-]+)\?(\/|$)/g,"(/$1)?$2");return t.endsWith("*")?(r.push({paramName:"*"}),i+=t==="*"||t==="/*"?"(.*)$":"(?:\\/(.+)|\\/*)$"):n?i+="\\/*$":t!==""&&t!=="/"&&(i+="(?:(?=\\/|$))"),[new RegExp(i,e?void 0:"i"),r]}function Xre(t){try{return t.split("/").map(e=>decodeURIComponent(e).replace(/\//g,"%2F")).join("/")}catch(e){return Mo(!1,`The URL path "${t}" could not be decoded because it is a malformed URL segment. This is probably due to a bad percent encoding (${e}).`),t}}function pc(t,e){if(e==="/")return t;if(!t.toLowerCase().startsWith(e.toLowerCase()))return null;let n=e.endsWith("/")?e.length-1:e.length,r=t.charAt(n);return r&&r!=="/"?null:t.slice(n)||"/"}var Kre=/^(?:[a-z][a-z0-9+.-]*:|\/\/)/i,Yre=t=>Kre.test(t);function Zre(t,e="/"){let{pathname:n,search:r="",hash:i=""}=typeof t=="string"?Em(t):t,a;if(n)if(Yre(n))a=n;else{if(n.includes("//")){let s=n;n=n.replace(/\/\/+/g,"/"),Mo(!1,`Pathnames cannot have embedded double slashes - normalizing ${s} -> ${n}`)}n.startsWith("/")?a=FU(n.substring(1),"/"):a=FU(n,e)}else a=e;return{pathname:a,search:eie(r),hash:tie(i)}}function FU(t,e){let n=e.replace(/\/+$/,"").split("/");return t.split("/").forEach(i=>{i===".."?n.length>1&&n.pop():i!=="."&&n.push(i)}),n.length>1?n.join("/"):"/"}function VA(t,e,n,r){return`Cannot include a '${t}' character in a manually specified \`to.${e}\` field [${JSON.stringify(r)}]. Please separate it out to the \`to.${n}\` field. Alternatively you may provide the full path as a string in and the router will parse it for you.`}function Qre(t){return t.filter((e,n)=>n===0||e.route.path&&e.route.path.length>0)}function LG(t){let e=Qre(t);return e.map((n,r)=>r===e.length-1?n.pathname:n.pathnameBase)}function IG(t,e,n,r=!1){let i;typeof t=="string"?i=Em(t):(i={...t},gr(!i.pathname||!i.pathname.includes("?"),VA("?","pathname","search",i)),gr(!i.pathname||!i.pathname.includes("#"),VA("#","pathname","hash",i)),gr(!i.search||!i.search.includes("#"),VA("#","search","hash",i)));let a=t===""||i.pathname==="",s=a?"/":i.pathname,o;if(s==null)o=n;else{let h=e.length-1;if(!r&&s.startsWith("..")){let g=s.split("/");for(;g[0]==="..";)g.shift(),h-=1;i.pathname=g.join("/")}o=h>=0?e[h]:"/"}let l=Zre(i,o),c=s&&s!=="/"&&s.endsWith("/"),u=(a||s===".")&&n.endsWith("/");return!l.pathname.endsWith("/")&&(c||u)&&(l.pathname+="/"),l}var sc=t=>t.join("/").replace(/\/\/+/g,"/"),Jre=t=>t.replace(/\/+$/,"").replace(/^\/*/,"/"),eie=t=>!t||t==="?"?"":t.startsWith("?")?t:"?"+t,tie=t=>!t||t==="#"?"":t.startsWith("#")?t:"#"+t;function nie(t){return t!=null&&typeof t.status=="number"&&typeof t.statusText=="string"&&typeof t.internal=="boolean"&&"data"in t}Object.getOwnPropertyNames(Object.prototype).sort().join("\0");var jG=["POST","PUT","PATCH","DELETE"];new Set(jG);var rie=["GET",...jG];new Set(rie);var Am=E.createContext(null);Am.displayName="DataRouter";var tw=E.createContext(null);tw.displayName="DataRouterState";E.createContext(!1);var UG=E.createContext({isTransitioning:!1});UG.displayName="ViewTransition";var iie=E.createContext(new Map);iie.displayName="Fetchers";var aie=E.createContext(null);aie.displayName="Await";var ul=E.createContext(null);ul.displayName="Navigation";var F0=E.createContext(null);F0.displayName="Location";var No=E.createContext({outlet:null,matches:[],isDataRoute:!1});No.displayName="Route";var jP=E.createContext(null);jP.displayName="RouteError";function sie(t,{relative:e}={}){gr(z0(),"useHref() may be used only in the context of a component.");let{basename:n,navigator:r}=E.useContext(ul),{hash:i,pathname:a,search:s}=B0(t,{relative:e}),o=a;return n!=="/"&&(o=a==="/"?n:sc([n,a])),r.createHref({pathname:o,search:s,hash:i})}function z0(){return E.useContext(F0)!=null}function od(){return gr(z0(),"useLocation() may be used only in the context of a component."),E.useContext(F0).location}var FG="You should call navigate() in a React.useEffect(), not when your component is first rendered.";function zG(t){E.useContext(ul).static||E.useLayoutEffect(t)}function UP(){let{isDataRoute:t}=E.useContext(No);return t?Sie():oie()}function oie(){gr(z0(),"useNavigate() may be used only in the context of a component.");let t=E.useContext(Am),{basename:e,navigator:n}=E.useContext(ul),{matches:r}=E.useContext(No),{pathname:i}=od(),a=JSON.stringify(LG(r)),s=E.useRef(!1);return zG(()=>{s.current=!0}),E.useCallback((l,c={})=>{if(Mo(s.current,FG),!s.current)return;if(typeof l=="number"){n.go(l);return}let u=IG(l,JSON.parse(a),i,c.relative==="path");t==null&&e!=="/"&&(u.pathname=u.pathname==="/"?e:sc([e,u.pathname])),(c.replace?n.replace:n.push)(u,c.state,c)},[e,n,a,i,t])}var lie=E.createContext(null);function cie(t){let e=E.useContext(No).outlet;return E.useMemo(()=>e&&E.createElement(lie.Provider,{value:t},e),[e,t])}function uie(){let{matches:t}=E.useContext(No),e=t[t.length-1];return e?e.params:{}}function B0(t,{relative:e}={}){let{matches:n}=E.useContext(No),{pathname:r}=od(),i=JSON.stringify(LG(n));return E.useMemo(()=>IG(t,JSON.parse(i),r,e==="path"),[t,i,r,e])}function die(t,e){return BG(t,e)}function BG(t,e,n,r,i){gr(z0(),"useRoutes() may be used only in the context of a component.");let{navigator:a}=E.useContext(ul),{matches:s}=E.useContext(No),o=s[s.length-1],l=o?o.params:{},c=o?o.pathname:"/",u=o?o.pathnameBase:"/",h=o&&o.route;{let M=h&&h.path||"";HG(c,!h||M.endsWith("*")||M.endsWith("*?"),`You rendered descendant (or called \`useRoutes()\`) at "${c}" (under ) but the parent route path has no trailing "*". This means if you navigate deeper, the parent won't match anymore and therefore the child routes will never render. + +Please change the parent to .`)}let g=od(),m;if(e){let M=typeof e=="string"?Em(e):e;gr(u==="/"||M.pathname?.startsWith(u),`When overriding the location using \`\` or \`useRoutes(routes, location)\`, the location pathname must begin with the portion of the URL pathname that was matched by all parent routes. The current pathname base is "${u}" but pathname "${M.pathname}" was given in the \`location\` prop.`),m=M}else m=g;let b=m.pathname||"/",_=b;if(u!=="/"){let M=u.replace(/^\//,"").split("/");_="/"+b.replace(/^\//,"").split("/").slice(M.length).join("/")}let v=kG(t,{pathname:_});Mo(h||v!=null,`No routes matched location "${m.pathname}${m.search}${m.hash}" `),Mo(v==null||v[v.length-1].route.element!==void 0||v[v.length-1].route.Component!==void 0||v[v.length-1].route.lazy!==void 0,`Matched leaf route at location "${m.pathname}${m.search}${m.hash}" does not have an element or Component. This means it will render an with a null value by default resulting in an "empty" page.`);let x=gie(v&&v.map(M=>Object.assign({},M,{params:Object.assign({},l,M.params),pathname:sc([u,a.encodeLocation?a.encodeLocation(M.pathname.replace(/\?/g,"%3F").replace(/#/g,"%23")).pathname:M.pathname]),pathnameBase:M.pathnameBase==="/"?u:sc([u,a.encodeLocation?a.encodeLocation(M.pathnameBase.replace(/\?/g,"%3F").replace(/#/g,"%23")).pathname:M.pathnameBase])})),s,n,r,i);return e&&x?E.createElement(F0.Provider,{value:{location:{pathname:"/",search:"",hash:"",state:null,key:"default",...m},navigationType:"POP"}},x):x}function fie(){let t=_ie(),e=nie(t)?`${t.status} ${t.statusText}`:t instanceof Error?t.message:JSON.stringify(t),n=t instanceof Error?t.stack:null,r="rgba(200,200,200, 0.5)",i={padding:"0.5rem",backgroundColor:r},a={padding:"2px 4px",backgroundColor:r},s=null;return console.error("Error handled by React Router default ErrorBoundary:",t),s=E.createElement(E.Fragment,null,E.createElement("p",null,"💿 Hey developer 👋"),E.createElement("p",null,"You can provide a way better UX than this when your app throws errors by providing your own ",E.createElement("code",{style:a},"ErrorBoundary")," or"," ",E.createElement("code",{style:a},"errorElement")," prop on your route.")),E.createElement(E.Fragment,null,E.createElement("h2",null,"Unexpected Application Error!"),E.createElement("h3",{style:{fontStyle:"italic"}},e),n?E.createElement("pre",{style:i},n):null,s)}var hie=E.createElement(fie,null),pie=class extends E.Component{constructor(t){super(t),this.state={location:t.location,revalidation:t.revalidation,error:t.error}}static getDerivedStateFromError(t){return{error:t}}static getDerivedStateFromProps(t,e){return e.location!==t.location||e.revalidation!=="idle"&&t.revalidation==="idle"?{error:t.error,location:t.location,revalidation:t.revalidation}:{error:t.error!==void 0?t.error:e.error,location:e.location,revalidation:t.revalidation||e.revalidation}}componentDidCatch(t,e){this.props.onError?this.props.onError(t,e):console.error("React Router caught the following error during render",t)}render(){return this.state.error!==void 0?E.createElement(No.Provider,{value:this.props.routeContext},E.createElement(jP.Provider,{value:this.state.error,children:this.props.component})):this.props.children}};function mie({routeContext:t,match:e,children:n}){let r=E.useContext(Am);return r&&r.static&&r.staticContext&&(e.route.errorElement||e.route.ErrorBoundary)&&(r.staticContext._deepestRenderedBoundaryId=e.route.id),E.createElement(No.Provider,{value:t},n)}function gie(t,e=[],n=null,r=null,i=null){if(t==null){if(!n)return null;if(n.errors)t=n.matches;else if(e.length===0&&!n.initialized&&n.matches.length>0)t=n.matches;else return null}let a=t,s=n?.errors;if(s!=null){let u=a.findIndex(h=>h.route.id&&s?.[h.route.id]!==void 0);gr(u>=0,`Could not find a matching route for errors on route IDs: ${Object.keys(s).join(",")}`),a=a.slice(0,Math.min(a.length,u+1))}let o=!1,l=-1;if(n)for(let u=0;u=0?a=a.slice(0,l+1):a=[a[0]];break}}}let c=n&&r?(u,h)=>{r(u,{location:n.location,params:n.matches?.[0]?.params??{},errorInfo:h})}:void 0;return a.reduceRight((u,h,g)=>{let m,b=!1,_=null,v=null;n&&(m=s&&h.route.id?s[h.route.id]:void 0,_=h.route.errorElement||hie,o&&(l<0&&g===0?(HG("route-fallback",!1,"No `HydrateFallback` element provided to render during initial hydration"),b=!0,v=null):l===g&&(b=!0,v=h.route.hydrateFallbackElement||null)));let x=e.concat(a.slice(0,g+1)),M=()=>{let w;return m?w=_:b?w=v:h.route.Component?w=E.createElement(h.route.Component,null):h.route.element?w=h.route.element:w=u,E.createElement(mie,{match:h,routeContext:{outlet:u,matches:x,isDataRoute:n!=null},children:w})};return n&&(h.route.ErrorBoundary||h.route.errorElement||g===0)?E.createElement(pie,{location:n.location,revalidation:n.revalidation,component:_,error:m,children:M(),routeContext:{outlet:null,matches:x,isDataRoute:!0},onError:c}):M()},null)}function FP(t){return`${t} must be used within a data router. See https://reactrouter.com/en/main/routers/picking-a-router.`}function xie(t){let e=E.useContext(Am);return gr(e,FP(t)),e}function vie(t){let e=E.useContext(tw);return gr(e,FP(t)),e}function bie(t){let e=E.useContext(No);return gr(e,FP(t)),e}function zP(t){let e=bie(t),n=e.matches[e.matches.length-1];return gr(n.route.id,`${t} can only be used on routes that contain a unique "id"`),n.route.id}function yie(){return zP("useRouteId")}function _ie(){let t=E.useContext(jP),e=vie("useRouteError"),n=zP("useRouteError");return t!==void 0?t:e.errors?.[n]}function Sie(){let{router:t}=xie("useNavigate"),e=zP("useNavigate"),n=E.useRef(!1);return zG(()=>{n.current=!0}),E.useCallback(async(i,a={})=>{Mo(n.current,FG),n.current&&(typeof i=="number"?t.navigate(i):await t.navigate(i,{fromRouteId:e,...a}))},[t,e])}var zU={};function HG(t,e,n){!e&&!zU[t]&&(zU[t]=!0,Mo(!1,n))}E.memo(wie);function wie({routes:t,future:e,state:n,unstable_onError:r}){return BG(t,void 0,n,r,e)}function Mie(t){return cie(t.context)}function zo(t){gr(!1,"A is only ever to be used as the child of element, never rendered directly. Please wrap your in a .")}function Eie({basename:t="/",children:e=null,location:n,navigationType:r="POP",navigator:i,static:a=!1}){gr(!z0(),"You cannot render a inside another . You should never have more than one in your app.");let s=t.replace(/^\/*/,"/"),o=E.useMemo(()=>({basename:s,navigator:i,static:a,future:{}}),[s,i,a]);typeof n=="string"&&(n=Em(n));let{pathname:l="/",search:c="",hash:u="",state:h=null,key:g="default"}=n,m=E.useMemo(()=>{let b=pc(l,s);return b==null?null:{location:{pathname:b,search:c,hash:u,state:h,key:g},navigationType:r}},[s,l,c,u,h,g,r]);return Mo(m!=null,` is not able to match the URL "${l}${c}${u}" because it does not start with the basename, so the won't render anything.`),m==null?null:E.createElement(ul.Provider,{value:o},E.createElement(F0.Provider,{children:e,value:m}))}function Aie({children:t,location:e}){return die(ON(t),e)}function ON(t,e=[]){let n=[];return E.Children.forEach(t,(r,i)=>{if(!E.isValidElement(r))return;let a=[...e,i];if(r.type===E.Fragment){n.push.apply(n,ON(r.props.children,a));return}gr(r.type===zo,`[${typeof r.type=="string"?r.type:r.type.name}] is not a component. All component children of must be a or `),gr(!r.props.index||!r.props.children,"An index route cannot have child routes.");let s={id:r.props.id||a.join("-"),caseSensitive:r.props.caseSensitive,element:r.props.element,Component:r.props.Component,index:r.props.index,path:r.props.path,middleware:r.props.middleware,loader:r.props.loader,action:r.props.action,hydrateFallbackElement:r.props.hydrateFallbackElement,HydrateFallback:r.props.HydrateFallback,errorElement:r.props.errorElement,ErrorBoundary:r.props.ErrorBoundary,hasErrorBoundary:r.props.hasErrorBoundary===!0||r.props.ErrorBoundary!=null||r.props.errorElement!=null,shouldRevalidate:r.props.shouldRevalidate,handle:r.props.handle,lazy:r.props.lazy};r.props.children&&(s.children=ON(r.props.children,a)),n.push(s)}),n}var v_="get",b_="application/x-www-form-urlencoded";function nw(t){return t!=null&&typeof t.tagName=="string"}function Tie(t){return nw(t)&&t.tagName.toLowerCase()==="button"}function Cie(t){return nw(t)&&t.tagName.toLowerCase()==="form"}function Nie(t){return nw(t)&&t.tagName.toLowerCase()==="input"}function Rie(t){return!!(t.metaKey||t.altKey||t.ctrlKey||t.shiftKey)}function Pie(t,e){return t.button===0&&(!e||e==="_self")&&!Rie(t)}var Ub=null;function kie(){if(Ub===null)try{new FormData(document.createElement("form"),0),Ub=!1}catch{Ub=!0}return Ub}var Die=new Set(["application/x-www-form-urlencoded","multipart/form-data","text/plain"]);function GA(t){return t!=null&&!Die.has(t)?(Mo(!1,`"${t}" is not a valid \`encType\` for \`
\`/\`\` and will default to "${b_}"`),null):t}function Oie(t,e){let n,r,i,a,s;if(Cie(t)){let o=t.getAttribute("action");r=o?pc(o,e):null,n=t.getAttribute("method")||v_,i=GA(t.getAttribute("enctype"))||b_,a=new FormData(t)}else if(Tie(t)||Nie(t)&&(t.type==="submit"||t.type==="image")){let o=t.form;if(o==null)throw new Error('Cannot submit a