@echothink-ui/admin 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/README.md +5 -0
  2. package/dist/components/AdminHealthTemplate.d.ts +5 -0
  3. package/dist/components/AdminShell.d.ts +8 -0
  4. package/dist/components/AuditLogViewer.d.ts +9 -0
  5. package/dist/components/BillingUsagePanel.d.ts +7 -0
  6. package/dist/components/FeatureFlagPanel.d.ts +8 -0
  7. package/dist/components/IntegrationHealthTable.d.ts +6 -0
  8. package/dist/components/JobQueuePanel.d.ts +7 -0
  9. package/dist/components/PolicyConfigPanel.d.ts +9 -0
  10. package/dist/components/QueueDepthChart.d.ts +6 -0
  11. package/dist/components/RateLimitPanel.d.ts +7 -0
  12. package/dist/components/RuntimeLogViewer.d.ts +10 -0
  13. package/dist/components/ServiceStatusCard.d.ts +7 -0
  14. package/dist/components/SystemHealthDashboard.d.ts +8 -0
  15. package/dist/components/TenantSettingsPanel.d.ts +11 -0
  16. package/dist/components/WorkerPoolPanel.d.ts +7 -0
  17. package/dist/components/types.d.ts +114 -0
  18. package/dist/index.cjs +1835 -0
  19. package/dist/index.cjs.map +1 -0
  20. package/dist/index.css +1711 -0
  21. package/dist/index.css.map +1 -0
  22. package/dist/index.d.ts +19 -0
  23. package/dist/index.js +1812 -0
  24. package/dist/index.js.map +1 -0
  25. package/package.json +46 -0
  26. package/src/components/AdminHealthTemplate.tsx +25 -0
  27. package/src/components/AdminShell.tsx +48 -0
  28. package/src/components/AuditLogViewer.tsx +96 -0
  29. package/src/components/BillingUsagePanel.tsx +171 -0
  30. package/src/components/FeatureFlagPanel.tsx +178 -0
  31. package/src/components/IntegrationHealthTable.tsx +196 -0
  32. package/src/components/JobQueuePanel.tsx +171 -0
  33. package/src/components/PolicyConfigPanel.test.tsx +45 -0
  34. package/src/components/PolicyConfigPanel.tsx +131 -0
  35. package/src/components/QueueDepthChart.tsx +70 -0
  36. package/src/components/RateLimitPanel.test.tsx +29 -0
  37. package/src/components/RateLimitPanel.tsx +249 -0
  38. package/src/components/RuntimeLogViewer.test.tsx +60 -0
  39. package/src/components/RuntimeLogViewer.tsx +185 -0
  40. package/src/components/ServiceStatusCard.tsx +91 -0
  41. package/src/components/SystemHealthDashboard.tsx +214 -0
  42. package/src/components/TenantSettingsPanel.test.tsx +38 -0
  43. package/src/components/TenantSettingsPanel.tsx +44 -0
  44. package/src/components/WorkerPoolPanel.test.tsx +32 -0
  45. package/src/components/WorkerPoolPanel.tsx +281 -0
  46. package/src/components/types.ts +131 -0
  47. package/src/index.tsx +37 -0
  48. package/src/styles.css +2024 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.tsx","../src/components/AdminShell.tsx","../src/components/SystemHealthDashboard.tsx","../src/components/ServiceStatusCard.tsx","../src/components/WorkerPoolPanel.tsx","../src/components/JobQueuePanel.tsx","../src/components/QueueDepthChart.tsx","../src/components/RuntimeLogViewer.tsx","../src/components/AuditLogViewer.tsx","../src/components/PolicyConfigPanel.tsx","../src/components/BillingUsagePanel.tsx","../src/components/TenantSettingsPanel.tsx","../src/components/FeatureFlagPanel.tsx","../src/components/RateLimitPanel.tsx","../src/components/IntegrationHealthTable.tsx","../src/components/AdminHealthTemplate.tsx"],"sourcesContent":["import \"./styles.css\";\n\nexport * from \"./components/types\";\nexport * from \"./components/AdminShell\";\nexport * from \"./components/SystemHealthDashboard\";\nexport * from \"./components/ServiceStatusCard\";\nexport * from \"./components/WorkerPoolPanel\";\nexport * from \"./components/JobQueuePanel\";\nexport * from \"./components/QueueDepthChart\";\nexport * from \"./components/RuntimeLogViewer\";\nexport * from \"./components/AuditLogViewer\";\nexport * from \"./components/PolicyConfigPanel\";\nexport * from \"./components/BillingUsagePanel\";\nexport * from \"./components/TenantSettingsPanel\";\nexport * from \"./components/FeatureFlagPanel\";\nexport * from \"./components/RateLimitPanel\";\nexport * from \"./components/IntegrationHealthTable\";\nexport * from \"./components/AdminHealthTemplate\";\n\nexport const AdminComponentNames = [\n \"AdminShell\",\n \"SystemHealthDashboard\",\n \"ServiceStatusCard\",\n \"WorkerPoolPanel\",\n \"JobQueuePanel\",\n \"QueueDepthChart\",\n \"RuntimeLogViewer\",\n \"AuditLogViewer\",\n \"PolicyConfigPanel\",\n \"BillingUsagePanel\",\n \"TenantSettingsPanel\",\n \"FeatureFlagPanel\",\n \"RateLimitPanel\",\n \"IntegrationHealthTable\",\n \"AdminHealthTemplate\"\n] as const;\nexport type AdminComponentName = (typeof AdminComponentNames)[number];\n","import * as React from \"react\";\nimport { TemplateShell } from \"@echothink-ui/layouts\";\nimport type { SurfaceComponentProps } from \"@echothink-ui/core\";\n\nexport interface AdminShellProps extends Omit<SurfaceComponentProps, \"children\"> {\n sideNav: React.ReactNode;\n header?: React.ReactNode;\n children: React.ReactNode;\n}\n\nexport function AdminShell({\n sideNav,\n header,\n children,\n className,\n title: _title,\n subtitle: _subtitle,\n description: _description,\n eyebrow: _eyebrow,\n density: _density,\n status: _status,\n severity: _severity,\n loading: _loading,\n empty: _empty,\n error: _error,\n items: _items,\n actions: _actions,\n metadata: _metadata,\n footer: _footer,\n ...props\n}: AdminShellProps) {\n return (\n <TemplateShell\n {...props}\n className={[\"eth-admin-shell\", className].filter(Boolean).join(\" \")}\n data-eth-component=\"AdminShell\"\n canvas={\n <div className=\"eth-admin-shell__layout\">\n <aside className=\"eth-admin-shell__side-nav\">{sideNav}</aside>\n <div className=\"eth-admin-shell__workspace\">\n {header ? <header className=\"eth-admin-shell__header\">{header}</header> : null}\n <main className=\"eth-admin-shell__main\">{children}</main>\n </div>\n </div>\n }\n />\n );\n}\n","import {\n Badge,\n Surface,\n type EthOperationalStatus,\n type EthSeverity,\n type SurfaceComponentProps\n} from \"@echothink-ui/core\";\nimport { KPIBlock } from \"@echothink-ui/charts\";\nimport { ServiceStatusCard } from \"./ServiceStatusCard\";\nimport type { AdminIncident, AdminMetric, HealthService } from \"./types\";\n\nexport interface SystemHealthDashboardProps extends Omit<SurfaceComponentProps, \"children\"> {\n services: HealthService[];\n incidents?: AdminIncident[];\n metrics?: AdminMetric[];\n}\n\nexport function SystemHealthDashboard({\n services,\n incidents = [],\n metrics = [],\n title,\n description,\n severity,\n status,\n className,\n ...props\n}: SystemHealthDashboardProps) {\n const serviceCount = services.length;\n const healthyCount = services.filter((service) => service.status === \"healthy\").length;\n const degradedCount = services.filter((service) => service.status === \"degraded\").length;\n const downCount = services.filter((service) => service.status === \"down\").length;\n const criticalIncidentCount = incidents.filter(\n (incident) => incident.severity === \"critical\" || incident.severity === \"error\"\n ).length;\n const openIncidentCount = incidents.length;\n const defaultSeverity = severityForHealth(\n downCount,\n degradedCount,\n criticalIncidentCount,\n openIncidentCount\n );\n const defaultStatus = statusForHealth(serviceCount, downCount, degradedCount);\n const computedMetrics = metrics.length\n ? metrics\n : [\n {\n label: \"Healthy services\",\n value: serviceCount ? `${healthyCount} / ${serviceCount}` : \"0\",\n trend: serviceHealthTrend(healthyCount, degradedCount, downCount)\n },\n {\n label: \"Open incidents\",\n value: openIncidentCount,\n trend: incidentTrend(criticalIncidentCount, openIncidentCount)\n },\n {\n label: \"Avg latency\",\n value: average(\n services\n .map((service) => service.latencyMs)\n .filter((value): value is number => value !== undefined)\n ),\n trend: serviceCount ? `${serviceCount} monitored` : undefined\n }\n ];\n\n return (\n <Surface\n {...props}\n title={title ?? \"System health\"}\n description={\n description ??\n healthSummary(serviceCount, healthyCount, degradedCount, downCount, openIncidentCount)\n }\n severity={severity ?? defaultSeverity}\n status={status ?? defaultStatus}\n className={[\"eth-admin-system-health\", className].filter(Boolean).join(\" \")}\n data-eth-component=\"SystemHealthDashboard\"\n >\n <div className=\"eth-admin-system-health__metrics\">\n {computedMetrics.map((metric) => (\n <KPIBlock\n key={String(metric.label)}\n title={metric.label}\n value={metric.value}\n status={metric.trend}\n />\n ))}\n </div>\n <div className=\"eth-admin-system-health__services\">\n {services.length ? (\n services.map((service) => {\n const serviceIncidents = incidents.filter((incident) =>\n incident.title.toLowerCase().includes(service.name.toLowerCase())\n );\n\n return (\n <ServiceStatusCard\n key={service.id}\n service={{\n name: service.name,\n status: service.status,\n latencyMs: service.latencyMs,\n uptimePercent: service.status === \"healthy\" ? 99.9 : undefined,\n incidentsCount: service.incidentsCount ?? serviceIncidents.length,\n lastIncidentAt: serviceIncidents[0]?.startedAt\n }}\n />\n );\n })\n ) : (\n <p className=\"eth-admin-system-health__empty\">No services are currently registered.</p>\n )}\n </div>\n {incidents.length ? (\n <section className=\"eth-admin-system-health__incidents\">\n <h3>Incidents</h3>\n <ul>\n {incidents.map((incident) => (\n <li key={incident.id}>\n <Badge severity={severityForIncident(incident.severity)}>{incident.severity}</Badge>\n <span>{incident.title}</span>\n <time>{incident.startedAt}</time>\n </li>\n ))}\n </ul>\n </section>\n ) : null}\n </Surface>\n );\n}\n\nfunction average(values: number[]) {\n if (!values.length) return \"0 ms\";\n return `${Math.round(values.reduce((sum, value) => sum + value, 0) / values.length)} ms`;\n}\n\nfunction healthSummary(\n serviceCount: number,\n healthyCount: number,\n degradedCount: number,\n downCount: number,\n openIncidentCount: number\n) {\n if (!serviceCount) return \"No services registered for this tenant.\";\n\n const exceptions: string[] = [];\n if (degradedCount) exceptions.push(`${degradedCount} degraded`);\n if (downCount) exceptions.push(`${downCount} down`);\n if (openIncidentCount) {\n exceptions.push(`${openIncidentCount} open ${pluralize(openIncidentCount, \"incident\")}`);\n }\n\n const serviceSummary = `${healthyCount} of ${serviceCount} ${pluralize(serviceCount, \"service\")} healthy`;\n return exceptions.length\n ? `${serviceSummary}; ${exceptions.join(\", \")}.`\n : `${serviceSummary}; no open incidents.`;\n}\n\nfunction serviceHealthTrend(healthyCount: number, degradedCount: number, downCount: number) {\n if (downCount) {\n return <Badge severity=\"danger\">{`${downCount} down`}</Badge>;\n }\n if (degradedCount) {\n return <Badge severity=\"warning\">{`${degradedCount} degraded`}</Badge>;\n }\n if (healthyCount) {\n return <Badge severity=\"success\">Nominal</Badge>;\n }\n return undefined;\n}\n\nfunction incidentTrend(criticalIncidentCount: number, openIncidentCount: number) {\n if (criticalIncidentCount) {\n return <Badge severity=\"danger\">{`${criticalIncidentCount} critical`}</Badge>;\n }\n if (openIncidentCount) {\n return <Badge severity=\"warning\">Investigating</Badge>;\n }\n return <Badge severity=\"success\">Clear</Badge>;\n}\n\nfunction severityForHealth(\n downCount: number,\n degradedCount: number,\n criticalIncidentCount: number,\n openIncidentCount: number\n): EthSeverity | undefined {\n if (downCount || criticalIncidentCount) return \"danger\";\n if (degradedCount || openIncidentCount) return \"warning\";\n return undefined;\n}\n\nfunction statusForHealth(\n serviceCount: number,\n downCount: number,\n degradedCount: number\n): EthOperationalStatus {\n if (!serviceCount) return \"inactive\";\n if (downCount) return \"failed\";\n if (degradedCount) return \"warning\";\n return \"active\";\n}\n\nfunction pluralize(count: number, singular: string) {\n return count === 1 ? singular : `${singular}s`;\n}\n\nfunction severityForIncident(severity: AdminIncident[\"severity\"]): EthSeverity {\n if (severity === \"critical\" || severity === \"error\") return \"danger\";\n if (severity === \"warning\") return \"warning\";\n return \"info\";\n}\n","import { Badge, Surface, type EthSeverity, type SurfaceComponentProps } from \"@echothink-ui/core\";\nimport type { ServiceHealthStatus, ServiceStatusSummary } from \"./types\";\n\nconst percentFormatter = new Intl.NumberFormat(\"en\", { maximumFractionDigits: 2 });\n\nexport interface ServiceStatusCardProps extends Omit<SurfaceComponentProps, \"children\"> {\n service: ServiceStatusSummary;\n}\n\nexport function ServiceStatusCard({ service, className, ...props }: ServiceStatusCardProps) {\n const statusSeverity = severityForStatus(service.status);\n const statusText = statusLabel(service.status);\n const metrics = [\n {\n label: \"Latency\",\n value: service.latencyMs !== undefined ? `${service.latencyMs} ms` : \"Unavailable\",\n muted: service.latencyMs === undefined\n },\n {\n label: \"Uptime\",\n value: service.uptimePercent !== undefined ? formatPercent(service.uptimePercent) : \"Not reported\",\n muted: service.uptimePercent === undefined\n },\n {\n label: service.incidentsCount !== undefined ? \"Open incidents\" : \"Last incident\",\n value:\n service.incidentsCount !== undefined\n ? service.incidentsCount\n : service.lastIncidentAt ?? \"None reported\",\n muted:\n service.incidentsCount !== undefined ? service.incidentsCount === 0 : !service.lastIncidentAt\n }\n ];\n\n return (\n <Surface\n {...props}\n title={\n <span className=\"eth-admin-service-status-card__title\">\n <span>{service.name}</span>\n <Badge aria-label={`Service status: ${statusText}`} severity={statusSeverity}>\n {statusText}\n </Badge>\n </span>\n }\n description={statusDescription(service.status)}\n className={[\n \"eth-admin-service-status-card\",\n `eth-admin-service-status-card--${service.status}`,\n className\n ]\n .filter(Boolean)\n .join(\" \")}\n data-eth-component=\"ServiceStatusCard\"\n >\n <dl className=\"eth-admin-service-status-card__metrics\">\n {metrics.map((metric) => (\n <div\n key={metric.label}\n className={metric.muted ? \"eth-admin-service-status-card__metric--muted\" : undefined}\n >\n <dt>{metric.label}</dt>\n <dd>{metric.value}</dd>\n </div>\n ))}\n </dl>\n </Surface>\n );\n}\n\nexport function severityForStatus(status: ServiceHealthStatus): EthSeverity {\n if (status === \"healthy\") return \"success\";\n if (status === \"degraded\") return \"warning\";\n return \"danger\";\n}\n\nfunction statusLabel(status: ServiceHealthStatus) {\n if (status === \"healthy\") return \"Healthy\";\n if (status === \"degraded\") return \"Degraded\";\n return \"Down\";\n}\n\nfunction statusDescription(status: ServiceHealthStatus) {\n if (status === \"healthy\") return \"Operational within expected thresholds\";\n if (status === \"degraded\") return \"Elevated latency or partial failures detected\";\n return \"Service unavailable or actively failing\";\n}\n\nfunction formatPercent(value: number) {\n return `${percentFormatter.format(value)}%`;\n}\n","import * as React from \"react\";\nimport {\n ActionGroup,\n Badge,\n Button,\n type EthSeverity,\n type SurfaceComponentProps\n} from \"@echothink-ui/core\";\nimport { DataTable, type DataColumn } from \"@echothink-ui/data\";\nimport type { WorkerPool } from \"./types\";\n\nexport interface WorkerPoolPanelProps extends Omit<SurfaceComponentProps, \"children\"> {\n pools: WorkerPool[];\n onScale?: (id: string, delta: number) => void;\n}\n\ntype WorkerPoolTone = \"normal\" | \"warning\" | \"danger\" | \"neutral\";\n\ninterface WorkerPoolState {\n label: string;\n tone: WorkerPoolTone;\n}\n\ninterface WorkerPoolStatusSummary {\n label: string;\n severity: EthSeverity;\n}\n\ntype WorkerPoolMeterStyle = React.CSSProperties & {\n \"--eth-admin-worker-pool-capacity\": string;\n};\n\ntype WorkerPoolRow = Record<string, unknown> &\n WorkerPool & {\n cappedPercent: number;\n capacityLabel: string;\n percent: number;\n percentLabel: string;\n state: WorkerPoolState;\n };\n\nexport function WorkerPoolPanel({\n pools,\n onScale,\n title = \"Worker pools\",\n subtitle,\n description,\n actions,\n density = \"compact\",\n className,\n \"aria-label\": ariaLabel,\n \"aria-labelledby\": ariaLabelledBy,\n eyebrow: _eyebrow,\n status: _status,\n severity: _severity,\n loading: _loading,\n empty: _empty,\n error: _error,\n items: _items,\n metadata: _metadata,\n footer: _footer,\n ...sectionProps\n}: WorkerPoolPanelProps) {\n const headingId = React.useId();\n const rows: WorkerPoolRow[] = pools.map((pool) => {\n const percent = pool.total > 0 ? (pool.active / pool.total) * 100 : 0;\n const cappedPercent = Math.min(100, Math.max(0, percent));\n\n return {\n ...pool,\n cappedPercent,\n capacityLabel:\n pool.total > 0\n ? `${formatNumber(pool.active)} / ${formatNumber(pool.total)} active`\n : `${formatNumber(pool.active)} active`,\n percent,\n percentLabel: pool.total > 0 ? formatPercent(percent) : \"No capacity\",\n state: workerPoolState(pool, percent)\n };\n });\n const totals = pools.reduce(\n (summary, pool) => ({\n active: summary.active + pool.active,\n failed: summary.failed + pool.failed,\n idle: summary.idle + pool.idle,\n total: summary.total + pool.total\n }),\n { active: 0, failed: 0, idle: 0, total: 0 }\n );\n const utilization = totals.total > 0 ? (totals.active / totals.total) * 100 : 0;\n const statusSummary = workerPoolStatusSummary(pools.length, totals.failed, utilization);\n const supportingText = subtitle ?? description;\n const columns: DataColumn<WorkerPoolRow>[] = [\n {\n key: \"name\",\n header: \"Pool\",\n width: \"26%\",\n render: (row) => (\n <div className=\"eth-admin-worker-pool__pool\">\n <strong>{row.name}</strong>\n <span>{row.state.label}</span>\n </div>\n )\n },\n {\n key: \"active\",\n header: \"Capacity\",\n width: \"34%\",\n render: (row) => (\n <div className=\"eth-admin-worker-pool__capacity\">\n <div className=\"eth-admin-worker-pool__capacity-copy\">\n <span>{row.capacityLabel}</span>\n <strong>{row.percentLabel}</strong>\n </div>\n <span\n className=\"eth-admin-worker-pool__meter\"\n role=\"progressbar\"\n aria-label={`${row.name} capacity`}\n aria-valuemin={0}\n aria-valuemax={100}\n aria-valuenow={Math.round(row.cappedPercent)}\n aria-valuetext={`${formatNumber(row.active)} of ${formatNumber(\n row.total\n )} workers active`}\n style={\n {\n \"--eth-admin-worker-pool-capacity\": `${row.cappedPercent}%`\n } as WorkerPoolMeterStyle\n }\n >\n <span\n className={[\n \"eth-admin-worker-pool__meter-fill\",\n `eth-admin-worker-pool__meter-fill--${row.state.tone}`\n ].join(\" \")}\n />\n </span>\n </div>\n )\n },\n {\n key: \"idle\",\n header: \"Idle\",\n align: \"end\",\n width: \"12%\",\n render: (row) => (\n <span className=\"eth-admin-worker-pool__number\">{formatNumber(row.idle)}</span>\n )\n },\n {\n key: \"failed\",\n header: \"Failed\",\n align: \"end\",\n width: \"12%\",\n render: (row) => (\n <Badge severity={row.failed > 0 ? \"danger\" : \"success\"}>{formatNumber(row.failed)}</Badge>\n )\n },\n {\n key: \"scale\",\n header: \"Scale\",\n align: \"end\",\n width: \"10rem\",\n render: (row) => (\n <div\n className=\"eth-admin-worker-pool__scale\"\n role=\"group\"\n aria-label={`${row.name} scale controls`}\n >\n <Button\n type=\"button\"\n intent=\"ghost\"\n density=\"compact\"\n className=\"eth-admin-worker-pool__scale-button\"\n disabled={!onScale}\n aria-label={`Scale ${row.name} down by 1`}\n onClick={() => onScale?.(row.id, -1)}\n >\n -1\n </Button>\n <Button\n type=\"button\"\n intent=\"ghost\"\n density=\"compact\"\n className=\"eth-admin-worker-pool__scale-button\"\n disabled={!onScale}\n aria-label={`Scale ${row.name} up by 1`}\n onClick={() => onScale?.(row.id, 1)}\n >\n +1\n </Button>\n </div>\n )\n }\n ];\n\n return (\n <section\n {...sectionProps}\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledBy ?? (ariaLabel ? undefined : headingId)}\n className={[\"eth-admin-worker-pool\", className].filter(Boolean).join(\" \")}\n data-eth-component=\"WorkerPoolPanel\"\n >\n <header>\n <div className=\"eth-admin-worker-pool__heading\">\n <h3 id={headingId}>{title}</h3>\n {supportingText ? <p>{supportingText}</p> : null}\n </div>\n <div className=\"eth-admin-worker-pool__header-actions\">\n <Badge severity={statusSummary.severity}>{statusSummary.label}</Badge>\n <ActionGroup actions={actions} />\n </div>\n </header>\n <dl className=\"eth-admin-worker-pool__summary\" aria-label=\"Worker pool totals\">\n <div>\n <dt>Tracked pools</dt>\n <dd>{formatPoolCount(pools.length)}</dd>\n </div>\n <div>\n <dt>Active capacity</dt>\n <dd>\n {formatNumber(totals.active)} / {formatNumber(totals.total)}\n </dd>\n </div>\n <div>\n <dt>Failures</dt>\n <dd>{formatFailureCount(totals.failed)}</dd>\n </div>\n </dl>\n <DataTable\n rows={rows}\n columns={columns}\n rowKey=\"id\"\n density={density}\n className=\"eth-admin-worker-pool__table\"\n emptyState={\n <p className=\"eth-admin-worker-pool__empty\">No worker pools are configured.</p>\n }\n />\n </section>\n );\n}\n\nfunction workerPoolState(pool: WorkerPool, percent: number): WorkerPoolState {\n if (pool.failed > 0) return { label: \"Failure requires review\", tone: \"danger\" };\n if (pool.total <= 0) return { label: \"No capacity\", tone: \"neutral\" };\n if (percent >= 100) return { label: \"At capacity\", tone: \"warning\" };\n if (pool.idle > 0) return { label: \"Capacity available\", tone: \"normal\" };\n return { label: \"Active\", tone: \"normal\" };\n}\n\nfunction workerPoolStatusSummary(\n poolCount: number,\n failedCount: number,\n utilization: number\n): WorkerPoolStatusSummary {\n if (poolCount === 0) return { label: \"No pools\", severity: \"neutral\" };\n if (failedCount === 1) return { label: \"Failure in pool\", severity: \"danger\" };\n if (failedCount > 1) {\n return { label: `${formatNumber(failedCount)} failures`, severity: \"danger\" };\n }\n if (utilization >= 90) return { label: \"Capacity tight\", severity: \"warning\" };\n return { label: \"Operational\", severity: \"success\" };\n}\n\nfunction formatNumber(value: number) {\n return new Intl.NumberFormat(\"en-US\").format(value);\n}\n\nfunction formatPercent(value: number) {\n return `${value.toLocaleString(\"en-US\", { maximumFractionDigits: 0 })}%`;\n}\n\nfunction formatPoolCount(value: number) {\n return `${formatNumber(value)} ${value === 1 ? \"pool\" : \"pools\"}`;\n}\n\nfunction formatFailureCount(value: number) {\n return `${formatNumber(value)} failed`;\n}\n","import * as React from \"react\";\nimport {\n ActionGroup,\n Badge,\n type EthAction,\n type EthSeverity,\n type SurfaceComponentProps\n} from \"@echothink-ui/core\";\nimport { DataTable, type DataColumn } from \"@echothink-ui/data\";\nimport type { JobQueue } from \"./types\";\n\nexport interface JobQueuePanelProps extends Omit<SurfaceComponentProps, \"children\" | \"actions\"> {\n queues: JobQueue[];\n actions?: EthAction[];\n}\n\ntype JobQueueRow = Record<string, unknown> & JobQueue;\n\nexport function JobQueuePanel({\n queues,\n actions,\n title = \"Job queues\",\n subtitle,\n description,\n density = \"compact\",\n className,\n \"aria-labelledby\": ariaLabelledBy,\n eyebrow: _eyebrow,\n status: _status,\n severity: _severity,\n loading: _loading,\n empty: _empty,\n error: _error,\n items: _items,\n metadata: _metadata,\n footer: _footer,\n ...props\n}: JobQueuePanelProps) {\n const headingId = React.useId();\n const rows: JobQueueRow[] = queues.map((queue) => ({ ...queue }));\n const subtitleContent = subtitle ?? description;\n const totals = queues.reduce(\n (summary, queue) => ({\n depth: summary.depth + queue.depth,\n processing: summary.processing + queue.processing,\n failed: summary.failed + queue.failed\n }),\n { depth: 0, processing: 0, failed: 0 }\n );\n const columns: DataColumn<JobQueueRow>[] = [\n {\n key: \"name\",\n header: \"Queue\",\n width: \"34%\",\n render: (row) => (\n <div className=\"eth-admin-job-queue__queue\">\n <strong>{row.name}</strong>\n <span>{queueStateLabel(row)}</span>\n </div>\n )\n },\n {\n key: \"depth\",\n header: \"Depth\",\n align: \"end\",\n width: \"16%\",\n render: (row) => <span className=\"eth-admin-job-queue__number\">{formatCount(row.depth)}</span>\n },\n {\n key: \"processing\",\n header: \"Processing\",\n align: \"end\",\n width: \"18%\",\n render: (row) => (\n <span className=\"eth-admin-job-queue__number\">{formatCount(row.processing)}</span>\n )\n },\n {\n key: \"failed\",\n header: \"Failed\",\n align: \"end\",\n width: \"14%\",\n render: (row) => (\n <Badge severity={row.failed > 0 ? \"danger\" : \"success\"}>{formatCount(row.failed)}</Badge>\n )\n },\n {\n key: \"retryRate\",\n header: \"Retry rate\",\n align: \"end\",\n width: \"18%\",\n render: (row) =>\n row.retryRate === undefined ? (\n <span className=\"eth-admin-job-queue__muted\">n/a</span>\n ) : (\n <Badge severity={retryRateSeverity(row.retryRate)}>\n {formatRetryRate(row.retryRate)}\n </Badge>\n )\n }\n ];\n const statusSeverity: EthSeverity =\n queues.length === 0\n ? \"neutral\"\n : totals.failed > 0\n ? \"danger\"\n : totals.processing > 0\n ? \"info\"\n : \"success\";\n const statusLabel =\n queues.length === 0 ? \"No queues\" : totals.failed > 0 ? \"Action needed\" : \"Operational\";\n\n return (\n <section\n {...props}\n className={[\"eth-admin-job-queue\", className].filter(Boolean).join(\" \")}\n data-eth-component=\"JobQueuePanel\"\n aria-labelledby={ariaLabelledBy ?? headingId}\n >\n <header>\n <div className=\"eth-admin-job-queue__heading\">\n <h3 id={headingId}>{title}</h3>\n {subtitleContent ? (\n <div className=\"eth-admin-job-queue__subtitle\">{subtitleContent}</div>\n ) : null}\n </div>\n <div className=\"eth-admin-job-queue__header-actions\">\n <Badge severity={statusSeverity}>{statusLabel}</Badge>\n <ActionGroup actions={actions} />\n </div>\n </header>\n <dl className=\"eth-admin-job-queue__summary\" aria-label=\"Queue totals\">\n <div>\n <dt>Total depth</dt>\n <dd>{formatCount(totals.depth)}</dd>\n </div>\n <div>\n <dt>Processing</dt>\n <dd>{formatCount(totals.processing)}</dd>\n </div>\n <div>\n <dt>Failed</dt>\n <dd>{formatCount(totals.failed)}</dd>\n </div>\n </dl>\n <DataTable rows={rows} columns={columns} density={density} />\n </section>\n );\n}\n\nfunction queueStateLabel(queue: JobQueue) {\n if (queue.failed > 0) return \"Failure requires review\";\n if (queue.processing > 0) return \"Workers active\";\n if (queue.depth > 0) return \"Waiting for capacity\";\n return \"Idle\";\n}\n\nfunction retryRateSeverity(retryRate: number): EthSeverity {\n if (retryRate >= 1) return \"danger\";\n if (retryRate > 0.1) return \"warning\";\n if (retryRate > 0) return \"info\";\n return \"success\";\n}\n\nfunction formatCount(value: number) {\n return new Intl.NumberFormat(\"en-US\").format(value);\n}\n\nfunction formatRetryRate(value: number) {\n return `${value.toLocaleString(\"en-US\", { maximumFractionDigits: 2 })}%`;\n}\n","import { ChartBlock } from \"@echothink-ui/charts\";\nimport type { SurfaceComponentProps } from \"@echothink-ui/core\";\nimport type { QueueDepthPoint } from \"./types\";\n\nexport interface QueueDepthChartProps extends Omit<SurfaceComponentProps, \"children\"> {\n points: QueueDepthPoint[];\n}\n\nconst depthFormatter = new Intl.NumberFormat(\"en-US\", { maximumFractionDigits: 1 });\nconst queueDepthSeries = [{ key: \"depth\", label: \"Queue depth\", color: \"#0f62fe\" }];\n\nexport function QueueDepthChart({\n points,\n title,\n metadata,\n className,\n ...props\n}: QueueDepthChartProps) {\n const data = points.map((point, index) => {\n const row = {\n label: point.label ?? point.timestamp ?? String(index + 1),\n depth: point.depth\n };\n\n return point.timestamp ? { ...row, timestamp: point.timestamp } : row;\n });\n\n return (\n <ChartBlock\n {...props}\n className={[\"eth-admin-queue-depth-chart\", className].filter(Boolean).join(\" \")}\n title={title ?? \"Queue depth\"}\n metadata={metadata ?? queueDepthMetadata(points)}\n chartType=\"line\"\n data={data}\n valueKey=\"depth\"\n series={queueDepthSeries}\n data-eth-component=\"QueueDepthChart\"\n />\n );\n}\n\nfunction queueDepthMetadata(points: QueueDepthPoint[]): SurfaceComponentProps[\"metadata\"] {\n const depths = points.map((point) => point.depth).filter(Number.isFinite);\n if (!depths.length) return [];\n\n const current = depths.at(-1) ?? 0;\n const previous = depths.at(-2);\n const peak = Math.max(...depths);\n const average = depths.reduce((total, depth) => total + depth, 0) / depths.length;\n\n return [\n { label: \"Current depth\", value: formatDepth(current) },\n { label: \"Peak\", value: formatDepth(peak) },\n { label: \"Average\", value: formatDepth(average) },\n {\n label: \"Latest change\",\n value: previous === undefined ? \"n/a\" : formatDelta(current - previous)\n }\n ];\n}\n\nfunction formatDepth(value: number) {\n return depthFormatter.format(value);\n}\n\nfunction formatDelta(value: number) {\n if (value === 0) return \"No change\";\n return `${value > 0 ? \"+\" : \"\"}${formatDepth(value)}`;\n}\n","import * as React from \"react\";\nimport { Pause } from \"@carbon/icons-react\";\nimport { Badge, Button, type EthSeverity, type SurfaceComponentProps } from \"@echothink-ui/core\";\nimport { DataTable, type DataColumn } from \"@echothink-ui/data\";\nimport type { LogEntry } from \"./types\";\n\nexport interface RuntimeLogViewerProps extends Omit<SurfaceComponentProps, \"children\"> {\n entries: LogEntry[];\n filters?: React.ReactNode;\n onPause?: () => void;\n streaming?: boolean;\n}\n\ntype LogRow = Record<string, unknown> & LogEntry;\n\nexport function RuntimeLogViewer({\n entries,\n filters,\n onPause,\n streaming = false,\n className,\n title = \"Runtime logs\",\n subtitle,\n description,\n density = \"compact\",\n \"aria-label\": ariaLabel,\n \"aria-labelledby\": ariaLabelledBy\n}: RuntimeLogViewerProps) {\n const headingId = React.useId();\n const warningCount = countLevel(entries, \"warning\");\n const errorCount = countLevel(entries, \"error\");\n const latestTimestamp = entries[entries.length - 1]?.timestamp ?? \"No activity\";\n const supportingText =\n subtitle ?? description ?? `${formatEntryCount(entries.length)} buffered from runtime stream.`;\n const hasToolbar = Boolean(filters || (streaming && onPause));\n const rows: LogRow[] = entries.map((entry) => ({ ...entry }));\n const columns: DataColumn<LogRow>[] = [\n {\n key: \"timestamp\",\n header: \"Time\",\n width: \"7rem\",\n render: (row) => (\n <time className=\"eth-admin-runtime-log__timestamp\" dateTime={row.timestamp}>\n {row.timestamp}\n </time>\n )\n },\n {\n key: \"level\",\n header: \"Level\",\n width: \"7rem\",\n render: (row) => (\n <Badge severity={levelSeverity(row.level)}>{formatLevel(row.level)}</Badge>\n )\n },\n {\n key: \"source\",\n header: \"Source\",\n width: \"11rem\",\n render: (row) => (\n <span className=\"eth-admin-runtime-log__source\">{row.source ?? \"system\"}</span>\n )\n },\n {\n key: \"message\",\n header: \"Message\",\n render: (row) => (\n <span\n className={[\n \"eth-admin-runtime-log__message\",\n `eth-admin-runtime-log__message--${row.level ?? \"info\"}`\n ].join(\" \")}\n >\n {row.message}\n </span>\n )\n }\n ];\n\n return (\n <section\n role=\"region\"\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledBy ?? (ariaLabel ? undefined : headingId)}\n className={[\n \"eth-admin-runtime-log\",\n streaming ? \"eth-admin-runtime-log--streaming\" : \"eth-admin-runtime-log--paused\",\n className\n ]\n .filter(Boolean)\n .join(\" \")}\n data-eth-component=\"RuntimeLogViewer\"\n >\n <header className=\"eth-admin-runtime-log__header\">\n <div className=\"eth-admin-runtime-log__heading\">\n <h3 id={headingId}>{title}</h3>\n <p>{supportingText}</p>\n </div>\n <div className=\"eth-admin-runtime-log__status\" aria-live=\"polite\">\n <Badge severity={streaming ? \"success\" : \"neutral\"}>\n {streaming ? \"Streaming\" : \"Paused\"}\n </Badge>\n <span>{errorCount ? formatLevelCount(errorCount, \"error\") : \"No errors\"}</span>\n </div>\n </header>\n {hasToolbar ? (\n <div\n className=\"eth-admin-runtime-log__toolbar\"\n role=\"toolbar\"\n aria-label=\"Runtime log controls\"\n >\n {filters ? <div className=\"eth-admin-runtime-log__filters\">{filters}</div> : null}\n {streaming && onPause ? (\n <Button\n type=\"button\"\n intent=\"secondary\"\n density=\"compact\"\n icon={<Pause size={16} />}\n aria-label=\"Pause runtime stream\"\n onClick={onPause}\n >\n Pause stream\n </Button>\n ) : null}\n </div>\n ) : null}\n <dl className=\"eth-admin-runtime-log__summary\" aria-label=\"Runtime log summary\">\n <div>\n <dt>Entries</dt>\n <dd>{formatEntryCount(entries.length)}</dd>\n </div>\n <div>\n <dt>Warnings</dt>\n <dd>{formatLevelCount(warningCount, \"warning\")}</dd>\n </div>\n <div>\n <dt>Errors</dt>\n <dd>{formatLevelCount(errorCount, \"error\")}</dd>\n </div>\n <div>\n <dt>Latest</dt>\n <dd>{latestTimestamp}</dd>\n </div>\n </dl>\n <div className=\"eth-admin-runtime-log__table-shell\" aria-live={streaming ? \"polite\" : \"off\"}>\n <DataTable\n rows={rows}\n columns={columns}\n density={density}\n rowKey=\"id\"\n className=\"eth-admin-runtime-log__table\"\n emptyState={\n <div className=\"eth-admin-runtime-log__empty\" role=\"status\">\n <h4>No runtime logs</h4>\n <p>Events will appear here when the stream receives output.</p>\n </div>\n }\n />\n </div>\n </section>\n );\n}\n\nfunction countLevel(entries: LogEntry[], level: NonNullable<LogEntry[\"level\"]>) {\n return entries.filter((entry) => entry.level === level).length;\n}\n\nfunction formatEntryCount(count: number) {\n return `${count} ${count === 1 ? \"entry\" : \"entries\"}`;\n}\n\nfunction formatLevelCount(count: number, label: string) {\n return `${count} ${count === 1 ? label : `${label}s`}`;\n}\n\nfunction formatLevel(level: LogEntry[\"level\"]) {\n return (level ?? \"info\").toUpperCase();\n}\n\nfunction levelSeverity(level: LogEntry[\"level\"]): EthSeverity {\n if (level === \"error\") return \"danger\";\n if (level === \"warning\") return \"warning\";\n if (level === \"debug\") return \"neutral\";\n return \"info\";\n}\n","import * as React from \"react\";\nimport { Badge, Button, type EthSeverity, type SurfaceComponentProps } from \"@echothink-ui/core\";\nimport { DataTable, type DataColumn } from \"@echothink-ui/data\";\nimport type { AuditLogEntry } from \"./types\";\n\nexport interface AuditLogViewerProps extends Omit<SurfaceComponentProps, \"children\"> {\n entries: AuditLogEntry[];\n filters?: React.ReactNode;\n onExport?: (format: \"csv\" | \"json\" | \"xlsx\") => void;\n}\n\ntype AuditRow = Record<string, unknown> & AuditLogEntry;\ntype ExportFormat = \"csv\" | \"json\" | \"xlsx\";\n\nconst exportFormats: Array<{ format: ExportFormat; label: string }> = [\n { format: \"csv\", label: \"CSV\" },\n { format: \"json\", label: \"JSON\" },\n { format: \"xlsx\", label: \"XLSX\" }\n];\n\nexport function AuditLogViewer({\n entries,\n filters,\n onExport,\n className,\n \"aria-label\": ariaLabel,\n \"aria-labelledby\": ariaLabelledBy\n}: AuditLogViewerProps) {\n const headingId = React.useId();\n const rows: AuditRow[] = entries.map((entry) => ({ ...entry }));\n const columns: DataColumn<AuditRow>[] = [\n { key: \"timestamp\", header: \"Time\", width: \"7rem\" },\n {\n key: \"actor\",\n header: \"Actor\",\n width: \"9rem\",\n render: (row) => <span className=\"eth-admin-audit-log__actor\">{row.actor}</span>\n },\n { key: \"action\", header: \"Action\", width: \"12rem\" },\n { key: \"resource\", header: \"Resource\", width: \"12rem\" },\n {\n key: \"ip\",\n header: \"IP\",\n width: \"9rem\",\n render: (row) => <span className=\"eth-admin-audit-log__mono\">{row.ip ?? \"n/a\"}</span>\n },\n {\n key: \"outcome\",\n header: \"Outcome\",\n width: \"8rem\",\n render: (row) => <Badge severity={outcomeSeverity(row.outcome)}>{row.outcome}</Badge>\n }\n ];\n\n return (\n <section\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledBy ?? (ariaLabel ? undefined : headingId)}\n className={[\"eth-admin-audit-log\", className].filter(Boolean).join(\" \")}\n data-eth-component=\"AuditLogViewer\"\n >\n <header>\n <div className=\"eth-admin-audit-log__heading\">\n <h3 id={headingId}>Audit log</h3>\n <span>{formatEntryCount(entries.length)}</span>\n </div>\n <div className=\"eth-admin-audit-log__toolbar\">\n {filters ? <div className=\"eth-admin-audit-log__filters\">{filters}</div> : null}\n <div className=\"eth-admin-audit-log__exports\" aria-label=\"Export audit log\">\n {exportFormats.map(({ format, label }) => (\n <Button\n key={format}\n type=\"button\"\n intent=\"tertiary\"\n density=\"compact\"\n disabled={!onExport}\n onClick={() => onExport?.(format)}\n >\n {label}\n </Button>\n ))}\n </div>\n </div>\n </header>\n <DataTable rows={rows} columns={columns} density=\"compact\" rowKey=\"id\" />\n </section>\n );\n}\n\nfunction formatEntryCount(count: number) {\n return `${count} ${count === 1 ? \"event\" : \"events\"}`;\n}\n\nfunction outcomeSeverity(outcome: AuditLogEntry[\"outcome\"]): EthSeverity {\n return outcome === \"success\" ? \"success\" : outcome === \"failure\" ? \"danger\" : \"neutral\";\n}\n","import { useId } from \"react\";\nimport {\n Badge,\n Button,\n FormField,\n Surface,\n Tag,\n TextInput,\n Textarea,\n type SurfaceComponentProps\n} from \"@echothink-ui/core\";\nimport { RuleBuilder } from \"@echothink-ui/forms\";\nimport type { AdminPolicyConfig, JsonSchema } from \"./types\";\n\nexport interface PolicyConfigPanelProps\n extends Omit<SurfaceComponentProps, \"children\" | \"onChange\"> {\n policy: AdminPolicyConfig;\n schema: JsonSchema;\n onChange?: (policy: AdminPolicyConfig) => void;\n onSave?: (policy: AdminPolicyConfig) => void;\n}\n\nexport function PolicyConfigPanel({\n policy,\n schema,\n onChange,\n onSave,\n title,\n description,\n density = \"default\",\n className,\n ...props\n}: PolicyConfigPanelProps) {\n const generatedId = useId().replace(/[^a-zA-Z0-9_-]/g, \"\");\n const policyDomId = `eth-admin-policy-${String(policy.id ?? generatedId).replace(\n /[^a-zA-Z0-9_-]/g,\n \"-\"\n )}`;\n const update = (patch: Partial<AdminPolicyConfig>) => onChange?.({ ...policy, ...patch });\n const schemaFields = Object.keys(schema.properties ?? {});\n const variables = policy.variables?.length ? policy.variables : schemaFields;\n const rules = policy.rules ?? [];\n const visibleVariables = variables.slice(0, 5);\n const hiddenVariableCount = Math.max(0, variables.length - visibleVariables.length);\n\n return (\n <Surface\n {...props}\n title={title ?? \"Policy configuration\"}\n description={\n description ??\n schema.description ??\n \"Configure policy metadata and conditional rules for governed operations.\"\n }\n density={density}\n className={[\"eth-admin-policy-config\", className].filter(Boolean).join(\" \")}\n data-eth-component=\"PolicyConfigPanel\"\n >\n <div className=\"eth-admin-policy-config__layout\">\n <div className=\"eth-admin-policy-config__fields\">\n <FormField id={`${policyDomId}-name`} label=\"Policy name\" required>\n <TextInput\n id={`${policyDomId}-name`}\n density={density}\n value={policy.name ?? \"\"}\n onChange={(event) => update({ name: event.currentTarget.value })}\n />\n </FormField>\n <FormField id={`${policyDomId}-description`} label=\"Description\">\n <Textarea\n id={`${policyDomId}-description`}\n rows={4}\n value={policy.description ?? \"\"}\n onChange={(event) => update({ description: event.currentTarget.value })}\n />\n </FormField>\n </div>\n\n <aside className=\"eth-admin-policy-config__summary\" aria-label=\"Policy summary\">\n <div className=\"eth-admin-policy-config__summary-header\">\n <h3>Policy scope</h3>\n <Badge severity={rules.length ? \"success\" : \"warning\"}>\n {rules.length ? \"Configured\" : \"Needs rules\"}\n </Badge>\n </div>\n <dl className=\"eth-admin-policy-config__summary-grid\">\n <div>\n <dt>Rules</dt>\n <dd>{rules.length}</dd>\n </div>\n <div>\n <dt>Variables</dt>\n <dd>{variables.length}</dd>\n </div>\n <div>\n <dt>Schema fields</dt>\n <dd>{schemaFields.length}</dd>\n </div>\n </dl>\n <div className=\"eth-admin-policy-config__variables\">\n <span>Rule variables</span>\n {variables.length ? (\n <div className=\"eth-admin-policy-config__variable-list\">\n {visibleVariables.map((variable) => (\n <Tag key={variable}>{variable}</Tag>\n ))}\n {hiddenVariableCount ? (\n <Badge severity=\"neutral\">+{hiddenVariableCount} more</Badge>\n ) : null}\n </div>\n ) : (\n <p>No variables available.</p>\n )}\n </div>\n </aside>\n </div>\n\n <RuleBuilder\n className=\"eth-admin-policy-config__rules\"\n rules={rules}\n variables={variables}\n onChange={(nextRules) => update({ rules: nextRules })}\n />\n <div className=\"eth-admin-policy-config__actions\">\n <Button type=\"button\" disabled={!onSave} onClick={() => onSave?.(policy)}>\n Save policy\n </Button>\n </div>\n </Surface>\n );\n}\n","import type { CSSProperties } from \"react\";\nimport { Badge, Surface, type EthSeverity, type SurfaceComponentProps } from \"@echothink-ui/core\";\nimport type { BillingUsageMetric } from \"./types\";\n\nexport interface BillingUsagePanelProps extends Omit<SurfaceComponentProps, \"children\"> {\n metrics: BillingUsageMetric[];\n period: string;\n}\n\ntype UsageTone = \"normal\" | \"warning\" | \"danger\" | \"neutral\";\n\ninterface UsageState {\n label: string;\n severity: EthSeverity;\n tone: UsageTone;\n}\n\ntype UsageMeterStyle = CSSProperties & {\n \"--eth-admin-billing-usage-percent\": string;\n};\n\nexport function BillingUsagePanel({ metrics, period, title, className, ...props }: BillingUsagePanelProps) {\n const entries = metrics.map((metric) => {\n const percent = metric.limit > 0 ? (metric.current / metric.limit) * 100 : 0;\n const roundedPercent = Math.round(percent);\n const cappedPercent = Math.min(100, Math.max(0, percent));\n const state = usageState(percent, metric.limit);\n\n return {\n metric,\n percent,\n roundedPercent,\n cappedPercent,\n state,\n trendLabel: formatTrend(metric.trend),\n usageLabel:\n metric.limit > 0\n ? `${formatNumber(metric.current)} / ${formatNumber(metric.limit)} ${formatUnit(metric.unit, metric.limit)}`\n : `${formatNumber(metric.current)} ${formatUnit(metric.unit, metric.current)}`\n };\n });\n\n const highestUsage = entries.reduce<(typeof entries)[number] | undefined>((highest, entry) => {\n if (!highest || entry.percent > highest.percent) return entry;\n return highest;\n }, undefined);\n const overLimitCount = entries.filter((entry) => entry.percent >= 100).length;\n const watchedCount = entries.filter((entry) => entry.percent >= 80 && entry.percent < 100).length;\n const quotaStatus = getQuotaStatus(overLimitCount, watchedCount);\n\n return (\n <Surface\n {...props}\n title={title ?? \"Billing usage\"}\n subtitle={period}\n className={[\"eth-admin-billing-usage\", className].filter(Boolean).join(\" \")}\n data-eth-component=\"BillingUsagePanel\"\n >\n {entries.length ? (\n <>\n <dl className=\"eth-admin-billing-usage__summary\" aria-label=\"Billing usage summary\">\n <div>\n <dt>Tracked quotas</dt>\n <dd>{entries.length}</dd>\n </div>\n <div>\n <dt>Highest usage</dt>\n <dd>\n {highestUsage ? `${highestUsage.metric.label} ${highestUsage.roundedPercent}%` : \"n/a\"}\n </dd>\n </div>\n <div>\n <dt>Quota status</dt>\n <dd>\n <Badge severity={quotaStatus.severity}>{quotaStatus.label}</Badge>\n </dd>\n </div>\n </dl>\n\n <div className=\"eth-admin-billing-usage__metrics\">\n {entries.map(({ metric, roundedPercent, cappedPercent, state, trendLabel, usageLabel }) => (\n <section key={`${metric.label}-${metric.unit}`} className=\"eth-admin-billing-usage__metric\">\n <div className=\"eth-admin-billing-usage__metric-header\">\n <div>\n <h3>{metric.label}</h3>\n <p>{usageLabel}</p>\n </div>\n <Badge severity={state.severity}>{state.label}</Badge>\n </div>\n\n <div\n className=\"eth-admin-billing-usage__meter\"\n role=\"progressbar\"\n aria-label={`${metric.label} quota usage`}\n aria-valuemin={0}\n aria-valuemax={100}\n aria-valuenow={Math.round(cappedPercent)}\n aria-valuetext={\n metric.limit > 0 ? `${roundedPercent}% of quota used` : \"No quota limit configured\"\n }\n >\n <span\n className={`eth-admin-billing-usage__meter-fill eth-admin-billing-usage__meter-fill--${state.tone}`}\n style={\n {\n \"--eth-admin-billing-usage-percent\": `${cappedPercent}%`\n } as UsageMeterStyle\n }\n />\n </div>\n\n <dl className=\"eth-admin-billing-usage__metric-details\">\n <div>\n <dt>Utilization</dt>\n <dd>{metric.limit > 0 ? `${roundedPercent}%` : \"No limit\"}</dd>\n </div>\n <div>\n <dt>Limit</dt>\n <dd>\n {metric.limit > 0\n ? `${formatNumber(metric.limit)} ${formatUnit(metric.unit, metric.limit)}`\n : \"Unlimited\"}\n </dd>\n </div>\n {trendLabel ? (\n <div>\n <dt>Change</dt>\n <dd>{trendLabel}</dd>\n </div>\n ) : null}\n </dl>\n </section>\n ))}\n </div>\n </>\n ) : (\n <p className=\"eth-admin-billing-usage__empty\">No usage metrics are available for this period.</p>\n )}\n </Surface>\n );\n}\n\nfunction usageState(percent: number, limit: number): UsageState {\n if (limit <= 0) return { label: \"No limit\", severity: \"neutral\", tone: \"neutral\" };\n if (percent >= 100) return { label: \"Over limit\", severity: \"danger\", tone: \"danger\" };\n if (percent >= 80) return { label: \"Watch\", severity: \"warning\", tone: \"warning\" };\n return { label: \"Within limit\", severity: \"success\", tone: \"normal\" };\n}\n\nfunction getQuotaStatus(overLimitCount: number, watchedCount: number): Pick<UsageState, \"label\" | \"severity\"> {\n if (overLimitCount > 0) return { label: `${overLimitCount} over limit`, severity: \"danger\" };\n if (watchedCount > 0) return { label: `${watchedCount} nearing limit`, severity: \"warning\" };\n return { label: \"Within limits\", severity: \"success\" };\n}\n\nfunction formatNumber(value: number) {\n return new Intl.NumberFormat(\"en-US\", {\n maximumFractionDigits: value % 1 === 0 ? 0 : 2\n }).format(value);\n}\n\nfunction formatUnit(unit: string, value: number) {\n if (unit.toLowerCase() === \"user\") return value === 1 ? \"user\" : \"users\";\n return unit;\n}\n\nfunction formatTrend(trend?: number) {\n if (trend === undefined) return undefined;\n if (trend === 0) return \"Unchanged\";\n return `${trend > 0 ? \"+\" : \"\"}${trend}% vs previous period`;\n}\n","import { ConfigForm, type FormValues } from \"@echothink-ui/forms\";\nimport type { SurfaceComponentProps } from \"@echothink-ui/core\";\nimport type { TenantSettingsSection } from \"./types\";\n\nexport interface TenantSettingsPanelProps\n extends Omit<SurfaceComponentProps, \"children\" | \"onChange\" | \"onSubmit\"> {\n sections: TenantSettingsSection[];\n values: FormValues;\n onChange?: (values: FormValues) => void;\n onSubmit?: (values: FormValues) => void;\n submitLabel?: string;\n}\n\nexport function TenantSettingsPanel({\n sections,\n values,\n onChange,\n onSubmit,\n submitLabel = \"Save settings\",\n title,\n description,\n className,\n ...props\n}: TenantSettingsPanelProps) {\n const effectiveDescription =\n description === undefined\n ? \"Manage tenant identity, regional placement, and governance defaults.\"\n : description;\n\n return (\n <ConfigForm\n {...props}\n title={title ?? \"Tenant settings\"}\n description={effectiveDescription}\n className={[\"eth-admin-tenant-settings\", className].filter(Boolean).join(\" \")}\n sections={sections}\n values={values}\n onChange={onChange}\n onSubmit={onSubmit}\n submitLabel={submitLabel}\n data-eth-component=\"TenantSettingsPanel\"\n />\n );\n}\n","import * as React from \"react\";\nimport {\n ActionGroup,\n Badge,\n NumberInput,\n Toggle,\n type SurfaceComponentProps\n} from \"@echothink-ui/core\";\nimport { DataTable, type DataColumn } from \"@echothink-ui/data\";\nimport type { FeatureFlag } from \"./types\";\n\nexport interface FeatureFlagPanelProps extends Omit<\n SurfaceComponentProps,\n \"children\" | \"onToggle\"\n> {\n flags: FeatureFlag[];\n onToggle?: (id: string) => void;\n onUpdate?: (id: string, update: Partial<FeatureFlag>) => void;\n}\n\ntype FeatureFlagRow = Record<string, unknown> & FeatureFlag;\ntype RolloutMeterStyle = React.CSSProperties & {\n \"--eth-admin-feature-flag-rollout\": string;\n};\n\nexport function FeatureFlagPanel({\n flags,\n onToggle,\n onUpdate,\n className,\n title = \"Feature flags\",\n subtitle,\n description,\n actions,\n density = \"compact\",\n \"aria-label\": ariaLabel,\n \"aria-labelledby\": ariaLabelledBy,\n eyebrow: _eyebrow,\n status: _status,\n severity: _severity,\n loading: _loading,\n empty: _empty,\n error: _error,\n items: _items,\n metadata: _metadata,\n footer: _footer,\n ...sectionProps\n}: FeatureFlagPanelProps) {\n const headingId = React.useId();\n const enabledCount = flags.filter((flag) => flag.enabled).length;\n const disabledCount = flags.length - enabledCount;\n const rows: FeatureFlagRow[] = flags.map((flag) => ({ ...flag }));\n const columns: DataColumn<FeatureFlagRow>[] = [\n {\n key: \"name\",\n header: \"Flag\",\n width: \"34%\",\n render: (row) => <span className=\"eth-admin-feature-flag__name\">{row.name}</span>\n },\n {\n key: \"enabled\",\n header: \"Status\",\n width: \"13rem\",\n render: (row) => (\n <div className=\"eth-admin-feature-flag__status\">\n <Toggle\n label={`${row.name} is ${row.enabled ? \"enabled\" : \"disabled\"}`}\n hideLabel\n onLabel=\"\"\n offLabel=\"\"\n checked={row.enabled}\n readOnly={!onToggle}\n density={density}\n onChange={() => onToggle?.(row.id)}\n />\n <Badge severity={row.enabled ? \"success\" : \"neutral\"}>\n {row.enabled ? \"Enabled\" : \"Disabled\"}\n </Badge>\n </div>\n )\n },\n {\n key: \"rolloutPercent\",\n header: \"Rollout\",\n width: \"18rem\",\n render: (row) => (\n <div className=\"eth-admin-feature-flag__rollout\">\n <NumberInput\n aria-label={`${row.name} rollout percent`}\n className=\"eth-admin-feature-flag__rollout-input\"\n density={density}\n hideLabel\n min={0}\n max={100}\n step={1}\n readOnly={!onUpdate}\n value={normalizeRolloutPercent(row.rolloutPercent)}\n onChange={(event) =>\n onUpdate?.(row.id, {\n rolloutPercent: normalizeRolloutPercent(Number(event.currentTarget.value))\n })\n }\n />\n <span className=\"eth-admin-feature-flag__rollout-unit\" aria-hidden=\"true\">\n %\n </span>\n <span className=\"eth-admin-feature-flag__meter\" aria-hidden=\"true\">\n <span\n style={\n {\n \"--eth-admin-feature-flag-rollout\": `${normalizeRolloutPercent(row.rolloutPercent)}%`\n } as RolloutMeterStyle\n }\n />\n </span>\n </div>\n )\n },\n {\n key: \"environments\",\n header: \"Environments\",\n render: (row) =>\n row.environments?.length ? (\n <div className=\"eth-admin-feature-flag__environments\">\n {row.environments.map((environment) => (\n <Badge key={environment} severity=\"neutral\">\n {environment}\n </Badge>\n ))}\n </div>\n ) : (\n <Badge severity=\"neutral\">All environments</Badge>\n )\n }\n ];\n const supportingText = subtitle ?? description;\n\n return (\n <section\n {...sectionProps}\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledBy ?? (ariaLabel ? undefined : headingId)}\n className={[\"eth-admin-feature-flag\", className].filter(Boolean).join(\" \")}\n data-eth-component=\"FeatureFlagPanel\"\n >\n <header>\n <div className=\"eth-admin-feature-flag__heading\">\n <h3 id={headingId}>{title}</h3>\n {supportingText ? <p>{supportingText}</p> : null}\n </div>\n <div className=\"eth-admin-feature-flag__header-actions\">\n <div\n className=\"eth-admin-feature-flag__summary\"\n aria-label={`${flags.length} feature flags`}\n >\n <Badge severity=\"success\">{enabledCount} enabled</Badge>\n <Badge severity=\"neutral\">{disabledCount} disabled</Badge>\n </div>\n <ActionGroup actions={actions} />\n </div>\n </header>\n <DataTable\n rows={rows}\n columns={columns}\n density={density}\n rowKey=\"id\"\n className=\"eth-admin-feature-flag__table\"\n emptyState={<p className=\"eth-admin-feature-flag__empty\">No feature flags configured.</p>}\n />\n </section>\n );\n}\n\nfunction normalizeRolloutPercent(value: number | undefined) {\n const numericValue = value ?? 0;\n if (!Number.isFinite(numericValue)) return 0;\n return Math.min(100, Math.max(0, Math.round(numericValue)));\n}\n","import * as React from \"react\";\nimport {\n ActionGroup,\n Badge,\n NumberInput,\n type EthSeverity,\n type SurfaceComponentProps\n} from \"@echothink-ui/core\";\nimport { DataTable, type DataColumn } from \"@echothink-ui/data\";\nimport type { RateLimit } from \"./types\";\n\nexport interface RateLimitPanelProps extends Omit<SurfaceComponentProps, \"children\"> {\n limits: RateLimit[];\n onUpdate?: (id: string, update: Partial<RateLimit>) => void;\n}\n\ntype RateLimitTone = \"normal\" | \"warning\" | \"danger\" | \"neutral\";\n\ninterface RateLimitState {\n label: string;\n severity: EthSeverity;\n tone: RateLimitTone;\n}\n\ntype RateLimitMeterStyle = React.CSSProperties & {\n \"--eth-admin-rate-limit-usage\": string;\n};\n\ntype RateLimitRow = Record<string, unknown> &\n RateLimit & {\n cappedPercent: number;\n percent: number;\n percentLabel: string;\n state: RateLimitState;\n usageLabel: string;\n };\n\nexport function RateLimitPanel({\n limits,\n onUpdate,\n title = \"Rate limits\",\n subtitle,\n description,\n actions,\n density = \"compact\",\n className,\n \"aria-label\": ariaLabel,\n \"aria-labelledby\": ariaLabelledBy,\n eyebrow: _eyebrow,\n status: _status,\n severity: _severity,\n loading: _loading,\n empty: _empty,\n error: _error,\n items: _items,\n metadata: _metadata,\n footer: _footer,\n ...sectionProps\n}: RateLimitPanelProps) {\n const headingId = React.useId();\n const rows: RateLimitRow[] = limits.map((limit) => {\n const percent = limit.limit > 0 ? (limit.current / limit.limit) * 100 : 0;\n const cappedPercent = Math.min(100, Math.max(0, percent));\n\n return {\n ...limit,\n cappedPercent,\n percent,\n percentLabel: limit.limit > 0 ? formatPercent(percent) : \"No limit\",\n state: rateLimitState(percent, limit.limit),\n usageLabel:\n limit.limit > 0\n ? `${formatNumber(limit.current)} / ${formatNumber(limit.limit)}`\n : `${formatNumber(limit.current)} requests`\n };\n });\n const highestUsage = rows.reduce<RateLimitRow | undefined>((highest, row) => {\n if (row.limit <= 0) return highest;\n if (!highest || row.percent > highest.percent) return row;\n return highest;\n }, undefined);\n const exceededCount = rows.filter((row) => row.limit > 0 && row.percent >= 100).length;\n const nearLimitCount = rows.filter(\n (row) => row.limit > 0 && row.percent >= 80 && row.percent < 100\n ).length;\n const statusSummary = rateLimitStatusSummary(limits.length, exceededCount, nearLimitCount);\n const supportingText = subtitle ?? description;\n const columns: DataColumn<RateLimitRow>[] = [\n {\n key: \"name\",\n header: \"Limit\",\n width: \"28%\",\n render: (row) => (\n <div className=\"eth-admin-rate-limit__limit\">\n <strong>{row.name}</strong>\n <span>{row.state.label}</span>\n </div>\n )\n },\n {\n key: \"current\",\n header: \"Usage\",\n width: \"34%\",\n render: (row) => (\n <div className=\"eth-admin-rate-limit__usage\">\n <div className=\"eth-admin-rate-limit__usage-copy\">\n <span>{row.usageLabel}</span>\n <strong>{row.percentLabel}</strong>\n </div>\n <span\n className=\"eth-admin-rate-limit__meter\"\n role=\"progressbar\"\n aria-label={`${row.name} usage`}\n aria-valuemin={0}\n aria-valuemax={100}\n aria-valuenow={Math.round(row.cappedPercent)}\n aria-valuetext={\n row.limit > 0\n ? `${formatPercent(row.percent)} used, ${formatNumber(row.current)} of ${formatNumber(\n row.limit\n )} requests`\n : \"No configured limit\"\n }\n style={\n {\n \"--eth-admin-rate-limit-usage\": `${row.cappedPercent}%`\n } as RateLimitMeterStyle\n }\n >\n <span\n className={[\n \"eth-admin-rate-limit__meter-fill\",\n `eth-admin-rate-limit__meter-fill--${row.state.tone}`\n ].join(\" \")}\n />\n </span>\n </div>\n )\n },\n {\n key: \"windowSeconds\",\n header: \"Window\",\n width: \"8rem\",\n render: (row) => (\n <span className=\"eth-admin-rate-limit__number\">{formatWindow(row.windowSeconds)}</span>\n )\n },\n {\n key: \"limit\",\n header: \"Configured limit\",\n width: \"13rem\",\n render: (row) => (\n <NumberInput\n aria-label={`${row.name} configured limit`}\n className=\"eth-admin-rate-limit__limit-input\"\n density={density}\n hideLabel\n min={0}\n step={1}\n readOnly={!onUpdate}\n value={row.limit}\n onChange={(event) => {\n const nextLimit = Number(event.currentTarget.value);\n if (Number.isFinite(nextLimit)) onUpdate?.(row.id, { limit: nextLimit });\n }}\n />\n )\n }\n ];\n\n return (\n <section\n {...sectionProps}\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledBy ?? (ariaLabel ? undefined : headingId)}\n className={[\"eth-admin-rate-limit\", className].filter(Boolean).join(\" \")}\n data-eth-component=\"RateLimitPanel\"\n >\n <header>\n <div className=\"eth-admin-rate-limit__heading\">\n <h3 id={headingId}>{title}</h3>\n {supportingText ? <p>{supportingText}</p> : null}\n </div>\n <div className=\"eth-admin-rate-limit__header-actions\">\n <Badge severity={statusSummary.severity}>{statusSummary.label}</Badge>\n <ActionGroup actions={actions} />\n </div>\n </header>\n <dl className=\"eth-admin-rate-limit__summary\" aria-label=\"Rate limit totals\">\n <div>\n <dt>Tracked limits</dt>\n <dd>{formatNumber(limits.length)}</dd>\n </div>\n <div>\n <dt>Highest usage</dt>\n <dd>\n {highestUsage ? `${highestUsage.name} ${formatPercent(highestUsage.percent)}` : \"n/a\"}\n </dd>\n </div>\n <div>\n <dt>Needs review</dt>\n <dd>{formatNumber(exceededCount + nearLimitCount)}</dd>\n </div>\n </dl>\n <DataTable\n rows={rows}\n columns={columns}\n rowKey=\"id\"\n density={density}\n className=\"eth-admin-rate-limit__table\"\n emptyState={<p className=\"eth-admin-rate-limit__empty\">No rate limits configured.</p>}\n />\n </section>\n );\n}\n\nfunction rateLimitState(percent: number, limit: number): RateLimitState {\n if (limit <= 0) return { label: \"No limit\", severity: \"neutral\", tone: \"neutral\" };\n if (percent >= 100) return { label: \"Exceeded\", severity: \"danger\", tone: \"danger\" };\n if (percent >= 80) return { label: \"Near limit\", severity: \"warning\", tone: \"warning\" };\n return { label: \"Within limit\", severity: \"success\", tone: \"normal\" };\n}\n\nfunction rateLimitStatusSummary(\n totalCount: number,\n exceededCount: number,\n nearLimitCount: number\n): Pick<RateLimitState, \"label\" | \"severity\"> {\n if (totalCount === 0) return { label: \"No limits\", severity: \"neutral\" };\n if (exceededCount > 0) {\n return { label: `${formatNumber(exceededCount)} exceeded`, severity: \"danger\" };\n }\n if (nearLimitCount > 0) {\n return { label: `${formatNumber(nearLimitCount)} near limit`, severity: \"warning\" };\n }\n return { label: \"Within limits\", severity: \"success\" };\n}\n\nfunction formatWindow(seconds: number) {\n return `${formatNumber(seconds)}s`;\n}\n\nfunction formatPercent(value: number) {\n return `${Math.round(value).toLocaleString(\"en-US\")}%`;\n}\n\nfunction formatNumber(value: number) {\n return new Intl.NumberFormat(\"en-US\").format(value);\n}\n","import * as React from \"react\";\nimport {\n ActionGroup,\n Badge,\n type EthSeverity,\n type SurfaceComponentProps\n} from \"@echothink-ui/core\";\nimport { DataTable, type DataColumn } from \"@echothink-ui/data\";\nimport type { IntegrationHealth } from \"./types\";\n\nexport interface IntegrationHealthTableProps extends Omit<SurfaceComponentProps, \"children\"> {\n integrations: IntegrationHealth[];\n}\n\ntype IntegrationHealthRow = Record<string, unknown> & IntegrationHealth;\n\nexport function IntegrationHealthTable({\n integrations,\n className,\n title = \"Integration health\",\n subtitle,\n description,\n actions,\n density = \"compact\",\n \"aria-label\": ariaLabel,\n \"aria-labelledby\": ariaLabelledBy,\n eyebrow: _eyebrow,\n status: _status,\n severity: _severity,\n loading: _loading,\n empty: _empty,\n error: _error,\n items: _items,\n metadata: _metadata,\n footer: _footer,\n ...sectionProps\n}: IntegrationHealthTableProps) {\n const headingId = React.useId();\n const incidentCount = integrations.reduce(\n (sum, integration) => sum + (integration.incidentsCount ?? 0),\n 0\n );\n const impairedCount = integrations.filter(\n (integration) => integration.status !== \"healthy\"\n ).length;\n const healthyCount = integrations.length - impairedCount;\n const rows: IntegrationHealthRow[] = integrations.map((integration) => ({ ...integration }));\n const columns: DataColumn<IntegrationHealthRow>[] = [\n {\n key: \"name\",\n header: \"Integration\",\n width: \"32%\",\n render: (row) => (\n <span className=\"eth-admin-integration-health__name\">\n <strong>{row.name}</strong>\n <span>{row.id}</span>\n </span>\n )\n },\n {\n key: \"status\",\n header: \"Status\",\n width: \"9rem\",\n render: (row) => (\n <Badge severity={statusSeverity(row.status)}>{statusLabel(row.status)}</Badge>\n )\n },\n {\n key: \"latencyMs\",\n header: \"Latency\",\n width: \"8rem\",\n align: \"end\",\n render: (row) => (\n <span className={latencyMetricClassName(row.latencyMs)}>\n {formatLatency(row.latencyMs)}\n </span>\n )\n },\n {\n key: \"incidentsCount\",\n header: \"Incidents\",\n width: \"8rem\",\n align: \"end\",\n render: (row) => (\n <Badge severity={incidentSeverity(row.incidentsCount)}>\n {formatIncidentCount(row.incidentsCount)}\n </Badge>\n )\n },\n {\n key: \"lastCheckedAt\",\n header: \"Last checked\",\n width: \"10rem\",\n render: (row) => (\n <span className=\"eth-admin-integration-health__checked\">\n {row.lastCheckedAt ?? \"Not checked\"}\n </span>\n )\n }\n ];\n const supportingText = subtitle ?? description;\n\n return (\n <section\n {...sectionProps}\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledBy ?? (ariaLabel ? undefined : headingId)}\n className={[\"eth-admin-integration-health\", className].filter(Boolean).join(\" \")}\n data-eth-component=\"IntegrationHealthTable\"\n >\n <header>\n <div className=\"eth-admin-integration-health__heading\">\n <h3 id={headingId}>{title}</h3>\n {supportingText ? <p>{supportingText}</p> : null}\n </div>\n <div className=\"eth-admin-integration-health__header-actions\">\n <div\n className=\"eth-admin-integration-health__summary\"\n aria-label={summaryLabel(rows.length, incidentCount, healthyCount)}\n >\n <Badge severity={!rows.length ? \"neutral\" : impairedCount ? \"warning\" : \"success\"}>\n {formatHealthySummary(rows.length, healthyCount)}\n </Badge>\n <Badge severity={incidentCount ? \"danger\" : \"neutral\"}>\n {incidentCount} {incidentCount === 1 ? \"incident\" : \"incidents\"}\n </Badge>\n </div>\n <ActionGroup actions={actions} />\n </div>\n </header>\n <DataTable\n rows={rows}\n columns={columns}\n density={density}\n rowKey=\"id\"\n className=\"eth-admin-integration-health__table\"\n emptyState={\n <p className=\"eth-admin-integration-health__empty\">No integrations are reporting.</p>\n }\n />\n </section>\n );\n}\n\nfunction statusSeverity(status: IntegrationHealth[\"status\"]): EthSeverity {\n if (status === \"healthy\") return \"success\";\n if (status === \"degraded\") return \"warning\";\n return \"danger\";\n}\n\nfunction statusLabel(status: IntegrationHealth[\"status\"]) {\n if (status === \"down\") return \"Down\";\n if (status === \"degraded\") return \"Degraded\";\n return \"Healthy\";\n}\n\nfunction latencySeverity(latencyMs: IntegrationHealth[\"latencyMs\"]): EthSeverity | null {\n if (latencyMs === undefined) return null;\n if (latencyMs >= 1000) return \"danger\";\n if (latencyMs >= 500) return \"warning\";\n return null;\n}\n\nfunction latencyMetricClassName(latencyMs: IntegrationHealth[\"latencyMs\"]) {\n const severity = latencySeverity(latencyMs);\n return [\n \"eth-admin-integration-health__metric\",\n severity ? `eth-admin-integration-health__metric--${severity}` : undefined\n ]\n .filter(Boolean)\n .join(\" \");\n}\n\nfunction incidentSeverity(count: IntegrationHealth[\"incidentsCount\"]): EthSeverity {\n if (!count) return \"success\";\n return count > 1 ? \"danger\" : \"warning\";\n}\n\nfunction formatLatency(latencyMs: IntegrationHealth[\"latencyMs\"]) {\n return latencyMs === undefined ? \"n/a\" : `${latencyMs} ms`;\n}\n\nfunction formatIncidentCount(count: IntegrationHealth[\"incidentsCount\"]) {\n return String(count ?? 0);\n}\n\nfunction formatHealthySummary(total: number, healthyCount: number) {\n return total ? `${healthyCount}/${total} healthy` : \"0 integrations\";\n}\n\nfunction summaryLabel(total: number, incidentCount: number, healthyCount: number) {\n if (!total) return `No integrations reporting, ${incidentCount} open incidents`;\n return `${healthyCount} of ${total} integrations healthy, ${incidentCount} open ${\n incidentCount === 1 ? \"incident\" : \"incidents\"\n }`;\n}\n","import type { SurfaceComponentProps } from \"@echothink-ui/core\";\nimport { SystemHealthDashboard, type SystemHealthDashboardProps } from \"./SystemHealthDashboard\";\n\nexport interface AdminHealthTemplateProps\n extends Omit<SystemHealthDashboardProps, \"services\" | \"incidents\" | \"metrics\">,\n Pick<Partial<SystemHealthDashboardProps>, \"services\" | \"incidents\" | \"metrics\">,\n Omit<SurfaceComponentProps, \"children\"> {}\n\nexport function AdminHealthTemplate({ services, incidents, metrics, ...props }: AdminHealthTemplateProps) {\n return (\n <SystemHealthDashboard\n {...props}\n services={\n services ?? [\n { id: \"api\", name: \"API Gateway\", status: \"healthy\", latencyMs: 42 },\n { id: \"workers\", name: \"Worker fleet\", status: \"degraded\", latencyMs: 110, incidentsCount: 1 },\n { id: \"storage\", name: \"Storage\", status: \"healthy\", latencyMs: 24 }\n ]\n }\n incidents={incidents}\n metrics={metrics}\n data-eth-component=\"AdminHealthTemplate\"\n />\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACCA,qBAA8B;AAqCpB;AA5BH,SAAS,WAAW;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP,UAAU;AAAA,EACV,aAAa;AAAA,EACb,SAAS;AAAA,EACT,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,SAAS;AAAA,EACT,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,SAAS;AAAA,EACT,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,GAAG;AACL,GAAoB;AAClB,SACE;AAAA,IAAC;AAAA;AAAA,MACE,GAAG;AAAA,MACJ,WAAW,CAAC,mBAAmB,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,MAClE,sBAAmB;AAAA,MACnB,QACE,6CAAC,SAAI,WAAU,2BACb;AAAA,oDAAC,WAAM,WAAU,6BAA6B,mBAAQ;AAAA,QACtD,6CAAC,SAAI,WAAU,8BACZ;AAAA,mBAAS,4CAAC,YAAO,WAAU,2BAA2B,kBAAO,IAAY;AAAA,UAC1E,4CAAC,UAAK,WAAU,yBAAyB,UAAS;AAAA,WACpD;AAAA,SACF;AAAA;AAAA,EAEJ;AAEJ;;;AC/CA,IAAAA,eAMO;AACP,oBAAyB;;;ACPzB,kBAA6E;AAsCrE,IAAAC,sBAAA;AAnCR,IAAM,mBAAmB,IAAI,KAAK,aAAa,MAAM,EAAE,uBAAuB,EAAE,CAAC;AAM1E,SAAS,kBAAkB,EAAE,SAAS,WAAW,GAAG,MAAM,GAA2B;AAC1F,QAAMC,kBAAiB,kBAAkB,QAAQ,MAAM;AACvD,QAAM,aAAa,YAAY,QAAQ,MAAM;AAC7C,QAAM,UAAU;AAAA,IACd;AAAA,MACE,OAAO;AAAA,MACP,OAAO,QAAQ,cAAc,SAAY,GAAG,QAAQ,SAAS,QAAQ;AAAA,MACrE,OAAO,QAAQ,cAAc;AAAA,IAC/B;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,OAAO,QAAQ,kBAAkB,SAAY,cAAc,QAAQ,aAAa,IAAI;AAAA,MACpF,OAAO,QAAQ,kBAAkB;AAAA,IACnC;AAAA,IACA;AAAA,MACE,OAAO,QAAQ,mBAAmB,SAAY,mBAAmB;AAAA,MACjE,OACE,QAAQ,mBAAmB,SACvB,QAAQ,iBACR,QAAQ,kBAAkB;AAAA,MAChC,OACE,QAAQ,mBAAmB,SAAY,QAAQ,mBAAmB,IAAI,CAAC,QAAQ;AAAA,IACnF;AAAA,EACF;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACE,GAAG;AAAA,MACJ,OACE,8CAAC,UAAK,WAAU,wCACd;AAAA,qDAAC,UAAM,kBAAQ,MAAK;AAAA,QACpB,6CAAC,qBAAM,cAAY,mBAAmB,UAAU,IAAI,UAAUA,iBAC3D,sBACH;AAAA,SACF;AAAA,MAEF,aAAa,kBAAkB,QAAQ,MAAM;AAAA,MAC7C,WAAW;AAAA,QACT;AAAA,QACA,kCAAkC,QAAQ,MAAM;AAAA,QAChD;AAAA,MACF,EACG,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,MACX,sBAAmB;AAAA,MAEnB,uDAAC,QAAG,WAAU,0CACX,kBAAQ,IAAI,CAAC,WACZ;AAAA,QAAC;AAAA;AAAA,UAEC,WAAW,OAAO,QAAQ,iDAAiD;AAAA,UAE3E;AAAA,yDAAC,QAAI,iBAAO,OAAM;AAAA,YAClB,6CAAC,QAAI,iBAAO,OAAM;AAAA;AAAA;AAAA,QAJb,OAAO;AAAA,MAKd,CACD,GACH;AAAA;AAAA,EACF;AAEJ;AAEO,SAAS,kBAAkB,QAA0C;AAC1E,MAAI,WAAW,UAAW,QAAO;AACjC,MAAI,WAAW,WAAY,QAAO;AAClC,SAAO;AACT;AAEA,SAAS,YAAY,QAA6B;AAChD,MAAI,WAAW,UAAW,QAAO;AACjC,MAAI,WAAW,WAAY,QAAO;AAClC,SAAO;AACT;AAEA,SAAS,kBAAkB,QAA6B;AACtD,MAAI,WAAW,UAAW,QAAO;AACjC,MAAI,WAAW,WAAY,QAAO;AAClC,SAAO;AACT;AAEA,SAAS,cAAc,OAAe;AACpC,SAAO,GAAG,iBAAiB,OAAO,KAAK,CAAC;AAC1C;;;ADRU,IAAAC,sBAAA;AAjEH,SAAS,sBAAsB;AAAA,EACpC;AAAA,EACA,YAAY,CAAC;AAAA,EACb,UAAU,CAAC;AAAA,EACX;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAA+B;AAC7B,QAAM,eAAe,SAAS;AAC9B,QAAM,eAAe,SAAS,OAAO,CAAC,YAAY,QAAQ,WAAW,SAAS,EAAE;AAChF,QAAM,gBAAgB,SAAS,OAAO,CAAC,YAAY,QAAQ,WAAW,UAAU,EAAE;AAClF,QAAM,YAAY,SAAS,OAAO,CAAC,YAAY,QAAQ,WAAW,MAAM,EAAE;AAC1E,QAAM,wBAAwB,UAAU;AAAA,IACtC,CAAC,aAAa,SAAS,aAAa,cAAc,SAAS,aAAa;AAAA,EAC1E,EAAE;AACF,QAAM,oBAAoB,UAAU;AACpC,QAAM,kBAAkB;AAAA,IACtB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,QAAM,gBAAgB,gBAAgB,cAAc,WAAW,aAAa;AAC5E,QAAM,kBAAkB,QAAQ,SAC5B,UACA;AAAA,IACE;AAAA,MACE,OAAO;AAAA,MACP,OAAO,eAAe,GAAG,YAAY,MAAM,YAAY,KAAK;AAAA,MAC5D,OAAO,mBAAmB,cAAc,eAAe,SAAS;AAAA,IAClE;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,OAAO;AAAA,MACP,OAAO,cAAc,uBAAuB,iBAAiB;AAAA,IAC/D;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,OAAO;AAAA,QACL,SACG,IAAI,CAAC,YAAY,QAAQ,SAAS,EAClC,OAAO,CAAC,UAA2B,UAAU,MAAS;AAAA,MAC3D;AAAA,MACA,OAAO,eAAe,GAAG,YAAY,eAAe;AAAA,IACtD;AAAA,EACF;AAEJ,SACE;AAAA,IAAC;AAAA;AAAA,MACE,GAAG;AAAA,MACJ,OAAO,SAAS;AAAA,MAChB,aACE,eACA,cAAc,cAAc,cAAc,eAAe,WAAW,iBAAiB;AAAA,MAEvF,UAAU,YAAY;AAAA,MACtB,QAAQ,UAAU;AAAA,MAClB,WAAW,CAAC,2BAA2B,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,MAC1E,sBAAmB;AAAA,MAEnB;AAAA,qDAAC,SAAI,WAAU,oCACZ,0BAAgB,IAAI,CAAC,WACpB;AAAA,UAAC;AAAA;AAAA,YAEC,OAAO,OAAO;AAAA,YACd,OAAO,OAAO;AAAA,YACd,QAAQ,OAAO;AAAA;AAAA,UAHV,OAAO,OAAO,KAAK;AAAA,QAI1B,CACD,GACH;AAAA,QACA,6CAAC,SAAI,WAAU,qCACZ,mBAAS,SACR,SAAS,IAAI,CAAC,YAAY;AACxB,gBAAM,mBAAmB,UAAU;AAAA,YAAO,CAAC,aACzC,SAAS,MAAM,YAAY,EAAE,SAAS,QAAQ,KAAK,YAAY,CAAC;AAAA,UAClE;AAEA,iBACE;AAAA,YAAC;AAAA;AAAA,cAEC,SAAS;AAAA,gBACP,MAAM,QAAQ;AAAA,gBACd,QAAQ,QAAQ;AAAA,gBAChB,WAAW,QAAQ;AAAA,gBACnB,eAAe,QAAQ,WAAW,YAAY,OAAO;AAAA,gBACrD,gBAAgB,QAAQ,kBAAkB,iBAAiB;AAAA,gBAC3D,gBAAgB,iBAAiB,CAAC,GAAG;AAAA,cACvC;AAAA;AAAA,YARK,QAAQ;AAAA,UASf;AAAA,QAEJ,CAAC,IAED,6CAAC,OAAE,WAAU,kCAAiC,mDAAqC,GAEvF;AAAA,QACC,UAAU,SACT,8CAAC,aAAQ,WAAU,sCACjB;AAAA,uDAAC,QAAG,uBAAS;AAAA,UACb,6CAAC,QACE,oBAAU,IAAI,CAAC,aACd,8CAAC,QACC;AAAA,yDAAC,sBAAM,UAAU,oBAAoB,SAAS,QAAQ,GAAI,mBAAS,UAAS;AAAA,YAC5E,6CAAC,UAAM,mBAAS,OAAM;AAAA,YACtB,6CAAC,UAAM,mBAAS,WAAU;AAAA,eAHnB,SAAS,EAIlB,CACD,GACH;AAAA,WACF,IACE;AAAA;AAAA;AAAA,EACN;AAEJ;AAEA,SAAS,QAAQ,QAAkB;AACjC,MAAI,CAAC,OAAO,OAAQ,QAAO;AAC3B,SAAO,GAAG,KAAK,MAAM,OAAO,OAAO,CAAC,KAAK,UAAU,MAAM,OAAO,CAAC,IAAI,OAAO,MAAM,CAAC;AACrF;AAEA,SAAS,cACP,cACA,cACA,eACA,WACA,mBACA;AACA,MAAI,CAAC,aAAc,QAAO;AAE1B,QAAM,aAAuB,CAAC;AAC9B,MAAI,cAAe,YAAW,KAAK,GAAG,aAAa,WAAW;AAC9D,MAAI,UAAW,YAAW,KAAK,GAAG,SAAS,OAAO;AAClD,MAAI,mBAAmB;AACrB,eAAW,KAAK,GAAG,iBAAiB,SAAS,UAAU,mBAAmB,UAAU,CAAC,EAAE;AAAA,EACzF;AAEA,QAAM,iBAAiB,GAAG,YAAY,OAAO,YAAY,IAAI,UAAU,cAAc,SAAS,CAAC;AAC/F,SAAO,WAAW,SACd,GAAG,cAAc,KAAK,WAAW,KAAK,IAAI,CAAC,MAC3C,GAAG,cAAc;AACvB;AAEA,SAAS,mBAAmB,cAAsB,eAAuB,WAAmB;AAC1F,MAAI,WAAW;AACb,WAAO,6CAAC,sBAAM,UAAS,UAAU,aAAG,SAAS,SAAQ;AAAA,EACvD;AACA,MAAI,eAAe;AACjB,WAAO,6CAAC,sBAAM,UAAS,WAAW,aAAG,aAAa,aAAY;AAAA,EAChE;AACA,MAAI,cAAc;AAChB,WAAO,6CAAC,sBAAM,UAAS,WAAU,qBAAO;AAAA,EAC1C;AACA,SAAO;AACT;AAEA,SAAS,cAAc,uBAA+B,mBAA2B;AAC/E,MAAI,uBAAuB;AACzB,WAAO,6CAAC,sBAAM,UAAS,UAAU,aAAG,qBAAqB,aAAY;AAAA,EACvE;AACA,MAAI,mBAAmB;AACrB,WAAO,6CAAC,sBAAM,UAAS,WAAU,2BAAa;AAAA,EAChD;AACA,SAAO,6CAAC,sBAAM,UAAS,WAAU,mBAAK;AACxC;AAEA,SAAS,kBACP,WACA,eACA,uBACA,mBACyB;AACzB,MAAI,aAAa,sBAAuB,QAAO;AAC/C,MAAI,iBAAiB,kBAAmB,QAAO;AAC/C,SAAO;AACT;AAEA,SAAS,gBACP,cACA,WACA,eACsB;AACtB,MAAI,CAAC,aAAc,QAAO;AAC1B,MAAI,UAAW,QAAO;AACtB,MAAI,cAAe,QAAO;AAC1B,SAAO;AACT;AAEA,SAAS,UAAU,OAAe,UAAkB;AAClD,SAAO,UAAU,IAAI,WAAW,GAAG,QAAQ;AAC7C;AAEA,SAAS,oBAAoB,UAAkD;AAC7E,MAAI,aAAa,cAAc,aAAa,QAAS,QAAO;AAC5D,MAAI,aAAa,UAAW,QAAO;AACnC,SAAO;AACT;;;AErNA,YAAuB;AACvB,IAAAC,eAMO;AACP,kBAA2C;AA0FnC,IAAAC,sBAAA;AAzDD,SAAS,gBAAgB;AAAA,EAC9B;AAAA,EACA;AAAA,EACA,QAAQ;AAAA,EACR;AAAA,EACA;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV;AAAA,EACA,cAAc;AAAA,EACd,mBAAmB;AAAA,EACnB,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,SAAS;AAAA,EACT,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,GAAG;AACL,GAAyB;AACvB,QAAM,YAAkB,YAAM;AAC9B,QAAM,OAAwB,MAAM,IAAI,CAAC,SAAS;AAChD,UAAM,UAAU,KAAK,QAAQ,IAAK,KAAK,SAAS,KAAK,QAAS,MAAM;AACpE,UAAM,gBAAgB,KAAK,IAAI,KAAK,KAAK,IAAI,GAAG,OAAO,CAAC;AAExD,WAAO;AAAA,MACL,GAAG;AAAA,MACH;AAAA,MACA,eACE,KAAK,QAAQ,IACT,GAAG,aAAa,KAAK,MAAM,CAAC,MAAM,aAAa,KAAK,KAAK,CAAC,YAC1D,GAAG,aAAa,KAAK,MAAM,CAAC;AAAA,MAClC;AAAA,MACA,cAAc,KAAK,QAAQ,IAAIC,eAAc,OAAO,IAAI;AAAA,MACxD,OAAO,gBAAgB,MAAM,OAAO;AAAA,IACtC;AAAA,EACF,CAAC;AACD,QAAM,SAAS,MAAM;AAAA,IACnB,CAAC,SAAS,UAAU;AAAA,MAClB,QAAQ,QAAQ,SAAS,KAAK;AAAA,MAC9B,QAAQ,QAAQ,SAAS,KAAK;AAAA,MAC9B,MAAM,QAAQ,OAAO,KAAK;AAAA,MAC1B,OAAO,QAAQ,QAAQ,KAAK;AAAA,IAC9B;AAAA,IACA,EAAE,QAAQ,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,EAAE;AAAA,EAC5C;AACA,QAAM,cAAc,OAAO,QAAQ,IAAK,OAAO,SAAS,OAAO,QAAS,MAAM;AAC9E,QAAM,gBAAgB,wBAAwB,MAAM,QAAQ,OAAO,QAAQ,WAAW;AACtF,QAAM,iBAAiB,YAAY;AACnC,QAAM,UAAuC;AAAA,IAC3C;AAAA,MACE,KAAK;AAAA,MACL,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,QAAQ,CAAC,QACP,8CAAC,SAAI,WAAU,+BACb;AAAA,qDAAC,YAAQ,cAAI,MAAK;AAAA,QAClB,6CAAC,UAAM,cAAI,MAAM,OAAM;AAAA,SACzB;AAAA,IAEJ;AAAA,IACA;AAAA,MACE,KAAK;AAAA,MACL,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,QAAQ,CAAC,QACP,8CAAC,SAAI,WAAU,mCACb;AAAA,sDAAC,SAAI,WAAU,wCACb;AAAA,uDAAC,UAAM,cAAI,eAAc;AAAA,UACzB,6CAAC,YAAQ,cAAI,cAAa;AAAA,WAC5B;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACV,MAAK;AAAA,YACL,cAAY,GAAG,IAAI,IAAI;AAAA,YACvB,iBAAe;AAAA,YACf,iBAAe;AAAA,YACf,iBAAe,KAAK,MAAM,IAAI,aAAa;AAAA,YAC3C,kBAAgB,GAAG,aAAa,IAAI,MAAM,CAAC,OAAO;AAAA,cAChD,IAAI;AAAA,YACN,CAAC;AAAA,YACD,OACE;AAAA,cACE,oCAAoC,GAAG,IAAI,aAAa;AAAA,YAC1D;AAAA,YAGF;AAAA,cAAC;AAAA;AAAA,gBACC,WAAW;AAAA,kBACT;AAAA,kBACA,sCAAsC,IAAI,MAAM,IAAI;AAAA,gBACtD,EAAE,KAAK,GAAG;AAAA;AAAA,YACZ;AAAA;AAAA,QACF;AAAA,SACF;AAAA,IAEJ;AAAA,IACA;AAAA,MACE,KAAK;AAAA,MACL,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,OAAO;AAAA,MACP,QAAQ,CAAC,QACP,6CAAC,UAAK,WAAU,iCAAiC,uBAAa,IAAI,IAAI,GAAE;AAAA,IAE5E;AAAA,IACA;AAAA,MACE,KAAK;AAAA,MACL,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,OAAO;AAAA,MACP,QAAQ,CAAC,QACP,6CAAC,sBAAM,UAAU,IAAI,SAAS,IAAI,WAAW,WAAY,uBAAa,IAAI,MAAM,GAAE;AAAA,IAEtF;AAAA,IACA;AAAA,MACE,KAAK;AAAA,MACL,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,OAAO;AAAA,MACP,QAAQ,CAAC,QACP;AAAA,QAAC;AAAA;AAAA,UACC,WAAU;AAAA,UACV,MAAK;AAAA,UACL,cAAY,GAAG,IAAI,IAAI;AAAA,UAEvB;AAAA;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,QAAO;AAAA,gBACP,SAAQ;AAAA,gBACR,WAAU;AAAA,gBACV,UAAU,CAAC;AAAA,gBACX,cAAY,SAAS,IAAI,IAAI;AAAA,gBAC7B,SAAS,MAAM,UAAU,IAAI,IAAI,EAAE;AAAA,gBACpC;AAAA;AAAA,YAED;AAAA,YACA;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,QAAO;AAAA,gBACP,SAAQ;AAAA,gBACR,WAAU;AAAA,gBACV,UAAU,CAAC;AAAA,gBACX,cAAY,SAAS,IAAI,IAAI;AAAA,gBAC7B,SAAS,MAAM,UAAU,IAAI,IAAI,CAAC;AAAA,gBACnC;AAAA;AAAA,YAED;AAAA;AAAA;AAAA,MACF;AAAA,IAEJ;AAAA,EACF;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACE,GAAG;AAAA,MACJ,cAAY;AAAA,MACZ,mBAAiB,mBAAmB,YAAY,SAAY;AAAA,MAC5D,WAAW,CAAC,yBAAyB,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,MACxE,sBAAmB;AAAA,MAEnB;AAAA,sDAAC,YACC;AAAA,wDAAC,SAAI,WAAU,kCACb;AAAA,yDAAC,QAAG,IAAI,WAAY,iBAAM;AAAA,YACzB,iBAAiB,6CAAC,OAAG,0BAAe,IAAO;AAAA,aAC9C;AAAA,UACA,8CAAC,SAAI,WAAU,yCACb;AAAA,yDAAC,sBAAM,UAAU,cAAc,UAAW,wBAAc,OAAM;AAAA,YAC9D,6CAAC,4BAAY,SAAkB;AAAA,aACjC;AAAA,WACF;AAAA,QACA,8CAAC,QAAG,WAAU,kCAAiC,cAAW,sBACxD;AAAA,wDAAC,SACC;AAAA,yDAAC,QAAG,2BAAa;AAAA,YACjB,6CAAC,QAAI,0BAAgB,MAAM,MAAM,GAAE;AAAA,aACrC;AAAA,UACA,8CAAC,SACC;AAAA,yDAAC,QAAG,6BAAe;AAAA,YACnB,8CAAC,QACE;AAAA,2BAAa,OAAO,MAAM;AAAA,cAAE;AAAA,cAAI,aAAa,OAAO,KAAK;AAAA,eAC5D;AAAA,aACF;AAAA,UACA,8CAAC,SACC;AAAA,yDAAC,QAAG,sBAAQ;AAAA,YACZ,6CAAC,QAAI,6BAAmB,OAAO,MAAM,GAAE;AAAA,aACzC;AAAA,WACF;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC;AAAA,YACA;AAAA,YACA,QAAO;AAAA,YACP;AAAA,YACA,WAAU;AAAA,YACV,YACE,6CAAC,OAAE,WAAU,gCAA+B,6CAA+B;AAAA;AAAA,QAE/E;AAAA;AAAA;AAAA,EACF;AAEJ;AAEA,SAAS,gBAAgB,MAAkB,SAAkC;AAC3E,MAAI,KAAK,SAAS,EAAG,QAAO,EAAE,OAAO,2BAA2B,MAAM,SAAS;AAC/E,MAAI,KAAK,SAAS,EAAG,QAAO,EAAE,OAAO,eAAe,MAAM,UAAU;AACpE,MAAI,WAAW,IAAK,QAAO,EAAE,OAAO,eAAe,MAAM,UAAU;AACnE,MAAI,KAAK,OAAO,EAAG,QAAO,EAAE,OAAO,sBAAsB,MAAM,SAAS;AACxE,SAAO,EAAE,OAAO,UAAU,MAAM,SAAS;AAC3C;AAEA,SAAS,wBACP,WACA,aACA,aACyB;AACzB,MAAI,cAAc,EAAG,QAAO,EAAE,OAAO,YAAY,UAAU,UAAU;AACrE,MAAI,gBAAgB,EAAG,QAAO,EAAE,OAAO,mBAAmB,UAAU,SAAS;AAC7E,MAAI,cAAc,GAAG;AACnB,WAAO,EAAE,OAAO,GAAG,aAAa,WAAW,CAAC,aAAa,UAAU,SAAS;AAAA,EAC9E;AACA,MAAI,eAAe,GAAI,QAAO,EAAE,OAAO,kBAAkB,UAAU,UAAU;AAC7E,SAAO,EAAE,OAAO,eAAe,UAAU,UAAU;AACrD;AAEA,SAAS,aAAa,OAAe;AACnC,SAAO,IAAI,KAAK,aAAa,OAAO,EAAE,OAAO,KAAK;AACpD;AAEA,SAASA,eAAc,OAAe;AACpC,SAAO,GAAG,MAAM,eAAe,SAAS,EAAE,uBAAuB,EAAE,CAAC,CAAC;AACvE;AAEA,SAAS,gBAAgB,OAAe;AACtC,SAAO,GAAG,aAAa,KAAK,CAAC,IAAI,UAAU,IAAI,SAAS,OAAO;AACjE;AAEA,SAAS,mBAAmB,OAAe;AACzC,SAAO,GAAG,aAAa,KAAK,CAAC;AAC/B;;;ACxRA,IAAAC,SAAuB;AACvB,IAAAC,eAMO;AACP,IAAAC,eAA2C;AA+CnC,IAAAC,sBAAA;AArCD,SAAS,cAAc;AAAA,EAC5B;AAAA,EACA;AAAA,EACA,QAAQ;AAAA,EACR;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV;AAAA,EACA,mBAAmB;AAAA,EACnB,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,SAAS;AAAA,EACT,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,GAAG;AACL,GAAuB;AACrB,QAAM,YAAkB,aAAM;AAC9B,QAAM,OAAsB,OAAO,IAAI,CAAC,WAAW,EAAE,GAAG,MAAM,EAAE;AAChE,QAAM,kBAAkB,YAAY;AACpC,QAAM,SAAS,OAAO;AAAA,IACpB,CAAC,SAAS,WAAW;AAAA,MACnB,OAAO,QAAQ,QAAQ,MAAM;AAAA,MAC7B,YAAY,QAAQ,aAAa,MAAM;AAAA,MACvC,QAAQ,QAAQ,SAAS,MAAM;AAAA,IACjC;AAAA,IACA,EAAE,OAAO,GAAG,YAAY,GAAG,QAAQ,EAAE;AAAA,EACvC;AACA,QAAM,UAAqC;AAAA,IACzC;AAAA,MACE,KAAK;AAAA,MACL,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,QAAQ,CAAC,QACP,8CAAC,SAAI,WAAU,8BACb;AAAA,qDAAC,YAAQ,cAAI,MAAK;AAAA,QAClB,6CAAC,UAAM,0BAAgB,GAAG,GAAE;AAAA,SAC9B;AAAA,IAEJ;AAAA,IACA;AAAA,MACE,KAAK;AAAA,MACL,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,OAAO;AAAA,MACP,QAAQ,CAAC,QAAQ,6CAAC,UAAK,WAAU,+BAA+B,sBAAY,IAAI,KAAK,GAAE;AAAA,IACzF;AAAA,IACA;AAAA,MACE,KAAK;AAAA,MACL,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,OAAO;AAAA,MACP,QAAQ,CAAC,QACP,6CAAC,UAAK,WAAU,+BAA+B,sBAAY,IAAI,UAAU,GAAE;AAAA,IAE/E;AAAA,IACA;AAAA,MACE,KAAK;AAAA,MACL,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,OAAO;AAAA,MACP,QAAQ,CAAC,QACP,6CAAC,sBAAM,UAAU,IAAI,SAAS,IAAI,WAAW,WAAY,sBAAY,IAAI,MAAM,GAAE;AAAA,IAErF;AAAA,IACA;AAAA,MACE,KAAK;AAAA,MACL,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,OAAO;AAAA,MACP,QAAQ,CAAC,QACP,IAAI,cAAc,SAChB,6CAAC,UAAK,WAAU,8BAA6B,iBAAG,IAEhD,6CAAC,sBAAM,UAAU,kBAAkB,IAAI,SAAS,GAC7C,0BAAgB,IAAI,SAAS,GAChC;AAAA,IAEN;AAAA,EACF;AACA,QAAMC,kBACJ,OAAO,WAAW,IACd,YACA,OAAO,SAAS,IACd,WACA,OAAO,aAAa,IAClB,SACA;AACV,QAAMC,eACJ,OAAO,WAAW,IAAI,cAAc,OAAO,SAAS,IAAI,kBAAkB;AAE5E,SACE;AAAA,IAAC;AAAA;AAAA,MACE,GAAG;AAAA,MACJ,WAAW,CAAC,uBAAuB,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,MACtE,sBAAmB;AAAA,MACnB,mBAAiB,kBAAkB;AAAA,MAEnC;AAAA,sDAAC,YACC;AAAA,wDAAC,SAAI,WAAU,gCACb;AAAA,yDAAC,QAAG,IAAI,WAAY,iBAAM;AAAA,YACzB,kBACC,6CAAC,SAAI,WAAU,iCAAiC,2BAAgB,IAC9D;AAAA,aACN;AAAA,UACA,8CAAC,SAAI,WAAU,uCACb;AAAA,yDAAC,sBAAM,UAAUD,iBAAiB,UAAAC,cAAY;AAAA,YAC9C,6CAAC,4BAAY,SAAkB;AAAA,aACjC;AAAA,WACF;AAAA,QACA,8CAAC,QAAG,WAAU,gCAA+B,cAAW,gBACtD;AAAA,wDAAC,SACC;AAAA,yDAAC,QAAG,yBAAW;AAAA,YACf,6CAAC,QAAI,sBAAY,OAAO,KAAK,GAAE;AAAA,aACjC;AAAA,UACA,8CAAC,SACC;AAAA,yDAAC,QAAG,wBAAU;AAAA,YACd,6CAAC,QAAI,sBAAY,OAAO,UAAU,GAAE;AAAA,aACtC;AAAA,UACA,8CAAC,SACC;AAAA,yDAAC,QAAG,oBAAM;AAAA,YACV,6CAAC,QAAI,sBAAY,OAAO,MAAM,GAAE;AAAA,aAClC;AAAA,WACF;AAAA,QACA,6CAAC,0BAAU,MAAY,SAAkB,SAAkB;AAAA;AAAA;AAAA,EAC7D;AAEJ;AAEA,SAAS,gBAAgB,OAAiB;AACxC,MAAI,MAAM,SAAS,EAAG,QAAO;AAC7B,MAAI,MAAM,aAAa,EAAG,QAAO;AACjC,MAAI,MAAM,QAAQ,EAAG,QAAO;AAC5B,SAAO;AACT;AAEA,SAAS,kBAAkB,WAAgC;AACzD,MAAI,aAAa,EAAG,QAAO;AAC3B,MAAI,YAAY,IAAK,QAAO;AAC5B,MAAI,YAAY,EAAG,QAAO;AAC1B,SAAO;AACT;AAEA,SAAS,YAAY,OAAe;AAClC,SAAO,IAAI,KAAK,aAAa,OAAO,EAAE,OAAO,KAAK;AACpD;AAEA,SAAS,gBAAgB,OAAe;AACtC,SAAO,GAAG,MAAM,eAAe,SAAS,EAAE,uBAAuB,EAAE,CAAC,CAAC;AACvE;;;AC1KA,IAAAC,iBAA2B;AA4BvB,IAAAC,sBAAA;AApBJ,IAAM,iBAAiB,IAAI,KAAK,aAAa,SAAS,EAAE,uBAAuB,EAAE,CAAC;AAClF,IAAM,mBAAmB,CAAC,EAAE,KAAK,SAAS,OAAO,eAAe,OAAO,UAAU,CAAC;AAE3E,SAAS,gBAAgB;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAAyB;AACvB,QAAM,OAAO,OAAO,IAAI,CAAC,OAAO,UAAU;AACxC,UAAM,MAAM;AAAA,MACV,OAAO,MAAM,SAAS,MAAM,aAAa,OAAO,QAAQ,CAAC;AAAA,MACzD,OAAO,MAAM;AAAA,IACf;AAEA,WAAO,MAAM,YAAY,EAAE,GAAG,KAAK,WAAW,MAAM,UAAU,IAAI;AAAA,EACpE,CAAC;AAED,SACE;AAAA,IAAC;AAAA;AAAA,MACE,GAAG;AAAA,MACJ,WAAW,CAAC,+BAA+B,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,MAC9E,OAAO,SAAS;AAAA,MAChB,UAAU,YAAY,mBAAmB,MAAM;AAAA,MAC/C,WAAU;AAAA,MACV;AAAA,MACA,UAAS;AAAA,MACT,QAAQ;AAAA,MACR,sBAAmB;AAAA;AAAA,EACrB;AAEJ;AAEA,SAAS,mBAAmB,QAA8D;AACxF,QAAM,SAAS,OAAO,IAAI,CAAC,UAAU,MAAM,KAAK,EAAE,OAAO,OAAO,QAAQ;AACxE,MAAI,CAAC,OAAO,OAAQ,QAAO,CAAC;AAE5B,QAAM,UAAU,OAAO,GAAG,EAAE,KAAK;AACjC,QAAM,WAAW,OAAO,GAAG,EAAE;AAC7B,QAAM,OAAO,KAAK,IAAI,GAAG,MAAM;AAC/B,QAAMC,WAAU,OAAO,OAAO,CAAC,OAAO,UAAU,QAAQ,OAAO,CAAC,IAAI,OAAO;AAE3E,SAAO;AAAA,IACL,EAAE,OAAO,iBAAiB,OAAO,YAAY,OAAO,EAAE;AAAA,IACtD,EAAE,OAAO,QAAQ,OAAO,YAAY,IAAI,EAAE;AAAA,IAC1C,EAAE,OAAO,WAAW,OAAO,YAAYA,QAAO,EAAE;AAAA,IAChD;AAAA,MACE,OAAO;AAAA,MACP,OAAO,aAAa,SAAY,QAAQ,YAAY,UAAU,QAAQ;AAAA,IACxE;AAAA,EACF;AACF;AAEA,SAAS,YAAY,OAAe;AAClC,SAAO,eAAe,OAAO,KAAK;AACpC;AAEA,SAAS,YAAY,OAAe;AAClC,MAAI,UAAU,EAAG,QAAO;AACxB,SAAO,GAAG,QAAQ,IAAI,MAAM,EAAE,GAAG,YAAY,KAAK,CAAC;AACrD;;;ACrEA,IAAAC,SAAuB;AACvB,yBAAsB;AACtB,IAAAC,eAA4E;AAC5E,IAAAC,eAA2C;AAuCnC,IAAAC,sBAAA;AA3BD,SAAS,iBAAiB;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ;AAAA,EACA,QAAQ;AAAA,EACR;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV,cAAc;AAAA,EACd,mBAAmB;AACrB,GAA0B;AACxB,QAAM,YAAkB,aAAM;AAC9B,QAAM,eAAe,WAAW,SAAS,SAAS;AAClD,QAAM,aAAa,WAAW,SAAS,OAAO;AAC9C,QAAM,kBAAkB,QAAQ,QAAQ,SAAS,CAAC,GAAG,aAAa;AAClE,QAAM,iBACJ,YAAY,eAAe,GAAG,iBAAiB,QAAQ,MAAM,CAAC;AAChE,QAAM,aAAa,QAAQ,WAAY,aAAa,OAAQ;AAC5D,QAAM,OAAiB,QAAQ,IAAI,CAAC,WAAW,EAAE,GAAG,MAAM,EAAE;AAC5D,QAAM,UAAgC;AAAA,IACpC;AAAA,MACE,KAAK;AAAA,MACL,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,QAAQ,CAAC,QACP,6CAAC,UAAK,WAAU,oCAAmC,UAAU,IAAI,WAC9D,cAAI,WACP;AAAA,IAEJ;AAAA,IACA;AAAA,MACE,KAAK;AAAA,MACL,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,QAAQ,CAAC,QACP,6CAAC,sBAAM,UAAU,cAAc,IAAI,KAAK,GAAI,sBAAY,IAAI,KAAK,GAAE;AAAA,IAEvE;AAAA,IACA;AAAA,MACE,KAAK;AAAA,MACL,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,QAAQ,CAAC,QACP,6CAAC,UAAK,WAAU,iCAAiC,cAAI,UAAU,UAAS;AAAA,IAE5E;AAAA,IACA;AAAA,MACE,KAAK;AAAA,MACL,QAAQ;AAAA,MACR,QAAQ,CAAC,QACP;AAAA,QAAC;AAAA;AAAA,UACC,WAAW;AAAA,YACT;AAAA,YACA,mCAAmC,IAAI,SAAS,MAAM;AAAA,UACxD,EAAE,KAAK,GAAG;AAAA,UAET,cAAI;AAAA;AAAA,MACP;AAAA,IAEJ;AAAA,EACF;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MACL,cAAY;AAAA,MACZ,mBAAiB,mBAAmB,YAAY,SAAY;AAAA,MAC5D,WAAW;AAAA,QACT;AAAA,QACA,YAAY,qCAAqC;AAAA,QACjD;AAAA,MACF,EACG,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,MACX,sBAAmB;AAAA,MAEnB;AAAA,sDAAC,YAAO,WAAU,iCAChB;AAAA,wDAAC,SAAI,WAAU,kCACb;AAAA,yDAAC,QAAG,IAAI,WAAY,iBAAM;AAAA,YAC1B,6CAAC,OAAG,0BAAe;AAAA,aACrB;AAAA,UACA,8CAAC,SAAI,WAAU,iCAAgC,aAAU,UACvD;AAAA,yDAAC,sBAAM,UAAU,YAAY,YAAY,WACtC,sBAAY,cAAc,UAC7B;AAAA,YACA,6CAAC,UAAM,uBAAa,iBAAiB,YAAY,OAAO,IAAI,aAAY;AAAA,aAC1E;AAAA,WACF;AAAA,QACC,aACC;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACV,MAAK;AAAA,YACL,cAAW;AAAA,YAEV;AAAA,wBAAU,6CAAC,SAAI,WAAU,kCAAkC,mBAAQ,IAAS;AAAA,cAC5E,aAAa,UACZ;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,QAAO;AAAA,kBACP,SAAQ;AAAA,kBACR,MAAM,6CAAC,4BAAM,MAAM,IAAI;AAAA,kBACvB,cAAW;AAAA,kBACX,SAAS;AAAA,kBACV;AAAA;AAAA,cAED,IACE;AAAA;AAAA;AAAA,QACN,IACE;AAAA,QACJ,8CAAC,QAAG,WAAU,kCAAiC,cAAW,uBACxD;AAAA,wDAAC,SACC;AAAA,yDAAC,QAAG,qBAAO;AAAA,YACX,6CAAC,QAAI,2BAAiB,QAAQ,MAAM,GAAE;AAAA,aACxC;AAAA,UACA,8CAAC,SACC;AAAA,yDAAC,QAAG,sBAAQ;AAAA,YACZ,6CAAC,QAAI,2BAAiB,cAAc,SAAS,GAAE;AAAA,aACjD;AAAA,UACA,8CAAC,SACC;AAAA,yDAAC,QAAG,oBAAM;AAAA,YACV,6CAAC,QAAI,2BAAiB,YAAY,OAAO,GAAE;AAAA,aAC7C;AAAA,UACA,8CAAC,SACC;AAAA,yDAAC,QAAG,oBAAM;AAAA,YACV,6CAAC,QAAI,2BAAgB;AAAA,aACvB;AAAA,WACF;AAAA,QACA,6CAAC,SAAI,WAAU,sCAAqC,aAAW,YAAY,WAAW,OACpF;AAAA,UAAC;AAAA;AAAA,YACC;AAAA,YACA;AAAA,YACA;AAAA,YACA,QAAO;AAAA,YACP,WAAU;AAAA,YACV,YACE,8CAAC,SAAI,WAAU,gCAA+B,MAAK,UACjD;AAAA,2DAAC,QAAG,6BAAe;AAAA,cACnB,6CAAC,OAAE,sEAAwD;AAAA,eAC7D;AAAA;AAAA,QAEJ,GACF;AAAA;AAAA;AAAA,EACF;AAEJ;AAEA,SAAS,WAAW,SAAqB,OAAuC;AAC9E,SAAO,QAAQ,OAAO,CAAC,UAAU,MAAM,UAAU,KAAK,EAAE;AAC1D;AAEA,SAAS,iBAAiB,OAAe;AACvC,SAAO,GAAG,KAAK,IAAI,UAAU,IAAI,UAAU,SAAS;AACtD;AAEA,SAAS,iBAAiB,OAAe,OAAe;AACtD,SAAO,GAAG,KAAK,IAAI,UAAU,IAAI,QAAQ,GAAG,KAAK,GAAG;AACtD;AAEA,SAAS,YAAY,OAA0B;AAC7C,UAAQ,SAAS,QAAQ,YAAY;AACvC;AAEA,SAAS,cAAc,OAAuC;AAC5D,MAAI,UAAU,QAAS,QAAO;AAC9B,MAAI,UAAU,UAAW,QAAO;AAChC,MAAI,UAAU,QAAS,QAAO;AAC9B,SAAO;AACT;;;ACxLA,IAAAC,SAAuB;AACvB,IAAAC,eAA4E;AAC5E,IAAAC,eAA2C;AAkCpB,IAAAC,sBAAA;AAtBvB,IAAM,gBAAgE;AAAA,EACpE,EAAE,QAAQ,OAAO,OAAO,MAAM;AAAA,EAC9B,EAAE,QAAQ,QAAQ,OAAO,OAAO;AAAA,EAChC,EAAE,QAAQ,QAAQ,OAAO,OAAO;AAClC;AAEO,SAAS,eAAe;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd,mBAAmB;AACrB,GAAwB;AACtB,QAAM,YAAkB,aAAM;AAC9B,QAAM,OAAmB,QAAQ,IAAI,CAAC,WAAW,EAAE,GAAG,MAAM,EAAE;AAC9D,QAAM,UAAkC;AAAA,IACtC,EAAE,KAAK,aAAa,QAAQ,QAAQ,OAAO,OAAO;AAAA,IAClD;AAAA,MACE,KAAK;AAAA,MACL,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,QAAQ,CAAC,QAAQ,6CAAC,UAAK,WAAU,8BAA8B,cAAI,OAAM;AAAA,IAC3E;AAAA,IACA,EAAE,KAAK,UAAU,QAAQ,UAAU,OAAO,QAAQ;AAAA,IAClD,EAAE,KAAK,YAAY,QAAQ,YAAY,OAAO,QAAQ;AAAA,IACtD;AAAA,MACE,KAAK;AAAA,MACL,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,QAAQ,CAAC,QAAQ,6CAAC,UAAK,WAAU,6BAA6B,cAAI,MAAM,OAAM;AAAA,IAChF;AAAA,IACA;AAAA,MACE,KAAK;AAAA,MACL,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,QAAQ,CAAC,QAAQ,6CAAC,sBAAM,UAAU,gBAAgB,IAAI,OAAO,GAAI,cAAI,SAAQ;AAAA,IAC/E;AAAA,EACF;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,cAAY;AAAA,MACZ,mBAAiB,mBAAmB,YAAY,SAAY;AAAA,MAC5D,WAAW,CAAC,uBAAuB,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,MACtE,sBAAmB;AAAA,MAEnB;AAAA,sDAAC,YACC;AAAA,wDAAC,SAAI,WAAU,gCACb;AAAA,yDAAC,QAAG,IAAI,WAAW,uBAAS;AAAA,YAC5B,6CAAC,UAAM,UAAAC,kBAAiB,QAAQ,MAAM,GAAE;AAAA,aAC1C;AAAA,UACA,8CAAC,SAAI,WAAU,gCACZ;AAAA,sBAAU,6CAAC,SAAI,WAAU,gCAAgC,mBAAQ,IAAS;AAAA,YAC3E,6CAAC,SAAI,WAAU,gCAA+B,cAAW,oBACtD,wBAAc,IAAI,CAAC,EAAE,QAAQ,MAAM,MAClC;AAAA,cAAC;AAAA;AAAA,gBAEC,MAAK;AAAA,gBACL,QAAO;AAAA,gBACP,SAAQ;AAAA,gBACR,UAAU,CAAC;AAAA,gBACX,SAAS,MAAM,WAAW,MAAM;AAAA,gBAE/B;AAAA;AAAA,cAPI;AAAA,YAQP,CACD,GACH;AAAA,aACF;AAAA,WACF;AAAA,QACA,6CAAC,0BAAU,MAAY,SAAkB,SAAQ,WAAU,QAAO,MAAK;AAAA;AAAA;AAAA,EACzE;AAEJ;AAEA,SAASA,kBAAiB,OAAe;AACvC,SAAO,GAAG,KAAK,IAAI,UAAU,IAAI,UAAU,QAAQ;AACrD;AAEA,SAAS,gBAAgB,SAAgD;AACvE,SAAO,YAAY,YAAY,YAAY,YAAY,YAAY,WAAW;AAChF;;;AC/FA,mBAAsB;AACtB,IAAAC,eASO;AACP,mBAA4B;AAgDpB,IAAAC,sBAAA;AArCD,SAAS,kBAAkB;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV;AAAA,EACA,GAAG;AACL,GAA2B;AACzB,QAAM,kBAAc,oBAAM,EAAE,QAAQ,mBAAmB,EAAE;AACzD,QAAM,cAAc,oBAAoB,OAAO,OAAO,MAAM,WAAW,EAAE;AAAA,IACvE;AAAA,IACA;AAAA,EACF,CAAC;AACD,QAAM,SAAS,CAAC,UAAsC,WAAW,EAAE,GAAG,QAAQ,GAAG,MAAM,CAAC;AACxF,QAAM,eAAe,OAAO,KAAK,OAAO,cAAc,CAAC,CAAC;AACxD,QAAM,YAAY,OAAO,WAAW,SAAS,OAAO,YAAY;AAChE,QAAM,QAAQ,OAAO,SAAS,CAAC;AAC/B,QAAM,mBAAmB,UAAU,MAAM,GAAG,CAAC;AAC7C,QAAM,sBAAsB,KAAK,IAAI,GAAG,UAAU,SAAS,iBAAiB,MAAM;AAElF,SACE;AAAA,IAAC;AAAA;AAAA,MACE,GAAG;AAAA,MACJ,OAAO,SAAS;AAAA,MAChB,aACE,eACA,OAAO,eACP;AAAA,MAEF;AAAA,MACA,WAAW,CAAC,2BAA2B,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,MAC1E,sBAAmB;AAAA,MAEnB;AAAA,sDAAC,SAAI,WAAU,mCACb;AAAA,wDAAC,SAAI,WAAU,mCACb;AAAA,yDAAC,0BAAU,IAAI,GAAG,WAAW,SAAS,OAAM,eAAc,UAAQ,MAChE;AAAA,cAAC;AAAA;AAAA,gBACC,IAAI,GAAG,WAAW;AAAA,gBAClB;AAAA,gBACA,OAAO,OAAO,QAAQ;AAAA,gBACtB,UAAU,CAAC,UAAU,OAAO,EAAE,MAAM,MAAM,cAAc,MAAM,CAAC;AAAA;AAAA,YACjE,GACF;AAAA,YACA,6CAAC,0BAAU,IAAI,GAAG,WAAW,gBAAgB,OAAM,eACjD;AAAA,cAAC;AAAA;AAAA,gBACC,IAAI,GAAG,WAAW;AAAA,gBAClB,MAAM;AAAA,gBACN,OAAO,OAAO,eAAe;AAAA,gBAC7B,UAAU,CAAC,UAAU,OAAO,EAAE,aAAa,MAAM,cAAc,MAAM,CAAC;AAAA;AAAA,YACxE,GACF;AAAA,aACF;AAAA,UAEA,8CAAC,WAAM,WAAU,oCAAmC,cAAW,kBAC7D;AAAA,0DAAC,SAAI,WAAU,2CACb;AAAA,2DAAC,QAAG,0BAAY;AAAA,cAChB,6CAAC,sBAAM,UAAU,MAAM,SAAS,YAAY,WACzC,gBAAM,SAAS,eAAe,eACjC;AAAA,eACF;AAAA,YACA,8CAAC,QAAG,WAAU,yCACZ;AAAA,4DAAC,SACC;AAAA,6DAAC,QAAG,mBAAK;AAAA,gBACT,6CAAC,QAAI,gBAAM,QAAO;AAAA,iBACpB;AAAA,cACA,8CAAC,SACC;AAAA,6DAAC,QAAG,uBAAS;AAAA,gBACb,6CAAC,QAAI,oBAAU,QAAO;AAAA,iBACxB;AAAA,cACA,8CAAC,SACC;AAAA,6DAAC,QAAG,2BAAa;AAAA,gBACjB,6CAAC,QAAI,uBAAa,QAAO;AAAA,iBAC3B;AAAA,eACF;AAAA,YACA,8CAAC,SAAI,WAAU,sCACb;AAAA,2DAAC,UAAK,4BAAc;AAAA,cACnB,UAAU,SACT,8CAAC,SAAI,WAAU,0CACZ;AAAA,iCAAiB,IAAI,CAAC,aACrB,6CAAC,oBAAoB,sBAAX,QAAoB,CAC/B;AAAA,gBACA,sBACC,8CAAC,sBAAM,UAAS,WAAU;AAAA;AAAA,kBAAE;AAAA,kBAAoB;AAAA,mBAAK,IACnD;AAAA,iBACN,IAEA,6CAAC,OAAE,qCAAuB;AAAA,eAE9B;AAAA,aACF;AAAA,WACF;AAAA,QAEA;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACV;AAAA,YACA;AAAA,YACA,UAAU,CAAC,cAAc,OAAO,EAAE,OAAO,UAAU,CAAC;AAAA;AAAA,QACtD;AAAA,QACA,6CAAC,SAAI,WAAU,oCACb,uDAAC,uBAAO,MAAK,UAAS,UAAU,CAAC,QAAQ,SAAS,MAAM,SAAS,MAAM,GAAG,yBAE1E,GACF;AAAA;AAAA;AAAA,EACF;AAEJ;;;ACjIA,IAAAC,eAA6E;AA0DrE,IAAAC,uBAAA;AAtCD,SAAS,kBAAkB,EAAE,SAAS,QAAQ,OAAO,WAAW,GAAG,MAAM,GAA2B;AACzG,QAAM,UAAU,QAAQ,IAAI,CAAC,WAAW;AACtC,UAAM,UAAU,OAAO,QAAQ,IAAK,OAAO,UAAU,OAAO,QAAS,MAAM;AAC3E,UAAM,iBAAiB,KAAK,MAAM,OAAO;AACzC,UAAM,gBAAgB,KAAK,IAAI,KAAK,KAAK,IAAI,GAAG,OAAO,CAAC;AACxD,UAAM,QAAQ,WAAW,SAAS,OAAO,KAAK;AAE9C,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,YAAY,YAAY,OAAO,KAAK;AAAA,MACpC,YACE,OAAO,QAAQ,IACX,GAAGC,cAAa,OAAO,OAAO,CAAC,MAAMA,cAAa,OAAO,KAAK,CAAC,IAAI,WAAW,OAAO,MAAM,OAAO,KAAK,CAAC,KACxG,GAAGA,cAAa,OAAO,OAAO,CAAC,IAAI,WAAW,OAAO,MAAM,OAAO,OAAO,CAAC;AAAA,IAClF;AAAA,EACF,CAAC;AAED,QAAM,eAAe,QAAQ,OAA6C,CAAC,SAAS,UAAU;AAC5F,QAAI,CAAC,WAAW,MAAM,UAAU,QAAQ,QAAS,QAAO;AACxD,WAAO;AAAA,EACT,GAAG,MAAS;AACZ,QAAM,iBAAiB,QAAQ,OAAO,CAAC,UAAU,MAAM,WAAW,GAAG,EAAE;AACvE,QAAM,eAAe,QAAQ,OAAO,CAAC,UAAU,MAAM,WAAW,MAAM,MAAM,UAAU,GAAG,EAAE;AAC3F,QAAM,cAAc,eAAe,gBAAgB,YAAY;AAE/D,SACE;AAAA,IAAC;AAAA;AAAA,MACE,GAAG;AAAA,MACJ,OAAO,SAAS;AAAA,MAChB,UAAU;AAAA,MACV,WAAW,CAAC,2BAA2B,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,MAC1E,sBAAmB;AAAA,MAElB,kBAAQ,SACP,gFACE;AAAA,uDAAC,QAAG,WAAU,oCAAmC,cAAW,yBAC1D;AAAA,yDAAC,SACC;AAAA,0DAAC,QAAG,4BAAc;AAAA,YAClB,8CAAC,QAAI,kBAAQ,QAAO;AAAA,aACtB;AAAA,UACA,+CAAC,SACC;AAAA,0DAAC,QAAG,2BAAa;AAAA,YACjB,8CAAC,QACE,yBAAe,GAAG,aAAa,OAAO,KAAK,IAAI,aAAa,cAAc,MAAM,OACnF;AAAA,aACF;AAAA,UACA,+CAAC,SACC;AAAA,0DAAC,QAAG,0BAAY;AAAA,YAChB,8CAAC,QACC,wDAAC,sBAAM,UAAU,YAAY,UAAW,sBAAY,OAAM,GAC5D;AAAA,aACF;AAAA,WACF;AAAA,QAEA,8CAAC,SAAI,WAAU,oCACZ,kBAAQ,IAAI,CAAC,EAAE,QAAQ,gBAAgB,eAAe,OAAO,YAAY,WAAW,MACnF,+CAAC,aAA+C,WAAU,mCACxD;AAAA,yDAAC,SAAI,WAAU,0CACb;AAAA,2DAAC,SACC;AAAA,4DAAC,QAAI,iBAAO,OAAM;AAAA,cAClB,8CAAC,OAAG,sBAAW;AAAA,eACjB;AAAA,YACA,8CAAC,sBAAM,UAAU,MAAM,UAAW,gBAAM,OAAM;AAAA,aAChD;AAAA,UAEA;AAAA,YAAC;AAAA;AAAA,cACC,WAAU;AAAA,cACV,MAAK;AAAA,cACL,cAAY,GAAG,OAAO,KAAK;AAAA,cAC3B,iBAAe;AAAA,cACf,iBAAe;AAAA,cACf,iBAAe,KAAK,MAAM,aAAa;AAAA,cACvC,kBACE,OAAO,QAAQ,IAAI,GAAG,cAAc,oBAAoB;AAAA,cAG1D;AAAA,gBAAC;AAAA;AAAA,kBACC,WAAW,4EAA4E,MAAM,IAAI;AAAA,kBACjG,OACE;AAAA,oBACE,qCAAqC,GAAG,aAAa;AAAA,kBACvD;AAAA;AAAA,cAEJ;AAAA;AAAA,UACF;AAAA,UAEA,+CAAC,QAAG,WAAU,2CACZ;AAAA,2DAAC,SACC;AAAA,4DAAC,QAAG,yBAAW;AAAA,cACf,8CAAC,QAAI,iBAAO,QAAQ,IAAI,GAAG,cAAc,MAAM,YAAW;AAAA,eAC5D;AAAA,YACA,+CAAC,SACC;AAAA,4DAAC,QAAG,mBAAK;AAAA,cACT,8CAAC,QACE,iBAAO,QAAQ,IACZ,GAAGA,cAAa,OAAO,KAAK,CAAC,IAAI,WAAW,OAAO,MAAM,OAAO,KAAK,CAAC,KACtE,aACN;AAAA,eACF;AAAA,YACC,aACC,+CAAC,SACC;AAAA,4DAAC,QAAG,oBAAM;AAAA,cACV,8CAAC,QAAI,sBAAW;AAAA,eAClB,IACE;AAAA,aACN;AAAA,aAjDY,GAAG,OAAO,KAAK,IAAI,OAAO,IAAI,EAkD5C,CACD,GACH;AAAA,SACF,IAEA,8CAAC,OAAE,WAAU,kCAAiC,6DAA+C;AAAA;AAAA,EAEjG;AAEJ;AAEA,SAAS,WAAW,SAAiB,OAA2B;AAC9D,MAAI,SAAS,EAAG,QAAO,EAAE,OAAO,YAAY,UAAU,WAAW,MAAM,UAAU;AACjF,MAAI,WAAW,IAAK,QAAO,EAAE,OAAO,cAAc,UAAU,UAAU,MAAM,SAAS;AACrF,MAAI,WAAW,GAAI,QAAO,EAAE,OAAO,SAAS,UAAU,WAAW,MAAM,UAAU;AACjF,SAAO,EAAE,OAAO,gBAAgB,UAAU,WAAW,MAAM,SAAS;AACtE;AAEA,SAAS,eAAe,gBAAwB,cAA8D;AAC5G,MAAI,iBAAiB,EAAG,QAAO,EAAE,OAAO,GAAG,cAAc,eAAe,UAAU,SAAS;AAC3F,MAAI,eAAe,EAAG,QAAO,EAAE,OAAO,GAAG,YAAY,kBAAkB,UAAU,UAAU;AAC3F,SAAO,EAAE,OAAO,iBAAiB,UAAU,UAAU;AACvD;AAEA,SAASA,cAAa,OAAe;AACnC,SAAO,IAAI,KAAK,aAAa,SAAS;AAAA,IACpC,uBAAuB,QAAQ,MAAM,IAAI,IAAI;AAAA,EAC/C,CAAC,EAAE,OAAO,KAAK;AACjB;AAEA,SAAS,WAAW,MAAc,OAAe;AAC/C,MAAI,KAAK,YAAY,MAAM,OAAQ,QAAO,UAAU,IAAI,SAAS;AACjE,SAAO;AACT;AAEA,SAAS,YAAY,OAAgB;AACnC,MAAI,UAAU,OAAW,QAAO;AAChC,MAAI,UAAU,EAAG,QAAO;AACxB,SAAO,GAAG,QAAQ,IAAI,MAAM,EAAE,GAAG,KAAK;AACxC;;;AC1KA,IAAAC,gBAA4C;AA8BxC,IAAAC,uBAAA;AAjBG,SAAS,oBAAoB;AAAA,EAClC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAA6B;AAC3B,QAAM,uBACJ,gBAAgB,SACZ,yEACA;AAEN,SACE;AAAA,IAAC;AAAA;AAAA,MACE,GAAG;AAAA,MACJ,OAAO,SAAS;AAAA,MAChB,aAAa;AAAA,MACb,WAAW,CAAC,6BAA6B,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,MAC5E;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,sBAAmB;AAAA;AAAA,EACrB;AAEJ;;;AC3CA,IAAAC,SAAuB;AACvB,IAAAC,eAMO;AACP,IAAAC,eAA2C;AAiDpB,IAAAC,uBAAA;AAhChB,SAAS,iBAAiB;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,QAAQ;AAAA,EACR;AAAA,EACA;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV,cAAc;AAAA,EACd,mBAAmB;AAAA,EACnB,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,SAAS;AAAA,EACT,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,GAAG;AACL,GAA0B;AACxB,QAAM,YAAkB,aAAM;AAC9B,QAAM,eAAe,MAAM,OAAO,CAAC,SAAS,KAAK,OAAO,EAAE;AAC1D,QAAM,gBAAgB,MAAM,SAAS;AACrC,QAAM,OAAyB,MAAM,IAAI,CAAC,UAAU,EAAE,GAAG,KAAK,EAAE;AAChE,QAAM,UAAwC;AAAA,IAC5C;AAAA,MACE,KAAK;AAAA,MACL,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,QAAQ,CAAC,QAAQ,8CAAC,UAAK,WAAU,gCAAgC,cAAI,MAAK;AAAA,IAC5E;AAAA,IACA;AAAA,MACE,KAAK;AAAA,MACL,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,QAAQ,CAAC,QACP,+CAAC,SAAI,WAAU,kCACb;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,OAAO,GAAG,IAAI,IAAI,OAAO,IAAI,UAAU,YAAY,UAAU;AAAA,YAC7D,WAAS;AAAA,YACT,SAAQ;AAAA,YACR,UAAS;AAAA,YACT,SAAS,IAAI;AAAA,YACb,UAAU,CAAC;AAAA,YACX;AAAA,YACA,UAAU,MAAM,WAAW,IAAI,EAAE;AAAA;AAAA,QACnC;AAAA,QACA,8CAAC,sBAAM,UAAU,IAAI,UAAU,YAAY,WACxC,cAAI,UAAU,YAAY,YAC7B;AAAA,SACF;AAAA,IAEJ;AAAA,IACA;AAAA,MACE,KAAK;AAAA,MACL,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,QAAQ,CAAC,QACP,+CAAC,SAAI,WAAU,mCACb;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,cAAY,GAAG,IAAI,IAAI;AAAA,YACvB,WAAU;AAAA,YACV;AAAA,YACA,WAAS;AAAA,YACT,KAAK;AAAA,YACL,KAAK;AAAA,YACL,MAAM;AAAA,YACN,UAAU,CAAC;AAAA,YACX,OAAO,wBAAwB,IAAI,cAAc;AAAA,YACjD,UAAU,CAAC,UACT,WAAW,IAAI,IAAI;AAAA,cACjB,gBAAgB,wBAAwB,OAAO,MAAM,cAAc,KAAK,CAAC;AAAA,YAC3E,CAAC;AAAA;AAAA,QAEL;AAAA,QACA,8CAAC,UAAK,WAAU,wCAAuC,eAAY,QAAO,eAE1E;AAAA,QACA,8CAAC,UAAK,WAAU,iCAAgC,eAAY,QAC1D;AAAA,UAAC;AAAA;AAAA,YACC,OACE;AAAA,cACE,oCAAoC,GAAG,wBAAwB,IAAI,cAAc,CAAC;AAAA,YACpF;AAAA;AAAA,QAEJ,GACF;AAAA,SACF;AAAA,IAEJ;AAAA,IACA;AAAA,MACE,KAAK;AAAA,MACL,QAAQ;AAAA,MACR,QAAQ,CAAC,QACP,IAAI,cAAc,SAChB,8CAAC,SAAI,WAAU,wCACZ,cAAI,aAAa,IAAI,CAAC,gBACrB,8CAAC,sBAAwB,UAAS,WAC/B,yBADS,WAEZ,CACD,GACH,IAEA,8CAAC,sBAAM,UAAS,WAAU,8BAAgB;AAAA,IAEhD;AAAA,EACF;AACA,QAAM,iBAAiB,YAAY;AAEnC,SACE;AAAA,IAAC;AAAA;AAAA,MACE,GAAG;AAAA,MACJ,cAAY;AAAA,MACZ,mBAAiB,mBAAmB,YAAY,SAAY;AAAA,MAC5D,WAAW,CAAC,0BAA0B,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,MACzE,sBAAmB;AAAA,MAEnB;AAAA,uDAAC,YACC;AAAA,yDAAC,SAAI,WAAU,mCACb;AAAA,0DAAC,QAAG,IAAI,WAAY,iBAAM;AAAA,YACzB,iBAAiB,8CAAC,OAAG,0BAAe,IAAO;AAAA,aAC9C;AAAA,UACA,+CAAC,SAAI,WAAU,0CACb;AAAA;AAAA,cAAC;AAAA;AAAA,gBACC,WAAU;AAAA,gBACV,cAAY,GAAG,MAAM,MAAM;AAAA,gBAE3B;AAAA,iEAAC,sBAAM,UAAS,WAAW;AAAA;AAAA,oBAAa;AAAA,qBAAQ;AAAA,kBAChD,+CAAC,sBAAM,UAAS,WAAW;AAAA;AAAA,oBAAc;AAAA,qBAAS;AAAA;AAAA;AAAA,YACpD;AAAA,YACA,8CAAC,4BAAY,SAAkB;AAAA,aACjC;AAAA,WACF;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC;AAAA,YACA;AAAA,YACA;AAAA,YACA,QAAO;AAAA,YACP,WAAU;AAAA,YACV,YAAY,8CAAC,OAAE,WAAU,iCAAgC,0CAA4B;AAAA;AAAA,QACvF;AAAA;AAAA;AAAA,EACF;AAEJ;AAEA,SAAS,wBAAwB,OAA2B;AAC1D,QAAM,eAAe,SAAS;AAC9B,MAAI,CAAC,OAAO,SAAS,YAAY,EAAG,QAAO;AAC3C,SAAO,KAAK,IAAI,KAAK,KAAK,IAAI,GAAG,KAAK,MAAM,YAAY,CAAC,CAAC;AAC5D;;;ACjLA,IAAAC,SAAuB;AACvB,IAAAC,gBAMO;AACP,IAAAC,eAA2C;AAqFnC,IAAAC,uBAAA;AAxDD,SAAS,eAAe;AAAA,EAC7B;AAAA,EACA;AAAA,EACA,QAAQ;AAAA,EACR;AAAA,EACA;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV;AAAA,EACA,cAAc;AAAA,EACd,mBAAmB;AAAA,EACnB,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,SAAS;AAAA,EACT,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,GAAG;AACL,GAAwB;AACtB,QAAM,YAAkB,aAAM;AAC9B,QAAM,OAAuB,OAAO,IAAI,CAAC,UAAU;AACjD,UAAM,UAAU,MAAM,QAAQ,IAAK,MAAM,UAAU,MAAM,QAAS,MAAM;AACxE,UAAM,gBAAgB,KAAK,IAAI,KAAK,KAAK,IAAI,GAAG,OAAO,CAAC;AAExD,WAAO;AAAA,MACL,GAAG;AAAA,MACH;AAAA,MACA;AAAA,MACA,cAAc,MAAM,QAAQ,IAAIC,eAAc,OAAO,IAAI;AAAA,MACzD,OAAO,eAAe,SAAS,MAAM,KAAK;AAAA,MAC1C,YACE,MAAM,QAAQ,IACV,GAAGC,cAAa,MAAM,OAAO,CAAC,MAAMA,cAAa,MAAM,KAAK,CAAC,KAC7D,GAAGA,cAAa,MAAM,OAAO,CAAC;AAAA,IACtC;AAAA,EACF,CAAC;AACD,QAAM,eAAe,KAAK,OAAiC,CAAC,SAAS,QAAQ;AAC3E,QAAI,IAAI,SAAS,EAAG,QAAO;AAC3B,QAAI,CAAC,WAAW,IAAI,UAAU,QAAQ,QAAS,QAAO;AACtD,WAAO;AAAA,EACT,GAAG,MAAS;AACZ,QAAM,gBAAgB,KAAK,OAAO,CAAC,QAAQ,IAAI,QAAQ,KAAK,IAAI,WAAW,GAAG,EAAE;AAChF,QAAM,iBAAiB,KAAK;AAAA,IAC1B,CAAC,QAAQ,IAAI,QAAQ,KAAK,IAAI,WAAW,MAAM,IAAI,UAAU;AAAA,EAC/D,EAAE;AACF,QAAM,gBAAgB,uBAAuB,OAAO,QAAQ,eAAe,cAAc;AACzF,QAAM,iBAAiB,YAAY;AACnC,QAAM,UAAsC;AAAA,IAC1C;AAAA,MACE,KAAK;AAAA,MACL,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,QAAQ,CAAC,QACP,+CAAC,SAAI,WAAU,+BACb;AAAA,sDAAC,YAAQ,cAAI,MAAK;AAAA,QAClB,8CAAC,UAAM,cAAI,MAAM,OAAM;AAAA,SACzB;AAAA,IAEJ;AAAA,IACA;AAAA,MACE,KAAK;AAAA,MACL,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,QAAQ,CAAC,QACP,+CAAC,SAAI,WAAU,+BACb;AAAA,uDAAC,SAAI,WAAU,oCACb;AAAA,wDAAC,UAAM,cAAI,YAAW;AAAA,UACtB,8CAAC,YAAQ,cAAI,cAAa;AAAA,WAC5B;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACV,MAAK;AAAA,YACL,cAAY,GAAG,IAAI,IAAI;AAAA,YACvB,iBAAe;AAAA,YACf,iBAAe;AAAA,YACf,iBAAe,KAAK,MAAM,IAAI,aAAa;AAAA,YAC3C,kBACE,IAAI,QAAQ,IACR,GAAGD,eAAc,IAAI,OAAO,CAAC,UAAUC,cAAa,IAAI,OAAO,CAAC,OAAOA;AAAA,cACrE,IAAI;AAAA,YACN,CAAC,cACD;AAAA,YAEN,OACE;AAAA,cACE,gCAAgC,GAAG,IAAI,aAAa;AAAA,YACtD;AAAA,YAGF;AAAA,cAAC;AAAA;AAAA,gBACC,WAAW;AAAA,kBACT;AAAA,kBACA,qCAAqC,IAAI,MAAM,IAAI;AAAA,gBACrD,EAAE,KAAK,GAAG;AAAA;AAAA,YACZ;AAAA;AAAA,QACF;AAAA,SACF;AAAA,IAEJ;AAAA,IACA;AAAA,MACE,KAAK;AAAA,MACL,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,QAAQ,CAAC,QACP,8CAAC,UAAK,WAAU,gCAAgC,uBAAa,IAAI,aAAa,GAAE;AAAA,IAEpF;AAAA,IACA;AAAA,MACE,KAAK;AAAA,MACL,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,QAAQ,CAAC,QACP;AAAA,QAAC;AAAA;AAAA,UACC,cAAY,GAAG,IAAI,IAAI;AAAA,UACvB,WAAU;AAAA,UACV;AAAA,UACA,WAAS;AAAA,UACT,KAAK;AAAA,UACL,MAAM;AAAA,UACN,UAAU,CAAC;AAAA,UACX,OAAO,IAAI;AAAA,UACX,UAAU,CAAC,UAAU;AACnB,kBAAM,YAAY,OAAO,MAAM,cAAc,KAAK;AAClD,gBAAI,OAAO,SAAS,SAAS,EAAG,YAAW,IAAI,IAAI,EAAE,OAAO,UAAU,CAAC;AAAA,UACzE;AAAA;AAAA,MACF;AAAA,IAEJ;AAAA,EACF;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACE,GAAG;AAAA,MACJ,cAAY;AAAA,MACZ,mBAAiB,mBAAmB,YAAY,SAAY;AAAA,MAC5D,WAAW,CAAC,wBAAwB,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,MACvE,sBAAmB;AAAA,MAEnB;AAAA,uDAAC,YACC;AAAA,yDAAC,SAAI,WAAU,iCACb;AAAA,0DAAC,QAAG,IAAI,WAAY,iBAAM;AAAA,YACzB,iBAAiB,8CAAC,OAAG,0BAAe,IAAO;AAAA,aAC9C;AAAA,UACA,+CAAC,SAAI,WAAU,wCACb;AAAA,0DAAC,uBAAM,UAAU,cAAc,UAAW,wBAAc,OAAM;AAAA,YAC9D,8CAAC,6BAAY,SAAkB;AAAA,aACjC;AAAA,WACF;AAAA,QACA,+CAAC,QAAG,WAAU,iCAAgC,cAAW,qBACvD;AAAA,yDAAC,SACC;AAAA,0DAAC,QAAG,4BAAc;AAAA,YAClB,8CAAC,QAAI,UAAAA,cAAa,OAAO,MAAM,GAAE;AAAA,aACnC;AAAA,UACA,+CAAC,SACC;AAAA,0DAAC,QAAG,2BAAa;AAAA,YACjB,8CAAC,QACE,yBAAe,GAAG,aAAa,IAAI,IAAID,eAAc,aAAa,OAAO,CAAC,KAAK,OAClF;AAAA,aACF;AAAA,UACA,+CAAC,SACC;AAAA,0DAAC,QAAG,0BAAY;AAAA,YAChB,8CAAC,QAAI,UAAAC,cAAa,gBAAgB,cAAc,GAAE;AAAA,aACpD;AAAA,WACF;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC;AAAA,YACA;AAAA,YACA,QAAO;AAAA,YACP;AAAA,YACA,WAAU;AAAA,YACV,YAAY,8CAAC,OAAE,WAAU,+BAA8B,wCAA0B;AAAA;AAAA,QACnF;AAAA;AAAA;AAAA,EACF;AAEJ;AAEA,SAAS,eAAe,SAAiB,OAA+B;AACtE,MAAI,SAAS,EAAG,QAAO,EAAE,OAAO,YAAY,UAAU,WAAW,MAAM,UAAU;AACjF,MAAI,WAAW,IAAK,QAAO,EAAE,OAAO,YAAY,UAAU,UAAU,MAAM,SAAS;AACnF,MAAI,WAAW,GAAI,QAAO,EAAE,OAAO,cAAc,UAAU,WAAW,MAAM,UAAU;AACtF,SAAO,EAAE,OAAO,gBAAgB,UAAU,WAAW,MAAM,SAAS;AACtE;AAEA,SAAS,uBACP,YACA,eACA,gBAC4C;AAC5C,MAAI,eAAe,EAAG,QAAO,EAAE,OAAO,aAAa,UAAU,UAAU;AACvE,MAAI,gBAAgB,GAAG;AACrB,WAAO,EAAE,OAAO,GAAGA,cAAa,aAAa,CAAC,aAAa,UAAU,SAAS;AAAA,EAChF;AACA,MAAI,iBAAiB,GAAG;AACtB,WAAO,EAAE,OAAO,GAAGA,cAAa,cAAc,CAAC,eAAe,UAAU,UAAU;AAAA,EACpF;AACA,SAAO,EAAE,OAAO,iBAAiB,UAAU,UAAU;AACvD;AAEA,SAAS,aAAa,SAAiB;AACrC,SAAO,GAAGA,cAAa,OAAO,CAAC;AACjC;AAEA,SAASD,eAAc,OAAe;AACpC,SAAO,GAAG,KAAK,MAAM,KAAK,EAAE,eAAe,OAAO,CAAC;AACrD;AAEA,SAASC,cAAa,OAAe;AACnC,SAAO,IAAI,KAAK,aAAa,OAAO,EAAE,OAAO,KAAK;AACpD;;;ACxPA,IAAAC,SAAuB;AACvB,IAAAC,gBAKO;AACP,IAAAC,eAA2C;AA8CnC,IAAAC,uBAAA;AArCD,SAAS,uBAAuB;AAAA,EACrC;AAAA,EACA;AAAA,EACA,QAAQ;AAAA,EACR;AAAA,EACA;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV,cAAc;AAAA,EACd,mBAAmB;AAAA,EACnB,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,SAAS;AAAA,EACT,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,GAAG;AACL,GAAgC;AAC9B,QAAM,YAAkB,aAAM;AAC9B,QAAM,gBAAgB,aAAa;AAAA,IACjC,CAAC,KAAK,gBAAgB,OAAO,YAAY,kBAAkB;AAAA,IAC3D;AAAA,EACF;AACA,QAAM,gBAAgB,aAAa;AAAA,IACjC,CAAC,gBAAgB,YAAY,WAAW;AAAA,EAC1C,EAAE;AACF,QAAM,eAAe,aAAa,SAAS;AAC3C,QAAM,OAA+B,aAAa,IAAI,CAAC,iBAAiB,EAAE,GAAG,YAAY,EAAE;AAC3F,QAAM,UAA8C;AAAA,IAClD;AAAA,MACE,KAAK;AAAA,MACL,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,QAAQ,CAAC,QACP,+CAAC,UAAK,WAAU,sCACd;AAAA,sDAAC,YAAQ,cAAI,MAAK;AAAA,QAClB,8CAAC,UAAM,cAAI,IAAG;AAAA,SAChB;AAAA,IAEJ;AAAA,IACA;AAAA,MACE,KAAK;AAAA,MACL,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,QAAQ,CAAC,QACP,8CAAC,uBAAM,UAAU,eAAe,IAAI,MAAM,GAAI,UAAAC,aAAY,IAAI,MAAM,GAAE;AAAA,IAE1E;AAAA,IACA;AAAA,MACE,KAAK;AAAA,MACL,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,OAAO;AAAA,MACP,QAAQ,CAAC,QACP,8CAAC,UAAK,WAAW,uBAAuB,IAAI,SAAS,GAClD,wBAAc,IAAI,SAAS,GAC9B;AAAA,IAEJ;AAAA,IACA;AAAA,MACE,KAAK;AAAA,MACL,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,OAAO;AAAA,MACP,QAAQ,CAAC,QACP,8CAAC,uBAAM,UAAU,iBAAiB,IAAI,cAAc,GACjD,8BAAoB,IAAI,cAAc,GACzC;AAAA,IAEJ;AAAA,IACA;AAAA,MACE,KAAK;AAAA,MACL,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,QAAQ,CAAC,QACP,8CAAC,UAAK,WAAU,yCACb,cAAI,iBAAiB,eACxB;AAAA,IAEJ;AAAA,EACF;AACA,QAAM,iBAAiB,YAAY;AAEnC,SACE;AAAA,IAAC;AAAA;AAAA,MACE,GAAG;AAAA,MACJ,cAAY;AAAA,MACZ,mBAAiB,mBAAmB,YAAY,SAAY;AAAA,MAC5D,WAAW,CAAC,gCAAgC,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,MAC/E,sBAAmB;AAAA,MAEnB;AAAA,uDAAC,YACC;AAAA,yDAAC,SAAI,WAAU,yCACb;AAAA,0DAAC,QAAG,IAAI,WAAY,iBAAM;AAAA,YACzB,iBAAiB,8CAAC,OAAG,0BAAe,IAAO;AAAA,aAC9C;AAAA,UACA,+CAAC,SAAI,WAAU,gDACb;AAAA;AAAA,cAAC;AAAA;AAAA,gBACC,WAAU;AAAA,gBACV,cAAY,aAAa,KAAK,QAAQ,eAAe,YAAY;AAAA,gBAEjE;AAAA,gEAAC,uBAAM,UAAU,CAAC,KAAK,SAAS,YAAY,gBAAgB,YAAY,WACrE,+BAAqB,KAAK,QAAQ,YAAY,GACjD;AAAA,kBACA,+CAAC,uBAAM,UAAU,gBAAgB,WAAW,WACzC;AAAA;AAAA,oBAAc;AAAA,oBAAE,kBAAkB,IAAI,aAAa;AAAA,qBACtD;AAAA;AAAA;AAAA,YACF;AAAA,YACA,8CAAC,6BAAY,SAAkB;AAAA,aACjC;AAAA,WACF;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC;AAAA,YACA;AAAA,YACA;AAAA,YACA,QAAO;AAAA,YACP,WAAU;AAAA,YACV,YACE,8CAAC,OAAE,WAAU,uCAAsC,4CAA8B;AAAA;AAAA,QAErF;AAAA;AAAA;AAAA,EACF;AAEJ;AAEA,SAAS,eAAe,QAAkD;AACxE,MAAI,WAAW,UAAW,QAAO;AACjC,MAAI,WAAW,WAAY,QAAO;AAClC,SAAO;AACT;AAEA,SAASA,aAAY,QAAqC;AACxD,MAAI,WAAW,OAAQ,QAAO;AAC9B,MAAI,WAAW,WAAY,QAAO;AAClC,SAAO;AACT;AAEA,SAAS,gBAAgB,WAA+D;AACtF,MAAI,cAAc,OAAW,QAAO;AACpC,MAAI,aAAa,IAAM,QAAO;AAC9B,MAAI,aAAa,IAAK,QAAO;AAC7B,SAAO;AACT;AAEA,SAAS,uBAAuB,WAA2C;AACzE,QAAM,WAAW,gBAAgB,SAAS;AAC1C,SAAO;AAAA,IACL;AAAA,IACA,WAAW,yCAAyC,QAAQ,KAAK;AAAA,EACnE,EACG,OAAO,OAAO,EACd,KAAK,GAAG;AACb;AAEA,SAAS,iBAAiB,OAAyD;AACjF,MAAI,CAAC,MAAO,QAAO;AACnB,SAAO,QAAQ,IAAI,WAAW;AAChC;AAEA,SAAS,cAAc,WAA2C;AAChE,SAAO,cAAc,SAAY,QAAQ,GAAG,SAAS;AACvD;AAEA,SAAS,oBAAoB,OAA4C;AACvE,SAAO,OAAO,SAAS,CAAC;AAC1B;AAEA,SAAS,qBAAqB,OAAe,cAAsB;AACjE,SAAO,QAAQ,GAAG,YAAY,IAAI,KAAK,aAAa;AACtD;AAEA,SAAS,aAAa,OAAe,eAAuB,cAAsB;AAChF,MAAI,CAAC,MAAO,QAAO,8BAA8B,aAAa;AAC9D,SAAO,GAAG,YAAY,OAAO,KAAK,0BAA0B,aAAa,SACvE,kBAAkB,IAAI,aAAa,WACrC;AACF;;;ACzLI,IAAAC,uBAAA;AAFG,SAAS,oBAAoB,EAAE,UAAU,WAAW,SAAS,GAAG,MAAM,GAA6B;AACxG,SACE;AAAA,IAAC;AAAA;AAAA,MACE,GAAG;AAAA,MACJ,UACE,YAAY;AAAA,QACV,EAAE,IAAI,OAAO,MAAM,eAAe,QAAQ,WAAW,WAAW,GAAG;AAAA,QACnE,EAAE,IAAI,WAAW,MAAM,gBAAgB,QAAQ,YAAY,WAAW,KAAK,gBAAgB,EAAE;AAAA,QAC7F,EAAE,IAAI,WAAW,MAAM,WAAW,QAAQ,WAAW,WAAW,GAAG;AAAA,MACrE;AAAA,MAEF;AAAA,MACA;AAAA,MACA,sBAAmB;AAAA;AAAA,EACrB;AAEJ;;;AfLO,IAAM,sBAAsB;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;","names":["import_core","import_jsx_runtime","statusSeverity","import_jsx_runtime","import_core","import_jsx_runtime","formatPercent","React","import_core","import_data","import_jsx_runtime","statusSeverity","statusLabel","import_charts","import_jsx_runtime","average","React","import_core","import_data","import_jsx_runtime","React","import_core","import_data","import_jsx_runtime","formatEntryCount","import_core","import_jsx_runtime","import_core","import_jsx_runtime","formatNumber","import_forms","import_jsx_runtime","React","import_core","import_data","import_jsx_runtime","React","import_core","import_data","import_jsx_runtime","formatPercent","formatNumber","React","import_core","import_data","import_jsx_runtime","statusLabel","import_jsx_runtime"]}