From 30937de5af10dc41926837f0acb797da1a73d6e1 Mon Sep 17 00:00:00 2001 From: Ulysse Bouchet Date: Wed, 7 Oct 2026 12:47:50 +0200 Subject: [PATCH 01/21] refactor: let each solver adapter declare its dashboard tabs Closes #38 --- CHANGELOG.md | 3 ++- csauto/solvers/base.py | 27 +++++++++++------------- csauto/solvers/code_aster.py | 1 + csauto/solvers/code_saturne.py | 9 ++++++++ csauto/solvers/stub.py | 1 + docs/adding-a-solver.md | 38 ++++++++++++++++++++++++---------- docs/architecture.md | 24 +++++++++++---------- tests/unit/test_maintenance.py | 1 + tests/unit/test_solvers.py | 34 ++++++++++++++---------------- 9 files changed, 82 insertions(+), 56 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cf49917..b216547 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,8 +9,9 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/), and this Make the dashboard follow what each solver can actually do: panels and action buttons are now derived from the solver adapter instead of being shown for every solver. ### Changed -- Dashboard panels and action buttons are derived from what the solver adapter implements, rather than declared: a panel appears when the adapter provides what feeds it (`find_residuals_files`, `list_probe_files`, or a non-empty `compare_kinds` / `performance_columns` / `control_actions`), and the Restart, Stop, control and Open GUI controls follow the same rule. Solvers other than code_saturne lose the panels and buttons they could never feed: code_aster and the stub solver now show Status, Compare, Log Tail and Recent Errors only. code_saturne is unchanged. Adapters can no longer declare `dashboard_panels`, which now raises `TypeError` at import time +- Dashboard panels and action buttons are derived from what the solver adapter implements, rather than declared: a panel appears when the adapter provides what feeds it (`find_residuals_files`, `list_probe_files`, or a non-empty `compare_kinds` / `performance_columns` / `control_actions`), and the Restart, Stop, control and Open GUI controls follow the same rule. Solvers other than code_saturne lose the panels and buttons they could never feed: code_aster and the stub solver now show Status, Compare, Log Tail and Recent Errors only. code_saturne is unchanged - `csauto doctor` reports the panels and capabilities derived for the configured solver +- Dashboard tabs are now declared by each solver adapter in `dashboard_panels`, and by nothing else: an adapter may leave out a tab it could feed, and Status, Log Tail and Recent Errors are ordinary entries rather than imposed. A test fails when an adapter declares a tab it cannot feed or an unknown tab name. `capabilities` stays derived. No visible change for any shipped solver ### Fixed - A case whose launch failed outright (no docker or `sbatch` on PATH, an unreadable binary, a rejected `sbatch` submission) stayed `PENDING` forever. `_launch_local` and `_launch_slurm` record `status=FAILED` and then raise to report the failure, but `registry_transaction` skipped its save whenever the body raised, so that write was discarded. The save now runs in a `finally`, which also stops `csauto prepare` from discarding the registry entries of cases it already created on disk when it aborts part way diff --git a/csauto/solvers/base.py b/csauto/solvers/base.py index 8b7d83f..7c252b9 100644 --- a/csauto/solvers/base.py +++ b/csauto/solvers/base.py @@ -45,9 +45,10 @@ class PerfColumn(NamedTuple): CAPABILITY_RESTART = "restart" CAPABILITY_GUI = "gui" -# Panels any run feeds, whatever the solver: status comes from the registry, -# tail and errors from the csauto.stdout / csauto.stderr launcher logs. -ALWAYS_ON_PANELS = ("status", "tail", "errors") +# Panels any run can feed, whatever the solver: status comes from the registry, +# tail and errors from the csauto.stdout / csauto.stderr launcher logs. Every +# other panel is feedable when the capability of the same name is. +GENERIC_PANELS = frozenset({"status", "tail", "errors"}) @runtime_checkable @@ -186,15 +187,17 @@ class SolverAdapterBase(ABC): performance_columns: ClassVar[tuple[PerfColumn, ...]] = () compare_kinds: ClassVar[tuple[CompareKind, ...]] = () control_actions: ClassVar[frozenset[str]] = frozenset() + # Required, no default: the dashboard tabs, in ALL_DASHBOARD_PANELS order. + # tests/unit/test_solvers.py checks every declared tab is feedable. + dashboard_panels: ClassVar[tuple[str, ...]] def __init_subclass__(cls, **kwargs: Any) -> None: super().__init_subclass__(**kwargs) - for reserved in ("dashboard_panels", "capabilities"): - if reserved in cls.__dict__: - raise TypeError( - f"{cls.__name__} must not declare {reserved!r}: it is derived " - f"from what the adapter implements (see docs/adding-a-solver.md)." - ) + if "capabilities" in cls.__dict__: + raise TypeError( + f"{cls.__name__} must not declare 'capabilities': it is derived " + f"from what the adapter implements (see docs/adding-a-solver.md)." + ) def _provides(self, method_name: str) -> bool: """True when the adapter defines its own version instead of the empty base default.""" @@ -224,12 +227,6 @@ def capabilities(self) -> frozenset[str]: caps.add(CAPABILITY_CONTROL) return frozenset(caps) - @property - def dashboard_panels(self) -> tuple[str, ...]: - """Feedable panels, in ALL_DASHBOARD_PANELS display order.""" - caps = self.capabilities - return tuple(panel for panel in ALL_DASHBOARD_PANELS if panel in ALWAYS_ON_PANELS or panel in caps) - @property def default_compare_kind(self) -> str: """The first declared compare kind, so CLI/API defaults follow the UI order.""" diff --git a/csauto/solvers/code_aster.py b/csauto/solvers/code_aster.py index f06278d..b6bd234 100644 --- a/csauto/solvers/code_aster.py +++ b/csauto/solvers/code_aster.py @@ -34,6 +34,7 @@ class CodeAsterAdapter(SolverAdapterBase): "MESH", "RESU", ) + dashboard_panels: ClassVar[tuple[str, ...]] = ("status", "compare", "tail", "errors") # doe_row.csv is written into every generated case by the generic DOE code, # so it is comparable whatever the solver. The .export file would be a better # candidate but its name varies per case (find_setup_file globs *.export) diff --git a/csauto/solvers/code_saturne.py b/csauto/solvers/code_saturne.py index db70989..fe5292f 100644 --- a/csauto/solvers/code_saturne.py +++ b/csauto/solvers/code_saturne.py @@ -103,6 +103,15 @@ class CodeSaturneAdapter(SolverAdapterBase): PerfColumn("mpi_ranks", "MPI Ranks", "int"), PerfColumn("threads", "Threads", "int"), ) + dashboard_panels: ClassVar[tuple[str, ...]] = ( + "status", + "residuals", + "probes", + "performance", + "compare", + "tail", + "errors", + ) compare_kinds: ClassVar[tuple[CompareKind, ...]] = ( CompareKind("setup.xml", "setup.xml"), CompareKind("doe_row.csv", "doe_row.csv"), diff --git a/csauto/solvers/stub.py b/csauto/solvers/stub.py index be5c581..b883444 100644 --- a/csauto/solvers/stub.py +++ b/csauto/solvers/stub.py @@ -43,6 +43,7 @@ class StubAdapter(SolverAdapterBase): template_input_names: ClassVar[frozenset[str]] = frozenset({STUB_SETUP_FILENAME}) anomaly_file_names: ClassVar[tuple[str, ...]] = ("csauto.stderr", "csauto.stdout", STUB_LOG_FILENAME) cleanup_log_names: ClassVar[frozenset[str]] = frozenset({STUB_LOG_FILENAME, "csauto.stdout", "csauto.stderr"}) + dashboard_panels: ClassVar[tuple[str, ...]] = ("status", "compare", "tail", "errors") compare_kinds: ClassVar[tuple[CompareKind, ...]] = (CompareKind(STUB_SETUP_FILENAME, STUB_SETUP_FILENAME),) control_actions: ClassVar[frozenset[str]] = frozenset({"stop"}) diff --git a/docs/adding-a-solver.md b/docs/adding-a-solver.md index 371c5a6..7916f86 100644 --- a/docs/adding-a-solver.md +++ b/docs/adding-a-solver.md @@ -36,6 +36,7 @@ These class attributes have no default and must be set: | `container_root` | `"/home/code_saturne"` | bind-mount target inside containers | | `default_docker_image` | `"simvia/code_saturne"` | `docker` runtime default | | `results_dirname` | `"RESU"` | per-case results directory | +| `dashboard_panels` | `("status", "residuals", ...)` | the dashboard tabs, see below | Then declare the conventions that differ from the base defaults: @@ -55,11 +56,31 @@ Then declare the conventions that differ from the base defaults: do not declare those either. - `control_actions` — the live-control directives your `apply_control` implements (code_saturne declares `stop`, `extend`, `checkpoint`, `flush`). -## Dashboard panels are derived, not declared +## Dashboard panels are declared, capabilities are derived -You never declare which panels your solver gets: `dashboard_panels` and -`capabilities` are computed from what your adapter actually provides, and -declaring either of them raises `TypeError` at import time. +Your adapter lists its dashboard tabs in `dashboard_panels`, in display order +(`status`, `residuals`, `probes`, `performance`, `compare`, `tail`, `errors`). +Nothing else changes that list: not the runtime, not the execution backend, +not a setting. A tab whose data the selected case does not have yet shows its +empty state rather than disappearing. + +Each tab you list must be feedable, and `tests/unit/test_solvers.py` fails +otherwise (an unknown tab name fails too): + +| Tab | Fed by | +|---|---| +| `status` | the registry, always feedable | +| `tail`, `errors` | the `csauto.stdout` / `csauto.stderr` launcher logs and `anomaly_file_names`, always feedable | +| `residuals` | an override of `find_residuals_files` | +| `probes` | an override of `list_probe_files` | +| `performance` | a non-empty `performance_columns` | +| `compare` | a non-empty `compare_kinds` | + +You may leave out a tab you could feed: listing it is your choice. + +`capabilities` stays derived from what your adapter provides, and declaring it +raises `TypeError` at import time. It drives the action buttons and the API +checks: | Capability | Granted when your adapter | |---|---| @@ -71,13 +92,8 @@ declaring either of them raises `TypeError` at import time. | `performance` | declares a non-empty `performance_columns` | | `control` | declares a non-empty `control_actions` | -The `status`, `tail` and `errors` panels are always present: they are fed by the -registry and by the `csauto.stdout` / `csauto.stderr` launcher logs, which exist -for every solver. - -Implement what your solver can feed and the panel appears; implement nothing and -the panel, along with its action buttons, is absent from the dashboard and -refused by the API with a 400. Run `csauto doctor RUNS` to see what was derived: +An action your adapter cannot perform is absent from the dashboard and refused +by the API with a 400. Run `csauto doctor RUNS` to see both lists: ``` [OK] solver code_aster: panels status, compare, tail, errors diff --git a/docs/architecture.md b/docs/architecture.md index a50bf97..f3a57fb 100644 --- a/docs/architecture.md +++ b/docs/architecture.md @@ -73,17 +73,19 @@ An adapter supplies: file catalog (`locate_case_file`), results listing, cleanup log names. - **Analytics**: residuals/probes/performance discovery and parsing (SVG rendering stays generic in `svg_utils.py`). -- **Dashboard surface**: derived, not declared. `capabilities` is computed from - what the adapter provides (an overridden `find_residuals_files`, - `list_probe_files`, `build_restart_args` or `gui_argv`, or a non-empty - `compare_kinds`, `performance_columns` or `control_actions`), and - `dashboard_panels` follows from it. Both are served to the frontend by - `/api/app_config` and enforced server side by - `FastAPIContext.require_capability`. An adapter that declares either attribute - raises `TypeError` at import time. `performance_columns` also drives the - Timing Snapshot columns and the performance CSV export keys, `compare_kinds` - the compare panel's file list (first entry is the default), and - `anomaly_file_names` doubles as the Recent Errors file list. +- **Dashboard surface**: the adapter declares its tabs in `dashboard_panels`, + and nothing else (runtime, backend, settings) changes that list; a test + checks each declared tab is feedable. `capabilities` is derived from what the + adapter provides (an overridden `find_residuals_files`, `list_probe_files`, + `build_restart_args` or `gui_argv`, or a non-empty `compare_kinds`, + `performance_columns` or `control_actions`) and drives the action buttons. + Both are served to the frontend by `/api/app_config`, and capabilities are + enforced server side by `FastAPIContext.require_capability`. An adapter that + declares `capabilities` raises `TypeError` at import time. + `performance_columns` also drives the Timing Snapshot columns and the + performance CSV export keys, `compare_kinds` the compare panel's file list + (first entry is the default), and `anomaly_file_names` doubles as the Recent + Errors file list. - **Control**: `apply_control` for live stop/extend/checkpoint/flush directives, with `control_actions` declaring what the solver supports. - **Doctor**: `doctor_checks` for solver-specific environment validation. diff --git a/tests/unit/test_maintenance.py b/tests/unit/test_maintenance.py index 746937c..0f38602 100644 --- a/tests/unit/test_maintenance.py +++ b/tests/unit/test_maintenance.py @@ -501,6 +501,7 @@ class BareAdapter(SolverAdapterBase): container_root = "/bare" default_docker_image = "" results_dirname = "OUT" + dashboard_panels = ("status", "tail", "errors") def run_argv(self, case_path, nprocs, nt, run_args=None): return [] diff --git a/tests/unit/test_solvers.py b/tests/unit/test_solvers.py index 6dd4b36..563c2b5 100644 --- a/tests/unit/test_solvers.py +++ b/tests/unit/test_solvers.py @@ -339,32 +339,30 @@ def test_stub_capabilities_cover_compare_and_control() -> None: assert adapter.performance_fields == () -def test_always_on_panels_are_present_for_every_adapter() -> None: +def test_every_adapter_declares_feedable_panels_in_display_order() -> None: + """Each adapter chooses its tabs; a tab it cannot feed, or an unknown name, is a bug.""" from csauto.solvers import available_solvers, get_solver_adapter - from csauto.solvers.base import ALWAYS_ON_PANELS + from csauto.solvers.base import ALL_DASHBOARD_PANELS, GENERIC_PANELS for name in available_solvers(): - panels = get_solver_adapter(name).dashboard_panels - assert set(ALWAYS_ON_PANELS) <= set(panels), name + adapter = get_solver_adapter(name) + assert "dashboard_panels" in type(adapter).__dict__, f"{name} must declare dashboard_panels" + panels = adapter.dashboard_panels + assert set(panels) <= set(ALL_DASHBOARD_PANELS), f"{name} declares unknown panels" + assert list(panels) == [p for p in ALL_DASHBOARD_PANELS if p in panels], f"{name} panels out of order" + for panel in panels: + assert panel in GENERIC_PANELS or panel in adapter.capabilities, f"{name} cannot feed {panel!r}" -def test_dashboard_panels_follow_declaration_order() -> None: - """Panels are ordered by ALL_DASHBOARD_PANELS, not by capability name.""" - from csauto.solvers.base import ALL_DASHBOARD_PANELS +def test_adapter_may_leave_out_a_panel_it_could_feed() -> None: from csauto.solvers.stub import StubAdapter - panels = StubAdapter().dashboard_panels - assert list(panels) == [p for p in ALL_DASHBOARD_PANELS if p in panels] + class QuietStub(StubAdapter): + dashboard_panels = ("status", "tail") - -def test_adapter_cannot_declare_dashboard_panels() -> None: - """A class attribute would shadow the derived property and silently reintroduce the bug.""" - from csauto.solvers.base import SolverAdapterBase - - with pytest.raises(TypeError, match="must not declare 'dashboard_panels'"): - - class BadAdapter(SolverAdapterBase): - dashboard_panels = ("status",) + adapter = QuietStub() + assert "compare" in adapter.capabilities + assert adapter.dashboard_panels == ("status", "tail") def test_adapter_cannot_declare_capabilities() -> None: From c6839b1890a30d6f5a996d310bff16d49b0be6a5 Mon Sep 17 00:00:00 2001 From: Ulysse Bouchet Date: Wed, 7 Oct 2026 12:51:19 +0200 Subject: [PATCH 02/21] refactor: wire the API layer to adapter-declared log files The Log Tail default and file priority come from the new tail_file_names adapter attribute, job id discovery scans anomaly_file_names, and /api/probes takes scope=probes instead of the code_saturne directory name. Closes #27 --- CHANGELOG.md | 1 + csauto/fastapi_routes/case_data.py | 15 +- csauto/fastapi_routes/observability.py | 2 + csauto/solvers/base.py | 3 + csauto/solvers/code_aster.py | 1 + csauto/solvers/code_saturne.py | 8 + csauto/solvers/stub.py | 1 + csauto/web_support.py | 2 +- docs/adding-a-solver.md | 6 +- docs/api.md | 4 +- .../dist/_app/immutable/chunks/BI00lc_u.js | 1 - .../dist/_app/immutable/chunks/mtaKwlL3.js | 1 + .../{app.Cn2ZzZiT.js => app.BUomxnpd.js} | 4 +- .../_app/immutable/entry/start.Ca27w5R7.js | 1 - .../_app/immutable/entry/start.DAMzTXjZ.js | 1 + .../nodes/{1.DU6Ijmpv.js => 1.ccHAett1.js} | 2 +- .../dist/_app/immutable/nodes/2.DMd27nZw.js | 1190 +++++++++++++++++ .../dist/_app/immutable/nodes/2.DQxkgq4x.js | 1190 ----------------- frontend/dist/_app/version.json | 2 +- frontend/dist/index.html | 12 +- frontend/src/lib/actions/probeLoader.ts | 4 +- frontend/src/lib/api/endpoints.ts | 2 +- frontend/src/lib/api/types.ts | 1 + .../lib/components/compare/CompareCard.svelte | 7 +- .../components/errors/RecentErrorsCard.svelte | 10 +- .../lib/components/probes/ProbesCard.svelte | 2 +- .../components/probes/TimeProbePanel.svelte | 2 +- .../lib/components/tail/LogTailCard.svelte | 21 +- tests/web/test_api.py | 29 + 29 files changed, 1281 insertions(+), 1244 deletions(-) delete mode 100644 frontend/dist/_app/immutable/chunks/BI00lc_u.js create mode 100644 frontend/dist/_app/immutable/chunks/mtaKwlL3.js rename frontend/dist/_app/immutable/entry/{app.Cn2ZzZiT.js => app.BUomxnpd.js} (94%) delete mode 100644 frontend/dist/_app/immutable/entry/start.Ca27w5R7.js create mode 100644 frontend/dist/_app/immutable/entry/start.DAMzTXjZ.js rename frontend/dist/_app/immutable/nodes/{1.DU6Ijmpv.js => 1.ccHAett1.js} (78%) create mode 100644 frontend/dist/_app/immutable/nodes/2.DMd27nZw.js delete mode 100644 frontend/dist/_app/immutable/nodes/2.DQxkgq4x.js diff --git a/CHANGELOG.md b/CHANGELOG.md index b216547..1e7aa71 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ Make the dashboard follow what each solver can actually do: panels and action bu ### Changed - Dashboard panels and action buttons are derived from what the solver adapter implements, rather than declared: a panel appears when the adapter provides what feeds it (`find_residuals_files`, `list_probe_files`, or a non-empty `compare_kinds` / `performance_columns` / `control_actions`), and the Restart, Stop, control and Open GUI controls follow the same rule. Solvers other than code_saturne lose the panels and buttons they could never feed: code_aster and the stub solver now show Status, Compare, Log Tail and Recent Errors only. code_saturne is unchanged - `csauto doctor` reports the panels and capabilities derived for the configured solver +- `/api/probes` takes `scope=probes` instead of `scope=monitoring` (a code_saturne directory name); `profiles` is unchanged. `/api/tail` defaults to the solver's own main log instead of `listing`, and the Log Tail file priority comes from the new adapter attribute `tail_file_names`, exposed as `tail_files` in `/api/app_config` - Dashboard tabs are now declared by each solver adapter in `dashboard_panels`, and by nothing else: an adapter may leave out a tab it could feed, and Status, Log Tail and Recent Errors are ordinary entries rather than imposed. A test fails when an adapter declares a tab it cannot feed or an unknown tab name. `capabilities` stays derived. No visible change for any shipped solver ### Fixed diff --git a/csauto/fastapi_routes/case_data.py b/csauto/fastapi_routes/case_data.py index ced5bd8..9be740a 100644 --- a/csauto/fastapi_routes/case_data.py +++ b/csauto/fastapi_routes/case_data.py @@ -24,7 +24,7 @@ def register_case_data_routes(app: Any, ctx: Any, components: dict[str, Any]) -> class TailQuery(BaseModel): case: str | None = None - file: str = "listing" + file: str | None = None n: int = Field(default=200, ge=1) class ResuFilesQuery(BaseModel): @@ -33,7 +33,7 @@ class ResuFilesQuery(BaseModel): class ProbesQuery(BaseModel): case: list[str] | None = None - scope: str = "monitoring" + scope: str = "probes" limit: int = Field(default=200, ge=1) class ProbePositionQuery(BaseModel): @@ -61,14 +61,15 @@ def api_tail( ctx.require_auth(x_csauto_token, authorization) case_id = ctx.validate_case(query.case) case_dir = ctx.runs_dir / case_id - file_path = ctx.adapter.locate_case_file(case_dir, query.file) if case_dir.is_dir() else None + file_name = query.file or ctx.adapter.tail_file_names[0] + file_path = ctx.adapter.locate_case_file(case_dir, file_name) if case_dir.is_dir() else None if not file_path: - raise ctx.http_exception_cls(status_code=404, detail=f"File {query.file} not found for {case_id}") + raise ctx.http_exception_cls(status_code=404, detail=f"File {file_name} not found for {case_id}") log_case_action( ctx.runs_dir, case_id, "tail", - {"file": query.file, "lines": query.n}, + {"file": file_name, "lines": query.n}, actor=request.client.host if request.client else None, ) return PlainTextResponse("".join(read_tail_lines(file_path, query.n))) @@ -102,8 +103,8 @@ def api_probes( ) -> dict[str, Any]: ctx.require_auth(x_csauto_token, authorization) case_ids = ctx.validate_cases(query.case) - scope_value = (query.scope or "monitoring").strip().lower() - if scope_value not in ("monitoring", "profiles"): + scope_value = query.scope.strip().lower() + if scope_value not in ("probes", "profiles"): raise ctx.http_exception_cls(status_code=400, detail="Invalid scope parameter") seen: set[str] = set() files: list[str] = [] diff --git a/csauto/fastapi_routes/observability.py b/csauto/fastapi_routes/observability.py index d4ffab1..1953e6f 100644 --- a/csauto/fastapi_routes/observability.py +++ b/csauto/fastapi_routes/observability.py @@ -86,6 +86,7 @@ class AppConfigModel(BaseModel): capabilities: list[str] compare_kinds: list[CompareKindModel] error_files: list[str] + tail_files: list[str] control_actions: list[str] class RecentErrorItemModel(BaseModel): @@ -149,6 +150,7 @@ def api_app_config( "capabilities": sorted(ctx.adapter.capabilities), "compare_kinds": [{"value": kind.value, "label": kind.label} for kind in ctx.adapter.compare_kinds], "error_files": list(ctx.adapter.anomaly_file_names), + "tail_files": list(ctx.adapter.tail_file_names), "control_actions": sorted(ctx.adapter.control_actions), } diff --git a/csauto/solvers/base.py b/csauto/solvers/base.py index 7c252b9..4db8005 100644 --- a/csauto/solvers/base.py +++ b/csauto/solvers/base.py @@ -64,6 +64,7 @@ class SolverAdapter(Protocol): shared_dir_names: tuple[str, ...] template_input_names: frozenset[str] anomaly_file_names: tuple[str, ...] + tail_file_names: tuple[str, ...] cleanup_log_names: frozenset[str] performance_fields: tuple[str, ...] performance_columns: tuple[PerfColumn, ...] @@ -183,6 +184,8 @@ class SolverAdapterBase(ABC): shared_dir_names: ClassVar[tuple[str, ...]] = () template_input_names: ClassVar[frozenset[str]] = frozenset() anomaly_file_names: ClassVar[tuple[str, ...]] = ("csauto.stderr", "csauto.stdout") + # Log Tail candidates, best first; the first entry is the /api/tail default. + tail_file_names: ClassVar[tuple[str, ...]] = ("csauto.stdout", "csauto.stderr") cleanup_log_names: ClassVar[frozenset[str]] = frozenset({"csauto.stdout", "csauto.stderr"}) performance_columns: ClassVar[tuple[PerfColumn, ...]] = () compare_kinds: ClassVar[tuple[CompareKind, ...]] = () diff --git a/csauto/solvers/code_aster.py b/csauto/solvers/code_aster.py index b6bd234..f8365be 100644 --- a/csauto/solvers/code_aster.py +++ b/csauto/solvers/code_aster.py @@ -35,6 +35,7 @@ class CodeAsterAdapter(SolverAdapterBase): "RESU", ) dashboard_panels: ClassVar[tuple[str, ...]] = ("status", "compare", "tail", "errors") + tail_file_names: ClassVar[tuple[str, ...]] = ("run_solver.log", "csauto.stdout", "csauto.stderr") # doe_row.csv is written into every generated case by the generic DOE code, # so it is comparable whatever the solver. The .export file would be a better # candidate but its name varies per case (find_setup_file globs *.export) diff --git a/csauto/solvers/code_saturne.py b/csauto/solvers/code_saturne.py index fe5292f..5c46067 100644 --- a/csauto/solvers/code_saturne.py +++ b/csauto/solvers/code_saturne.py @@ -84,6 +84,14 @@ class CodeSaturneAdapter(SolverAdapterBase): shared_dir_names: ClassVar[tuple[str, ...]] = ("MESH", "POST") template_input_names: ClassVar[frozenset[str]] = frozenset({"setup.xml", "run.cfg"}) anomaly_file_names: ClassVar[tuple[str, ...]] = ANOMALY_FILES_DEFAULT + tail_file_names: ClassVar[tuple[str, ...]] = ( + "run_solver.log", + "listing", + "run_status.running", + "csauto.stdout", + "csauto.stderr", + "performance.log", + ) cleanup_log_names: ClassVar[frozenset[str]] = frozenset( { "run_solver.log", diff --git a/csauto/solvers/stub.py b/csauto/solvers/stub.py index b883444..21d9783 100644 --- a/csauto/solvers/stub.py +++ b/csauto/solvers/stub.py @@ -42,6 +42,7 @@ class StubAdapter(SolverAdapterBase): results_dirname: ClassVar[str] = "OUT" template_input_names: ClassVar[frozenset[str]] = frozenset({STUB_SETUP_FILENAME}) anomaly_file_names: ClassVar[tuple[str, ...]] = ("csauto.stderr", "csauto.stdout", STUB_LOG_FILENAME) + tail_file_names: ClassVar[tuple[str, ...]] = (STUB_LOG_FILENAME, "csauto.stdout", "csauto.stderr") cleanup_log_names: ClassVar[frozenset[str]] = frozenset({STUB_LOG_FILENAME, "csauto.stdout", "csauto.stderr"}) dashboard_panels: ClassVar[tuple[str, ...]] = ("status", "compare", "tail", "errors") compare_kinds: ClassVar[tuple[CompareKind, ...]] = (CompareKind(STUB_SETUP_FILENAME, STUB_SETUP_FILENAME),) diff --git a/csauto/web_support.py b/csauto/web_support.py index 1ec7daf..2502e7a 100644 --- a/csauto/web_support.py +++ b/csauto/web_support.py @@ -185,7 +185,7 @@ def discover_job_id(case_dir: Path, job_id_patterns: Sequence[re.Pattern[str]], seen: set[str] = set() candidates: list[Path] = [] - for name in ("csauto.stdout", "csauto.stderr", "run_solver.log", "listing"): + for name in adapter.anomaly_file_names: file_path = adapter.locate_case_file(case_dir, name) if not file_path or not file_path.is_file(): continue diff --git a/docs/adding-a-solver.md b/docs/adding-a-solver.md index 7916f86..c0a4247 100644 --- a/docs/adding-a-solver.md +++ b/docs/adding-a-solver.md @@ -47,6 +47,8 @@ Then declare the conventions that differ from the base defaults: - `cleanup_log_names` — logs the Clean action may truncate. - `anomaly_file_names` — launcher/solver logs scanned for anomalies, and the file list offered by the Recent Errors panel. +- `tail_file_names` — logs the Log Tail panel prefers, best first. The first + entry is the `/api/tail` default file. - `compare_kinds` — `CompareKind(value, label)` entries that populate the compare panel's file selector. The first entry is the default; `default_compare_kind` is derived from it, so do not declare it yourself. @@ -100,8 +102,8 @@ by the API with a 400. Run `csauto doctor RUNS` to see both lists: [OK] solver code_aster: capabilities compare ``` -The web UI reads `panels`, `capabilities`, `control_actions`, `compare_kinds` -and `anomaly_file_names` from `/api/app_config`, and the timing columns from +The web UI reads `panels`, `capabilities`, `control_actions`, `compare_kinds`, +`anomaly_file_names` and `tail_file_names` from `/api/app_config`, and the timing columns from `/api/perf`, so these declarations reshape the dashboard without any frontend change. diff --git a/docs/api.md b/docs/api.md index 17d469f..7979402 100644 --- a/docs/api.md +++ b/docs/api.md @@ -196,7 +196,7 @@ Purpose: Query parameters: - `case` (required) -- `file` (optional, default `listing`) +- `file` (optional, default: the first entry of the solver's `tail_files`, `run_solver.log` for code_saturne) - `n` (optional int, default `200`) Response content-type: @@ -241,7 +241,7 @@ Purpose: Query parameters: - `case` (required) -- `scope` (optional): `monitoring` (default) or `profiles` +- `scope` (optional): `probes` (default) or `profiles` - `limit` (optional int, default `200`) Response: diff --git a/frontend/dist/_app/immutable/chunks/BI00lc_u.js b/frontend/dist/_app/immutable/chunks/BI00lc_u.js deleted file mode 100644 index 4b090d1..0000000 --- a/frontend/dist/_app/immutable/chunks/BI00lc_u.js +++ /dev/null @@ -1 +0,0 @@ -var te=t=>{throw TypeError(t)};var je=(t,e,n)=>e.has(t)||te("Cannot "+n);var v=(t,e,n)=>(je(t,e,"read from private field"),n?n.call(t):e.get(t)),U=(t,e,n)=>e.has(t)?te("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(t):e.set(t,n);import{bf as Ut,bg as Ne,aK as T,o as I,$ as O,aJ as mt,bh as qe}from"./VJhVTb1A.js";import{o as ee}from"./Cz6m6K8p.js";const B=[];function Dt(t,e=Ut){let n=null;const a=new Set;function r(o){if(Ne(t,o)&&(t=o,n)){const l=!B.length;for(const c of a)c[1](),B.push(c,t);if(l){for(let c=0;c{a.delete(c),a.size===0&&n&&(n(),n=null)}}return{set:r,update:i,subscribe:s}}class Vt{constructor(e,n){this.status=e,typeof n=="string"?this.body={message:n}:n?this.body=n:this.body={message:`Error: ${e}`}}toString(){return JSON.stringify(this.body)}}class Kt{constructor(e,n){this.status=e,this.location=n}}class Bt extends Error{constructor(e,n,a){super(a),this.status=e,this.text=n}}new URL("sveltekit-internal://");function De(t,e){return t==="/"||e==="ignore"?t:e==="never"?t.endsWith("/")?t.slice(0,-1):t:e==="always"&&!t.endsWith("/")?t+"/":t}function Ve(t){return t.split("%25").map(decodeURI).join("%25")}function Ke(t){for(const e in t)t[e]=decodeURIComponent(t[e]);return t}function Tt({href:t}){return t.split("#")[0]}function Be(...t){let e=5381;for(const n of t)if(typeof n=="string"){let a=n.length;for(;a;)e=e*33^n.charCodeAt(--a)}else if(ArrayBuffer.isView(n)){const a=new Uint8Array(n.buffer,n.byteOffset,n.byteLength);let r=a.length;for(;r;)e=e*33^a[--r]}else throw new TypeError("value must be a string or TypedArray");return(e>>>0).toString(36)}new TextEncoder;new TextDecoder;function Me(t){const e=atob(t),n=new Uint8Array(e.length);for(let a=0;a((t instanceof Request?t.method:(e==null?void 0:e.method)||"GET")!=="GET"&&H.delete(Mt(t)),ze(t,e));const H=new Map;function Fe(t,e){const n=Mt(t,e),a=document.querySelector(n);if(a!=null&&a.textContent){a.remove();let{body:r,...i}=JSON.parse(a.textContent);const s=a.getAttribute("data-ttl");return s&&H.set(n,{body:r,init:i,ttl:1e3*Number(s)}),a.getAttribute("data-b64")!==null&&(r=Me(r)),Promise.resolve(new Response(r,i))}return window.fetch(t,e)}function Ge(t,e,n){if(H.size>0){const a=Mt(t,n),r=H.get(a);if(r){if(performance.now(){const r=/^\[\.\.\.(\w+)(?:=(\w+))?\]$/.exec(a);if(r)return e.push({name:r[1],matcher:r[2],optional:!1,rest:!0,chained:!0}),"(?:/([^]*))?";const i=/^\[\[(\w+)(?:=(\w+))?\]\]$/.exec(a);if(i)return e.push({name:i[1],matcher:i[2],optional:!0,rest:!1,chained:!0}),"(?:/([^/]+))?";if(!a)return;const s=a.split(/\[(.+?)\](?!\])/);return"/"+s.map((l,c)=>{if(c%2){if(l.startsWith("x+"))return It(String.fromCharCode(parseInt(l.slice(2),16)));if(l.startsWith("u+"))return It(String.fromCharCode(...l.slice(2).split("-").map(m=>parseInt(m,16))));const d=We.exec(l),[,u,w,p,f]=d;return e.push({name:p,matcher:f,optional:!!u,rest:!!w,chained:w?c===1&&s[0]==="":!1}),w?"([^]*?)":u?"([^/]*)?":"([^/]+?)"}return It(l)}).join("")}).join("")}/?$`),params:e}}function Ye(t){return t!==""&&!/^\([^)]+\)$/.test(t)}function He(t){return t.slice(1).split("/").filter(Ye)}function Xe(t,e,n){const a={},r=t.slice(1),i=r.filter(o=>o!==void 0);let s=0;for(let o=0;od).join("/"),s=0),c===void 0)if(l.rest)c="";else continue;if(!l.matcher||n[l.matcher](c)){a[l.name]=c;const d=e[o+1],u=r[o+1];d&&!d.rest&&d.optional&&u&&l.chained&&(s=0),!d&&!u&&Object.keys(a).length===i.length&&(s=0);continue}if(l.optional&&l.chained){s++;continue}return}if(!s)return a}function It(t){return t.normalize().replace(/[[\]]/g,"\\$&").replace(/%/g,"%25").replace(/\//g,"%2[Ff]").replace(/\?/g,"%3[Ff]").replace(/#/g,"%23").replace(/[.*+?^${}()|\\]/g,"\\$&")}function Qe({nodes:t,server_loads:e,dictionary:n,matchers:a}){const r=new Set(e);return Object.entries(n).map(([o,[l,c,d]])=>{const{pattern:u,params:w}=Je(o),p={id:o,exec:f=>{const m=u.exec(f);if(m)return Xe(m,w,a)},errors:[1,...d||[]].map(f=>t[f]),layouts:[0,...c||[]].map(s),leaf:i(l)};return p.errors.length=p.layouts.length=Math.max(p.errors.length,p.layouts.length),p});function i(o){const l=o<0;return l&&(o=~o),[l,t[o]]}function s(o){return o===void 0?o:[r.has(o),t[o]]}}function ge(t,e=JSON.parse){try{return e(sessionStorage[t])}catch{}}function ne(t,e,n=JSON.stringify){const a=n(e);try{sessionStorage[t]=a}catch{}}var fe;const A=((fe=globalThis.__sveltekit_cs5p4g)==null?void 0:fe.base)??"";var ue;const Ze=((ue=globalThis.__sveltekit_cs5p4g)==null?void 0:ue.assets)??A??"",tn="1789130391568",me="sveltekit:snapshot",_e="sveltekit:scroll",we="sveltekit:states",en="sveltekit:pageurl",z="sveltekit:history",Q="sveltekit:navigation",q={tap:1,hover:2,viewport:3,eager:4,off:-1,false:-1},zt=location.origin;function ve(t){if(t instanceof URL)return t;let e=document.baseURI;if(!e){const n=document.getElementsByTagName("base");e=n.length?n[0].href:document.URL}return new URL(t,e)}function V(){return{x:pageXOffset,y:pageYOffset}}function M(t,e){return t.getAttribute(`data-sveltekit-${e}`)}const re={...q,"":q.hover};function ye(t){let e=t.assignedSlot??t.parentNode;return(e==null?void 0:e.nodeType)===11&&(e=e.host),e}function be(t,e){for(;t&&t!==e;){if(t.nodeName.toUpperCase()==="A"&&t.hasAttribute("href"))return t;t=ye(t)}}function $t(t,e,n){let a;try{if(a=new URL(t instanceof SVGAElement?t.href.baseVal:t.href,document.baseURI),n&&a.hash.match(/^#[^/]/)){const o=location.hash.split("#")[1]||"/";a.hash=`#${o}${a.hash}`}}catch{}const r=t instanceof SVGAElement?t.target.baseVal:t.target,i=!a||!!r||Rt(a,e,n)||(t.getAttribute("rel")||"").split(/\s+/).includes("external"),s=(a==null?void 0:a.origin)===zt&&t.hasAttribute("download");return{url:a,external:i,target:r,download:s}}function _t(t){let e=null,n=null,a=null,r=null,i=null,s=null,o=t;for(;o&&o!==document.documentElement;)a===null&&(a=M(o,"preload-code")),r===null&&(r=M(o,"preload-data")),e===null&&(e=M(o,"keepfocus")),n===null&&(n=M(o,"noscroll")),i===null&&(i=M(o,"reload")),s===null&&(s=M(o,"replacestate")),o=ye(o);function l(c){switch(c){case"":case"true":return!0;case"off":case"false":return!1;default:return}}return{preload_code:re[a??"off"],preload_data:re[r??"off"],keepfocus:l(e),noscroll:l(n),reload:l(i),replace_state:l(s)}}function ae(t){const e=Dt(t);let n=!0;function a(){n=!0,e.update(s=>s)}function r(s){n=!1,e.set(s)}function i(s){let o;return e.subscribe(l=>{(o===void 0||n&&l!==o)&&s(o=l)})}return{notify:a,set:r,subscribe:i}}const ke={v:()=>{}};function nn(){const{set:t,subscribe:e}=Dt(!1);let n;async function a(){clearTimeout(n);try{const r=await fetch(`${Ze}/_app/version.json`,{headers:{pragma:"no-cache","cache-control":"no-cache"}});if(!r.ok)return!1;const s=(await r.json()).version!==tn;return s&&(t(!0),ke.v(),clearTimeout(n)),s}catch{return!1}}return{subscribe:e,check:a}}function Rt(t,e,n){return t.origin!==zt||!t.pathname.startsWith(e)?!0:n?t.pathname!==location.pathname:!1}function On(t){}const Se=new Set(["load","prerender","csr","ssr","trailingSlash","config"]);[...Se];const rn=new Set([...Se]);[...rn];function an(t){return t.filter(e=>e!=null)}function Ft(t){return t instanceof Vt||t instanceof Bt?t.status:500}function on(t){return t instanceof Bt?t.text:"Internal Error"}let R,Z,Ot;const sn=ee.toString().includes("$$")||/function \w+\(\) \{\}/.test(ee.toString()),oe="a:";var at,ot,st,it,lt,ct,ft,ut,de,dt,he,ht,pe;sn?(R={data:{},form:null,error:null,params:{},route:{id:null},state:{},status:-1,url:new URL(oe)},Z={current:null},Ot={current:!1}):(R=new(de=class{constructor(){U(this,at,T({}));U(this,ot,T(null));U(this,st,T(null));U(this,it,T({}));U(this,lt,T({id:null}));U(this,ct,T({}));U(this,ft,T(-1));U(this,ut,T(new URL(oe)))}get data(){return I(v(this,at))}set data(e){O(v(this,at),e)}get form(){return I(v(this,ot))}set form(e){O(v(this,ot),e)}get error(){return I(v(this,st))}set error(e){O(v(this,st),e)}get params(){return I(v(this,it))}set params(e){O(v(this,it),e)}get route(){return I(v(this,lt))}set route(e){O(v(this,lt),e)}get state(){return I(v(this,ct))}set state(e){O(v(this,ct),e)}get status(){return I(v(this,ft))}set status(e){O(v(this,ft),e)}get url(){return I(v(this,ut))}set url(e){O(v(this,ut),e)}},at=new WeakMap,ot=new WeakMap,st=new WeakMap,it=new WeakMap,lt=new WeakMap,ct=new WeakMap,ft=new WeakMap,ut=new WeakMap,de),Z=new(he=class{constructor(){U(this,dt,T(null))}get current(){return I(v(this,dt))}set current(e){O(v(this,dt),e)}},dt=new WeakMap,he),Ot=new(pe=class{constructor(){U(this,ht,T(!1))}get current(){return I(v(this,ht))}set current(e){O(v(this,ht),e)}},ht=new WeakMap,pe),ke.v=()=>Ot.current=!0);function ln(t){Object.assign(R,t)}const cn=new Set(["icon","shortcut icon","apple-touch-icon"]);let J=null;const j=ge(_e)??{},tt=ge(me)??{},C={url:ae({}),page:ae({}),navigating:Dt(null),updated:nn()};function Gt(t){j[t]=V()}function fn(t,e){let n=t+1;for(;j[n];)delete j[n],n+=1;for(n=e+1;tt[n];)delete tt[n],n+=1}function et(t,e=!1){return e?location.replace(t.href):location.href=t.href,new Promise(()=>{})}async function Ee(){if("serviceWorker"in navigator){const t=await navigator.serviceWorker.getRegistration(A||"/");t&&await t.update()}}function se(){}let Wt,Ct,wt,P,jt,S;const vt=[],yt=[];let y=null;function Nt(){var t;(t=y==null?void 0:y.fork)==null||t.then(e=>e==null?void 0:e.discard()),y=null}const gt=new Map,Re=new Set,un=new Set,X=new Set;let _={branch:[],error:null,url:null},xe=!1,bt=!1,ie=!0,nt=!1,Y=!1,Le=!1,Jt=!1,Ae,k,L,D;const kt=new Set,le=new Map;async function jn(t,e,n){var i,s,o,l,c;(i=globalThis.__sveltekit_cs5p4g)!=null&&i.data&&globalThis.__sveltekit_cs5p4g.data,document.URL!==location.href&&(location.href=location.href),S=t,await((o=(s=t.hooks).init)==null?void 0:o.call(s)),Wt=Qe(t),P=document.documentElement,jt=e,Ct=t.nodes[0],wt=t.nodes[1],Ct(),wt(),k=(l=history.state)==null?void 0:l[z],L=(c=history.state)==null?void 0:c[Q],k||(k=L=Date.now(),history.replaceState({...history.state,[z]:k,[Q]:L},""));const a=j[k];function r(){a&&(history.scrollRestoration="manual",scrollTo(a.x,a.y))}n?(r(),await Rn(jt,n)):(await F({type:"enter",url:ve(S.hash?An(new URL(location.href)):location.href),replace_state:!0}),r()),En()}function dn(){vt.length=0,Jt=!1}function Ue(t){yt.some(e=>e==null?void 0:e.snapshot)&&(tt[t]=yt.map(e=>{var n;return(n=e==null?void 0:e.snapshot)==null?void 0:n.capture()}))}function Te(t){var e;(e=tt[t])==null||e.forEach((n,a)=>{var r,i;(i=(r=yt[a])==null?void 0:r.snapshot)==null||i.restore(n)})}function ce(){Gt(k),ne(_e,j),Ue(L),ne(me,tt)}async function hn(t,e,n,a){let r;e.invalidateAll&&Nt(),await F({type:"goto",url:ve(t),keepfocus:e.keepFocus,noscroll:e.noScroll,replace_state:e.replaceState,state:e.state,redirect_count:n,nav_token:a,accept:()=>{e.invalidateAll&&(Jt=!0,r=[...le.keys()]),e.invalidate&&e.invalidate.forEach(Sn)}}),e.invalidateAll&&mt().then(mt).then(()=>{le.forEach(({resource:i},s)=>{var o;r!=null&&r.includes(s)&&((o=i.refresh)==null||o.call(i))})})}async function pn(t){if(t.id!==(y==null?void 0:y.id)){Nt();const e={};kt.add(e),y={id:t.id,token:e,promise:Oe({...t,preload:e}).then(n=>(kt.delete(e),n.type==="loaded"&&n.state.error&&Nt(),n)),fork:null}}return y.promise}async function Pt(t){var n;const e=(n=await xt(t,!1))==null?void 0:n.route;e&&await Promise.all([...e.layouts,e.leaf].filter(Boolean).map(a=>a[1]()))}async function Ie(t,e,n){var i;const a={params:_.params,route:{id:((i=_.route)==null?void 0:i.id)??null},url:new URL(location.href)};_={...t.state,nav:a};const r=document.querySelector("style[data-sveltekit]");if(r&&r.remove(),Object.assign(R,t.props.page),Ae=new S.root({target:e,props:{...t.props,stores:C,components:yt},hydrate:n,sync:!1,transformError:void 0}),await Promise.resolve(),Te(L),n){const s={from:null,to:{...a,scroll:j[k]??V()},willUnload:!1,type:"enter",complete:Promise.resolve()};X.forEach(o=>o(s))}bt=!0}async function St({url:t,params:e,branch:n,errors:a,status:r,error:i,route:s,form:o}){let l="never";if(A&&(t.pathname===A||t.pathname===A+"/"))l="always";else for(const f of n)(f==null?void 0:f.slash)!==void 0&&(l=f.slash);t.pathname=De(t.pathname,l),t.search=t.search;const c={type:"loaded",state:{url:t,params:e,branch:n,error:i,route:s},props:{constructors:an(n).map(f=>f.node.component),page:Zt(R)}};o!==void 0&&(c.props.form=o);let d={},u=!R,w=0;for(let f=0;fo(new URL(s))))return!0;return!1}function Ht(t,e){return(t==null?void 0:t.type)==="data"?t:(t==null?void 0:t.type)==="skip"?e??null:null}function _n(t,e){if(!t)return new Set(e.searchParams.keys());const n=new Set([...t.searchParams.keys(),...e.searchParams.keys()]);for(const a of n){const r=t.searchParams.getAll(a),i=e.searchParams.getAll(a);r.every(s=>i.includes(s))&&i.every(s=>r.includes(s))&&n.delete(a)}return n}function wn({error:t,url:e,route:n,params:a}){return{type:"loaded",state:{error:t,url:e,route:n,params:a,branch:[]},props:{page:Zt(R),constructors:[]}}}async function Oe({id:t,invalidating:e,url:n,params:a,route:r,preload:i}){if((y==null?void 0:y.id)===t)return kt.delete(y.token),y.promise;const{errors:s,layouts:o,leaf:l}=r,c=[...o,l];s.forEach(h=>h==null?void 0:h().catch(()=>{})),c.forEach(h=>h==null?void 0:h[1]().catch(()=>{}));const d=_.url?t!==Et(_.url):!1,u=_.route?r.id!==_.route.id:!1,w=_n(_.url,n);let p=!1;const f=c.map(async(h,g)=>{var $;if(!h)return;const b=_.branch[g];return h[1]===(b==null?void 0:b.loader)&&!mn(p,u,d,w,($=b.universal)==null?void 0:$.uses,a)?b:(p=!0,Yt({loader:h[1],url:n,params:a,route:r,parent:async()=>{var pt;const N={};for(let K=0;K{});const m=[];for(let h=0;hPromise.resolve({}),server_data_node:Ht(i)}),o={node:await wt(),loader:wt,universal:null,server:null,data:null};return St({url:n,params:r,branch:[s,o],status:t,error:e,errors:[],route:null})}catch(s){if(s instanceof Kt)return hn(new URL(s.location,location.href),{},0);throw s}}async function yn(t){const e=t.href;if(gt.has(e))return gt.get(e);let n;try{const a=(async()=>{let r=await S.hooks.reroute({url:new URL(t),fetch:async(i,s)=>gn(i,s,t).promise})??t;if(typeof r=="string"){const i=new URL(t);S.hash?i.hash=r:i.pathname=r,r=i}return r})();gt.set(e,a),n=await a}catch{gt.delete(e);return}return n}async function xt(t,e){if(t&&!Rt(t,A,S.hash)){const n=await yn(t);if(!n)return;const a=bn(n);for(const r of Wt){const i=r.exec(a);if(i)return{id:Et(t),invalidating:e,route:r,params:Ke(i),url:t}}}}function bn(t){return Ve(S.hash?t.hash.replace(/^#/,"").replace(/[?#].+/,""):t.pathname.slice(A.length))||"/"}function Et(t){return(S.hash?t.hash.replace(/^#/,""):t.pathname)+t.search}function Pe({url:t,type:e,intent:n,delta:a,event:r,scroll:i}){let s=!1;const o=Qt(_,n,t,e,i??null);a!==void 0&&(o.navigation.delta=a),r!==void 0&&(o.navigation.event=r);const l={...o.navigation,cancel:()=>{s=!0,o.reject(new Error("navigation cancelled"))}};return nt||Re.forEach(c=>c(l)),s?null:o}async function F({type:t,url:e,popped:n,keepfocus:a,noscroll:r,replace_state:i,state:s={},redirect_count:o=0,nav_token:l={},accept:c=se,block:d=se,event:u}){var K;const w=D;D=l;const p=await xt(e,!1),f=t==="enter"?Qt(_,p,e,t):Pe({url:e,type:t,delta:n==null?void 0:n.delta,intent:p,scroll:n==null?void 0:n.scroll,event:u});if(!f){d(),D===l&&(D=w);return}const m=k,h=L;c(),nt=!0,bt&&f.navigation.type!=="enter"&&C.navigating.set(Z.current=f.navigation);let g=p&&await Oe(p);if(!g){if(Rt(e,A,S.hash))return await et(e,i);g=await $e(e,{id:null},await rt(new Bt(404,"Not Found",`Not found: ${e.pathname}`),{url:e,params:{},route:{id:null}}),404,i)}if(e=(p==null?void 0:p.url)||e,D!==l)return f.reject(new Error("navigation aborted")),!1;if(g.type==="redirect"){if(o<20){await F({type:t,url:new URL(g.location,e),popped:n,keepfocus:a,noscroll:r,replace_state:i,state:s,redirect_count:o+1,nav_token:l}),f.fulfil(void 0);return}g=await Xt({status:500,error:await rt(new Error("Redirect loop"),{url:e,params:{},route:{id:null}}),url:e,route:{id:null}})}else g.props.page.status>=400&&await C.updated.check()&&(await Ee(),await et(e,i));if(dn(),Gt(m),Ue(h),g.props.page.url.pathname!==e.pathname&&(e.pathname=g.props.page.url.pathname),s=n?n.state:s,!n){const E=i?0:1,G={[z]:k+=E,[Q]:L+=E,[we]:s};(i?history.replaceState:history.pushState).call(history,G,"",e),i||fn(k,L)}const b=p&&(y==null?void 0:y.id)===p.id?y.fork:null;y=null,g.props.page.state=s;let x;if(bt){const E=(await Promise.all(Array.from(un,W=>W(f.navigation)))).filter(W=>typeof W=="function");if(E.length>0){let W=function(){E.forEach(At=>{X.delete(At)})};E.push(W),E.forEach(At=>{X.add(At)})}const G=f.navigation.to;_={...g.state,nav:{params:G.params,route:G.route,url:G.url}},g.props.page&&(g.props.page.url=e);const Lt=b&&await b;Lt?x=Lt.commit():(J=null,Ae.$set(g.props),J&&Object.assign(g.props.page,J),ln(g.props.page),x=(K=qe)==null?void 0:K()),Le=!0}else await Ie(g,jt,!1);const{activeElement:$}=document;await x,await mt(),await mt();let N=null;if(ie){const E=n?n.scroll:r?V():null;E?scrollTo(E.x,E.y):(N=e.hash&&document.getElementById(Ce(e)))?N.scrollIntoView():scrollTo(0,0)}const pt=document.activeElement!==$&&document.activeElement!==document.body;!a&&!pt&&Ln(e,!N),ie=!0,g.props.page&&(J&&Object.assign(g.props.page,J),Object.assign(R,g.props.page)),nt=!1,t==="popstate"&&Te(L),f.fulfil(void 0),f.navigation.to&&(f.navigation.to.scroll=V()),X.forEach(E=>E(f.navigation)),C.navigating.set(Z.current=null)}async function $e(t,e,n,a,r){return t.origin===zt&&t.pathname===location.pathname&&!xe?await Xt({status:a,error:n,url:t,route:e}):await et(t,r)}function kn(){let t,e={element:void 0,href:void 0},n;P.addEventListener("mousemove",o=>{const l=o.target;clearTimeout(t),t=setTimeout(()=>{i(l,q.hover)},20)});function a(o){o.defaultPrevented||i(o.composedPath()[0],q.tap)}P.addEventListener("mousedown",a),P.addEventListener("touchstart",a,{passive:!0});const r=new IntersectionObserver(o=>{for(const l of o)l.isIntersecting&&(Pt(new URL(l.target.href)),r.unobserve(l.target))},{threshold:0});async function i(o,l){const c=be(o,P),d=c===e.element&&(c==null?void 0:c.href)===e.href&&l>=n;if(!c||d)return;const{url:u,external:w,download:p}=$t(c,A,S.hash);if(w||p)return;const f=_t(c),m=u&&Et(_.url)===Et(u);if(!(f.reload||m))if(l<=f.preload_data){e={element:c,href:c.href},n=q.tap;const h=await xt(u,!1);if(!h)return;pn(h)}else l<=f.preload_code&&(e={element:c,href:c.href},n=l,Pt(u))}function s(){r.disconnect();for(const o of P.querySelectorAll("a")){const{url:l,external:c,download:d}=$t(o,A,S.hash);if(c||d)continue;const u=_t(o);u.reload||(u.preload_code===q.viewport&&r.observe(o),u.preload_code===q.eager&&Pt(l))}}X.add(s),s()}function rt(t,e){if(t instanceof Vt)return t.body;const n=Ft(t),a=on(t);return S.hooks.handleError({error:t,event:e,status:n,message:a})??{message:a}}function Sn(t){if(typeof t=="function")vt.push(t);else{const{href:e}=new URL(t,location.href);vt.push(n=>n.href===e)}}function En(){var e;history.scrollRestoration="manual",addEventListener("beforeunload",n=>{let a=!1;if(ce(),!nt){const r=Qt(_,void 0,null,"leave"),i={...r.navigation,cancel:()=>{a=!0,r.reject(new Error("navigation cancelled"))}};Re.forEach(s=>s(i))}a?(n.preventDefault(),n.returnValue=""):history.scrollRestoration="auto"}),addEventListener("visibilitychange",()=>{document.visibilityState==="hidden"&&ce()}),(e=navigator.connection)!=null&&e.saveData||kn(),P.addEventListener("click",async n=>{if(n.button||n.which!==1||n.metaKey||n.ctrlKey||n.shiftKey||n.altKey||n.defaultPrevented)return;const a=be(n.composedPath()[0],P);if(!a)return;const{url:r,external:i,target:s,download:o}=$t(a,A,S.hash);if(!r)return;if(s==="_parent"||s==="_top"){if(window.parent!==window)return}else if(s&&s!=="_self")return;const l=_t(a);if(!(a instanceof SVGAElement)&&r.protocol!==location.protocol&&!(r.protocol==="https:"||r.protocol==="http:")||o)return;const[d,u]=(S.hash?r.hash.replace(/^#/,""):r.href).split("#"),w=d===Tt(location);if(i||l.reload&&(!w||!u)){Pe({url:r,type:"link",event:n})?nt=!0:n.preventDefault();return}if(u!==void 0&&w){const[,p]=_.url.href.split("#");if(p===u){if(n.preventDefault(),u===""||u==="top"&&a.ownerDocument.getElementById("top")===null)scrollTo({top:0});else{const f=a.ownerDocument.getElementById(decodeURIComponent(u));f&&(f.scrollIntoView(),f.focus())}return}if(Y=!0,Gt(k),t(r),!l.replace_state)return;Y=!1}n.preventDefault(),await new Promise(p=>{requestAnimationFrame(()=>{setTimeout(p,0)}),setTimeout(p,100)}),await F({type:"link",url:r,keepfocus:l.keepfocus,noscroll:l.noscroll,replace_state:l.replace_state??r.href===location.href,event:n})}),P.addEventListener("submit",n=>{if(n.defaultPrevented)return;const a=HTMLFormElement.prototype.cloneNode.call(n.target),r=n.submitter;if(((r==null?void 0:r.formTarget)||a.target)==="_blank"||((r==null?void 0:r.formMethod)||a.method)!=="get")return;const o=new URL((r==null?void 0:r.hasAttribute("formaction"))&&(r==null?void 0:r.formAction)||a.action);if(Rt(o,A,!1))return;const l=n.target,c=_t(l);if(c.reload)return;n.preventDefault(),n.stopPropagation();const d=new FormData(l,r);o.search=new URLSearchParams(d).toString(),F({type:"form",url:o,keepfocus:c.keepfocus,noscroll:c.noscroll,replace_state:c.replace_state??o.href===location.href,event:n})}),addEventListener("popstate",async n=>{var a;if(!qt){if((a=n.state)!=null&&a[z]){const r=n.state[z];if(D={},r===k)return;const i=j[r],s=n.state[we]??{},o=new URL(n.state[en]??location.href),l=n.state[Q],c=_.url?Tt(location)===Tt(_.url):!1;if(l===L&&(Le||c)){s!==R.state&&(R.state=s),t(o),j[k]=V(),i&&scrollTo(i.x,i.y),k=r;return}const u=r-k;await F({type:"popstate",url:o,popped:{state:s,scroll:i,delta:u},accept:()=>{k=r,L=l},block:()=>{history.go(-u)},nav_token:D,event:n})}else if(!Y){const r=new URL(location.href);t(r),S.hash&&location.reload()}}}),addEventListener("hashchange",()=>{Y&&(Y=!1,history.replaceState({...history.state,[z]:++k,[Q]:L},"",location.href))});for(const n of document.querySelectorAll("link"))cn.has(n.rel)&&(n.href=n.href);addEventListener("pageshow",n=>{n.persisted&&C.navigating.set(Z.current=null)});function t(n){_.url=R.url=n,C.page.set(Zt(R)),C.page.notify()}}async function Rn(t,{status:e=200,error:n,node_ids:a,params:r,route:i,server_route:s,data:o,form:l}){xe=!0;const c=new URL(location.href);let d;({params:r={},route:i={id:null}}=await xt(c,!1)||{}),d=Wt.find(({id:p})=>p===i.id);let u,w=!0;try{const p=a.map(async(m,h)=>{const g=o[h];return g!=null&&g.uses&&(g.uses=xn(g.uses)),Yt({loader:S.nodes[m],url:c,params:r,route:i,parent:async()=>{const b={};for(let x=0;x{const o=history.state;qt=!0,location.replace(new URL(`#${a}`,location.href)),history.replaceState(o,"",t),e&&scrollTo(i,s),qt=!1})}else{const i=document.body,s=i.getAttribute("tabindex");i.tabIndex=-1,i.focus({preventScroll:!0,focusVisible:!1}),s!==null?i.setAttribute("tabindex",s):i.removeAttribute("tabindex")}const r=getSelection();if(r&&r.type!=="None"){const i=[];for(let s=0;s{if(r.rangeCount===i.length){for(let s=0;s{i=u,s=w});return o.catch(()=>{}),{navigation:{from:{params:t.params,route:{id:((c=t.route)==null?void 0:c.id)??null},url:t.url,scroll:V()},to:n&&{params:(e==null?void 0:e.params)??null,route:{id:((d=e==null?void 0:e.route)==null?void 0:d.id)??null},url:n,scroll:r},willUnload:!e,type:a,complete:o},fulfil:i,reject:s}}function Zt(t){return{data:t.data,error:t.error,form:t.form,params:t.params,route:t.route,state:t.state,status:t.status,url:t.url}}function An(t){const e=new URL(t);return e.hash=decodeURIComponent(t.hash),e}function Ce(t){let e;if(S.hash){const[,,n]=t.hash.split("#",3);e=n??""}else e=t.hash.slice(1);return decodeURIComponent(e)}export{jn as a,On as l,R as p,C as s}; diff --git a/frontend/dist/_app/immutable/chunks/mtaKwlL3.js b/frontend/dist/_app/immutable/chunks/mtaKwlL3.js new file mode 100644 index 0000000..286941a --- /dev/null +++ b/frontend/dist/_app/immutable/chunks/mtaKwlL3.js @@ -0,0 +1 @@ +var te=t=>{throw TypeError(t)};var Ce=(t,e,n)=>e.has(t)||te("Cannot "+n);var v=(t,e,n)=>(Ce(t,e,"read from private field"),n?n.call(t):e.get(t)),U=(t,e,n)=>e.has(t)?te("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(t):e.set(t,n);import{bf as Ut,bg as Ne,aK as T,o as I,$ as O,aJ as mt,bh as qe}from"./VJhVTb1A.js";import{o as ee}from"./Cz6m6K8p.js";const B=[];function Dt(t,e=Ut){let n=null;const a=new Set;function r(o){if(Ne(t,o)&&(t=o,n)){const l=!B.length;for(const c of a)c[1](),B.push(c,t);if(l){for(let c=0;c{a.delete(c),a.size===0&&n&&(n(),n=null)}}return{set:r,update:i,subscribe:s}}class Vt{constructor(e,n){this.status=e,typeof n=="string"?this.body={message:n}:n?this.body=n:this.body={message:`Error: ${e}`}}toString(){return JSON.stringify(this.body)}}class Kt{constructor(e,n){this.status=e,this.location=n}}class Bt extends Error{constructor(e,n,a){super(a),this.status=e,this.text=n}}new URL("sveltekit-internal://");function De(t,e){return t==="/"||e==="ignore"?t:e==="never"?t.endsWith("/")?t.slice(0,-1):t:e==="always"&&!t.endsWith("/")?t+"/":t}function Ve(t){return t.split("%25").map(decodeURI).join("%25")}function Ke(t){for(const e in t)t[e]=decodeURIComponent(t[e]);return t}function Tt({href:t}){return t.split("#")[0]}function Be(...t){let e=5381;for(const n of t)if(typeof n=="string"){let a=n.length;for(;a;)e=e*33^n.charCodeAt(--a)}else if(ArrayBuffer.isView(n)){const a=new Uint8Array(n.buffer,n.byteOffset,n.byteLength);let r=a.length;for(;r;)e=e*33^a[--r]}else throw new TypeError("value must be a string or TypedArray");return(e>>>0).toString(36)}new TextEncoder;new TextDecoder;function Me(t){const e=atob(t),n=new Uint8Array(e.length);for(let a=0;a((t instanceof Request?t.method:(e==null?void 0:e.method)||"GET")!=="GET"&&H.delete(Mt(t)),ze(t,e));const H=new Map;function Fe(t,e){const n=Mt(t,e),a=document.querySelector(n);if(a!=null&&a.textContent){a.remove();let{body:r,...i}=JSON.parse(a.textContent);const s=a.getAttribute("data-ttl");return s&&H.set(n,{body:r,init:i,ttl:1e3*Number(s)}),a.getAttribute("data-b64")!==null&&(r=Me(r)),Promise.resolve(new Response(r,i))}return window.fetch(t,e)}function Ge(t,e,n){if(H.size>0){const a=Mt(t,n),r=H.get(a);if(r){if(performance.now(){const r=/^\[\.\.\.(\w+)(?:=(\w+))?\]$/.exec(a);if(r)return e.push({name:r[1],matcher:r[2],optional:!1,rest:!0,chained:!0}),"(?:/([^]*))?";const i=/^\[\[(\w+)(?:=(\w+))?\]\]$/.exec(a);if(i)return e.push({name:i[1],matcher:i[2],optional:!0,rest:!1,chained:!0}),"(?:/([^/]+))?";if(!a)return;const s=a.split(/\[(.+?)\](?!\])/);return"/"+s.map((l,c)=>{if(c%2){if(l.startsWith("x+"))return It(String.fromCharCode(parseInt(l.slice(2),16)));if(l.startsWith("u+"))return It(String.fromCharCode(...l.slice(2).split("-").map(m=>parseInt(m,16))));const d=We.exec(l),[,u,w,p,f]=d;return e.push({name:p,matcher:f,optional:!!u,rest:!!w,chained:w?c===1&&s[0]==="":!1}),w?"([^]*?)":u?"([^/]*)?":"([^/]+?)"}return It(l)}).join("")}).join("")}/?$`),params:e}}function Ye(t){return t!==""&&!/^\([^)]+\)$/.test(t)}function He(t){return t.slice(1).split("/").filter(Ye)}function Xe(t,e,n){const a={},r=t.slice(1),i=r.filter(o=>o!==void 0);let s=0;for(let o=0;od).join("/"),s=0),c===void 0)if(l.rest)c="";else continue;if(!l.matcher||n[l.matcher](c)){a[l.name]=c;const d=e[o+1],u=r[o+1];d&&!d.rest&&d.optional&&u&&l.chained&&(s=0),!d&&!u&&Object.keys(a).length===i.length&&(s=0);continue}if(l.optional&&l.chained){s++;continue}return}if(!s)return a}function It(t){return t.normalize().replace(/[[\]]/g,"\\$&").replace(/%/g,"%25").replace(/\//g,"%2[Ff]").replace(/\?/g,"%3[Ff]").replace(/#/g,"%23").replace(/[.*+?^${}()|\\]/g,"\\$&")}function Qe({nodes:t,server_loads:e,dictionary:n,matchers:a}){const r=new Set(e);return Object.entries(n).map(([o,[l,c,d]])=>{const{pattern:u,params:w}=Je(o),p={id:o,exec:f=>{const m=u.exec(f);if(m)return Xe(m,w,a)},errors:[1,...d||[]].map(f=>t[f]),layouts:[0,...c||[]].map(s),leaf:i(l)};return p.errors.length=p.layouts.length=Math.max(p.errors.length,p.layouts.length),p});function i(o){const l=o<0;return l&&(o=~o),[l,t[o]]}function s(o){return o===void 0?o:[r.has(o),t[o]]}}function ge(t,e=JSON.parse){try{return e(sessionStorage[t])}catch{}}function ne(t,e,n=JSON.stringify){const a=n(e);try{sessionStorage[t]=a}catch{}}var fe;const A=((fe=globalThis.__sveltekit_1kcng0j)==null?void 0:fe.base)??"";var ue;const Ze=((ue=globalThis.__sveltekit_1kcng0j)==null?void 0:ue.assets)??A??"",tn="1791370257369",me="sveltekit:snapshot",_e="sveltekit:scroll",we="sveltekit:states",en="sveltekit:pageurl",z="sveltekit:history",Q="sveltekit:navigation",q={tap:1,hover:2,viewport:3,eager:4,off:-1,false:-1},zt=location.origin;function ve(t){if(t instanceof URL)return t;let e=document.baseURI;if(!e){const n=document.getElementsByTagName("base");e=n.length?n[0].href:document.URL}return new URL(t,e)}function V(){return{x:pageXOffset,y:pageYOffset}}function M(t,e){return t.getAttribute(`data-sveltekit-${e}`)}const re={...q,"":q.hover};function ye(t){let e=t.assignedSlot??t.parentNode;return(e==null?void 0:e.nodeType)===11&&(e=e.host),e}function be(t,e){for(;t&&t!==e;){if(t.nodeName.toUpperCase()==="A"&&t.hasAttribute("href"))return t;t=ye(t)}}function $t(t,e,n){let a;try{if(a=new URL(t instanceof SVGAElement?t.href.baseVal:t.href,document.baseURI),n&&a.hash.match(/^#[^/]/)){const o=location.hash.split("#")[1]||"/";a.hash=`#${o}${a.hash}`}}catch{}const r=t instanceof SVGAElement?t.target.baseVal:t.target,i=!a||!!r||Rt(a,e,n)||(t.getAttribute("rel")||"").split(/\s+/).includes("external"),s=(a==null?void 0:a.origin)===zt&&t.hasAttribute("download");return{url:a,external:i,target:r,download:s}}function _t(t){let e=null,n=null,a=null,r=null,i=null,s=null,o=t;for(;o&&o!==document.documentElement;)a===null&&(a=M(o,"preload-code")),r===null&&(r=M(o,"preload-data")),e===null&&(e=M(o,"keepfocus")),n===null&&(n=M(o,"noscroll")),i===null&&(i=M(o,"reload")),s===null&&(s=M(o,"replacestate")),o=ye(o);function l(c){switch(c){case"":case"true":return!0;case"off":case"false":return!1;default:return}}return{preload_code:re[a??"off"],preload_data:re[r??"off"],keepfocus:l(e),noscroll:l(n),reload:l(i),replace_state:l(s)}}function ae(t){const e=Dt(t);let n=!0;function a(){n=!0,e.update(s=>s)}function r(s){n=!1,e.set(s)}function i(s){let o;return e.subscribe(l=>{(o===void 0||n&&l!==o)&&s(o=l)})}return{notify:a,set:r,subscribe:i}}const ke={v:()=>{}};function nn(){const{set:t,subscribe:e}=Dt(!1);let n;async function a(){clearTimeout(n);try{const r=await fetch(`${Ze}/_app/version.json`,{headers:{pragma:"no-cache","cache-control":"no-cache"}});if(!r.ok)return!1;const s=(await r.json()).version!==tn;return s&&(t(!0),ke.v(),clearTimeout(n)),s}catch{return!1}}return{subscribe:e,check:a}}function Rt(t,e,n){return t.origin!==zt||!t.pathname.startsWith(e)?!0:n?t.pathname!==location.pathname:!1}function On(t){}const Se=new Set(["load","prerender","csr","ssr","trailingSlash","config"]);[...Se];const rn=new Set([...Se]);[...rn];function an(t){return t.filter(e=>e!=null)}function Ft(t){return t instanceof Vt||t instanceof Bt?t.status:500}function on(t){return t instanceof Bt?t.text:"Internal Error"}let R,Z,Ot;const sn=ee.toString().includes("$$")||/function \w+\(\) \{\}/.test(ee.toString()),oe="a:";var at,ot,st,it,lt,ct,ft,ut,de,dt,he,ht,pe;sn?(R={data:{},form:null,error:null,params:{},route:{id:null},state:{},status:-1,url:new URL(oe)},Z={current:null},Ot={current:!1}):(R=new(de=class{constructor(){U(this,at,T({}));U(this,ot,T(null));U(this,st,T(null));U(this,it,T({}));U(this,lt,T({id:null}));U(this,ct,T({}));U(this,ft,T(-1));U(this,ut,T(new URL(oe)))}get data(){return I(v(this,at))}set data(e){O(v(this,at),e)}get form(){return I(v(this,ot))}set form(e){O(v(this,ot),e)}get error(){return I(v(this,st))}set error(e){O(v(this,st),e)}get params(){return I(v(this,it))}set params(e){O(v(this,it),e)}get route(){return I(v(this,lt))}set route(e){O(v(this,lt),e)}get state(){return I(v(this,ct))}set state(e){O(v(this,ct),e)}get status(){return I(v(this,ft))}set status(e){O(v(this,ft),e)}get url(){return I(v(this,ut))}set url(e){O(v(this,ut),e)}},at=new WeakMap,ot=new WeakMap,st=new WeakMap,it=new WeakMap,lt=new WeakMap,ct=new WeakMap,ft=new WeakMap,ut=new WeakMap,de),Z=new(he=class{constructor(){U(this,dt,T(null))}get current(){return I(v(this,dt))}set current(e){O(v(this,dt),e)}},dt=new WeakMap,he),Ot=new(pe=class{constructor(){U(this,ht,T(!1))}get current(){return I(v(this,ht))}set current(e){O(v(this,ht),e)}},ht=new WeakMap,pe),ke.v=()=>Ot.current=!0);function ln(t){Object.assign(R,t)}const cn=new Set(["icon","shortcut icon","apple-touch-icon"]);let J=null;const C=ge(_e)??{},tt=ge(me)??{},j={url:ae({}),page:ae({}),navigating:Dt(null),updated:nn()};function Gt(t){C[t]=V()}function fn(t,e){let n=t+1;for(;C[n];)delete C[n],n+=1;for(n=e+1;tt[n];)delete tt[n],n+=1}function et(t,e=!1){return e?location.replace(t.href):location.href=t.href,new Promise(()=>{})}async function Ee(){if("serviceWorker"in navigator){const t=await navigator.serviceWorker.getRegistration(A||"/");t&&await t.update()}}function se(){}let Wt,jt,wt,P,Ct,S;const vt=[],yt=[];let y=null;function Nt(){var t;(t=y==null?void 0:y.fork)==null||t.then(e=>e==null?void 0:e.discard()),y=null}const gt=new Map,Re=new Set,un=new Set,X=new Set;let _={branch:[],error:null,url:null},xe=!1,bt=!1,ie=!0,nt=!1,Y=!1,Le=!1,Jt=!1,Ae,k,L,D;const kt=new Set,le=new Map;async function Cn(t,e,n){var i,s,o,l,c;(i=globalThis.__sveltekit_1kcng0j)!=null&&i.data&&globalThis.__sveltekit_1kcng0j.data,document.URL!==location.href&&(location.href=location.href),S=t,await((o=(s=t.hooks).init)==null?void 0:o.call(s)),Wt=Qe(t),P=document.documentElement,Ct=e,jt=t.nodes[0],wt=t.nodes[1],jt(),wt(),k=(l=history.state)==null?void 0:l[z],L=(c=history.state)==null?void 0:c[Q],k||(k=L=Date.now(),history.replaceState({...history.state,[z]:k,[Q]:L},""));const a=C[k];function r(){a&&(history.scrollRestoration="manual",scrollTo(a.x,a.y))}n?(r(),await Rn(Ct,n)):(await F({type:"enter",url:ve(S.hash?An(new URL(location.href)):location.href),replace_state:!0}),r()),En()}function dn(){vt.length=0,Jt=!1}function Ue(t){yt.some(e=>e==null?void 0:e.snapshot)&&(tt[t]=yt.map(e=>{var n;return(n=e==null?void 0:e.snapshot)==null?void 0:n.capture()}))}function Te(t){var e;(e=tt[t])==null||e.forEach((n,a)=>{var r,i;(i=(r=yt[a])==null?void 0:r.snapshot)==null||i.restore(n)})}function ce(){Gt(k),ne(_e,C),Ue(L),ne(me,tt)}async function hn(t,e,n,a){let r;e.invalidateAll&&Nt(),await F({type:"goto",url:ve(t),keepfocus:e.keepFocus,noscroll:e.noScroll,replace_state:e.replaceState,state:e.state,redirect_count:n,nav_token:a,accept:()=>{e.invalidateAll&&(Jt=!0,r=[...le.keys()]),e.invalidate&&e.invalidate.forEach(Sn)}}),e.invalidateAll&&mt().then(mt).then(()=>{le.forEach(({resource:i},s)=>{var o;r!=null&&r.includes(s)&&((o=i.refresh)==null||o.call(i))})})}async function pn(t){if(t.id!==(y==null?void 0:y.id)){Nt();const e={};kt.add(e),y={id:t.id,token:e,promise:Oe({...t,preload:e}).then(n=>(kt.delete(e),n.type==="loaded"&&n.state.error&&Nt(),n)),fork:null}}return y.promise}async function Pt(t){var n;const e=(n=await xt(t,!1))==null?void 0:n.route;e&&await Promise.all([...e.layouts,e.leaf].filter(Boolean).map(a=>a[1]()))}async function Ie(t,e,n){var i;const a={params:_.params,route:{id:((i=_.route)==null?void 0:i.id)??null},url:new URL(location.href)};_={...t.state,nav:a};const r=document.querySelector("style[data-sveltekit]");if(r&&r.remove(),Object.assign(R,t.props.page),Ae=new S.root({target:e,props:{...t.props,stores:j,components:yt},hydrate:n,sync:!1,transformError:void 0}),await Promise.resolve(),Te(L),n){const s={from:null,to:{...a,scroll:C[k]??V()},willUnload:!1,type:"enter",complete:Promise.resolve()};X.forEach(o=>o(s))}bt=!0}async function St({url:t,params:e,branch:n,errors:a,status:r,error:i,route:s,form:o}){let l="never";if(A&&(t.pathname===A||t.pathname===A+"/"))l="always";else for(const f of n)(f==null?void 0:f.slash)!==void 0&&(l=f.slash);t.pathname=De(t.pathname,l),t.search=t.search;const c={type:"loaded",state:{url:t,params:e,branch:n,error:i,route:s},props:{constructors:an(n).map(f=>f.node.component),page:Zt(R)}};o!==void 0&&(c.props.form=o);let d={},u=!R,w=0;for(let f=0;fo(new URL(s))))return!0;return!1}function Ht(t,e){return(t==null?void 0:t.type)==="data"?t:(t==null?void 0:t.type)==="skip"?e??null:null}function _n(t,e){if(!t)return new Set(e.searchParams.keys());const n=new Set([...t.searchParams.keys(),...e.searchParams.keys()]);for(const a of n){const r=t.searchParams.getAll(a),i=e.searchParams.getAll(a);r.every(s=>i.includes(s))&&i.every(s=>r.includes(s))&&n.delete(a)}return n}function wn({error:t,url:e,route:n,params:a}){return{type:"loaded",state:{error:t,url:e,route:n,params:a,branch:[]},props:{page:Zt(R),constructors:[]}}}async function Oe({id:t,invalidating:e,url:n,params:a,route:r,preload:i}){if((y==null?void 0:y.id)===t)return kt.delete(y.token),y.promise;const{errors:s,layouts:o,leaf:l}=r,c=[...o,l];s.forEach(h=>h==null?void 0:h().catch(()=>{})),c.forEach(h=>h==null?void 0:h[1]().catch(()=>{}));const d=_.url?t!==Et(_.url):!1,u=_.route?r.id!==_.route.id:!1,w=_n(_.url,n);let p=!1;const f=c.map(async(h,g)=>{var $;if(!h)return;const b=_.branch[g];return h[1]===(b==null?void 0:b.loader)&&!mn(p,u,d,w,($=b.universal)==null?void 0:$.uses,a)?b:(p=!0,Yt({loader:h[1],url:n,params:a,route:r,parent:async()=>{var pt;const N={};for(let K=0;K{});const m=[];for(let h=0;hPromise.resolve({}),server_data_node:Ht(i)}),o={node:await wt(),loader:wt,universal:null,server:null,data:null};return St({url:n,params:r,branch:[s,o],status:t,error:e,errors:[],route:null})}catch(s){if(s instanceof Kt)return hn(new URL(s.location,location.href),{},0);throw s}}async function yn(t){const e=t.href;if(gt.has(e))return gt.get(e);let n;try{const a=(async()=>{let r=await S.hooks.reroute({url:new URL(t),fetch:async(i,s)=>gn(i,s,t).promise})??t;if(typeof r=="string"){const i=new URL(t);S.hash?i.hash=r:i.pathname=r,r=i}return r})();gt.set(e,a),n=await a}catch{gt.delete(e);return}return n}async function xt(t,e){if(t&&!Rt(t,A,S.hash)){const n=await yn(t);if(!n)return;const a=bn(n);for(const r of Wt){const i=r.exec(a);if(i)return{id:Et(t),invalidating:e,route:r,params:Ke(i),url:t}}}}function bn(t){return Ve(S.hash?t.hash.replace(/^#/,"").replace(/[?#].+/,""):t.pathname.slice(A.length))||"/"}function Et(t){return(S.hash?t.hash.replace(/^#/,""):t.pathname)+t.search}function Pe({url:t,type:e,intent:n,delta:a,event:r,scroll:i}){let s=!1;const o=Qt(_,n,t,e,i??null);a!==void 0&&(o.navigation.delta=a),r!==void 0&&(o.navigation.event=r);const l={...o.navigation,cancel:()=>{s=!0,o.reject(new Error("navigation cancelled"))}};return nt||Re.forEach(c=>c(l)),s?null:o}async function F({type:t,url:e,popped:n,keepfocus:a,noscroll:r,replace_state:i,state:s={},redirect_count:o=0,nav_token:l={},accept:c=se,block:d=se,event:u}){var K;const w=D;D=l;const p=await xt(e,!1),f=t==="enter"?Qt(_,p,e,t):Pe({url:e,type:t,delta:n==null?void 0:n.delta,intent:p,scroll:n==null?void 0:n.scroll,event:u});if(!f){d(),D===l&&(D=w);return}const m=k,h=L;c(),nt=!0,bt&&f.navigation.type!=="enter"&&j.navigating.set(Z.current=f.navigation);let g=p&&await Oe(p);if(!g){if(Rt(e,A,S.hash))return await et(e,i);g=await $e(e,{id:null},await rt(new Bt(404,"Not Found",`Not found: ${e.pathname}`),{url:e,params:{},route:{id:null}}),404,i)}if(e=(p==null?void 0:p.url)||e,D!==l)return f.reject(new Error("navigation aborted")),!1;if(g.type==="redirect"){if(o<20){await F({type:t,url:new URL(g.location,e),popped:n,keepfocus:a,noscroll:r,replace_state:i,state:s,redirect_count:o+1,nav_token:l}),f.fulfil(void 0);return}g=await Xt({status:500,error:await rt(new Error("Redirect loop"),{url:e,params:{},route:{id:null}}),url:e,route:{id:null}})}else g.props.page.status>=400&&await j.updated.check()&&(await Ee(),await et(e,i));if(dn(),Gt(m),Ue(h),g.props.page.url.pathname!==e.pathname&&(e.pathname=g.props.page.url.pathname),s=n?n.state:s,!n){const E=i?0:1,G={[z]:k+=E,[Q]:L+=E,[we]:s};(i?history.replaceState:history.pushState).call(history,G,"",e),i||fn(k,L)}const b=p&&(y==null?void 0:y.id)===p.id?y.fork:null;y=null,g.props.page.state=s;let x;if(bt){const E=(await Promise.all(Array.from(un,W=>W(f.navigation)))).filter(W=>typeof W=="function");if(E.length>0){let W=function(){E.forEach(At=>{X.delete(At)})};E.push(W),E.forEach(At=>{X.add(At)})}const G=f.navigation.to;_={...g.state,nav:{params:G.params,route:G.route,url:G.url}},g.props.page&&(g.props.page.url=e);const Lt=b&&await b;Lt?x=Lt.commit():(J=null,Ae.$set(g.props),J&&Object.assign(g.props.page,J),ln(g.props.page),x=(K=qe)==null?void 0:K()),Le=!0}else await Ie(g,Ct,!1);const{activeElement:$}=document;await x,await mt(),await mt();let N=null;if(ie){const E=n?n.scroll:r?V():null;E?scrollTo(E.x,E.y):(N=e.hash&&document.getElementById(je(e)))?N.scrollIntoView():scrollTo(0,0)}const pt=document.activeElement!==$&&document.activeElement!==document.body;!a&&!pt&&Ln(e,!N),ie=!0,g.props.page&&(J&&Object.assign(g.props.page,J),Object.assign(R,g.props.page)),nt=!1,t==="popstate"&&Te(L),f.fulfil(void 0),f.navigation.to&&(f.navigation.to.scroll=V()),X.forEach(E=>E(f.navigation)),j.navigating.set(Z.current=null)}async function $e(t,e,n,a,r){return t.origin===zt&&t.pathname===location.pathname&&!xe?await Xt({status:a,error:n,url:t,route:e}):await et(t,r)}function kn(){let t,e={element:void 0,href:void 0},n;P.addEventListener("mousemove",o=>{const l=o.target;clearTimeout(t),t=setTimeout(()=>{i(l,q.hover)},20)});function a(o){o.defaultPrevented||i(o.composedPath()[0],q.tap)}P.addEventListener("mousedown",a),P.addEventListener("touchstart",a,{passive:!0});const r=new IntersectionObserver(o=>{for(const l of o)l.isIntersecting&&(Pt(new URL(l.target.href)),r.unobserve(l.target))},{threshold:0});async function i(o,l){const c=be(o,P),d=c===e.element&&(c==null?void 0:c.href)===e.href&&l>=n;if(!c||d)return;const{url:u,external:w,download:p}=$t(c,A,S.hash);if(w||p)return;const f=_t(c),m=u&&Et(_.url)===Et(u);if(!(f.reload||m))if(l<=f.preload_data){e={element:c,href:c.href},n=q.tap;const h=await xt(u,!1);if(!h)return;pn(h)}else l<=f.preload_code&&(e={element:c,href:c.href},n=l,Pt(u))}function s(){r.disconnect();for(const o of P.querySelectorAll("a")){const{url:l,external:c,download:d}=$t(o,A,S.hash);if(c||d)continue;const u=_t(o);u.reload||(u.preload_code===q.viewport&&r.observe(o),u.preload_code===q.eager&&Pt(l))}}X.add(s),s()}function rt(t,e){if(t instanceof Vt)return t.body;const n=Ft(t),a=on(t);return S.hooks.handleError({error:t,event:e,status:n,message:a})??{message:a}}function Sn(t){if(typeof t=="function")vt.push(t);else{const{href:e}=new URL(t,location.href);vt.push(n=>n.href===e)}}function En(){var e;history.scrollRestoration="manual",addEventListener("beforeunload",n=>{let a=!1;if(ce(),!nt){const r=Qt(_,void 0,null,"leave"),i={...r.navigation,cancel:()=>{a=!0,r.reject(new Error("navigation cancelled"))}};Re.forEach(s=>s(i))}a?(n.preventDefault(),n.returnValue=""):history.scrollRestoration="auto"}),addEventListener("visibilitychange",()=>{document.visibilityState==="hidden"&&ce()}),(e=navigator.connection)!=null&&e.saveData||kn(),P.addEventListener("click",async n=>{if(n.button||n.which!==1||n.metaKey||n.ctrlKey||n.shiftKey||n.altKey||n.defaultPrevented)return;const a=be(n.composedPath()[0],P);if(!a)return;const{url:r,external:i,target:s,download:o}=$t(a,A,S.hash);if(!r)return;if(s==="_parent"||s==="_top"){if(window.parent!==window)return}else if(s&&s!=="_self")return;const l=_t(a);if(!(a instanceof SVGAElement)&&r.protocol!==location.protocol&&!(r.protocol==="https:"||r.protocol==="http:")||o)return;const[d,u]=(S.hash?r.hash.replace(/^#/,""):r.href).split("#"),w=d===Tt(location);if(i||l.reload&&(!w||!u)){Pe({url:r,type:"link",event:n})?nt=!0:n.preventDefault();return}if(u!==void 0&&w){const[,p]=_.url.href.split("#");if(p===u){if(n.preventDefault(),u===""||u==="top"&&a.ownerDocument.getElementById("top")===null)scrollTo({top:0});else{const f=a.ownerDocument.getElementById(decodeURIComponent(u));f&&(f.scrollIntoView(),f.focus())}return}if(Y=!0,Gt(k),t(r),!l.replace_state)return;Y=!1}n.preventDefault(),await new Promise(p=>{requestAnimationFrame(()=>{setTimeout(p,0)}),setTimeout(p,100)}),await F({type:"link",url:r,keepfocus:l.keepfocus,noscroll:l.noscroll,replace_state:l.replace_state??r.href===location.href,event:n})}),P.addEventListener("submit",n=>{if(n.defaultPrevented)return;const a=HTMLFormElement.prototype.cloneNode.call(n.target),r=n.submitter;if(((r==null?void 0:r.formTarget)||a.target)==="_blank"||((r==null?void 0:r.formMethod)||a.method)!=="get")return;const o=new URL((r==null?void 0:r.hasAttribute("formaction"))&&(r==null?void 0:r.formAction)||a.action);if(Rt(o,A,!1))return;const l=n.target,c=_t(l);if(c.reload)return;n.preventDefault(),n.stopPropagation();const d=new FormData(l,r);o.search=new URLSearchParams(d).toString(),F({type:"form",url:o,keepfocus:c.keepfocus,noscroll:c.noscroll,replace_state:c.replace_state??o.href===location.href,event:n})}),addEventListener("popstate",async n=>{var a;if(!qt){if((a=n.state)!=null&&a[z]){const r=n.state[z];if(D={},r===k)return;const i=C[r],s=n.state[we]??{},o=new URL(n.state[en]??location.href),l=n.state[Q],c=_.url?Tt(location)===Tt(_.url):!1;if(l===L&&(Le||c)){s!==R.state&&(R.state=s),t(o),C[k]=V(),i&&scrollTo(i.x,i.y),k=r;return}const u=r-k;await F({type:"popstate",url:o,popped:{state:s,scroll:i,delta:u},accept:()=>{k=r,L=l},block:()=>{history.go(-u)},nav_token:D,event:n})}else if(!Y){const r=new URL(location.href);t(r),S.hash&&location.reload()}}}),addEventListener("hashchange",()=>{Y&&(Y=!1,history.replaceState({...history.state,[z]:++k,[Q]:L},"",location.href))});for(const n of document.querySelectorAll("link"))cn.has(n.rel)&&(n.href=n.href);addEventListener("pageshow",n=>{n.persisted&&j.navigating.set(Z.current=null)});function t(n){_.url=R.url=n,j.page.set(Zt(R)),j.page.notify()}}async function Rn(t,{status:e=200,error:n,node_ids:a,params:r,route:i,server_route:s,data:o,form:l}){xe=!0;const c=new URL(location.href);let d;({params:r={},route:i={id:null}}=await xt(c,!1)||{}),d=Wt.find(({id:p})=>p===i.id);let u,w=!0;try{const p=a.map(async(m,h)=>{const g=o[h];return g!=null&&g.uses&&(g.uses=xn(g.uses)),Yt({loader:S.nodes[m],url:c,params:r,route:i,parent:async()=>{const b={};for(let x=0;x{const o=history.state;qt=!0,location.replace(new URL(`#${a}`,location.href)),history.replaceState(o,"",t),e&&scrollTo(i,s),qt=!1})}else{const i=document.body,s=i.getAttribute("tabindex");i.tabIndex=-1,i.focus({preventScroll:!0,focusVisible:!1}),s!==null?i.setAttribute("tabindex",s):i.removeAttribute("tabindex")}const r=getSelection();if(r&&r.type!=="None"){const i=[];for(let s=0;s{if(r.rangeCount===i.length){for(let s=0;s{i=u,s=w});return o.catch(()=>{}),{navigation:{from:{params:t.params,route:{id:((c=t.route)==null?void 0:c.id)??null},url:t.url,scroll:V()},to:n&&{params:(e==null?void 0:e.params)??null,route:{id:((d=e==null?void 0:e.route)==null?void 0:d.id)??null},url:n,scroll:r},willUnload:!e,type:a,complete:o},fulfil:i,reject:s}}function Zt(t){return{data:t.data,error:t.error,form:t.form,params:t.params,route:t.route,state:t.state,status:t.status,url:t.url}}function An(t){const e=new URL(t);return e.hash=decodeURIComponent(t.hash),e}function je(t){let e;if(S.hash){const[,,n]=t.hash.split("#",3);e=n??""}else e=t.hash.slice(1);return decodeURIComponent(e)}export{Cn as a,On as l,R as p,j as s}; diff --git a/frontend/dist/_app/immutable/entry/app.Cn2ZzZiT.js b/frontend/dist/_app/immutable/entry/app.BUomxnpd.js similarity index 94% rename from frontend/dist/_app/immutable/entry/app.Cn2ZzZiT.js rename to frontend/dist/_app/immutable/entry/app.BUomxnpd.js index 5c2d84c..c71cf58 100644 --- a/frontend/dist/_app/immutable/entry/app.Cn2ZzZiT.js +++ b/frontend/dist/_app/immutable/entry/app.BUomxnpd.js @@ -1,2 +1,2 @@ -const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["../nodes/0.DecrOZwe.js","../chunks/C14P8jaG.js","../chunks/VJhVTb1A.js","../chunks/CiUbu-1F.js","../chunks/U5yjBaoU.js","../nodes/1.DU6Ijmpv.js","../chunks/DmjnTBOd.js","../chunks/BeON-0X8.js","../chunks/BI00lc_u.js","../chunks/Cz6m6K8p.js","../nodes/2.DQxkgq4x.js","../chunks/zf4GFcxs.js","../assets/2.DKE6ochW.css"])))=>i.map(i=>d[i]); -var H=t=>{throw TypeError(t)};var J=(t,e,s)=>e.has(t)||H("Cannot "+s);var l=(t,e,s)=>(J(t,e,"read from private field"),s?s.call(t):e.get(t)),S=(t,e,s)=>e.has(t)?H("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(t):e.set(t,s),C=(t,e,s,o)=>(J(t,e,"write to private field"),o?o.call(t,s):e.set(t,s),s);import{$ as L,ab as X,o as g,aH as Z,au as M,aI as N,x as $,u as ee,j as te,aJ as re,g as j,C as se,z as ae,aK as A,A as ne,B as oe,aL as B,y as ce}from"../chunks/VJhVTb1A.js";import{h as ie,m as le,u as ue,s as fe}from"../chunks/BeON-0X8.js";import{a as w,c as I,f as W,t as me}from"../chunks/C14P8jaG.js";import{o as de}from"../chunks/Cz6m6K8p.js";import{p as T,i as D,c as V,b as q}from"../chunks/zf4GFcxs.js";function he(t){return class extends _e{constructor(e){super({component:t,...e})}}}var y,m;class _e{constructor(e){S(this,y);S(this,m);var _;var s=new Map,o=(a,r)=>{var c=N(r,!1,!1);return s.set(a,c),c};const u=new Proxy({...e.props||{},$$events:{}},{get(a,r){return g(s.get(r)??o(r,Reflect.get(a,r)))},has(a,r){return r===X?!0:(g(s.get(r)??o(r,Reflect.get(a,r))),Reflect.has(a,r))},set(a,r,c){return L(s.get(r)??o(r,c),c),Reflect.set(a,r,c)}});C(this,m,(e.hydrate?ie:le)(e.component,{target:e.target,anchor:e.anchor,props:u,context:e.context,intro:e.intro??!1,recover:e.recover,transformError:e.transformError})),(!((_=e==null?void 0:e.props)!=null&&_.$$host)||e.sync===!1)&&Z(),C(this,y,u.$$events);for(const a of Object.keys(l(this,m)))a==="$set"||a==="$destroy"||a==="$on"||M(this,a,{get(){return l(this,m)[a]},set(r){l(this,m)[a]=r},enumerable:!0});l(this,m).$set=a=>{Object.assign(u,a)},l(this,m).$destroy=()=>{ue(l(this,m))}}$set(e){l(this,m).$set(e)}$on(e,s){l(this,y)[e]=l(this,y)[e]||[];const o=(...u)=>s.call(this,...u);return l(this,y)[e].push(o),()=>{l(this,y)[e]=l(this,y)[e].filter(u=>u!==o)}}$destroy(){l(this,m).$destroy()}}y=new WeakMap,m=new WeakMap;const ve="modulepreload",ge=function(t,e){return new URL(t,e).href},K={},U=function(e,s,o){let u=Promise.resolve();if(s&&s.length>0){let a=function(i){return Promise.all(i.map(v=>Promise.resolve(v).then(b=>({status:"fulfilled",value:b}),b=>({status:"rejected",reason:b}))))};const r=document.getElementsByTagName("link"),c=document.querySelector("meta[property=csp-nonce]"),k=(c==null?void 0:c.nonce)||(c==null?void 0:c.getAttribute("nonce"));u=a(s.map(i=>{if(i=ge(i,o),i in K)return;K[i]=!0;const v=i.endsWith(".css"),b=v?'[rel="stylesheet"]':"";if(!!o)for(let n=r.length-1;n>=0;n--){const f=r[n];if(f.href===i&&(!v||f.rel==="stylesheet"))return}else if(document.querySelector(`link[href="${i}"]${b}`))return;const h=document.createElement("link");if(h.rel=v?"stylesheet":ve,v||(h.as="script"),h.crossOrigin="",h.href=i,k&&h.setAttribute("nonce",k),document.head.appendChild(h),v)return new Promise((n,f)=>{h.addEventListener("load",n),h.addEventListener("error",()=>f(new Error(`Unable to preload CSS for ${i}`)))})}))}function _(a){const r=new Event("vite:preloadError",{cancelable:!0});if(r.payload=a,window.dispatchEvent(r),!r.defaultPrevented)throw a}return u.then(a=>{for(const r of a||[])r.status==="rejected"&&_(r.reason);return e().catch(_)})},Se={};var ye=W('
'),be=W(" ",1);function Ee(t,e){$(e,!0);let s=T(e,"components",23,()=>[]),o=T(e,"data_0",3,null),u=T(e,"data_1",3,null);ee(()=>e.stores.page.set(e.page)),te(()=>{e.stores,e.page,e.constructors,s(),e.form,o(),u(),e.stores.page.notify()});let _=A(!1),a=A(!1),r=A(null);de(()=>{const n=e.stores.page.subscribe(()=>{g(_)&&(L(a,!0),re().then(()=>{L(r,document.title||"untitled page",!0)}))});return L(_,!0),n});const c=B(()=>e.constructors[1]);var k=be(),i=j(k);{var v=n=>{const f=B(()=>e.constructors[0]);var E=I(),x=j(E);V(x,()=>g(f),(P,R)=>{q(R(P,{get data(){return o()},get form(){return e.form},get params(){return e.page.params},children:(d,Re)=>{var G=I(),p=j(G);V(p,()=>g(c),(F,Q)=>{q(Q(F,{get data(){return u()},get form(){return e.form},get params(){return e.page.params}}),O=>s()[1]=O,()=>{var O;return(O=s())==null?void 0:O[1]})}),w(d,G)},$$slots:{default:!0}}),d=>s()[0]=d,()=>{var d;return(d=s())==null?void 0:d[0]})}),w(n,E)},b=n=>{const f=B(()=>e.constructors[0]);var E=I(),x=j(E);V(x,()=>g(f),(P,R)=>{q(R(P,{get data(){return o()},get form(){return e.form},get params(){return e.page.params}}),d=>s()[0]=d,()=>{var d;return(d=s())==null?void 0:d[0]})}),w(n,E)};D(i,n=>{e.constructors[1]?n(v):n(b,-1)})}var z=se(i,2);{var h=n=>{var f=ye(),E=ne(f);{var x=P=>{var R=me();ce(()=>fe(R,g(r))),w(P,R)};D(E,P=>{g(a)&&P(x)})}oe(f),w(n,f)};D(z,n=>{g(_)&&n(h)})}w(t,k),ae()}const Ce=he(Ee),Ae=[()=>U(()=>import("../nodes/0.DecrOZwe.js"),__vite__mapDeps([0,1,2,3,4]),import.meta.url),()=>U(()=>import("../nodes/1.DU6Ijmpv.js"),__vite__mapDeps([5,1,2,6,7,8,9]),import.meta.url),()=>U(()=>import("../nodes/2.DQxkgq4x.js"),__vite__mapDeps([10,1,2,9,11,4,7,3,6,12]),import.meta.url)],Be=[],Ie={"/":[2]},Y={handleError:(({error:t})=>{console.error(t)}),reroute:(()=>{}),transport:{}},Pe=Object.fromEntries(Object.entries(Y.transport).map(([t,e])=>[t,e.decode])),Te=Object.fromEntries(Object.entries(Y.transport).map(([t,e])=>[t,e.encode])),De=!1,Ve=(t,e)=>Pe[t](e);export{Ve as decode,Pe as decoders,Ie as dictionary,Te as encoders,De as hash,Y as hooks,Se as matchers,Ae as nodes,Ce as root,Be as server_loads}; +const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["../nodes/0.DecrOZwe.js","../chunks/C14P8jaG.js","../chunks/VJhVTb1A.js","../chunks/CiUbu-1F.js","../chunks/U5yjBaoU.js","../nodes/1.ccHAett1.js","../chunks/DmjnTBOd.js","../chunks/BeON-0X8.js","../chunks/mtaKwlL3.js","../chunks/Cz6m6K8p.js","../nodes/2.DMd27nZw.js","../chunks/zf4GFcxs.js","../assets/2.DKE6ochW.css"])))=>i.map(i=>d[i]); +var H=t=>{throw TypeError(t)};var J=(t,e,s)=>e.has(t)||H("Cannot "+s);var l=(t,e,s)=>(J(t,e,"read from private field"),s?s.call(t):e.get(t)),S=(t,e,s)=>e.has(t)?H("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(t):e.set(t,s),C=(t,e,s,o)=>(J(t,e,"write to private field"),o?o.call(t,s):e.set(t,s),s);import{$ as L,ab as X,o as g,aH as Z,au as M,aI as N,x as $,u as ee,j as te,aJ as re,g as j,C as se,z as ae,aK as A,A as ne,B as oe,aL as B,y as ce}from"../chunks/VJhVTb1A.js";import{h as ie,m as le,u as ue,s as fe}from"../chunks/BeON-0X8.js";import{a as w,c as I,f as W,t as me}from"../chunks/C14P8jaG.js";import{o as de}from"../chunks/Cz6m6K8p.js";import{p as T,i as D,c as V,b as q}from"../chunks/zf4GFcxs.js";function he(t){return class extends _e{constructor(e){super({component:t,...e})}}}var y,m;class _e{constructor(e){S(this,y);S(this,m);var _;var s=new Map,o=(a,r)=>{var c=N(r,!1,!1);return s.set(a,c),c};const u=new Proxy({...e.props||{},$$events:{}},{get(a,r){return g(s.get(r)??o(r,Reflect.get(a,r)))},has(a,r){return r===X?!0:(g(s.get(r)??o(r,Reflect.get(a,r))),Reflect.has(a,r))},set(a,r,c){return L(s.get(r)??o(r,c),c),Reflect.set(a,r,c)}});C(this,m,(e.hydrate?ie:le)(e.component,{target:e.target,anchor:e.anchor,props:u,context:e.context,intro:e.intro??!1,recover:e.recover,transformError:e.transformError})),(!((_=e==null?void 0:e.props)!=null&&_.$$host)||e.sync===!1)&&Z(),C(this,y,u.$$events);for(const a of Object.keys(l(this,m)))a==="$set"||a==="$destroy"||a==="$on"||M(this,a,{get(){return l(this,m)[a]},set(r){l(this,m)[a]=r},enumerable:!0});l(this,m).$set=a=>{Object.assign(u,a)},l(this,m).$destroy=()=>{ue(l(this,m))}}$set(e){l(this,m).$set(e)}$on(e,s){l(this,y)[e]=l(this,y)[e]||[];const o=(...u)=>s.call(this,...u);return l(this,y)[e].push(o),()=>{l(this,y)[e]=l(this,y)[e].filter(u=>u!==o)}}$destroy(){l(this,m).$destroy()}}y=new WeakMap,m=new WeakMap;const ve="modulepreload",ge=function(t,e){return new URL(t,e).href},K={},U=function(e,s,o){let u=Promise.resolve();if(s&&s.length>0){let a=function(i){return Promise.all(i.map(v=>Promise.resolve(v).then(b=>({status:"fulfilled",value:b}),b=>({status:"rejected",reason:b}))))};const r=document.getElementsByTagName("link"),c=document.querySelector("meta[property=csp-nonce]"),k=(c==null?void 0:c.nonce)||(c==null?void 0:c.getAttribute("nonce"));u=a(s.map(i=>{if(i=ge(i,o),i in K)return;K[i]=!0;const v=i.endsWith(".css"),b=v?'[rel="stylesheet"]':"";if(!!o)for(let n=r.length-1;n>=0;n--){const f=r[n];if(f.href===i&&(!v||f.rel==="stylesheet"))return}else if(document.querySelector(`link[href="${i}"]${b}`))return;const h=document.createElement("link");if(h.rel=v?"stylesheet":ve,v||(h.as="script"),h.crossOrigin="",h.href=i,k&&h.setAttribute("nonce",k),document.head.appendChild(h),v)return new Promise((n,f)=>{h.addEventListener("load",n),h.addEventListener("error",()=>f(new Error(`Unable to preload CSS for ${i}`)))})}))}function _(a){const r=new Event("vite:preloadError",{cancelable:!0});if(r.payload=a,window.dispatchEvent(r),!r.defaultPrevented)throw a}return u.then(a=>{for(const r of a||[])r.status==="rejected"&&_(r.reason);return e().catch(_)})},Se={};var ye=W('
'),be=W(" ",1);function Ee(t,e){$(e,!0);let s=T(e,"components",23,()=>[]),o=T(e,"data_0",3,null),u=T(e,"data_1",3,null);ee(()=>e.stores.page.set(e.page)),te(()=>{e.stores,e.page,e.constructors,s(),e.form,o(),u(),e.stores.page.notify()});let _=A(!1),a=A(!1),r=A(null);de(()=>{const n=e.stores.page.subscribe(()=>{g(_)&&(L(a,!0),re().then(()=>{L(r,document.title||"untitled page",!0)}))});return L(_,!0),n});const c=B(()=>e.constructors[1]);var k=be(),i=j(k);{var v=n=>{const f=B(()=>e.constructors[0]);var E=I(),x=j(E);V(x,()=>g(f),(P,R)=>{q(R(P,{get data(){return o()},get form(){return e.form},get params(){return e.page.params},children:(d,Re)=>{var G=I(),p=j(G);V(p,()=>g(c),(F,Q)=>{q(Q(F,{get data(){return u()},get form(){return e.form},get params(){return e.page.params}}),O=>s()[1]=O,()=>{var O;return(O=s())==null?void 0:O[1]})}),w(d,G)},$$slots:{default:!0}}),d=>s()[0]=d,()=>{var d;return(d=s())==null?void 0:d[0]})}),w(n,E)},b=n=>{const f=B(()=>e.constructors[0]);var E=I(),x=j(E);V(x,()=>g(f),(P,R)=>{q(R(P,{get data(){return o()},get form(){return e.form},get params(){return e.page.params}}),d=>s()[0]=d,()=>{var d;return(d=s())==null?void 0:d[0]})}),w(n,E)};D(i,n=>{e.constructors[1]?n(v):n(b,-1)})}var z=se(i,2);{var h=n=>{var f=ye(),E=ne(f);{var x=P=>{var R=me();ce(()=>fe(R,g(r))),w(P,R)};D(E,P=>{g(a)&&P(x)})}oe(f),w(n,f)};D(z,n=>{g(_)&&n(h)})}w(t,k),ae()}const Ce=he(Ee),Ae=[()=>U(()=>import("../nodes/0.DecrOZwe.js"),__vite__mapDeps([0,1,2,3,4]),import.meta.url),()=>U(()=>import("../nodes/1.ccHAett1.js"),__vite__mapDeps([5,1,2,6,7,8,9]),import.meta.url),()=>U(()=>import("../nodes/2.DMd27nZw.js"),__vite__mapDeps([10,1,2,9,11,4,7,3,6,12]),import.meta.url)],Be=[],Ie={"/":[2]},Y={handleError:(({error:t})=>{console.error(t)}),reroute:(()=>{}),transport:{}},Pe=Object.fromEntries(Object.entries(Y.transport).map(([t,e])=>[t,e.decode])),Te=Object.fromEntries(Object.entries(Y.transport).map(([t,e])=>[t,e.encode])),De=!1,Ve=(t,e)=>Pe[t](e);export{Ve as decode,Pe as decoders,Ie as dictionary,Te as encoders,De as hash,Y as hooks,Se as matchers,Ae as nodes,Ce as root,Be as server_loads}; diff --git a/frontend/dist/_app/immutable/entry/start.Ca27w5R7.js b/frontend/dist/_app/immutable/entry/start.Ca27w5R7.js deleted file mode 100644 index 2f7d149..0000000 --- a/frontend/dist/_app/immutable/entry/start.Ca27w5R7.js +++ /dev/null @@ -1 +0,0 @@ -import{l as o,a as r}from"../chunks/BI00lc_u.js";export{o as load_css,r as start}; diff --git a/frontend/dist/_app/immutable/entry/start.DAMzTXjZ.js b/frontend/dist/_app/immutable/entry/start.DAMzTXjZ.js new file mode 100644 index 0000000..b590243 --- /dev/null +++ b/frontend/dist/_app/immutable/entry/start.DAMzTXjZ.js @@ -0,0 +1 @@ +import{l as o,a as r}from"../chunks/mtaKwlL3.js";export{o as load_css,r as start}; diff --git a/frontend/dist/_app/immutable/nodes/1.DU6Ijmpv.js b/frontend/dist/_app/immutable/nodes/1.ccHAett1.js similarity index 78% rename from frontend/dist/_app/immutable/nodes/1.DU6Ijmpv.js rename to frontend/dist/_app/immutable/nodes/1.ccHAett1.js index 6885a46..e683121 100644 --- a/frontend/dist/_app/immutable/nodes/1.DU6Ijmpv.js +++ b/frontend/dist/_app/immutable/nodes/1.ccHAett1.js @@ -1 +1 @@ -import{a as g,f as h}from"../chunks/C14P8jaG.js";import{i as l}from"../chunks/DmjnTBOd.js";import{x as v,g as d,y as x,z as _,A as e,B as o,C as $}from"../chunks/VJhVTb1A.js";import{s as p}from"../chunks/BeON-0X8.js";import{s as k,p as m}from"../chunks/BI00lc_u.js";const b={get error(){return m.error},get status(){return m.status}};k.updated.check;const i=b;var y=h("

",1);function j(f,n){v(n,!1),l();var t=y(),r=d(t),c=e(r,!0);o(r);var s=$(r,2),u=e(s,!0);o(s),x(()=>{var a;p(c,i.status),p(u,(a=i.error)==null?void 0:a.message)}),g(f,t),_()}export{j as component}; +import{a as g,f as h}from"../chunks/C14P8jaG.js";import{i as l}from"../chunks/DmjnTBOd.js";import{x as v,g as d,y as x,z as _,A as e,B as o,C as $}from"../chunks/VJhVTb1A.js";import{s as p}from"../chunks/BeON-0X8.js";import{s as k,p as m}from"../chunks/mtaKwlL3.js";const b={get error(){return m.error},get status(){return m.status}};k.updated.check;const i=b;var y=h("

",1);function j(f,n){v(n,!1),l();var t=y(),r=d(t),c=e(r,!0);o(r);var s=$(r,2),u=e(s,!0);o(s),x(()=>{var a;p(c,i.status),p(u,(a=i.error)==null?void 0:a.message)}),g(f,t),_()}export{j as component}; diff --git a/frontend/dist/_app/immutable/nodes/2.DMd27nZw.js b/frontend/dist/_app/immutable/nodes/2.DMd27nZw.js new file mode 100644 index 0000000..cc0899e --- /dev/null +++ b/frontend/dist/_app/immutable/nodes/2.DMd27nZw.js @@ -0,0 +1,1190 @@ +import{b as Pr,a as u,f as S,c as be,t as Ue,d as It}from"../chunks/C14P8jaG.js";import{o as Zn,a as fr}from"../chunks/Cz6m6K8p.js";import{h as Le,L as $t,G as Tt,c as Er,J as Bt,b as Jn,o as e,N as ja,ag as Va,O as En,P as Dt,f as mt,ay as ea,aF as Ua,ao as Rn,e as pt,a as ur,aM as Ba,s as qa,a5 as Ka,aN as ta,aE as dn,aO as Ga,a7 as Nn,aP as Wa,aQ as Xa,aI as Ya,aR as gt,aS as ra,a1 as Qa,r as na,p as aa,aT as Ur,ae as sa,aU as Za,aV as Ja,aC as es,m as ts,d as Nr,az as oa,y as ee,F as ia,aW as rs,aG as ns,aA as as,D as la,aX as ca,aY as ss,aZ as os,E as is,aw as ua,S as Dr,k as Mr,a_ as da,a$ as ls,b0 as cs,b1 as fa,b2 as us,b3 as ds,b4 as vr,b5 as fs,b6 as vs,b7 as gs,b8 as hs,b9 as ps,ba as ms,bb as _s,aJ as Pt,U as bs,aK as z,_ as ie,$ as f,A as k,B as p,x as Me,g as K,z as Ae,C as P,j as Re,ap as ke,aL as j,bc as xs,q as Ht,bd as ys,be as ot,bf as ws}from"../chunks/VJhVTb1A.js";import{p as he,i as Q,b as rt,c as ks,l as He,s as Be}from"../chunks/zf4GFcxs.js";import{i as Cs,a as Ss,d as ce,b as Ge,c as $s,n as Ps,e as Es,s as ne,f as tt}from"../chunks/BeON-0X8.js";import{s as ft}from"../chunks/CiUbu-1F.js";import{i as Rs}from"../chunks/DmjnTBOd.js";import{B as Ns}from"../chunks/U5yjBaoU.js";function fn(t,r){return r}function Ms(t,r,a){for(var n=[],s=r.length,i,o=r.length,l=0;l{if(i){if(i.pending.delete(A),i.done.add(A),i.pending.size===0){var m=t.outrogroups;Qr(t,dn(i.done)),m.delete(i),m.size===0&&(t.outrogroups=null)}}else o-=1},!1)}if(o===0){var d=n.length===0&&a!==null;if(d){var b=a,x=b.parentNode;es(x),x.append(b),t.items.clear()}Qr(t,r,!d)}else i={pending:new Set(r),done:new Set},(t.outrogroups??(t.outrogroups=new Set)).add(i)}function Qr(t,r,a=!0){var n;if(t.pending.size>0){n=new Set;for(const o of t.pending.values())for(const l of o)n.add(t.items.get(l).e)}for(var s=0;s{var h=a();return ta(h)?h:h==null?[]:dn(h)}),m,N=new Map,T=!0;function g(h){(E.effect.f&Qa)===0&&(E.pending.delete(h),E.fallback=x,As(E,m,o,r,n),x!==null&&(m.length===0?(x.f>)===0?na(x):(x.f^=gt,ir(x,null,o)):aa(x,()=>{x=null})))}function c(h){E.pending.delete(h)}var w=Jn(()=>{m=e(A);var h=m.length;let y=!1;if(Le){var C=ja(o)===Va;C!==(h===0)&&(o=En(),$t(o),Dt(!1),y=!0)}for(var _=new Set,M=pt,F=qa(),L=0;Li(o)):(x=ur(()=>i(Mn??(Mn=Er()))),x.f|=gt)),h>_.size&&Ba(),Le&&h>0&&$t(En()),!T)if(N.set(M,_),F){for(const[V,G]of l)_.has(V)||M.skip_effect(G.e);M.oncommit(g),M.ondiscard(c)}else g(M);y&&Dt(!0),e(A)}),E={effect:w,items:l,pending:N,outrogroups:null,fallback:x};T=!1,Le&&(o=mt)}function nr(t){for(;t!==null&&(t.f&Za)===0;)t=t.next;return t}function As(t,r,a,n,s){var B,I,O,V,G,J,se,R,$;var i=(n&Ja)!==0,o=r.length,l=t.items,d=nr(t.effect.first),b,x=null,A,m=[],N=[],T,g,c,w;if(i)for(w=0;w0){var L=(n&ra)!==0&&o===0?a:null;if(i){for(w=0;w{var H,D;if(A!==void 0)for(c of A)(D=(H=c.nodes)==null?void 0:H.a)==null||D.apply()})}function Ts(t,r,a,n,s,i,o,l){var d=(o&Wa)!==0?(o&Xa)===0?Ya(a,!1,!1):Nn(a):null,b=(o&Ga)!==0?Nn(s):null;return{v:d,i:b,e:ur(()=>(i(r,d??a,b??s,l),()=>{t.delete(n)}))}}function ir(t,r,a){if(t.nodes)for(var n=t.nodes.start,s=t.nodes.end,i=r&&(r.f>)===0?r.nodes.start:a;n!==null;){var o=oa(n);if(i.before(n),n===s)return;n=o}}function yt(t,r,a){r===null?t.effect.first=a:r.next=a,a===null?t.effect.last=r:a.prev=r}function zr(t,r,a=!1,n=!1,s=!1,i=!1){var o=t,l="";if(a){var d=t;Le&&(o=$t(Tt(d)))}ee(()=>{var b=ia;if(l===(l=r()??"")){Le&&Bt();return}if(a&&!Le){b.nodes=null,d.innerHTML=l,l!==""&&Pr(Tt(d),d.lastChild);return}if(b.nodes!==null&&(rs(b.nodes.start,b.nodes.end),b.nodes=null),l!==""){if(Le){mt.data;for(var x=Bt(),A=x;x!==null&&(x.nodeType!==ea||x.data!=="");)A=x,x=oa(x);if(x===null)throw ns(),as;Pr(mt,A),o=$t(x);return}var m=n?ca:s?ss:void 0,N=la(n?"svg":s?"math":"template",m);N.innerHTML=l;var T=n||s?N:N.content;if(Pr(Tt(T),T.lastChild),n||s)for(;Tt(T);)o.before(Tt(T));else o.before(T)}})}function je(t,r,a,n,s){var l;Le&&Bt();var i=(l=r.$$slots)==null?void 0:l[a],o=!1;i===!0&&(i=r.children,o=!0),i===void 0||i(t,o?()=>n:n)}function Ls(t,r,a,n,s,i){let o=Le;Le&&Bt();var l=null;Le&&mt.nodeType===os&&(l=mt,Bt());var d=Le?mt:t,b=new Ns(d,!1);Jn(()=>{const x=r()||null;var A=ca;if(x===null){b.ensure(null,null);return}return b.ensure(x,m=>{if(x){if(l=Le?l:la(x,A),Pr(l,l),n){Le&&Cs(x)&&l.append(document.createComment(""));var N=Le?Tt(l):l.appendChild(Er());Le&&(N===null?Dt(!1):$t(N)),n(l,N)}ia.nodes.end=l,m.before(l)}Le&&$t(m)}),()=>{}},is),ua(()=>{}),o&&(Dt(!0),$t(d))}function Fs(t,r,a){Dr(()=>{var n=Mr(()=>r(t,a==null?void 0:a())||{});if(n!=null&&n.destroy)return()=>n.destroy()})}function Ds(t,r){var a=void 0,n;da(()=>{a!==(a=r())&&(n&&(Nr(n),n=null),a&&(n=ur(()=>{Dr(()=>a(t))})))})}function va(t){var r,a,n="";if(typeof t=="string"||typeof t=="number")n+=t;else if(typeof t=="object")if(Array.isArray(t)){var s=t.length;for(r=0;r=0;){var l=o+i;(o===0||An.includes(n[o-1]))&&(l===n.length||An.includes(n[l]))?n=(o===0?"":n.substring(0,o))+n.substring(l+1):o=l}}return n===""?null:n}function Tn(t,r=!1){var a=r?" !important;":";",n="";for(var s of Object.keys(t)){var i=t[s];i!=null&&i!==""&&(n+=" "+s+": "+i+a)}return n}function Br(t){return t[0]!=="-"||t[1]!=="-"?t.toLowerCase():t}function Os(t,r){if(r){var a="",n,s;if(Array.isArray(r)?(n=r[0],s=r[1]):n=r,t){t=String(t).replaceAll(/\s*\/\*.*?\*\/\s*/g,"").trim();var i=!1,o=0,l=!1,d=[];n&&d.push(...Object.keys(n).map(Br)),s&&d.push(...Object.keys(s).map(Br));var b=0,x=-1;const g=t.length;for(var A=0;A{Ar(t,t.__value)});r.observe(t,{childList:!0,subtree:!0,attributes:!0,attributeFilter:["value"]}),ua(()=>{r.disconnect()})}function Hs(t,r,a=r){var n=new WeakSet,s=!0;fa(t,"change",i=>{var o=i?"[selected]":":checked",l;if(t.multiple)l=[].map.call(t.querySelectorAll(o),cr);else{var d=t.querySelector(o)??t.querySelector("option:not([disabled])");l=d&&cr(d)}a(l),t.__value=l,pt!==null&&n.add(pt)}),Dr(()=>{var i=r();if(t===document.activeElement){var o=pt;if(n.has(o))return}if(Ar(t,i,s),s&&i===void 0){var l=t.querySelector(":checked");l!==null&&(i=cr(l),a(i))}t.__value=i,s=!1}),ga(t)}function cr(t){return"__value"in t?t.__value:t.value}const ar=Symbol("class"),sr=Symbol("style"),ha=Symbol("is custom element"),pa=Symbol("is html"),js=vr?"link":"LINK",Vs=vr?"input":"INPUT",Us=vr?"option":"OPTION",Bs=vr?"select":"SELECT",qs=vr?"progress":"PROGRESS";function Xe(t){if(Le){var r=!1,a=()=>{if(!r){if(r=!0,t.hasAttribute("value")){var n=t.value;we(t,"value",null),t.value=n}if(t.hasAttribute("checked")){var s=t.checked;we(t,"checked",null),t.checked=s}}};t.__on_r=a,sa(a),gs()}}function vn(t,r){var a=gn(t);a.value===(a.value=r??void 0)||t.value===r&&(r!==0||t.nodeName!==qs)||(t.value=r??"")}function Ks(t,r){r?t.hasAttribute("selected")||t.setAttribute("selected",""):t.removeAttribute("selected")}function we(t,r,a,n){var s=gn(t);Le&&(s[r]=t.getAttribute(r),r==="src"||r==="srcset"||r==="href"&&t.nodeName===js)||s[r]!==(s[r]=a)&&(r==="loading"&&(t[ms]=a),a==null?t.removeAttribute(r):typeof a!="string"&&ma(t).includes(r)?t[r]=a:t.setAttribute(r,a))}function Gs(t,r,a,n,s=!1,i=!1){if(Le&&s&&t.nodeName===Vs){var o=t,l=o.type==="checkbox"?"defaultChecked":"defaultValue";l in a||Xe(o)}var d=gn(t),b=d[ha],x=!d[pa];let A=Le&&b;A&&Dt(!1);var m=r||{},N=t.nodeName===Us;for(var T in r)T in a||(a[T]=null);a.class?a.class=dt(a.class):a[ar]&&(a.class=null),a[sr]&&(a.style??(a.style=null));var g=ma(t);for(const _ in a){let M=a[_];if(N&&_==="value"&&M==null){t.value=t.__value="",m[_]=M;continue}if(_==="class"){var c=t.namespaceURI==="http://www.w3.org/1999/xhtml";Ce(t,c,M,n,r==null?void 0:r[ar],a[ar]),m[_]=M,m[ar]=a[ar];continue}if(_==="style"){Ze(t,M,r==null?void 0:r[sr],a[sr]),m[_]=M,m[sr]=a[sr];continue}var w=m[_];if(!(M===w&&!(M===void 0&&t.hasAttribute(_)))){m[_]=M;var E=_[0]+_[1];if(E!=="$$")if(E==="on"){const F={},L="$$"+_;let B=_.slice(2);var h=Es(B);if(Ss(B)&&(B=B.slice(0,-7),F.capture=!0),!h&&w){if(M!=null)continue;t.removeEventListener(B,m[L],F),m[L]=null}if(h)ce(B,t,M),Ge([B]);else if(M!=null){let I=function(O){m[_].call(this,O)};m[L]=$s(B,t,I,F)}}else if(_==="style")we(t,_,M);else if(_==="autofocus")fs(t,!!M);else if(!b&&(_==="__value"||_==="value"&&M!=null))t.value=t.__value=M;else if(_==="selected"&&N)Ks(t,M);else{var y=_;x||(y=Ps(y));var C=y==="defaultValue"||y==="defaultChecked";if(M==null&&!b&&!C)if(d[_]=null,y==="value"||y==="checked"){let F=t;const L=r===void 0;if(y==="value"){let B=F.defaultValue;F.removeAttribute(y),F.defaultValue=B,F.value=F.__value=L?B:null}else{let B=F.defaultChecked;F.removeAttribute(y),F.defaultChecked=B,F.checked=L?B:!1}}else t.removeAttribute(_);else C||g.includes(y)&&(b||typeof M!="string")?(t[y]=M,y in d&&(d[y]=vs)):typeof M!="function"&&we(t,y,M)}}}return A&&Dt(!0),m}function Ln(t,r,a=[],n=[],s=[],i,o=!1,l=!1){us(s,a,n,d=>{var b=void 0,x={},A=t.nodeName===Bs,m=!1;if(da(()=>{var T=r(...d.map(e)),g=Gs(t,b,T,i,o,l);m&&A&&"value"in T&&Ar(t,T.value);for(let w of Object.getOwnPropertySymbols(x))T[w]||Nr(x[w]);for(let w of Object.getOwnPropertySymbols(T)){var c=T[w];w.description===ds&&(!b||c!==b[w])&&(x[w]&&Nr(x[w]),x[w]=ur(()=>Ds(t,()=>c))),g[w]=c}b=g}),A){var N=t;Dr(()=>{Ar(N,b.value,!0),ga(N)})}m=!0})}function gn(t){return t.__attributes??(t.__attributes={[ha]:t.nodeName.includes("-"),[pa]:t.namespaceURI===hs})}var Fn=new Map;function ma(t){var r=t.getAttribute("is")||t.nodeName,a=Fn.get(r);if(a)return a;Fn.set(r,a=[]);for(var n,s=t,i=Element.prototype;i!==s;){n=_s(s);for(var o in n)n[o].set&&a.push(o);s=ps(s)}return a}function et(t,r,a=r){var n=new WeakSet;fa(t,"input",async s=>{var i=s?t.defaultValue:t.value;if(i=Kr(t)?Gr(i):i,a(i),pt!==null&&n.add(pt),await Pt(),i!==(i=r())){var o=t.selectionStart,l=t.selectionEnd,d=t.value.length;if(t.value=i??"",l!==null){var b=t.value.length;o===l&&l===d&&b>d?(t.selectionStart=b,t.selectionEnd=b):(t.selectionStart=o,t.selectionEnd=Math.min(l,b))}}}),(Le&&t.defaultValue!==t.value||Mr(r)==null&&t.value)&&(a(Kr(t)?Gr(t.value):t.value),pt!==null&&n.add(pt)),bs(()=>{var s=r();if(t===document.activeElement){var i=pt;if(n.has(i))return}Kr(t)&&s===Gr(t.value)||t.type==="date"&&!s&&!t.value||s!==t.value&&(t.value=s??"")})}function Kr(t){var r=t.type;return r==="number"||r==="range"}function Gr(t){return t===""?null:+t}let bt=z(ie({type:"none",props:{},resolve:null}));function Ws(){return e(bt)}function st(t=void 0){const{resolve:r}=e(bt);f(bt,{type:"none",props:{},resolve:null},!0),r==null||r(t)}function Xs(t){return new Promise(r=>{f(bt,{type:"run",props:{cases:t},resolve:r},!0)})}function Ys(t){return new Promise(r=>{f(bt,{type:"restart",props:{cases:t},resolve:r},!0)})}function Qs(t){return new Promise(r=>{f(bt,{type:"clean",props:{cases:t},resolve:r},!0)})}function We(t,r="Alert"){return new Promise(a=>{f(bt,{type:"alert",props:{title:r,message:t},resolve:()=>a()},!0)})}function Dn(t,r="Confirm",a="OK",n="primary"){return new Promise(s=>{f(bt,{type:"confirm",props:{title:r,message:t,confirmLabel:a,confirmVariant:n},resolve:s},!0)})}function hn(t,r="",a="Input",n="",s=!1){return new Promise(i=>{f(bt,{type:"prompt",props:{title:a,message:t,value:r,placeholder:n,multiline:s},resolve:i},!0)})}var Zs=S('
');function Qt(t,r){function a(i){return document.body.appendChild(i),{destroy(){i.remove()}}}var n=Zs(),s=k(n);ft(s,()=>r.children),p(n),Fs(n,i=>a==null?void 0:a(i)),u(t,n)}var Js=S('
'),eo=S('
');function gr(t,r){Me(r,!0);const a=T=>{var g=eo(),c=k(g),w=k(c),E=k(w),h=k(E,!0);p(E);var y=P(E,2);{var C=L=>{var B=Js(),I=k(B,!0);p(B),ee(()=>ne(I,r.subtitle)),u(L,B)};Q(y,L=>{r.subtitle&&L(C)})}p(w);var _=P(w,2);ft(_,()=>r.children);var M=P(_,2),F=k(M);ft(F,()=>r.footer),p(M),p(c),p(g),ee(()=>{Ce(c,1,`w-[min(${n()??""},96vw)] bg-white border border-border rounded-[10px] p-4.5`),we(c,"aria-labelledby",r.titleId),we(E,"id",r.titleId),ne(h,r.title)}),ce("keydown",g,o),ce("mousedown",g,d),ce("click",g,b),u(T,g)};let n=he(r,"maxWidth",3,"520px"),s=he(r,"portal",3,!1);function i(){r.onCancel?r.onCancel():st(null)}function o(T){T.key==="Escape"?i():T.key==="Enter"&&r.onConfirm&&r.onConfirm()}let l=!1;function d(T){l=T.target.dataset.backdrop!==void 0}function b(T){const g=T.target.dataset.backdrop!==void 0;l&&g&&i(),l=!1}var x=be(),A=K(x);{var m=T=>{Qt(T,{children:(g,c)=>{a(g)}})},N=T=>{a(T)};Q(A,T=>{s()?T(m):T(N,-1)})}u(t,x),Ae()}Ge(["keydown","mousedown","click"]);var to=S("");function Pe(t,r){let a=he(r,"variant",3,"primary"),n=he(r,"size",3,"default"),s=he(r,"disabled",3,!1);const i={default:"h-[34px] rounded-md px-3.5 leading-none text-[13px] tracking-wide",sm:"h-[30px] rounded-md px-2.5 leading-none text-xs"},o={primary:"bg-edf-bleu-moyen text-white border-none hover:bg-[rgb(12,72,170)]",secondary:"bg-white text-ink border border-border hover:bg-edf-gris-clair",run:"bg-edf-vert-fonce text-white border-none hover:bg-[rgb(38,98,12)]",warning:"bg-edf-orange-moyen text-white border-none hover:bg-[rgb(230,118,20)]",danger:"bg-edf-orange-fonce text-white border-none hover:bg-[rgb(180,56,8)]"};var l=to(),d=k(l);ft(d,()=>r.children),p(l),ee(()=>{Ce(l,1,`inline-flex items-center justify-center gap-1.5 font-bold cursor-pointer transition-colors duration-150 disabled:opacity-40 disabled:pointer-events-none ${i[n()]??""} ${o[a()]??""}`),l.disabled=s()}),ce("click",l,function(...b){var x;(x=r.onclick)==null||x.apply(this,b)}),u(t,l)}Ge(["click"]);var ro=S(" ",1),no=S(''),ao=S(''),so=S('
'),oo=S('

',1);function io(t,r){Me(r,!0);let a=he(r,"confirmLabel",3,"OK"),n=he(r,"confirmVariant",3,"primary"),s=he(r,"value",3,""),i=he(r,"placeholder",3,""),o=he(r,"multiline",3,!1);const l=s();let d=z(ie(l)),b=z(void 0),x=z(void 0);Re(()=>{var N;r.mode==="prompt"&&e(b)?(e(b).focus(),"select"in e(b)&&e(b).select()):e(x)&&((N=e(x).querySelector("button"))==null||N.focus())});function A(){r.mode==="prompt"?st(e(d)):r.mode==="confirm"?st(!0):st()}function m(){r.mode==="confirm"?st(!1):r.mode==="prompt"?st(null):st()}{const N=g=>{var c=ro(),w=K(c);{var E=C=>{Pe(C,{variant:"secondary",onclick:m,children:(_,M)=>{ke();var F=Ue("Cancel");u(_,F)},$$slots:{default:!0}})};Q(w,C=>{r.mode!=="alert"&&C(E)})}var h=P(w,2),y=k(h);Pe(y,{get variant(){return n()},onclick:A,children:(C,_)=>{ke();var M=Ue();ee(()=>ne(M,a())),u(C,M)},$$slots:{default:!0}}),p(h),rt(h,C=>f(x,C),()=>e(x)),u(g,c)};let T=j(()=>o()?void 0:A);gr(t,{get title(){return r.title},titleId:"app-dialog-title",get onConfirm(){return e(T)},onCancel:m,footer:N,children:(g,c)=>{var w=oo(),E=K(w),h=k(E,!0);p(E);var y=P(E,2);{var C=_=>{var M=so(),F=k(M);{var L=I=>{var O=no();xs(O),rt(O,V=>f(b,V),()=>e(b)),ee(()=>we(O,"placeholder",i())),et(O,()=>e(d),V=>f(d,V)),u(I,O)},B=I=>{var O=ao();Xe(O),rt(O,V=>f(b,V),()=>e(b)),ee(()=>we(O,"placeholder",i())),et(O,()=>e(d),V=>f(d,V)),u(I,O)};Q(F,I=>{o()?I(L):I(B,-1)})}p(M),u(_,M)};Q(y,_=>{r.mode==="prompt"&&_(C)})}ee(()=>ne(h,r.message)),u(g,w)},$$slots:{footer:!0,default:!0}})}Ae()}var lo=S('');function Ne(t,r){var a=lo(),n=k(a),s=P(n);ft(s,()=>r.children),p(a),ee(()=>ne(n,`${r.text??""} `)),u(t,a)}function kt(t,r){const a=localStorage.getItem(t);if(a===null)return r;const n=Number(a);return Number.isFinite(n)?n:r}function Ct(t,r){Number.isFinite(r)&&localStorage.setItem(t,String(r))}function co(t,r){return localStorage.getItem(t)??r}function uo(){return{n:kt("csauto_run_n",1),nt:kt("csauto_run_nt",1),maxParallel:kt("csauto_run_max_parallel",0)||null}}function fo(t){Ct("csauto_run_n",t.n),Ct("csauto_run_nt",t.nt),t.maxParallel&&Ct("csauto_run_max_parallel",t.maxParallel)}function vo(){return{n:kt("csauto_restart_n",1),nt:kt("csauto_restart_nt",1),maxParallel:kt("csauto_restart_max_parallel",0)||null,mode:co("csauto_restart_mode","iterations"),value:kt("csauto_restart_value",100)}}function go(t){Ct("csauto_restart_n",t.n),Ct("csauto_restart_nt",t.nt),t.maxParallel&&Ct("csauto_restart_max_parallel",t.maxParallel),localStorage.setItem("csauto_restart_mode",t.mode),Ct("csauto_restart_value",t.value)}function ho(){return{keepLast:kt("csauto_clean_keep_last",1)}}function po(t){Ct("csauto_clean_keep_last",t.keepLast)}var mo=S(" ",1),_o=S(''),bo=S(''),xo=S(''),yo=S('
');function wo(t,r){Me(r,!0);const a=uo(),n=a.maxParallel??(r.cases.length>1?r.cases.length:0);let s=z(ie(a.n)),i=z(ie(a.nt)),o=z(ie(n));async function l(){if(!Number.isFinite(e(s))||e(s)<=0){await We("MPI ranks must be an integer > 0.","Invalid value");return}if(!Number.isFinite(e(i))||e(i)<=0){await We("Threads must be an integer > 0.","Invalid value");return}if(e(o)&&(!Number.isFinite(e(o))||e(o)<=0)){await We("Max parallel must be empty or > 0.","Invalid value");return}const d={n:e(s),nt:e(i),maxParallel:e(o)||null};fo(d),st(d)}{const d=A=>{var m=mo(),N=K(m);Pe(N,{variant:"secondary",onclick:()=>st(null),children:(g,c)=>{ke();var w=Ue("Cancel");u(g,w)},$$slots:{default:!0}});var T=P(N,2);Pe(T,{variant:"run",onclick:l,children:(g,c)=>{ke();var w=Ue("Run");u(g,w)},$$slots:{default:!0}}),u(A,m)};let b=j(()=>r.cases.length),x=j(()=>r.cases.length>1?"s":"");gr(t,{title:"Run Cases",titleId:"run-dialog-title",get subtitle(){return`${e(b)??""} case${e(x)??""} selected`},onConfirm:l,footer:d,children:(A,m)=>{var N=yo(),T=k(N);Ne(T,{text:"MPI Ranks (n)",children:(w,E)=>{var h=_o();Xe(h),et(h,()=>e(s),y=>f(s,y)),u(w,h)}});var g=P(T,2);Ne(g,{text:"OMP Threads (nt)",children:(w,E)=>{var h=bo();Xe(h),et(h,()=>e(i),y=>f(i,y)),u(w,h)}});var c=P(g,2);Ne(c,{text:"Max Parallel",children:(w,E)=>{var h=xo();Xe(h),et(h,()=>e(o),y=>f(o,y)),u(w,h)}}),p(N),u(A,N)},$$slots:{footer:!0,default:!0}})}Ae()}var ko=S(" ",1),Co=S(''),So=S(''),$o=S(''),Po=S(""),Eo=S(''),Ro=S('
',1);function No(t,r){Me(r,!0);const a=vo(),n=a.maxParallel??(r.cases.length>1?r.cases.length:0);let s=z(ie(a.n)),i=z(ie(a.nt)),o=z(ie(n)),l=z(ie(a.mode)),d=z(ie(a.value)),b=j(()=>e(l)==="iterations"?"Additional iterations":"Additional physical time"),x=j(()=>e(l)==="iterations"?"1":"any"),A=j(()=>e(l)==="iterations"?"1":"0");async function m(){if(!Number.isFinite(e(s))||e(s)<=0){await We("MPI ranks must be an integer > 0.","Invalid value");return}if(!Number.isFinite(e(i))||e(i)<=0){await We("Threads must be an integer > 0.","Invalid value");return}if(e(o)&&(!Number.isFinite(e(o))||e(o)<=0)){await We("Max parallel must be empty or > 0.","Invalid value");return}if(!Number.isFinite(e(d))||e(d)<=0){await We("Value must be > 0.","Invalid value");return}if(e(l)==="iterations"&&!Number.isInteger(e(d))){await We("Iterations must be an integer.","Invalid value");return}const N={n:e(s),nt:e(i),maxParallel:e(o)||null,restartMode:e(l),restartValue:e(d)};go({n:e(s),nt:e(i),maxParallel:e(o)||null,mode:e(l),value:e(d)}),st(N)}{const N=c=>{var w=ko(),E=K(w);Pe(E,{variant:"secondary",onclick:()=>st(null),children:(y,C)=>{ke();var _=Ue("Cancel");u(y,_)},$$slots:{default:!0}});var h=P(E,2);Pe(h,{variant:"warning",onclick:m,children:(y,C)=>{ke();var _=Ue("Restart");u(y,_)},$$slots:{default:!0}}),u(c,w)};let T=j(()=>r.cases.length),g=j(()=>r.cases.length>1?"s":"");gr(t,{title:"Restart Cases",titleId:"restart-dialog-title",get subtitle(){return`${e(T)??""} case${e(g)??""} selected`},onConfirm:m,footer:N,children:(c,w)=>{var E=Ro(),h=K(E),y=k(h);Ne(y,{text:"MPI Ranks (n)",children:(B,I)=>{var O=Co();Xe(O),et(O,()=>e(s),V=>f(s,V)),u(B,O)}});var C=P(y,2);Ne(C,{text:"OMP Threads (nt)",children:(B,I)=>{var O=So();Xe(O),et(O,()=>e(i),V=>f(i,V)),u(B,O)}});var _=P(C,2);Ne(_,{text:"Max Parallel",children:(B,I)=>{var O=$o();Xe(O),et(O,()=>e(o),V=>f(o,V)),u(B,O)}}),p(h);var M=P(h,2),F=k(M);Ne(F,{text:"Stop criterion",children:(B,I)=>{var O=Po(),V=k(O);V.value=V.__value="iterations";var G=P(V);G.value=G.__value="physical_time",p(O),Hs(O,()=>e(l),J=>f(l,J)),u(B,O)}});var L=P(F,2);Ne(L,{get text(){return e(b)},children:(B,I)=>{var O=Eo();Xe(O),ee(()=>{we(O,"min",e(A)),we(O,"step",e(x))}),et(O,()=>e(d),V=>f(d,V)),u(B,O)}}),p(M),u(c,E)},$$slots:{footer:!0,default:!0}})}Ae()}function Te(t,r){let a=he(r,"size",3,14);var n=be(),s=K(n);ks(s,()=>r.icon,(i,o)=>{o(i,{get size(){return a()},class:"icon"})}),u(t,n)}/** + * @license lucide-svelte v1.0.1 - ISC + * + * ISC License + * + * Copyright (c) 2026 Lucide Icons and Contributors + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * --- + * + * The following Lucide icons are derived from the Feather project: + * + * airplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out + * + * The MIT License (MIT) (for the icons listed above) + * + * Copyright (c) 2013-present Cole Bemis + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + */const Mo={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":2,"stroke-linecap":"round","stroke-linejoin":"round"};/** + * @license lucide-svelte v1.0.1 - ISC + * + * ISC License + * + * Copyright (c) 2026 Lucide Icons and Contributors + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * --- + * + * The following Lucide icons are derived from the Feather project: + * + * airplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out + * + * The MIT License (MIT) (for the icons listed above) + * + * Copyright (c) 2013-present Cole Bemis + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + */const Ao=t=>{for(const r in t)if(r.startsWith("aria-")||r==="role"||r==="title")return!0;return!1};/** + * @license lucide-svelte v1.0.1 - ISC + * + * ISC License + * + * Copyright (c) 2026 Lucide Icons and Contributors + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * --- + * + * The following Lucide icons are derived from the Feather project: + * + * airplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out + * + * The MIT License (MIT) (for the icons listed above) + * + * Copyright (c) 2013-present Cole Bemis + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + */const zn=(...t)=>t.filter((r,a,n)=>!!r&&r.trim()!==""&&n.indexOf(r)===a).join(" ").trim();var To=It("");function qe(t,r){const a=He(r,["children","$$slots","$$events","$$legacy"]),n=He(a,["name","color","size","strokeWidth","absoluteStrokeWidth","iconNode"]);Me(r,!1);let s=he(r,"name",8,void 0),i=he(r,"color",8,"currentColor"),o=he(r,"size",8,24),l=he(r,"strokeWidth",8,2),d=he(r,"absoluteStrokeWidth",8,!1),b=he(r,"iconNode",24,()=>[]);Rs();var x=To();Ln(x,(N,T,g)=>({...Mo,...N,...n,width:o(),height:o(),stroke:i(),"stroke-width":T,class:g}),[()=>Ao(n)?void 0:{"aria-hidden":"true"},()=>(Ht(d()),Ht(l()),Ht(o()),Mr(()=>d()?Number(l())*24/Number(o()):l())),()=>(Ht(zn),Ht(s()),Ht(a),Mr(()=>zn("lucide-icon","lucide",s()?`lucide-${s()}`:"",a.class)))]);var A=k(x);Ye(A,1,b,fn,(N,T)=>{var g=j(()=>ys(e(T),2));let c=()=>e(g)[0],w=()=>e(g)[1];var E=be(),h=K(E);Ls(h,c,!0,(y,C)=>{Ln(y,()=>({...w()}))}),u(N,E)});var m=P(A);je(m,r,"default",{}),p(x),u(t,x),Ae()}function Lo(t,r){const a=He(r,["children","$$slots","$$events","$$legacy"]);/** + * @license lucide-svelte v1.0.1 - ISC + * + * ISC License + * + * Copyright (c) 2026 Lucide Icons and Contributors + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * --- + * + * The following Lucide icons are derived from the Feather project: + * + * airplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out + * + * The MIT License (MIT) (for the icons listed above) + * + * Copyright (c) 2013-present Cole Bemis + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + */const n=[["path",{d:"M12 5v14"}],["path",{d:"m19 12-7 7-7-7"}]];qe(t,Be({name:"arrow-down"},()=>a,{get iconNode(){return n},children:(s,i)=>{var o=be(),l=K(o);je(l,r,"default",{}),u(s,o)},$$slots:{default:!0}}))}function Fo(t,r){const a=He(r,["children","$$slots","$$events","$$legacy"]);/** + * @license lucide-svelte v1.0.1 - ISC + * + * ISC License + * + * Copyright (c) 2026 Lucide Icons and Contributors + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * --- + * + * The following Lucide icons are derived from the Feather project: + * + * airplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out + * + * The MIT License (MIT) (for the icons listed above) + * + * Copyright (c) 2013-present Cole Bemis + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + */const n=[["path",{d:"M8 3 4 7l4 4"}],["path",{d:"M4 7h16"}],["path",{d:"m16 21 4-4-4-4"}],["path",{d:"M20 17H4"}]];qe(t,Be({name:"arrow-left-right"},()=>a,{get iconNode(){return n},children:(s,i)=>{var o=be(),l=K(o);je(l,r,"default",{}),u(s,o)},$$slots:{default:!0}}))}function Do(t,r){const a=He(r,["children","$$slots","$$events","$$legacy"]);/** + * @license lucide-svelte v1.0.1 - ISC + * + * ISC License + * + * Copyright (c) 2026 Lucide Icons and Contributors + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * --- + * + * The following Lucide icons are derived from the Feather project: + * + * airplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out + * + * The MIT License (MIT) (for the icons listed above) + * + * Copyright (c) 2013-present Cole Bemis + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + */const n=[["path",{d:"m5 12 7-7 7 7"}],["path",{d:"M12 19V5"}]];qe(t,Be({name:"arrow-up"},()=>a,{get iconNode(){return n},children:(s,i)=>{var o=be(),l=K(o);je(l,r,"default",{}),u(s,o)},$$slots:{default:!0}}))}function pn(t,r){const a=He(r,["children","$$slots","$$events","$$legacy"]);/** + * @license lucide-svelte v1.0.1 - ISC + * + * ISC License + * + * Copyright (c) 2026 Lucide Icons and Contributors + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * --- + * + * The following Lucide icons are derived from the Feather project: + * + * airplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out + * + * The MIT License (MIT) (for the icons listed above) + * + * Copyright (c) 2013-present Cole Bemis + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + */const n=[["path",{d:"m6 9 6 6 6-6"}]];qe(t,Be({name:"chevron-down"},()=>a,{get iconNode(){return n},children:(s,i)=>{var o=be(),l=K(o);je(l,r,"default",{}),u(s,o)},$$slots:{default:!0}}))}function zo(t,r){const a=He(r,["children","$$slots","$$events","$$legacy"]);/** + * @license lucide-svelte v1.0.1 - ISC + * + * ISC License + * + * Copyright (c) 2026 Lucide Icons and Contributors + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * --- + * + * The following Lucide icons are derived from the Feather project: + * + * airplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out + * + * The MIT License (MIT) (for the icons listed above) + * + * Copyright (c) 2013-present Cole Bemis + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + */const n=[["path",{d:"m9 18 6-6-6-6"}]];qe(t,Be({name:"chevron-right"},()=>a,{get iconNode(){return n},children:(s,i)=>{var o=be(),l=K(o);je(l,r,"default",{}),u(s,o)},$$slots:{default:!0}}))}function Io(t,r){const a=He(r,["children","$$slots","$$events","$$legacy"]);/** + * @license lucide-svelte v1.0.1 - ISC + * + * ISC License + * + * Copyright (c) 2026 Lucide Icons and Contributors + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * --- + * + * The following Lucide icons are derived from the Feather project: + * + * airplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out + * + * The MIT License (MIT) (for the icons listed above) + * + * Copyright (c) 2013-present Cole Bemis + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + */const n=[["circle",{cx:"12",cy:"12",r:"10"}],["rect",{x:"9",y:"9",width:"6",height:"6",rx:"1"}]];qe(t,Be({name:"circle-stop"},()=>a,{get iconNode(){return n},children:(s,i)=>{var o=be(),l=K(o);je(l,r,"default",{}),u(s,o)},$$slots:{default:!0}}))}function Oo(t,r){const a=He(r,["children","$$slots","$$events","$$legacy"]);/** + * @license lucide-svelte v1.0.1 - ISC + * + * ISC License + * + * Copyright (c) 2026 Lucide Icons and Contributors + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * --- + * + * The following Lucide icons are derived from the Feather project: + * + * airplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out + * + * The MIT License (MIT) (for the icons listed above) + * + * Copyright (c) 2013-present Cole Bemis + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + */const n=[["circle",{cx:"12",cy:"12",r:"10"}],["path",{d:"m15 9-6 6"}],["path",{d:"m9 9 6 6"}]];qe(t,Be({name:"circle-x"},()=>a,{get iconNode(){return n},children:(s,i)=>{var o=be(),l=K(o);je(l,r,"default",{}),u(s,o)},$$slots:{default:!0}}))}function hr(t,r){const a=He(r,["children","$$slots","$$events","$$legacy"]);/** + * @license lucide-svelte v1.0.1 - ISC + * + * ISC License + * + * Copyright (c) 2026 Lucide Icons and Contributors + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * --- + * + * The following Lucide icons are derived from the Feather project: + * + * airplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out + * + * The MIT License (MIT) (for the icons listed above) + * + * Copyright (c) 2013-present Cole Bemis + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + */const n=[["path",{d:"M12 15V3"}],["path",{d:"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"}],["path",{d:"m7 10 5 5 5-5"}]];qe(t,Be({name:"download"},()=>a,{get iconNode(){return n},children:(s,i)=>{var o=be(),l=K(o);je(l,r,"default",{}),u(s,o)},$$slots:{default:!0}}))}function Ho(t,r){const a=He(r,["children","$$slots","$$events","$$legacy"]);/** + * @license lucide-svelte v1.0.1 - ISC + * + * ISC License + * + * Copyright (c) 2026 Lucide Icons and Contributors + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * --- + * + * The following Lucide icons are derived from the Feather project: + * + * airplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out + * + * The MIT License (MIT) (for the icons listed above) + * + * Copyright (c) 2013-present Cole Bemis + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + */const n=[["path",{d:"M7 16.3c2.2 0 4-1.83 4-4.05 0-1.16-.57-2.26-1.71-3.19S7.29 6.75 7 5.3c-.29 1.45-1.14 2.84-2.29 3.76S3 11.1 3 12.25c0 2.22 1.8 4.05 4 4.05z"}],["path",{d:"M12.56 6.6A10.97 10.97 0 0 0 14 3.02c.5 2.5 2 4.9 4 6.5s3 3.5 3 5.5a6.98 6.98 0 0 1-11.91 4.97"}]];qe(t,Be({name:"droplets"},()=>a,{get iconNode(){return n},children:(s,i)=>{var o=be(),l=K(o);je(l,r,"default",{}),u(s,o)},$$slots:{default:!0}}))}function jo(t,r){const a=He(r,["children","$$slots","$$events","$$legacy"]);/** + * @license lucide-svelte v1.0.1 - ISC + * + * ISC License + * + * Copyright (c) 2026 Lucide Icons and Contributors + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * --- + * + * The following Lucide icons are derived from the Feather project: + * + * airplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out + * + * The MIT License (MIT) (for the icons listed above) + * + * Copyright (c) 2013-present Cole Bemis + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + */const n=[["circle",{cx:"12",cy:"12",r:"1"}],["circle",{cx:"19",cy:"12",r:"1"}],["circle",{cx:"5",cy:"12",r:"1"}]];qe(t,Be({name:"ellipsis"},()=>a,{get iconNode(){return n},children:(s,i)=>{var o=be(),l=K(o);je(l,r,"default",{}),u(s,o)},$$slots:{default:!0}}))}function Vo(t,r){const a=He(r,["children","$$slots","$$events","$$legacy"]);/** + * @license lucide-svelte v1.0.1 - ISC + * + * ISC License + * + * Copyright (c) 2026 Lucide Icons and Contributors + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * --- + * + * The following Lucide icons are derived from the Feather project: + * + * airplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out + * + * The MIT License (MIT) (for the icons listed above) + * + * Copyright (c) 2013-present Cole Bemis + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + */const n=[["path",{d:"M15 3h6v6"}],["path",{d:"M10 14 21 3"}],["path",{d:"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"}]];qe(t,Be({name:"external-link"},()=>a,{get iconNode(){return n},children:(s,i)=>{var o=be(),l=K(o);je(l,r,"default",{}),u(s,o)},$$slots:{default:!0}}))}function Uo(t,r){const a=He(r,["children","$$slots","$$events","$$legacy"]);/** + * @license lucide-svelte v1.0.1 - ISC + * + * ISC License + * + * Copyright (c) 2026 Lucide Icons and Contributors + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * --- + * + * The following Lucide icons are derived from the Feather project: + * + * airplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out + * + * The MIT License (MIT) (for the icons listed above) + * + * Copyright (c) 2013-present Cole Bemis + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + */const n=[["path",{d:"M12 6a2 2 0 0 1 3.414-1.414l6 6a2 2 0 0 1 0 2.828l-6 6A2 2 0 0 1 12 18z"}],["path",{d:"M2 6a2 2 0 0 1 3.414-1.414l6 6a2 2 0 0 1 0 2.828l-6 6A2 2 0 0 1 2 18z"}]];qe(t,Be({name:"fast-forward"},()=>a,{get iconNode(){return n},children:(s,i)=>{var o=be(),l=K(o);je(l,r,"default",{}),u(s,o)},$$slots:{default:!0}}))}function Bo(t,r){const a=He(r,["children","$$slots","$$events","$$legacy"]);/** + * @license lucide-svelte v1.0.1 - ISC + * + * ISC License + * + * Copyright (c) 2026 Lucide Icons and Contributors + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * --- + * + * The following Lucide icons are derived from the Feather project: + * + * airplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out + * + * The MIT License (MIT) (for the icons listed above) + * + * Copyright (c) 2013-present Cole Bemis + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + */const n=[["rect",{x:"14",y:"3",width:"5",height:"18",rx:"1"}],["rect",{x:"5",y:"3",width:"5",height:"18",rx:"1"}]];qe(t,Be({name:"pause"},()=>a,{get iconNode(){return n},children:(s,i)=>{var o=be(),l=K(o);je(l,r,"default",{}),u(s,o)},$$slots:{default:!0}}))}function qo(t,r){const a=He(r,["children","$$slots","$$events","$$legacy"]);/** + * @license lucide-svelte v1.0.1 - ISC + * + * ISC License + * + * Copyright (c) 2026 Lucide Icons and Contributors + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * --- + * + * The following Lucide icons are derived from the Feather project: + * + * airplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out + * + * The MIT License (MIT) (for the icons listed above) + * + * Copyright (c) 2013-present Cole Bemis + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + */const n=[["path",{d:"M13 21h8"}],["path",{d:"M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z"}]];qe(t,Be({name:"pen-line"},()=>a,{get iconNode(){return n},children:(s,i)=>{var o=be(),l=K(o);je(l,r,"default",{}),u(s,o)},$$slots:{default:!0}}))}function Ko(t,r){const a=He(r,["children","$$slots","$$events","$$legacy"]);/** + * @license lucide-svelte v1.0.1 - ISC + * + * ISC License + * + * Copyright (c) 2026 Lucide Icons and Contributors + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * --- + * + * The following Lucide icons are derived from the Feather project: + * + * airplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out + * + * The MIT License (MIT) (for the icons listed above) + * + * Copyright (c) 2013-present Cole Bemis + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + */const n=[["path",{d:"M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z"}],["path",{d:"m15 5 4 4"}]];qe(t,Be({name:"pencil"},()=>a,{get iconNode(){return n},children:(s,i)=>{var o=be(),l=K(o);je(l,r,"default",{}),u(s,o)},$$slots:{default:!0}}))}function _a(t,r){const a=He(r,["children","$$slots","$$events","$$legacy"]);/** + * @license lucide-svelte v1.0.1 - ISC + * + * ISC License + * + * Copyright (c) 2026 Lucide Icons and Contributors + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * --- + * + * The following Lucide icons are derived from the Feather project: + * + * airplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out + * + * The MIT License (MIT) (for the icons listed above) + * + * Copyright (c) 2013-present Cole Bemis + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + */const n=[["path",{d:"M5 5a2 2 0 0 1 3.008-1.728l11.997 6.998a2 2 0 0 1 .003 3.458l-12 7A2 2 0 0 1 5 19z"}]];qe(t,Be({name:"play"},()=>a,{get iconNode(){return n},children:(s,i)=>{var o=be(),l=K(o);je(l,r,"default",{}),u(s,o)},$$slots:{default:!0}}))}function Go(t,r){const a=He(r,["children","$$slots","$$events","$$legacy"]);/** + * @license lucide-svelte v1.0.1 - ISC + * + * ISC License + * + * Copyright (c) 2026 Lucide Icons and Contributors + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * --- + * + * The following Lucide icons are derived from the Feather project: + * + * airplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out + * + * The MIT License (MIT) (for the icons listed above) + * + * Copyright (c) 2013-present Cole Bemis + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + */const n=[["path",{d:"M5 12h14"}],["path",{d:"M12 5v14"}]];qe(t,Be({name:"plus"},()=>a,{get iconNode(){return n},children:(s,i)=>{var o=be(),l=K(o);je(l,r,"default",{}),u(s,o)},$$slots:{default:!0}}))}function Zt(t,r){const a=He(r,["children","$$slots","$$events","$$legacy"]);/** + * @license lucide-svelte v1.0.1 - ISC + * + * ISC License + * + * Copyright (c) 2026 Lucide Icons and Contributors + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * --- + * + * The following Lucide icons are derived from the Feather project: + * + * airplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out + * + * The MIT License (MIT) (for the icons listed above) + * + * Copyright (c) 2013-present Cole Bemis + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + */const n=[["path",{d:"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8"}],["path",{d:"M21 3v5h-5"}],["path",{d:"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16"}],["path",{d:"M8 16H3v5"}]];qe(t,Be({name:"refresh-cw"},()=>a,{get iconNode(){return n},children:(s,i)=>{var o=be(),l=K(o);je(l,r,"default",{}),u(s,o)},$$slots:{default:!0}}))}function Wo(t,r){const a=He(r,["children","$$slots","$$events","$$legacy"]);/** + * @license lucide-svelte v1.0.1 - ISC + * + * ISC License + * + * Copyright (c) 2026 Lucide Icons and Contributors + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * --- + * + * The following Lucide icons are derived from the Feather project: + * + * airplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out + * + * The MIT License (MIT) (for the icons listed above) + * + * Copyright (c) 2013-present Cole Bemis + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + */const n=[["path",{d:"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8"}],["path",{d:"M3 3v5h5"}]];qe(t,Be({name:"rotate-ccw"},()=>a,{get iconNode(){return n},children:(s,i)=>{var o=be(),l=K(o);je(l,r,"default",{}),u(s,o)},$$slots:{default:!0}}))}function Xo(t,r){const a=He(r,["children","$$slots","$$events","$$legacy"]);/** + * @license lucide-svelte v1.0.1 - ISC + * + * ISC License + * + * Copyright (c) 2026 Lucide Icons and Contributors + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * --- + * + * The following Lucide icons are derived from the Feather project: + * + * airplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out + * + * The MIT License (MIT) (for the icons listed above) + * + * Copyright (c) 2013-present Cole Bemis + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + */const n=[["path",{d:"M15.2 3a2 2 0 0 1 1.4.6l3.8 3.8a2 2 0 0 1 .6 1.4V19a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2z"}],["path",{d:"M17 21v-7a1 1 0 0 0-1-1H8a1 1 0 0 0-1 1v7"}],["path",{d:"M7 3v4a1 1 0 0 0 1 1h7"}]];qe(t,Be({name:"save"},()=>a,{get iconNode(){return n},children:(s,i)=>{var o=be(),l=K(o);je(l,r,"default",{}),u(s,o)},$$slots:{default:!0}}))}function Yo(t,r){const a=He(r,["children","$$slots","$$events","$$legacy"]);/** + * @license lucide-svelte v1.0.1 - ISC + * + * ISC License + * + * Copyright (c) 2026 Lucide Icons and Contributors + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * --- + * + * The following Lucide icons are derived from the Feather project: + * + * airplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out + * + * The MIT License (MIT) (for the icons listed above) + * + * Copyright (c) 2013-present Cole Bemis + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + */const n=[["path",{d:"M9.671 4.136a2.34 2.34 0 0 1 4.659 0 2.34 2.34 0 0 0 3.319 1.915 2.34 2.34 0 0 1 2.33 4.033 2.34 2.34 0 0 0 0 3.831 2.34 2.34 0 0 1-2.33 4.033 2.34 2.34 0 0 0-3.319 1.915 2.34 2.34 0 0 1-4.659 0 2.34 2.34 0 0 0-3.32-1.915 2.34 2.34 0 0 1-2.33-4.033 2.34 2.34 0 0 0 0-3.831A2.34 2.34 0 0 1 6.35 6.051a2.34 2.34 0 0 0 3.319-1.915"}],["circle",{cx:"12",cy:"12",r:"3"}]];qe(t,Be({name:"settings"},()=>a,{get iconNode(){return n},children:(s,i)=>{var o=be(),l=K(o);je(l,r,"default",{}),u(s,o)},$$slots:{default:!0}}))}function Qo(t,r){const a=He(r,["children","$$slots","$$events","$$legacy"]);/** + * @license lucide-svelte v1.0.1 - ISC + * + * ISC License + * + * Copyright (c) 2026 Lucide Icons and Contributors + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * --- + * + * The following Lucide icons are derived from the Feather project: + * + * airplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out + * + * The MIT License (MIT) (for the icons listed above) + * + * Copyright (c) 2013-present Cole Bemis + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + */const n=[["path",{d:"M10 11v6"}],["path",{d:"M14 11v6"}],["path",{d:"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6"}],["path",{d:"M3 6h18"}],["path",{d:"M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2"}]];qe(t,Be({name:"trash-2"},()=>a,{get iconNode(){return n},children:(s,i)=>{var o=be(),l=K(o);je(l,r,"default",{}),u(s,o)},$$slots:{default:!0}}))}var Zo=S('
  • '),Jo=S('
      '),ei=S('
      ',1);function it(t,r){Me(r,!0);let a=he(r,"value",3,""),n=he(r,"placeholder",3,"Select..."),s=he(r,"class",3,""),i=he(r,"buttonClass",3,""),o=z(!1),l=z(void 0),d=z(void 0),b=z(""),x=j(()=>{var L;return((L=r.options.find(B=>B.value===a()))==null?void 0:L.label)??n()});function A(L){var B;f(o,!1),(B=r.onchange)==null||B.call(r,L)}function m(){if(!e(l)||!e(d))return;const L=e(l).getBoundingClientRect(),B=e(d).offsetHeight,I=4,O=window.innerHeight-L.bottom-I,G=OO?L.top-I-B:L.bottom+I,J=Math.min(L.left,window.innerWidth-L.width);f(b,`position:fixed; top:${G}px; left:${J}px; width:${L.width}px; z-index:9999;`)}async function N(){f(o,!e(o)),e(o)&&(await Pt(),m())}function T(L){L.key==="Escape"&&f(o,!1)}function g(L){e(o)&&e(l)&&!e(l).contains(L.target)&&e(d)&&!e(d).contains(L.target)&&f(o,!1)}var c=ei();tt("mousedown",ot,g),tt("keydown",ot,T),tt("scroll",ot,()=>{e(o)&&f(o,!1)});var w=K(c),E=k(w),h=k(E),y=k(h,!0);p(h);var C=P(h,2),_=k(C);Te(_,{get icon(){return pn},size:14}),p(C),p(E),rt(E,L=>f(l,L),()=>e(l)),p(w);var M=P(w,2);{var F=L=>{Qt(L,{children:(B,I)=>{var O=Jo();Ye(O,21,()=>r.options,V=>V.value,(V,G)=>{var J=Zo();we(J,"tabindex",0);var se=k(J,!0);p(J),ee(()=>{we(J,"aria-selected",e(G).value===a()),Ce(J,1,`px-2.5 py-1.5 text-[13px] cursor-pointer transition-colors duration-100 + ${e(G).value===a()?"text-edf-bleu-fonce font-bold bg-[rgba(16,87,200,0.06)]":"text-ink hover:bg-edf-gris-clair"}`),ne(se,e(G).label)}),ce("mousedown",J,R=>{R.stopPropagation(),A(e(G).value)}),u(V,J)}),p(O),rt(O,V=>f(d,V),()=>e(d)),ee(()=>Ze(O,e(b))),u(B,O)}})};Q(M,L=>{e(o)&&L(F)})}ee(()=>{Ce(w,1,`relative inline-flex ${s()??""}`),Ce(E,1,dt(i()||"flex items-center justify-between gap-1.5 w-full h-[30px] cursor-pointer bg-white border border-border rounded-md text-[13px] text-ink font-normal pl-2.5 pr-2 transition-colors duration-150 hover:bg-edf-gris-clair focus:outline-none focus:border-edf-bleu-moyen")),we(E,"aria-expanded",e(o)),ne(y,e(x)),Ce(C,1,`text-muted shrink-0 transition-transform duration-150 ${e(o)?"rotate-180":""}`)}),ce("mousedown",E,L=>{L.stopPropagation(),N()}),u(t,c),Ae()}Ge(["mousedown"]);var ti=It(''),ri=S('
      '),ni=S('
      '),ai=S('
      ',1);function qt(t,r){Me(r,!0);let a=he(r,"selected",19,()=>[]),n=he(r,"placeholder",3,"Select..."),s=he(r,"class",3,""),i=z(!1),o=z(void 0),l=z(void 0),d=z(""),b=j(()=>new Set(a())),x=j(()=>a().length===0?n():a().length===r.options.length?`All (${r.options.length})`:a().length<=2?a().map(I=>{var O;return((O=r.options.find(V=>V.value===I))==null?void 0:O.label)??I}).join(", "):`${a().length} selected`);function A(I){var V;const O=new Set(e(b));O.has(I)?O.delete(I):O.add(I),(V=r.onchange)==null||V.call(r,[...O])}function m(){var I;(I=r.onchange)==null||I.call(r,r.options.map(O=>O.value))}function N(){var I;(I=r.onchange)==null||I.call(r,[])}function T(){if(!e(o)||!e(l))return;const I=e(o).getBoundingClientRect(),O=e(l).offsetHeight,V=4,G=window.innerHeight-I.bottom-V,se=GG?I.top-V-O:I.bottom+V,R=Math.min(I.left,window.innerWidth-I.width);f(d,`position:fixed; top:${se}px; left:${R}px; min-width:${I.width}px; z-index:9999;`)}async function g(){f(i,!e(i)),e(i)&&(await Pt(),T())}function c(I){e(i)&&e(o)&&!e(o).contains(I.target)&&e(l)&&!e(l).contains(I.target)&&f(i,!1)}function w(I){I.key==="Escape"&&f(i,!1)}var E=ai();tt("mousedown",ot,c),tt("keydown",ot,w),tt("scroll",ot,()=>{e(i)&&f(i,!1)});var h=K(E),y=k(h),C=k(y),_=k(C,!0);p(C);var M=P(C,2),F=k(M);Te(F,{get icon(){return pn},size:14}),p(M),p(y),rt(y,I=>f(o,I),()=>e(o)),p(h);var L=P(h,2);{var B=I=>{Qt(I,{children:(O,V)=>{var G=ni(),J=k(G),se=k(J),R=P(se,2);p(J);var $=P(J,2);Ye($,17,()=>r.options,H=>H.value,(H,D)=>{var v=ri(),q=k(v),W=k(q);{var de=ae=>{var pe=ti();u(ae,pe)},X=j(()=>e(b).has(e(D).value));Q(W,ae=>{e(X)&&ae(de)})}p(q);var Z=P(q,2),oe=k(Z,!0);p(Z),p(v),ee(ae=>{Ce(q,1,`inline-flex items-center justify-center shrink-0 w-[14px] h-[14px] rounded border-2 transition-colors duration-100 + ${ae??""}`),ne(oe,e(D).label)},[()=>e(b).has(e(D).value)?"bg-edf-bleu-moyen border-edf-bleu-moyen text-white":"bg-white border-edf-gris-moyen"]),ce("mousedown",v,ae=>{ae.stopPropagation(),A(e(D).value)}),u(H,v)}),p(G),rt(G,H=>f(l,H),()=>e(l)),ee(()=>Ze(G,e(d))),ce("mousedown",se,H=>{H.stopPropagation(),m()}),ce("mousedown",R,H=>{H.stopPropagation(),N()}),u(O,G)}})};Q(L,I=>{e(i)&&I(B)})}ee(()=>{Ce(h,1,`relative inline-flex ${s()??""}`),we(y,"aria-expanded",e(i)),ne(_,e(x)),Ce(M,1,`text-muted shrink-0 transition-transform duration-150 ${e(i)?"rotate-180":""}`)}),ce("mousedown",y,I=>{I.stopPropagation(),g()}),u(t,E),Ae()}Ge(["mousedown"]);const Zr="csauto_token";let ba=z(ie(localStorage.getItem(Zr)??""));function xa(){return e(ba)}function ya(t){f(ba,t,!0),t?localStorage.setItem(Zr,t):localStorage.removeItem(Zr)}let wr=null;async function mn(t,r={}){const a=new Headers(r.headers),n=xa();n&&a.set("X-CSAUTO-TOKEN",n);const s=await fetch(t,{...r,headers:a});if(s.status===401){wr||(wr=hn("API token required:",n,"Authentication"));const i=await wr;return wr=null,i===null?s:(ya(i),a.set("X-CSAUTO-TOKEN",i),fetch(t,{...r,headers:a}))}return s}async function ct(t){const r=await mn(t);if(!r.ok)throw new Error(`GET ${t} failed: ${r.status}`);return r.json()}async function Ir(t){const r=await mn(t);if(!r.ok)throw new Error(`GET ${t} failed: ${r.status}`);return r.text()}async function Rt(t,r){const a=await mn(t,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(r)});if(!a.ok){const n=await a.text().catch(()=>a.statusText);throw new Error(`POST ${t} failed: ${a.status} — ${n}`)}return a.json()}function Or(t){return t.map(r=>`case=${encodeURIComponent(r)}`).join("&")}function si(t=!1){return ct(`/api/status${t?"?log=1":""}`)}function In(t){return ct(`/api/perf?${Or(t)}`)}function oi(){return ct("/api/app_config")}function ii(t){return ct(`/api/residual_columns?${Or(t)}`).then(r=>r.columns??[])}function li(t,r,a={}){const n=new URLSearchParams;return t.forEach(s=>n.append("case",s)),n.set("columns",r.join(",")),a.width&&n.set("width",String(a.width)),a.height&&n.set("height",String(a.height)),a.xMin!==void 0&&n.set("x_min",String(a.xMin)),a.includeHistory&&n.set("include_history","true"),Ir(`/api/residuals_svg?${n}`)}function wa(t){return ct(`/api/restart_origin?${Or(t)}`)}function ci(t){var a;const r=new URLSearchParams;return t.cases.forEach(n=>r.append("case",n)),(a=t.files)!=null&&a.length&&r.set("files",t.files.join(",")),t.maxHits&&r.set("max_hits",String(t.maxHits)),t.context!==void 0&&r.set("context",String(t.context)),t.sev&&r.set("sev",t.sev),t.q&&r.set("q",t.q),ct(`/api/recent_errors?${r}`)}function ui(t,r,a){const n=new URLSearchParams({case:t,file:r,n:String(a)});return Ir(`/api/tail?${n}`)}function di(t){return ct(`/api/resu_files?case=${encodeURIComponent(t)}`).then(r=>r.files??[])}function fi(t){return ct(`/api/resu_dirs?${Or(t)}`).then(r=>r.dirs??[])}function Jr(t,r){const a=new URLSearchParams({scope:r});return t.forEach(n=>a.append("case",n)),ct(`/api/probes?${a}`).then(n=>n.files??[])}function vi(t,r){const a=new URLSearchParams;return t.forEach(n=>a.append("case",n)),r.forEach(n=>a.append("probe",n)),ct(`/api/probe_columns?${a}`).then(n=>n.columns??[])}function gi(t,r,a){const n=new URLSearchParams({case:t,probe:r});return a.forEach(s=>n.append("column",s)),ct(`/api/probe_position?${n}`)}function hi(t){const r=new URLSearchParams;return t.cases.forEach(a=>r.append("case",a)),t.probes.forEach(a=>r.append("probe",a)),r.set("columns",t.columns.join(",")),t.axis&&r.set("axis",t.axis),t.xMin!==void 0&&r.set("x_min",String(t.xMin)),t.timeMin!==void 0&&r.set("time_min",String(t.timeMin)),r.set("include_history","true"),t.width&&r.set("width",String(t.width)),t.height&&r.set("height",String(t.height)),Ir(`/api/probe_svg?${r}`)}function pi(t){const r=new URLSearchParams;return t.cases.forEach(a=>r.append("case",a)),t.base&&r.set("base",t.base),t.kind&&r.set("kind",t.kind),t.filter&&r.set("filter",t.filter),Ir(`/api/compare_runs?${r}`)}function On(t){return Rt("/api/run_case",{cases:t.cases,n:t.n,nt:t.nt,max_parallel:t.maxParallel??void 0,restart:t.restart??!1,restart_mode:t.restartMode??"",restart_value:t.restartValue??void 0}).then(()=>{})}function mi(t){return Rt("/api/kill_case",{cases:t}).then(()=>{})}function kr(t){return Rt("/api/control_case",{cases:t.cases,action:t.action,value:t.value??void 0}).then(()=>{})}function _i(t){return Rt("/api/cleanup_cases",{cases:t.cases,keep_last:t.keepLast??1,prune_resu:t.pruneResu??!0,keep_resu:t.keepResu??[],delete_resu:t.deleteResu??[],max_log_mb:t.maxLogMb??50,clear_cid:!0,clear_pyc:!1})}function bi(t,r){return Rt("/api/case_note",{case:t,note:r}).then(()=>{})}function xi(t,r){return Rt("/api/case_convergence",{case:t,convergence:r}).then(()=>{})}function yi(t){return Rt("/api/open_gui",{case:t}).then(()=>{})}function wi(){return ct("/api/settings/telemetry")}function ki(t){return Rt("/api/settings/telemetry",{enabled:t})}var Ci=S(" ",1),Si=S(''),$i=S('Loading...'),Pi=S('No folders found'),Ei=S('
      '),Ri=S('
      ',1);function Ni(t,r){Me(r,!0);const a=ho();let n=z("keep_latest"),s=z(ie(a.keepLast)),i=z(ie([])),o=z(ie([])),l=z(!0),d=j(()=>e(n)==="keep_folder"||e(n)==="delete_folder");const b=[{value:"keep_latest",label:"Keep latest N"},{value:"delete_all",label:"Delete all RESU"},{value:"keep_folder",label:"Keep specific folders"},{value:"delete_folder",label:"Delete specific folders"}];let x=j(()=>e(i).map(m=>({value:m,label:m})));Zn(async()=>{try{f(i,await fi(r.cases),!0)}catch{f(i,[],!0)}f(l,!1)});async function A(){if(e(d)&&e(o).length===0){await We("Please select at least one RESU folder.","Missing selection");return}const m={action:e(n)};e(n)==="keep_latest"?(m.keepLast=e(s),po({keepLast:e(s)})):e(n)==="delete_all"?m.keepLast=0:e(n)==="keep_folder"?m.keepResu=e(o):e(n)==="delete_folder"&&(m.deleteResu=e(o)),st(m)}{const m=g=>{var c=Ci(),w=K(c);Pe(w,{variant:"secondary",onclick:()=>st(null),children:(h,y)=>{ke();var C=Ue("Cancel");u(h,C)},$$slots:{default:!0}});var E=P(w,2);Pe(E,{variant:"primary",onclick:A,children:(h,y)=>{ke();var C=Ue("Clean");u(h,C)},$$slots:{default:!0}}),u(g,c)};let N=j(()=>r.cases.length),T=j(()=>r.cases.length>1?"s":"");gr(t,{title:"Cleanup Cases",titleId:"clean-dialog-title",get subtitle(){return`${e(N)??""} case${e(T)??""} selected`},footer:m,children:(g,c)=>{var w=Ri(),E=K(w),h=k(E);Ne(h,{text:"Action",children:(F,L)=>{it(F,{class:"w-[200px]",get options(){return b},get value(){return e(n)},onchange:B=>f(n,B,!0)})}});var y=P(h,2);{var C=F=>{Ne(F,{text:"Keep last",children:(L,B)=>{var I=Si();Xe(I),et(I,()=>e(s),O=>f(s,O)),u(L,I)}})};Q(y,F=>{e(n)==="keep_latest"&&F(C)})}p(E);var _=P(E,2);{var M=F=>{var L=Ei(),B=k(L);Ne(B,{text:"RESU folders",children:(I,O)=>{var V=be(),G=K(V);{var J=$=>{var H=$i();u($,H)},se=$=>{var H=Pi();u($,H)},R=$=>{qt($,{class:"w-full",get options(){return e(x)},get selected(){return e(o)},onchange:H=>f(o,H,!0),placeholder:"Select folders..."})};Q(G,$=>{e(l)?$(J):e(i).length===0?$(se,1):$(R,-1)})}u(I,V)}}),p(L),u(F,L)};Q(_,F=>{e(d)&&F(M)})}u(g,w)},$$slots:{footer:!0,default:!0}})}Ae()}function Mi(t,r){Me(r,!0);let a=j(Ws);var n=be(),s=K(n);{var i=b=>{wo(b,{get cases(){return e(a).props.cases}})},o=b=>{No(b,{get cases(){return e(a).props.cases}})},l=b=>{Ni(b,{get cases(){return e(a).props.cases}})},d=b=>{io(b,{get mode(){return e(a).type},get title(){return e(a).props.title},get message(){return e(a).props.message},get confirmLabel(){return e(a).props.confirmLabel},get confirmVariant(){return e(a).props.confirmVariant},get value(){return e(a).props.value},get placeholder(){return e(a).props.placeholder},get multiline(){return e(a).props.multiline}})};Q(s,b=>{e(a).type==="run"?b(i):e(a).type==="restart"?b(o,1):e(a).type==="clean"?b(l,2):(e(a).type==="alert"||e(a).type==="confirm"||e(a).type==="prompt")&&b(d,3)})}u(t,n),Ae()}let dr=z(ie([])),Ai=0;function Ti(){return e(dr)}function Cr(t,r="success",a=3500){const n=++Ai;f(dr,[...e(dr),{id:n,message:t,variant:r}],!0),setTimeout(()=>ka(n),a)}function ka(t){f(dr,e(dr).filter(r=>r.id!==t),!0)}var Li=S('
      '),Fi=S('
      ');function Di(t,r){Me(r,!0);let a=j(Ti);Qt(t,{children:(n,s)=>{var i=Fi();Ye(i,21,()=>e(a),o=>o.id,(o,l)=>{var d=Li(),b=k(d,!0);p(d),ee(()=>{Ce(d,1,`pointer-events-auto max-w-[320px] px-4 py-2.5 rounded-md shadow-lg text-sm font-semibold text-white cursor-pointer ${e(l).variant==="success"?"bg-edf-vert-fonce":"bg-edf-orange-fonce"}`),ne(b,e(l).message)}),ce("click",d,()=>ka(e(l).id)),u(o,d)}),p(i),u(n,i)}}),Ae()}Ge(["click"]);var zi=It(''),Ii=It(''),Oi=S(''),Hi=S(" ",1),ji=S(" ",1),Vi=S('');function zt(t,r){Me(r,!0);const a=g=>{var c=Oi(),w=k(c);{var E=y=>{var C=zi();ee(()=>Ze(C,`width: ${o()-4}px; height: ${o()-4}px;`)),u(y,C)},h=y=>{var C=Ii();ee(()=>Ze(C,`width: ${o()-4}px; height: ${o()-4}px;`)),u(y,C)};Q(w,y=>{n()&&!s()?y(E):s()&&y(h,1)})}p(c),ee(()=>{Ce(c,1,`inline-flex items-center justify-center rounded border-2 cursor-pointer transition-colors duration-100 shrink-0 + ${i()?"opacity-40 cursor-not-allowed":""} + ${n()||s()?"bg-edf-bleu-moyen border-edf-bleu-moyen text-white":"bg-white border-edf-gris-moyen hover:border-edf-bleu-clair"}`),Ze(c,`width: ${o()??""}px; height: ${o()??""}px;`),we(c,"aria-checked",s()?"mixed":n()),we(c,"aria-disabled",i()),we(c,"tabindex",i()?-1:0)}),ce("click",c,b),ce("keydown",c,x),u(g,c)};let n=he(r,"checked",3,!1),s=he(r,"indeterminate",3,!1),i=he(r,"disabled",3,!1),o=he(r,"size",3,16),l=he(r,"label",3,""),d=he(r,"labelFirst",3,!1);function b(g){var w;if(g.stopPropagation(),i())return;const c=s()?!0:!n();(w=r.onchange)==null||w.call(r,c)}function x(g){(g.key===" "||g.key==="Enter")&&(g.preventDefault(),g.stopPropagation(),b(g))}var A=be(),m=K(A);{var N=g=>{var c=Vi(),w=k(c);{var E=y=>{var C=Hi(),_=K(C),M=k(_,!0);p(_);var F=P(_);a(F),ee(()=>ne(M,l())),u(y,C)},h=y=>{var C=ji(),_=K(C);a(_);var M=P(_),F=k(M,!0);p(M),ee(()=>ne(F,l())),u(y,C)};Q(w,y=>{d()?y(E):y(h,-1)})}p(c),ce("click",c,b),ce("keydown",c,x),u(g,c)},T=g=>{a(g)};Q(m,g=>{l()?g(N):g(T,-1)})}u(t,A),Ae()}Ge(["click","keydown"]);function _n(t,r){try{const a=localStorage.getItem(t);return a===null?r:JSON.parse(a)}catch{return r}}function Hr(t,r){localStorage.setItem(t,JSON.stringify(r))}const en=new Map;function pr(t,r,a){vt(t),en.set(t,setInterval(r,a))}function vt(t){const r=en.get(t);r!==void 0&&(clearInterval(r),en.delete(t))}const Lt={status:1e3,tail:1e3,plot:3e3,probe:3e3,errors:5e3},Ui=["status","plot","probe","tail","errors"],Wr={status:{label:"Status table",min:500},plot:{label:"Residual plots",min:1e3},probe:{label:"Probe plots",min:1e3},tail:{label:"Log tail",min:500},errors:{label:"Recent errors",min:2e3}},or=_n("csauto_refresh_rates",{});let _t=z(ie({status:or.status??Lt.status,tail:or.tail??Lt.tail,plot:or.plot??Lt.plot,probe:or.probe??Lt.probe,errors:or.errors??Lt.errors}));function Bi(){return e(_t)}function qi(t,r){f(_t,{...e(_t),[t]:r},!0),Hr("csauto_refresh_rates",e(_t))}function Ki(){return e(_t).status}function Hn(){return e(_t).tail}function jn(){return e(_t).plot}function Gi(){return e(_t).probe}function Vn(){return e(_t).errors}const tn=new Set;function mr(t){return tn.add(t),()=>tn.delete(t)}function Wi(){tn.forEach(t=>t())}const rn=_n("csauto_autorefresh_enabled",{});function Jt(t){return rn[t]??!0}function er(t,r){rn[t]=r,Hr("csauto_autorefresh_enabled",rn)}var Xi=S(" ",1),Yi=S('
      ms
      '),Qi=S('
      Telemetry
      '),Zi=S('
      API token
      Auto-refresh intervals
      ',1);function Ji(t,r){Me(r,!0);let a=z(ie(xa())),n=z(ie({...Bi()})),s=z(!0),i=z(!1);Re(()=>{wi().then(b=>{f(s,b.enabled,!0),f(i,!0)}).catch(()=>{f(i,!1)})});function o(b){const{min:x}=Wr[b];let A=e(n)[b];(typeof A!="number"||isNaN(A))&&(A=Lt[b]),f(n,{...e(n),[b]:Math.max(x,Math.round(A))},!0)}function l(b,x){const A=x.target,m=A.value.replace(/[^0-9]/g,""),N=parseInt(m,10);isNaN(N)?m===""&&f(n,{...e(n),[b]:Wr[b].min},!0):f(n,{...e(n),[b]:N},!0),A.value=String(e(n)[b])}function d(){ya(e(a));for(const b of Object.keys(e(n)))o(b),qi(b,e(n)[b]);e(i)&&ki(e(s)).catch(()=>{}),r.onClose()}gr(t,{title:"Settings",titleId:"settings-dialog-title",get onCancel(){return r.onClose},onConfirm:d,maxWidth:"400px",portal:!0,footer:x=>{var A=Xi(),m=K(A);Pe(m,{variant:"secondary",get onclick(){return r.onClose},children:(T,g)=>{ke();var c=Ue("Cancel");u(T,c)},$$slots:{default:!0}});var N=P(m,2);Pe(N,{variant:"primary",onclick:d,children:(T,g)=>{ke();var c=Ue("Save");u(T,c)},$$slots:{default:!0}}),u(x,A)},children:(x,A)=>{var m=Zi(),N=K(m),T=P(k(N),2);Xe(T),p(N);var g=P(N,2),c=k(g),w=P(k(c),2);p(c);var E=P(c,2);Ye(E,20,()=>Ui,C=>C,(C,_)=>{const M=j(()=>Wr[_]);var F=Yi(),L=k(F),B=k(L),I=k(B,!0);p(B);var O=P(B,2),V=k(O);p(O),p(L);var G=P(L,2),J=k(G);Xe(J),ke(2),p(G),p(F),ee(()=>{ne(I,e(M).label),ne(V,`min ${e(M).min??""}ms`),vn(J,e(n)[_])}),ce("input",J,se=>l(_,se)),tt("blur",J,()=>o(_)),u(C,F)}),p(E),p(g);var h=P(g,2);{var y=C=>{var _=Qi(),M=P(k(_),2);zt(M,{get checked(){return e(s)},onchange:F=>f(s,F,!0),label:"Send anonymous usage statistics"}),p(_),u(C,_)};Q(h,C=>{e(i)&&C(y)})}et(T,()=>e(a),C=>f(a,C)),ce("click",w,()=>f(n,{...Lt},!0)),u(x,m)},$$slots:{footer:!0,default:!0}}),Ae()}Ge(["click","input"]);const el=""+new URL("../assets/code-saturne.BHojVttu.svg",import.meta.url).href,tl="data:image/svg+xml,%3c?xml%20version='1.0'%20encoding='UTF-8'?%3e%3csvg%20id='Calque_1'%20xmlns='http://www.w3.org/2000/svg'%20version='1.1'%20height='400px'%20viewBox='0%200%20397.89%2095.85'%3e%3c!--%20Generator:%20Adobe%20Illustrator%2029.8.1,%20SVG%20Export%20Plug-In%20.%20SVG%20Version:%202.1.1%20Build%202)%20--%3e%3cdefs%3e%3cstyle%3e%20.st0%20{%20fill:%20%23ff861d;%20}%20.st1%20{%20fill:%20%23ffb210;%20}%20.st2%20{%20fill:%20%231057c8;%20}%20.st3%20{%20fill:%20%23d6430a;%20}%20%3c/style%3e%3c/defs%3e%3cpath%20class='st2'%20d='M26.25,61.73c-12.02,0-20.11-8.16-20.11-21.37s8.01-21.37,20.33-21.37c8.83,0,15.06,3.78,17.36,11.28l-5.64,2.52c-1.48-5.94-4.97-8.69-11.87-8.69-8.46,0-14.25,6.01-14.25,16.25s5.93,16.25,13.95,16.25,11.73-2.82,12.84-8.61l5.71,1.93c-2,7.79-9.13,11.8-18.33,11.8'/%3e%3cpath%20class='st2'%20d='M89.96,40.36c0,13.21-7.87,21.37-20.48,21.37s-20.48-8.16-20.48-21.37,7.86-21.37,20.48-21.37,20.48,8.16,20.48,21.37M54.94,40.36c0,10.24,5.64,16.25,14.54,16.25s14.54-6.01,14.54-16.25-5.64-16.25-14.54-16.25-14.54,6.01-14.54,16.25'/%3e%3cpath%20class='st2'%20d='M134.3,40.29c0,13.43-8.01,20.85-21.81,20.85h-14.84V19.58h14.84c13.8,0,21.81,7.42,21.81,20.7M128.36,40.29c0-9.94-5.57-15.58-15.44-15.58h-9.35v31.32h9.35c9.87,0,15.44-5.71,15.44-15.73'/%3e%3cpolygon%20class='st2'%20points='174.11%2056.02%20174.11%2061.14%20141.98%2061.14%20141.98%2019.58%20173.14%2019.58%20173.14%2024.7%20147.91%2024.7%20147.91%2037.54%20167.65%2037.54%20167.65%2042.66%20147.91%2042.66%20147.91%2056.02%20174.11%2056.02'/%3e%3cpath%20class='st2'%20d='M213.81,22.13c4.16-1.92,9.75-3.11,14.3-3.11,12.55,0,17.74,5.19,17.74,17.34v5.27c0,4.16.08,7.28.16,10.31.08,3.12.24,5.99.48,9.19h-9.43c-.4-2.16-.4-4.88-.48-6.15h-.16c-2.48,4.56-7.83,7.11-12.71,7.11-7.28,0-14.39-4.4-14.39-12.23,0-6.15,2.96-9.75,7.03-11.75,4.08-2,9.35-2.4,13.83-2.4h5.91c0-6.63-2.96-8.87-9.27-8.87-4.56,0-9.11,1.76-12.71,4.48l-.32-9.19ZM226.36,54.26c3.27,0,5.83-1.44,7.51-3.68,1.76-2.32,2.24-5.27,2.24-8.47h-4.63c-4.8,0-11.91.8-11.91,7.11,0,3.52,2.96,5.04,6.79,5.04'/%3e%3cpath%20class='st2'%20d='M280.98,28.61c-3.28-1.12-5.67-1.76-9.59-1.76-2.88,0-6.31,1.04-6.31,4.56,0,6.56,18.62,2.4,18.62,17.27,0,9.59-8.55,13.43-17.27,13.43-4.08,0-8.23-.72-12.15-1.76l.64-8.79c3.36,1.68,6.87,2.72,10.55,2.72,2.72,0,7.03-1.04,7.03-5.04,0-8.07-18.62-2.56-18.62-17.42,0-8.87,7.75-12.79,16.14-12.79,5.03,0,8.31.8,11.67,1.52l-.72,8.07Z'/%3e%3cpath%20class='st2'%20d='M295.25,27.81h-7.91v-7.83h7.91v-8.23l10.71-3.44v11.67h9.51v7.83h-9.51v19.18c0,3.52.96,6.79,5.04,6.79,1.92,0,3.76-.4,4.88-1.12l.32,8.47c-2.24.64-4.72.96-7.91.96-8.39,0-13.03-5.2-13.03-13.35v-20.94Z'/%3e%3cpath%20class='st2'%20d='M355.22,58.82c-3.92,2.16-8.39,3.28-14.15,3.28-13.59,0-21.5-7.83-21.5-21.34,0-11.91,6.31-21.74,19.1-21.74,15.27,0,19.58,10.47,19.58,24.85h-28.45c.48,6.63,5.11,10.39,11.75,10.39,5.2,0,9.67-1.92,13.67-4.15v8.71ZM348.03,36.52c-.32-5.19-2.72-9.67-8.71-9.67s-9.03,4.16-9.51,9.67h18.22Z'/%3e%3cpath%20class='st2'%20d='M366.57,19.98h9.51v9.35h.16c.48-3.84,4.87-10.31,11.27-10.31,1.04,0,2.16,0,3.27.32v10.79c-.96-.56-2.88-.88-4.79-.88-8.71,0-8.71,10.87-8.71,16.78v15.11h-10.71V19.98Z'/%3e%3cpath%20class='st0'%20d='M229.73,80.9c0,3.67-2.97,6.64-6.64,6.64s-6.64-2.97-6.64-6.64,2.97-6.64,6.64-6.64,6.64,2.97,6.64,6.64'/%3e%3cpath%20class='st0'%20d='M203.17,80.9c0,3.67-2.97,6.64-6.64,6.64s-6.64-2.97-6.64-6.64,2.97-6.64,6.64-6.64,6.64,2.97,6.64,6.64'/%3e%3cpath%20class='st1'%20d='M296.14,80.9c0,3.67-2.97,6.64-6.64,6.64s-6.64-2.97-6.64-6.64,2.97-6.64,6.64-6.64,6.64,2.97,6.64,6.64'/%3e%3cpath%20class='st1'%20d='M378.47,80.9c0,3.67-2.97,6.64-6.64,6.64s-6.64-2.97-6.64-6.64,2.97-6.64,6.64-6.64,6.64,2.97,6.64,6.64'/%3e%3cpath%20class='st1'%20d='M269.57,80.9c0,3.67-2.97,6.64-6.64,6.64s-6.64-2.97-6.64-6.64,2.97-6.64,6.64-6.64,6.64,2.97,6.64,6.64'/%3e%3cpath%20class='st3'%20d='M107.55,80.9c0,3.67-2.97,6.64-6.64,6.64s-6.64-2.97-6.64-6.64,2.97-6.64,6.64-6.64,6.64,2.97,6.64,6.64'/%3e%3crect%20class='st0'%20x='134.12'%20y='75.59'%20width='42.5'%20height='10.62'/%3e%3crect%20class='st1'%20x='309.42'%20y='75.59'%20width='42.5'%20height='10.62'/%3e%3c/svg%3e";let Kt=z(null);function rl(t){f(Kt,t,!0)}function St(){return e(Kt)}function lr(t){return e(Kt)===null||e(Kt).capabilities.includes(t)}function nl(t){return e(Kt)===null||e(Kt).control_actions.includes(t)}var al=S('CODE_SATURNE'),sl=S('CODE_ASTER'),ol=S(' '),il=S('
      ',1);function ll(t,r){Me(r,!0);let a=j(()=>r.shownCases!==r.totalCases),n=z(!1);var s=il(),i=K(s),o=k(i),l=k(o);{var d=D=>{var v=al();ee(()=>we(v,"src",el)),u(D,v)},b=j(()=>{var D;return!St()||((D=St())==null?void 0:D.solver)==="code_saturne"}),x=D=>{var v=sl();ee(()=>we(v,"src",tl)),u(D,v)},A=j(()=>{var D;return((D=St())==null?void 0:D.solver)==="code_aster"}),m=D=>{var v=ol(),q=k(v,!0);p(v),ee(W=>ne(q,W),[()=>{var W;return(W=St())==null?void 0:W.solver}]),u(D,v)};Q(l,D=>{e(b)?D(d):e(A)?D(x,1):D(m,-1)})}p(o);var N=P(o,2),T=k(N),g=k(T),c=k(g);{var w=D=>{var v=Ue();ee(()=>ne(v,`${r.shownCases??""}/`)),u(D,v)};Q(c,D=>{e(a)&&D(w)})}var E=P(c,1,!0);p(g);var h=P(g,2),y=k(h,!0);p(h),p(T);var C=P(T,2),_=k(C),M=k(_);{var F=D=>{var v=Ue();ee(()=>ne(v,`${r.shownRunning??""}/`)),u(D,v)};Q(M,D=>{e(a)&&D(F)})}var L=P(M,1,!0);p(_),ke(2),p(C);var B=P(C,2),I=k(B),O=k(I);{var V=D=>{var v=Ue();ee(()=>ne(v,`${r.shownConverged??""}/`)),u(D,v)};Q(O,D=>{e(a)&&D(V)})}var G=P(O,1,!0);p(I),ke(2),p(B),p(N);var J=P(N,2),se=k(J),R=k(se);Te(R,{get icon(){return Yo},size:18}),p(se),p(J),p(i);var $=P(i,2);{var H=D=>{Ji(D,{onClose:()=>f(n,!1)})};Q($,D=>{e(n)&&D(H)})}ee(()=>{ne(E,r.totalCases),ne(y,r.totalCases===1?"case":"cases"),ne(L,r.totalRunning),ne(G,r.totalConverged)}),ce("click",se,()=>f(n,!0)),u(t,s),Ae()}Ge(["click"]);const cl=""+new URL("../assets/simvia-logo.kLDq7Uoj.svg",import.meta.url).href;var ul=S('
      '),dl=S('

      '),fl=S("
      "),vl=S('
      '),gl=S('
      '),hl=S('
      ');function Ot(t,r){let a=he(r,"eyebrow",3,""),n=he(r,"title",3,""),s=he(r,"wide",3,!1);var i=hl(),o=P(k(i),2);{var l=b=>{var x=gl(),A=k(x);{var m=c=>{var w=be(),E=K(w);ft(E,()=>r.titleSlot),u(c,w)},N=c=>{var w=fl(),E=k(w);{var h=_=>{var M=ul(),F=k(M,!0);p(M),ee(()=>ne(F,a())),u(_,M)};Q(E,_=>{a()&&_(h)})}var y=P(E,2);{var C=_=>{var M=dl(),F=k(M,!0);p(M),ee(()=>ne(F,n())),u(_,M)};Q(y,_=>{n()&&_(C)})}p(w),u(c,w)};Q(A,c=>{r.titleSlot?c(m):c(N,-1)})}var T=P(A,2);{var g=c=>{var w=vl(),E=k(w);ft(E,()=>r.actions),p(w),u(c,w)};Q(T,c=>{r.actions&&c(g)})}p(x),u(b,x)};Q(o,b=>{(a()||n()||r.titleSlot||r.actions)&&b(l)})}var d=P(o,2);ft(d,()=>r.children),p(i),ee(()=>{Ce(i,1,`${s()?"col-span-12":"col-span-6"} bg-card border border-border rounded-[10px] p-[16px_18px_18px] relative overflow-clip animate-rise`),we(i,"id",r.id)}),u(t,i)}function tr(t,r){Me(r,!0);let a=he(r,"checked",15,!0);Re(()=>{a()?pr(r.name,r.onRefresh,r.intervalMs):vt(r.name)}),fr(()=>vt(r.name)),zt(t,{get checked(){return a()},onchange:n=>a(n),size:14,label:"Auto-refresh",labelFirst:!0}),Ae()}var pl=S(" ",1),ml=S('
    • '),_l=S(''),bl=S(' ',1);function xl(t,r){Me(r,!0);let a=he(r,"label",3,"More"),n=z(!1),s=z(void 0),i=z(void 0),o=z("");function l(){if(!e(s)||!e(i))return;const c=e(s).getBoundingClientRect(),w=e(i).offsetHeight,E=4,h=window.innerHeight-c.bottom-E,C=hh?c.top-E-w:c.bottom+E,_=Math.min(c.left,window.innerWidth-180);f(o,`position:fixed; top:${C}px; left:${_}px; min-width:170px; z-index:9999;`)}async function d(){f(n,!e(n)),e(n)&&(await Pt(),l())}function b(c){c.disabled||(f(n,!1),c.onClick())}function x(c){e(n)&&e(s)&&!e(s).contains(c.target)&&e(i)&&!e(i).contains(c.target)&&f(n,!1)}var A=bl();tt("mousedown",ot,x),tt("keydown",ot,c=>{c.key==="Escape"&&f(n,!1)}),tt("scroll",ot,()=>{e(n)&&f(n,!1)});var m=K(A),N=k(m);Pe(N,{variant:"secondary",size:"sm",onclick:d,children:(c,w)=>{var E=pl(),h=K(E);Te(h,{get icon(){return jo}});var y=P(h);ee(()=>ne(y,` ${a()??""}`)),u(c,E)},$$slots:{default:!0}}),p(m),rt(m,c=>f(s,c),()=>e(s));var T=P(m,2);{var g=c=>{Qt(c,{children:(w,E)=>{var h=_l();Ye(h,21,()=>r.items,y=>y.label,(y,C)=>{var _=ml(),M=k(_),F=k(M);Te(F,{get icon(){return e(C).icon},size:14});var L=P(F);p(M),p(_),ee(()=>{M.disabled=e(C).disabled,we(M,"aria-disabled",e(C).disabled),Ce(M,1,`w-full flex items-center gap-2 text-left py-[7px] px-[10px] bg-transparent border border-transparent rounded-md text-[12.5px] text-ink transition-[background] duration-[120ms] ease-in-out disabled:opacity-40 disabled:pointer-events-none ${e(C).disabled?"":"cursor-pointer hover:bg-edf-gris-clair hover:border-border"}`),ne(L,` ${e(C).label??""}`)}),ce("mousedown",M,B=>{B.stopPropagation(),b(e(C))}),u(y,_)}),p(h),rt(h,y=>f(i,y),()=>e(i)),ee(()=>Ze(h,e(o))),u(w,h)}})};Q(T,c=>{e(n)&&c(g)})}u(t,A),Ae()}Ge(["mousedown"]);const Ft=[{key:"note",label:"Note"},{key:"nprocs",label:"MPI Ranks"},{key:"nt",label:"Thread Count"},{key:"last_iter",label:"Last Iter"},{key:"duration",label:"Duration"},{key:"last_mod",label:"Last Modified"},{key:"resu_size_mb",label:"RESU Size (MB)"}];let Gt=z(ie([])),Tr=z(ie([])),ht=z(ie(new Set)),_r=z(""),bn=z(""),Et=z(ie([])),at=z(ie([])),Wt=z(""),Ca=z(!0),yl=z(!0),Ut=z(ie(_n("csauto_status_views",{}))),xn=z(ie(localStorage.getItem("csauto_status_view_selected")??""));function yn(){return e(Gt)}function wn(){return e(Tr)}function jt(){return e(ht)}function Un(){return e(_r)}function nn(){return e(bn)}function wl(){return e(Et)}function kl(){return e(Et).filter(t=>e(Tr).includes(t))}function Cl(){return e(Et).filter(t=>Ft.some(r=>r.key===t))}function Sl(){return e(at)}function $l(){return e(Wt)}function Pl(){return e(Ca)}function Bn(){return e(Ut)}function El(){return e(xn)}function Rl(t){f(Gt,t,!0)}function Nl(t){const r=e(Tr).length===0&&t.length>0;f(Tr,t,!0),r&&e(Et).length===0&&f(Et,[...t,...Ft.map(a=>a.key)],!0)}function Ml(t){f(_r,t,!0)}function qn(t){f(Et,t,!0)}function Al(t){f(Wt,t,!0)}function Tl(t){f(Ca,t,!0)}function Ll(t){f(yl,t,!0)}function kn(t){f(xn,t,!0),localStorage.setItem("csauto_status_view_selected",t)}function an(t){const r=new Set(e(ht));r.has(t)?r.delete(t):r.add(t),f(ht,r,!0),f(_r,t,!0),f(bn,t,!0)}function Sa(t){f(ht,new Set([t]),!0),f(_r,t,!0),f(bn,t,!0)}function sn(t,r,a){const n=a.indexOf(t),s=a.indexOf(r);if(n<0||s<0)return;const[i,o]=n{const a=Fl(r);return t.every(n=>a.includes(n))})}function Dl(t){if(t==null||t==="")return"";const r=Number(t);return Number.isFinite(r)?r:String(t).toLowerCase()}function Wn(t,r){var n;if(r==="case_id")return t.case_id;if(r==="status")return t.status??"";if(r==="note")return t.note??"";if(r==="nprocs")return t.nprocs??0;if(r==="nt")return t.nt??0;if(r==="last_iter")return t.last_iter??0;if(r==="duration")return t.duration_s??0;if(r==="last_mod")return t.last_mod??"";if(r==="resu_size_mb")return t.resu_size_mb??0;const a=(n=t.doe)==null?void 0:n[r];return a!==void 0?Dl(a):""}function zl(t,r){return t===""&&r===""?0:t===""?1:r===""?-1:typeof t=="number"&&typeof r=="number"?t-r:String(t).localeCompare(String(r))}function Pa(){const t=$a();return e(at).length===0?t:[...t].sort((r,a)=>{for(const n of e(at)){const s=Wn(r,n.key),i=Wn(a,n.key),o=zl(s,i);if(o!==0)return n.dir==="asc"?o:-o}return 0})}function Rr(){return Pa().map(t=>t.case_id)}function Il(t,r){const a=e(at).findIndex(n=>n.key===t);if(r)if(a>=0){const n=[...e(at)];n[a]={key:t,dir:n[a].dir==="asc"?"desc":"asc"},f(at,n,!0)}else f(at,[...e(at),{key:t,dir:"asc"}],!0);else a>=0&&e(at).length===1?f(at,[{key:t,dir:e(at)[0].dir==="asc"?"desc":"asc"}],!0):f(at,[{key:t,dir:"asc"}],!0)}function Ol(){return{visibleColumns:[...e(Et)],search:e(Wt),sorts:e(at).map(t=>({...t}))}}function Hl(t){f(Et,[...t.visibleColumns],!0),f(Wt,t.search,!0),f(at,t.sorts.map(r=>({...r})),!0)}function jl(t){f(Ut,{...e(Ut),[t]:Ol()},!0),Hr("csauto_status_views",e(Ut)),kn(t)}function Vl(t){const r={...e(Ut)};delete r[t],f(Ut,r,!0),Hr("csauto_status_views",r),e(xn)===t&&kn("")}function Sr(){const t=new Set;for(const r of e(Gt))e(ht).has(r.case_id)&&t.add((r.status??"").toUpperCase());return t}function Xn(){for(const t of e(Gt))if(e(ht).has(t.case_id)&&t.resu_size_mb!=null&&t.resu_size_mb>0)return!0;return!1}function Ul(t,r){const a=r.length,n=t.length,s=r.filter(d=>d.status==="RUNNING").length,i=t.filter(d=>d.status==="RUNNING").length,o=r.filter(d=>d.convergence==="converged").length,l=t.filter(d=>d.convergence==="converged").length;return{totalCases:a,shownCases:n,totalRunning:s,shownRunning:i,totalConverged:o,shownConverged:l}}var Bl=S('
      DOE columns
      '),ql=S('
      ');function Kl(t,r){Me(r,!0);let a=he(r,"initialName",3,""),n=j(wn),s=z(ie(a())),i=z(ie(new Set(r.initialColumns??[...e(n),...Ft.map(V=>V.key)])));function o(V){const G=new Set(e(i));G.has(V)?G.delete(V):G.add(V),f(i,G,!0)}function l(V,G){const J=new Set(e(i));V.forEach(se=>G?J.add(se):J.delete(se)),f(i,J,!0)}function d(){const V=e(s).trim();V&&r.onSave(V,[...e(i)])}function b(V){V.key==="Escape"&&r.onCancel()}function x(V){V.target.dataset.backdrop!==void 0&&r.onCancel()}let A=z(void 0);Re(()=>{var V,G;(V=e(A))==null||V.focus(),(G=e(A))==null||G.select()});var m=ql(),N=k(m),T=k(N),g=k(T,!0);p(T);var c=P(T,2),w=P(k(c),2);Xe(w),rt(w,V=>f(A,V),()=>e(A)),p(c);var E=P(c,2);{var h=V=>{var G=Bl(),J=k(G),se=P(k(J),2),R=k(se),$=P(R,2);p(se),p(J);var H=P(J,2);Ye(H,20,()=>e(n),D=>D,(D,v)=>{{let q=j(()=>e(i).has(v));zt(D,{get checked(){return e(q)},onchange:()=>o(v),size:14,get label(){return v}})}}),p(H),p(G),ce("click",R,()=>l(e(n),!0)),ce("click",$,()=>l(e(n),!1)),u(V,G)};Q(E,V=>{e(n).length>0&&V(h)})}var y=P(E,2),C=k(y),_=P(k(C),2),M=k(_),F=P(M,2);p(_),p(C);var L=P(C,2);Ye(L,21,()=>Ft,V=>V.key,(V,G)=>{{let J=j(()=>e(i).has(e(G).key));zt(V,{get checked(){return e(J)},onchange:()=>o(e(G).key),size:14,get label(){return e(G).label}})}}),p(L),p(y);var B=P(y,2),I=k(B);Pe(I,{variant:"secondary",get onclick(){return r.onCancel},children:(V,G)=>{ke();var J=Ue("Cancel");u(V,J)},$$slots:{default:!0}});var O=P(I,2);{let V=j(()=>!e(s).trim());Pe(O,{variant:"primary",onclick:d,get disabled(){return e(V)},children:(G,J)=>{ke();var se=Ue("Save");u(G,se)},$$slots:{default:!0}})}p(B),p(N),p(m),ee(()=>ne(g,r.mode==="create"?"New view":"Edit view")),ce("keydown",m,b),ce("click",m,x),et(w,()=>e(s),V=>f(s,V)),ce("click",M,()=>l(Ft.map(V=>V.key),!0)),ce("click",F,()=>l(Ft.map(V=>V.key),!1)),u(t,m),Ae()}Ge(["keydown","click"]);var Gl=S('
      ',1);function Wl(t,r){Me(r,!0);let a=j(()=>Object.keys(Bn())),n=z(ie(El())),s=z(!1),i=z("create"),o=j(()=>[{value:"",label:"All columns"},...e(a).map(C=>({value:C,label:C}))]);function l(C){if(f(n,C,!0),kn(C),C==="")qn([...wn(),...Ft.map(_=>_.key)]);else{const _=Bn();_[C]&&Hl(_[C])}}function d(){f(i,"edit"),f(s,!0)}function b(){f(i,"create"),f(s,!0)}function x(C,_){qn(_),e(i)==="edit"&&e(n)&&C!==e(n)&&Vl(e(n)),jl(C),f(n,C,!0),f(s,!1)}function A(){f(s,!1)}var m=Gl(),N=K(m),T=k(N);it(T,{class:"w-[140px]",get options(){return e(o)},get value(){return e(n)},onchange:l});var g=P(T,2),c=k(g);Te(c,{get icon(){return Ko},size:14}),p(g);var w=P(g,2),E=k(w);Te(E,{get icon(){return Go},size:14}),p(w),p(N);var h=P(N,2);{var y=C=>{Qt(C,{children:(_,M)=>{{let F=j(()=>e(i)==="edit"?e(n):""),L=j(wl);Kl(_,{get mode(){return e(i)},get initialName(){return e(F)},get initialColumns(){return e(L)},onSave:x,onCancel:A})}}})};Q(h,C=>{e(s)&&C(y)})}ce("click",g,d),ce("click",w,b),u(t,m),Ae()}Ge(["click"]);var Xl=S('
      '),Yl=S(""),Ql=S(' '),Zl=S(' '),Jl=S('
      '),ec=S(" "),tc=S(''),rc=S(''),nc=S(" Open GUI",1),ac=S(""),sc=S(" "),oc=S(""),ic=S('
      ');function lc(t,r){Me(r,!0);let a=j(()=>r.rows.length>0&&r.rows.every(R=>e(b).has(R.case_id))),n=j(()=>r.rows.some(R=>e(b).has(R.case_id))),s=j(()=>e(n)&&!e(a)),i=j(kl),o=j(()=>new Set(Cl())),l=j(Sl),d=j(Pl),b=j(jt),x=j(()=>{const R=[{key:"_select",label:"",kind:"meta",sticky:"left"},{key:"case_id",label:"Case",kind:"meta",sticky:"left"},{key:"status",label:"Status",kind:"meta",sticky:"left"},...e(o).has("note")?[{key:"note",label:"Note",kind:"meta"}]:[]],$=e(i).map(q=>({key:q,label:q,kind:"doe"})),D=[{key:"nprocs",label:"MPI Ranks",kind:"calc"},{key:"nt",label:"Thread Count",kind:"calc"},{key:"last_iter",label:"Last Iter",kind:"calc"},{key:"duration",label:"Duration",kind:"calc"},{key:"last_mod",label:"Last Modified",kind:"calc"},{key:"resu_size_mb",label:"RESU Size (MB)",kind:"calc"}].filter(q=>e(o).has(q.key)),v=lr("gui")?[{key:"_actions",label:"",kind:"meta",sticky:"right"}]:[];return[...R,...$,...D,...v]});function A(R){const $=e(l).findIndex(D=>D.key===R);if($<0)return"";const H=e(l)[$].dir==="asc"?"▲":"▼";return e(l).length>1?`${H}${$+1}`:H}function m(R,$){R!=="_actions"&&Il(R,$.ctrlKey||$.metaKey)}function N(R,$){$.shiftKey?sn(nn()||R,R,Rr()):$.ctrlKey||$.metaKey?an(R):Sa(R)}function T(R,$){var D;const H=((D=R.status)==null?void 0:D.toUpperCase())??"";H!=="DONE"&&H!=="FAILED"||($.preventDefault(),r.onContextMenu(R.case_id,$.clientX,$.clientY,R.convergence??""))}async function g(R){const $=R.note??"",H=await hn("Case note:",$,`Note — ${R.case_id}`,"",!0);if(H!==null)try{await bi(R.case_id,H)}catch(D){await We(`Failed to set note: ${D instanceof Error?D.message:D}`,"Error")}}async function c(R){try{await yi(R)}catch($){await We(`Failed to open GUI: ${$ instanceof Error?$.message:$}`,"Error")}}function w(R,$){const H=(R==null?void 0:R.toUpperCase())??"";return(H==="DONE"||H==="FAILED")&&$==="converged"?"CONVERGED":(H==="DONE"||H==="FAILED")&&$==="not_converged"?"NOT CONVERGED":H}function E(R,$){const H=(R==null?void 0:R.toUpperCase())??"";return(H==="DONE"||H==="FAILED")&&$==="converged"?"status-converged":(H==="DONE"||H==="FAILED")&&$==="not_converged"?"status-not-converged":H==="RUNNING"?"status-running":H==="DONE"?"status-done":H==="FAILED"?"status-failed":H==="PREPARED"?"status-prepared":"status-unknown"}function h(R){return e(b).has(R.case_id)?"row-selected":""}function y(R,$){var H;return $.key==="case_id"?R.case_id:$.key==="nprocs"?R.nprocs!=null?String(R.nprocs):"":$.key==="nt"?R.nt!=null?String(R.nt):"":$.key==="last_iter"?R.last_iter!=null?String(R.last_iter):"":$.key==="duration"?R.duration??"":$.key==="last_mod"?C(R.last_mod):$.key==="resu_size_mb"?R.resu_size_mb!=null?String(R.resu_size_mb):"":$.kind==="doe"?((H=R.doe)==null?void 0:H[$.key])!=null&&String(R.doe[$.key])!==""?String(R.doe[$.key]):"—":""}function C(R){if(!R)return"";try{const $=new Date(R),H=new Date,D=$.toDateString()===H.toDateString(),v=new Date(H);v.setDate(v.getDate()-1);const q=$.toDateString()===v.toDateString(),W=$.toLocaleTimeString([],{hour:"2-digit",minute:"2-digit"});return D?`Today ${W}`:q?`Yesterday ${W}`:$.toLocaleDateString([],{month:"short",day:"numeric"})+` ${W}`}catch{return R}}let _=z(ie({})),M=z(void 0);Re(()=>{e(d),e(x),r.rows,!(!e(M)||!e(d))&&Pt().then(()=>{if(!e(M))return;const R=Array.from(e(M).querySelectorAll("thead th.sticky-left")),$={};let H=0;R.forEach(D=>{const v=D.dataset.colKey??"";$[v]=H,H+=D.getBoundingClientRect().width}),f(_,$,!0)})});function F(R,$,H){const D=H&&R.key!=="_select"&&R.key!=="_actions"?["status-sortable"]:[];if(!H&&R.key==="case_id"&&D.push("case-id"),R.kind==="doe"&&D.push("status-col-doe"),!H&&R.key==="note"&&D.push("max-w-[140px] whitespace-nowrap overflow-hidden text-ellipsis cursor-pointer hover:underline hover:decoration-dotted hover:underline-offset-2"),e(d)&&R.sticky==="left"&&D.push("sticky-left"),e(d)&&R.sticky==="right"&&D.push("sticky-right"),e(d)&&R.sticky==="left"){const v=e(x)[$+1];(!v||v.sticky!=="left")&&D.push("sticky-divider")}if(e(d)&&R.sticky==="right"){const v=e(x)[$-1];(!v||v.sticky!=="right")&&D.push("sticky-divider")}return D.join(" ")}function L(R,$){return F(R,$,!0)}function B(R,$){return F(R,$,!1)}function I(R){return!e(d)||!R.sticky?"":R.sticky==="right"?"position:sticky;right:0;":R.sticky==="left"&&R.key in e(_)?`position:sticky;left:${e(_)[R.key]}px;`:""}var O=ic(),V=k(O),G=k(V),J=k(G);Ye(J,23,()=>e(x),R=>R.key,(R,$,H)=>{var D=be(),v=K(D);{var q=X=>{var Z=Xl(),oe=k(Z),ae=k(oe);zt(ae,{get checked(){return e(a)},get indeterminate(){return e(s)},get onchange(){return r.onToggleAll},size:14}),p(oe),p(Z),ee((pe,me)=>{Ce(Z,1,`${pe??""} !px-2.5 !py-0 w-9`),we(Z,"data-col-key",e($).key),Ze(Z,me)},[()=>L(e($),e(H)),()=>I(e($))]),u(X,Z)},W=X=>{var Z=Yl();ee((oe,ae)=>{Ce(Z,1,oe),we(Z,"data-col-key",e($).key),Ze(Z,ae)},[()=>dt(L(e($),e(H))),()=>I(e($))]),u(X,Z)},de=X=>{var Z=Zl(),oe=k(Z),ae=P(oe);{var pe=re=>{var _e=Ql(),ye=k(_e,!0);p(_e),ee(Ee=>ne(ye,Ee),[()=>A(e($).key)]),u(re,_e)},me=j(()=>A(e($).key));Q(ae,re=>{e(me)&&re(pe)})}p(Z),ee((re,_e)=>{Ce(Z,1,re),we(Z,"data-col-key",e($).key),Ze(Z,_e),ne(oe,`${e($).label??""} `)},[()=>dt(L(e($),e(H))),()=>I(e($))]),ce("click",Z,re=>m(e($).key,re)),ce("keydown",Z,re=>{(re.key==="Enter"||re.key===" ")&&(re.preventDefault(),m(e($).key,re))}),u(X,Z)};Q(v,X=>{e($).key==="_select"?X(q):e($).key==="_actions"?X(W,1):X(de,-1)})}u(R,D)}),p(J),p(G);var se=P(G);Ye(se,21,()=>r.rows,R=>R.case_id,(R,$)=>{var H=oc();Ye(H,23,()=>e(x),D=>D.key,(D,v,q)=>{var W=be(),de=K(W);{var X=me=>{var re=Jl(),_e=k(re),ye=k(_e);{let Ee=j(()=>e(b).has(e($).case_id));zt(ye,{get checked(){return e(Ee)},onchange:()=>r.onToggleRow(e($).case_id),size:14})}p(_e),p(re),ee((Ee,ge)=>{Ce(re,1,`${Ee??""} !px-2.5 !py-0 w-9`),we(re,"data-col-key",e(v).key),Ze(re,ge)},[()=>B(e(v),e(q)),()=>I(e(v))]),u(me,re)},Z=me=>{var re=ec(),_e=k(re),ye=k(_e,!0);p(_e),p(re),ee((Ee,ge,Fe,Ie)=>{Ce(re,1,Ee),we(re,"data-col-key",e(v).key),Ze(re,ge),Ce(_e,1,`status-pill ${Fe??""}`),ne(ye,Ie)},[()=>dt(B(e(v),e(q))),()=>I(e(v)),()=>E(e($).status,e($).convergence),()=>w(e($).status,e($).convergence)]),u(me,re)},oe=me=>{var re=rc(),_e=k(re);{var ye=ge=>{var Fe=Ue();ee(()=>ne(Fe,e($).note)),u(ge,Fe)},Ee=ge=>{var Fe=tc(),Ie=k(Fe);Te(Ie,{get icon(){return qo},size:12}),p(Fe),u(ge,Fe)};Q(_e,ge=>{e($).note?ge(ye):ge(Ee,-1)})}p(re),ee((ge,Fe)=>{Ce(re,1,ge),we(re,"data-col-key",e(v).key),Ze(re,Fe),we(re,"title",e($).note||"Add note")},[()=>dt(B(e(v),e(q))),()=>I(e(v))]),ce("click",re,ge=>{ge.stopPropagation(),g(e($))}),ce("keydown",re,ge=>{(ge.key==="Enter"||ge.key===" ")&&(ge.preventDefault(),ge.stopPropagation(),g(e($)))}),u(me,re)},ae=me=>{var re=ac(),_e=k(re);Pe(_e,{variant:"primary",size:"sm",onclick:ye=>{ye.stopPropagation(),c(e($).case_id)},children:(ye,Ee)=>{var ge=nc(),Fe=K(ge);Te(Fe,{get icon(){return Vo},size:12}),ke(),u(ye,ge)},$$slots:{default:!0}}),p(re),ee((ye,Ee)=>{Ce(re,1,ye),we(re,"data-col-key",e(v).key),Ze(re,Ee)},[()=>dt(B(e(v),e(q))),()=>I(e(v))]),u(me,re)},pe=me=>{var re=sc(),_e=k(re,!0);p(re),ee((ye,Ee,ge)=>{Ce(re,1,ye),we(re,"data-col-key",e(v).key),Ze(re,Ee),ne(_e,ge)},[()=>dt(B(e(v),e(q))),()=>I(e(v)),()=>y(e($),e(v))]),u(me,re)};Q(de,me=>{e(v).key==="_select"?me(X):e(v).key==="status"?me(Z,1):e(v).key==="note"?me(oe,2):e(v).key==="_actions"?me(ae,3):me(pe,-1)})}u(D,W)}),p(H),ee(D=>Ce(H,1,D),[()=>dt(h(e($)))]),ce("click",H,D=>N(e($).case_id,D)),ce("contextmenu",H,D=>T(e($),D)),u(R,H)}),p(se),p(V),rt(V,R=>f(M,R),()=>e(M)),p(O),ee(()=>Ce(O,1,`table-wrap ${e(d)?"sticky-enabled":""}`)),u(t,O),Ae()}Ge(["click","keydown","contextmenu"]);var cc=S('
      ');function uc(t,r){Me(r,!0);let a=j(()=>{const m=Math.min(r.x,window.innerWidth-180),N=Math.min(r.y,window.innerHeight-120);return`left: ${m}px; top: ${N}px;`});async function n(m){try{for(const N of r.cases)await xi(N,m)}catch(N){console.error("Failed to set convergence:",N)}r.onClose()}const s=r.cases.length>1?` (${r.cases.length})`:"";var i=cc();tt("keydown",ot,m=>{m.key==="Escape"&&r.onClose()});var o=k(i),l=k(o);p(o);var d=P(o,2),b=k(d);p(d);var x=P(d,2),A=k(x);p(x),p(i),ee(()=>{Ze(i,e(a)),Ce(o,1,`w-full text-left py-[7px] px-[10px] bg-transparent border border-transparent rounded-md text-[12.5px] cursor-pointer transition-[background] duration-[120ms] ease-in-out hover:bg-edf-gris-clair hover:border-border ${r.currentValue==="converged"?"is-active":""}`),ne(l,`Mark Converged${s}`),Ce(d,1,`w-full text-left py-[7px] px-[10px] bg-transparent border border-transparent rounded-md text-[12.5px] cursor-pointer transition-[background] duration-[120ms] ease-in-out hover:bg-edf-gris-clair hover:border-border ${r.currentValue==="not_converged"?"is-active":""}`),ne(b,`Mark Not Converged${s}`),Ce(x,1,`w-full text-left py-[7px] px-[10px] bg-transparent border border-transparent rounded-md text-[12.5px] cursor-pointer transition-[background] duration-[120ms] ease-in-out hover:bg-edf-gris-clair hover:border-border ${r.currentValue===""?"is-active":""}`),ne(A,`Clear Mark${s}`)}),ce("click",o,()=>n("converged")),ce("click",d,()=>n("not_converged")),ce("click",x,()=>n("")),u(t,i),Ae()}Ge(["click"]);var dc=S(" Refresh",1),fc=S(" ",1),vc=S(" Run",1),gc=S(" Restart",1),hc=S(" Stop",1),pc=S(" Kill",1),mc=S(" Clean",1),_c=S('
      ',1),bc=S('
      ',1);function xc(t,r){Me(r,!0);function a(){return[...jt()]}async function n(){const v=a();if(!v.length)return;const q=await Xs(v);if(q)try{await On({cases:v,n:q.n,nt:q.nt,maxParallel:q.maxParallel}),r.onRefresh()}catch(W){await We(`Run failed: ${W instanceof Error?W.message:W}`,"Error")}}async function s(){const v=a();if(!v.length)return;const q=await Ys(v);if(q)try{await On({cases:v,n:q.n,nt:q.nt,maxParallel:q.maxParallel,restart:!0,restartMode:q.restartMode,restartValue:q.restartValue}),r.onRefresh()}catch(W){await We(`Restart failed: ${W instanceof Error?W.message:W}`,"Error")}}async function i(){const v=a();if(!(!v.length||!await Dn(`Kill ${v.length} case${v.length>1?"s":""}?`,"Confirm Kill","Kill","danger")))try{await mi(v),r.onRefresh()}catch(W){await We(`Kill failed: ${W instanceof Error?W.message:W}`,"Error")}}async function o(){const v=a();if(!(!v.length||!await Dn(`Stop ${v.length} case${v.length>1?"s":""} gracefully (checkpoint + exit)?`,"Confirm Stop","Stop","danger")))try{await kr({cases:v,action:"stop"}),r.onRefresh(),Cr(`Stop requested for ${v.length} case${v.length>1?"s":""} — will checkpoint and exit`)}catch(W){await We(`Stop failed: ${W instanceof Error?W.message:W}`,"Error")}}async function l(){const v=a();if(v.length)try{await kr({cases:v,action:"checkpoint"}),r.onRefresh(),Cr(`Checkpoint requested for ${v.length} case${v.length>1?"s":""}`)}catch(q){await We(`Checkpoint failed: ${q instanceof Error?q.message:q}`,"Error")}}async function d(){const v=a();if(!v.length)return;const q=await hn("Extend by how many additional time steps?","500","Extend Run");if(q===null)return;const W=parseInt(q,10);if(!Number.isFinite(W)||W<=0){await We("Enter a positive integer number of time steps.","Error");return}try{await kr({cases:v,action:"extend",value:W}),r.onRefresh(),Cr(`Extended ${v.length} case${v.length>1?"s":""} by ${W} time steps`)}catch(de){await We(`Extend failed: ${de instanceof Error?de.message:de}`,"Error")}}async function b(){const v=a();if(v.length)try{await kr({cases:v,action:"flush"}),Cr(`Flush requested for ${v.length} case${v.length>1?"s":""}`)}catch(q){await We(`Flush failed: ${q instanceof Error?q.message:q}`,"Error")}}async function x(){const v=a();if(!v.length)return;const q=await Qs(v);if(q)try{await _i({cases:v,keepLast:q.keepLast,keepResu:q.keepResu,deleteResu:q.deleteResu,pruneResu:!0}),r.onRefresh(),Wi()}catch(W){await We(`Cleanup failed: ${W instanceof Error?W.message:W}`,"Error")}}function A(){const v=Rr();v.length>0&&v.every(W=>jt().has(W))?Gn():Kn(v)}function m(v){an(v)}let N=z(ie(Jt("status")));Re(()=>{er("status",e(N))}),Tl(!0);let T=j(()=>{const v=Sr();return v.size>0&&[...v].some(q=>q==="PREPARED"||q==="DONE"||q==="FAILED")}),g=j(()=>{if(!lr("restart"))return!1;const v=Sr();return v.size>0&&[...v].some(q=>q==="DONE"||q==="FAILED")&&Xn()}),c=j(()=>{const v=Sr();return v.size>0&&v.has("RUNNING")}),w=j(()=>{if(!lr("control"))return!1;const v=Sr();return v.size>0&&v.has("RUNNING")});const E=[{label:"Extend",icon:Uo,onClick:d,action:"extend"},{label:"Checkpoint",icon:Xo,onClick:l,action:"checkpoint"},{label:"Flush",icon:Ho,onClick:b,action:"flush"}];let h=j(()=>E.filter(v=>nl(v.action)).map(v=>({label:v.label,icon:v.icon,onClick:v.onClick,disabled:!e(w)}))),y=j(Xn),C=z(ie($l())),_=null;function M(){_&&clearTimeout(_),_=setTimeout(()=>{Al(e(C))},200)}Re(()=>Ll(e(N)));let F=z(!1),L=z(0),B=z(0),I=z(ie([])),O=z("");function V(v,q,W,de){f(I,jt().has(v)?[...jt()]:[v],!0),f(O,de,!0),f(L,q,!0),f(B,W,!0),f(F,!0)}function G(){f(F,!1)}function J(v){const q=Rr();if(q.length){if(v.key==="Escape"){Gn(),G();return}if((v.ctrlKey||v.metaKey)&&v.key==="a"){v.preventDefault(),Kn(q);return}if(v.key==="ArrowDown"||v.key==="ArrowUp"){v.preventDefault();const W=v.key==="ArrowDown"?1:-1,de=Un(),X=q.indexOf(de),Z=Math.max(0,Math.min(q.length-1,X+W)),oe=q[Z];v.shiftKey?sn(nn()||q[0],oe,q):Sa(oe),Ml(oe);return}if(v.key===" "){v.preventDefault();const W=Un();W&&(v.shiftKey?sn(nn()||W,W,Rr()):an(W))}}}var se=bc();tt("click",ot,G),tt("scroll",ot,G);var R=K(se),$=k(R);Ot($,{eyebrow:"Overview",title:"Status",wide:!0,id:"status-card-shell",actions:q=>{var W=fc(),de=K(W);{let oe=j(Ki);tr(de,{name:"status",get intervalMs(){return e(oe)},get onRefresh(){return r.onRefresh},get checked(){return e(N)},set checked(ae){f(N,ae,!0)}})}var X=P(de,2);{var Z=oe=>{Pe(oe,{variant:"primary",onclick:()=>r.onRefresh(),children:(ae,pe)=>{var me=dc(),re=K(me);Te(re,{get icon(){return Zt}}),ke(),u(ae,me)},$$slots:{default:!0}})};Q(X,oe=>{e(N)||oe(Z)})}u(q,W)},children:(q,W)=>{var de=_c(),X=K(de),Z=k(X),oe=k(Z);Xe(oe);var ae=P(oe,2);Wl(ae,{}),p(Z);var pe=P(Z,2),me=k(pe),re=k(me);p(me);var _e=P(me,2);{let U=j(()=>!e(T));Pe(_e,{variant:"run",size:"sm",onclick:n,get disabled(){return e(U)},children:(te,le)=>{var fe=vc(),xe=K(fe);Te(xe,{get icon(){return _a}}),ke(),u(te,fe)},$$slots:{default:!0}})}var ye=P(_e,2);{var Ee=U=>{{let te=j(()=>!e(g));Pe(U,{variant:"warning",size:"sm",onclick:s,get disabled(){return e(te)},children:(le,fe)=>{var xe=gc(),ve=K(xe);Te(ve,{get icon(){return Wo}}),ke(),u(le,xe)},$$slots:{default:!0}})}},ge=j(()=>lr("restart"));Q(ye,U=>{e(ge)&&U(Ee)})}var Fe=P(ye,2);{var Ie=U=>{{let te=j(()=>!e(w));Pe(U,{variant:"warning",size:"sm",onclick:o,get disabled(){return e(te)},children:(le,fe)=>{var xe=hc(),ve=K(xe);Te(ve,{get icon(){return Io}}),ke(),u(le,xe)},$$slots:{default:!0}})}},Qe=j(()=>lr("control"));Q(Fe,U=>{e(Qe)&&U(Ie)})}var Ve=P(Fe,2);{var Se=U=>{xl(U,{get items(){return e(h)}})};Q(Ve,U=>{e(h).length>0&&U(Se)})}var $e=P(Ve,2);{let U=j(()=>!e(c));Pe($e,{variant:"danger",size:"sm",onclick:i,get disabled(){return e(U)},children:(te,le)=>{var fe=pc(),xe=K(fe);Te(xe,{get icon(){return Oo}}),ke(),u(te,fe)},$$slots:{default:!0}})}var Oe=P($e,2);{let U=j(()=>!e(y));Pe(Oe,{variant:"secondary",size:"sm",onclick:x,get disabled(){return e(U)},children:(te,le)=>{var fe=mc(),xe=K(fe);Te(xe,{get icon(){return Qo}}),ke(),u(te,fe)},$$slots:{default:!0}})}p(pe),p(X);var Y=P(X,2);{let U=j(Pa);lc(Y,{get rows(){return e(U)},onContextMenu:V,onToggleAll:A,onToggleRow:m})}ee(U=>ne(re,`${U??""} selected`),[()=>jt().size]),ce("input",oe,M),et(oe,()=>e(C),U=>f(C,U)),u(q,de)},$$slots:{actions:!0,default:!0}}),p(R);var H=P(R,2);{var D=v=>{uc(v,{get cases(){return e(I)},get x(){return e(L)},get y(){return e(B)},get currentValue(){return e(O)},onClose:G})};Q(H,v=>{e(F)&&v(D)})}ce("keydown",R,J),u(t,se),Ae()}Ge(["keydown","input"]);var yc=S('
      ');function Xt(t,r){var a=yc(),n=k(a);ft(n,()=>r.children),p(a),u(t,a)}function Cn(t){return t.map(r=>({value:r,label:r}))}var wc=S(''),kc=S(" ",1);function Sn(t,r){Me(r,!0);let a=he(r,"columnLabel",3,"Columns"),n=he(r,"xMinLabel",3,"Iter min"),s=j(()=>Cn(r.allCases)),i=j(()=>r.columns.map(d=>({value:d,label:d}))),o=[{value:"zero",label:"Zero"},{value:"restart",label:"Restart start"},{value:"custom",label:"Custom"}];function l(d){r.onXMinChange(Number(d.target.value)||0)}Xt(t,{children:(d,b)=>{var x=kc(),A=K(x);Ne(A,{text:"Cases",children:(y,C)=>{qt(y,{class:"w-[160px]",get options(){return e(s)},get selected(){return r.selectedCases},get onchange(){return r.onCasesChange},placeholder:"Select cases..."})}});var m=P(A,2);{var N=y=>{var C=be(),_=K(C);ft(_,()=>r.middleSlot),u(y,C)};Q(m,y=>{r.middleSlot&&y(N)})}var T=P(m,2);Ne(T,{get text(){return a()},children:(y,C)=>{qt(y,{class:"w-[160px]",get options(){return e(i)},get selected(){return r.selectedColumns},get onchange(){return r.onColumnsChange},placeholder:"Select..."})}});var g=P(T,2);Ne(g,{text:"Start from",children:(y,C)=>{it(y,{class:"w-[140px]",get options(){return o},get value(){return r.startFrom},onchange:_=>r.onStartFromChange(_)})}});var c=P(g,2);{var w=y=>{Ne(y,{get text(){return n()},children:(C,_)=>{var M=wc();Xe(M),ee(()=>vn(M,r.xMin)),ce("input",M,l),u(C,M)}})};Q(c,y=>{r.startFrom==="custom"&&y(w)})}var E=P(c,2);{var h=y=>{var C=be(),_=K(C);ft(_,()=>r.extraSlot),u(y,C)};Q(E,y=>{r.extraSlot&&y(h)})}u(d,x)}}),Ae()}Ge(["input"]);var Cc=S('
      '),Sc=S('
      ');function Yt(t,r){let a=he(r,"emptyMessage",3,"");var n=Sc(),s=k(n);{var i=l=>{var d=be(),b=K(d);zr(b,()=>r.svgHtml),u(l,d)},o=l=>{var d=Cc(),b=k(d),x=k(b,!0);p(b),p(d),ee(()=>ne(x,a()||"No data to display.")),u(l,d)};Q(s,l=>{r.svgHtml?l(i):l(o,-1)})}p(n),ee(()=>we(n,"id",r.id)),u(t,n)}async function $n(t,r="plot.png"){const a=document.getElementById(t),n=a==null?void 0:a.querySelector("svg");if(!n)return;const{width:s,height:i}=$c(n),o=window.devicePixelRatio||1,l=document.createElement("canvas");l.width=s*o,l.height=i*o;const d=l.getContext("2d");if(!d)return;d.scale(o,o);const b=new XMLSerializer().serializeToString(n),x=new Blob([b],{type:"image/svg+xml;charset=utf-8"}),A=URL.createObjectURL(x),m=new Image;m.width=s,m.height=i,await new Promise((T,g)=>{m.onload=()=>{d.drawImage(m,0,0,s,i),URL.revokeObjectURL(A),T()},m.onerror=g,m.src=A});const N=await new Promise(T=>l.toBlob(T,"image/png"));N&&await Ra(N,Pc(r))}function br(t,r,a="png"){const n=r.length<=3?r.join("_"):`${r.length}_cases`,s=new Date().toISOString().replace(/[:.]/g,"-").slice(0,19);return Ec(`${t}_${n}_${s}.${a}`)}async function Ea(t,r){const a=new Blob([t],{type:"text/csv;charset=utf-8"});await Ra(a,r)}function $c(t){const r=t.getAttribute("viewBox");if(r){const a=r.split(/[\s,]+/).map(Number);if(a.length===4)return{width:a[2],height:a[3]}}return{width:t.width.baseVal.value||900,height:t.height.baseVal.value||500}}async function Ra(t,r){if("showSaveFilePicker"in window)try{const i=await(await window.showSaveFilePicker({suggestedName:r,types:[{description:t.type.startsWith("image/")?"Image":"File",accept:{[t.type]:[`.${r.split(".").pop()}`]}}]})).createWritable();await i.write(t),await i.close();return}catch(s){if((s==null?void 0:s.name)==="AbortError")return}const a=URL.createObjectURL(t),n=document.createElement("a");n.href=a,n.download=r,document.body.appendChild(n),n.click(),document.body.removeChild(n),URL.revokeObjectURL(a)}function Pc(t){return t.endsWith(".png")?t:`${t}.png`}function Ec(t){return t.replace(/[^a-zA-Z0-9._-]/g,"_")}let Na=z(ie([])),Ma=z(ie([])),Aa=z(ie([])),Ta=z("zero"),La=z(0),Fa=z(""),Rc=z(!0);function Nc(){return{selectedCases:e(Na),columns:e(Ma),selectedColumns:e(Aa),startFrom:e(Ta),iterMin:e(La),svgHtml:e(Fa),autoRefresh:e(Rc)}}function Yn(t){f(Na,t,!0)}function Mc(t){f(Ma,t,!0)}function Xr(t){f(Aa,t,!0)}function Ac(t){f(Ta,t,!0)}function Tc(t){f(La,t,!0)}function $r(t){f(Fa,t,!0)}var Lc=S(" Refresh",1),Fc=S(" ",1),Dc=S(" Download as PNG",1),zc=S('
      '),Ic=S('
      ',1),Oc=S('
      '),Hc=S('

      '),jc=S(" ",1);function Vc(t,r){Me(r,!0);let a=j(Nc),n=z("");const s=new Set(["iteration","wall_distance","walldistance"]),i=["velocity","pressure"];async function o(){if(e(a).selectedCases.length)try{const g=await ii(e(a).selectedCases);f(n,"");const c=g.filter(w=>!s.has(w.toLowerCase().replace(/\s+/g,"_")));if(Mc(c),c.length===0){Xr([]),$r("");return}if(e(a).selectedColumns.length===0){const w=c.filter(E=>i.some(h=>E.toLowerCase().includes(h)));Xr(w.length>0?w:[c[0]])}}catch(g){f(n,"Failed to load residual columns"),console.error("Failed to load residual columns:",g)}}async function l(){if(e(a).selectedCases.length&&!((e(a).columns.length===0||e(a).selectedColumns.length===0)&&(await o(),!e(a).selectedColumns.length)))try{let g=0,c=!0;if(e(a).startFrom==="restart"){const E=await wa(e(a).selectedCases),h=Object.values(E.origins).map(y=>y.iteration).filter(y=>y!==void 0&&Number.isFinite(y));g=h.length>0?Math.min(...h):0}else e(a).startFrom==="custom"&&(g=e(a).iterMin);const w=await li(e(a).selectedCases,e(a).selectedColumns,{xMin:g,includeHistory:c});f(n,""),w&&$r(w)}catch(g){f(n,"Failed to load residual plot"),console.error("Failed to load residual plot:",g)}}function d(g){if(Yn(g),g.length===0){$r("");return}o(),l()}function b(g){if(Xr(g),g.length===0){$r("");return}l()}function x(g){Ac(g),l()}function A(g){Tc(g),l()}let m=z(ie(Jt("plot")));Re(()=>{er("plot",e(m))}),Re(()=>{e(m)?pr("residualPlot",l,jn()):vt("residualPlot")});let N=!1;Re(()=>{r.allCases.length>0&&!N&&(N=!0,Yn([...r.allCases]),o().then(()=>l()))});const T=mr(()=>{N&&o().then(()=>l())});fr(()=>{vt("residualPlot"),T()}),Ot(t,{eyebrow:"Diagnostics",title:"Residuals Plot",wide:!0,actions:c=>{var w=Fc(),E=K(w);{let C=j(jn);tr(E,{name:"residualPlot",get intervalMs(){return e(C)},onRefresh:l,get checked(){return e(m)},set checked(_){f(m,_,!0)}})}var h=P(E,2);{var y=C=>{Pe(C,{variant:"primary",onclick:l,children:(_,M)=>{var F=Lc(),L=K(F);Te(L,{get icon(){return Zt}}),ke(),u(_,F)},$$slots:{default:!0}})};Q(h,C=>{e(m)||C(y)})}u(c,w)},children:(c,w)=>{var E=jc(),h=K(E);{var y=F=>{const L=G=>{var J=zc(),se=k(J);{let R=j(()=>!e(a).svgHtml);Pe(se,{variant:"secondary",size:"sm",onclick:()=>$n("plot-holder",br("residuals",e(a).selectedCases)),get disabled(){return e(R)},children:($,H)=>{var D=Dc(),v=K(D);Te(v,{get icon(){return hr}}),ke(),u($,D)},$$slots:{default:!0}})}p(J),u(G,J)};var B=Ic(),I=K(B);Sn(I,{prefix:"plot",get allCases(){return r.allCases},get selectedCases(){return e(a).selectedCases},onCasesChange:d,columnLabel:"Variables",get columns(){return e(a).columns},get selectedColumns(){return e(a).selectedColumns},onColumnsChange:b,get startFrom(){return e(a).startFrom},onStartFromChange:x,xMinLabel:"Iter min",get xMin(){return e(a).iterMin},onXMinChange:A,get extraSlot(){return L}});var O=P(I,2),V=k(O);{let G=j(()=>e(a).selectedCases.length===0?"Please select at least one case.":e(a).selectedColumns.length===0?"Please select at least one variable.":"No data to display.");Yt(V,{id:"plot-holder",get svgHtml(){return e(a).svgHtml},get emptyMessage(){return e(G)}})}p(O),u(F,B)},C=F=>{var L=Oc(),B=k(L);Yt(B,{id:"plot-holder",svgHtml:"",emptyMessage:"No data available. Please run a simulation first."}),p(L),u(F,L)};Q(h,F=>{e(a).columns.length>0?F(y):F(C,-1)})}var _=P(h,2);{var M=F=>{var L=Hc(),B=k(L,!0);p(L),ee(()=>ne(B,e(n))),u(F,L)};Q(_,F=>{e(n)&&F(M)})}u(c,E)},$$slots:{actions:!0,default:!0}}),Ae()}function Da(t){const{scope:r,getState:a,setState:n,setHasData:s,getAxis:i}=t;async function o(){const m=a();if(m.selectedCases.length)try{let N=await Jr(m.selectedCases,r);if(t.filterFiles&&(N=t.filterFiles(N)),n({files:N}),s(N.length>0),N.length===0){n({file:"",columns:[],selectedColumns:[],positionText:"",svgHtml:""});return}(!m.file||!N.includes(m.file))&&(n({file:N[0]}),await l())}catch(N){console.error(`Failed to load ${r} files:`,N)}}async function l(){const m=a();if(!(!m.selectedCases.length||!m.file))try{const N=await vi(m.selectedCases,[m.file]),T=t.filterColumns?t.filterColumns(N):N;t.onColumnsLoaded?t.onColumnsLoaded(N):n({columns:T});const g=a();if(g.columns.length===0){n({selectedColumns:[],positionText:"",svgHtml:""});return}g.selectedColumns.length===0&&n({selectedColumns:[g.columns[0]]})}catch(N){console.error(`Failed to load ${r} columns:`,N)}}async function d(){let m=a();if(m.selectedCases.length){if(await o(),m=a(),!m.file){n({positionText:"",svgHtml:""});return}if((m.columns.length===0||m.selectedColumns.length===0)&&(await l(),m=a(),!m.selectedColumns.length)){n({positionText:"",svgHtml:""});return}try{let N;const T=a();if(T.startFrom==="restart"){const c=await wa(T.selectedCases),w=i().toLowerCase(),E=w==="t"||w==="time"?"time":"iteration",h=Object.values(c.origins).map(y=>y[E]).filter(y=>y!==void 0&&Number.isFinite(y));N=h.length>0?Math.min(...h):void 0}else T.startFrom==="custom"&&(N=T.xMin);const g=await hi({cases:T.selectedCases,probes:[T.file],columns:T.selectedColumns,axis:i(),timeMin:typeof N=="number"?N:void 0,xMin:N,includeHistory:!0});g&&n({svgHtml:g})}catch(N){console.error(`Failed to load ${r} plot:`,N)}}}async function b(m){if(n({selectedCases:m}),m.length===0){n({svgHtml:""});return}await o(),r==="probes"&&await d()}function x(m){if(n({selectedColumns:m}),m.length===0){n({svgHtml:""});return}d()}async function A(m){n({file:m}),await l(),await d()}return{loadFiles:o,loadColumns:l,loadPlot:d,handleCasesChange:b,handleColumnsChange:x,handleFileChange:A}}function za(){return{selectedCases:[],file:"",files:[],columns:[],selectedColumns:[],axis:"time",startFrom:"zero",xMin:0,positionText:"",svgHtml:"",autoRefresh:!0}}let Vt=z("time"),on=z(ie(za())),ln=z(ie({...za(),axis:""})),Uc=z(!0),Lr=z(!1),Fr=z(!1);function Bc(){return e(Vt)}function qc(t){f(Vt,t,!0)}function Kc(){return e(Lr)}function cn(t){f(Lr,t,!0)}function Gc(){return e(Fr)}function un(t){f(Fr,t,!0)}function Wc(){e(Vt)==="time"&&!e(Lr)&&e(Fr)?f(Vt,"profile"):e(Vt)==="profile"&&!e(Fr)&&e(Lr)&&f(Vt,"time")}function Qn(){return e(on)}function Yr(){return e(ln)}function wt(t){f(on,{...e(on),...t},!0)}function At(t){f(ln,{...e(ln),...t},!0)}function Xc(){return e(Uc)}var Yc=S(" Download as PNG",1),Qc=S('
      '),Zc=S("
      "),Jc=S('
      '),eu=S('
      ',1),tu=S('
      ');function ru(t,r){Me(r,!0);let a=he(r,"onRefresh",15),n=j(Qn);const s=new Set(["time","t","iteration","iter"]),i=Da({scope:"probes",getState:Qn,setState:wt,setHasData:cn,filterFiles:g=>g.filter(c=>{const w=c.replace(/\.csv$/i,"").toLowerCase();return w!=="coords"&&!w.includes("coordinates")}),filterColumns:g=>g.filter(c=>!s.has(c.toLowerCase())),onColumnsLoaded:g=>{const c=g.filter(w=>!s.has(w.toLowerCase()));wt({columns:c}),o()},getAxis:()=>"time"});async function o(){if(!(!e(n).selectedCases.length||!e(n).file||!e(n).selectedColumns.length))try{const g=[];for(const C of e(n).selectedColumns){const _=await gi(e(n).selectedCases[0],e(n).file,[C]);_.found&&g.push({col:C,x:_.x,y:_.y,z:_.z})}if(!g.length){wt({positionText:""});return}const c=C=>{let _=0;for(const M of C){if(M===void 0)continue;const F=String(M),L=F.indexOf(".");L>=0&&(_=Math.max(_,F.length-L-1))}return _},w=c(g.map(C=>C.x)),E=c(g.map(C=>C.y)),h=c(g.map(C=>C.z)),y=g.map(C=>{const _=[];return C.x!==void 0&&_.push(`x=${C.x.toFixed(w)}`),C.y!==void 0&&_.push(`y=${C.y.toFixed(E)}`),C.z!==void 0&&_.push(`z=${C.z.toFixed(h)}`),`Probe position [${C.col}] : ${_.join(" · ")}`});wt({positionText:y.join(` +`)})}catch{wt({positionText:""})}}function l(g){i.handleColumnsChange(g),g.length>0&&o()}let d=j(()=>e(n).files.map(g=>({value:g,label:g.replace(/\.csv$/i,"").replace(/^probes?_/i,"")}))),b=!1;Re(()=>{r.allCases.length>0&&!b&&(b=!0,wt({selectedCases:[...r.allCases]}),i.loadFiles().then(()=>i.loadPlot()))}),Re(()=>{a(i.loadPlot)});let x=j(()=>e(n).selectedCases.length===0?"Please select at least one case.":e(n).selectedColumns.length===0?"Please select at least one probe.":"No data to display.");var A=be(),m=K(A);{var N=g=>{const c=F=>{Ne(F,{text:"Quantity",children:(L,B)=>{it(L,{class:"w-[160px]",get options(){return e(d)},get value(){return e(n).file},get onchange(){return i.handleFileChange}})}})},w=F=>{var L=Qc(),B=k(L);{let I=j(()=>!e(n).svgHtml);Pe(B,{variant:"secondary",size:"sm",onclick:()=>$n("probe-plot-holder",br("probe",e(n).selectedCases)),get disabled(){return e(I)},children:(O,V)=>{var G=Yc(),J=K(G);Te(J,{get icon(){return hr}}),ke(),u(O,G)},$$slots:{default:!0}})}p(L),u(F,L)};var E=eu(),h=K(E);Sn(h,{prefix:"probe",get allCases(){return r.allCases},get selectedCases(){return e(n).selectedCases},get onCasesChange(){return i.handleCasesChange},get middleSlot(){return c},columnLabel:"Probes",get columns(){return e(n).columns},get selectedColumns(){return e(n).selectedColumns},onColumnsChange:l,get startFrom(){return e(n).startFrom},onStartFromChange:F=>{wt({startFrom:F}),i.loadPlot()},xMinLabel:"Time min",get xMin(){return e(n).xMin},onXMinChange:F=>{wt({xMin:F}),i.loadPlot()},get extraSlot(){return w}});var y=P(h,2);{var C=F=>{var L=Jc();Ye(L,21,()=>e(n).positionText.split(` +`).sort(),fn,(B,I)=>{var O=Zc(),V=k(O,!0);p(O),ee(()=>ne(V,e(I))),u(B,O)}),p(L),u(F,L)};Q(y,F=>{e(n).positionText&&F(C)})}var _=P(y,2),M=k(_);Yt(M,{id:"probe-plot-holder",get svgHtml(){return e(n).svgHtml},get emptyMessage(){return e(x)}}),p(_),u(g,E)},T=g=>{var c=tu(),w=k(c);Yt(w,{id:"probe-plot-holder",svgHtml:"",emptyMessage:"No probe data available. Please run a simulation first."}),p(c),u(g,c)};Q(m,g=>{e(n).files.length>0?g(N):g(T,-1)})}u(t,A),Ae()}var nu=S(" ",1),au=S(" Download as PNG",1),su=S('
      '),ou=S('
      ',1),iu=S('
      ');function lu(t,r){Me(r,!0);let a=he(r,"onRefresh",15),n=j(Yr);const s=["s","x","abscissa","distance","arclength","arc_length","curvilinear","length","r","y","z","coord","position"];function i(c){const w=c.map(E=>E.toLowerCase());for(const E of s){const h=w.indexOf(E);if(h>=0)return c[h]}return c[0]??""}const o=Da({scope:"profiles",getState:Yr,setState:At,setHasData:un,onColumnsLoaded:c=>{const w=e(n).axis||i(c),E=c.filter(h=>h!==w).toSorted((h,y)=>h.localeCompare(y));At({columns:E,axis:w,selectedColumns:e(n).selectedColumns.length?e(n).selectedColumns:E.length?[E[0]]:[]})},getAxis:()=>Yr().axis});function l(c){const w=e(n).axis;At({axis:c});const h=[...e(n).columns,...w?[w]:[]].filter(y=>y!==c).toSorted((y,C)=>y.localeCompare(C));At({columns:h}),o.loadPlot()}let d=j(()=>e(n).files.map(c=>({value:c,label:c.replace(/\.csv$/i,"").replace(/^profiles\//i,"").replace(/_/g," ")}))),b=j(()=>[...e(n).axis?[e(n).axis]:[],...e(n).columns].toSorted((c,w)=>c.localeCompare(w)).map(c=>({value:c,label:c}))),x=!1;Re(()=>{r.allCases.length>0&&!x&&(x=!0,At({selectedCases:[...r.allCases]}),o.loadFiles().then(()=>o.loadPlot()))}),Re(()=>{a(o.loadPlot)});let A=j(()=>e(n).selectedCases.length===0?"Please select at least one case.":e(n).selectedColumns.length===0?"Please select at least one value.":"No data to display.");var m=be(),N=K(m);{var T=c=>{const w=M=>{var F=nu(),L=K(F);Ne(L,{text:"Profile",children:(I,O)=>{it(I,{class:"w-[160px]",get options(){return e(d)},get value(){return e(n).file},get onchange(){return o.handleFileChange}})}});var B=P(L,2);Ne(B,{text:"X axis",children:(I,O)=>{it(I,{class:"w-[140px]",get options(){return e(b)},get value(){return e(n).axis},onchange:l})}}),u(M,F)},E=M=>{var F=su(),L=k(F);{let B=j(()=>!e(n).svgHtml);Pe(L,{variant:"secondary",size:"sm",onclick:()=>$n("profile-plot-holder",br("profile",e(n).selectedCases)),get disabled(){return e(B)},children:(I,O)=>{var V=au(),G=K(V);Te(G,{get icon(){return hr}}),ke(),u(I,V)},$$slots:{default:!0}})}p(F),u(M,F)};var h=ou(),y=K(h);Sn(y,{prefix:"profile",get allCases(){return r.allCases},get selectedCases(){return e(n).selectedCases},get onCasesChange(){return o.handleCasesChange},get middleSlot(){return w},columnLabel:"Values",get columns(){return e(n).columns},get selectedColumns(){return e(n).selectedColumns},get onColumnsChange(){return o.handleColumnsChange},get startFrom(){return e(n).startFrom},onStartFromChange:M=>{At({startFrom:M}),o.loadPlot()},xMinLabel:"X min",get xMin(){return e(n).xMin},onXMinChange:M=>{At({xMin:M}),o.loadPlot()},get extraSlot(){return E}});var C=P(y,2),_=k(C);Yt(_,{id:"profile-plot-holder",get svgHtml(){return e(n).svgHtml},get emptyMessage(){return e(A)}}),p(C),u(c,h)},g=c=>{var w=iu(),E=k(w);Yt(E,{id:"profile-plot-holder",svgHtml:"",emptyMessage:"No profile data available. Please run a simulation first."}),p(w),u(c,w)};Q(N,c=>{e(n).files.length>0?c(T):c(g,-1)})}u(t,m),Ae()}var cu=S('
      Diagnostics
      '),uu=S(" Refresh",1),du=S(" ",1);function fu(t,r){Me(r,!0);let a=j(Bc),n=j(Xc),s=j(Kc),i=j(Gc),o=z(ie(Jt("probe")));Re(()=>{er("probe",e(o))});let l=z(void 0);function d(){var T;(T=e(l))==null||T()}async function b(){if(r.allCases.length){try{const g=(await Jr(r.allCases,"probes")).filter(c=>{const w=c.replace(/\.csv$/i,"").toLowerCase();return w!=="coords"&&!w.includes("coordinates")});cn(g.length>0)}catch{cn(!1)}try{const T=await Jr(r.allCases,"profiles");un(T.length>0)}catch{un(!1)}}}Re(()=>{r.allCases.length>0&&b()}),mr(()=>{b(),d()}),Re(()=>{e(s),e(i),Wc()});function x(T){T==="time"&&!e(s)||T==="profile"&&!e(i)||qc(T)}var A=be(),m=K(A);{var N=T=>{{const g=w=>{var E=cu(),h=P(k(E),2),y=k(h),C=P(y,2);p(h),p(E),ee(()=>{Ce(y,1,`bg-transparent border-none p-0 m-0 text-lg font-bold tracking-tight transition-colors duration-150 + ${e(s)?e(a)==="time"?"text-edf-bleu-fonce cursor-pointer":"text-edf-gris-moyen cursor-pointer hover:text-muted":"text-edf-gris-moyen cursor-not-allowed opacity-50"}`),y.disabled=!e(s),we(y,"title",e(s)?"":"No probe data available. Run a simulation first."),Ce(C,1,`bg-transparent border-none p-0 m-0 text-lg font-bold tracking-tight transition-colors duration-150 + ${e(i)?e(a)==="profile"?"text-edf-bleu-fonce cursor-pointer":"text-edf-gris-moyen cursor-pointer hover:text-muted":"text-edf-gris-moyen cursor-not-allowed opacity-50"}`),C.disabled=!e(i),we(C,"title",e(i)?"":"No profile data available. Run a simulation first.")}),ce("click",y,()=>x("time")),ce("click",C,()=>x("profile")),u(w,E)};Ot(T,{wide:!0,titleSlot:g,tabs:g,actions:w=>{var E=du(),h=K(E);{let _=j(()=>e(a)==="time"?"probePlot":"profilePlot"),M=j(Gi);tr(h,{get name(){return e(_)},get intervalMs(){return e(M)},onRefresh:d,get checked(){return e(o)},set checked(F){f(o,F,!0)}})}var y=P(h,2);{var C=_=>{Pe(_,{variant:"primary",onclick:d,children:(M,F)=>{var L=uu(),B=K(L);Te(B,{get icon(){return Zt}}),ke(),u(M,L)},$$slots:{default:!0}})};Q(y,_=>{e(o)||_(C)})}u(w,E)},children:(w,E)=>{var h=be(),y=K(h);{var C=M=>{ru(M,{get allCases(){return r.allCases},get onRefresh(){return e(l)},set onRefresh(F){f(l,F,!0)}})},_=M=>{lu(M,{get allCases(){return r.allCases},get onRefresh(){return e(l)},set onRefresh(F){f(l,F,!0)}})};Q(y,M=>{e(a)==="time"?M(C):M(_,-1)})}u(w,h)},$$slots:{tabs:!0,actions:!0,default:!0}})}};Q(m,T=>{e(n)&&T(N)})}u(t,A),Ae()}Ge(["click"]);var vu=S(" Refresh",1),gu=S(" ",1),hu=S(" Download as CSV",1),pu=S('
      ',1),mu=S(" "),_u=S(' '),bu=S(' '),xu=S('
      Case
      '),yu=S('

      '),wu=S(" ",1);function ku(t,r){Me(r,!0);let a=z(ie([])),n=z(ie([])),s=z(!1),i=z(!1),o=z(ie(Jt("perf")));Re(()=>{er("perf",e(o))});const l=5e3;let b=z(ie([{key:"elapsed_time",label:"Elapsed (s)",kind:"time"},{key:"io_time",label:"I/O (s)",kind:"time"},{key:"linear_solver_time",label:"Linear Solver (s)",kind:"time"},{key:"gradients_time",label:"Gradients (s)",kind:"time"},{key:"balances_time",label:"Balances (s)",kind:"time"},{key:"mpi_ranks",label:"MPI Ranks",kind:"int"},{key:"threads",label:"Threads",kind:"int"}])),x=j(()=>r.allCases.map(E=>({value:E,label:E}))),A=j(()=>e(n).length>0);async function m(){var E;if(e(a).length){f(i,!0);try{const h=await In(e(a));(E=h.columns)!=null&&E.length&&f(b,h.columns,!0),f(n,h.records,!0),e(n).length>0&&f(s,!0)}catch(h){console.error("Failed to load perf:",h)}f(i,!1)}}function N(E){if(f(a,E,!0),E.length===0){f(n,[],!0);return}m()}function T(E,h){if(h==null||h==="")return"-";if(E==="text")return h;const y=Number(h);return Number.isFinite(y)?E==="int"?String(Math.round(y)):y.toFixed(3):h}async function g(){if(!e(n).length)return;const E=["case_id",...e(b).map(_=>_.key)],h=e(n).map(_=>[_.case_id,...e(b).map(M=>_[M.key]??"")].join(",")),y=[E.join(","),...h].join(` +`),C=br("timing_snapshot",e(a),"csv");await Ea(y,C)}let c=!1;Re(()=>{r.allCases.length>0&&!c&&(c=!0,f(a,[...r.allCases],!0),In(r.allCases).then(E=>{var h;(h=E.columns)!=null&&h.length&&f(b,E.columns,!0),f(s,E.records.length>0),f(n,E.records,!0)}).catch(()=>{}))}),Re(()=>{e(o)?pr("perf",m,l):vt("perf")});const w=mr(()=>{c&&m()});fr(()=>{vt("perf"),w()}),Ot(t,{eyebrow:"Performance",title:"Timing Snapshot",wide:!0,actions:h=>{var y=gu(),C=K(y);tr(C,{name:"perf",intervalMs:l,onRefresh:m,get checked(){return e(o)},set checked(F){f(o,F,!0)}});var _=P(C,2);{var M=F=>{Pe(F,{variant:"primary",onclick:m,children:(L,B)=>{var I=vu(),O=K(I);Te(O,{get icon(){return Zt}}),ke(),u(L,I)},$$slots:{default:!0}})};Q(_,F=>{e(o)||F(M)})}u(h,y)},children:(h,y)=>{var C=wu(),_=K(C);{var M=I=>{Xt(I,{children:(O,V)=>{var G=pu(),J=K(G);Ne(J,{text:"Cases",children:($,H)=>{qt($,{class:"w-[160px]",get options(){return e(x)},get selected(){return e(a)},onchange:N,placeholder:"Select cases..."})}});var se=P(J,2),R=k(se);{let $=j(()=>!e(A));Pe(R,{variant:"secondary",size:"sm",onclick:g,get disabled(){return e($)},children:(H,D)=>{var v=hu(),q=K(v);Te(q,{get icon(){return hr}}),ke(),u(H,v)},$$slots:{default:!0}})}p(se),u(O,G)}})};Q(_,I=>{e(s)&&I(M)})}var F=P(_,2);{var L=I=>{var O=xu(),V=k(O),G=k(V),J=k(G),se=P(k(J));Ye(se,17,()=>e(b),$=>$.key,($,H)=>{var D=mu(),v=k(D,!0);p(D),ee(()=>ne(v,e(H).label)),u($,D)}),p(J),p(G);var R=P(G);Ye(R,21,()=>e(n),$=>$.case_id,($,H)=>{var D=bu(),v=k(D),q=k(v,!0);p(v);var W=P(v);Ye(W,17,()=>e(b),de=>de.key,(de,X)=>{var Z=_u(),oe=k(Z,!0);p(Z),ee(ae=>ne(oe,ae),[()=>T(e(X).kind,e(H)[e(X).key])]),u(de,Z)}),p(D),ee(()=>ne(q,e(H).case_id)),u($,D)}),p(R),p(V),p(O),u(I,O)},B=I=>{var O=yu(),V=k(O);{var G=se=>{var R=Ue("Select cases above to view timing information.");u(se,R)},J=se=>{var R=Ue("No performance data available. Please run a simulation first.");u(se,R)};Q(V,se=>{e(s)?se(G):se(J,-1)})}p(O),u(I,O)};Q(F,I=>{e(A)?I(L):I(B,-1)})}u(h,C)},$$slots:{actions:!0,default:!0}}),Ae()}const Cu={"&":"&","<":"<",">":">",'"':""","'":"'"};function Ia(t){return t.replace(/[&<>"']/g,r=>Cu[r]??r)}var Su=S("
      "),$u=S('
      ');function Pu(t,r){Me(r,!0);let a=z(void 0);function n(b){const x=Ia(b);if(!r.searchQuery.trim())return x;try{const A=new RegExp(`(${r.searchQuery})`,"gi");return x.replace(A,'$1')}catch{return x}}function s(b){return b==="error"?"tail-sev-error":b==="warn"?"tail-sev-warn":b==="info"?"tail-sev-info":""}function i(){return e(a)?e(a).scrollHeight-e(a).scrollTop-e(a).clientHeight<=24:!0}let o=z(!0);function l(){f(o,i(),!0)}Re(()=>{r.autoScroll&&r.lines.length>0&&e(a)&&e(o)&&Pt().then(()=>{e(a)&&(e(a).scrollTop=e(a).scrollHeight)})});var d=$u();Ye(d,21,()=>r.lines,b=>b.index,(b,x)=>{var A=Su();zr(A,()=>n(e(x).text),!0),p(A),ee(m=>Ce(A,1,`tail-line ${m??""} ${e(x).isNew?"tail-new":""}`),[()=>s(e(x).severity)]),u(b,A)}),p(d),rt(d,b=>f(a,b),()=>e(a)),tt("scroll",d,l),u(t,d),Ae()}const Eu=/(fatal error|error detected|error reading|error writing|segmentation fault|sigterm|sigsegv|sigkill|abort|killed|terminated|core dumped|traceback|exception|errno)/i,Ru=/(warning|divergence|non-convergence|clipping|negative|nan detected|overflow|underflow)/i;function Nu(t){return Eu.test(t)?"error":Ru.test(t)?"warn":"none"}function Mu(t,r){return r==="all"||r===""?!0:r==="info"?t!=="none":t===r}var Au=S(" Refresh",1),Tu=S(" ",1),Lu=S(''),Fu=S(''),Du=S("    ",1),zu=It(''),Iu=It(''),Ou=It(''),Hu=S(" Resume",1),ju=S(" Pause",1),Vu=S('Case not running'),Uu=S(' 
      ',1),Bu=S('

      No log data available. Please run a simulation first.

      '),qu=S('

      '),Ku=S(" ",1);function Gu(t,r){Me(r,!0);const a=80;let n=z(""),s=z(""),i=z(!1),o=z(ie([])),l=z(a),d=z(ie([])),b=z(ie(new Set)),x=z(!1),A=z(ie(Jt("tail")));Re(()=>{er("tail",e(A))});let m=z(!0),N=z("all"),T=z(""),g=z(""),c=z(void 0),w=j(()=>Cn(r.allCases)),E=j(()=>e(o).map(R=>{const $=R.split("/").pop()??R;return{value:R,label:$}})),h=[{value:"all",label:"All"},{value:"error",label:"Error"},{value:"warn",label:"Warn"}],y=j(()=>e(o).length>0),C=j(()=>yn().some(R=>{var $;return R.case_id===e(n)&&(($=R.status)==null?void 0:$.toUpperCase())==="RUNNING"})),_=j(()=>{var R;return((R=St())==null?void 0:R.tail_files)??["csauto.stdout","csauto.stderr"]});function M(R){const $=R.split("/").pop()??R,H=e(_).indexOf($);return H===-1?99:H}async function F(){if(e(n))try{const H=(await di(e(n))).filter(D=>{const v=D.split("/").pop()??D;return D.endsWith(".log")||D.endsWith("/summary")||e(_).includes(v)}).sort((D,v)=>M(D)-M(v));if(f(o,H,!0),H.length>0){const D=H[0];!e(s)||!H.includes(e(s))?(f(s,D,!0),f(i,!1)):!e(i)&&M(D)0&&H[H.length-1]===""?H.slice(0,-1):H;if(e(d).length>0){const v=B(e(d),D),q=new Set;for(let W=v;W{let R=e(d).map(($,H)=>({text:$,index:H,severity:Nu($),isNew:e(b).has(H)}));if(e(N)!=="all"&&(R=R.filter($=>Mu($.severity,e(N)))),e(T).trim())try{const $=new RegExp(e(T),"i");R=R.filter(H=>$.test(H.text))}catch{}return R});function O(R){f(n,R,!0),f(s,""),f(i,!1),f(d,[],!0),F().then(()=>L(!0))}function V(R){f(s,R,!0),f(i,!0),f(d,[],!0),L(!0)}function G(){f(x,!e(x)),e(x)||L(!0)}function J(R){(R.ctrlKey||R.metaKey)&&R.key==="f"&&e(c)&&(R.preventDefault(),e(c).focus())}Re(()=>{r.allCases.length>0&&!e(n)&&(f(n,r.allCases[0],!0),F().then(()=>L(!0)))}),Re(()=>{e(A)&&!e(x)&&e(n)?pr("tail",()=>L(!1),Hn()):vt("tail")});const se=mr(()=>{e(n)&&F().then(()=>L(!0))});fr(()=>{vt("tail"),se()}),tt("keydown",ot,J),Ot(t,{eyebrow:"Live",title:"Log Tail",wide:!0,actions:$=>{var H=Tu(),D=K(H);{let W=j(Hn);tr(D,{name:"tail",get intervalMs(){return e(W)},onRefresh:()=>L(!1),get checked(){return e(A)},set checked(de){f(A,de,!0)}})}var v=P(D,2);{var q=W=>{Pe(W,{variant:"primary",onclick:()=>L(!0),children:(de,X)=>{var Z=Au(),oe=K(Z);Te(oe,{get icon(){return Zt}}),ke(),u(de,Z)},$$slots:{default:!0}})};Q(v,W=>{e(A)||W(q)})}u($,H)},children:($,H)=>{var D=Ku(),v=K(D);{var q=ae=>{Xt(ae,{children:(pe,me)=>{var re=Du(),_e=K(re);Ne(_e,{text:"Case",children:(Ie,Qe)=>{it(Ie,{class:"w-[130px]",get options(){return e(w)},get value(){return e(n)},onchange:O})}});var ye=P(_e,2);Ne(ye,{text:"File",children:(Ie,Qe)=>{it(Ie,{class:"w-[150px]",get options(){return e(E)},get value(){return e(s)},onchange:V})}});var Ee=P(ye,2);Ne(Ee,{text:"Lines",children:(Ie,Qe)=>{var Ve=Lu();Xe(Ve),ce("change",Ve,()=>L(!0)),et(Ve,()=>e(l),Se=>f(l,Se)),u(Ie,Ve)}});var ge=P(Ee,2);Ne(ge,{text:"Filter",children:(Ie,Qe)=>{var Ve=Fu();Xe(Ve),rt(Ve,Se=>f(c,Se),()=>e(c)),et(Ve,()=>e(T),Se=>f(T,Se)),u(Ie,Ve)}});var Fe=P(ge,2);Ne(Fe,{text:"Severity",children:(Ie,Qe)=>{it(Ie,{class:"w-[90px]",get options(){return h},get value(){return e(N)},onchange:Ve=>f(N,Ve,!0)})}}),u(pe,re)}})};Q(v,ae=>{e(y)&&ae(q)})}var W=P(v,2);{var de=ae=>{var pe=Uu(),me=K(pe);Pu(me,{get lines(){return e(I)},get searchQuery(){return e(T)},get autoScroll(){return e(m)}});var re=P(me,2),_e=k(re),ye=k(_e);{var Ee=Y=>{var U=zu();u(Y,U)},ge=Y=>{var U=Iu();u(Y,U)},Fe=Y=>{var U=Ou();u(Y,U)};Q(ye,Y=>{e(x)?Y(Ee):e(C)?Y(ge,1):Y(Fe,-1)})}var Ie=P(ye);p(_e);var Qe=P(_e,2);{var Ve=Y=>{Pe(Y,{variant:"secondary",size:"sm",onclick:G,children:(U,te)=>{var le=be(),fe=K(le);{var xe=ue=>{var ze=Hu(),De=K(ze);Te(De,{get icon(){return _a}}),ke(),u(ue,ze)},ve=ue=>{var ze=ju(),De=K(ze);Te(De,{get icon(){return Bo}}),ke(),u(ue,ze)};Q(fe,ue=>{e(x)?ue(xe):ue(ve,-1)})}u(U,le)},$$slots:{default:!0}})},Se=Y=>{var U=Vu();u(Y,U)};Q(Qe,Y=>{e(C)?Y(Ve):Y(Se,-1)})}var $e=P(Qe,2),Oe=k($e);zt(Oe,{get checked(){return e(m)},onchange:Y=>f(m,Y,!0),size:14,label:"Auto-scroll",labelFirst:!0}),p($e),p(re),ee(()=>ne(Ie,` ${e(I).length??""} / ${e(d).length??""}`)),u(ae,pe)},X=ae=>{var pe=Bu();u(ae,pe)};Q(W,ae=>{e(d).length>0?ae(de):ae(X,-1)})}var Z=P(W,2);{var oe=ae=>{var pe=qu(),me=k(pe,!0);p(pe),ee(()=>ne(me,e(g))),u(ae,pe)};Q(Z,ae=>{e(g)&&ae(oe)})}u($,D)},$$slots:{actions:!0,default:!0}}),Ae()}Ge(["change"]);function Wu(t,r=3){var N,T;const a=t.split(` +`),n=[];let s=0,i=0,o=!1;for(const g of a){if(g.startsWith("===")||g.startsWith("---")||g.startsWith("+++"))continue;const c=g.match(/^@@ -(\d+),?\d* \+(\d+),?\d* @@/);if(c){s=parseInt(c[1],10)-1,i=parseInt(c[2],10)-1,o=!0;continue}if(o)if(g.startsWith("-"))s++,n.push({type:"del",leftNum:s,rightNum:null,leftContent:g.slice(1),rightContent:""});else if(g.startsWith("+"))i++,n.push({type:"add",leftNum:null,rightNum:i,leftContent:"",rightContent:g.slice(1)});else{s++,i++;const w=g.startsWith(" ")?g.slice(1):g;n.push({type:"equal",leftNum:s,rightNum:i,leftContent:w,rightContent:w})}}const l=[];let d=0;for(;d=0&&g-A>1&&x.push({kind:"separator",skipped:g-A-1});const c=l[g].type!=="equal",w=c&&!m;x.push({kind:"line",row:l[g],hunkStart:w}),m=c,A=g}if(A=0&&x.push({kind:"separator",skipped:l.length-1-A}),x.length>0&&x[0].kind==="line"){const g=((N=x[0].row)==null?void 0:N.leftNum)??0,c=((T=x[0].row)==null?void 0:T.rightNum)??0,w=Math.max(g,c)-1;w>0&&x.unshift({kind:"separator",skipped:w})}return x}var Xu=S('
      '),Yu=S('
      '),Qu=S(' ',1),Zu=S('No matches'),Ju=S('
      '),ed=S('

      Files are identical.

      '),td=S('
      Loading...
      '),rd=S('
      ');function nd(t,r){Me(r,!0);let a=he(r,"loading",3,!1),n=z(void 0),s=j(()=>Wu(r.diffText)),i=j(()=>{const Y=[];return e(s).forEach((U,te)=>{U.hunkStart&&Y.push(te)}),Y}),o=j(()=>e(i).length>0),l=j(()=>{var U;const Y=new Array(e(s).length).fill(-1);for(let te=0;te{r.diffText!==b&&(b=r.diffText,f(d,-1))});let x=j(()=>{if(!r.search.trim())return[];try{const Y=new RegExp(r.search,"i"),U=[];return e(s).forEach((te,le)=>{te.kind==="line"&&te.row&&(Y.test(te.row.leftContent)||Y.test(te.row.rightContent))&&U.push(le)}),U}catch{return[]}}),A=z(-1),m="";Re(()=>{r.search!==m&&(m=r.search,f(A,e(x).length>0?0:-1,!0))});async function N(Y){var le;f(A,Y,!0),await Pt();const U=e(x)[Y],te=(le=e(h))==null?void 0:le.querySelector(`[data-item-idx="${U}"]`);if(te&&e(h)&&e(y)){const fe=e(h).getBoundingClientRect(),ve=te.getBoundingClientRect().top-fe.top+e(h).scrollTop-e(h).clientHeight/3;_=!0,e(h).scrollTop=ve,e(y).scrollTop=ve,requestAnimationFrame(()=>{_=!1})}}function T(){e(A)>0&&N(e(A)-1)}function g(){e(A)<0&&e(x).length>0?N(0):e(A)$1`)}catch{return te}}function w(Y,U){return Y==="equal"?"":Y==="del"&&U==="left"?"bg-[rgba(214,67,10,0.08)] text-edf-orange-fonce":Y==="del"&&U==="right"?"bg-[rgba(48,122,16,0.08)] text-edf-vert-fonce":Y==="add"&&U==="left"?"bg-edf-gris-clair":Y==="add"&&U==="right"?"bg-[rgba(48,122,16,0.08)] text-edf-vert-fonce":""}function E(Y,U){return Y==="del"&&U==="left"?"rgb(251,237,233)":Y==="del"&&U==="right"?"rgb(238,247,236)":Y==="add"&&U==="left"?"var(--color-edf-gris-clair)":Y==="add"&&U==="right"?"rgb(238,247,236)":"white"}let h=z(void 0),y=z(void 0),C=!1,_=!1;function M(Y){C||_||!e(h)||!e(y)||(C=!0,Y==="left"?(e(y).scrollTop=e(h).scrollTop,e(y).scrollLeft=e(h).scrollLeft):(e(h).scrollTop=e(y).scrollTop,e(h).scrollLeft=e(y).scrollLeft),requestAnimationFrame(()=>{C=!1}))}async function F(Y){var te;f(d,Y,!0),await Pt();const U=(te=e(h))==null?void 0:te.querySelector(`[data-hunk-start="${Y}"]`);if(U&&e(h)&&e(y)){_=!0;const le=e(h).getBoundingClientRect(),xe=U.getBoundingClientRect().top-le.top+e(h).scrollTop-e(h).clientHeight/3;e(h).scrollTop=xe,e(y).scrollTop=xe,requestAnimationFrame(()=>{_=!1})}}function L(){e(d)>0&&F(e(d)-1)}function B(){e(d)<0?F(0):e(d)=0&&f(d,U,!0)}function O(Y){Y.target instanceof HTMLInputElement||(Y.key==="n"&&!Y.shiftKey?(Y.preventDefault(),B()):Y.key==="N"||Y.key==="n"&&Y.shiftKey?(Y.preventDefault(),L()):Y.key==="j"?(Y.preventDefault(),g()):(Y.key==="J"||Y.key==="j"&&Y.shiftKey)&&(Y.preventDefault(),T()))}var V=rd();{const Y=(U,te=ws)=>{var le=be(),fe=K(le);Ye(fe,17,()=>e(s),fn,(xe,ve,ue)=>{const ze=j(()=>e(i).indexOf(ue)),De=j(()=>e(l)[ue]>=0&&e(l)[ue]===e(d)),nt=j(()=>{var lt,Ke;return te()==="left"?(lt=e(ve).row)==null?void 0:lt.leftNum:(Ke=e(ve).row)==null?void 0:Ke.rightNum}),rr=j(()=>{var lt,Ke;return te()==="left"?((lt=e(ve).row)==null?void 0:lt.leftContent)??"":((Ke=e(ve).row)==null?void 0:Ke.rightContent)??""});var xr=be(),Je=K(xr);{var ut=lt=>{var Ke=Xu(),Nt=P(k(Ke),2),Vr=k(Nt);p(Nt),p(Ke),ee(()=>ne(Vr,`... ${e(ve).skipped??""} lines hidden ...`)),u(lt,Ke)},jr=lt=>{var Ke=Yu(),Nt=k(Ke),Vr=k(Nt,!0);p(Nt);var Pn=P(Nt,2);zr(Pn,()=>c(e(rr),e(A)>=0&&e(x)[e(A)]===ue),!0),p(Pn),p(Ke),ee((xt,Mt,yr,Oa,Ha)=>{Ce(Ke,1,`flex w-full ${xt??""} ${Mt??""}`),Ze(Ke,e(De)?"background-color: rgba(16,87,200,0.12); color: rgb(16,87,200);":""),we(Ke,"role",yr),we(Ke,"tabindex",Oa),we(Ke,"data-hunk-start",te()==="left"&&e(ze)>=0?e(ze):void 0),we(Ke,"data-item-idx",te()==="left"?ue:void 0),Ze(Nt,`background: ${Ha??""}; color: ${e(De)?"white":"var(--color-muted)"};`),ne(Vr,e(nt)??"")},[()=>w(e(ve).row.type,te()),()=>e(ve).row.type!=="equal"||e(x).includes(ue)?"cursor-pointer":"",()=>e(ve).row.type!=="equal"||e(x).includes(ue)?"button":void 0,()=>e(ve).row.type!=="equal"||e(x).includes(ue)?0:void 0,()=>e(De)?"rgb(16,87,200)":E(e(ve).row.type,te())]),ce("click",Ke,()=>{var Mt;((Mt=e(ve).row)==null?void 0:Mt.type)!=="equal"&&I(ue);const xt=e(x).indexOf(ue);xt>=0&&f(A,xt,!0)}),ce("keydown",Ke,xt=>{var Mt;if(xt.key==="Enter"||xt.key===" "){xt.preventDefault(),((Mt=e(ve).row)==null?void 0:Mt.type)!=="equal"&&I(ue);const yr=e(x).indexOf(ue);yr>=0&&f(A,yr,!0)}}),u(lt,Ke)};Q(Je,lt=>{e(ve).kind==="separator"?lt(ut):e(ve).row&<(jr,1)})}u(xe,xr)}),u(U,le)};var G=k(V),J=k(G),se=k(J),R=k(se,!0);p(se);var $=P(se,2),H=k($,!0);p($),p(J);var D=P(J,2),v=k(D),q=k(v,!0);p(v);var W=P(v,2),de=k(W,!0);p(W),p(D),p(G);var X=P(G,2),Z=k(X),oe=k(Z);Xe(oe);var ae=P(oe,2);{var pe=U=>{var te=Qu(),le=K(te);{let ue=j(()=>e(A)<=0);Pe(le,{variant:"secondary",size:"sm",onclick:T,get disabled(){return e(ue)},children:(ze,De)=>{ke();var nt=Ue("Prev");u(ze,nt)},$$slots:{default:!0}})}var fe=P(le,2),xe=k(fe);p(fe);var ve=P(fe,2);{let ue=j(()=>e(A)>=e(x).length-1);Pe(ve,{variant:"secondary",size:"sm",onclick:g,get disabled(){return e(ue)},children:(ze,De)=>{ke();var nt=Ue("Next");u(ze,nt)},$$slots:{default:!0}})}ee(()=>ne(xe,`${e(A)>=0?e(A)+1:"–"} / ${e(x).length??""} occurrence${e(x).length!==1?"s":""}`)),u(U,te)},me=j(()=>r.search.trim()&&e(x).length>0),re=U=>{var te=Zu();u(U,te)},_e=j(()=>r.search.trim());Q(ae,U=>{e(me)?U(pe):e(_e)&&U(re,1)})}p(Z);var ye=P(Z,2),Ee=k(ye);{let U=j(()=>e(i).length===0||e(d)<=0);Pe(Ee,{variant:"secondary",size:"sm",onclick:L,get disabled(){return e(U)},children:(te,le)=>{ke();var fe=Ue("Prev");u(te,fe)},$$slots:{default:!0}})}var ge=P(Ee,2),Fe=k(ge);p(ge);var Ie=P(ge,2);{let U=j(()=>e(i).length===0||e(d)>=e(i).length-1);Pe(Ie,{variant:"secondary",size:"sm",onclick:B,get disabled(){return e(U)},children:(te,le)=>{ke();var fe=Ue("Next");u(te,fe)},$$slots:{default:!0}})}p(ye),p(X);var Qe=P(X,2);{var Ve=U=>{var te=Ju(),le=k(te),fe=k(le),xe=k(fe);Y(xe,()=>"left"),p(fe),p(le),rt(le,De=>f(h,De),()=>e(h));var ve=P(le,2),ue=k(ve),ze=k(ue);Y(ze,()=>"right"),p(ue),p(ve),rt(ve,De=>f(y,De),()=>e(y)),p(te),tt("scroll",le,()=>M("left")),tt("scroll",ve,()=>M("right")),u(U,te)},Se=U=>{var te=ed();u(U,te)};Q(Qe,U=>{e(o)?U(Ve):U(Se,-1)})}var $e=P(Qe,2);{var Oe=U=>{var te=td();u(U,te)};Q($e,U=>{a()&&U(Oe)})}p(V),rt(V,U=>f(n,U),()=>e(n)),ee(()=>{ne(R,r.leftLabel),ne(H,r.kind),ne(q,r.rightLabel),ne(de,r.kind),vn(oe,r.search),ne(Fe,`${e(d)>=0?e(d)+1:"–"} / ${e(i).length??""} diff${e(i).length!==1?"s":""}`)}),ce("input",oe,U=>r.onSearchChange(U.target.value)),ce("keydown",oe,U=>{U.key==="Enter"&&(U.preventDefault(),g())})}ce("keydown",V,O),u(t,V),Ae()}Ge(["keydown","click","input"]);var ad=S(" ",1),sd=S('

      Please select two different cases to compare.

      '),od=S('

      Select two cases to compare.

      '),id=S(' '),ld=S('
      Parameter
      '),cd=S('

      All parameters are identical.

      '),ud=S('
      ',1),dd=S('

      '),fd=S('

      Loading...

      '),vd=S(" ",1),gd=S(" ",1);function hd(t,r){Me(r,!0);let a=z(""),n=z(""),s=z(""),i=z(""),o=z(""),l=z(!1),d=z(!1),b=z(""),x=j(()=>r.allCases.map(_=>({value:_,label:_})));const A=[{value:"doe_row.csv",label:"doe_row.csv"}];let m=j(()=>{var _;return((_=St())==null?void 0:_.compare_kinds)??A});Re(()=>{var _;e(m).some(M=>M.value===e(s))||f(s,((_=e(m)[0])==null?void 0:_.value)??"",!0)});let N=z(!1),T=j(()=>e(a)&&e(n)&&e(a)!==e(n));function g(){const _=e(a);f(a,e(n),!0),f(n,_,!0)}async function c(){if(e(T)){f(l,!0),f(b,"");try{const _=await pi({cases:[e(a),e(n)],base:e(a),kind:e(s)});f(o,_,!0),f(d,!0)}catch(_){console.error("Failed to load diff:",_),f(o,""),f(d,!1);const M=_ instanceof Error?_.message:String(_);f(b,M.includes("404")?`File "${e(s)}" not found for one of the selected cases. It may not have been run yet.`:"Failed to load comparison.",!0)}f(l,!1)}}Re(()=>{e(a)&&e(n)&&e(a)!==e(n)&&e(s)?c():e(a)&&e(n)&&e(a)===e(n)&&(f(o,""),f(d,!0))});let w=!1;Re(()=>{r.allCases.length>=2&&!w?(w=!0,f(a,r.allCases[0],!0),f(n,r.allCases[1],!0)):r.allCases.length===1&&!w&&(w=!0,f(a,r.allCases[0],!0))});let E=j(wn),h=j(()=>{if(!e(a)||!e(n)||e(a)===e(n)||e(E).length===0)return[];const _=yn(),M=_.find(L=>L.case_id===e(a)),F=_.find(L=>L.case_id===e(n));return!M&&!F?[]:e(E).map(L=>{var O,V;const B=((O=M==null?void 0:M.doe)==null?void 0:O[L])!=null&&String(M.doe[L])!==""?String(M.doe[L]):"—",I=((V=F==null?void 0:F.doe)==null?void 0:V[L])!=null&&String(F.doe[L])!==""?String(F.doe[L]):"—";return{param:L,left:B,right:I,differs:B!==I}})}),y=j(()=>e(N)?e(h):e(h).filter(_=>_.differs)),C=j(()=>e(h).filter(_=>_.differs).length);Ot(t,{eyebrow:"Compare",title:"Side-by-Side Comparison",wide:!0,children:(_,M)=>{var F=gd(),L=K(F);Xt(L,{children:(G,J)=>{var se=ad(),R=K(se);Ne(R,{text:"First case",children:(D,v)=>{it(D,{class:"w-32.5",get options(){return e(x)},get value(){return e(a)},onchange:q=>f(a,q,!0),placeholder:"Select..."})}});var $=P(R,2);{let D=j(()=>!e(a)&&!e(n));Pe($,{variant:"secondary",size:"sm",onclick:g,get disabled(){return e(D)},children:(v,q)=>{Te(v,{get icon(){return Fo}})},$$slots:{default:!0}})}var H=P($,2);Ne(H,{text:"Second case",children:(D,v)=>{it(D,{class:"w-32.5",get options(){return e(x)},get value(){return e(n)},onchange:q=>f(n,q,!0),placeholder:"Select..."})}}),u(G,se)}});var B=P(L,2);{var I=G=>{var J=sd();u(G,J)},O=G=>{var J=od();u(G,J)},V=G=>{var J=vd(),se=K(J);{var R=W=>{var de=ud(),X=K(de),Z=k(X),oe=k(Z);p(Z);var ae=P(Z,2),pe=k(ae,!0);p(ae),p(X);var me=P(X,2);{var re=ye=>{var Ee=ld(),ge=k(Ee),Fe=k(ge),Ie=k(Fe),Qe=k(Ie),Ve=k(Qe,!0);p(Qe);var Se=P(Qe,2),$e=k(Se,!0);p(Se),p(Ie),p(Fe);var Oe=P(Fe);Ye(Oe,21,()=>e(y),Y=>Y.param,(Y,U)=>{var te=id(),le=k(te),fe=k(le,!0);p(le);var xe=P(le),ve=k(xe,!0);p(xe);var ue=P(xe),ze=k(ue,!0);p(ue),p(te),ee(()=>{Ce(le,1,dt(e(U).differs?"text-edf-orange-fonce bg-[rgba(214,67,10,0.04)]":"")),ne(fe,e(U).left),ne(ve,e(U).param),Ce(ue,1,dt(e(U).differs?"text-edf-vert-fonce bg-[rgba(48,122,16,0.04)]":"")),ne(ze,e(U).right)}),u(Y,te)}),p(Oe),p(ge),p(Ee),ee(()=>{ne(Ve,e(a)),ne($e,e(n))}),u(ye,Ee)},_e=ye=>{var Ee=cd();u(ye,Ee)};Q(me,ye=>{e(y).length>0?ye(re):ye(_e,-1)})}ee(()=>{ne(oe,`${e(C)??""} difference${e(C)!==1?"s":""} out of ${e(h).length??""} + parameters`),ne(pe,e(N)?"Show differences only":"Show all parameters")}),ce("click",ae,()=>f(N,!e(N))),u(W,de)};Q(se,W=>{e(h).length>0&&W(R)})}var $=P(se,2);Xt($,{children:(W,de)=>{Ne(W,{text:"File",children:(X,Z)=>{it(X,{class:"w-37.5",get options(){return e(m)},get value(){return e(s)},onchange:oe=>f(s,oe,!0)})}})}});var H=P($,2);{var D=W=>{var de=dd(),X=k(de,!0);p(de),ee(()=>ne(X,e(b))),u(W,de)},v=W=>{nd(W,{get diffText(){return e(o)},get leftLabel(){return e(a)},get rightLabel(){return e(n)},get kind(){return e(s)},get search(){return e(i)},get loading(){return e(l)},onSearchChange:de=>f(i,de,!0)})},q=W=>{var de=fd();u(W,de)};Q(H,W=>{e(b)?W(D):e(d)?W(v,1):e(l)&&W(q,2)})}u(G,J)};Q(B,G=>{e(a)&&e(n)&&e(a)===e(n)?G(I):!e(a)||!e(n)?G(O,1):G(V,-1)})}u(_,F)},$$slots:{default:!0}}),Ae()}Ge(["click"]);var pd=S(" Refresh",1),md=S(" ",1),_d=S(''),bd=S(''),xd=S(" Download as CSV",1),yd=S('
      ',1),wd=S(" ",1),kd=S(""),Cd=S('
      Sort by:
      '),Sd=S('

      No errors found. Select cases and adjust filters above.

      '),$d=S(' '),Pd=S('NEW'),Ed=S('
      '),Rd=S('
      '),Nd=S(' '),Md=S('
      '),Ad=S('

      '),Td=S("
      ",1);function Ld(t,r){Me(r,!0);const a=6,n=["csauto.stderr","csauto.stdout"];let s=z(ie([])),i=z(ie([...n])),o=!1;Re(()=>{var Z;const X=(Z=St())==null?void 0:Z.error_files;X!=null&&X.length&&!o&&f(i,[...X],!0)});let l=z("all"),d=z(""),b=z(a),x=z(!1),A=z(""),m=z(ie(Jt("errors")));Re(()=>{er("errors",e(m))});let N=z(ie([])),T=z(ie(new Set));function g(X){return X.toLowerCase().replace(/[0-9]+/g,"#").replace(/0x[0-9a-f]+/gi,"#").replace(/\s+/g," ").trim()}function c(X){const Z=X.line_html.replace(/<[^>]*>/g,"").slice(0,120);return`${X.case_id}|${X.file}|${X.severity}|${g(Z)}`}function w(X){const Z=new Map;for(const oe of X){const ae=c(oe),pe=Z.get(ae);pe?pe.count++:Z.set(ae,{...oe,count:1,fingerprint:ae,isNew:!e(T).has(ae)})}return Array.from(Z.values())}async function E(){if(!(!e(s).length||!e(i).length)){f(x,!0);try{const X=await ci({cases:e(s),files:e(i),context:e(b),sev:e(l)==="all"?"":e(l),q:e(d)});f(A,"");const Z=w(X.items);f(N,X.items,!0);const oe=new Set(Z.map(ae=>ae.fingerprint));f(T,oe,!0),f(h,Z,!0)}catch(X){f(A,"Failed to load errors"),console.error("Failed to load errors:",X)}finally{f(x,!1)}}}let h=z(ie([])),y=null;function C(){y&&clearTimeout(y),y=setTimeout(E,250)}function _(X){return X==="error"?"error-sev-error":X==="warn"?"error-sev-warn":"error-sev-info"}let M=j(()=>Cn(r.allCases)),F=j(()=>{var X;return(((X=St())==null?void 0:X.error_files)??n).map(Z=>({value:Z,label:Z}))}),L=[{value:"all",label:"All"},{value:"error",label:"Error"},{value:"warn",label:"Warn"},{value:"info",label:"Info"}];function B(X){if(f(s,X,!0),X.length===0){f(h,[],!0),f(N,[],!0);return}E()}function I(X){if(o=!0,f(i,X,!0),X.length===0){f(h,[],!0),f(N,[],!0);return}E()}function O(X){f(l,X,!0),E()}function V(){E()}let G=!1;Re(()=>{r.allCases.length>0&&!G&&(G=!0,f(s,[...r.allCases],!0),E())}),Re(()=>{e(m)?pr("errors",E,Vn()):vt("errors")});const J=mr(()=>{G&&E()});fr(()=>{vt("errors"),J()});let se=z(ie(new Set));function R(X){const Z=new Set(e(se));Z.has(X)?Z.delete(X):Z.add(X),f(se,Z,!0)}let $=z("severity"),H=z("desc");const D={info:0,warn:1,error:2};let v=j(()=>{const X=[...e(h)];return X.sort((Z,oe)=>{let ae=0;return e($)==="severity"?ae=(D[Z.severity]??9)-(D[oe.severity]??9):e($)==="count"?ae=Z.count-oe.count:ae=Z[e($)].localeCompare(oe[e($)]),e(H)==="asc"?ae:-ae}),X});const q={severity:"desc",count:"desc",case_id:"asc",file:"asc"};function W(X){e($)===X?f(H,e(H)==="asc"?"desc":"asc",!0):(f($,X,!0),f(H,q[X],!0))}function de(){if(!e(h).length)return;const X=["case_id","file","severity","count","is_new","line_text"],Z=e(v).map(pe=>[pe.case_id,pe.file,pe.severity,pe.count,pe.isNew?"yes":"no",`"${pe.line_html.replace(/<[^>]*>/g,"").replace(/"/g,'""')}"`].join(",")),oe=[X.join(","),...Z].join(` +`),ae=br("errors",e(s),"csv");Ea(oe,ae)}Ot(t,{eyebrow:"Diagnostics",title:"Recent Errors",wide:!0,actions:Z=>{var oe=md(),ae=K(oe);{let re=j(Vn);tr(ae,{name:"errors",get intervalMs(){return e(re)},onRefresh:E,get checked(){return e(m)},set checked(_e){f(m,_e,!0)}})}var pe=P(ae,2);{var me=re=>{Pe(re,{variant:"primary",onclick:E,children:(_e,ye)=>{var Ee=pd(),ge=K(Ee);Te(ge,{get icon(){return Zt}}),ke(),u(_e,Ee)},$$slots:{default:!0}})};Q(pe,re=>{e(m)||re(me)})}u(Z,oe)},children:(Z,oe)=>{var ae=Td(),pe=K(ae);Xt(pe,{children:(Se,$e)=>{var Oe=yd(),Y=K(Oe);Ne(Y,{text:"Cases",children:(ue,ze)=>{qt(ue,{class:"w-[160px]",get options(){return e(M)},get selected(){return e(s)},onchange:B,placeholder:"Select cases..."})}});var U=P(Y,2);Ne(U,{text:"Files",children:(ue,ze)=>{qt(ue,{class:"w-[160px]",get options(){return e(F)},get selected(){return e(i)},onchange:I,placeholder:"Select files..."})}});var te=P(U,2);Ne(te,{text:"Severity",children:(ue,ze)=>{it(ue,{class:"w-[90px]",get options(){return L},get value(){return e(l)},onchange:O})}});var le=P(te,2);Ne(le,{text:"Search",children:(ue,ze)=>{var De=_d();Xe(De),ce("input",De,C),et(De,()=>e(d),nt=>f(d,nt)),u(ue,De)}});var fe=P(le,2);Ne(fe,{text:"Context",children:(ue,ze)=>{var De=bd();Xe(De),ce("change",De,V),et(De,()=>e(b),nt=>f(b,nt)),u(ue,De)}});var xe=P(fe,2),ve=k(xe);{let ue=j(()=>e(h).length===0);Pe(ve,{variant:"secondary",size:"sm",onclick:de,get disabled(){return e(ue)},children:(ze,De)=>{var nt=xd(),rr=K(nt);Te(rr,{get icon(){return hr}}),ke(),u(ze,nt)},$$slots:{default:!0}})}p(xe),u(Se,Oe)}});var me=P(pe,2);{var re=Se=>{var $e=Cd(),Oe=P(k($e),2);Ye(Oe,16,()=>[{key:"severity",label:"Severity"},{key:"count",label:"Count"},{key:"case_id",label:"Case"},{key:"file",label:"File"}],Y=>Y.key,(Y,U)=>{var te=kd(),le=k(te,!0),fe=P(le);{var xe=ve=>{var ue=wd(),ze=P(K(ue));{let De=j(()=>e(H)==="asc"?Do:Lo);Te(ze,{get icon(){return e(De)},size:12})}u(ve,ue)};Q(fe,ve=>{e($)===U.key&&ve(xe)})}p(te),ee(()=>{Ce(te,1,`cursor-pointer bg-transparent border-none text-xs hover:underline ${e($)===U.key?"text-edf-bleu-fonce font-bold":"text-muted"}`),ne(le,U.label)}),ce("click",te,()=>W(U.key)),u(Y,te)}),p($e),u(Se,$e)};Q(me,Se=>{e(v).length>0&&Se(re)})}var _e=P(me,2),ye=k(_e);{var Ee=Se=>{var $e=Sd();u(Se,$e)};Q(ye,Se=>{e(v).length===0&&Se(Ee)})}var ge=P(ye,2);Ye(ge,17,()=>e(v),Se=>Se.fingerprint,(Se,$e)=>{var Oe=Rd(),Y=k(Oe),U=k(Y),te=k(U);{let Je=j(()=>e(se).has(e($e).fingerprint)?pn:zo);Te(te,{get icon(){return e(Je)},size:14})}p(U);var le=P(U,2),fe=k(le);p(le);var xe=P(le,2),ve=k(xe);{var ue=Je=>{var ut=$d(),jr=k(ut);p(ut),ee(()=>ne(jr,`${e($e).count??""}x`)),u(Je,ut)};Q(ve,Je=>{e($e).count>1&&Je(ue)})}var ze=P(ve,2);{var De=Je=>{var ut=Pd();u(Je,ut)};Q(ze,Je=>{e($e).isNew&&Je(De)})}p(xe),p(Y);var nt=P(Y,2);{var rr=Je=>{var ut=Ed();zr(ut,()=>e($e).line_html,!0),p(ut),u(Je,ut)},xr=j(()=>e(se).has(e($e).fingerprint));Q(nt,Je=>{e(xr)&&Je(rr)})}p(Oe),ee(Je=>{Ce(Oe,1,`error-item ${Je??""}`),ne(fe,`${e($e).case_id??""} / ${e($e).file??""} : ${e($e).severity??""}`)},[()=>_(e($e).severity)]),ce("click",Y,()=>R(e($e).fingerprint)),u(Se,Oe)}),p(_e);var Fe=P(_e,2);{var Ie=Se=>{var $e=Md(),Oe=k($e),Y=k(Oe);p(Oe);var U=P(Oe,2);{var te=fe=>{var xe=Nd(),ve=k(xe);p(xe),ee(ue=>ne(ve,`${ue??""} new`),[()=>e(h).filter(ue=>ue.isNew).length]),u(fe,xe)},le=j(()=>e(h).some(fe=>fe.isNew));Q(U,fe=>{e(le)&&fe(te)})}p($e),ee(()=>ne(Y,`${e(h).length??""} unique / ${e(N).length??""} total`)),u(Se,$e)};Q(Fe,Se=>{e(v).length>0&&Se(Ie)})}var Qe=P(Fe,2);{var Ve=Se=>{var $e=Ad(),Oe=k($e,!0);p($e),ee(()=>ne(Oe,e(A))),u(Se,$e)};Q(Qe,Se=>{e(A)&&Se(Ve)})}ee(()=>Ce(_e,1,`error-list ${e(x)?"opacity-50 pointer-events-none":""}`)),u(Z,ae)},$$slots:{actions:!0,default:!0}}),Ae()}Ge(["input","change","click"]);var Fd=S('
      Developed by Simvia
      ',1);function Bd(t,r){Me(r,!0);let a=z(ie({totalCases:0,shownCases:0,totalRunning:0,shownRunning:0,totalConverged:0,shownConverged:0})),n=z(ie([])),s=z(null);const i=v=>e(s)===null||e(s).includes(v);async function o(v){var de;const q=`/favicon-${v}.svg`;try{const X=await fetch(q);if(!X.ok||!((de=X.headers.get("content-type"))!=null&&de.includes("svg")))return}catch{return}const W=document.querySelector('link[rel="icon"]');W&&(W.href=q)}async function l(){try{const v=await si();Rl(v.rows),Nl(v.doe_columns),f(n,v.rows.map(q=>q.case_id),!0),f(a,Ul($a(),yn()),!0)}catch(v){console.error("Failed to load status:",v)}}Zn(()=>{l(),oi().then(v=>{rl(v),f(s,v.panels,!0),o(v.solver)}).catch(()=>{})});var d=Fd(),b=K(d);Mi(b,{});var x=P(b,2);Di(x,{});var A=P(x,2);ll(A,{get totalCases(){return e(a).totalCases},get shownCases(){return e(a).shownCases},get totalRunning(){return e(a).totalRunning},get shownRunning(){return e(a).shownRunning},get totalConverged(){return e(a).totalConverged},get shownConverged(){return e(a).shownConverged}});var m=P(A,2),N=k(m);{var T=v=>{xc(v,{onRefresh:l})},g=j(()=>i("status"));Q(N,v=>{e(g)&&v(T)})}var c=P(N,2);{var w=v=>{Vc(v,{get allCases(){return e(n)}})},E=j(()=>i("residuals"));Q(c,v=>{e(E)&&v(w)})}var h=P(c,2);{var y=v=>{fu(v,{get allCases(){return e(n)}})},C=j(()=>i("probes"));Q(h,v=>{e(C)&&v(y)})}var _=P(h,2);{var M=v=>{ku(v,{get allCases(){return e(n)}})},F=j(()=>i("performance"));Q(_,v=>{e(F)&&v(M)})}var L=P(_,2);{var B=v=>{hd(v,{get allCases(){return e(n)}})},I=j(()=>i("compare"));Q(L,v=>{e(I)&&v(B)})}var O=P(L,2);{var V=v=>{Gu(v,{get allCases(){return e(n)}})},G=j(()=>i("tail"));Q(O,v=>{e(G)&&v(V)})}var J=P(O,2);{var se=v=>{Ld(v,{get allCases(){return e(n)}})},R=j(()=>i("errors"));Q(J,v=>{e(R)&&v(se)})}p(m);var $=P(m,2),H=P(k($),2),D=k(H);p(H),p($),ee(()=>we(D,"src",cl)),u(t,d),Ae()}export{Bd as component}; diff --git a/frontend/dist/_app/immutable/nodes/2.DQxkgq4x.js b/frontend/dist/_app/immutable/nodes/2.DQxkgq4x.js deleted file mode 100644 index 763b315..0000000 --- a/frontend/dist/_app/immutable/nodes/2.DQxkgq4x.js +++ /dev/null @@ -1,1190 +0,0 @@ -import{b as Pr,a as u,f as S,c as be,t as Ve,d as Ot}from"../chunks/C14P8jaG.js";import{o as Zn,a as vr}from"../chunks/Cz6m6K8p.js";import{h as De,L as $t,G as Lt,c as Er,J as Kt,b as Jn,o as e,N as ja,ag as Va,O as En,P as zt,f as _t,ay as ea,aF as Ua,ao as Rn,e as mt,a as dr,aM as Ba,s as qa,a5 as Ka,aN as ta,aE as dn,aO as Ga,a7 as Nn,aP as Wa,aQ as Xa,aI as Ya,aR as ht,aS as ra,a1 as Qa,r as na,p as aa,aT as Ur,ae as sa,aU as Za,aV as Ja,aC as es,m as ts,d as Nr,az as oa,y as J,F as ia,aW as rs,aG as ns,aA as as,D as la,aX as ca,aY as ss,aZ as os,E as is,aw as ua,S as Dr,k as Mr,a_ as da,a$ as ls,b0 as cs,b1 as fa,b2 as us,b3 as ds,b4 as gr,b5 as fs,b6 as vs,b7 as gs,b8 as hs,b9 as ps,ba as ms,bb as _s,aJ as Pt,U as bs,aK as z,_ as ie,$ as f,A as k,B as p,x as Me,g as K,z as Ae,C as $,j as Re,ap as ke,aL as j,bc as xs,q as Vt,bd as ys,be as it,bf as ws}from"../chunks/VJhVTb1A.js";import{p as me,i as Q,b as nt,c as ks,l as Oe,s as Ue}from"../chunks/zf4GFcxs.js";import{i as Cs,a as Ss,d as le,b as Ke,c as $s,n as Ps,e as Es,s as ne,f as tt}from"../chunks/BeON-0X8.js";import{s as ft}from"../chunks/CiUbu-1F.js";import{i as Rs}from"../chunks/DmjnTBOd.js";import{B as Ns}from"../chunks/U5yjBaoU.js";function fn(t,r){return r}function Ms(t,r,a){for(var n=[],s=r.length,i,o=r.length,l=0;l{if(i){if(i.pending.delete(A),i.done.add(A),i.pending.size===0){var m=t.outrogroups;Qr(t,dn(i.done)),m.delete(i),m.size===0&&(t.outrogroups=null)}}else o-=1},!1)}if(o===0){var d=n.length===0&&a!==null;if(d){var b=a,x=b.parentNode;es(x),x.append(b),t.items.clear()}Qr(t,r,!d)}else i={pending:new Set(r),done:new Set},(t.outrogroups??(t.outrogroups=new Set)).add(i)}function Qr(t,r,a=!0){var n;if(t.pending.size>0){n=new Set;for(const o of t.pending.values())for(const l of o)n.add(t.items.get(l).e)}for(var s=0;s{var h=a();return ta(h)?h:h==null?[]:dn(h)}),m,N=new Map,L=!0;function g(h){(P.effect.f&Qa)===0&&(P.pending.delete(h),P.fallback=x,As(P,m,o,r,n),x!==null&&(m.length===0?(x.f&ht)===0?na(x):(x.f^=ht,lr(x,null,o)):aa(x,()=>{x=null})))}function c(h){P.pending.delete(h)}var w=Jn(()=>{m=e(A);var h=m.length;let y=!1;if(De){var C=ja(o)===Va;C!==(h===0)&&(o=En(),$t(o),zt(!1),y=!0)}for(var _=new Set,M=mt,F=qa(),T=0;Ti(o)):(x=dr(()=>i(Mn??(Mn=Er()))),x.f|=ht)),h>_.size&&Ba(),De&&h>0&&$t(En()),!L)if(N.set(M,_),F){for(const[V,G]of l)_.has(V)||M.skip_effect(G.e);M.oncommit(g),M.ondiscard(c)}else g(M);y&&zt(!0),e(A)}),P={effect:w,items:l,pending:N,outrogroups:null,fallback:x};L=!1,De&&(o=_t)}function ar(t){for(;t!==null&&(t.f&Za)===0;)t=t.next;return t}function As(t,r,a,n,s){var q,I,O,V,G,Z,ae,E,R;var i=(n&Ja)!==0,o=r.length,l=t.items,d=ar(t.effect.first),b,x=null,A,m=[],N=[],L,g,c,w;if(i)for(w=0;w0){var T=(n&ra)!==0&&o===0?a:null;if(i){for(w=0;w{var H,D;if(A!==void 0)for(c of A)(D=(H=c.nodes)==null?void 0:H.a)==null||D.apply()})}function Ls(t,r,a,n,s,i,o,l){var d=(o&Wa)!==0?(o&Xa)===0?Ya(a,!1,!1):Nn(a):null,b=(o&Ga)!==0?Nn(s):null;return{v:d,i:b,e:dr(()=>(i(r,d??a,b??s,l),()=>{t.delete(n)}))}}function lr(t,r,a){if(t.nodes)for(var n=t.nodes.start,s=t.nodes.end,i=r&&(r.f&ht)===0?r.nodes.start:a;n!==null;){var o=oa(n);if(i.before(n),n===s)return;n=o}}function wt(t,r,a){r===null?t.effect.first=a:r.next=a,a===null?t.effect.last=r:a.prev=r}function zr(t,r,a=!1,n=!1,s=!1,i=!1){var o=t,l="";if(a){var d=t;De&&(o=$t(Lt(d)))}J(()=>{var b=ia;if(l===(l=r()??"")){De&&Kt();return}if(a&&!De){b.nodes=null,d.innerHTML=l,l!==""&&Pr(Lt(d),d.lastChild);return}if(b.nodes!==null&&(rs(b.nodes.start,b.nodes.end),b.nodes=null),l!==""){if(De){_t.data;for(var x=Kt(),A=x;x!==null&&(x.nodeType!==ea||x.data!=="");)A=x,x=oa(x);if(x===null)throw ns(),as;Pr(_t,A),o=$t(x);return}var m=n?ca:s?ss:void 0,N=la(n?"svg":s?"math":"template",m);N.innerHTML=l;var L=n||s?N:N.content;if(Pr(Lt(L),L.lastChild),n||s)for(;Lt(L);)o.before(Lt(L));else o.before(L)}})}function He(t,r,a,n,s){var l;De&&Kt();var i=(l=r.$$slots)==null?void 0:l[a],o=!1;i===!0&&(i=r.children,o=!0),i===void 0||i(t,o?()=>n:n)}function Ts(t,r,a,n,s,i){let o=De;De&&Kt();var l=null;De&&_t.nodeType===os&&(l=_t,Kt());var d=De?_t:t,b=new Ns(d,!1);Jn(()=>{const x=r()||null;var A=ca;if(x===null){b.ensure(null,null);return}return b.ensure(x,m=>{if(x){if(l=De?l:la(x,A),Pr(l,l),n){De&&Cs(x)&&l.append(document.createComment(""));var N=De?Lt(l):l.appendChild(Er());De&&(N===null?zt(!1):$t(N)),n(l,N)}ia.nodes.end=l,m.before(l)}De&&$t(m)}),()=>{}},is),ua(()=>{}),o&&(zt(!0),$t(d))}function Fs(t,r,a){Dr(()=>{var n=Mr(()=>r(t,a==null?void 0:a())||{});if(n!=null&&n.destroy)return()=>n.destroy()})}function Ds(t,r){var a=void 0,n;da(()=>{a!==(a=r())&&(n&&(Nr(n),n=null),a&&(n=dr(()=>{Dr(()=>a(t))})))})}function va(t){var r,a,n="";if(typeof t=="string"||typeof t=="number")n+=t;else if(typeof t=="object")if(Array.isArray(t)){var s=t.length;for(r=0;r=0;){var l=o+i;(o===0||An.includes(n[o-1]))&&(l===n.length||An.includes(n[l]))?n=(o===0?"":n.substring(0,o))+n.substring(l+1):o=l}}return n===""?null:n}function Ln(t,r=!1){var a=r?" !important;":";",n="";for(var s of Object.keys(t)){var i=t[s];i!=null&&i!==""&&(n+=" "+s+": "+i+a)}return n}function Br(t){return t[0]!=="-"||t[1]!=="-"?t.toLowerCase():t}function Os(t,r){if(r){var a="",n,s;if(Array.isArray(r)?(n=r[0],s=r[1]):n=r,t){t=String(t).replaceAll(/\s*\/\*.*?\*\/\s*/g,"").trim();var i=!1,o=0,l=!1,d=[];n&&d.push(...Object.keys(n).map(Br)),s&&d.push(...Object.keys(s).map(Br));var b=0,x=-1;const g=t.length;for(var A=0;A{Ar(t,t.__value)});r.observe(t,{childList:!0,subtree:!0,attributes:!0,attributeFilter:["value"]}),ua(()=>{r.disconnect()})}function Hs(t,r,a=r){var n=new WeakSet,s=!0;fa(t,"change",i=>{var o=i?"[selected]":":checked",l;if(t.multiple)l=[].map.call(t.querySelectorAll(o),ur);else{var d=t.querySelector(o)??t.querySelector("option:not([disabled])");l=d&&ur(d)}a(l),t.__value=l,mt!==null&&n.add(mt)}),Dr(()=>{var i=r();if(t===document.activeElement){var o=mt;if(n.has(o))return}if(Ar(t,i,s),s&&i===void 0){var l=t.querySelector(":checked");l!==null&&(i=ur(l),a(i))}t.__value=i,s=!1}),ga(t)}function ur(t){return"__value"in t?t.__value:t.value}const sr=Symbol("class"),or=Symbol("style"),ha=Symbol("is custom element"),pa=Symbol("is html"),js=gr?"link":"LINK",Vs=gr?"input":"INPUT",Us=gr?"option":"OPTION",Bs=gr?"select":"SELECT",qs=gr?"progress":"PROGRESS";function Xe(t){if(De){var r=!1,a=()=>{if(!r){if(r=!0,t.hasAttribute("value")){var n=t.value;we(t,"value",null),t.value=n}if(t.hasAttribute("checked")){var s=t.checked;we(t,"checked",null),t.checked=s}}};t.__on_r=a,sa(a),gs()}}function vn(t,r){var a=gn(t);a.value===(a.value=r??void 0)||t.value===r&&(r!==0||t.nodeName!==qs)||(t.value=r??"")}function Ks(t,r){r?t.hasAttribute("selected")||t.setAttribute("selected",""):t.removeAttribute("selected")}function we(t,r,a,n){var s=gn(t);De&&(s[r]=t.getAttribute(r),r==="src"||r==="srcset"||r==="href"&&t.nodeName===js)||s[r]!==(s[r]=a)&&(r==="loading"&&(t[ms]=a),a==null?t.removeAttribute(r):typeof a!="string"&&ma(t).includes(r)?t[r]=a:t.setAttribute(r,a))}function Gs(t,r,a,n,s=!1,i=!1){if(De&&s&&t.nodeName===Vs){var o=t,l=o.type==="checkbox"?"defaultChecked":"defaultValue";l in a||Xe(o)}var d=gn(t),b=d[ha],x=!d[pa];let A=De&&b;A&&zt(!1);var m=r||{},N=t.nodeName===Us;for(var L in r)L in a||(a[L]=null);a.class?a.class=dt(a.class):a[sr]&&(a.class=null),a[or]&&(a.style??(a.style=null));var g=ma(t);for(const _ in a){let M=a[_];if(N&&_==="value"&&M==null){t.value=t.__value="",m[_]=M;continue}if(_==="class"){var c=t.namespaceURI==="http://www.w3.org/1999/xhtml";Se(t,c,M,n,r==null?void 0:r[sr],a[sr]),m[_]=M,m[sr]=a[sr];continue}if(_==="style"){Ze(t,M,r==null?void 0:r[or],a[or]),m[_]=M,m[or]=a[or];continue}var w=m[_];if(!(M===w&&!(M===void 0&&t.hasAttribute(_)))){m[_]=M;var P=_[0]+_[1];if(P!=="$$")if(P==="on"){const F={},T="$$"+_;let q=_.slice(2);var h=Es(q);if(Ss(q)&&(q=q.slice(0,-7),F.capture=!0),!h&&w){if(M!=null)continue;t.removeEventListener(q,m[T],F),m[T]=null}if(h)le(q,t,M),Ke([q]);else if(M!=null){let I=function(O){m[_].call(this,O)};m[T]=$s(q,t,I,F)}}else if(_==="style")we(t,_,M);else if(_==="autofocus")fs(t,!!M);else if(!b&&(_==="__value"||_==="value"&&M!=null))t.value=t.__value=M;else if(_==="selected"&&N)Ks(t,M);else{var y=_;x||(y=Ps(y));var C=y==="defaultValue"||y==="defaultChecked";if(M==null&&!b&&!C)if(d[_]=null,y==="value"||y==="checked"){let F=t;const T=r===void 0;if(y==="value"){let q=F.defaultValue;F.removeAttribute(y),F.defaultValue=q,F.value=F.__value=T?q:null}else{let q=F.defaultChecked;F.removeAttribute(y),F.defaultChecked=q,F.checked=T?q:!1}}else t.removeAttribute(_);else C||g.includes(y)&&(b||typeof M!="string")?(t[y]=M,y in d&&(d[y]=vs)):typeof M!="function"&&we(t,y,M)}}}return A&&zt(!0),m}function Tn(t,r,a=[],n=[],s=[],i,o=!1,l=!1){us(s,a,n,d=>{var b=void 0,x={},A=t.nodeName===Bs,m=!1;if(da(()=>{var L=r(...d.map(e)),g=Gs(t,b,L,i,o,l);m&&A&&"value"in L&&Ar(t,L.value);for(let w of Object.getOwnPropertySymbols(x))L[w]||Nr(x[w]);for(let w of Object.getOwnPropertySymbols(L)){var c=L[w];w.description===ds&&(!b||c!==b[w])&&(x[w]&&Nr(x[w]),x[w]=dr(()=>Ds(t,()=>c))),g[w]=c}b=g}),A){var N=t;Dr(()=>{Ar(N,b.value,!0),ga(N)})}m=!0})}function gn(t){return t.__attributes??(t.__attributes={[ha]:t.nodeName.includes("-"),[pa]:t.namespaceURI===hs})}var Fn=new Map;function ma(t){var r=t.getAttribute("is")||t.nodeName,a=Fn.get(r);if(a)return a;Fn.set(r,a=[]);for(var n,s=t,i=Element.prototype;i!==s;){n=_s(s);for(var o in n)n[o].set&&a.push(o);s=ps(s)}return a}function et(t,r,a=r){var n=new WeakSet;fa(t,"input",async s=>{var i=s?t.defaultValue:t.value;if(i=Kr(t)?Gr(i):i,a(i),mt!==null&&n.add(mt),await Pt(),i!==(i=r())){var o=t.selectionStart,l=t.selectionEnd,d=t.value.length;if(t.value=i??"",l!==null){var b=t.value.length;o===l&&l===d&&b>d?(t.selectionStart=b,t.selectionEnd=b):(t.selectionStart=o,t.selectionEnd=Math.min(l,b))}}}),(De&&t.defaultValue!==t.value||Mr(r)==null&&t.value)&&(a(Kr(t)?Gr(t.value):t.value),mt!==null&&n.add(mt)),bs(()=>{var s=r();if(t===document.activeElement){var i=mt;if(n.has(i))return}Kr(t)&&s===Gr(t.value)||t.type==="date"&&!s&&!t.value||s!==t.value&&(t.value=s??"")})}function Kr(t){var r=t.type;return r==="number"||r==="range"}function Gr(t){return t===""?null:+t}let xt=z(ie({type:"none",props:{},resolve:null}));function Ws(){return e(xt)}function ot(t=void 0){const{resolve:r}=e(xt);f(xt,{type:"none",props:{},resolve:null},!0),r==null||r(t)}function Xs(t){return new Promise(r=>{f(xt,{type:"run",props:{cases:t},resolve:r},!0)})}function Ys(t){return new Promise(r=>{f(xt,{type:"restart",props:{cases:t},resolve:r},!0)})}function Qs(t){return new Promise(r=>{f(xt,{type:"clean",props:{cases:t},resolve:r},!0)})}function We(t,r="Alert"){return new Promise(a=>{f(xt,{type:"alert",props:{title:r,message:t},resolve:()=>a()},!0)})}function Dn(t,r="Confirm",a="OK",n="primary"){return new Promise(s=>{f(xt,{type:"confirm",props:{title:r,message:t,confirmLabel:a,confirmVariant:n},resolve:s},!0)})}function hn(t,r="",a="Input",n="",s=!1){return new Promise(i=>{f(xt,{type:"prompt",props:{title:a,message:t,value:r,placeholder:n,multiline:s},resolve:i},!0)})}var Zs=S('
      ');function Jt(t,r){function a(i){return document.body.appendChild(i),{destroy(){i.remove()}}}var n=Zs(),s=k(n);ft(s,()=>r.children),p(n),Fs(n,i=>a==null?void 0:a(i)),u(t,n)}var Js=S('
      '),eo=S('
      ');function hr(t,r){Me(r,!0);const a=L=>{var g=eo(),c=k(g),w=k(c),P=k(w),h=k(P,!0);p(P);var y=$(P,2);{var C=T=>{var q=Js(),I=k(q,!0);p(q),J(()=>ne(I,r.subtitle)),u(T,q)};Q(y,T=>{r.subtitle&&T(C)})}p(w);var _=$(w,2);ft(_,()=>r.children);var M=$(_,2),F=k(M);ft(F,()=>r.footer),p(M),p(c),p(g),J(()=>{Se(c,1,`w-[min(${n()??""},96vw)] bg-white border border-border rounded-[10px] p-4.5`),we(c,"aria-labelledby",r.titleId),we(P,"id",r.titleId),ne(h,r.title)}),le("keydown",g,o),le("mousedown",g,d),le("click",g,b),u(L,g)};let n=me(r,"maxWidth",3,"520px"),s=me(r,"portal",3,!1);function i(){r.onCancel?r.onCancel():ot(null)}function o(L){L.key==="Escape"?i():L.key==="Enter"&&r.onConfirm&&r.onConfirm()}let l=!1;function d(L){l=L.target.dataset.backdrop!==void 0}function b(L){const g=L.target.dataset.backdrop!==void 0;l&&g&&i(),l=!1}var x=be(),A=K(x);{var m=L=>{Jt(L,{children:(g,c)=>{a(g)}})},N=L=>{a(L)};Q(A,L=>{s()?L(m):L(N,-1)})}u(t,x),Ae()}Ke(["keydown","mousedown","click"]);var to=S("");function $e(t,r){let a=me(r,"variant",3,"primary"),n=me(r,"size",3,"default"),s=me(r,"disabled",3,!1);const i={default:"h-[34px] rounded-md px-3.5 leading-none text-[13px] tracking-wide",sm:"h-[30px] rounded-md px-2.5 leading-none text-xs"},o={primary:"bg-edf-bleu-moyen text-white border-none hover:bg-[rgb(12,72,170)]",secondary:"bg-white text-ink border border-border hover:bg-edf-gris-clair",run:"bg-edf-vert-fonce text-white border-none hover:bg-[rgb(38,98,12)]",warning:"bg-edf-orange-moyen text-white border-none hover:bg-[rgb(230,118,20)]",danger:"bg-edf-orange-fonce text-white border-none hover:bg-[rgb(180,56,8)]"};var l=to(),d=k(l);ft(d,()=>r.children),p(l),J(()=>{Se(l,1,`inline-flex items-center justify-center gap-1.5 font-bold cursor-pointer transition-colors duration-150 disabled:opacity-40 disabled:pointer-events-none ${i[n()]??""} ${o[a()]??""}`),l.disabled=s()}),le("click",l,function(...b){var x;(x=r.onclick)==null||x.apply(this,b)}),u(t,l)}Ke(["click"]);var ro=S(" ",1),no=S(''),ao=S(''),so=S('
      '),oo=S('

      ',1);function io(t,r){Me(r,!0);let a=me(r,"confirmLabel",3,"OK"),n=me(r,"confirmVariant",3,"primary"),s=me(r,"value",3,""),i=me(r,"placeholder",3,""),o=me(r,"multiline",3,!1);const l=s();let d=z(ie(l)),b=z(void 0),x=z(void 0);Re(()=>{var N;r.mode==="prompt"&&e(b)?(e(b).focus(),"select"in e(b)&&e(b).select()):e(x)&&((N=e(x).querySelector("button"))==null||N.focus())});function A(){r.mode==="prompt"?ot(e(d)):r.mode==="confirm"?ot(!0):ot()}function m(){r.mode==="confirm"?ot(!1):r.mode==="prompt"?ot(null):ot()}{const N=g=>{var c=ro(),w=K(c);{var P=C=>{$e(C,{variant:"secondary",onclick:m,children:(_,M)=>{ke();var F=Ve("Cancel");u(_,F)},$$slots:{default:!0}})};Q(w,C=>{r.mode!=="alert"&&C(P)})}var h=$(w,2),y=k(h);$e(y,{get variant(){return n()},onclick:A,children:(C,_)=>{ke();var M=Ve();J(()=>ne(M,a())),u(C,M)},$$slots:{default:!0}}),p(h),nt(h,C=>f(x,C),()=>e(x)),u(g,c)};let L=j(()=>o()?void 0:A);hr(t,{get title(){return r.title},titleId:"app-dialog-title",get onConfirm(){return e(L)},onCancel:m,footer:N,children:(g,c)=>{var w=oo(),P=K(w),h=k(P,!0);p(P);var y=$(P,2);{var C=_=>{var M=so(),F=k(M);{var T=I=>{var O=no();xs(O),nt(O,V=>f(b,V),()=>e(b)),J(()=>we(O,"placeholder",i())),et(O,()=>e(d),V=>f(d,V)),u(I,O)},q=I=>{var O=ao();Xe(O),nt(O,V=>f(b,V),()=>e(b)),J(()=>we(O,"placeholder",i())),et(O,()=>e(d),V=>f(d,V)),u(I,O)};Q(F,I=>{o()?I(T):I(q,-1)})}p(M),u(_,M)};Q(y,_=>{r.mode==="prompt"&&_(C)})}J(()=>ne(h,r.message)),u(g,w)},$$slots:{footer:!0,default:!0}})}Ae()}var lo=S('');function Ne(t,r){var a=lo(),n=k(a),s=$(n);ft(s,()=>r.children),p(a),J(()=>ne(n,`${r.text??""} `)),u(t,a)}function Ct(t,r){const a=localStorage.getItem(t);if(a===null)return r;const n=Number(a);return Number.isFinite(n)?n:r}function St(t,r){Number.isFinite(r)&&localStorage.setItem(t,String(r))}function co(t,r){return localStorage.getItem(t)??r}function uo(){return{n:Ct("csauto_run_n",1),nt:Ct("csauto_run_nt",1),maxParallel:Ct("csauto_run_max_parallel",0)||null}}function fo(t){St("csauto_run_n",t.n),St("csauto_run_nt",t.nt),t.maxParallel&&St("csauto_run_max_parallel",t.maxParallel)}function vo(){return{n:Ct("csauto_restart_n",1),nt:Ct("csauto_restart_nt",1),maxParallel:Ct("csauto_restart_max_parallel",0)||null,mode:co("csauto_restart_mode","iterations"),value:Ct("csauto_restart_value",100)}}function go(t){St("csauto_restart_n",t.n),St("csauto_restart_nt",t.nt),t.maxParallel&&St("csauto_restart_max_parallel",t.maxParallel),localStorage.setItem("csauto_restart_mode",t.mode),St("csauto_restart_value",t.value)}function ho(){return{keepLast:Ct("csauto_clean_keep_last",1)}}function po(t){St("csauto_clean_keep_last",t.keepLast)}var mo=S(" ",1),_o=S(''),bo=S(''),xo=S(''),yo=S('
      ');function wo(t,r){Me(r,!0);const a=uo(),n=a.maxParallel??(r.cases.length>1?r.cases.length:0);let s=z(ie(a.n)),i=z(ie(a.nt)),o=z(ie(n));async function l(){if(!Number.isFinite(e(s))||e(s)<=0){await We("MPI ranks must be an integer > 0.","Invalid value");return}if(!Number.isFinite(e(i))||e(i)<=0){await We("Threads must be an integer > 0.","Invalid value");return}if(e(o)&&(!Number.isFinite(e(o))||e(o)<=0)){await We("Max parallel must be empty or > 0.","Invalid value");return}const d={n:e(s),nt:e(i),maxParallel:e(o)||null};fo(d),ot(d)}{const d=A=>{var m=mo(),N=K(m);$e(N,{variant:"secondary",onclick:()=>ot(null),children:(g,c)=>{ke();var w=Ve("Cancel");u(g,w)},$$slots:{default:!0}});var L=$(N,2);$e(L,{variant:"run",onclick:l,children:(g,c)=>{ke();var w=Ve("Run");u(g,w)},$$slots:{default:!0}}),u(A,m)};let b=j(()=>r.cases.length),x=j(()=>r.cases.length>1?"s":"");hr(t,{title:"Run Cases",titleId:"run-dialog-title",get subtitle(){return`${e(b)??""} case${e(x)??""} selected`},onConfirm:l,footer:d,children:(A,m)=>{var N=yo(),L=k(N);Ne(L,{text:"MPI Ranks (n)",children:(w,P)=>{var h=_o();Xe(h),et(h,()=>e(s),y=>f(s,y)),u(w,h)}});var g=$(L,2);Ne(g,{text:"OMP Threads (nt)",children:(w,P)=>{var h=bo();Xe(h),et(h,()=>e(i),y=>f(i,y)),u(w,h)}});var c=$(g,2);Ne(c,{text:"Max Parallel",children:(w,P)=>{var h=xo();Xe(h),et(h,()=>e(o),y=>f(o,y)),u(w,h)}}),p(N),u(A,N)},$$slots:{footer:!0,default:!0}})}Ae()}var ko=S(" ",1),Co=S(''),So=S(''),$o=S(''),Po=S(""),Eo=S(''),Ro=S('
      ',1);function No(t,r){Me(r,!0);const a=vo(),n=a.maxParallel??(r.cases.length>1?r.cases.length:0);let s=z(ie(a.n)),i=z(ie(a.nt)),o=z(ie(n)),l=z(ie(a.mode)),d=z(ie(a.value)),b=j(()=>e(l)==="iterations"?"Additional iterations":"Additional physical time"),x=j(()=>e(l)==="iterations"?"1":"any"),A=j(()=>e(l)==="iterations"?"1":"0");async function m(){if(!Number.isFinite(e(s))||e(s)<=0){await We("MPI ranks must be an integer > 0.","Invalid value");return}if(!Number.isFinite(e(i))||e(i)<=0){await We("Threads must be an integer > 0.","Invalid value");return}if(e(o)&&(!Number.isFinite(e(o))||e(o)<=0)){await We("Max parallel must be empty or > 0.","Invalid value");return}if(!Number.isFinite(e(d))||e(d)<=0){await We("Value must be > 0.","Invalid value");return}if(e(l)==="iterations"&&!Number.isInteger(e(d))){await We("Iterations must be an integer.","Invalid value");return}const N={n:e(s),nt:e(i),maxParallel:e(o)||null,restartMode:e(l),restartValue:e(d)};go({n:e(s),nt:e(i),maxParallel:e(o)||null,mode:e(l),value:e(d)}),ot(N)}{const N=c=>{var w=ko(),P=K(w);$e(P,{variant:"secondary",onclick:()=>ot(null),children:(y,C)=>{ke();var _=Ve("Cancel");u(y,_)},$$slots:{default:!0}});var h=$(P,2);$e(h,{variant:"warning",onclick:m,children:(y,C)=>{ke();var _=Ve("Restart");u(y,_)},$$slots:{default:!0}}),u(c,w)};let L=j(()=>r.cases.length),g=j(()=>r.cases.length>1?"s":"");hr(t,{title:"Restart Cases",titleId:"restart-dialog-title",get subtitle(){return`${e(L)??""} case${e(g)??""} selected`},onConfirm:m,footer:N,children:(c,w)=>{var P=Ro(),h=K(P),y=k(h);Ne(y,{text:"MPI Ranks (n)",children:(q,I)=>{var O=Co();Xe(O),et(O,()=>e(s),V=>f(s,V)),u(q,O)}});var C=$(y,2);Ne(C,{text:"OMP Threads (nt)",children:(q,I)=>{var O=So();Xe(O),et(O,()=>e(i),V=>f(i,V)),u(q,O)}});var _=$(C,2);Ne(_,{text:"Max Parallel",children:(q,I)=>{var O=$o();Xe(O),et(O,()=>e(o),V=>f(o,V)),u(q,O)}}),p(h);var M=$(h,2),F=k(M);Ne(F,{text:"Stop criterion",children:(q,I)=>{var O=Po(),V=k(O);V.value=V.__value="iterations";var G=$(V);G.value=G.__value="physical_time",p(O),Hs(O,()=>e(l),Z=>f(l,Z)),u(q,O)}});var T=$(F,2);Ne(T,{get text(){return e(b)},children:(q,I)=>{var O=Eo();Xe(O),J(()=>{we(O,"min",e(A)),we(O,"step",e(x))}),et(O,()=>e(d),V=>f(d,V)),u(q,O)}}),p(M),u(c,P)},$$slots:{footer:!0,default:!0}})}Ae()}function Te(t,r){let a=me(r,"size",3,14);var n=be(),s=K(n);ks(s,()=>r.icon,(i,o)=>{o(i,{get size(){return a()},class:"icon"})}),u(t,n)}/** - * @license lucide-svelte v1.0.1 - ISC - * - * ISC License - * - * Copyright (c) 2026 Lucide Icons and Contributors - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - * - * --- - * - * The following Lucide icons are derived from the Feather project: - * - * airplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out - * - * The MIT License (MIT) (for the icons listed above) - * - * Copyright (c) 2013-present Cole Bemis - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */const Mo={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":2,"stroke-linecap":"round","stroke-linejoin":"round"};/** - * @license lucide-svelte v1.0.1 - ISC - * - * ISC License - * - * Copyright (c) 2026 Lucide Icons and Contributors - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - * - * --- - * - * The following Lucide icons are derived from the Feather project: - * - * airplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out - * - * The MIT License (MIT) (for the icons listed above) - * - * Copyright (c) 2013-present Cole Bemis - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */const Ao=t=>{for(const r in t)if(r.startsWith("aria-")||r==="role"||r==="title")return!0;return!1};/** - * @license lucide-svelte v1.0.1 - ISC - * - * ISC License - * - * Copyright (c) 2026 Lucide Icons and Contributors - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - * - * --- - * - * The following Lucide icons are derived from the Feather project: - * - * airplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out - * - * The MIT License (MIT) (for the icons listed above) - * - * Copyright (c) 2013-present Cole Bemis - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */const zn=(...t)=>t.filter((r,a,n)=>!!r&&r.trim()!==""&&n.indexOf(r)===a).join(" ").trim();var Lo=Ot("");function Be(t,r){const a=Oe(r,["children","$$slots","$$events","$$legacy"]),n=Oe(a,["name","color","size","strokeWidth","absoluteStrokeWidth","iconNode"]);Me(r,!1);let s=me(r,"name",8,void 0),i=me(r,"color",8,"currentColor"),o=me(r,"size",8,24),l=me(r,"strokeWidth",8,2),d=me(r,"absoluteStrokeWidth",8,!1),b=me(r,"iconNode",24,()=>[]);Rs();var x=Lo();Tn(x,(N,L,g)=>({...Mo,...N,...n,width:o(),height:o(),stroke:i(),"stroke-width":L,class:g}),[()=>Ao(n)?void 0:{"aria-hidden":"true"},()=>(Vt(d()),Vt(l()),Vt(o()),Mr(()=>d()?Number(l())*24/Number(o()):l())),()=>(Vt(zn),Vt(s()),Vt(a),Mr(()=>zn("lucide-icon","lucide",s()?`lucide-${s()}`:"",a.class)))]);var A=k(x);Ye(A,1,b,fn,(N,L)=>{var g=j(()=>ys(e(L),2));let c=()=>e(g)[0],w=()=>e(g)[1];var P=be(),h=K(P);Ts(h,c,!0,(y,C)=>{Tn(y,()=>({...w()}))}),u(N,P)});var m=$(A);He(m,r,"default",{}),p(x),u(t,x),Ae()}function To(t,r){const a=Oe(r,["children","$$slots","$$events","$$legacy"]);/** - * @license lucide-svelte v1.0.1 - ISC - * - * ISC License - * - * Copyright (c) 2026 Lucide Icons and Contributors - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - * - * --- - * - * The following Lucide icons are derived from the Feather project: - * - * airplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out - * - * The MIT License (MIT) (for the icons listed above) - * - * Copyright (c) 2013-present Cole Bemis - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */const n=[["path",{d:"M12 5v14"}],["path",{d:"m19 12-7 7-7-7"}]];Be(t,Ue({name:"arrow-down"},()=>a,{get iconNode(){return n},children:(s,i)=>{var o=be(),l=K(o);He(l,r,"default",{}),u(s,o)},$$slots:{default:!0}}))}function Fo(t,r){const a=Oe(r,["children","$$slots","$$events","$$legacy"]);/** - * @license lucide-svelte v1.0.1 - ISC - * - * ISC License - * - * Copyright (c) 2026 Lucide Icons and Contributors - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - * - * --- - * - * The following Lucide icons are derived from the Feather project: - * - * airplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out - * - * The MIT License (MIT) (for the icons listed above) - * - * Copyright (c) 2013-present Cole Bemis - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */const n=[["path",{d:"M8 3 4 7l4 4"}],["path",{d:"M4 7h16"}],["path",{d:"m16 21 4-4-4-4"}],["path",{d:"M20 17H4"}]];Be(t,Ue({name:"arrow-left-right"},()=>a,{get iconNode(){return n},children:(s,i)=>{var o=be(),l=K(o);He(l,r,"default",{}),u(s,o)},$$slots:{default:!0}}))}function Do(t,r){const a=Oe(r,["children","$$slots","$$events","$$legacy"]);/** - * @license lucide-svelte v1.0.1 - ISC - * - * ISC License - * - * Copyright (c) 2026 Lucide Icons and Contributors - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - * - * --- - * - * The following Lucide icons are derived from the Feather project: - * - * airplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out - * - * The MIT License (MIT) (for the icons listed above) - * - * Copyright (c) 2013-present Cole Bemis - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */const n=[["path",{d:"m5 12 7-7 7 7"}],["path",{d:"M12 19V5"}]];Be(t,Ue({name:"arrow-up"},()=>a,{get iconNode(){return n},children:(s,i)=>{var o=be(),l=K(o);He(l,r,"default",{}),u(s,o)},$$slots:{default:!0}}))}function pn(t,r){const a=Oe(r,["children","$$slots","$$events","$$legacy"]);/** - * @license lucide-svelte v1.0.1 - ISC - * - * ISC License - * - * Copyright (c) 2026 Lucide Icons and Contributors - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - * - * --- - * - * The following Lucide icons are derived from the Feather project: - * - * airplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out - * - * The MIT License (MIT) (for the icons listed above) - * - * Copyright (c) 2013-present Cole Bemis - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */const n=[["path",{d:"m6 9 6 6 6-6"}]];Be(t,Ue({name:"chevron-down"},()=>a,{get iconNode(){return n},children:(s,i)=>{var o=be(),l=K(o);He(l,r,"default",{}),u(s,o)},$$slots:{default:!0}}))}function zo(t,r){const a=Oe(r,["children","$$slots","$$events","$$legacy"]);/** - * @license lucide-svelte v1.0.1 - ISC - * - * ISC License - * - * Copyright (c) 2026 Lucide Icons and Contributors - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - * - * --- - * - * The following Lucide icons are derived from the Feather project: - * - * airplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out - * - * The MIT License (MIT) (for the icons listed above) - * - * Copyright (c) 2013-present Cole Bemis - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */const n=[["path",{d:"m9 18 6-6-6-6"}]];Be(t,Ue({name:"chevron-right"},()=>a,{get iconNode(){return n},children:(s,i)=>{var o=be(),l=K(o);He(l,r,"default",{}),u(s,o)},$$slots:{default:!0}}))}function Io(t,r){const a=Oe(r,["children","$$slots","$$events","$$legacy"]);/** - * @license lucide-svelte v1.0.1 - ISC - * - * ISC License - * - * Copyright (c) 2026 Lucide Icons and Contributors - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - * - * --- - * - * The following Lucide icons are derived from the Feather project: - * - * airplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out - * - * The MIT License (MIT) (for the icons listed above) - * - * Copyright (c) 2013-present Cole Bemis - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */const n=[["circle",{cx:"12",cy:"12",r:"10"}],["rect",{x:"9",y:"9",width:"6",height:"6",rx:"1"}]];Be(t,Ue({name:"circle-stop"},()=>a,{get iconNode(){return n},children:(s,i)=>{var o=be(),l=K(o);He(l,r,"default",{}),u(s,o)},$$slots:{default:!0}}))}function Oo(t,r){const a=Oe(r,["children","$$slots","$$events","$$legacy"]);/** - * @license lucide-svelte v1.0.1 - ISC - * - * ISC License - * - * Copyright (c) 2026 Lucide Icons and Contributors - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - * - * --- - * - * The following Lucide icons are derived from the Feather project: - * - * airplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out - * - * The MIT License (MIT) (for the icons listed above) - * - * Copyright (c) 2013-present Cole Bemis - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */const n=[["circle",{cx:"12",cy:"12",r:"10"}],["path",{d:"m15 9-6 6"}],["path",{d:"m9 9 6 6"}]];Be(t,Ue({name:"circle-x"},()=>a,{get iconNode(){return n},children:(s,i)=>{var o=be(),l=K(o);He(l,r,"default",{}),u(s,o)},$$slots:{default:!0}}))}function pr(t,r){const a=Oe(r,["children","$$slots","$$events","$$legacy"]);/** - * @license lucide-svelte v1.0.1 - ISC - * - * ISC License - * - * Copyright (c) 2026 Lucide Icons and Contributors - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - * - * --- - * - * The following Lucide icons are derived from the Feather project: - * - * airplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out - * - * The MIT License (MIT) (for the icons listed above) - * - * Copyright (c) 2013-present Cole Bemis - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */const n=[["path",{d:"M12 15V3"}],["path",{d:"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"}],["path",{d:"m7 10 5 5 5-5"}]];Be(t,Ue({name:"download"},()=>a,{get iconNode(){return n},children:(s,i)=>{var o=be(),l=K(o);He(l,r,"default",{}),u(s,o)},$$slots:{default:!0}}))}function Ho(t,r){const a=Oe(r,["children","$$slots","$$events","$$legacy"]);/** - * @license lucide-svelte v1.0.1 - ISC - * - * ISC License - * - * Copyright (c) 2026 Lucide Icons and Contributors - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - * - * --- - * - * The following Lucide icons are derived from the Feather project: - * - * airplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out - * - * The MIT License (MIT) (for the icons listed above) - * - * Copyright (c) 2013-present Cole Bemis - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */const n=[["path",{d:"M7 16.3c2.2 0 4-1.83 4-4.05 0-1.16-.57-2.26-1.71-3.19S7.29 6.75 7 5.3c-.29 1.45-1.14 2.84-2.29 3.76S3 11.1 3 12.25c0 2.22 1.8 4.05 4 4.05z"}],["path",{d:"M12.56 6.6A10.97 10.97 0 0 0 14 3.02c.5 2.5 2 4.9 4 6.5s3 3.5 3 5.5a6.98 6.98 0 0 1-11.91 4.97"}]];Be(t,Ue({name:"droplets"},()=>a,{get iconNode(){return n},children:(s,i)=>{var o=be(),l=K(o);He(l,r,"default",{}),u(s,o)},$$slots:{default:!0}}))}function jo(t,r){const a=Oe(r,["children","$$slots","$$events","$$legacy"]);/** - * @license lucide-svelte v1.0.1 - ISC - * - * ISC License - * - * Copyright (c) 2026 Lucide Icons and Contributors - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - * - * --- - * - * The following Lucide icons are derived from the Feather project: - * - * airplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out - * - * The MIT License (MIT) (for the icons listed above) - * - * Copyright (c) 2013-present Cole Bemis - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */const n=[["circle",{cx:"12",cy:"12",r:"1"}],["circle",{cx:"19",cy:"12",r:"1"}],["circle",{cx:"5",cy:"12",r:"1"}]];Be(t,Ue({name:"ellipsis"},()=>a,{get iconNode(){return n},children:(s,i)=>{var o=be(),l=K(o);He(l,r,"default",{}),u(s,o)},$$slots:{default:!0}}))}function Vo(t,r){const a=Oe(r,["children","$$slots","$$events","$$legacy"]);/** - * @license lucide-svelte v1.0.1 - ISC - * - * ISC License - * - * Copyright (c) 2026 Lucide Icons and Contributors - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - * - * --- - * - * The following Lucide icons are derived from the Feather project: - * - * airplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out - * - * The MIT License (MIT) (for the icons listed above) - * - * Copyright (c) 2013-present Cole Bemis - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */const n=[["path",{d:"M15 3h6v6"}],["path",{d:"M10 14 21 3"}],["path",{d:"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"}]];Be(t,Ue({name:"external-link"},()=>a,{get iconNode(){return n},children:(s,i)=>{var o=be(),l=K(o);He(l,r,"default",{}),u(s,o)},$$slots:{default:!0}}))}function Uo(t,r){const a=Oe(r,["children","$$slots","$$events","$$legacy"]);/** - * @license lucide-svelte v1.0.1 - ISC - * - * ISC License - * - * Copyright (c) 2026 Lucide Icons and Contributors - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - * - * --- - * - * The following Lucide icons are derived from the Feather project: - * - * airplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out - * - * The MIT License (MIT) (for the icons listed above) - * - * Copyright (c) 2013-present Cole Bemis - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */const n=[["path",{d:"M12 6a2 2 0 0 1 3.414-1.414l6 6a2 2 0 0 1 0 2.828l-6 6A2 2 0 0 1 12 18z"}],["path",{d:"M2 6a2 2 0 0 1 3.414-1.414l6 6a2 2 0 0 1 0 2.828l-6 6A2 2 0 0 1 2 18z"}]];Be(t,Ue({name:"fast-forward"},()=>a,{get iconNode(){return n},children:(s,i)=>{var o=be(),l=K(o);He(l,r,"default",{}),u(s,o)},$$slots:{default:!0}}))}function Bo(t,r){const a=Oe(r,["children","$$slots","$$events","$$legacy"]);/** - * @license lucide-svelte v1.0.1 - ISC - * - * ISC License - * - * Copyright (c) 2026 Lucide Icons and Contributors - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - * - * --- - * - * The following Lucide icons are derived from the Feather project: - * - * airplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out - * - * The MIT License (MIT) (for the icons listed above) - * - * Copyright (c) 2013-present Cole Bemis - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */const n=[["rect",{x:"14",y:"3",width:"5",height:"18",rx:"1"}],["rect",{x:"5",y:"3",width:"5",height:"18",rx:"1"}]];Be(t,Ue({name:"pause"},()=>a,{get iconNode(){return n},children:(s,i)=>{var o=be(),l=K(o);He(l,r,"default",{}),u(s,o)},$$slots:{default:!0}}))}function qo(t,r){const a=Oe(r,["children","$$slots","$$events","$$legacy"]);/** - * @license lucide-svelte v1.0.1 - ISC - * - * ISC License - * - * Copyright (c) 2026 Lucide Icons and Contributors - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - * - * --- - * - * The following Lucide icons are derived from the Feather project: - * - * airplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out - * - * The MIT License (MIT) (for the icons listed above) - * - * Copyright (c) 2013-present Cole Bemis - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */const n=[["path",{d:"M13 21h8"}],["path",{d:"M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z"}]];Be(t,Ue({name:"pen-line"},()=>a,{get iconNode(){return n},children:(s,i)=>{var o=be(),l=K(o);He(l,r,"default",{}),u(s,o)},$$slots:{default:!0}}))}function Ko(t,r){const a=Oe(r,["children","$$slots","$$events","$$legacy"]);/** - * @license lucide-svelte v1.0.1 - ISC - * - * ISC License - * - * Copyright (c) 2026 Lucide Icons and Contributors - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - * - * --- - * - * The following Lucide icons are derived from the Feather project: - * - * airplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out - * - * The MIT License (MIT) (for the icons listed above) - * - * Copyright (c) 2013-present Cole Bemis - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */const n=[["path",{d:"M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z"}],["path",{d:"m15 5 4 4"}]];Be(t,Ue({name:"pencil"},()=>a,{get iconNode(){return n},children:(s,i)=>{var o=be(),l=K(o);He(l,r,"default",{}),u(s,o)},$$slots:{default:!0}}))}function _a(t,r){const a=Oe(r,["children","$$slots","$$events","$$legacy"]);/** - * @license lucide-svelte v1.0.1 - ISC - * - * ISC License - * - * Copyright (c) 2026 Lucide Icons and Contributors - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - * - * --- - * - * The following Lucide icons are derived from the Feather project: - * - * airplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out - * - * The MIT License (MIT) (for the icons listed above) - * - * Copyright (c) 2013-present Cole Bemis - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */const n=[["path",{d:"M5 5a2 2 0 0 1 3.008-1.728l11.997 6.998a2 2 0 0 1 .003 3.458l-12 7A2 2 0 0 1 5 19z"}]];Be(t,Ue({name:"play"},()=>a,{get iconNode(){return n},children:(s,i)=>{var o=be(),l=K(o);He(l,r,"default",{}),u(s,o)},$$slots:{default:!0}}))}function Go(t,r){const a=Oe(r,["children","$$slots","$$events","$$legacy"]);/** - * @license lucide-svelte v1.0.1 - ISC - * - * ISC License - * - * Copyright (c) 2026 Lucide Icons and Contributors - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - * - * --- - * - * The following Lucide icons are derived from the Feather project: - * - * airplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out - * - * The MIT License (MIT) (for the icons listed above) - * - * Copyright (c) 2013-present Cole Bemis - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */const n=[["path",{d:"M5 12h14"}],["path",{d:"M12 5v14"}]];Be(t,Ue({name:"plus"},()=>a,{get iconNode(){return n},children:(s,i)=>{var o=be(),l=K(o);He(l,r,"default",{}),u(s,o)},$$slots:{default:!0}}))}function er(t,r){const a=Oe(r,["children","$$slots","$$events","$$legacy"]);/** - * @license lucide-svelte v1.0.1 - ISC - * - * ISC License - * - * Copyright (c) 2026 Lucide Icons and Contributors - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - * - * --- - * - * The following Lucide icons are derived from the Feather project: - * - * airplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out - * - * The MIT License (MIT) (for the icons listed above) - * - * Copyright (c) 2013-present Cole Bemis - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */const n=[["path",{d:"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8"}],["path",{d:"M21 3v5h-5"}],["path",{d:"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16"}],["path",{d:"M8 16H3v5"}]];Be(t,Ue({name:"refresh-cw"},()=>a,{get iconNode(){return n},children:(s,i)=>{var o=be(),l=K(o);He(l,r,"default",{}),u(s,o)},$$slots:{default:!0}}))}function Wo(t,r){const a=Oe(r,["children","$$slots","$$events","$$legacy"]);/** - * @license lucide-svelte v1.0.1 - ISC - * - * ISC License - * - * Copyright (c) 2026 Lucide Icons and Contributors - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - * - * --- - * - * The following Lucide icons are derived from the Feather project: - * - * airplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out - * - * The MIT License (MIT) (for the icons listed above) - * - * Copyright (c) 2013-present Cole Bemis - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */const n=[["path",{d:"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8"}],["path",{d:"M3 3v5h5"}]];Be(t,Ue({name:"rotate-ccw"},()=>a,{get iconNode(){return n},children:(s,i)=>{var o=be(),l=K(o);He(l,r,"default",{}),u(s,o)},$$slots:{default:!0}}))}function Xo(t,r){const a=Oe(r,["children","$$slots","$$events","$$legacy"]);/** - * @license lucide-svelte v1.0.1 - ISC - * - * ISC License - * - * Copyright (c) 2026 Lucide Icons and Contributors - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - * - * --- - * - * The following Lucide icons are derived from the Feather project: - * - * airplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out - * - * The MIT License (MIT) (for the icons listed above) - * - * Copyright (c) 2013-present Cole Bemis - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */const n=[["path",{d:"M15.2 3a2 2 0 0 1 1.4.6l3.8 3.8a2 2 0 0 1 .6 1.4V19a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2z"}],["path",{d:"M17 21v-7a1 1 0 0 0-1-1H8a1 1 0 0 0-1 1v7"}],["path",{d:"M7 3v4a1 1 0 0 0 1 1h7"}]];Be(t,Ue({name:"save"},()=>a,{get iconNode(){return n},children:(s,i)=>{var o=be(),l=K(o);He(l,r,"default",{}),u(s,o)},$$slots:{default:!0}}))}function Yo(t,r){const a=Oe(r,["children","$$slots","$$events","$$legacy"]);/** - * @license lucide-svelte v1.0.1 - ISC - * - * ISC License - * - * Copyright (c) 2026 Lucide Icons and Contributors - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - * - * --- - * - * The following Lucide icons are derived from the Feather project: - * - * airplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out - * - * The MIT License (MIT) (for the icons listed above) - * - * Copyright (c) 2013-present Cole Bemis - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */const n=[["path",{d:"M9.671 4.136a2.34 2.34 0 0 1 4.659 0 2.34 2.34 0 0 0 3.319 1.915 2.34 2.34 0 0 1 2.33 4.033 2.34 2.34 0 0 0 0 3.831 2.34 2.34 0 0 1-2.33 4.033 2.34 2.34 0 0 0-3.319 1.915 2.34 2.34 0 0 1-4.659 0 2.34 2.34 0 0 0-3.32-1.915 2.34 2.34 0 0 1-2.33-4.033 2.34 2.34 0 0 0 0-3.831A2.34 2.34 0 0 1 6.35 6.051a2.34 2.34 0 0 0 3.319-1.915"}],["circle",{cx:"12",cy:"12",r:"3"}]];Be(t,Ue({name:"settings"},()=>a,{get iconNode(){return n},children:(s,i)=>{var o=be(),l=K(o);He(l,r,"default",{}),u(s,o)},$$slots:{default:!0}}))}function Qo(t,r){const a=Oe(r,["children","$$slots","$$events","$$legacy"]);/** - * @license lucide-svelte v1.0.1 - ISC - * - * ISC License - * - * Copyright (c) 2026 Lucide Icons and Contributors - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - * - * --- - * - * The following Lucide icons are derived from the Feather project: - * - * airplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out - * - * The MIT License (MIT) (for the icons listed above) - * - * Copyright (c) 2013-present Cole Bemis - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */const n=[["path",{d:"M10 11v6"}],["path",{d:"M14 11v6"}],["path",{d:"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6"}],["path",{d:"M3 6h18"}],["path",{d:"M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2"}]];Be(t,Ue({name:"trash-2"},()=>a,{get iconNode(){return n},children:(s,i)=>{var o=be(),l=K(o);He(l,r,"default",{}),u(s,o)},$$slots:{default:!0}}))}var Zo=S('
    • '),Jo=S('
        '),ei=S('
        ',1);function lt(t,r){Me(r,!0);let a=me(r,"value",3,""),n=me(r,"placeholder",3,"Select..."),s=me(r,"class",3,""),i=me(r,"buttonClass",3,""),o=z(!1),l=z(void 0),d=z(void 0),b=z(""),x=j(()=>{var T;return((T=r.options.find(q=>q.value===a()))==null?void 0:T.label)??n()});function A(T){var q;f(o,!1),(q=r.onchange)==null||q.call(r,T)}function m(){if(!e(l)||!e(d))return;const T=e(l).getBoundingClientRect(),q=e(d).offsetHeight,I=4,O=window.innerHeight-T.bottom-I,G=OO?T.top-I-q:T.bottom+I,Z=Math.min(T.left,window.innerWidth-T.width);f(b,`position:fixed; top:${G}px; left:${Z}px; width:${T.width}px; z-index:9999;`)}async function N(){f(o,!e(o)),e(o)&&(await Pt(),m())}function L(T){T.key==="Escape"&&f(o,!1)}function g(T){e(o)&&e(l)&&!e(l).contains(T.target)&&e(d)&&!e(d).contains(T.target)&&f(o,!1)}var c=ei();tt("mousedown",it,g),tt("keydown",it,L),tt("scroll",it,()=>{e(o)&&f(o,!1)});var w=K(c),P=k(w),h=k(P),y=k(h,!0);p(h);var C=$(h,2),_=k(C);Te(_,{get icon(){return pn},size:14}),p(C),p(P),nt(P,T=>f(l,T),()=>e(l)),p(w);var M=$(w,2);{var F=T=>{Jt(T,{children:(q,I)=>{var O=Jo();Ye(O,21,()=>r.options,V=>V.value,(V,G)=>{var Z=Zo();we(Z,"tabindex",0);var ae=k(Z,!0);p(Z),J(()=>{we(Z,"aria-selected",e(G).value===a()),Se(Z,1,`px-2.5 py-1.5 text-[13px] cursor-pointer transition-colors duration-100 - ${e(G).value===a()?"text-edf-bleu-fonce font-bold bg-[rgba(16,87,200,0.06)]":"text-ink hover:bg-edf-gris-clair"}`),ne(ae,e(G).label)}),le("mousedown",Z,E=>{E.stopPropagation(),A(e(G).value)}),u(V,Z)}),p(O),nt(O,V=>f(d,V),()=>e(d)),J(()=>Ze(O,e(b))),u(q,O)}})};Q(M,T=>{e(o)&&T(F)})}J(()=>{Se(w,1,`relative inline-flex ${s()??""}`),Se(P,1,dt(i()||"flex items-center justify-between gap-1.5 w-full h-[30px] cursor-pointer bg-white border border-border rounded-md text-[13px] text-ink font-normal pl-2.5 pr-2 transition-colors duration-150 hover:bg-edf-gris-clair focus:outline-none focus:border-edf-bleu-moyen")),we(P,"aria-expanded",e(o)),ne(y,e(x)),Se(C,1,`text-muted shrink-0 transition-transform duration-150 ${e(o)?"rotate-180":""}`)}),le("mousedown",P,T=>{T.stopPropagation(),N()}),u(t,c),Ae()}Ke(["mousedown"]);var ti=Ot(''),ri=S('
        '),ni=S('
        '),ai=S('
        ',1);function Gt(t,r){Me(r,!0);let a=me(r,"selected",19,()=>[]),n=me(r,"placeholder",3,"Select..."),s=me(r,"class",3,""),i=z(!1),o=z(void 0),l=z(void 0),d=z(""),b=j(()=>new Set(a())),x=j(()=>a().length===0?n():a().length===r.options.length?`All (${r.options.length})`:a().length<=2?a().map(I=>{var O;return((O=r.options.find(V=>V.value===I))==null?void 0:O.label)??I}).join(", "):`${a().length} selected`);function A(I){var V;const O=new Set(e(b));O.has(I)?O.delete(I):O.add(I),(V=r.onchange)==null||V.call(r,[...O])}function m(){var I;(I=r.onchange)==null||I.call(r,r.options.map(O=>O.value))}function N(){var I;(I=r.onchange)==null||I.call(r,[])}function L(){if(!e(o)||!e(l))return;const I=e(o).getBoundingClientRect(),O=e(l).offsetHeight,V=4,G=window.innerHeight-I.bottom-V,ae=GG?I.top-V-O:I.bottom+V,E=Math.min(I.left,window.innerWidth-I.width);f(d,`position:fixed; top:${ae}px; left:${E}px; min-width:${I.width}px; z-index:9999;`)}async function g(){f(i,!e(i)),e(i)&&(await Pt(),L())}function c(I){e(i)&&e(o)&&!e(o).contains(I.target)&&e(l)&&!e(l).contains(I.target)&&f(i,!1)}function w(I){I.key==="Escape"&&f(i,!1)}var P=ai();tt("mousedown",it,c),tt("keydown",it,w),tt("scroll",it,()=>{e(i)&&f(i,!1)});var h=K(P),y=k(h),C=k(y),_=k(C,!0);p(C);var M=$(C,2),F=k(M);Te(F,{get icon(){return pn},size:14}),p(M),p(y),nt(y,I=>f(o,I),()=>e(o)),p(h);var T=$(h,2);{var q=I=>{Jt(I,{children:(O,V)=>{var G=ni(),Z=k(G),ae=k(Z),E=$(ae,2);p(Z);var R=$(Z,2);Ye(R,17,()=>r.options,H=>H.value,(H,D)=>{var v=ri(),B=k(v),X=k(B);{var ue=se=>{var de=ti();u(se,de)},fe=j(()=>e(b).has(e(D).value));Q(X,se=>{e(fe)&&se(ue)})}p(B);var W=$(B,2),te=k(W,!0);p(W),p(v),J(se=>{Se(B,1,`inline-flex items-center justify-center shrink-0 w-[14px] h-[14px] rounded border-2 transition-colors duration-100 - ${se??""}`),ne(te,e(D).label)},[()=>e(b).has(e(D).value)?"bg-edf-bleu-moyen border-edf-bleu-moyen text-white":"bg-white border-edf-gris-moyen"]),le("mousedown",v,se=>{se.stopPropagation(),A(e(D).value)}),u(H,v)}),p(G),nt(G,H=>f(l,H),()=>e(l)),J(()=>Ze(G,e(d))),le("mousedown",ae,H=>{H.stopPropagation(),m()}),le("mousedown",E,H=>{H.stopPropagation(),N()}),u(O,G)}})};Q(T,I=>{e(i)&&I(q)})}J(()=>{Se(h,1,`relative inline-flex ${s()??""}`),we(y,"aria-expanded",e(i)),ne(_,e(x)),Se(M,1,`text-muted shrink-0 transition-transform duration-150 ${e(i)?"rotate-180":""}`)}),le("mousedown",y,I=>{I.stopPropagation(),g()}),u(t,P),Ae()}Ke(["mousedown"]);const Zr="csauto_token";let ba=z(ie(localStorage.getItem(Zr)??""));function xa(){return e(ba)}function ya(t){f(ba,t,!0),t?localStorage.setItem(Zr,t):localStorage.removeItem(Zr)}let wr=null;async function mn(t,r={}){const a=new Headers(r.headers),n=xa();n&&a.set("X-CSAUTO-TOKEN",n);const s=await fetch(t,{...r,headers:a});if(s.status===401){wr||(wr=hn("API token required:",n,"Authentication"));const i=await wr;return wr=null,i===null?s:(ya(i),a.set("X-CSAUTO-TOKEN",i),fetch(t,{...r,headers:a}))}return s}async function ct(t){const r=await mn(t);if(!r.ok)throw new Error(`GET ${t} failed: ${r.status}`);return r.json()}async function Ir(t){const r=await mn(t);if(!r.ok)throw new Error(`GET ${t} failed: ${r.status}`);return r.text()}async function Rt(t,r){const a=await mn(t,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(r)});if(!a.ok){const n=await a.text().catch(()=>a.statusText);throw new Error(`POST ${t} failed: ${a.status} — ${n}`)}return a.json()}function Or(t){return t.map(r=>`case=${encodeURIComponent(r)}`).join("&")}function si(t=!1){return ct(`/api/status${t?"?log=1":""}`)}function In(t){return ct(`/api/perf?${Or(t)}`)}function oi(){return ct("/api/app_config")}function ii(t){return ct(`/api/residual_columns?${Or(t)}`).then(r=>r.columns??[])}function li(t,r,a={}){const n=new URLSearchParams;return t.forEach(s=>n.append("case",s)),n.set("columns",r.join(",")),a.width&&n.set("width",String(a.width)),a.height&&n.set("height",String(a.height)),a.xMin!==void 0&&n.set("x_min",String(a.xMin)),a.includeHistory&&n.set("include_history","true"),Ir(`/api/residuals_svg?${n}`)}function wa(t){return ct(`/api/restart_origin?${Or(t)}`)}function ci(t){var a;const r=new URLSearchParams;return t.cases.forEach(n=>r.append("case",n)),(a=t.files)!=null&&a.length&&r.set("files",t.files.join(",")),t.maxHits&&r.set("max_hits",String(t.maxHits)),t.context!==void 0&&r.set("context",String(t.context)),t.sev&&r.set("sev",t.sev),t.q&&r.set("q",t.q),ct(`/api/recent_errors?${r}`)}function ui(t,r,a){const n=new URLSearchParams({case:t,file:r,n:String(a)});return Ir(`/api/tail?${n}`)}function di(t){return ct(`/api/resu_files?case=${encodeURIComponent(t)}`).then(r=>r.files??[])}function fi(t){return ct(`/api/resu_dirs?${Or(t)}`).then(r=>r.dirs??[])}function Jr(t,r){const a=new URLSearchParams({scope:r});return t.forEach(n=>a.append("case",n)),ct(`/api/probes?${a}`).then(n=>n.files??[])}function vi(t,r){const a=new URLSearchParams;return t.forEach(n=>a.append("case",n)),r.forEach(n=>a.append("probe",n)),ct(`/api/probe_columns?${a}`).then(n=>n.columns??[])}function gi(t,r,a){const n=new URLSearchParams({case:t,probe:r});return a.forEach(s=>n.append("column",s)),ct(`/api/probe_position?${n}`)}function hi(t){const r=new URLSearchParams;return t.cases.forEach(a=>r.append("case",a)),t.probes.forEach(a=>r.append("probe",a)),r.set("columns",t.columns.join(",")),t.axis&&r.set("axis",t.axis),t.xMin!==void 0&&r.set("x_min",String(t.xMin)),t.timeMin!==void 0&&r.set("time_min",String(t.timeMin)),r.set("include_history","true"),t.width&&r.set("width",String(t.width)),t.height&&r.set("height",String(t.height)),Ir(`/api/probe_svg?${r}`)}function pi(t){const r=new URLSearchParams;return t.cases.forEach(a=>r.append("case",a)),t.base&&r.set("base",t.base),t.kind&&r.set("kind",t.kind),t.filter&&r.set("filter",t.filter),Ir(`/api/compare_runs?${r}`)}function On(t){return Rt("/api/run_case",{cases:t.cases,n:t.n,nt:t.nt,max_parallel:t.maxParallel??void 0,restart:t.restart??!1,restart_mode:t.restartMode??"",restart_value:t.restartValue??void 0}).then(()=>{})}function mi(t){return Rt("/api/kill_case",{cases:t}).then(()=>{})}function kr(t){return Rt("/api/control_case",{cases:t.cases,action:t.action,value:t.value??void 0}).then(()=>{})}function _i(t){return Rt("/api/cleanup_cases",{cases:t.cases,keep_last:t.keepLast??1,prune_resu:t.pruneResu??!0,keep_resu:t.keepResu??[],delete_resu:t.deleteResu??[],max_log_mb:t.maxLogMb??50,clear_cid:!0,clear_pyc:!1})}function bi(t,r){return Rt("/api/case_note",{case:t,note:r}).then(()=>{})}function xi(t,r){return Rt("/api/case_convergence",{case:t,convergence:r}).then(()=>{})}function yi(t){return Rt("/api/open_gui",{case:t}).then(()=>{})}function wi(){return ct("/api/settings/telemetry")}function ki(t){return Rt("/api/settings/telemetry",{enabled:t})}var Ci=S(" ",1),Si=S(''),$i=S('Loading...'),Pi=S('No folders found'),Ei=S('
        '),Ri=S('
        ',1);function Ni(t,r){Me(r,!0);const a=ho();let n=z("keep_latest"),s=z(ie(a.keepLast)),i=z(ie([])),o=z(ie([])),l=z(!0),d=j(()=>e(n)==="keep_folder"||e(n)==="delete_folder");const b=[{value:"keep_latest",label:"Keep latest N"},{value:"delete_all",label:"Delete all RESU"},{value:"keep_folder",label:"Keep specific folders"},{value:"delete_folder",label:"Delete specific folders"}];let x=j(()=>e(i).map(m=>({value:m,label:m})));Zn(async()=>{try{f(i,await fi(r.cases),!0)}catch{f(i,[],!0)}f(l,!1)});async function A(){if(e(d)&&e(o).length===0){await We("Please select at least one RESU folder.","Missing selection");return}const m={action:e(n)};e(n)==="keep_latest"?(m.keepLast=e(s),po({keepLast:e(s)})):e(n)==="delete_all"?m.keepLast=0:e(n)==="keep_folder"?m.keepResu=e(o):e(n)==="delete_folder"&&(m.deleteResu=e(o)),ot(m)}{const m=g=>{var c=Ci(),w=K(c);$e(w,{variant:"secondary",onclick:()=>ot(null),children:(h,y)=>{ke();var C=Ve("Cancel");u(h,C)},$$slots:{default:!0}});var P=$(w,2);$e(P,{variant:"primary",onclick:A,children:(h,y)=>{ke();var C=Ve("Clean");u(h,C)},$$slots:{default:!0}}),u(g,c)};let N=j(()=>r.cases.length),L=j(()=>r.cases.length>1?"s":"");hr(t,{title:"Cleanup Cases",titleId:"clean-dialog-title",get subtitle(){return`${e(N)??""} case${e(L)??""} selected`},footer:m,children:(g,c)=>{var w=Ri(),P=K(w),h=k(P);Ne(h,{text:"Action",children:(F,T)=>{lt(F,{class:"w-[200px]",get options(){return b},get value(){return e(n)},onchange:q=>f(n,q,!0)})}});var y=$(h,2);{var C=F=>{Ne(F,{text:"Keep last",children:(T,q)=>{var I=Si();Xe(I),et(I,()=>e(s),O=>f(s,O)),u(T,I)}})};Q(y,F=>{e(n)==="keep_latest"&&F(C)})}p(P);var _=$(P,2);{var M=F=>{var T=Ei(),q=k(T);Ne(q,{text:"RESU folders",children:(I,O)=>{var V=be(),G=K(V);{var Z=R=>{var H=$i();u(R,H)},ae=R=>{var H=Pi();u(R,H)},E=R=>{Gt(R,{class:"w-full",get options(){return e(x)},get selected(){return e(o)},onchange:H=>f(o,H,!0),placeholder:"Select folders..."})};Q(G,R=>{e(l)?R(Z):e(i).length===0?R(ae,1):R(E,-1)})}u(I,V)}}),p(T),u(F,T)};Q(_,F=>{e(d)&&F(M)})}u(g,w)},$$slots:{footer:!0,default:!0}})}Ae()}function Mi(t,r){Me(r,!0);let a=j(Ws);var n=be(),s=K(n);{var i=b=>{wo(b,{get cases(){return e(a).props.cases}})},o=b=>{No(b,{get cases(){return e(a).props.cases}})},l=b=>{Ni(b,{get cases(){return e(a).props.cases}})},d=b=>{io(b,{get mode(){return e(a).type},get title(){return e(a).props.title},get message(){return e(a).props.message},get confirmLabel(){return e(a).props.confirmLabel},get confirmVariant(){return e(a).props.confirmVariant},get value(){return e(a).props.value},get placeholder(){return e(a).props.placeholder},get multiline(){return e(a).props.multiline}})};Q(s,b=>{e(a).type==="run"?b(i):e(a).type==="restart"?b(o,1):e(a).type==="clean"?b(l,2):(e(a).type==="alert"||e(a).type==="confirm"||e(a).type==="prompt")&&b(d,3)})}u(t,n),Ae()}let fr=z(ie([])),Ai=0;function Li(){return e(fr)}function Cr(t,r="success",a=3500){const n=++Ai;f(fr,[...e(fr),{id:n,message:t,variant:r}],!0),setTimeout(()=>ka(n),a)}function ka(t){f(fr,e(fr).filter(r=>r.id!==t),!0)}var Ti=S('
        '),Fi=S('
        ');function Di(t,r){Me(r,!0);let a=j(Li);Jt(t,{children:(n,s)=>{var i=Fi();Ye(i,21,()=>e(a),o=>o.id,(o,l)=>{var d=Ti(),b=k(d,!0);p(d),J(()=>{Se(d,1,`pointer-events-auto max-w-[320px] px-4 py-2.5 rounded-md shadow-lg text-sm font-semibold text-white cursor-pointer ${e(l).variant==="success"?"bg-edf-vert-fonce":"bg-edf-orange-fonce"}`),ne(b,e(l).message)}),le("click",d,()=>ka(e(l).id)),u(o,d)}),p(i),u(n,i)}}),Ae()}Ke(["click"]);var zi=Ot(''),Ii=Ot(''),Oi=S(''),Hi=S(" ",1),ji=S(" ",1),Vi=S('');function It(t,r){Me(r,!0);const a=g=>{var c=Oi(),w=k(c);{var P=y=>{var C=zi();J(()=>Ze(C,`width: ${o()-4}px; height: ${o()-4}px;`)),u(y,C)},h=y=>{var C=Ii();J(()=>Ze(C,`width: ${o()-4}px; height: ${o()-4}px;`)),u(y,C)};Q(w,y=>{n()&&!s()?y(P):s()&&y(h,1)})}p(c),J(()=>{Se(c,1,`inline-flex items-center justify-center rounded border-2 cursor-pointer transition-colors duration-100 shrink-0 - ${i()?"opacity-40 cursor-not-allowed":""} - ${n()||s()?"bg-edf-bleu-moyen border-edf-bleu-moyen text-white":"bg-white border-edf-gris-moyen hover:border-edf-bleu-clair"}`),Ze(c,`width: ${o()??""}px; height: ${o()??""}px;`),we(c,"aria-checked",s()?"mixed":n()),we(c,"aria-disabled",i()),we(c,"tabindex",i()?-1:0)}),le("click",c,b),le("keydown",c,x),u(g,c)};let n=me(r,"checked",3,!1),s=me(r,"indeterminate",3,!1),i=me(r,"disabled",3,!1),o=me(r,"size",3,16),l=me(r,"label",3,""),d=me(r,"labelFirst",3,!1);function b(g){var w;if(g.stopPropagation(),i())return;const c=s()?!0:!n();(w=r.onchange)==null||w.call(r,c)}function x(g){(g.key===" "||g.key==="Enter")&&(g.preventDefault(),g.stopPropagation(),b(g))}var A=be(),m=K(A);{var N=g=>{var c=Vi(),w=k(c);{var P=y=>{var C=Hi(),_=K(C),M=k(_,!0);p(_);var F=$(_);a(F),J(()=>ne(M,l())),u(y,C)},h=y=>{var C=ji(),_=K(C);a(_);var M=$(_),F=k(M,!0);p(M),J(()=>ne(F,l())),u(y,C)};Q(w,y=>{d()?y(P):y(h,-1)})}p(c),le("click",c,b),le("keydown",c,x),u(g,c)},L=g=>{a(g)};Q(m,g=>{l()?g(N):g(L,-1)})}u(t,A),Ae()}Ke(["click","keydown"]);function _n(t,r){try{const a=localStorage.getItem(t);return a===null?r:JSON.parse(a)}catch{return r}}function Hr(t,r){localStorage.setItem(t,JSON.stringify(r))}const en=new Map;function mr(t,r,a){vt(t),en.set(t,setInterval(r,a))}function vt(t){const r=en.get(t);r!==void 0&&(clearInterval(r),en.delete(t))}const Tt={status:1e3,tail:1e3,plot:3e3,probe:3e3,errors:5e3},Ui=["status","plot","probe","tail","errors"],Wr={status:{label:"Status table",min:500},plot:{label:"Residual plots",min:1e3},probe:{label:"Probe plots",min:1e3},tail:{label:"Log tail",min:500},errors:{label:"Recent errors",min:2e3}},ir=_n("csauto_refresh_rates",{});let bt=z(ie({status:ir.status??Tt.status,tail:ir.tail??Tt.tail,plot:ir.plot??Tt.plot,probe:ir.probe??Tt.probe,errors:ir.errors??Tt.errors}));function Bi(){return e(bt)}function qi(t,r){f(bt,{...e(bt),[t]:r},!0),Hr("csauto_refresh_rates",e(bt))}function Ki(){return e(bt).status}function Hn(){return e(bt).tail}function jn(){return e(bt).plot}function Gi(){return e(bt).probe}function Vn(){return e(bt).errors}const tn=new Set;function _r(t){return tn.add(t),()=>tn.delete(t)}function Wi(){tn.forEach(t=>t())}const rn=_n("csauto_autorefresh_enabled",{});function tr(t){return rn[t]??!0}function rr(t,r){rn[t]=r,Hr("csauto_autorefresh_enabled",rn)}var Xi=S(" ",1),Yi=S('
        ms
        '),Qi=S('
        Telemetry
        '),Zi=S('
        API token
        Auto-refresh intervals
        ',1);function Ji(t,r){Me(r,!0);let a=z(ie(xa())),n=z(ie({...Bi()})),s=z(!0),i=z(!1);Re(()=>{wi().then(b=>{f(s,b.enabled,!0),f(i,!0)}).catch(()=>{f(i,!1)})});function o(b){const{min:x}=Wr[b];let A=e(n)[b];(typeof A!="number"||isNaN(A))&&(A=Tt[b]),f(n,{...e(n),[b]:Math.max(x,Math.round(A))},!0)}function l(b,x){const A=x.target,m=A.value.replace(/[^0-9]/g,""),N=parseInt(m,10);isNaN(N)?m===""&&f(n,{...e(n),[b]:Wr[b].min},!0):f(n,{...e(n),[b]:N},!0),A.value=String(e(n)[b])}function d(){ya(e(a));for(const b of Object.keys(e(n)))o(b),qi(b,e(n)[b]);e(i)&&ki(e(s)).catch(()=>{}),r.onClose()}hr(t,{title:"Settings",titleId:"settings-dialog-title",get onCancel(){return r.onClose},onConfirm:d,maxWidth:"400px",portal:!0,footer:x=>{var A=Xi(),m=K(A);$e(m,{variant:"secondary",get onclick(){return r.onClose},children:(L,g)=>{ke();var c=Ve("Cancel");u(L,c)},$$slots:{default:!0}});var N=$(m,2);$e(N,{variant:"primary",onclick:d,children:(L,g)=>{ke();var c=Ve("Save");u(L,c)},$$slots:{default:!0}}),u(x,A)},children:(x,A)=>{var m=Zi(),N=K(m),L=$(k(N),2);Xe(L),p(N);var g=$(N,2),c=k(g),w=$(k(c),2);p(c);var P=$(c,2);Ye(P,20,()=>Ui,C=>C,(C,_)=>{const M=j(()=>Wr[_]);var F=Yi(),T=k(F),q=k(T),I=k(q,!0);p(q);var O=$(q,2),V=k(O);p(O),p(T);var G=$(T,2),Z=k(G);Xe(Z),ke(2),p(G),p(F),J(()=>{ne(I,e(M).label),ne(V,`min ${e(M).min??""}ms`),vn(Z,e(n)[_])}),le("input",Z,ae=>l(_,ae)),tt("blur",Z,()=>o(_)),u(C,F)}),p(P),p(g);var h=$(g,2);{var y=C=>{var _=Qi(),M=$(k(_),2);It(M,{get checked(){return e(s)},onchange:F=>f(s,F,!0),label:"Send anonymous usage statistics"}),p(_),u(C,_)};Q(h,C=>{e(i)&&C(y)})}et(L,()=>e(a),C=>f(a,C)),le("click",w,()=>f(n,{...Tt},!0)),u(x,m)},$$slots:{footer:!0,default:!0}}),Ae()}Ke(["click","input"]);const el=""+new URL("../assets/code-saturne.BHojVttu.svg",import.meta.url).href,tl="data:image/svg+xml,%3c?xml%20version='1.0'%20encoding='UTF-8'?%3e%3csvg%20id='Calque_1'%20xmlns='http://www.w3.org/2000/svg'%20version='1.1'%20height='400px'%20viewBox='0%200%20397.89%2095.85'%3e%3c!--%20Generator:%20Adobe%20Illustrator%2029.8.1,%20SVG%20Export%20Plug-In%20.%20SVG%20Version:%202.1.1%20Build%202)%20--%3e%3cdefs%3e%3cstyle%3e%20.st0%20{%20fill:%20%23ff861d;%20}%20.st1%20{%20fill:%20%23ffb210;%20}%20.st2%20{%20fill:%20%231057c8;%20}%20.st3%20{%20fill:%20%23d6430a;%20}%20%3c/style%3e%3c/defs%3e%3cpath%20class='st2'%20d='M26.25,61.73c-12.02,0-20.11-8.16-20.11-21.37s8.01-21.37,20.33-21.37c8.83,0,15.06,3.78,17.36,11.28l-5.64,2.52c-1.48-5.94-4.97-8.69-11.87-8.69-8.46,0-14.25,6.01-14.25,16.25s5.93,16.25,13.95,16.25,11.73-2.82,12.84-8.61l5.71,1.93c-2,7.79-9.13,11.8-18.33,11.8'/%3e%3cpath%20class='st2'%20d='M89.96,40.36c0,13.21-7.87,21.37-20.48,21.37s-20.48-8.16-20.48-21.37,7.86-21.37,20.48-21.37,20.48,8.16,20.48,21.37M54.94,40.36c0,10.24,5.64,16.25,14.54,16.25s14.54-6.01,14.54-16.25-5.64-16.25-14.54-16.25-14.54,6.01-14.54,16.25'/%3e%3cpath%20class='st2'%20d='M134.3,40.29c0,13.43-8.01,20.85-21.81,20.85h-14.84V19.58h14.84c13.8,0,21.81,7.42,21.81,20.7M128.36,40.29c0-9.94-5.57-15.58-15.44-15.58h-9.35v31.32h9.35c9.87,0,15.44-5.71,15.44-15.73'/%3e%3cpolygon%20class='st2'%20points='174.11%2056.02%20174.11%2061.14%20141.98%2061.14%20141.98%2019.58%20173.14%2019.58%20173.14%2024.7%20147.91%2024.7%20147.91%2037.54%20167.65%2037.54%20167.65%2042.66%20147.91%2042.66%20147.91%2056.02%20174.11%2056.02'/%3e%3cpath%20class='st2'%20d='M213.81,22.13c4.16-1.92,9.75-3.11,14.3-3.11,12.55,0,17.74,5.19,17.74,17.34v5.27c0,4.16.08,7.28.16,10.31.08,3.12.24,5.99.48,9.19h-9.43c-.4-2.16-.4-4.88-.48-6.15h-.16c-2.48,4.56-7.83,7.11-12.71,7.11-7.28,0-14.39-4.4-14.39-12.23,0-6.15,2.96-9.75,7.03-11.75,4.08-2,9.35-2.4,13.83-2.4h5.91c0-6.63-2.96-8.87-9.27-8.87-4.56,0-9.11,1.76-12.71,4.48l-.32-9.19ZM226.36,54.26c3.27,0,5.83-1.44,7.51-3.68,1.76-2.32,2.24-5.27,2.24-8.47h-4.63c-4.8,0-11.91.8-11.91,7.11,0,3.52,2.96,5.04,6.79,5.04'/%3e%3cpath%20class='st2'%20d='M280.98,28.61c-3.28-1.12-5.67-1.76-9.59-1.76-2.88,0-6.31,1.04-6.31,4.56,0,6.56,18.62,2.4,18.62,17.27,0,9.59-8.55,13.43-17.27,13.43-4.08,0-8.23-.72-12.15-1.76l.64-8.79c3.36,1.68,6.87,2.72,10.55,2.72,2.72,0,7.03-1.04,7.03-5.04,0-8.07-18.62-2.56-18.62-17.42,0-8.87,7.75-12.79,16.14-12.79,5.03,0,8.31.8,11.67,1.52l-.72,8.07Z'/%3e%3cpath%20class='st2'%20d='M295.25,27.81h-7.91v-7.83h7.91v-8.23l10.71-3.44v11.67h9.51v7.83h-9.51v19.18c0,3.52.96,6.79,5.04,6.79,1.92,0,3.76-.4,4.88-1.12l.32,8.47c-2.24.64-4.72.96-7.91.96-8.39,0-13.03-5.2-13.03-13.35v-20.94Z'/%3e%3cpath%20class='st2'%20d='M355.22,58.82c-3.92,2.16-8.39,3.28-14.15,3.28-13.59,0-21.5-7.83-21.5-21.34,0-11.91,6.31-21.74,19.1-21.74,15.27,0,19.58,10.47,19.58,24.85h-28.45c.48,6.63,5.11,10.39,11.75,10.39,5.2,0,9.67-1.92,13.67-4.15v8.71ZM348.03,36.52c-.32-5.19-2.72-9.67-8.71-9.67s-9.03,4.16-9.51,9.67h18.22Z'/%3e%3cpath%20class='st2'%20d='M366.57,19.98h9.51v9.35h.16c.48-3.84,4.87-10.31,11.27-10.31,1.04,0,2.16,0,3.27.32v10.79c-.96-.56-2.88-.88-4.79-.88-8.71,0-8.71,10.87-8.71,16.78v15.11h-10.71V19.98Z'/%3e%3cpath%20class='st0'%20d='M229.73,80.9c0,3.67-2.97,6.64-6.64,6.64s-6.64-2.97-6.64-6.64,2.97-6.64,6.64-6.64,6.64,2.97,6.64,6.64'/%3e%3cpath%20class='st0'%20d='M203.17,80.9c0,3.67-2.97,6.64-6.64,6.64s-6.64-2.97-6.64-6.64,2.97-6.64,6.64-6.64,6.64,2.97,6.64,6.64'/%3e%3cpath%20class='st1'%20d='M296.14,80.9c0,3.67-2.97,6.64-6.64,6.64s-6.64-2.97-6.64-6.64,2.97-6.64,6.64-6.64,6.64,2.97,6.64,6.64'/%3e%3cpath%20class='st1'%20d='M378.47,80.9c0,3.67-2.97,6.64-6.64,6.64s-6.64-2.97-6.64-6.64,2.97-6.64,6.64-6.64,6.64,2.97,6.64,6.64'/%3e%3cpath%20class='st1'%20d='M269.57,80.9c0,3.67-2.97,6.64-6.64,6.64s-6.64-2.97-6.64-6.64,2.97-6.64,6.64-6.64,6.64,2.97,6.64,6.64'/%3e%3cpath%20class='st3'%20d='M107.55,80.9c0,3.67-2.97,6.64-6.64,6.64s-6.64-2.97-6.64-6.64,2.97-6.64,6.64-6.64,6.64,2.97,6.64,6.64'/%3e%3crect%20class='st0'%20x='134.12'%20y='75.59'%20width='42.5'%20height='10.62'/%3e%3crect%20class='st1'%20x='309.42'%20y='75.59'%20width='42.5'%20height='10.62'/%3e%3c/svg%3e";let Wt=z(null);function rl(t){f(Wt,t,!0)}function Ft(){return e(Wt)}function cr(t){return e(Wt)===null||e(Wt).capabilities.includes(t)}function nl(t){return e(Wt)===null||e(Wt).control_actions.includes(t)}var al=S('CODE_SATURNE'),sl=S('CODE_ASTER'),ol=S(' '),il=S('
        ',1);function ll(t,r){Me(r,!0);let a=j(()=>r.shownCases!==r.totalCases),n=z(!1);var s=il(),i=K(s),o=k(i),l=k(o);{var d=D=>{var v=al();J(()=>we(v,"src",el)),u(D,v)},b=j(()=>{var D;return!Ft()||((D=Ft())==null?void 0:D.solver)==="code_saturne"}),x=D=>{var v=sl();J(()=>we(v,"src",tl)),u(D,v)},A=j(()=>{var D;return((D=Ft())==null?void 0:D.solver)==="code_aster"}),m=D=>{var v=ol(),B=k(v,!0);p(v),J(X=>ne(B,X),[()=>{var X;return(X=Ft())==null?void 0:X.solver}]),u(D,v)};Q(l,D=>{e(b)?D(d):e(A)?D(x,1):D(m,-1)})}p(o);var N=$(o,2),L=k(N),g=k(L),c=k(g);{var w=D=>{var v=Ve();J(()=>ne(v,`${r.shownCases??""}/`)),u(D,v)};Q(c,D=>{e(a)&&D(w)})}var P=$(c,1,!0);p(g);var h=$(g,2),y=k(h,!0);p(h),p(L);var C=$(L,2),_=k(C),M=k(_);{var F=D=>{var v=Ve();J(()=>ne(v,`${r.shownRunning??""}/`)),u(D,v)};Q(M,D=>{e(a)&&D(F)})}var T=$(M,1,!0);p(_),ke(2),p(C);var q=$(C,2),I=k(q),O=k(I);{var V=D=>{var v=Ve();J(()=>ne(v,`${r.shownConverged??""}/`)),u(D,v)};Q(O,D=>{e(a)&&D(V)})}var G=$(O,1,!0);p(I),ke(2),p(q),p(N);var Z=$(N,2),ae=k(Z),E=k(ae);Te(E,{get icon(){return Yo},size:18}),p(ae),p(Z),p(i);var R=$(i,2);{var H=D=>{Ji(D,{onClose:()=>f(n,!1)})};Q(R,D=>{e(n)&&D(H)})}J(()=>{ne(P,r.totalCases),ne(y,r.totalCases===1?"case":"cases"),ne(T,r.totalRunning),ne(G,r.totalConverged)}),le("click",ae,()=>f(n,!0)),u(t,s),Ae()}Ke(["click"]);const cl=""+new URL("../assets/simvia-logo.kLDq7Uoj.svg",import.meta.url).href;var ul=S('
        '),dl=S('

        '),fl=S("
        "),vl=S('
        '),gl=S('
        '),hl=S('
        ');function Ht(t,r){let a=me(r,"eyebrow",3,""),n=me(r,"title",3,""),s=me(r,"wide",3,!1);var i=hl(),o=$(k(i),2);{var l=b=>{var x=gl(),A=k(x);{var m=c=>{var w=be(),P=K(w);ft(P,()=>r.titleSlot),u(c,w)},N=c=>{var w=fl(),P=k(w);{var h=_=>{var M=ul(),F=k(M,!0);p(M),J(()=>ne(F,a())),u(_,M)};Q(P,_=>{a()&&_(h)})}var y=$(P,2);{var C=_=>{var M=dl(),F=k(M,!0);p(M),J(()=>ne(F,n())),u(_,M)};Q(y,_=>{n()&&_(C)})}p(w),u(c,w)};Q(A,c=>{r.titleSlot?c(m):c(N,-1)})}var L=$(A,2);{var g=c=>{var w=vl(),P=k(w);ft(P,()=>r.actions),p(w),u(c,w)};Q(L,c=>{r.actions&&c(g)})}p(x),u(b,x)};Q(o,b=>{(a()||n()||r.titleSlot||r.actions)&&b(l)})}var d=$(o,2);ft(d,()=>r.children),p(i),J(()=>{Se(i,1,`${s()?"col-span-12":"col-span-6"} bg-card border border-border rounded-[10px] p-[16px_18px_18px] relative overflow-clip animate-rise`),we(i,"id",r.id)}),u(t,i)}function nr(t,r){Me(r,!0);let a=me(r,"checked",15,!0);Re(()=>{a()?mr(r.name,r.onRefresh,r.intervalMs):vt(r.name)}),vr(()=>vt(r.name)),It(t,{get checked(){return a()},onchange:n=>a(n),size:14,label:"Auto-refresh",labelFirst:!0}),Ae()}var pl=S(" ",1),ml=S('
      • '),_l=S(''),bl=S(' ',1);function xl(t,r){Me(r,!0);let a=me(r,"label",3,"More"),n=z(!1),s=z(void 0),i=z(void 0),o=z("");function l(){if(!e(s)||!e(i))return;const c=e(s).getBoundingClientRect(),w=e(i).offsetHeight,P=4,h=window.innerHeight-c.bottom-P,C=hh?c.top-P-w:c.bottom+P,_=Math.min(c.left,window.innerWidth-180);f(o,`position:fixed; top:${C}px; left:${_}px; min-width:170px; z-index:9999;`)}async function d(){f(n,!e(n)),e(n)&&(await Pt(),l())}function b(c){c.disabled||(f(n,!1),c.onClick())}function x(c){e(n)&&e(s)&&!e(s).contains(c.target)&&e(i)&&!e(i).contains(c.target)&&f(n,!1)}var A=bl();tt("mousedown",it,x),tt("keydown",it,c=>{c.key==="Escape"&&f(n,!1)}),tt("scroll",it,()=>{e(n)&&f(n,!1)});var m=K(A),N=k(m);$e(N,{variant:"secondary",size:"sm",onclick:d,children:(c,w)=>{var P=pl(),h=K(P);Te(h,{get icon(){return jo}});var y=$(h);J(()=>ne(y,` ${a()??""}`)),u(c,P)},$$slots:{default:!0}}),p(m),nt(m,c=>f(s,c),()=>e(s));var L=$(m,2);{var g=c=>{Jt(c,{children:(w,P)=>{var h=_l();Ye(h,21,()=>r.items,y=>y.label,(y,C)=>{var _=ml(),M=k(_),F=k(M);Te(F,{get icon(){return e(C).icon},size:14});var T=$(F);p(M),p(_),J(()=>{M.disabled=e(C).disabled,we(M,"aria-disabled",e(C).disabled),Se(M,1,`w-full flex items-center gap-2 text-left py-[7px] px-[10px] bg-transparent border border-transparent rounded-md text-[12.5px] text-ink transition-[background] duration-[120ms] ease-in-out disabled:opacity-40 disabled:pointer-events-none ${e(C).disabled?"":"cursor-pointer hover:bg-edf-gris-clair hover:border-border"}`),ne(T,` ${e(C).label??""}`)}),le("mousedown",M,q=>{q.stopPropagation(),b(e(C))}),u(y,_)}),p(h),nt(h,y=>f(i,y),()=>e(i)),J(()=>Ze(h,e(o))),u(w,h)}})};Q(L,c=>{e(n)&&c(g)})}u(t,A),Ae()}Ke(["mousedown"]);const Dt=[{key:"note",label:"Note"},{key:"nprocs",label:"MPI Ranks"},{key:"nt",label:"Thread Count"},{key:"last_iter",label:"Last Iter"},{key:"duration",label:"Duration"},{key:"last_mod",label:"Last Modified"},{key:"resu_size_mb",label:"RESU Size (MB)"}];let Xt=z(ie([])),Lr=z(ie([])),pt=z(ie(new Set)),br=z(""),bn=z(""),Et=z(ie([])),st=z(ie([])),Yt=z(""),Ca=z(!0),yl=z(!0),qt=z(ie(_n("csauto_status_views",{}))),xn=z(ie(localStorage.getItem("csauto_status_view_selected")??""));function yn(){return e(Xt)}function wn(){return e(Lr)}function Ut(){return e(pt)}function Un(){return e(br)}function nn(){return e(bn)}function wl(){return e(Et)}function kl(){return e(Et).filter(t=>e(Lr).includes(t))}function Cl(){return e(Et).filter(t=>Dt.some(r=>r.key===t))}function Sl(){return e(st)}function $l(){return e(Yt)}function Pl(){return e(Ca)}function Bn(){return e(qt)}function El(){return e(xn)}function Rl(t){f(Xt,t,!0)}function Nl(t){const r=e(Lr).length===0&&t.length>0;f(Lr,t,!0),r&&e(Et).length===0&&f(Et,[...t,...Dt.map(a=>a.key)],!0)}function Ml(t){f(br,t,!0)}function qn(t){f(Et,t,!0)}function Al(t){f(Yt,t,!0)}function Ll(t){f(Ca,t,!0)}function Tl(t){f(yl,t,!0)}function kn(t){f(xn,t,!0),localStorage.setItem("csauto_status_view_selected",t)}function an(t){const r=new Set(e(pt));r.has(t)?r.delete(t):r.add(t),f(pt,r,!0),f(br,t,!0),f(bn,t,!0)}function Sa(t){f(pt,new Set([t]),!0),f(br,t,!0),f(bn,t,!0)}function sn(t,r,a){const n=a.indexOf(t),s=a.indexOf(r);if(n<0||s<0)return;const[i,o]=n{const a=Fl(r);return t.every(n=>a.includes(n))})}function Dl(t){if(t==null||t==="")return"";const r=Number(t);return Number.isFinite(r)?r:String(t).toLowerCase()}function Wn(t,r){var n;if(r==="case_id")return t.case_id;if(r==="status")return t.status??"";if(r==="note")return t.note??"";if(r==="nprocs")return t.nprocs??0;if(r==="nt")return t.nt??0;if(r==="last_iter")return t.last_iter??0;if(r==="duration")return t.duration_s??0;if(r==="last_mod")return t.last_mod??"";if(r==="resu_size_mb")return t.resu_size_mb??0;const a=(n=t.doe)==null?void 0:n[r];return a!==void 0?Dl(a):""}function zl(t,r){return t===""&&r===""?0:t===""?1:r===""?-1:typeof t=="number"&&typeof r=="number"?t-r:String(t).localeCompare(String(r))}function Pa(){const t=$a();return e(st).length===0?t:[...t].sort((r,a)=>{for(const n of e(st)){const s=Wn(r,n.key),i=Wn(a,n.key),o=zl(s,i);if(o!==0)return n.dir==="asc"?o:-o}return 0})}function Rr(){return Pa().map(t=>t.case_id)}function Il(t,r){const a=e(st).findIndex(n=>n.key===t);if(r)if(a>=0){const n=[...e(st)];n[a]={key:t,dir:n[a].dir==="asc"?"desc":"asc"},f(st,n,!0)}else f(st,[...e(st),{key:t,dir:"asc"}],!0);else a>=0&&e(st).length===1?f(st,[{key:t,dir:e(st)[0].dir==="asc"?"desc":"asc"}],!0):f(st,[{key:t,dir:"asc"}],!0)}function Ol(){return{visibleColumns:[...e(Et)],search:e(Yt),sorts:e(st).map(t=>({...t}))}}function Hl(t){f(Et,[...t.visibleColumns],!0),f(Yt,t.search,!0),f(st,t.sorts.map(r=>({...r})),!0)}function jl(t){f(qt,{...e(qt),[t]:Ol()},!0),Hr("csauto_status_views",e(qt)),kn(t)}function Vl(t){const r={...e(qt)};delete r[t],f(qt,r,!0),Hr("csauto_status_views",r),e(xn)===t&&kn("")}function Sr(){const t=new Set;for(const r of e(Xt))e(pt).has(r.case_id)&&t.add((r.status??"").toUpperCase());return t}function Xn(){for(const t of e(Xt))if(e(pt).has(t.case_id)&&t.resu_size_mb!=null&&t.resu_size_mb>0)return!0;return!1}function Ul(t,r){const a=r.length,n=t.length,s=r.filter(d=>d.status==="RUNNING").length,i=t.filter(d=>d.status==="RUNNING").length,o=r.filter(d=>d.convergence==="converged").length,l=t.filter(d=>d.convergence==="converged").length;return{totalCases:a,shownCases:n,totalRunning:s,shownRunning:i,totalConverged:o,shownConverged:l}}var Bl=S('
        DOE columns
        '),ql=S('
        ');function Kl(t,r){Me(r,!0);let a=me(r,"initialName",3,""),n=j(wn),s=z(ie(a())),i=z(ie(new Set(r.initialColumns??[...e(n),...Dt.map(V=>V.key)])));function o(V){const G=new Set(e(i));G.has(V)?G.delete(V):G.add(V),f(i,G,!0)}function l(V,G){const Z=new Set(e(i));V.forEach(ae=>G?Z.add(ae):Z.delete(ae)),f(i,Z,!0)}function d(){const V=e(s).trim();V&&r.onSave(V,[...e(i)])}function b(V){V.key==="Escape"&&r.onCancel()}function x(V){V.target.dataset.backdrop!==void 0&&r.onCancel()}let A=z(void 0);Re(()=>{var V,G;(V=e(A))==null||V.focus(),(G=e(A))==null||G.select()});var m=ql(),N=k(m),L=k(N),g=k(L,!0);p(L);var c=$(L,2),w=$(k(c),2);Xe(w),nt(w,V=>f(A,V),()=>e(A)),p(c);var P=$(c,2);{var h=V=>{var G=Bl(),Z=k(G),ae=$(k(Z),2),E=k(ae),R=$(E,2);p(ae),p(Z);var H=$(Z,2);Ye(H,20,()=>e(n),D=>D,(D,v)=>{{let B=j(()=>e(i).has(v));It(D,{get checked(){return e(B)},onchange:()=>o(v),size:14,get label(){return v}})}}),p(H),p(G),le("click",E,()=>l(e(n),!0)),le("click",R,()=>l(e(n),!1)),u(V,G)};Q(P,V=>{e(n).length>0&&V(h)})}var y=$(P,2),C=k(y),_=$(k(C),2),M=k(_),F=$(M,2);p(_),p(C);var T=$(C,2);Ye(T,21,()=>Dt,V=>V.key,(V,G)=>{{let Z=j(()=>e(i).has(e(G).key));It(V,{get checked(){return e(Z)},onchange:()=>o(e(G).key),size:14,get label(){return e(G).label}})}}),p(T),p(y);var q=$(y,2),I=k(q);$e(I,{variant:"secondary",get onclick(){return r.onCancel},children:(V,G)=>{ke();var Z=Ve("Cancel");u(V,Z)},$$slots:{default:!0}});var O=$(I,2);{let V=j(()=>!e(s).trim());$e(O,{variant:"primary",onclick:d,get disabled(){return e(V)},children:(G,Z)=>{ke();var ae=Ve("Save");u(G,ae)},$$slots:{default:!0}})}p(q),p(N),p(m),J(()=>ne(g,r.mode==="create"?"New view":"Edit view")),le("keydown",m,b),le("click",m,x),et(w,()=>e(s),V=>f(s,V)),le("click",M,()=>l(Dt.map(V=>V.key),!0)),le("click",F,()=>l(Dt.map(V=>V.key),!1)),u(t,m),Ae()}Ke(["keydown","click"]);var Gl=S('
        ',1);function Wl(t,r){Me(r,!0);let a=j(()=>Object.keys(Bn())),n=z(ie(El())),s=z(!1),i=z("create"),o=j(()=>[{value:"",label:"All columns"},...e(a).map(C=>({value:C,label:C}))]);function l(C){if(f(n,C,!0),kn(C),C==="")qn([...wn(),...Dt.map(_=>_.key)]);else{const _=Bn();_[C]&&Hl(_[C])}}function d(){f(i,"edit"),f(s,!0)}function b(){f(i,"create"),f(s,!0)}function x(C,_){qn(_),e(i)==="edit"&&e(n)&&C!==e(n)&&Vl(e(n)),jl(C),f(n,C,!0),f(s,!1)}function A(){f(s,!1)}var m=Gl(),N=K(m),L=k(N);lt(L,{class:"w-[140px]",get options(){return e(o)},get value(){return e(n)},onchange:l});var g=$(L,2),c=k(g);Te(c,{get icon(){return Ko},size:14}),p(g);var w=$(g,2),P=k(w);Te(P,{get icon(){return Go},size:14}),p(w),p(N);var h=$(N,2);{var y=C=>{Jt(C,{children:(_,M)=>{{let F=j(()=>e(i)==="edit"?e(n):""),T=j(wl);Kl(_,{get mode(){return e(i)},get initialName(){return e(F)},get initialColumns(){return e(T)},onSave:x,onCancel:A})}}})};Q(h,C=>{e(s)&&C(y)})}le("click",g,d),le("click",w,b),u(t,m),Ae()}Ke(["click"]);var Xl=S('
        '),Yl=S(""),Ql=S(' '),Zl=S(' '),Jl=S('
        '),ec=S(" "),tc=S(''),rc=S(''),nc=S(" Open GUI",1),ac=S(""),sc=S(" "),oc=S(""),ic=S('
        ');function lc(t,r){Me(r,!0);let a=j(()=>r.rows.length>0&&r.rows.every(E=>e(b).has(E.case_id))),n=j(()=>r.rows.some(E=>e(b).has(E.case_id))),s=j(()=>e(n)&&!e(a)),i=j(kl),o=j(()=>new Set(Cl())),l=j(Sl),d=j(Pl),b=j(Ut),x=j(()=>{const E=[{key:"_select",label:"",kind:"meta",sticky:"left"},{key:"case_id",label:"Case",kind:"meta",sticky:"left"},{key:"status",label:"Status",kind:"meta",sticky:"left"},...e(o).has("note")?[{key:"note",label:"Note",kind:"meta"}]:[]],R=e(i).map(B=>({key:B,label:B,kind:"doe"})),D=[{key:"nprocs",label:"MPI Ranks",kind:"calc"},{key:"nt",label:"Thread Count",kind:"calc"},{key:"last_iter",label:"Last Iter",kind:"calc"},{key:"duration",label:"Duration",kind:"calc"},{key:"last_mod",label:"Last Modified",kind:"calc"},{key:"resu_size_mb",label:"RESU Size (MB)",kind:"calc"}].filter(B=>e(o).has(B.key)),v=cr("gui")?[{key:"_actions",label:"",kind:"meta",sticky:"right"}]:[];return[...E,...R,...D,...v]});function A(E){const R=e(l).findIndex(D=>D.key===E);if(R<0)return"";const H=e(l)[R].dir==="asc"?"▲":"▼";return e(l).length>1?`${H}${R+1}`:H}function m(E,R){E!=="_actions"&&Il(E,R.ctrlKey||R.metaKey)}function N(E,R){R.shiftKey?sn(nn()||E,E,Rr()):R.ctrlKey||R.metaKey?an(E):Sa(E)}function L(E,R){var D;const H=((D=E.status)==null?void 0:D.toUpperCase())??"";H!=="DONE"&&H!=="FAILED"||(R.preventDefault(),r.onContextMenu(E.case_id,R.clientX,R.clientY,E.convergence??""))}async function g(E){const R=E.note??"",H=await hn("Case note:",R,`Note — ${E.case_id}`,"",!0);if(H!==null)try{await bi(E.case_id,H)}catch(D){await We(`Failed to set note: ${D instanceof Error?D.message:D}`,"Error")}}async function c(E){try{await yi(E)}catch(R){await We(`Failed to open GUI: ${R instanceof Error?R.message:R}`,"Error")}}function w(E,R){const H=(E==null?void 0:E.toUpperCase())??"";return(H==="DONE"||H==="FAILED")&&R==="converged"?"CONVERGED":(H==="DONE"||H==="FAILED")&&R==="not_converged"?"NOT CONVERGED":H}function P(E,R){const H=(E==null?void 0:E.toUpperCase())??"";return(H==="DONE"||H==="FAILED")&&R==="converged"?"status-converged":(H==="DONE"||H==="FAILED")&&R==="not_converged"?"status-not-converged":H==="RUNNING"?"status-running":H==="DONE"?"status-done":H==="FAILED"?"status-failed":H==="PREPARED"?"status-prepared":"status-unknown"}function h(E){return e(b).has(E.case_id)?"row-selected":""}function y(E,R){var H;return R.key==="case_id"?E.case_id:R.key==="nprocs"?E.nprocs!=null?String(E.nprocs):"":R.key==="nt"?E.nt!=null?String(E.nt):"":R.key==="last_iter"?E.last_iter!=null?String(E.last_iter):"":R.key==="duration"?E.duration??"":R.key==="last_mod"?C(E.last_mod):R.key==="resu_size_mb"?E.resu_size_mb!=null?String(E.resu_size_mb):"":R.kind==="doe"?((H=E.doe)==null?void 0:H[R.key])!=null&&String(E.doe[R.key])!==""?String(E.doe[R.key]):"—":""}function C(E){if(!E)return"";try{const R=new Date(E),H=new Date,D=R.toDateString()===H.toDateString(),v=new Date(H);v.setDate(v.getDate()-1);const B=R.toDateString()===v.toDateString(),X=R.toLocaleTimeString([],{hour:"2-digit",minute:"2-digit"});return D?`Today ${X}`:B?`Yesterday ${X}`:R.toLocaleDateString([],{month:"short",day:"numeric"})+` ${X}`}catch{return E}}let _=z(ie({})),M=z(void 0);Re(()=>{e(d),e(x),r.rows,!(!e(M)||!e(d))&&Pt().then(()=>{if(!e(M))return;const E=Array.from(e(M).querySelectorAll("thead th.sticky-left")),R={};let H=0;E.forEach(D=>{const v=D.dataset.colKey??"";R[v]=H,H+=D.getBoundingClientRect().width}),f(_,R,!0)})});function F(E,R,H){const D=H&&E.key!=="_select"&&E.key!=="_actions"?["status-sortable"]:[];if(!H&&E.key==="case_id"&&D.push("case-id"),E.kind==="doe"&&D.push("status-col-doe"),!H&&E.key==="note"&&D.push("max-w-[140px] whitespace-nowrap overflow-hidden text-ellipsis cursor-pointer hover:underline hover:decoration-dotted hover:underline-offset-2"),e(d)&&E.sticky==="left"&&D.push("sticky-left"),e(d)&&E.sticky==="right"&&D.push("sticky-right"),e(d)&&E.sticky==="left"){const v=e(x)[R+1];(!v||v.sticky!=="left")&&D.push("sticky-divider")}if(e(d)&&E.sticky==="right"){const v=e(x)[R-1];(!v||v.sticky!=="right")&&D.push("sticky-divider")}return D.join(" ")}function T(E,R){return F(E,R,!0)}function q(E,R){return F(E,R,!1)}function I(E){return!e(d)||!E.sticky?"":E.sticky==="right"?"position:sticky;right:0;":E.sticky==="left"&&E.key in e(_)?`position:sticky;left:${e(_)[E.key]}px;`:""}var O=ic(),V=k(O),G=k(V),Z=k(G);Ye(Z,23,()=>e(x),E=>E.key,(E,R,H)=>{var D=be(),v=K(D);{var B=fe=>{var W=Xl(),te=k(W),se=k(te);It(se,{get checked(){return e(a)},get indeterminate(){return e(s)},get onchange(){return r.onToggleAll},size:14}),p(te),p(W),J((de,ce)=>{Se(W,1,`${de??""} !px-2.5 !py-0 w-9`),we(W,"data-col-key",e(R).key),Ze(W,ce)},[()=>T(e(R),e(H)),()=>I(e(R))]),u(fe,W)},X=fe=>{var W=Yl();J((te,se)=>{Se(W,1,te),we(W,"data-col-key",e(R).key),Ze(W,se)},[()=>dt(T(e(R),e(H))),()=>I(e(R))]),u(fe,W)},ue=fe=>{var W=Zl(),te=k(W),se=$(te);{var de=re=>{var xe=Ql(),he=k(xe,!0);p(xe),J(Ee=>ne(he,Ee),[()=>A(e(R).key)]),u(re,xe)},ce=j(()=>A(e(R).key));Q(se,re=>{e(ce)&&re(de)})}p(W),J((re,xe)=>{Se(W,1,re),we(W,"data-col-key",e(R).key),Ze(W,xe),ne(te,`${e(R).label??""} `)},[()=>dt(T(e(R),e(H))),()=>I(e(R))]),le("click",W,re=>m(e(R).key,re)),le("keydown",W,re=>{(re.key==="Enter"||re.key===" ")&&(re.preventDefault(),m(e(R).key,re))}),u(fe,W)};Q(v,fe=>{e(R).key==="_select"?fe(B):e(R).key==="_actions"?fe(X,1):fe(ue,-1)})}u(E,D)}),p(Z),p(G);var ae=$(G);Ye(ae,21,()=>r.rows,E=>E.case_id,(E,R)=>{var H=oc();Ye(H,23,()=>e(x),D=>D.key,(D,v,B)=>{var X=be(),ue=K(X);{var fe=ce=>{var re=Jl(),xe=k(re),he=k(xe);{let Ee=j(()=>e(b).has(e(R).case_id));It(he,{get checked(){return e(Ee)},onchange:()=>r.onToggleRow(e(R).case_id),size:14})}p(xe),p(re),J((Ee,pe)=>{Se(re,1,`${Ee??""} !px-2.5 !py-0 w-9`),we(re,"data-col-key",e(v).key),Ze(re,pe)},[()=>q(e(v),e(B)),()=>I(e(v))]),u(ce,re)},W=ce=>{var re=ec(),xe=k(re),he=k(xe,!0);p(xe),p(re),J((Ee,pe,Fe,ze)=>{Se(re,1,Ee),we(re,"data-col-key",e(v).key),Ze(re,pe),Se(xe,1,`status-pill ${Fe??""}`),ne(he,ze)},[()=>dt(q(e(v),e(B))),()=>I(e(v)),()=>P(e(R).status,e(R).convergence),()=>w(e(R).status,e(R).convergence)]),u(ce,re)},te=ce=>{var re=rc(),xe=k(re);{var he=pe=>{var Fe=Ve();J(()=>ne(Fe,e(R).note)),u(pe,Fe)},Ee=pe=>{var Fe=tc(),ze=k(Fe);Te(ze,{get icon(){return qo},size:12}),p(Fe),u(pe,Fe)};Q(xe,pe=>{e(R).note?pe(he):pe(Ee,-1)})}p(re),J((pe,Fe)=>{Se(re,1,pe),we(re,"data-col-key",e(v).key),Ze(re,Fe),we(re,"title",e(R).note||"Add note")},[()=>dt(q(e(v),e(B))),()=>I(e(v))]),le("click",re,pe=>{pe.stopPropagation(),g(e(R))}),le("keydown",re,pe=>{(pe.key==="Enter"||pe.key===" ")&&(pe.preventDefault(),pe.stopPropagation(),g(e(R)))}),u(ce,re)},se=ce=>{var re=ac(),xe=k(re);$e(xe,{variant:"primary",size:"sm",onclick:he=>{he.stopPropagation(),c(e(R).case_id)},children:(he,Ee)=>{var pe=nc(),Fe=K(pe);Te(Fe,{get icon(){return Vo},size:12}),ke(),u(he,pe)},$$slots:{default:!0}}),p(re),J((he,Ee)=>{Se(re,1,he),we(re,"data-col-key",e(v).key),Ze(re,Ee)},[()=>dt(q(e(v),e(B))),()=>I(e(v))]),u(ce,re)},de=ce=>{var re=sc(),xe=k(re,!0);p(re),J((he,Ee,pe)=>{Se(re,1,he),we(re,"data-col-key",e(v).key),Ze(re,Ee),ne(xe,pe)},[()=>dt(q(e(v),e(B))),()=>I(e(v)),()=>y(e(R),e(v))]),u(ce,re)};Q(ue,ce=>{e(v).key==="_select"?ce(fe):e(v).key==="status"?ce(W,1):e(v).key==="note"?ce(te,2):e(v).key==="_actions"?ce(se,3):ce(de,-1)})}u(D,X)}),p(H),J(D=>Se(H,1,D),[()=>dt(h(e(R)))]),le("click",H,D=>N(e(R).case_id,D)),le("contextmenu",H,D=>L(e(R),D)),u(E,H)}),p(ae),p(V),nt(V,E=>f(M,E),()=>e(M)),p(O),J(()=>Se(O,1,`table-wrap ${e(d)?"sticky-enabled":""}`)),u(t,O),Ae()}Ke(["click","keydown","contextmenu"]);var cc=S('
        ');function uc(t,r){Me(r,!0);let a=j(()=>{const m=Math.min(r.x,window.innerWidth-180),N=Math.min(r.y,window.innerHeight-120);return`left: ${m}px; top: ${N}px;`});async function n(m){try{for(const N of r.cases)await xi(N,m)}catch(N){console.error("Failed to set convergence:",N)}r.onClose()}const s=r.cases.length>1?` (${r.cases.length})`:"";var i=cc();tt("keydown",it,m=>{m.key==="Escape"&&r.onClose()});var o=k(i),l=k(o);p(o);var d=$(o,2),b=k(d);p(d);var x=$(d,2),A=k(x);p(x),p(i),J(()=>{Ze(i,e(a)),Se(o,1,`w-full text-left py-[7px] px-[10px] bg-transparent border border-transparent rounded-md text-[12.5px] cursor-pointer transition-[background] duration-[120ms] ease-in-out hover:bg-edf-gris-clair hover:border-border ${r.currentValue==="converged"?"is-active":""}`),ne(l,`Mark Converged${s}`),Se(d,1,`w-full text-left py-[7px] px-[10px] bg-transparent border border-transparent rounded-md text-[12.5px] cursor-pointer transition-[background] duration-[120ms] ease-in-out hover:bg-edf-gris-clair hover:border-border ${r.currentValue==="not_converged"?"is-active":""}`),ne(b,`Mark Not Converged${s}`),Se(x,1,`w-full text-left py-[7px] px-[10px] bg-transparent border border-transparent rounded-md text-[12.5px] cursor-pointer transition-[background] duration-[120ms] ease-in-out hover:bg-edf-gris-clair hover:border-border ${r.currentValue===""?"is-active":""}`),ne(A,`Clear Mark${s}`)}),le("click",o,()=>n("converged")),le("click",d,()=>n("not_converged")),le("click",x,()=>n("")),u(t,i),Ae()}Ke(["click"]);var dc=S(" Refresh",1),fc=S(" ",1),vc=S(" Run",1),gc=S(" Restart",1),hc=S(" Stop",1),pc=S(" Kill",1),mc=S(" Clean",1),_c=S('
        ',1),bc=S('
        ',1);function xc(t,r){Me(r,!0);function a(){return[...Ut()]}async function n(){const v=a();if(!v.length)return;const B=await Xs(v);if(B)try{await On({cases:v,n:B.n,nt:B.nt,maxParallel:B.maxParallel}),r.onRefresh()}catch(X){await We(`Run failed: ${X instanceof Error?X.message:X}`,"Error")}}async function s(){const v=a();if(!v.length)return;const B=await Ys(v);if(B)try{await On({cases:v,n:B.n,nt:B.nt,maxParallel:B.maxParallel,restart:!0,restartMode:B.restartMode,restartValue:B.restartValue}),r.onRefresh()}catch(X){await We(`Restart failed: ${X instanceof Error?X.message:X}`,"Error")}}async function i(){const v=a();if(!(!v.length||!await Dn(`Kill ${v.length} case${v.length>1?"s":""}?`,"Confirm Kill","Kill","danger")))try{await mi(v),r.onRefresh()}catch(X){await We(`Kill failed: ${X instanceof Error?X.message:X}`,"Error")}}async function o(){const v=a();if(!(!v.length||!await Dn(`Stop ${v.length} case${v.length>1?"s":""} gracefully (checkpoint + exit)?`,"Confirm Stop","Stop","danger")))try{await kr({cases:v,action:"stop"}),r.onRefresh(),Cr(`Stop requested for ${v.length} case${v.length>1?"s":""} — will checkpoint and exit`)}catch(X){await We(`Stop failed: ${X instanceof Error?X.message:X}`,"Error")}}async function l(){const v=a();if(v.length)try{await kr({cases:v,action:"checkpoint"}),r.onRefresh(),Cr(`Checkpoint requested for ${v.length} case${v.length>1?"s":""}`)}catch(B){await We(`Checkpoint failed: ${B instanceof Error?B.message:B}`,"Error")}}async function d(){const v=a();if(!v.length)return;const B=await hn("Extend by how many additional time steps?","500","Extend Run");if(B===null)return;const X=parseInt(B,10);if(!Number.isFinite(X)||X<=0){await We("Enter a positive integer number of time steps.","Error");return}try{await kr({cases:v,action:"extend",value:X}),r.onRefresh(),Cr(`Extended ${v.length} case${v.length>1?"s":""} by ${X} time steps`)}catch(ue){await We(`Extend failed: ${ue instanceof Error?ue.message:ue}`,"Error")}}async function b(){const v=a();if(v.length)try{await kr({cases:v,action:"flush"}),Cr(`Flush requested for ${v.length} case${v.length>1?"s":""}`)}catch(B){await We(`Flush failed: ${B instanceof Error?B.message:B}`,"Error")}}async function x(){const v=a();if(!v.length)return;const B=await Qs(v);if(B)try{await _i({cases:v,keepLast:B.keepLast,keepResu:B.keepResu,deleteResu:B.deleteResu,pruneResu:!0}),r.onRefresh(),Wi()}catch(X){await We(`Cleanup failed: ${X instanceof Error?X.message:X}`,"Error")}}function A(){const v=Rr();v.length>0&&v.every(X=>Ut().has(X))?Gn():Kn(v)}function m(v){an(v)}let N=z(ie(tr("status")));Re(()=>{rr("status",e(N))}),Ll(!0);let L=j(()=>{const v=Sr();return v.size>0&&[...v].some(B=>B==="PREPARED"||B==="DONE"||B==="FAILED")}),g=j(()=>{if(!cr("restart"))return!1;const v=Sr();return v.size>0&&[...v].some(B=>B==="DONE"||B==="FAILED")&&Xn()}),c=j(()=>{const v=Sr();return v.size>0&&v.has("RUNNING")}),w=j(()=>{if(!cr("control"))return!1;const v=Sr();return v.size>0&&v.has("RUNNING")});const P=[{label:"Extend",icon:Uo,onClick:d,action:"extend"},{label:"Checkpoint",icon:Xo,onClick:l,action:"checkpoint"},{label:"Flush",icon:Ho,onClick:b,action:"flush"}];let h=j(()=>P.filter(v=>nl(v.action)).map(v=>({label:v.label,icon:v.icon,onClick:v.onClick,disabled:!e(w)}))),y=j(Xn),C=z(ie($l())),_=null;function M(){_&&clearTimeout(_),_=setTimeout(()=>{Al(e(C))},200)}Re(()=>Tl(e(N)));let F=z(!1),T=z(0),q=z(0),I=z(ie([])),O=z("");function V(v,B,X,ue){f(I,Ut().has(v)?[...Ut()]:[v],!0),f(O,ue,!0),f(T,B,!0),f(q,X,!0),f(F,!0)}function G(){f(F,!1)}function Z(v){const B=Rr();if(B.length){if(v.key==="Escape"){Gn(),G();return}if((v.ctrlKey||v.metaKey)&&v.key==="a"){v.preventDefault(),Kn(B);return}if(v.key==="ArrowDown"||v.key==="ArrowUp"){v.preventDefault();const X=v.key==="ArrowDown"?1:-1,ue=Un(),fe=B.indexOf(ue),W=Math.max(0,Math.min(B.length-1,fe+X)),te=B[W];v.shiftKey?sn(nn()||B[0],te,B):Sa(te),Ml(te);return}if(v.key===" "){v.preventDefault();const X=Un();X&&(v.shiftKey?sn(nn()||X,X,Rr()):an(X))}}}var ae=bc();tt("click",it,G),tt("scroll",it,G);var E=K(ae),R=k(E);Ht(R,{eyebrow:"Overview",title:"Status",wide:!0,id:"status-card-shell",actions:B=>{var X=fc(),ue=K(X);{let te=j(Ki);nr(ue,{name:"status",get intervalMs(){return e(te)},get onRefresh(){return r.onRefresh},get checked(){return e(N)},set checked(se){f(N,se,!0)}})}var fe=$(ue,2);{var W=te=>{$e(te,{variant:"primary",onclick:()=>r.onRefresh(),children:(se,de)=>{var ce=dc(),re=K(ce);Te(re,{get icon(){return er}}),ke(),u(se,ce)},$$slots:{default:!0}})};Q(fe,te=>{e(N)||te(W)})}u(B,X)},children:(B,X)=>{var ue=_c(),fe=K(ue),W=k(fe),te=k(W);Xe(te);var se=$(te,2);Wl(se,{}),p(W);var de=$(W,2),ce=k(de),re=k(ce);p(ce);var xe=$(ce,2);{let U=j(()=>!e(L));$e(xe,{variant:"run",size:"sm",onclick:n,get disabled(){return e(U)},children:(ee,oe)=>{var ve=vc(),ye=K(ve);Te(ye,{get icon(){return _a}}),ke(),u(ee,ve)},$$slots:{default:!0}})}var he=$(xe,2);{var Ee=U=>{{let ee=j(()=>!e(g));$e(U,{variant:"warning",size:"sm",onclick:s,get disabled(){return e(ee)},children:(oe,ve)=>{var ye=gc(),ge=K(ye);Te(ge,{get icon(){return Wo}}),ke(),u(oe,ye)},$$slots:{default:!0}})}},pe=j(()=>cr("restart"));Q(he,U=>{e(pe)&&U(Ee)})}var Fe=$(he,2);{var ze=U=>{{let ee=j(()=>!e(w));$e(U,{variant:"warning",size:"sm",onclick:o,get disabled(){return e(ee)},children:(oe,ve)=>{var ye=hc(),ge=K(ye);Te(ge,{get icon(){return Io}}),ke(),u(oe,ye)},$$slots:{default:!0}})}},Qe=j(()=>cr("control"));Q(Fe,U=>{e(Qe)&&U(ze)})}var je=$(Fe,2);{var rt=U=>{xl(U,{get items(){return e(h)}})};Q(je,U=>{e(h).length>0&&U(rt)})}var Le=$(je,2);{let U=j(()=>!e(c));$e(Le,{variant:"danger",size:"sm",onclick:i,get disabled(){return e(U)},children:(ee,oe)=>{var ve=pc(),ye=K(ve);Te(ye,{get icon(){return Oo}}),ke(),u(ee,ve)},$$slots:{default:!0}})}var Pe=$(Le,2);{let U=j(()=>!e(y));$e(Pe,{variant:"secondary",size:"sm",onclick:x,get disabled(){return e(U)},children:(ee,oe)=>{var ve=mc(),ye=K(ve);Te(ye,{get icon(){return Qo}}),ke(),u(ee,ve)},$$slots:{default:!0}})}p(de),p(fe);var Y=$(fe,2);{let U=j(Pa);lc(Y,{get rows(){return e(U)},onContextMenu:V,onToggleAll:A,onToggleRow:m})}J(U=>ne(re,`${U??""} selected`),[()=>Ut().size]),le("input",te,M),et(te,()=>e(C),U=>f(C,U)),u(B,ue)},$$slots:{actions:!0,default:!0}}),p(E);var H=$(E,2);{var D=v=>{uc(v,{get cases(){return e(I)},get x(){return e(T)},get y(){return e(q)},get currentValue(){return e(O)},onClose:G})};Q(H,v=>{e(F)&&v(D)})}le("keydown",E,Z),u(t,ae),Ae()}Ke(["keydown","input"]);var yc=S('
        ');function Qt(t,r){var a=yc(),n=k(a);ft(n,()=>r.children),p(a),u(t,a)}function Cn(t){return t.map(r=>({value:r,label:r}))}var wc=S(''),kc=S(" ",1);function Sn(t,r){Me(r,!0);let a=me(r,"columnLabel",3,"Columns"),n=me(r,"xMinLabel",3,"Iter min"),s=j(()=>Cn(r.allCases)),i=j(()=>r.columns.map(d=>({value:d,label:d}))),o=[{value:"zero",label:"Zero"},{value:"restart",label:"Restart start"},{value:"custom",label:"Custom"}];function l(d){r.onXMinChange(Number(d.target.value)||0)}Qt(t,{children:(d,b)=>{var x=kc(),A=K(x);Ne(A,{text:"Cases",children:(y,C)=>{Gt(y,{class:"w-[160px]",get options(){return e(s)},get selected(){return r.selectedCases},get onchange(){return r.onCasesChange},placeholder:"Select cases..."})}});var m=$(A,2);{var N=y=>{var C=be(),_=K(C);ft(_,()=>r.middleSlot),u(y,C)};Q(m,y=>{r.middleSlot&&y(N)})}var L=$(m,2);Ne(L,{get text(){return a()},children:(y,C)=>{Gt(y,{class:"w-[160px]",get options(){return e(i)},get selected(){return r.selectedColumns},get onchange(){return r.onColumnsChange},placeholder:"Select..."})}});var g=$(L,2);Ne(g,{text:"Start from",children:(y,C)=>{lt(y,{class:"w-[140px]",get options(){return o},get value(){return r.startFrom},onchange:_=>r.onStartFromChange(_)})}});var c=$(g,2);{var w=y=>{Ne(y,{get text(){return n()},children:(C,_)=>{var M=wc();Xe(M),J(()=>vn(M,r.xMin)),le("input",M,l),u(C,M)}})};Q(c,y=>{r.startFrom==="custom"&&y(w)})}var P=$(c,2);{var h=y=>{var C=be(),_=K(C);ft(_,()=>r.extraSlot),u(y,C)};Q(P,y=>{r.extraSlot&&y(h)})}u(d,x)}}),Ae()}Ke(["input"]);var Cc=S('
        '),Sc=S('
        ');function Zt(t,r){let a=me(r,"emptyMessage",3,"");var n=Sc(),s=k(n);{var i=l=>{var d=be(),b=K(d);zr(b,()=>r.svgHtml),u(l,d)},o=l=>{var d=Cc(),b=k(d),x=k(b,!0);p(b),p(d),J(()=>ne(x,a()||"No data to display.")),u(l,d)};Q(s,l=>{r.svgHtml?l(i):l(o,-1)})}p(n),J(()=>we(n,"id",r.id)),u(t,n)}async function $n(t,r="plot.png"){const a=document.getElementById(t),n=a==null?void 0:a.querySelector("svg");if(!n)return;const{width:s,height:i}=$c(n),o=window.devicePixelRatio||1,l=document.createElement("canvas");l.width=s*o,l.height=i*o;const d=l.getContext("2d");if(!d)return;d.scale(o,o);const b=new XMLSerializer().serializeToString(n),x=new Blob([b],{type:"image/svg+xml;charset=utf-8"}),A=URL.createObjectURL(x),m=new Image;m.width=s,m.height=i,await new Promise((L,g)=>{m.onload=()=>{d.drawImage(m,0,0,s,i),URL.revokeObjectURL(A),L()},m.onerror=g,m.src=A});const N=await new Promise(L=>l.toBlob(L,"image/png"));N&&await Ra(N,Pc(r))}function xr(t,r,a="png"){const n=r.length<=3?r.join("_"):`${r.length}_cases`,s=new Date().toISOString().replace(/[:.]/g,"-").slice(0,19);return Ec(`${t}_${n}_${s}.${a}`)}async function Ea(t,r){const a=new Blob([t],{type:"text/csv;charset=utf-8"});await Ra(a,r)}function $c(t){const r=t.getAttribute("viewBox");if(r){const a=r.split(/[\s,]+/).map(Number);if(a.length===4)return{width:a[2],height:a[3]}}return{width:t.width.baseVal.value||900,height:t.height.baseVal.value||500}}async function Ra(t,r){if("showSaveFilePicker"in window)try{const i=await(await window.showSaveFilePicker({suggestedName:r,types:[{description:t.type.startsWith("image/")?"Image":"File",accept:{[t.type]:[`.${r.split(".").pop()}`]}}]})).createWritable();await i.write(t),await i.close();return}catch(s){if((s==null?void 0:s.name)==="AbortError")return}const a=URL.createObjectURL(t),n=document.createElement("a");n.href=a,n.download=r,document.body.appendChild(n),n.click(),document.body.removeChild(n),URL.revokeObjectURL(a)}function Pc(t){return t.endsWith(".png")?t:`${t}.png`}function Ec(t){return t.replace(/[^a-zA-Z0-9._-]/g,"_")}let Na=z(ie([])),Ma=z(ie([])),Aa=z(ie([])),La=z("zero"),Ta=z(0),Fa=z(""),Rc=z(!0);function Nc(){return{selectedCases:e(Na),columns:e(Ma),selectedColumns:e(Aa),startFrom:e(La),iterMin:e(Ta),svgHtml:e(Fa),autoRefresh:e(Rc)}}function Yn(t){f(Na,t,!0)}function Mc(t){f(Ma,t,!0)}function Xr(t){f(Aa,t,!0)}function Ac(t){f(La,t,!0)}function Lc(t){f(Ta,t,!0)}function $r(t){f(Fa,t,!0)}var Tc=S(" Refresh",1),Fc=S(" ",1),Dc=S(" Download as PNG",1),zc=S('
        '),Ic=S('
        ',1),Oc=S('
        '),Hc=S('

        '),jc=S(" ",1);function Vc(t,r){Me(r,!0);let a=j(Nc),n=z("");const s=new Set(["iteration","wall_distance","walldistance"]),i=["velocity","pressure"];async function o(){if(e(a).selectedCases.length)try{const g=await ii(e(a).selectedCases);f(n,"");const c=g.filter(w=>!s.has(w.toLowerCase().replace(/\s+/g,"_")));if(Mc(c),c.length===0){Xr([]),$r("");return}if(e(a).selectedColumns.length===0){const w=c.filter(P=>i.some(h=>P.toLowerCase().includes(h)));Xr(w.length>0?w:[c[0]])}}catch(g){f(n,"Failed to load residual columns"),console.error("Failed to load residual columns:",g)}}async function l(){if(e(a).selectedCases.length&&!((e(a).columns.length===0||e(a).selectedColumns.length===0)&&(await o(),!e(a).selectedColumns.length)))try{let g=0,c=!0;if(e(a).startFrom==="restart"){const P=await wa(e(a).selectedCases),h=Object.values(P.origins).map(y=>y.iteration).filter(y=>y!==void 0&&Number.isFinite(y));g=h.length>0?Math.min(...h):0}else e(a).startFrom==="custom"&&(g=e(a).iterMin);const w=await li(e(a).selectedCases,e(a).selectedColumns,{xMin:g,includeHistory:c});f(n,""),w&&$r(w)}catch(g){f(n,"Failed to load residual plot"),console.error("Failed to load residual plot:",g)}}function d(g){if(Yn(g),g.length===0){$r("");return}o(),l()}function b(g){if(Xr(g),g.length===0){$r("");return}l()}function x(g){Ac(g),l()}function A(g){Lc(g),l()}let m=z(ie(tr("plot")));Re(()=>{rr("plot",e(m))}),Re(()=>{e(m)?mr("residualPlot",l,jn()):vt("residualPlot")});let N=!1;Re(()=>{r.allCases.length>0&&!N&&(N=!0,Yn([...r.allCases]),o().then(()=>l()))});const L=_r(()=>{N&&o().then(()=>l())});vr(()=>{vt("residualPlot"),L()}),Ht(t,{eyebrow:"Diagnostics",title:"Residuals Plot",wide:!0,actions:c=>{var w=Fc(),P=K(w);{let C=j(jn);nr(P,{name:"residualPlot",get intervalMs(){return e(C)},onRefresh:l,get checked(){return e(m)},set checked(_){f(m,_,!0)}})}var h=$(P,2);{var y=C=>{$e(C,{variant:"primary",onclick:l,children:(_,M)=>{var F=Tc(),T=K(F);Te(T,{get icon(){return er}}),ke(),u(_,F)},$$slots:{default:!0}})};Q(h,C=>{e(m)||C(y)})}u(c,w)},children:(c,w)=>{var P=jc(),h=K(P);{var y=F=>{const T=G=>{var Z=zc(),ae=k(Z);{let E=j(()=>!e(a).svgHtml);$e(ae,{variant:"secondary",size:"sm",onclick:()=>$n("plot-holder",xr("residuals",e(a).selectedCases)),get disabled(){return e(E)},children:(R,H)=>{var D=Dc(),v=K(D);Te(v,{get icon(){return pr}}),ke(),u(R,D)},$$slots:{default:!0}})}p(Z),u(G,Z)};var q=Ic(),I=K(q);Sn(I,{prefix:"plot",get allCases(){return r.allCases},get selectedCases(){return e(a).selectedCases},onCasesChange:d,columnLabel:"Variables",get columns(){return e(a).columns},get selectedColumns(){return e(a).selectedColumns},onColumnsChange:b,get startFrom(){return e(a).startFrom},onStartFromChange:x,xMinLabel:"Iter min",get xMin(){return e(a).iterMin},onXMinChange:A,get extraSlot(){return T}});var O=$(I,2),V=k(O);{let G=j(()=>e(a).selectedCases.length===0?"Please select at least one case.":e(a).selectedColumns.length===0?"Please select at least one variable.":"No data to display.");Zt(V,{id:"plot-holder",get svgHtml(){return e(a).svgHtml},get emptyMessage(){return e(G)}})}p(O),u(F,q)},C=F=>{var T=Oc(),q=k(T);Zt(q,{id:"plot-holder",svgHtml:"",emptyMessage:"No data available. Please run a simulation first."}),p(T),u(F,T)};Q(h,F=>{e(a).columns.length>0?F(y):F(C,-1)})}var _=$(h,2);{var M=F=>{var T=Hc(),q=k(T,!0);p(T),J(()=>ne(q,e(n))),u(F,T)};Q(_,F=>{e(n)&&F(M)})}u(c,P)},$$slots:{actions:!0,default:!0}}),Ae()}function Da(t){const{scope:r,getState:a,setState:n,setHasData:s,getAxis:i}=t;async function o(){const m=a();if(m.selectedCases.length)try{let N=await Jr(m.selectedCases,r);if(t.filterFiles&&(N=t.filterFiles(N)),n({files:N}),s(N.length>0),N.length===0){n({file:"",columns:[],selectedColumns:[],positionText:"",svgHtml:""});return}(!m.file||!N.includes(m.file))&&(n({file:N[0]}),await l())}catch(N){console.error(`Failed to load ${r} files:`,N)}}async function l(){const m=a();if(!(!m.selectedCases.length||!m.file))try{const N=await vi(m.selectedCases,[m.file]),L=t.filterColumns?t.filterColumns(N):N;t.onColumnsLoaded?t.onColumnsLoaded(N):n({columns:L});const g=a();if(g.columns.length===0){n({selectedColumns:[],positionText:"",svgHtml:""});return}g.selectedColumns.length===0&&n({selectedColumns:[g.columns[0]]})}catch(N){console.error(`Failed to load ${r} columns:`,N)}}async function d(){let m=a();if(m.selectedCases.length){if(await o(),m=a(),!m.file){n({positionText:"",svgHtml:""});return}if((m.columns.length===0||m.selectedColumns.length===0)&&(await l(),m=a(),!m.selectedColumns.length)){n({positionText:"",svgHtml:""});return}try{let N;const L=a();if(L.startFrom==="restart"){const c=await wa(L.selectedCases),w=i().toLowerCase(),P=w==="t"||w==="time"?"time":"iteration",h=Object.values(c.origins).map(y=>y[P]).filter(y=>y!==void 0&&Number.isFinite(y));N=h.length>0?Math.min(...h):void 0}else L.startFrom==="custom"&&(N=L.xMin);const g=await hi({cases:L.selectedCases,probes:[L.file],columns:L.selectedColumns,axis:i(),timeMin:typeof N=="number"?N:void 0,xMin:N,includeHistory:!0});g&&n({svgHtml:g})}catch(N){console.error(`Failed to load ${r} plot:`,N)}}}async function b(m){if(n({selectedCases:m}),m.length===0){n({svgHtml:""});return}await o(),r==="monitoring"&&await d()}function x(m){if(n({selectedColumns:m}),m.length===0){n({svgHtml:""});return}d()}async function A(m){n({file:m}),await l(),await d()}return{loadFiles:o,loadColumns:l,loadPlot:d,handleCasesChange:b,handleColumnsChange:x,handleFileChange:A}}function za(){return{selectedCases:[],file:"",files:[],columns:[],selectedColumns:[],axis:"time",startFrom:"zero",xMin:0,positionText:"",svgHtml:"",autoRefresh:!0}}let Bt=z("time"),on=z(ie(za())),ln=z(ie({...za(),axis:""})),Uc=z(!0),Tr=z(!1),Fr=z(!1);function Bc(){return e(Bt)}function qc(t){f(Bt,t,!0)}function Kc(){return e(Tr)}function cn(t){f(Tr,t,!0)}function Gc(){return e(Fr)}function un(t){f(Fr,t,!0)}function Wc(){e(Bt)==="time"&&!e(Tr)&&e(Fr)?f(Bt,"profile"):e(Bt)==="profile"&&!e(Fr)&&e(Tr)&&f(Bt,"time")}function Qn(){return e(on)}function Yr(){return e(ln)}function kt(t){f(on,{...e(on),...t},!0)}function At(t){f(ln,{...e(ln),...t},!0)}function Xc(){return e(Uc)}var Yc=S(" Download as PNG",1),Qc=S('
        '),Zc=S("
        "),Jc=S('
        '),eu=S('
        ',1),tu=S('
        ');function ru(t,r){Me(r,!0);let a=me(r,"onRefresh",15),n=j(Qn);const s=new Set(["time","t","iteration","iter"]),i=Da({scope:"monitoring",getState:Qn,setState:kt,setHasData:cn,filterFiles:g=>g.filter(c=>{const w=c.replace(/\.csv$/i,"").toLowerCase();return w!=="coords"&&!w.includes("coordinates")}),filterColumns:g=>g.filter(c=>!s.has(c.toLowerCase())),onColumnsLoaded:g=>{const c=g.filter(w=>!s.has(w.toLowerCase()));kt({columns:c}),o()},getAxis:()=>"time"});async function o(){if(!(!e(n).selectedCases.length||!e(n).file||!e(n).selectedColumns.length))try{const g=[];for(const C of e(n).selectedColumns){const _=await gi(e(n).selectedCases[0],e(n).file,[C]);_.found&&g.push({col:C,x:_.x,y:_.y,z:_.z})}if(!g.length){kt({positionText:""});return}const c=C=>{let _=0;for(const M of C){if(M===void 0)continue;const F=String(M),T=F.indexOf(".");T>=0&&(_=Math.max(_,F.length-T-1))}return _},w=c(g.map(C=>C.x)),P=c(g.map(C=>C.y)),h=c(g.map(C=>C.z)),y=g.map(C=>{const _=[];return C.x!==void 0&&_.push(`x=${C.x.toFixed(w)}`),C.y!==void 0&&_.push(`y=${C.y.toFixed(P)}`),C.z!==void 0&&_.push(`z=${C.z.toFixed(h)}`),`Probe position [${C.col}] : ${_.join(" · ")}`});kt({positionText:y.join(` -`)})}catch{kt({positionText:""})}}function l(g){i.handleColumnsChange(g),g.length>0&&o()}let d=j(()=>e(n).files.map(g=>({value:g,label:g.replace(/\.csv$/i,"").replace(/^probes?_/i,"")}))),b=!1;Re(()=>{r.allCases.length>0&&!b&&(b=!0,kt({selectedCases:[...r.allCases]}),i.loadFiles().then(()=>i.loadPlot()))}),Re(()=>{a(i.loadPlot)});let x=j(()=>e(n).selectedCases.length===0?"Please select at least one case.":e(n).selectedColumns.length===0?"Please select at least one probe.":"No data to display.");var A=be(),m=K(A);{var N=g=>{const c=F=>{Ne(F,{text:"Quantity",children:(T,q)=>{lt(T,{class:"w-[160px]",get options(){return e(d)},get value(){return e(n).file},get onchange(){return i.handleFileChange}})}})},w=F=>{var T=Qc(),q=k(T);{let I=j(()=>!e(n).svgHtml);$e(q,{variant:"secondary",size:"sm",onclick:()=>$n("probe-plot-holder",xr("probe",e(n).selectedCases)),get disabled(){return e(I)},children:(O,V)=>{var G=Yc(),Z=K(G);Te(Z,{get icon(){return pr}}),ke(),u(O,G)},$$slots:{default:!0}})}p(T),u(F,T)};var P=eu(),h=K(P);Sn(h,{prefix:"probe",get allCases(){return r.allCases},get selectedCases(){return e(n).selectedCases},get onCasesChange(){return i.handleCasesChange},get middleSlot(){return c},columnLabel:"Probes",get columns(){return e(n).columns},get selectedColumns(){return e(n).selectedColumns},onColumnsChange:l,get startFrom(){return e(n).startFrom},onStartFromChange:F=>{kt({startFrom:F}),i.loadPlot()},xMinLabel:"Time min",get xMin(){return e(n).xMin},onXMinChange:F=>{kt({xMin:F}),i.loadPlot()},get extraSlot(){return w}});var y=$(h,2);{var C=F=>{var T=Jc();Ye(T,21,()=>e(n).positionText.split(` -`).sort(),fn,(q,I)=>{var O=Zc(),V=k(O,!0);p(O),J(()=>ne(V,e(I))),u(q,O)}),p(T),u(F,T)};Q(y,F=>{e(n).positionText&&F(C)})}var _=$(y,2),M=k(_);Zt(M,{id:"probe-plot-holder",get svgHtml(){return e(n).svgHtml},get emptyMessage(){return e(x)}}),p(_),u(g,P)},L=g=>{var c=tu(),w=k(c);Zt(w,{id:"probe-plot-holder",svgHtml:"",emptyMessage:"No probe data available. Please run a simulation first."}),p(c),u(g,c)};Q(m,g=>{e(n).files.length>0?g(N):g(L,-1)})}u(t,A),Ae()}var nu=S(" ",1),au=S(" Download as PNG",1),su=S('
        '),ou=S('
        ',1),iu=S('
        ');function lu(t,r){Me(r,!0);let a=me(r,"onRefresh",15),n=j(Yr);const s=["s","x","abscissa","distance","arclength","arc_length","curvilinear","length","r","y","z","coord","position"];function i(c){const w=c.map(P=>P.toLowerCase());for(const P of s){const h=w.indexOf(P);if(h>=0)return c[h]}return c[0]??""}const o=Da({scope:"profiles",getState:Yr,setState:At,setHasData:un,onColumnsLoaded:c=>{const w=e(n).axis||i(c),P=c.filter(h=>h!==w).toSorted((h,y)=>h.localeCompare(y));At({columns:P,axis:w,selectedColumns:e(n).selectedColumns.length?e(n).selectedColumns:P.length?[P[0]]:[]})},getAxis:()=>Yr().axis});function l(c){const w=e(n).axis;At({axis:c});const h=[...e(n).columns,...w?[w]:[]].filter(y=>y!==c).toSorted((y,C)=>y.localeCompare(C));At({columns:h}),o.loadPlot()}let d=j(()=>e(n).files.map(c=>({value:c,label:c.replace(/\.csv$/i,"").replace(/^profiles\//i,"").replace(/_/g," ")}))),b=j(()=>[...e(n).axis?[e(n).axis]:[],...e(n).columns].toSorted((c,w)=>c.localeCompare(w)).map(c=>({value:c,label:c}))),x=!1;Re(()=>{r.allCases.length>0&&!x&&(x=!0,At({selectedCases:[...r.allCases]}),o.loadFiles().then(()=>o.loadPlot()))}),Re(()=>{a(o.loadPlot)});let A=j(()=>e(n).selectedCases.length===0?"Please select at least one case.":e(n).selectedColumns.length===0?"Please select at least one value.":"No data to display.");var m=be(),N=K(m);{var L=c=>{const w=M=>{var F=nu(),T=K(F);Ne(T,{text:"Profile",children:(I,O)=>{lt(I,{class:"w-[160px]",get options(){return e(d)},get value(){return e(n).file},get onchange(){return o.handleFileChange}})}});var q=$(T,2);Ne(q,{text:"X axis",children:(I,O)=>{lt(I,{class:"w-[140px]",get options(){return e(b)},get value(){return e(n).axis},onchange:l})}}),u(M,F)},P=M=>{var F=su(),T=k(F);{let q=j(()=>!e(n).svgHtml);$e(T,{variant:"secondary",size:"sm",onclick:()=>$n("profile-plot-holder",xr("profile",e(n).selectedCases)),get disabled(){return e(q)},children:(I,O)=>{var V=au(),G=K(V);Te(G,{get icon(){return pr}}),ke(),u(I,V)},$$slots:{default:!0}})}p(F),u(M,F)};var h=ou(),y=K(h);Sn(y,{prefix:"profile",get allCases(){return r.allCases},get selectedCases(){return e(n).selectedCases},get onCasesChange(){return o.handleCasesChange},get middleSlot(){return w},columnLabel:"Values",get columns(){return e(n).columns},get selectedColumns(){return e(n).selectedColumns},get onColumnsChange(){return o.handleColumnsChange},get startFrom(){return e(n).startFrom},onStartFromChange:M=>{At({startFrom:M}),o.loadPlot()},xMinLabel:"X min",get xMin(){return e(n).xMin},onXMinChange:M=>{At({xMin:M}),o.loadPlot()},get extraSlot(){return P}});var C=$(y,2),_=k(C);Zt(_,{id:"profile-plot-holder",get svgHtml(){return e(n).svgHtml},get emptyMessage(){return e(A)}}),p(C),u(c,h)},g=c=>{var w=iu(),P=k(w);Zt(P,{id:"profile-plot-holder",svgHtml:"",emptyMessage:"No profile data available. Please run a simulation first."}),p(w),u(c,w)};Q(N,c=>{e(n).files.length>0?c(L):c(g,-1)})}u(t,m),Ae()}var cu=S('
        Diagnostics
        '),uu=S(" Refresh",1),du=S(" ",1);function fu(t,r){Me(r,!0);let a=j(Bc),n=j(Xc),s=j(Kc),i=j(Gc),o=z(ie(tr("probe")));Re(()=>{rr("probe",e(o))});let l=z(void 0);function d(){var L;(L=e(l))==null||L()}async function b(){if(r.allCases.length){try{const g=(await Jr(r.allCases,"monitoring")).filter(c=>{const w=c.replace(/\.csv$/i,"").toLowerCase();return w!=="coords"&&!w.includes("coordinates")});cn(g.length>0)}catch{cn(!1)}try{const L=await Jr(r.allCases,"profiles");un(L.length>0)}catch{un(!1)}}}Re(()=>{r.allCases.length>0&&b()}),_r(()=>{b(),d()}),Re(()=>{e(s),e(i),Wc()});function x(L){L==="time"&&!e(s)||L==="profile"&&!e(i)||qc(L)}var A=be(),m=K(A);{var N=L=>{{const g=w=>{var P=cu(),h=$(k(P),2),y=k(h),C=$(y,2);p(h),p(P),J(()=>{Se(y,1,`bg-transparent border-none p-0 m-0 text-lg font-bold tracking-tight transition-colors duration-150 - ${e(s)?e(a)==="time"?"text-edf-bleu-fonce cursor-pointer":"text-edf-gris-moyen cursor-pointer hover:text-muted":"text-edf-gris-moyen cursor-not-allowed opacity-50"}`),y.disabled=!e(s),we(y,"title",e(s)?"":"No probe data available. Run a simulation first."),Se(C,1,`bg-transparent border-none p-0 m-0 text-lg font-bold tracking-tight transition-colors duration-150 - ${e(i)?e(a)==="profile"?"text-edf-bleu-fonce cursor-pointer":"text-edf-gris-moyen cursor-pointer hover:text-muted":"text-edf-gris-moyen cursor-not-allowed opacity-50"}`),C.disabled=!e(i),we(C,"title",e(i)?"":"No profile data available. Run a simulation first.")}),le("click",y,()=>x("time")),le("click",C,()=>x("profile")),u(w,P)};Ht(L,{wide:!0,titleSlot:g,tabs:g,actions:w=>{var P=du(),h=K(P);{let _=j(()=>e(a)==="time"?"probePlot":"profilePlot"),M=j(Gi);nr(h,{get name(){return e(_)},get intervalMs(){return e(M)},onRefresh:d,get checked(){return e(o)},set checked(F){f(o,F,!0)}})}var y=$(h,2);{var C=_=>{$e(_,{variant:"primary",onclick:d,children:(M,F)=>{var T=uu(),q=K(T);Te(q,{get icon(){return er}}),ke(),u(M,T)},$$slots:{default:!0}})};Q(y,_=>{e(o)||_(C)})}u(w,P)},children:(w,P)=>{var h=be(),y=K(h);{var C=M=>{ru(M,{get allCases(){return r.allCases},get onRefresh(){return e(l)},set onRefresh(F){f(l,F,!0)}})},_=M=>{lu(M,{get allCases(){return r.allCases},get onRefresh(){return e(l)},set onRefresh(F){f(l,F,!0)}})};Q(y,M=>{e(a)==="time"?M(C):M(_,-1)})}u(w,h)},$$slots:{tabs:!0,actions:!0,default:!0}})}};Q(m,L=>{e(n)&&L(N)})}u(t,A),Ae()}Ke(["click"]);var vu=S(" Refresh",1),gu=S(" ",1),hu=S(" Download as CSV",1),pu=S('
        ',1),mu=S(" "),_u=S(' '),bu=S(' '),xu=S('
        Case
        '),yu=S('

        '),wu=S(" ",1);function ku(t,r){Me(r,!0);let a=z(ie([])),n=z(ie([])),s=z(!1),i=z(!1),o=z(ie(tr("perf")));Re(()=>{rr("perf",e(o))});const l=5e3;let b=z(ie([{key:"elapsed_time",label:"Elapsed (s)",kind:"time"},{key:"io_time",label:"I/O (s)",kind:"time"},{key:"linear_solver_time",label:"Linear Solver (s)",kind:"time"},{key:"gradients_time",label:"Gradients (s)",kind:"time"},{key:"balances_time",label:"Balances (s)",kind:"time"},{key:"mpi_ranks",label:"MPI Ranks",kind:"int"},{key:"threads",label:"Threads",kind:"int"}])),x=j(()=>r.allCases.map(P=>({value:P,label:P}))),A=j(()=>e(n).length>0);async function m(){var P;if(e(a).length){f(i,!0);try{const h=await In(e(a));(P=h.columns)!=null&&P.length&&f(b,h.columns,!0),f(n,h.records,!0),e(n).length>0&&f(s,!0)}catch(h){console.error("Failed to load perf:",h)}f(i,!1)}}function N(P){if(f(a,P,!0),P.length===0){f(n,[],!0);return}m()}function L(P,h){if(h==null||h==="")return"-";if(P==="text")return h;const y=Number(h);return Number.isFinite(y)?P==="int"?String(Math.round(y)):y.toFixed(3):h}async function g(){if(!e(n).length)return;const P=["case_id",...e(b).map(_=>_.key)],h=e(n).map(_=>[_.case_id,...e(b).map(M=>_[M.key]??"")].join(",")),y=[P.join(","),...h].join(` -`),C=xr("timing_snapshot",e(a),"csv");await Ea(y,C)}let c=!1;Re(()=>{r.allCases.length>0&&!c&&(c=!0,f(a,[...r.allCases],!0),In(r.allCases).then(P=>{var h;(h=P.columns)!=null&&h.length&&f(b,P.columns,!0),f(s,P.records.length>0),f(n,P.records,!0)}).catch(()=>{}))}),Re(()=>{e(o)?mr("perf",m,l):vt("perf")});const w=_r(()=>{c&&m()});vr(()=>{vt("perf"),w()}),Ht(t,{eyebrow:"Performance",title:"Timing Snapshot",wide:!0,actions:h=>{var y=gu(),C=K(y);nr(C,{name:"perf",intervalMs:l,onRefresh:m,get checked(){return e(o)},set checked(F){f(o,F,!0)}});var _=$(C,2);{var M=F=>{$e(F,{variant:"primary",onclick:m,children:(T,q)=>{var I=vu(),O=K(I);Te(O,{get icon(){return er}}),ke(),u(T,I)},$$slots:{default:!0}})};Q(_,F=>{e(o)||F(M)})}u(h,y)},children:(h,y)=>{var C=wu(),_=K(C);{var M=I=>{Qt(I,{children:(O,V)=>{var G=pu(),Z=K(G);Ne(Z,{text:"Cases",children:(R,H)=>{Gt(R,{class:"w-[160px]",get options(){return e(x)},get selected(){return e(a)},onchange:N,placeholder:"Select cases..."})}});var ae=$(Z,2),E=k(ae);{let R=j(()=>!e(A));$e(E,{variant:"secondary",size:"sm",onclick:g,get disabled(){return e(R)},children:(H,D)=>{var v=hu(),B=K(v);Te(B,{get icon(){return pr}}),ke(),u(H,v)},$$slots:{default:!0}})}p(ae),u(O,G)}})};Q(_,I=>{e(s)&&I(M)})}var F=$(_,2);{var T=I=>{var O=xu(),V=k(O),G=k(V),Z=k(G),ae=$(k(Z));Ye(ae,17,()=>e(b),R=>R.key,(R,H)=>{var D=mu(),v=k(D,!0);p(D),J(()=>ne(v,e(H).label)),u(R,D)}),p(Z),p(G);var E=$(G);Ye(E,21,()=>e(n),R=>R.case_id,(R,H)=>{var D=bu(),v=k(D),B=k(v,!0);p(v);var X=$(v);Ye(X,17,()=>e(b),ue=>ue.key,(ue,fe)=>{var W=_u(),te=k(W,!0);p(W),J(se=>ne(te,se),[()=>L(e(fe).kind,e(H)[e(fe).key])]),u(ue,W)}),p(D),J(()=>ne(B,e(H).case_id)),u(R,D)}),p(E),p(V),p(O),u(I,O)},q=I=>{var O=yu(),V=k(O);{var G=ae=>{var E=Ve("Select cases above to view timing information.");u(ae,E)},Z=ae=>{var E=Ve("No performance data available. Please run a simulation first.");u(ae,E)};Q(V,ae=>{e(s)?ae(G):ae(Z,-1)})}p(O),u(I,O)};Q(F,I=>{e(A)?I(T):I(q,-1)})}u(h,C)},$$slots:{actions:!0,default:!0}}),Ae()}const Cu={"&":"&","<":"<",">":">",'"':""","'":"'"};function Ia(t){return t.replace(/[&<>"']/g,r=>Cu[r]??r)}var Su=S("
        "),$u=S('
        ');function Pu(t,r){Me(r,!0);let a=z(void 0);function n(b){const x=Ia(b);if(!r.searchQuery.trim())return x;try{const A=new RegExp(`(${r.searchQuery})`,"gi");return x.replace(A,'$1')}catch{return x}}function s(b){return b==="error"?"tail-sev-error":b==="warn"?"tail-sev-warn":b==="info"?"tail-sev-info":""}function i(){return e(a)?e(a).scrollHeight-e(a).scrollTop-e(a).clientHeight<=24:!0}let o=z(!0);function l(){f(o,i(),!0)}Re(()=>{r.autoScroll&&r.lines.length>0&&e(a)&&e(o)&&Pt().then(()=>{e(a)&&(e(a).scrollTop=e(a).scrollHeight)})});var d=$u();Ye(d,21,()=>r.lines,b=>b.index,(b,x)=>{var A=Su();zr(A,()=>n(e(x).text),!0),p(A),J(m=>Se(A,1,`tail-line ${m??""} ${e(x).isNew?"tail-new":""}`),[()=>s(e(x).severity)]),u(b,A)}),p(d),nt(d,b=>f(a,b),()=>e(a)),tt("scroll",d,l),u(t,d),Ae()}const Eu=/(fatal error|error detected|error reading|error writing|segmentation fault|sigterm|sigsegv|sigkill|abort|killed|terminated|core dumped|traceback|exception|errno)/i,Ru=/(warning|divergence|non-convergence|clipping|negative|nan detected|overflow|underflow)/i;function Nu(t){return Eu.test(t)?"error":Ru.test(t)?"warn":"none"}function Mu(t,r){return r==="all"||r===""?!0:r==="info"?t!=="none":t===r}var Au=S(" Refresh",1),Lu=S(" ",1),Tu=S(''),Fu=S(''),Du=S("    ",1),zu=Ot(''),Iu=Ot(''),Ou=Ot(''),Hu=S(" Resume",1),ju=S(" Pause",1),Vu=S('Case not running'),Uu=S(' 
        ',1),Bu=S('

        No log data available. Please run a simulation first.

        '),qu=S('

        '),Ku=S(" ",1);function Gu(t,r){Me(r,!0);const a=80;let n=z(""),s=z(""),i=z(!1),o=z(ie([])),l=z(a),d=z(ie([])),b=z(ie(new Set)),x=z(!1),A=z(ie(tr("tail")));Re(()=>{rr("tail",e(A))});let m=z(!0),N=z("all"),L=z(""),g=z(""),c=z(void 0),w=j(()=>Cn(r.allCases)),P=j(()=>e(o).map(E=>{const R=E.split("/").pop()??E;return{value:E,label:R}})),h=[{value:"all",label:"All"},{value:"error",label:"Error"},{value:"warn",label:"Warn"}],y=j(()=>e(o).length>0),C=j(()=>yn().some(E=>{var R;return E.case_id===e(n)&&((R=E.status)==null?void 0:R.toUpperCase())==="RUNNING"}));const _={"run_solver.log":1,listing:2,"run_status.running":3,"csauto.stdout":4,"csauto.stderr":5,"performance.log":6};function M(E){const R=E.split("/").pop()??E;return _[R]??99}async function F(){if(e(n))try{const H=(await di(e(n))).filter(D=>{const v=D.split("/").pop()??D;return D.endsWith(".log")||D.endsWith("/summary")||v in _}).sort((D,v)=>M(D)-M(v));if(f(o,H,!0),H.length>0){const D=H[0];!e(s)||!H.includes(e(s))?(f(s,D,!0),f(i,!1)):!e(i)&&M(D)0&&H[H.length-1]===""?H.slice(0,-1):H;if(e(d).length>0){const v=q(e(d),D),B=new Set;for(let X=v;X{let E=e(d).map((R,H)=>({text:R,index:H,severity:Nu(R),isNew:e(b).has(H)}));if(e(N)!=="all"&&(E=E.filter(R=>Mu(R.severity,e(N)))),e(L).trim())try{const R=new RegExp(e(L),"i");E=E.filter(H=>R.test(H.text))}catch{}return E});function O(E){f(n,E,!0),f(s,""),f(i,!1),f(d,[],!0),F().then(()=>T(!0))}function V(E){f(s,E,!0),f(i,!0),f(d,[],!0),T(!0)}function G(){f(x,!e(x)),e(x)||T(!0)}function Z(E){(E.ctrlKey||E.metaKey)&&E.key==="f"&&e(c)&&(E.preventDefault(),e(c).focus())}Re(()=>{r.allCases.length>0&&!e(n)&&(f(n,r.allCases[0],!0),F().then(()=>T(!0)))}),Re(()=>{e(A)&&!e(x)&&e(n)?mr("tail",()=>T(!1),Hn()):vt("tail")});const ae=_r(()=>{e(n)&&F().then(()=>T(!0))});vr(()=>{vt("tail"),ae()}),tt("keydown",it,Z),Ht(t,{eyebrow:"Live",title:"Log Tail",wide:!0,actions:R=>{var H=Lu(),D=K(H);{let X=j(Hn);nr(D,{name:"tail",get intervalMs(){return e(X)},onRefresh:()=>T(!1),get checked(){return e(A)},set checked(ue){f(A,ue,!0)}})}var v=$(D,2);{var B=X=>{$e(X,{variant:"primary",onclick:()=>T(!0),children:(ue,fe)=>{var W=Au(),te=K(W);Te(te,{get icon(){return er}}),ke(),u(ue,W)},$$slots:{default:!0}})};Q(v,X=>{e(A)||X(B)})}u(R,H)},children:(R,H)=>{var D=Ku(),v=K(D);{var B=se=>{Qt(se,{children:(de,ce)=>{var re=Du(),xe=K(re);Ne(xe,{text:"Case",children:(ze,Qe)=>{lt(ze,{class:"w-[130px]",get options(){return e(w)},get value(){return e(n)},onchange:O})}});var he=$(xe,2);Ne(he,{text:"File",children:(ze,Qe)=>{lt(ze,{class:"w-[150px]",get options(){return e(P)},get value(){return e(s)},onchange:V})}});var Ee=$(he,2);Ne(Ee,{text:"Lines",children:(ze,Qe)=>{var je=Tu();Xe(je),le("change",je,()=>T(!0)),et(je,()=>e(l),rt=>f(l,rt)),u(ze,je)}});var pe=$(Ee,2);Ne(pe,{text:"Filter",children:(ze,Qe)=>{var je=Fu();Xe(je),nt(je,rt=>f(c,rt),()=>e(c)),et(je,()=>e(L),rt=>f(L,rt)),u(ze,je)}});var Fe=$(pe,2);Ne(Fe,{text:"Severity",children:(ze,Qe)=>{lt(ze,{class:"w-[90px]",get options(){return h},get value(){return e(N)},onchange:je=>f(N,je,!0)})}}),u(de,re)}})};Q(v,se=>{e(y)&&se(B)})}var X=$(v,2);{var ue=se=>{var de=Uu(),ce=K(de);Pu(ce,{get lines(){return e(I)},get searchQuery(){return e(L)},get autoScroll(){return e(m)}});var re=$(ce,2),xe=k(re),he=k(xe);{var Ee=Y=>{var U=zu();u(Y,U)},pe=Y=>{var U=Iu();u(Y,U)},Fe=Y=>{var U=Ou();u(Y,U)};Q(he,Y=>{e(x)?Y(Ee):e(C)?Y(pe,1):Y(Fe,-1)})}var ze=$(he);p(xe);var Qe=$(xe,2);{var je=Y=>{$e(Y,{variant:"secondary",size:"sm",onclick:G,children:(U,ee)=>{var oe=be(),ve=K(oe);{var ye=_e=>{var Ce=Hu(),Ie=K(Ce);Te(Ie,{get icon(){return _a}}),ke(),u(_e,Ce)},ge=_e=>{var Ce=ju(),Ie=K(Ce);Te(Ie,{get icon(){return Bo}}),ke(),u(_e,Ce)};Q(ve,_e=>{e(x)?_e(ye):_e(ge,-1)})}u(U,oe)},$$slots:{default:!0}})},rt=Y=>{var U=Vu();u(Y,U)};Q(Qe,Y=>{e(C)?Y(je):Y(rt,-1)})}var Le=$(Qe,2),Pe=k(Le);It(Pe,{get checked(){return e(m)},onchange:Y=>f(m,Y,!0),size:14,label:"Auto-scroll",labelFirst:!0}),p(Le),p(re),J(()=>ne(ze,` ${e(I).length??""} / ${e(d).length??""}`)),u(se,de)},fe=se=>{var de=Bu();u(se,de)};Q(X,se=>{e(d).length>0?se(ue):se(fe,-1)})}var W=$(X,2);{var te=se=>{var de=qu(),ce=k(de,!0);p(de),J(()=>ne(ce,e(g))),u(se,de)};Q(W,se=>{e(g)&&se(te)})}u(R,D)},$$slots:{actions:!0,default:!0}}),Ae()}Ke(["change"]);function Wu(t,r=3){var N,L;const a=t.split(` -`),n=[];let s=0,i=0,o=!1;for(const g of a){if(g.startsWith("===")||g.startsWith("---")||g.startsWith("+++"))continue;const c=g.match(/^@@ -(\d+),?\d* \+(\d+),?\d* @@/);if(c){s=parseInt(c[1],10)-1,i=parseInt(c[2],10)-1,o=!0;continue}if(o)if(g.startsWith("-"))s++,n.push({type:"del",leftNum:s,rightNum:null,leftContent:g.slice(1),rightContent:""});else if(g.startsWith("+"))i++,n.push({type:"add",leftNum:null,rightNum:i,leftContent:"",rightContent:g.slice(1)});else{s++,i++;const w=g.startsWith(" ")?g.slice(1):g;n.push({type:"equal",leftNum:s,rightNum:i,leftContent:w,rightContent:w})}}const l=[];let d=0;for(;d=0&&g-A>1&&x.push({kind:"separator",skipped:g-A-1});const c=l[g].type!=="equal",w=c&&!m;x.push({kind:"line",row:l[g],hunkStart:w}),m=c,A=g}if(A=0&&x.push({kind:"separator",skipped:l.length-1-A}),x.length>0&&x[0].kind==="line"){const g=((N=x[0].row)==null?void 0:N.leftNum)??0,c=((L=x[0].row)==null?void 0:L.rightNum)??0,w=Math.max(g,c)-1;w>0&&x.unshift({kind:"separator",skipped:w})}return x}var Xu=S('
        '),Yu=S('
        '),Qu=S(' ',1),Zu=S('No matches'),Ju=S('
        '),ed=S('

        Files are identical.

        '),td=S('
        Loading...
        '),rd=S('
        ');function nd(t,r){Me(r,!0);let a=me(r,"loading",3,!1),n=z(void 0),s=j(()=>Wu(r.diffText)),i=j(()=>{const Y=[];return e(s).forEach((U,ee)=>{U.hunkStart&&Y.push(ee)}),Y}),o=j(()=>e(i).length>0),l=j(()=>{var U;const Y=new Array(e(s).length).fill(-1);for(let ee=0;ee{r.diffText!==b&&(b=r.diffText,f(d,-1))});let x=j(()=>{if(!r.search.trim())return[];try{const Y=new RegExp(r.search,"i"),U=[];return e(s).forEach((ee,oe)=>{ee.kind==="line"&&ee.row&&(Y.test(ee.row.leftContent)||Y.test(ee.row.rightContent))&&U.push(oe)}),U}catch{return[]}}),A=z(-1),m="";Re(()=>{r.search!==m&&(m=r.search,f(A,e(x).length>0?0:-1,!0))});async function N(Y){var oe;f(A,Y,!0),await Pt();const U=e(x)[Y],ee=(oe=e(h))==null?void 0:oe.querySelector(`[data-item-idx="${U}"]`);if(ee&&e(h)&&e(y)){const ve=e(h).getBoundingClientRect(),ge=ee.getBoundingClientRect().top-ve.top+e(h).scrollTop-e(h).clientHeight/3;_=!0,e(h).scrollTop=ge,e(y).scrollTop=ge,requestAnimationFrame(()=>{_=!1})}}function L(){e(A)>0&&N(e(A)-1)}function g(){e(A)<0&&e(x).length>0?N(0):e(A)$1`)}catch{return ee}}function w(Y,U){return Y==="equal"?"":Y==="del"&&U==="left"?"bg-[rgba(214,67,10,0.08)] text-edf-orange-fonce":Y==="del"&&U==="right"?"bg-[rgba(48,122,16,0.08)] text-edf-vert-fonce":Y==="add"&&U==="left"?"bg-edf-gris-clair":Y==="add"&&U==="right"?"bg-[rgba(48,122,16,0.08)] text-edf-vert-fonce":""}function P(Y,U){return Y==="del"&&U==="left"?"rgb(251,237,233)":Y==="del"&&U==="right"?"rgb(238,247,236)":Y==="add"&&U==="left"?"var(--color-edf-gris-clair)":Y==="add"&&U==="right"?"rgb(238,247,236)":"white"}let h=z(void 0),y=z(void 0),C=!1,_=!1;function M(Y){C||_||!e(h)||!e(y)||(C=!0,Y==="left"?(e(y).scrollTop=e(h).scrollTop,e(y).scrollLeft=e(h).scrollLeft):(e(h).scrollTop=e(y).scrollTop,e(h).scrollLeft=e(y).scrollLeft),requestAnimationFrame(()=>{C=!1}))}async function F(Y){var ee;f(d,Y,!0),await Pt();const U=(ee=e(h))==null?void 0:ee.querySelector(`[data-hunk-start="${Y}"]`);if(U&&e(h)&&e(y)){_=!0;const oe=e(h).getBoundingClientRect(),ye=U.getBoundingClientRect().top-oe.top+e(h).scrollTop-e(h).clientHeight/3;e(h).scrollTop=ye,e(y).scrollTop=ye,requestAnimationFrame(()=>{_=!1})}}function T(){e(d)>0&&F(e(d)-1)}function q(){e(d)<0?F(0):e(d)=0&&f(d,U,!0)}function O(Y){Y.target instanceof HTMLInputElement||(Y.key==="n"&&!Y.shiftKey?(Y.preventDefault(),q()):Y.key==="N"||Y.key==="n"&&Y.shiftKey?(Y.preventDefault(),T()):Y.key==="j"?(Y.preventDefault(),g()):(Y.key==="J"||Y.key==="j"&&Y.shiftKey)&&(Y.preventDefault(),L()))}var V=rd();{const Y=(U,ee=ws)=>{var oe=be(),ve=K(oe);Ye(ve,17,()=>e(s),fn,(ye,ge,_e)=>{const Ce=j(()=>e(i).indexOf(_e)),Ie=j(()=>e(l)[_e]>=0&&e(l)[_e]===e(d)),Ge=j(()=>{var at,qe;return ee()==="left"?(at=e(ge).row)==null?void 0:at.leftNum:(qe=e(ge).row)==null?void 0:qe.rightNum}),gt=j(()=>{var at,qe;return ee()==="left"?((at=e(ge).row)==null?void 0:at.leftContent)??"":((qe=e(ge).row)==null?void 0:qe.rightContent)??""});var jt=be(),jr=K(jt);{var Je=at=>{var qe=Xu(),Nt=$(k(qe),2),Vr=k(Nt);p(Nt),p(qe),J(()=>ne(Vr,`... ${e(ge).skipped??""} lines hidden ...`)),u(at,qe)},ut=at=>{var qe=Yu(),Nt=k(qe),Vr=k(Nt,!0);p(Nt);var Pn=$(Nt,2);zr(Pn,()=>c(e(gt),e(A)>=0&&e(x)[e(A)]===_e),!0),p(Pn),p(qe),J((yt,Mt,yr,Oa,Ha)=>{Se(qe,1,`flex w-full ${yt??""} ${Mt??""}`),Ze(qe,e(Ie)?"background-color: rgba(16,87,200,0.12); color: rgb(16,87,200);":""),we(qe,"role",yr),we(qe,"tabindex",Oa),we(qe,"data-hunk-start",ee()==="left"&&e(Ce)>=0?e(Ce):void 0),we(qe,"data-item-idx",ee()==="left"?_e:void 0),Ze(Nt,`background: ${Ha??""}; color: ${e(Ie)?"white":"var(--color-muted)"};`),ne(Vr,e(Ge)??"")},[()=>w(e(ge).row.type,ee()),()=>e(ge).row.type!=="equal"||e(x).includes(_e)?"cursor-pointer":"",()=>e(ge).row.type!=="equal"||e(x).includes(_e)?"button":void 0,()=>e(ge).row.type!=="equal"||e(x).includes(_e)?0:void 0,()=>e(Ie)?"rgb(16,87,200)":P(e(ge).row.type,ee())]),le("click",qe,()=>{var Mt;((Mt=e(ge).row)==null?void 0:Mt.type)!=="equal"&&I(_e);const yt=e(x).indexOf(_e);yt>=0&&f(A,yt,!0)}),le("keydown",qe,yt=>{var Mt;if(yt.key==="Enter"||yt.key===" "){yt.preventDefault(),((Mt=e(ge).row)==null?void 0:Mt.type)!=="equal"&&I(_e);const yr=e(x).indexOf(_e);yr>=0&&f(A,yr,!0)}}),u(at,qe)};Q(jr,at=>{e(ge).kind==="separator"?at(Je):e(ge).row&&at(ut,1)})}u(ye,jt)}),u(U,oe)};var G=k(V),Z=k(G),ae=k(Z),E=k(ae,!0);p(ae);var R=$(ae,2),H=k(R,!0);p(R),p(Z);var D=$(Z,2),v=k(D),B=k(v,!0);p(v);var X=$(v,2),ue=k(X,!0);p(X),p(D),p(G);var fe=$(G,2),W=k(fe),te=k(W);Xe(te);var se=$(te,2);{var de=U=>{var ee=Qu(),oe=K(ee);{let _e=j(()=>e(A)<=0);$e(oe,{variant:"secondary",size:"sm",onclick:L,get disabled(){return e(_e)},children:(Ce,Ie)=>{ke();var Ge=Ve("Prev");u(Ce,Ge)},$$slots:{default:!0}})}var ve=$(oe,2),ye=k(ve);p(ve);var ge=$(ve,2);{let _e=j(()=>e(A)>=e(x).length-1);$e(ge,{variant:"secondary",size:"sm",onclick:g,get disabled(){return e(_e)},children:(Ce,Ie)=>{ke();var Ge=Ve("Next");u(Ce,Ge)},$$slots:{default:!0}})}J(()=>ne(ye,`${e(A)>=0?e(A)+1:"–"} / ${e(x).length??""} occurrence${e(x).length!==1?"s":""}`)),u(U,ee)},ce=j(()=>r.search.trim()&&e(x).length>0),re=U=>{var ee=Zu();u(U,ee)},xe=j(()=>r.search.trim());Q(se,U=>{e(ce)?U(de):e(xe)&&U(re,1)})}p(W);var he=$(W,2),Ee=k(he);{let U=j(()=>e(i).length===0||e(d)<=0);$e(Ee,{variant:"secondary",size:"sm",onclick:T,get disabled(){return e(U)},children:(ee,oe)=>{ke();var ve=Ve("Prev");u(ee,ve)},$$slots:{default:!0}})}var pe=$(Ee,2),Fe=k(pe);p(pe);var ze=$(pe,2);{let U=j(()=>e(i).length===0||e(d)>=e(i).length-1);$e(ze,{variant:"secondary",size:"sm",onclick:q,get disabled(){return e(U)},children:(ee,oe)=>{ke();var ve=Ve("Next");u(ee,ve)},$$slots:{default:!0}})}p(he),p(fe);var Qe=$(fe,2);{var je=U=>{var ee=Ju(),oe=k(ee),ve=k(oe),ye=k(ve);Y(ye,()=>"left"),p(ve),p(oe),nt(oe,Ie=>f(h,Ie),()=>e(h));var ge=$(oe,2),_e=k(ge),Ce=k(_e);Y(Ce,()=>"right"),p(_e),p(ge),nt(ge,Ie=>f(y,Ie),()=>e(y)),p(ee),tt("scroll",oe,()=>M("left")),tt("scroll",ge,()=>M("right")),u(U,ee)},rt=U=>{var ee=ed();u(U,ee)};Q(Qe,U=>{e(o)?U(je):U(rt,-1)})}var Le=$(Qe,2);{var Pe=U=>{var ee=td();u(U,ee)};Q(Le,U=>{a()&&U(Pe)})}p(V),nt(V,U=>f(n,U),()=>e(n)),J(()=>{ne(E,r.leftLabel),ne(H,r.kind),ne(B,r.rightLabel),ne(ue,r.kind),vn(te,r.search),ne(Fe,`${e(d)>=0?e(d)+1:"–"} / ${e(i).length??""} diff${e(i).length!==1?"s":""}`)}),le("input",te,U=>r.onSearchChange(U.target.value)),le("keydown",te,U=>{U.key==="Enter"&&(U.preventDefault(),g())})}le("keydown",V,O),u(t,V),Ae()}Ke(["keydown","click","input"]);var ad=S(" ",1),sd=S('

        Please select two different cases to compare.

        '),od=S('

        Select two cases to compare.

        '),id=S(' '),ld=S('
        Parameter
        '),cd=S('

        All parameters are identical.

        '),ud=S('
        ',1),dd=S('

        '),fd=S('

        Loading...

        '),vd=S(" ",1),gd=S(" ",1);function hd(t,r){Me(r,!0);let a=z(""),n=z(""),s=z(""),i=z(""),o=z(""),l=z(!1),d=z(!1),b=z(""),x=j(()=>r.allCases.map(_=>({value:_,label:_})));const A=[{value:"setup.xml",label:"setup.xml"},{value:"doe_row.csv",label:"doe_row.csv"},{value:"run_solver.log",label:"run_solver.log"},{value:"performance.log",label:"performance.log"}];let m=j(()=>{var _;return((_=Ft())==null?void 0:_.compare_kinds)??A});Re(()=>{var _;e(m).some(M=>M.value===e(s))||f(s,((_=e(m)[0])==null?void 0:_.value)??"",!0)});let N=z(!1),L=j(()=>e(a)&&e(n)&&e(a)!==e(n));function g(){const _=e(a);f(a,e(n),!0),f(n,_,!0)}async function c(){if(e(L)){f(l,!0),f(b,"");try{const _=await pi({cases:[e(a),e(n)],base:e(a),kind:e(s)});f(o,_,!0),f(d,!0)}catch(_){console.error("Failed to load diff:",_),f(o,""),f(d,!1);const M=_ instanceof Error?_.message:String(_);f(b,M.includes("404")?`File "${e(s)}" not found for one of the selected cases. It may not have been run yet.`:"Failed to load comparison.",!0)}f(l,!1)}}Re(()=>{e(a)&&e(n)&&e(a)!==e(n)&&e(s)?c():e(a)&&e(n)&&e(a)===e(n)&&(f(o,""),f(d,!0))});let w=!1;Re(()=>{r.allCases.length>=2&&!w?(w=!0,f(a,r.allCases[0],!0),f(n,r.allCases[1],!0)):r.allCases.length===1&&!w&&(w=!0,f(a,r.allCases[0],!0))});let P=j(wn),h=j(()=>{if(!e(a)||!e(n)||e(a)===e(n)||e(P).length===0)return[];const _=yn(),M=_.find(T=>T.case_id===e(a)),F=_.find(T=>T.case_id===e(n));return!M&&!F?[]:e(P).map(T=>{var O,V;const q=((O=M==null?void 0:M.doe)==null?void 0:O[T])!=null&&String(M.doe[T])!==""?String(M.doe[T]):"—",I=((V=F==null?void 0:F.doe)==null?void 0:V[T])!=null&&String(F.doe[T])!==""?String(F.doe[T]):"—";return{param:T,left:q,right:I,differs:q!==I}})}),y=j(()=>e(N)?e(h):e(h).filter(_=>_.differs)),C=j(()=>e(h).filter(_=>_.differs).length);Ht(t,{eyebrow:"Compare",title:"Side-by-Side Comparison",wide:!0,children:(_,M)=>{var F=gd(),T=K(F);Qt(T,{children:(G,Z)=>{var ae=ad(),E=K(ae);Ne(E,{text:"First case",children:(D,v)=>{lt(D,{class:"w-32.5",get options(){return e(x)},get value(){return e(a)},onchange:B=>f(a,B,!0),placeholder:"Select..."})}});var R=$(E,2);{let D=j(()=>!e(a)&&!e(n));$e(R,{variant:"secondary",size:"sm",onclick:g,get disabled(){return e(D)},children:(v,B)=>{Te(v,{get icon(){return Fo}})},$$slots:{default:!0}})}var H=$(R,2);Ne(H,{text:"Second case",children:(D,v)=>{lt(D,{class:"w-32.5",get options(){return e(x)},get value(){return e(n)},onchange:B=>f(n,B,!0),placeholder:"Select..."})}}),u(G,ae)}});var q=$(T,2);{var I=G=>{var Z=sd();u(G,Z)},O=G=>{var Z=od();u(G,Z)},V=G=>{var Z=vd(),ae=K(Z);{var E=X=>{var ue=ud(),fe=K(ue),W=k(fe),te=k(W);p(W);var se=$(W,2),de=k(se,!0);p(se),p(fe);var ce=$(fe,2);{var re=he=>{var Ee=ld(),pe=k(Ee),Fe=k(pe),ze=k(Fe),Qe=k(ze),je=k(Qe,!0);p(Qe);var rt=$(Qe,2),Le=k(rt,!0);p(rt),p(ze),p(Fe);var Pe=$(Fe);Ye(Pe,21,()=>e(y),Y=>Y.param,(Y,U)=>{var ee=id(),oe=k(ee),ve=k(oe,!0);p(oe);var ye=$(oe),ge=k(ye,!0);p(ye);var _e=$(ye),Ce=k(_e,!0);p(_e),p(ee),J(()=>{Se(oe,1,dt(e(U).differs?"text-edf-orange-fonce bg-[rgba(214,67,10,0.04)]":"")),ne(ve,e(U).left),ne(ge,e(U).param),Se(_e,1,dt(e(U).differs?"text-edf-vert-fonce bg-[rgba(48,122,16,0.04)]":"")),ne(Ce,e(U).right)}),u(Y,ee)}),p(Pe),p(pe),p(Ee),J(()=>{ne(je,e(a)),ne(Le,e(n))}),u(he,Ee)},xe=he=>{var Ee=cd();u(he,Ee)};Q(ce,he=>{e(y).length>0?he(re):he(xe,-1)})}J(()=>{ne(te,`${e(C)??""} difference${e(C)!==1?"s":""} out of ${e(h).length??""} - parameters`),ne(de,e(N)?"Show differences only":"Show all parameters")}),le("click",se,()=>f(N,!e(N))),u(X,ue)};Q(ae,X=>{e(h).length>0&&X(E)})}var R=$(ae,2);Qt(R,{children:(X,ue)=>{Ne(X,{text:"File",children:(fe,W)=>{lt(fe,{class:"w-37.5",get options(){return e(m)},get value(){return e(s)},onchange:te=>f(s,te,!0)})}})}});var H=$(R,2);{var D=X=>{var ue=dd(),fe=k(ue,!0);p(ue),J(()=>ne(fe,e(b))),u(X,ue)},v=X=>{nd(X,{get diffText(){return e(o)},get leftLabel(){return e(a)},get rightLabel(){return e(n)},get kind(){return e(s)},get search(){return e(i)},get loading(){return e(l)},onSearchChange:ue=>f(i,ue,!0)})},B=X=>{var ue=fd();u(X,ue)};Q(H,X=>{e(b)?X(D):e(d)?X(v,1):e(l)&&X(B,2)})}u(G,Z)};Q(q,G=>{e(a)&&e(n)&&e(a)===e(n)?G(I):!e(a)||!e(n)?G(O,1):G(V,-1)})}u(_,F)},$$slots:{default:!0}}),Ae()}Ke(["click"]);var pd=S(" Refresh",1),md=S(" ",1),_d=S(''),bd=S(''),xd=S(" Download as CSV",1),yd=S('
        ',1),wd=S(" ",1),kd=S(""),Cd=S('
        Sort by:
        '),Sd=S('

        No errors found. Select cases and adjust filters above.

        '),$d=S(' '),Pd=S('NEW'),Ed=S('
        '),Rd=S('
        '),Nd=S(' '),Md=S('
        '),Ad=S('

        '),Ld=S("
        ",1);function Td(t,r){Me(r,!0);const a=6,n=["csauto.stderr","run_solver.log","listing"];let s=z(ie([])),i=z(ie([...n])),o=!1;Re(()=>{var te;const W=(te=Ft())==null?void 0:te.error_files;W!=null&&W.length&&!o&&f(i,[...W],!0)});let l=z("all"),d=z(""),b=z(a),x=z(!1),A=z(""),m=z(ie(tr("errors")));Re(()=>{rr("errors",e(m))});let N=z(ie([])),L=z(ie(new Set));function g(W){return W.toLowerCase().replace(/[0-9]+/g,"#").replace(/0x[0-9a-f]+/gi,"#").replace(/\s+/g," ").trim()}function c(W){const te=W.line_html.replace(/<[^>]*>/g,"").slice(0,120);return`${W.case_id}|${W.file}|${W.severity}|${g(te)}`}function w(W){const te=new Map;for(const se of W){const de=c(se),ce=te.get(de);ce?ce.count++:te.set(de,{...se,count:1,fingerprint:de,isNew:!e(L).has(de)})}return Array.from(te.values())}async function P(){if(!(!e(s).length||!e(i).length)){f(x,!0);try{const W=await ci({cases:e(s),files:e(i),context:e(b),sev:e(l)==="all"?"":e(l),q:e(d)});f(A,"");const te=w(W.items);f(N,W.items,!0);const se=new Set(te.map(de=>de.fingerprint));f(L,se,!0),f(h,te,!0)}catch(W){f(A,"Failed to load errors"),console.error("Failed to load errors:",W)}finally{f(x,!1)}}}let h=z(ie([])),y=null;function C(){y&&clearTimeout(y),y=setTimeout(P,250)}function _(W){return W==="error"?"error-sev-error":W==="warn"?"error-sev-warn":"error-sev-info"}let M=j(()=>Cn(r.allCases));const F=["csauto.stderr","run_solver.log","listing","csauto.stdout"];let T=j(()=>{var W;return(((W=Ft())==null?void 0:W.error_files)??F).map(te=>({value:te,label:te}))}),q=[{value:"all",label:"All"},{value:"error",label:"Error"},{value:"warn",label:"Warn"},{value:"info",label:"Info"}];function I(W){if(f(s,W,!0),W.length===0){f(h,[],!0),f(N,[],!0);return}P()}function O(W){if(o=!0,f(i,W,!0),W.length===0){f(h,[],!0),f(N,[],!0);return}P()}function V(W){f(l,W,!0),P()}function G(){P()}let Z=!1;Re(()=>{r.allCases.length>0&&!Z&&(Z=!0,f(s,[...r.allCases],!0),P())}),Re(()=>{e(m)?mr("errors",P,Vn()):vt("errors")});const ae=_r(()=>{Z&&P()});vr(()=>{vt("errors"),ae()});let E=z(ie(new Set));function R(W){const te=new Set(e(E));te.has(W)?te.delete(W):te.add(W),f(E,te,!0)}let H=z("severity"),D=z("desc");const v={info:0,warn:1,error:2};let B=j(()=>{const W=[...e(h)];return W.sort((te,se)=>{let de=0;return e(H)==="severity"?de=(v[te.severity]??9)-(v[se.severity]??9):e(H)==="count"?de=te.count-se.count:de=te[e(H)].localeCompare(se[e(H)]),e(D)==="asc"?de:-de}),W});const X={severity:"desc",count:"desc",case_id:"asc",file:"asc"};function ue(W){e(H)===W?f(D,e(D)==="asc"?"desc":"asc",!0):(f(H,W,!0),f(D,X[W],!0))}function fe(){if(!e(h).length)return;const W=["case_id","file","severity","count","is_new","line_text"],te=e(B).map(ce=>[ce.case_id,ce.file,ce.severity,ce.count,ce.isNew?"yes":"no",`"${ce.line_html.replace(/<[^>]*>/g,"").replace(/"/g,'""')}"`].join(",")),se=[W.join(","),...te].join(` -`),de=xr("errors",e(s),"csv");Ea(se,de)}Ht(t,{eyebrow:"Diagnostics",title:"Recent Errors",wide:!0,actions:te=>{var se=md(),de=K(se);{let xe=j(Vn);nr(de,{name:"errors",get intervalMs(){return e(xe)},onRefresh:P,get checked(){return e(m)},set checked(he){f(m,he,!0)}})}var ce=$(de,2);{var re=xe=>{$e(xe,{variant:"primary",onclick:P,children:(he,Ee)=>{var pe=pd(),Fe=K(pe);Te(Fe,{get icon(){return er}}),ke(),u(he,pe)},$$slots:{default:!0}})};Q(ce,xe=>{e(m)||xe(re)})}u(te,se)},children:(te,se)=>{var de=Ld(),ce=K(de);Qt(ce,{children:(Le,Pe)=>{var Y=yd(),U=K(Y);Ne(U,{text:"Cases",children:(Ce,Ie)=>{Gt(Ce,{class:"w-[160px]",get options(){return e(M)},get selected(){return e(s)},onchange:I,placeholder:"Select cases..."})}});var ee=$(U,2);Ne(ee,{text:"Files",children:(Ce,Ie)=>{Gt(Ce,{class:"w-[160px]",get options(){return e(T)},get selected(){return e(i)},onchange:O,placeholder:"Select files..."})}});var oe=$(ee,2);Ne(oe,{text:"Severity",children:(Ce,Ie)=>{lt(Ce,{class:"w-[90px]",get options(){return q},get value(){return e(l)},onchange:V})}});var ve=$(oe,2);Ne(ve,{text:"Search",children:(Ce,Ie)=>{var Ge=_d();Xe(Ge),le("input",Ge,C),et(Ge,()=>e(d),gt=>f(d,gt)),u(Ce,Ge)}});var ye=$(ve,2);Ne(ye,{text:"Context",children:(Ce,Ie)=>{var Ge=bd();Xe(Ge),le("change",Ge,G),et(Ge,()=>e(b),gt=>f(b,gt)),u(Ce,Ge)}});var ge=$(ye,2),_e=k(ge);{let Ce=j(()=>e(h).length===0);$e(_e,{variant:"secondary",size:"sm",onclick:fe,get disabled(){return e(Ce)},children:(Ie,Ge)=>{var gt=xd(),jt=K(gt);Te(jt,{get icon(){return pr}}),ke(),u(Ie,gt)},$$slots:{default:!0}})}p(ge),u(Le,Y)}});var re=$(ce,2);{var xe=Le=>{var Pe=Cd(),Y=$(k(Pe),2);Ye(Y,16,()=>[{key:"severity",label:"Severity"},{key:"count",label:"Count"},{key:"case_id",label:"Case"},{key:"file",label:"File"}],U=>U.key,(U,ee)=>{var oe=kd(),ve=k(oe,!0),ye=$(ve);{var ge=_e=>{var Ce=wd(),Ie=$(K(Ce));{let Ge=j(()=>e(D)==="asc"?Do:To);Te(Ie,{get icon(){return e(Ge)},size:12})}u(_e,Ce)};Q(ye,_e=>{e(H)===ee.key&&_e(ge)})}p(oe),J(()=>{Se(oe,1,`cursor-pointer bg-transparent border-none text-xs hover:underline ${e(H)===ee.key?"text-edf-bleu-fonce font-bold":"text-muted"}`),ne(ve,ee.label)}),le("click",oe,()=>ue(ee.key)),u(U,oe)}),p(Pe),u(Le,Pe)};Q(re,Le=>{e(B).length>0&&Le(xe)})}var he=$(re,2),Ee=k(he);{var pe=Le=>{var Pe=Sd();u(Le,Pe)};Q(Ee,Le=>{e(B).length===0&&Le(pe)})}var Fe=$(Ee,2);Ye(Fe,17,()=>e(B),Le=>Le.fingerprint,(Le,Pe)=>{var Y=Rd(),U=k(Y),ee=k(U),oe=k(ee);{let Je=j(()=>e(E).has(e(Pe).fingerprint)?pn:zo);Te(oe,{get icon(){return e(Je)},size:14})}p(ee);var ve=$(ee,2),ye=k(ve);p(ve);var ge=$(ve,2),_e=k(ge);{var Ce=Je=>{var ut=$d(),at=k(ut);p(ut),J(()=>ne(at,`${e(Pe).count??""}x`)),u(Je,ut)};Q(_e,Je=>{e(Pe).count>1&&Je(Ce)})}var Ie=$(_e,2);{var Ge=Je=>{var ut=Pd();u(Je,ut)};Q(Ie,Je=>{e(Pe).isNew&&Je(Ge)})}p(ge),p(U);var gt=$(U,2);{var jt=Je=>{var ut=Ed();zr(ut,()=>e(Pe).line_html,!0),p(ut),u(Je,ut)},jr=j(()=>e(E).has(e(Pe).fingerprint));Q(gt,Je=>{e(jr)&&Je(jt)})}p(Y),J(Je=>{Se(Y,1,`error-item ${Je??""}`),ne(ye,`${e(Pe).case_id??""} / ${e(Pe).file??""} : ${e(Pe).severity??""}`)},[()=>_(e(Pe).severity)]),le("click",U,()=>R(e(Pe).fingerprint)),u(Le,Y)}),p(he);var ze=$(he,2);{var Qe=Le=>{var Pe=Md(),Y=k(Pe),U=k(Y);p(Y);var ee=$(Y,2);{var oe=ye=>{var ge=Nd(),_e=k(ge);p(ge),J(Ce=>ne(_e,`${Ce??""} new`),[()=>e(h).filter(Ce=>Ce.isNew).length]),u(ye,ge)},ve=j(()=>e(h).some(ye=>ye.isNew));Q(ee,ye=>{e(ve)&&ye(oe)})}p(Pe),J(()=>ne(U,`${e(h).length??""} unique / ${e(N).length??""} total`)),u(Le,Pe)};Q(ze,Le=>{e(B).length>0&&Le(Qe)})}var je=$(ze,2);{var rt=Le=>{var Pe=Ad(),Y=k(Pe,!0);p(Pe),J(()=>ne(Y,e(A))),u(Le,Pe)};Q(je,Le=>{e(A)&&Le(rt)})}J(()=>Se(he,1,`error-list ${e(x)?"opacity-50 pointer-events-none":""}`)),u(te,de)},$$slots:{actions:!0,default:!0}}),Ae()}Ke(["input","change","click"]);var Fd=S('
        Developed by Simvia
        ',1);function Bd(t,r){Me(r,!0);let a=z(ie({totalCases:0,shownCases:0,totalRunning:0,shownRunning:0,totalConverged:0,shownConverged:0})),n=z(ie([])),s=z(null);const i=v=>e(s)===null||e(s).includes(v);async function o(v){var ue;const B=`/favicon-${v}.svg`;try{const fe=await fetch(B);if(!fe.ok||!((ue=fe.headers.get("content-type"))!=null&&ue.includes("svg")))return}catch{return}const X=document.querySelector('link[rel="icon"]');X&&(X.href=B)}async function l(){try{const v=await si();Rl(v.rows),Nl(v.doe_columns),f(n,v.rows.map(B=>B.case_id),!0),f(a,Ul($a(),yn()),!0)}catch(v){console.error("Failed to load status:",v)}}Zn(()=>{l(),oi().then(v=>{rl(v),f(s,v.panels,!0),o(v.solver)}).catch(()=>{})});var d=Fd(),b=K(d);Mi(b,{});var x=$(b,2);Di(x,{});var A=$(x,2);ll(A,{get totalCases(){return e(a).totalCases},get shownCases(){return e(a).shownCases},get totalRunning(){return e(a).totalRunning},get shownRunning(){return e(a).shownRunning},get totalConverged(){return e(a).totalConverged},get shownConverged(){return e(a).shownConverged}});var m=$(A,2),N=k(m);{var L=v=>{xc(v,{onRefresh:l})},g=j(()=>i("status"));Q(N,v=>{e(g)&&v(L)})}var c=$(N,2);{var w=v=>{Vc(v,{get allCases(){return e(n)}})},P=j(()=>i("residuals"));Q(c,v=>{e(P)&&v(w)})}var h=$(c,2);{var y=v=>{fu(v,{get allCases(){return e(n)}})},C=j(()=>i("probes"));Q(h,v=>{e(C)&&v(y)})}var _=$(h,2);{var M=v=>{ku(v,{get allCases(){return e(n)}})},F=j(()=>i("performance"));Q(_,v=>{e(F)&&v(M)})}var T=$(_,2);{var q=v=>{hd(v,{get allCases(){return e(n)}})},I=j(()=>i("compare"));Q(T,v=>{e(I)&&v(q)})}var O=$(T,2);{var V=v=>{Gu(v,{get allCases(){return e(n)}})},G=j(()=>i("tail"));Q(O,v=>{e(G)&&v(V)})}var Z=$(O,2);{var ae=v=>{Td(v,{get allCases(){return e(n)}})},E=j(()=>i("errors"));Q(Z,v=>{e(E)&&v(ae)})}p(m);var R=$(m,2),H=$(k(R),2),D=k(H);p(H),p(R),J(()=>we(D,"src",cl)),u(t,d),Ae()}export{Bd as component}; diff --git a/frontend/dist/_app/version.json b/frontend/dist/_app/version.json index 5535285..809ec1f 100644 --- a/frontend/dist/_app/version.json +++ b/frontend/dist/_app/version.json @@ -1 +1 @@ -{"version":"1789130391568"} \ No newline at end of file +{"version":"1791370257369"} \ No newline at end of file diff --git a/frontend/dist/index.html b/frontend/dist/index.html index c32cd83..53feced 100644 --- a/frontend/dist/index.html +++ b/frontend/dist/index.html @@ -5,11 +5,11 @@ csauto by Simvia - - + + - + @@ -20,15 +20,15 @@ @@ -39,13 +38,16 @@ style="padding-inline: max(16px, calc((100vw - 1200px) / 2));" >
        - {#if !getAppConfig() || getAppConfig()?.solver === "code_saturne"} - CODE_SATURNE - {:else if getAppConfig()?.solver === "code_aster"} - CODE_ASTER - {:else} + + {#if config?.logo} + {config.solver} + {:else if config} {getAppConfig()?.solver}{config.solver} {/if}
        diff --git a/frontend/src/lib/components/performance/PerformanceCard.svelte b/frontend/src/lib/components/performance/PerformanceCard.svelte index c30b4bc..7acd978 100644 --- a/frontend/src/lib/components/performance/PerformanceCard.svelte +++ b/frontend/src/lib/components/performance/PerformanceCard.svelte @@ -1,7 +1,7 @@ @@ -103,25 +92,25 @@ />
        - {#if showPanel("status")} + {#if hasPanel("status")} {/if} - {#if showPanel("residuals")} + {#if hasPanel("residuals")} {/if} - {#if showPanel("probes")} + {#if hasPanel("probes")} {/if} - {#if showPanel("performance")} + {#if hasPanel("performance")} {/if} - {#if showPanel("compare")} + {#if hasPanel("compare")} {/if} - {#if showPanel("tail")} + {#if hasPanel("tail")} {/if} - {#if showPanel("errors")} + {#if hasPanel("errors")} {/if}
        diff --git a/frontend/static/code-aster.svg b/frontend/static/code-aster.svg deleted file mode 100644 index 0bf402f..0000000 --- a/frontend/static/code-aster.svg +++ /dev/null @@ -1,40 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/frontend/static/code-saturne.svg b/frontend/static/code-saturne.svg deleted file mode 100644 index 25da861..0000000 --- a/frontend/static/code-saturne.svg +++ /dev/null @@ -1,44 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/frontend/static/favicon-code_aster.svg b/frontend/static/favicon-code_aster.svg deleted file mode 100644 index baf0ec0..0000000 --- a/frontend/static/favicon-code_aster.svg +++ /dev/null @@ -1,40 +0,0 @@ - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/frontend/static/favicon-code_saturne.svg b/frontend/static/favicon-code_saturne.svg deleted file mode 100644 index dc6e4fa..0000000 --- a/frontend/static/favicon-code_saturne.svg +++ /dev/null @@ -1,40 +0,0 @@ - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/tests/unit/test_adapter_conformance.py b/tests/unit/test_adapter_conformance.py index 1a7095e..89cebe4 100644 --- a/tests/unit/test_adapter_conformance.py +++ b/tests/unit/test_adapter_conformance.py @@ -99,8 +99,9 @@ def test_capabilities_come_with_what_they_need(adapter) -> None: if "control" in caps: assert adapter._provides("apply_control"), "control_actions need apply_control" for options in (adapter.control_actions, adapter.restart_modes, adapter.compare_kinds): - names = [option[0] for option in options] - assert len(names) == len(set(names)), "duplicate names" + for field in (0, 1): # names identify options, labels tell them apart in the dashboard + values = [option[field] for option in options] + assert len(values) == len(set(values)), f"duplicate names or labels in {options}" def test_launch_command_for_every_supported_runtime(adapter, finished_case: Path) -> None: diff --git a/tests/unit/test_solver_boundary.py b/tests/unit/test_solver_boundary.py index 9079748..88e5c78 100644 --- a/tests/unit/test_solver_boundary.py +++ b/tests/unit/test_solver_boundary.py @@ -64,3 +64,22 @@ def test_generic_module_has_no_solver_literals(module_path: Path) -> None: def test_accepted_residue_names_existing_modules() -> None: for rel in ACCEPTED_RESIDUE: assert rel == "*" or (PACKAGE_DIR / rel).is_file(), rel + + +# The dashboard source gets the same scan. Its residue: the HTTP verb POST, and +# the Probes panel's Profiles view, a generic view fed by list_profile_files. +FRONTEND_DIR = PACKAGE_DIR.parent / "frontend" / "src" +FRONTEND_FILES = sorted(p for p in FRONTEND_DIR.rglob("*") if p.suffix in {".svelte", ".ts", ".js"}) +FRONTEND_RESIDUE = ("POST", "profiles") + + +@pytest.mark.parametrize("path", FRONTEND_FILES, ids=lambda p: p.relative_to(FRONTEND_DIR).as_posix()) +def test_dashboard_source_has_no_solver_literals(path: Path) -> None: + hits: list[str] = [] + for lineno, line in enumerate(path.read_text(encoding="utf-8").splitlines(), start=1): + scrubbed = line + for allowed in FRONTEND_RESIDUE: + scrubbed = scrubbed.replace(allowed, "") + if TOKEN_RE.search(scrubbed): + hits.append(f"{path.relative_to(FRONTEND_DIR)}:{lineno}: {line.strip()}") + assert not hits, "solver-specific literals in the dashboard source:\n" + "\n".join(hits) diff --git a/tests/web/test_adapter_api.py b/tests/web/test_adapter_api.py index 2ed9533..de4bb38 100644 --- a/tests/web/test_adapter_api.py +++ b/tests/web/test_adapter_api.py @@ -78,6 +78,7 @@ def test_solver_images(client_for, stub_case) -> None: response = client_for(get_solver_adapter("code_saturne")).get("/api/solver_logo") assert response.status_code == 200 assert response.headers["content-type"].startswith("image/svg+xml") + assert response.headers["cache-control"] == "no-cache" def test_control_values_follow_the_declared_kind(client_for, stub_case, monkeypatch) -> None: From 576ecce7c2f535344e19870a6c315f717e0c91b1 Mon Sep 17 00:00:00 2001 From: Ulysse Bouchet Date: Wed, 7 Oct 2026 17:24:41 +0200 Subject: [PATCH 11/21] fix: unescape \{name} in files without placeholders, keep failed rows from leaving half-made cases, and show tail -n lines in full prepare rendered only files holding a placeholder, so a .comm whose only braces were escaped kept its backslashes. A row with an empty value raised after its case folder was copied, which then blocked every later prepare. csauto tail read only the last 4 KB before keeping -n lines. --- csauto/doe.py | 20 ++++++++++---------- csauto/logs.py | 19 ++++++------------- tests/unit/test_doe.py | 25 +++++++++++++++++++++++++ tests/unit/test_logs.py | 15 +++++++++++++++ 4 files changed, 56 insertions(+), 23 deletions(-) diff --git a/csauto/doe.py b/csauto/doe.py index 3a101d7..f86dd8b 100644 --- a/csauto/doe.py +++ b/csauto/doe.py @@ -10,6 +10,7 @@ from .registry import DOE_ROW_FILENAME, STATUS_PREPARED, registry_transaction, update_case from .template import ( + ESCAPED_PLACEHOLDER_PATTERN, extract_condition_variables, extract_placeholders, render_template, @@ -188,7 +189,8 @@ def _collect_render_targets(template_dir: Path, adapter) -> list[tuple[Path, str continue placeholders = extract_placeholders(text) cond_vars = extract_condition_variables(text) - if not placeholders and not cond_vars: + # A file whose only braces are escaped still needs rendering, to drop the backslashes. + if not placeholders and not cond_vars and not ESCAPED_PLACEHOLDER_PATTERN.search(text): continue targets.append((relative, text, placeholders, cond_vars)) return targets @@ -388,17 +390,15 @@ def generate_cases( _ensure_registry_case(registry, case_id, case_dir) continue - shutil.copytree(template_dir, case_dir) - rendered = render_template(setup_text, row, case_id) - - _write_text(case_dir / setup_relative, rendered) + # Render everything first: a bad DOE value must not leave a half-made case behind. + rendered_files = {setup_relative: render_template(setup_text, row, case_id)} if run_cfg_template_text and run_cfg_relative: - _write_text(case_dir / run_cfg_relative, render_template(run_cfg_template_text, row, case_id)) + rendered_files[run_cfg_relative] = render_template(run_cfg_template_text, row, case_id) for rel_path, extra_text, _placeholders_set, _ in extra_targets: - target_path = case_dir / rel_path - if not target_path.exists(): - continue - _write_text(target_path, render_template(extra_text, row, case_id)) + rendered_files[rel_path] = render_template(extra_text, row, case_id) + shutil.copytree(template_dir, case_dir) + for rel_path, text in rendered_files.items(): + _write_text(case_dir / rel_path, text) _write_doe_row(case_dir, headers, row, case_id) _ensure_registry_case(registry, case_id, case_dir) diff --git a/csauto/logs.py b/csauto/logs.py index 597ce4f..5676d20 100644 --- a/csauto/logs.py +++ b/csauto/logs.py @@ -438,21 +438,14 @@ def tail_log( raise FileNotFoundError(f"File {file_name} not found for {case}") print(f"Tailing {path}") + if lines > 0: + sys.stdout.writelines(read_tail_lines(path, lines)) + sys.stdout.flush() + if not follow: + return with path.open("r", encoding="utf-8", errors="ignore") as handle: + handle.seek(0, os.SEEK_END) try: - handle.seek(0, os.SEEK_END) - file_size = handle.tell() - handle.seek(max(0, file_size - 4096)) - buffer = handle.readlines() - if lines > 0: - buffer = buffer[-lines:] - for line in buffer: - sys.stdout.write(line) - sys.stdout.flush() - - if not follow: - return - while True: where = handle.tell() line = handle.readline() diff --git a/tests/unit/test_doe.py b/tests/unit/test_doe.py index 6ce3cc6..c0ce3fc 100644 --- a/tests/unit/test_doe.py +++ b/tests/unit/test_doe.py @@ -130,3 +130,28 @@ def test_missing_column_error_names_the_file_and_the_escape(tmp_path: Path) -> N generate_cases(["x"], [{"x": "1"}], template_dir, tmp_path / "RUNS", adapter=get_solver_adapter("code_aster")) assert "i in study.comm" in str(excinfo.value) assert "\\{i}" in str(excinfo.value) + + +def test_escaped_braces_are_unescaped_even_without_placeholders(tmp_path: Path) -> None: + from csauto.solvers import get_solver_adapter + + template_dir = tmp_path / "TEMPLATE" + template_dir.mkdir() + (template_dir / "study.export").write_text("F comm study.comm D 1\nP x {x}\n", encoding="utf-8") + (template_dir / "study.comm").write_text("print(f'step \\{i}')\n", encoding="utf-8") + generate_cases(["x"], [{"x": "1"}], template_dir, tmp_path / "RUNS", adapter=get_solver_adapter("code_aster")) + assert (tmp_path / "RUNS" / "case0001" / "study.comm").read_text(encoding="utf-8") == "print(f'step {i}')\n" + + +def test_a_bad_doe_value_leaves_no_half_made_case(tmp_path: Path) -> None: + from csauto.solvers import get_solver_adapter + + template_dir = tmp_path / "TEMPLATE" + template_dir.mkdir() + (template_dir / "stub.toml").write_text("steps = {steps}\n", encoding="utf-8") + runs = tmp_path / "RUNS" + with pytest.raises(ValueError, match="Missing placeholder values"): + generate_cases(["steps"], [{"steps": ""}], template_dir, runs, adapter=get_solver_adapter("stub")) + assert not (runs / "case0001").exists() + generate_cases(["steps"], [{"steps": "3"}], template_dir, runs, adapter=get_solver_adapter("stub")) + assert (runs / "case0001" / "stub.toml").read_text(encoding="utf-8") == "steps = 3\n" diff --git a/tests/unit/test_logs.py b/tests/unit/test_logs.py index 043e01e..b9473bc 100644 --- a/tests/unit/test_logs.py +++ b/tests/unit/test_logs.py @@ -89,3 +89,18 @@ def locate_case_file(self, case_dir, name): items = collect_recent_errors(runs_dir, ["case0001"], adapter=adapter) assert len(items) == 1 + + +def test_tail_prints_the_requested_number_of_lines(tmp_path: Path, capsys) -> None: + from csauto.logs import tail_log + from csauto.solvers import get_solver_adapter + + case_dir = tmp_path / "RUNS" / "case0001" + case_dir.mkdir(parents=True) + (case_dir / "csauto.stdout").write_text("".join(f"line {i:04d} {'x' * 70}\n" for i in range(500)), encoding="utf-8") + tail_log( + tmp_path / "RUNS", "case0001", "csauto.stdout", lines=200, follow=False, adapter=get_solver_adapter("stub") + ) + printed = capsys.readouterr().out.splitlines()[1:] + assert len(printed) == 200 + assert printed[0].startswith("line 0300") and printed[-1].startswith("line 0499") From 93ae6abcf1fdec61208b5d12236b28ad1a5c7587 Mon Sep 17 00:00:00 2001 From: Ulysse Bouchet Date: Wed, 7 Oct 2026 17:24:41 +0200 Subject: [PATCH 12/21] docs: describe the adapter-driven design for users and adapter authors Rewrite the solver guide around one adapter class, a conformance sample and recipes for common solver shapes; describe the boundary as it is in architecture.md; update the CLI, API, configuration, template, lifecycle, web UI and troubleshooting pages, the README and the examples; record the changes in the changelog. Remove claims the code does not back. --- CHANGELOG.md | 39 ++- CONTRIBUTING.md | 2 +- README.md | 45 ++-- docs/README.md | 26 +- docs/adding-a-solver.md | 380 ++++++++++++++++++------------ docs/api.md | 326 ++++++++++++++++--------- docs/architecture.md | 129 +++++----- docs/cli.md | 215 ++++++++++------- docs/concepts.md | 108 +++++---- docs/config.md | 63 +++-- docs/doe-format.md | 32 ++- docs/formats.md | 70 +++++- docs/limitations.md | 40 ++-- docs/quickstart.md | 75 +++--- docs/run-lifecycle.md | 138 +++++++---- docs/task-cookbook.md | 118 ++++++---- docs/troubleshooting.md | 118 +++++++--- docs/web-ui.md | 124 +++++----- examples/codeaster-cube/README.md | 67 ++++-- examples/single-case/README.md | 33 +-- tests/README.md | 24 +- 21 files changed, 1379 insertions(+), 793 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 510b928..c6219d0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,14 +6,34 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/), and this ## [Unreleased] -Make the dashboard follow what each solver can actually do: panels and action buttons are now derived from the solver adapter instead of being shown for every solver. +Make csauto ready for solvers other than code_saturne: one adapter class describes a solver, the CLI and the dashboard read everything from it, and code_aster now runs on the same launch path as code_saturne. Panels and action buttons follow what each solver can actually do. + +### Added +- An adapter conformance suite (`tests/unit/test_adapter_conformance.py`): every registered solver is checked against a sample finished case, so a new adapter learns what the dashboard would miss before a user does. Real runs of the shipped code_saturne and code_aster examples in their docker images are available with `CSAUTO_DOCKER_TESTS=1` (`tests/integration/test_docker_solvers.py`) +- Campaigns record their solver: `csauto prepare` writes `RUNS/campaign.json`, every later command on that folder uses it from any directory, and `prepare` refuses to mix two solvers in one folder +- Runs record their exit status (`.csauto.exitcode`): when the solver's logs give no verdict, exit status 0 means DONE, anything else FAILED. An adapter no longer has to implement `detect_outcome` +- Adapter declarations for what used to be code_saturne assumptions: `supported_runtimes`, `container_setup` (shell commands run in the container before the solver), `prepare_launch` (files written before each launch), `restart_modes`, typed `ControlAction` entries, `default_residual_columns`, `logo_file` and `icon_file`, and `read_probe_file` for probe formats other than CSV +- `\{name}` in a template keeps a literal `{name}`, for Python f-strings and sets in code_aster `.comm` files +- API: `/api/tail_files` (the Log Tail file list), `/api/tail_lines` (each line with the severity the solver's anomaly patterns give it), `/api/solver_logo` and `/api/solver_icon`; `/api/app_config` gains `restart_modes`, `default_residual_columns`, `logo` and `icon` ### Changed +- `SolverAdapterBase` and the `SolverAdapter` protocol are merged into one base class, `SolverAdapter`. `run_argv` receives the case folder, and the solver starts inside it in every runtime; `gui_argv` receives the setup file's path relative to the case +- Docker runs use `--entrypoint` and `--rm`, so solver images no longer need the solver as their entrypoint and stopped containers no longer pile up. Containers mount the campaign folder at `/mnt` instead of the image user's home, where the solvers wrote `.cache`, `.config` and `.tmp_run_aster` into the campaign folder +- `csauto control RUNS CASE ACTION [VALUE]` replaces `--stop`, `--extend N`, `--checkpoint` and `--flush`; the actions come from the solver and `csauto doctor` lists them. `/api/app_config` returns `control_actions` as `{name, label, value_label, value_kind}` objects and `/api/control_case` checks the value against them +- Restart modes come from the solver: `/api/run_case` refuses other names (the `iteration`, `iter`, `time` and `tmax` aliases are gone) and accepts a `restart_path` naming the run to restart from +- `docker_image` defaults to the solver's own image; it used to default to `simvia/code_saturne` whatever the solver +- A run stays RUNNING until its process or Slurm job ends, even after its log prints a verdict, so its launch slot is not reused and Kill still reaches it +- Clean only deletes the folders the adapter reports as runs (`list_run_dirs`) and never touches RUNNING or PENDING cases; a finished case returns to PREPARED only when Clean deleted all its runs, not after a logs-only clean +- Cases are found from the registry and their `doe_row.csv` instead of folder names starting with `case`, so custom case ids work with `doctor`, `run`, `serve` and `cleanup` +- `/api/perf` returns the solver's own timing columns +- code_aster: runs `run_aster` through the shared launch path, so the native runtime and Slurm work and the docker command is properly quoted; `n` and `nt` are applied through `.csauto.export`, a copy of the case's export written at each launch (the case's export is never modified, so `csauto prepare` can extend a launched campaign); the verdict is read from `csauto.stdout`; `RESU` holds each case's single run; `MESH` is the only shared folder and is referenced as `../MESH` (the example was updated); the Compare panel offers the export file; code_aster message boxes are flagged in Recent Errors +- The stub solver reads its step count from `stub.toml` instead of misusing `nt` +- The dashboard reads everything solver-specific from the server: the Control menu lists the solver's actions, the Restart dialog its modes and the run to restart from, the Log Tail its log files with severities computed from the solver's patterns, and the header its logo and favicon (now shipped with the adapter in `csauto/solvers/logos/` instead of `frontend/static`). Labels no longer assume code_saturne ("Run folders", "Results (MB)"), and the residual plot preselects the solver's default curves - Dashboard panels and action buttons are derived from what the solver adapter implements, rather than declared: a panel appears when the adapter provides what feeds it (`find_residuals_files`, `list_probe_files`, or a non-empty `compare_kinds` / `performance_columns` / `control_actions`), and the Restart, Stop, control and Open GUI controls follow the same rule. Solvers other than code_saturne lose the panels and buttons they could never feed: code_aster and the stub solver now show Status, Compare, Log Tail and Recent Errors only. code_saturne is unchanged - `csauto doctor` reports the panels and capabilities derived for the configured solver - `/api/probes` takes `scope=probes` instead of `scope=monitoring` (a code_saturne directory name); `profiles` is unchanged. `/api/tail` defaults to the solver's own main log instead of `listing`, and the Log Tail file priority comes from the new adapter attribute `tail_file_names`, exposed as `tail_files` in `/api/app_config` - code_saturne conventions (log names, outcome, progress and restart patterns, the `RESU` results layout, the `performance.log` parser, setup.xml and run.cfg discovery) moved from `logs.py`, `probes.py`, `residuals.py` and `template.py` into the code_saturne adapter, which now drives the generic log engine with its own vocabulary. CFD anomaly warnings (`divergence`, `cfl`, `clipping`, ...) and the "No error detected" exception now apply to code_saturne only, so Recent Errors no longer flags them for other solvers -- The solver boundary test now scans every module outside `csauto/solvers/` for a wider set of code_saturne conventions (`listing`, `monitoring`, `run_solver.log`, `performance.log`, ...), with the deliberate residue listed in one named allowlist. The leaks it found are gone: the read-only `MESH` mount is the new adapter attribute `readonly_shared_dir_names`, `csauto tail` defaults to the solver's main log instead of `listing`, and `create_fastapi_app` defaults to the solver's docker image +- The solver boundary test now scans every module outside `csauto/solvers/` for a wider set of code_saturne conventions (`listing`, `monitoring`, `run_solver.log`, `performance.log`, ...), with the deliberate residue listed in one named allowlist. The leaks it found are gone: the read-only `MESH` mount is the new adapter attribute `readonly_shared_dir_names`, and `csauto tail` defaults to the solver's main log instead of `listing` - Dashboard tabs are now declared by each solver adapter in `dashboard_panels`, and by nothing else: an adapter may leave out a tab it could feed, and Status, Log Tail and Recent Errors are ordinary entries rather than imposed. A test fails when an adapter declares a tab it cannot feed or an unknown tab name. `capabilities` stays derived. No visible change for any shipped solver ### Fixed @@ -22,7 +42,20 @@ Make the dashboard follow what each solver can actually do: panels and action bu - Opening the solver GUI on a case whose shared dirs are symlinks (the default since `mesh_mode = "symlink"` became the default in 0.4.1) left those symlinks dangling inside the container: `build_gui_command` (docker) and the singularity branch of `build_runtime_gui_command` mounted only the runs dir, unlike their `run` counterparts which also bind the symlink targets. Both now bind them the same way, `MESH` read-only and `POST` writable - Requesting a restart on a solver without restart support returned HTTP 500 "Launch error", a client error reported as a server fault; it now returns HTTP 400 naming the solver - Live control on a solver declaring no control action reported "Invalid action (expected one of [])"; both the API and the CLI now name the solver -- code_aster's Compare panel offered an empty file selector; it now offers `doe_row.csv` +- code_aster's Compare panel offered an empty file selector; it now offers the export file and `doe_row.csv` +- Every run of the shipped code_aster example ended FAILED: its export declares its own message file, so csauto never found the log it read the verdict from +- Kill could stop another campaign's container: for runs without a recorded container (native, apptainer, Slurm, or never started) it searched docker for any container labelled with the case's name, which every campaign shares. It now only searches for docker runs, and only containers of the same campaign +- `sbatch --wrap` submissions requested no resources, so an MPI run got a single task; they now request `--ntasks` and `--cpus-per-task` +- A launch the solver refused (a restart without a checkpoint, an unsupported runtime) left the case PENDING with no way back and skipped the rest of the batch. The case keeps its previous status, the other cases still launch, and the error lists the refused cases +- `csauto run` with a relative runs folder broke docker launches (the container id file path was relative to the wrong folder) +- A PID reused by another process (after a reboot, for example) kept a finished case RUNNING; the process start time is now checked against the launch time +- Template rendering silently dropped non-UTF-8 bytes (Latin-1 accents in French comments) and read large binaries in full; files now keep their bytes, and binaries are detected from their first bytes +- An adapter anomaly pattern with a label other than `error`, `warn` or `info` made Recent Errors fail with HTTP 500; such labels are now refused when the adapter is defined +- Probe plots ignored a `Time` or `TIME` axis column, and the probe position fell back to the first coordinate row for a probe it could not match +- Residual rows without an `iteration` column were all drawn at x = 0; they are now plotted in row order, with a warning +- The Log Tail never offered `csauto.stdout` and `csauto.stderr`, so it stayed empty for solvers that log to their console and for runs that failed before writing a results folder +- When `/api/app_config` failed once (for example before the API token was entered), the dashboard showed the full code_saturne interface until a reload. It now shows only Status, Log Tail and Recent Errors until the solver's description loads, and fetches it again with a growing delay or as soon as a token is saved +- The Log Tail's case selector disappeared when the selected case had no log yet, leaving the panel stuck on that case ## [0.5.0] - 2026-08-03 diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 3a60b93..857025a 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -27,7 +27,7 @@ By participating in this project, you agree to abide by our [Code of Conduct](CO ### Adding a New Solver -Merge requests adding support for new solvers are gladly welcome! csauto's solver-specific logic (commands, log parsing, file conventions, dashboard columns and panels) lives behind a single `SolverAdapter` class, so supporting a new solver means writing one adapter — no changes to the orchestration core or the frontend. Follow the step-by-step guide in [docs/adding-a-solver.md](docs/adding-a-solver.md), and use the built-in `stub` adapter and `tests/unit/test_solver_boundary.py` as references for the expected shape. +Merge requests adding support for new solvers are gladly welcome! csauto knows a solver through one `SolverAdapter` class that says how to start it, where its files are, and how to read its output. Adding a solver means writing that class, registering its name in `csauto/solvers/__init__.py`, and adding a sample finished case to `tests/unit/test_adapter_conformance.py`, which checks the adapter against it. Follow the step-by-step guide in [docs/adding-a-solver.md](docs/adding-a-solver.md); the built-in `stub` adapter (`csauto/solvers/stub.py`) is the smallest complete example. ### Improving Documentation diff --git a/README.md b/README.md index 207c31e..6d4c2e3 100644 --- a/README.md +++ b/README.md @@ -13,13 +13,13 @@ This project is in early development. Expect breaking changes until v1.0. ## Description -**csauto** automates [code_saturne](https://www.code-saturne.org/) CFD simulation campaigns. +**csauto** automates [code_saturne](https://www.code-saturne.org/) CFD and [code_aster](https://www.code-aster.org/) finite-element simulation campaigns. It offers: - Generation of tens or hundreds of cases from one template + one CSV, in seconds - Local and Slurm job execution with status tracking -- A web dashboard for monitoring residuals, probes, logs, and job status in real time -- Restart from checkpoint, live case steering (stop/extend/checkpoint without killing), input file comparison, and cleanup utilities +- A web dashboard for monitoring job status, logs, and errors in real time, plus residuals, probes, and timings for code_saturne +- Input file comparison and cleanup utilities, plus restart from checkpoint and live case steering (stop/extend/checkpoint without killing) for code_saturne No manual case duplication. No directory juggling. Just simulations. @@ -37,7 +37,7 @@ bash -c "$(curl -fsSL https://raw.githubusercontent.com/simvia-tech/csauto/main/ source ~/.bashrc # or: source ~/.zshrc ``` -To update an existing installation, re-run the same command — the script detects the existing install, pulls the latest changes, and reinstalls. +To update an existing installation, re-run the same command: the script detects the existing install, pulls the latest changes, and reinstalls.
        Manual installation (for contributors or custom locations) @@ -72,13 +72,13 @@ csauto --help ### Prerequisites -You need at least one code_saturne runtime: +You need at least one runtime for your solver: | Runtime | Requirement | |---------------|--------------------------------------------------| -| `native` | `code_saturne` binary in PATH or set via config | +| `native` | The solver's executable (`code_saturne`, or `run_aster` for code_aster) in PATH or set via `saturne_bin` | | `singularity` | Apptainer/Singularity + a `.sif` image | -| `docker` | Docker engine + image | +| `docker` | Docker engine; the image defaults to the solver's own (`simvia/code_saturne`, `simvia/code_aster:17.4.0`) | ## Usage @@ -98,7 +98,7 @@ csauto doctor RUNS csauto serve RUNS --host 127.0.0.1 --port 8000 ``` -Open [http://127.0.0.1:8000](http://127.0.0.1:8000), then launch runs from the **Status** panel: `Ctrl+A` → **Run Selected**. +Open [http://127.0.0.1:8000](http://127.0.0.1:8000), then launch runs from the **Status** panel: `Ctrl+A` → **Run**. See [docs/doe-format.md](docs/doe-format.md) for the `doe.csv` format and the `csauto doe` generator (factorial/LHS/Sobol/CCD). @@ -113,27 +113,30 @@ my-campaign/ │ └── setup.xml ← uses {u_inlet}, {turbulence_model}, etc. └── RUNS/ ← generated by csauto prepare ├── registry.json + ├── campaign.json ← the solver the campaign was prepared for ├── case0001/ └── case0002/ ``` +The solver defaults to code_saturne. For code_aster, set `solver = "code_aster"` in `csauto.toml` and see [examples/codeaster-cube](examples/codeaster-cube/README.md). Later commands on `RUNS` use the solver recorded in `RUNS/campaign.json`, from any directory. + ### CLI commands -The web UI (`csauto serve`) is the primary interface for runtime monitoring and operations — launching, steering, killing, restarting, comparing, and inspecting cases. The CLI covers initial setup (`prepare`, `doctor`), data export (`residuals`, `perf`), and offers terminal alternatives for common actions. +The web UI (`csauto serve`) is the primary interface for runtime monitoring and operations: launching, steering, killing, restarting, comparing, and inspecting cases. The CLI covers initial setup (`prepare`, `doctor`), data export (`residuals`, `perf`), and offers terminal alternatives for common actions. | Command | Description | UI equivalent | |-------------|---------------------------------------------------|----------------------------| -| `prepare` | Generate cases from a DOE CSV and a template | — (CLI only) | -| `doe` | Generate a `doe.csv` from a parameter spec (factorial/LHS/Sobol/CCD) | — (CLI only) | -| `doctor` | Validate runtime environment and configuration | — (CLI only) | -| `serve` | Start the web monitoring dashboard | — (starts the UI) | -| `run` | Launch cases locally or on Slurm (`--n`, `--nt` required) | Status → Run Selected | +| `prepare` | Generate cases from a DOE CSV and a template | CLI only | +| `doe` | Generate a `doe.csv` from a parameter spec (factorial/LHS/Sobol/CCD) | CLI only | +| `doctor` | Validate runtime environment and configuration | CLI only | +| `serve` | Start the web monitoring dashboard | Starts the UI | +| `run` | Launch cases locally or on Slurm (`--n`, `--nt` required) | Status → Run | | `status` | Show case status in the terminal | Status panel | | `tail` | Stream a case log file (like `tail -f`) | Log Tail panel | -| `control` | Steer a running case: stop/extend/checkpoint/flush | Status → Stop / More ▾ menu | +| `control` | Send a live control action to a running case (code_saturne: stop, extend, checkpoint, flush) | Status → Control menu | | `residuals` | Export residuals data and/or SVG plot | Residuals Plot panel | -| `perf` | Extract performance metrics from logs | Timing Snapshot panel | -| `cleanup` | Remove old RESU dirs, logs (`--prune-resu`, etc.) | Status → Clean Selected | +| `perf` | Export the solver's timing metrics | Timing Snapshot panel | +| `cleanup` | Remove old run folders, truncate logs (`--prune-resu`, etc.) | Status → Clean | The web UI also provides features beyond the CLI: kill running cases, edit case files, add notes, mark convergence, compare runs side-by-side, plot probes/profiles, and scan logs for recent errors. @@ -188,12 +191,13 @@ To re-enable: `csauto enable-telemetry` - [HTTP API](docs/api.md) - [Task cookbook](docs/task-cookbook.md) - [Limitations](docs/limitations.md) +- [Adding a new solver](docs/adding-a-solver.md) ## Contributing Please check out our [CONTRIBUTING.md](./CONTRIBUTING.md) file if you want to contribute to the project. -Merge requests adding support for new solvers are gladly welcome: all solver-specific logic lives behind a single adapter class, so a new solver means writing one adapter with no changes to the core or the UI — see [docs/adding-a-solver.md](docs/adding-a-solver.md) for the step-by-step guide. +Merge requests adding support for new solvers are gladly welcome. csauto knows a solver through one adapter class that says how to start it, where its files are, and how to read its output: [docs/adding-a-solver.md](docs/adding-a-solver.md) walks through writing, registering, and testing one. Thank you to all our contributors : @@ -216,6 +220,9 @@ pytest tests/web -q # Run a single test pytest tests/unit/test_foo.py::test_bar -q + +# Real runs of the shipped examples in docker (opt-in, needs the solver images) +CSAUTO_DOCKER_TESTS=1 pytest tests/integration/test_docker_solvers.py -q ``` ### Frontend development @@ -242,7 +249,7 @@ See [architecture](docs/architecture.md) for an overview of the codebase. ## See Also -- [code_saturne](https://www.code-saturne.org/) — the open-source CFD solver csauto automates +- [code_saturne](https://www.code-saturne.org/) and [code_aster](https://www.code-aster.org/): the open-source solvers csauto automates - [Simvia's website](https://simvia.tech) ## License diff --git a/docs/README.md b/docs/README.md index 995d206..ea4d26c 100644 --- a/docs/README.md +++ b/docs/README.md @@ -2,33 +2,33 @@ ## Getting started -1. [Core concepts](./concepts.md) — understand the DOE/template/cases mental model before anything else -2. [Quickstart](./quickstart.md) — step-by-step first run, local and Slurm +1. [Core concepts](./concepts.md): understand the DOE/template/cases mental model before anything else +2. [Quickstart](./quickstart.md): step-by-step first run, local and Slurm ## Daily use (web UI) The web UI is the recommended interface for all daily operations. -- [Web UI guide](./web-ui.md) — launch, monitor, restart, stop/extend/checkpoint, kill, clean from the browser -- [Task cookbook](./task-cookbook.md) — copy/paste recipes, UI-first with CLI alternatives -- [Run lifecycle](./run-lifecycle.md) — case states, transitions, and state files +- [Web UI guide](./web-ui.md): launch, monitor, restart, live control, kill and clean from the browser +- [Task cookbook](./task-cookbook.md): copy/paste recipes, UI-first with CLI alternatives +- [Run lifecycle](./run-lifecycle.md): case states, transitions, and state files ## Reference -- [Configuration](./config.md) — `csauto.toml` keys, environment variables, priority rules -- [DOE format](./doe-format.md) — CSV format, placeholders, IF blocks -- [Input/output formats](./formats.md) — files read and written by csauto -- [HTTP API](./api.md) — REST endpoints, request conventions, cURL examples -- [CLI reference](./cli.md) — all commands and options (for scripting and setup steps) -- [Limitations](./limitations.md) — known constraints and best practices +- [Configuration](./config.md): `csauto.toml` keys, environment variables, priority rules +- [DOE format](./doe-format.md): CSV format, placeholders, IF blocks +- [Input/output formats](./formats.md): files read and written by csauto +- [HTTP API](./api.md): REST endpoints, request conventions, cURL examples +- [CLI reference](./cli.md): all commands and options (for scripting and setup steps) +- [Limitations](./limitations.md): known constraints and best practices ## Troubleshooting -- [Troubleshooting](./troubleshooting.md) — error messages, diagnostics, common issues +- [Troubleshooting](./troubleshooting.md): error messages, diagnostics, common issues ## Contributing - [Architecture](./architecture.md) -- [Adding a new solver](./adding-a-solver.md) — implement a `SolverAdapter` for another solver +- [Adding a new solver](./adding-a-solver.md): implement a `SolverAdapter` for another solver - [Contributing guide](./contributing.md) - [Test suite](../tests/README.md) diff --git a/docs/adding-a-solver.md b/docs/adding-a-solver.md index 41be07b..3d3b0d2 100644 --- a/docs/adding-a-solver.md +++ b/docs/adding-a-solver.md @@ -1,185 +1,259 @@ # Adding a new solver -csauto talks to solvers exclusively through the `SolverAdapter` boundary -(see [Architecture — Solver adapter boundary](./architecture.md#solver-adapter-boundary)). -Adding a solver means writing one adapter class and registering its name — -the core (runner, DOE generation, CLI, web routes) does not change. +csauto knows a solver only through its **adapter**: one Python class that +says how to start the solver, where its files are, and how to read its +output. Everything else (case generation, launching on a laptop, a container +or Slurm, status tracking, the web dashboard) is shared by every solver. -Two reference implementations exist: +Adding a solver means writing one adapter class, registering its name and +adding a sample case to the test suite. No other part of csauto changes, +including the dashboard. -- `csauto/solvers/stub.py` — the minimal possible adapter (a fake solver used - by integration tests). Start by reading this one. -- `csauto/solvers/code_saturne.py` — a full production adapter with restart, - Slurm scripts, residuals/probes/performance parsing, and live control. +Three adapters ship with csauto: -## 1. Create the adapter class +| Adapter | Read it for | +|---|---| +| `csauto/solvers/stub.py` | The smallest complete adapter: a fake solver used by the tests. Start here. | +| `csauto/solvers/code_aster.py` | A real solver in about 100 lines: environment setup in containers, results written straight into `RESU/`, verdict read from the solver's standard output. | +| `csauto/solvers/code_saturne.py` | The most complete adapter: residuals, probes, timing, restart, live control, GUI, a custom Slurm script. | -Create `csauto/solvers/.py` and subclass `SolverAdapterBase` -(`csauto/solvers/base.py`), which provides working defaults for most of the -protocol. +## 1. Write the adapter -Three methods are abstract and must be implemented: +Create `csauto/solvers/.py` with a subclass of `SolverAdapter`. This +is a complete adapter for a solver started as `mysolver input.cfg`, which +writes each run's results into a new folder under `results/`: -| Method | Purpose | -|---|---| -| `run_argv(case_path, nprocs, nt, run_args)` | Solver argv fragment that starts a run, excluding the binary itself. The generic runtime wrapping composes it into `nohup ...` (native), `docker run ... ...`, or `apptainer exec ... ...`. | -| `detect_outcome(case_dir, start_time)` | Read the solver's output and return `STATUS_DONE`, `STATUS_FAILED`, or `None` (still unknown). This is how csauto decides a run finished. Most adapters only pass their log paths and verdict regexes to `csauto.logs.scan_outcome`, which handles tail reading and the "written during this run" check. | -| `find_setup_file(template_dir)` | Locate the solver's primary input file in a template or case directory, raising `FileNotFoundError` if absent. Used by `prepare`, `doctor`, and the GUI. | - -These class attributes have no default and must be set: - -| Attribute | Example (code_saturne) | Used for | -|---|---|---| -| `name` | `"code_saturne"` | identity, error messages | -| `native_bin_name` | `"code_saturne"` | PATH lookup for the `native` runtime | -| `container_bin_name` | `"code_saturne"` | argv inside singularity containers | -| `container_root` | `"/home/code_saturne"` | bind-mount target inside containers | -| `default_docker_image` | `"simvia/code_saturne"` | `docker` runtime default | -| `results_dirname` | `"RESU"` | per-case results directory | -| `dashboard_panels` | `("status", "residuals", ...)` | the dashboard tabs, see below | - -Then declare the conventions that differ from the base defaults: - -- `template_input_names` — files rendered per case and skipped by the generic - render sweep. -- `shared_dir_names` — template-level shared dirs copied/symlinked into the - runs dir. -- `cleanup_log_names` — logs the Clean action may truncate. -- `anomaly_file_names` — launcher/solver logs scanned for anomalies, and the - file list offered by the Recent Errors panel. -- `tail_file_names` — logs the Log Tail panel prefers, best first. The first - entry is the `/api/tail` default file. -- `anomaly_patterns` / `anomaly_ignore_patterns` — `(severity, regex)` pairs - added to the generic anomaly set (`csauto.logs.GENERIC_ANOMALY_PATTERNS`: - crashes, tracebacks, NaN, `error:`, `warning`...), and regexes for lines never - reported. code_saturne adds CFD warnings (`cfl`, `clipping`, ...) and ignores - its own "No error detected" banner. -- `compare_kinds` — `CompareKind(value, label)` entries that populate the - compare panel's file selector. The first entry is the default; - `default_compare_kind` is derived from it, so do not declare it yourself. -- `performance_columns` — `PerfColumn(key, label, kind)` entries (`kind` is - `"time"`, `"int"`, `"float"`, or `"text"`) that define the Timing Snapshot - table. The CSV export keys (`performance_fields`) are derived from them, so - do not declare those either. -- `control_actions` — the live-control directives your `apply_control` - implements (code_saturne declares `stop`, `extend`, `checkpoint`, `flush`). -## Dashboard panels are declared, capabilities are derived - -Your adapter lists its dashboard tabs in `dashboard_panels`, in display order -(`status`, `residuals`, `probes`, `performance`, `compare`, `tail`, `errors`). -Nothing else changes that list: not the runtime, not the execution backend, -not a setting. A tab whose data the selected case does not have yet shows its -empty state rather than disappearing. - -Each tab you list must be feedable, and `tests/unit/test_solvers.py` fails -otherwise (an unknown tab name fails too): - -| Tab | Fed by | -|---|---| -| `status` | the registry, always feedable | -| `tail`, `errors` | the `csauto.stdout` / `csauto.stderr` launcher logs and `anomaly_file_names`, always feedable | -| `residuals` | an override of `find_residuals_files` | -| `probes` | an override of `list_probe_files` | -| `performance` | a non-empty `performance_columns` | -| `compare` | a non-empty `compare_kinds` | +```python +from collections.abc import Sequence +from pathlib import Path +from typing import ClassVar -You may leave out a tab you could feed: listing it is your choice. +from .base import SolverAdapter -`capabilities` stays derived from what your adapter provides, and declaring it -raises `TypeError` at import time. It drives the action buttons and the API -checks: -| Capability | Granted when your adapter | -|---|---| -| `residuals` | overrides `find_residuals_files` | -| `probes` | overrides `list_probe_files` | -| `restart` | overrides `build_restart_args` | -| `gui` | overrides `gui_argv` | -| `compare` | declares a non-empty `compare_kinds` | -| `performance` | declares a non-empty `performance_columns` | -| `control` | declares a non-empty `control_actions` | +class MySolverAdapter(SolverAdapter): + name: ClassVar[str] = "mysolver" # the value of `solver` in csauto.toml + native_bin_name: ClassVar[str] = "mysolver" # looked up in PATH by the native runtime + container_bin_name: ClassVar[str] = "mysolver" # started inside docker and apptainer images + default_docker_image: ClassVar[str] = "example/mysolver:1.0" + results_dirname: ClassVar[str] = "results" + dashboard_panels: ClassVar[tuple[str, ...]] = ("status", "tail", "errors") -An action your adapter cannot perform is absent from the dashboard and refused -by the API with a 400. Run `csauto doctor RUNS` to see both lists: + def run_argv(self, case_dir: Path, nprocs: int, nt: int, run_args: Sequence[str] | None = None) -> list[str]: + return ["input.cfg", "--procs", str(nprocs), *(run_args or [])] -``` -[OK] solver code_aster: panels status, compare, tail, errors -[OK] solver code_aster: capabilities compare + def find_setup_file(self, template_dir: Path) -> Path: + path = template_dir / "input.cfg" + if not path.is_file(): + raise FileNotFoundError(f"input.cfg not found in {template_dir}") + return path ``` -The web UI reads `panels`, `capabilities`, `control_actions`, `compare_kinds`, -`anomaly_file_names` and `tail_file_names` from `/api/app_config`, and the timing columns from -`/api/perf`, so these declarations reshape the dashboard without any frontend -change. - -Everything else is optional. Useful overrides, from most to least common: - -- `read_progress(case_dir, start_time)` — current iteration for the status - table (base returns `None`). -- `locate_case_file(case_dir, name)` — friendly-name file resolution for the - web UI; the base only resolves paths relative to the case directory, so - extend it if your results live in run subdirectories (see `StubAdapter`). -- `gui_argv(setup_path)` — argv fragment to open the solver GUI (base raises - "GUI not supported"). -- `build_slurm_script(...)` — return a full sbatch script when your solver - cannot be launched via `sbatch --wrap` (base returns `None`, meaning wrap). -- `mpi_env(mpi_exec_options)` — env vars carrying MPI options to the solver. -- `build_restart_args(...)` / `apply_control(...)` — checkpoint restart and - live control directives (base raises "not supported", which surfaces as a - clean error in the UI). -- `find_residuals_files` / `parse_live_residuals` / probe listing / - `find_performance_log` / `parse_performance` — analytics (base returns - empty, so charts degrade gracefully). -- `doctor_checks(...)` — the base already verifies every case has a setup - file; override to add solver-specific environment checks. - -Results-layout helpers (`results_root`, `list_run_dirs`, `latest_run_dir`, -`list_result_files`) are derived from `results_dirname` and normally need no -override, as long as your solver writes one subdirectory per run under it. - -## 2. Register the solver +That is all csauto needs: + +- **`run_argv`** returns the arguments after the solver executable. The + command always starts **inside the case folder**, in every runtime, so use + paths relative to it. `case_dir` is the case folder on this machine, for + when you need to read a file to build the arguments. `nprocs` is the number + of MPI processes and `nt` the number of threads per process: use them, + translate them, or ignore them. +- **`find_setup_file`** returns the solver's main input file. `csauto prepare` + renders it from each DOE row, and `csauto doctor` checks every case has one. +- **How a run ends.** When the run command exits, csauto reads its exit + status: 0 means DONE, anything else FAILED. If your solver's exit status + is not reliable, override `detect_outcome` (see + [the recipe](#the-solver-prints-its-verdict-in-a-log)). + +## 2. Register it In `csauto/solvers/__init__.py`, add the name to `_SOLVER_NAMES` and a branch in `_adapter_for()`: ```python -_SOLVER_NAMES = ("code_saturne", "openfoam", "stub") +_SOLVER_NAMES = ("code_saturne", "stub", "code_aster", "mysolver") - if normalized == "openfoam": - from .openfoam import OpenFoamAdapter + if normalized == "mysolver": + from .mysolver import MySolverAdapter - return OpenFoamAdapter() + return MySolverAdapter() ``` -Config validation picks the new name up automatically from -`available_solvers()`. +Select it in the campaign's `csauto.toml` (`solver = "mysolver"`). +`csauto prepare` records it in `RUNS/campaign.json`, so later commands use the +right adapter from any directory. + +## 3. Test it -## 3. Select it +Add a `sample_mysolver(case_dir)` function to +`tests/unit/test_adapter_conformance.py`. It writes a small **finished** case, +the way your solver leaves it: the input file, the logs, the results. The +conformance suite then checks your adapter against it and says, in plain +words, what the dashboard would miss: an unknown tab, a log file the Log Tail +offers but cannot open, a capability with nothing behind it, a finished run +that does not read as DONE. -```toml -# csauto.toml -solver = "openfoam" ``` +pytest tests/unit/test_adapter_conformance.py -q +``` + +Then run a real campaign: `csauto prepare`, `csauto run`, `csauto status`, +and `csauto serve` to look at the dashboard. If your solver has a docker +image, add it to `tests/integration/test_docker_solvers.py`, which runs the +shipped examples for real when `CSAUTO_DOCKER_TESTS=1` is set. + +`csauto doctor RUNS` shows what your adapter offers: + +``` +[OK] solver mysolver: panels status, tail, errors +[OK] solver mysolver: capabilities none +[OK] solver mysolver: runtimes docker, native, singularity +``` + +## 4. Fill the dashboard + +The dashboard shows the tabs listed in `dashboard_panels`, in this order: +`status`, `residuals`, `probes`, `performance`, `compare`, `tail`, `errors`. +Status, Log Tail and Recent Errors work for every solver. List another tab +once your adapter feeds it; the conformance suite refuses a tab nothing feeds. + +| Tab | What to add | +|---|---| +| Log Tail | Nothing. It offers `csauto.stdout` and `csauto.stderr` (the solver's console output) plus every `*.log` file of the latest run. Set `tail_file_names` to put your main logs first; entries may be globs, such as `"*.mess"`. | +| Recent Errors | Nothing. It scans `anomaly_file_names` for crashes, tracebacks, `error:` lines and warnings. Add your solver's own markers with `anomaly_patterns` (labels `"error"`, `"warn"` or `"info"`) and silence false positives with `anomaly_ignore_patterns`. The Log Tail colours lines with the same patterns. | +| Compare | `compare_kinds`: `CompareKind(value, label)` entries. The value is a name handed to `locate_case_file`, so it can be an alias for a file whose name changes per case (code_aster maps `"export"` to the case's `.export`). The first entry is the default. | +| Residuals | `find_residuals_files` returning CSV files with an `iteration` column and one column per residual, or `parse_live_residuals` returning rows parsed from a log. `default_residual_columns` names the curves shown first. | +| Probes | `list_probe_files` and `locate_probe_files`. Time series need a `t` or `time` column. Files are read as comma-separated CSV; override `read_probe_file` for another format. `list_profile_files` adds spatial profiles. | +| Timing Snapshot | `performance_columns` (`PerfColumn(key, label, kind)`, kind `"time"`, `"int"`, `"float"` or `"text"`), `find_performance_log`, and `parse_performance` returning values under those keys. `csauto perf` exports the same columns. | + +The status table's **Last Iter** column comes from `read_progress`. + +**Actions.** Run, Kill and Clean work for every solver. These ones appear +only when the adapter provides them: + +| Button | What to add | +|---|---| +| Restart | `build_restart_args` and `restart_modes`: `RestartMode(name, label, value_label, value_kind)` entries, one per way to restart (code_saturne offers additional iterations or additional physical time). The dialog asks for a value when `value_label` is set. | +| Live control | `control_actions` (`ControlAction(name, label, value_label, value_kind)`) and `apply_control`. They appear in the dashboard's control menu and as `csauto control RUNS CASE ACTION [VALUE]`. | +| Open GUI | `gui_argv(setup_path)`: the arguments that open the solver's GUI on the setup file. | -The CLI and the web server build the adapter from this key; no other -configuration changes. +**Branding.** Point `logo_file` at an SVG for the dashboard header and +`icon_file` at a square SVG for the browser tab; keep them in +`csauto/solvers/logos/`. Without them the header shows the solver's name. -## 4. Test it +## Recipes -- Unit-test the argv fragments and outcome/progress parsing against golden - values (see `tests/unit/test_solvers.py`). -- Copy the pattern of `tests/integration/test_stub_adapter.py`: generate cases - from a template, launch with `runtime="native"` pointing at a harmless - binary, and poll `refresh_status` until the adapter reports `DONE`. -- `tests/unit/test_solver_boundary.py` scans every module outside - `csauto/solvers/` and fails if your work leaks solver literals into them: - declare the string on your adapter and let the generic code read it. +### The solver prints its verdict in a log -## 5. Optional: dashboard branding +Override `detect_outcome` and let `csauto.logs.scan_outcome` do the reading: +it looks at the end of each file, skips files written before the current run +started, and returns DONE, FAILED or None (no verdict yet). -The dashboard header shows your solver's `name` as text (only code_saturne -ships a header logo today; adding one means editing -`frontend/src/lib/components/hero/HeroBanner.svelte`). The favicon defaults to -the Simvia mark and switches to `/favicon-.svg` automatically when that -asset exists — drop a `favicon-.svg` into `frontend/static/` and rebuild -the frontend to ship one. +```python +DONE = (re.compile(r"Normal end of run"),) +FAILED = (re.compile(r"Fatal error"),) + +def detect_outcome(self, case_dir, start_time=None): + return scan_outcome([case_dir / "csauto.stdout"], start_time, DONE, FAILED) +``` + +A run stays RUNNING until its process or Slurm job is gone, even after the +verdict is printed; the verdict then decides the status. When the logs give +no verdict, csauto falls back to the exit status. + +### The image needs its environment activated + +Set `container_setup` to the shell commands to run in the container before +the solver (code_aster: `"source /opt/activate.sh"`). csauto starts the solver +with `--entrypoint`, so the image does not need the solver as its entrypoint. +For native runs, the solver must already be on PATH, or `saturne_bin` in +`csauto.toml` must point to it. + +### Results go in one folder per run, or straight into the results folder + +`list_run_dirs` returns the folders that each hold one run's results. Clean +only ever deletes these folders, and "Keep latest N" counts them. The default +lists the subfolders of `results_dirname`, which suits solvers that create a +new folder per run (code_saturne's `RESU/`). If your solver writes +everything into `results_dirname` itself, return `[self.results_root(case_dir)]` +(code_aster does): each case then holds one run, and a new run replaces it. + +`locate_case_file(case_dir, name)` turns the names used by the Log Tail, +Recent Errors and Compare into files. The default resolves paths relative to +the case folder; extend it when your logs live in run folders (see +`StubAdapter` and `CodeSaturneAdapter`). + +### The solver needs a file written at launch + +Do it in `prepare_launch(case_dir, nprocs, nt)`, called right before each +launch. Never modify a file that came from the template: `csauto prepare` +compares those to the template to detect changed cases. Write a new file +instead. code_aster writes `.csauto.export`, a copy of the case's export +carrying the run's `n` and `nt`, and runs that one. + +### Template files contain braces + +`{name}` in a template is a DOE placeholder. When braces belong to the input +language (Python f-strings or sets in a code_aster `.comm` file), write `\{i}` +to keep a literal `{i}`. To keep csauto away from a whole file, list its name +in `template_input_names`. + +### Slurm + +By default csauto submits the run command with `sbatch --wrap`, requesting +`--ntasks` from `n` and `--cpus-per-task` from `nt`. When your solver needs a +real batch script (code_saturne's apptainer runs stage, compute and finalize +in separate steps), return it from `build_slurm_script`. `mpi_env` turns the +`mpi_exec_options` setting into environment variables for the solver. + +### Runtimes + +`supported_runtimes` lists the runtimes the solver can use (`native`, +`docker`, `singularity`). Auto mode only picks among them, and asking for +another one is refused before anything starts. Containers mount the campaign +folder at `container_root` (`/mnt` by default). Keep it out of the image +user's home directory, or the solver's own settings and caches end up in the +campaign folder. + +## Reference + +Required (no default): + +| Member | Meaning | +|---|---| +| `name` | value of `solver` in `csauto.toml` | +| `native_bin_name` | executable looked up in PATH by the native runtime | +| `container_bin_name` | executable started inside container images | +| `default_docker_image` | image used when `csauto.toml` sets no `docker_image` | +| `results_dirname` | results folder inside each case | +| `dashboard_panels` | dashboard tabs | +| `run_argv(case_dir, nprocs, nt, run_args)` | arguments after the executable | +| `find_setup_file(template_dir)` | the main input file | + +Optional, with their default: + +| Member | Default | +|---|---| +| `supported_runtimes` | native, docker and singularity | +| `container_root` | `"/mnt"` | +| `container_setup` | none | +| `shared_dir_names`, `readonly_shared_dir_names` | none: folders next to `TEMPLATE` shared by every case (code_saturne: `MESH`, `POST`), reached as `../MESH` from a case | +| `template_input_names` | none: files never rendered | +| `tail_file_names` | `csauto.stdout`, `csauto.stderr` | +| `anomaly_file_names` | `csauto.stderr`, `csauto.stdout` | +| `anomaly_patterns`, `anomaly_ignore_patterns` | none | +| `cleanup_log_names` | `csauto.stdout`, `csauto.stderr`: logs Clean may shorten | +| `compare_kinds`, `performance_columns`, `control_actions`, `restart_modes`, `default_residual_columns` | none | +| `logo_file`, `icon_file` | none | +| `prepare_launch` | does nothing | +| `detect_outcome` | no verdict: the exit status decides | +| `read_progress`, `read_restart_origin` | no value | +| `locate_case_file` | paths relative to the case folder | +| `list_run_dirs` | subfolders of `results_dirname`, newest first | +| `find_run_config` | none: a second rendered input file (code_saturne's `run.cfg`) | +| `build_slurm_script`, `mpi_env` | `sbatch --wrap`, no variables | +| `doctor_checks` | every case has a setup file | +| analytics methods | empty results | + +`capabilities` (what the dashboard and the API allow), `performance_fields` +and `default_compare_kind` are derived from the members above; declaring +them is an error. diff --git a/docs/api.md b/docs/api.md index 7979402..217ea9d 100644 --- a/docs/api.md +++ b/docs/api.md @@ -17,17 +17,26 @@ Interactive API documentation is available at: - `http://127.0.0.1:8000/docs` (Swagger UI) - `http://127.0.0.1:8000/redoc` (ReDoc) +The server works with the solver the campaign was prepared for (recorded in +`RUNS/campaign.json`). Several responses depend on it: `GET /api/app_config` +lists what the solver offers, and a restart, control or GUI request the solver +cannot perform is refused with `400` (for example `Solver 'code_aster' does not +support restart`). + ## Authentication Authentication is optional. -If `[api].token` is configured in `csauto.toml`, each `/api/*` request must send either: +If `[api].token` is configured in `csauto.toml` (or `serve --token` is given), each `/api/*` request must send either: - `X-CSAUTO-TOKEN: ` - `Authorization: Bearer ` Without a valid token, the server returns `401 Unauthorized`. +`GET /api/solver_logo` and `GET /api/solver_icon` need no token, like the +dashboard's own assets. + ## Request conventions Case list query format: @@ -37,10 +46,11 @@ Case list query format: - repeated query: `?case=case0001&case=case0002` - comma-separated: `?case=case0001,case0002` -Boolean query values: +Boolean query values (any case): -- true values: `1`, `true`, `yes` -- any other value is treated as false +- true: `1`, `true`, `yes`, `on`, `t`, `y` +- false: `0`, `false`, `no`, `off`, `f`, `n` +- any other value, empty included, is refused with `422` Case validation: @@ -49,6 +59,71 @@ Case validation: ## GET endpoints +## `GET /api/app_config` + +Purpose: + +- describe what the campaign's solver offers, so a client shows only what works + +Response (code_saturne): + +```json +{ + "solver": "code_saturne", + "panels": ["status", "residuals", "probes", "performance", "compare", "tail", "errors"], + "capabilities": ["compare", "control", "gui", "performance", "probes", "residuals", "restart"], + "compare_kinds": [ + { "value": "setup.xml", "label": "setup.xml" }, + { "value": "doe_row.csv", "label": "doe_row.csv" }, + { "value": "run_solver.log", "label": "run_solver.log" }, + { "value": "performance.log", "label": "performance.log" } + ], + "error_files": ["csauto.stderr", "run_solver.log", "listing", "csauto.stdout"], + "tail_files": ["run_solver.log", "listing", "run_status.running", "csauto.stdout", "csauto.stderr", "performance.log", "summary"], + "control_actions": [ + { "name": "stop", "label": "Stop gracefully", "value_label": "", "value_kind": "int" }, + { "name": "extend", "label": "Extend", "value_label": "Additional time steps", "value_kind": "int" }, + { "name": "checkpoint", "label": "Write a checkpoint", "value_label": "", "value_kind": "int" }, + { "name": "flush", "label": "Flush logs and plots", "value_label": "", "value_kind": "int" } + ], + "restart_modes": [ + { "name": "iterations", "label": "Additional iterations", "value_label": "Iterations", "value_kind": "int" }, + { "name": "physical_time", "label": "Additional physical time", "value_label": "Time (s)", "value_kind": "float" } + ], + "default_residual_columns": ["velocity", "pressure"], + "logo": true, + "icon": true +} +``` + +Fields: + +- `panels`: dashboard tabs, in display order +- `capabilities`: what the solver can do (`residuals`, `probes`, `performance`, + `compare`, `control`, `restart`, `gui`). Restart, control and GUI requests the + solver does not support are refused with `400`; the residuals, probes and + timing endpoints of a solver without them return empty results +- `compare_kinds`: files offered by Compare; the first one is the default `kind` of `/api/compare_runs` +- `error_files`: files `/api/recent_errors` scans by default +- `tail_files`: Log Tail file names, best first; entries may be globs such as + `*.mess`, and `/api/tail_files` resolves them for one case +- `control_actions`, `restart_modes`: an empty `value_label` means no value is + taken; otherwise `value_kind` (`int` or `float`) says which number is expected +- `default_residual_columns`: residual curves plotted first +- `logo`, `icon`: whether `/api/solver_logo` and `/api/solver_icon` have an image + +For code_aster, `panels` is `status`, `compare`, `tail`, `errors`, the only +capability is `compare`, and `control_actions` and `restart_modes` are empty. + +## `GET /api/solver_logo` and `GET /api/solver_icon` + +Purpose: + +- the solver's logo (dashboard header) and square icon (browser tab) + +No authentication. Response content-type: `image/svg+xml`, or `404` when the +solver has no such image. + ## `GET /api/status` Purpose: @@ -74,7 +149,7 @@ Response: "last_iter": 178, "duration_s": 522, "duration": "8m42s", - "last_mod": "2026-03-09T10:02:11", + "last_mod": "2026-03-09T10:02:11+00:00", "resu_size_mb": 128.4, "doe": { "density_value": "1.1" @@ -85,11 +160,13 @@ Response: } ``` +`last_mod` is a UTC timestamp. + ## `GET /api/perf` Purpose: -- collect performance records from selected cases +- collect timing records from selected cases Query parameters: @@ -97,23 +174,22 @@ Query parameters: Response: -- `{ "records": [...] }` - -## `GET /api/residuals` - -Purpose: - -- return residual rows as JSON - -Query parameters: - -- `case` (required) -- `limit` (optional int, default `0` = no limit) -- `include_history` (optional boolean): include all RESU runs - -Response: +```json +{ + "columns": [ + { "key": "elapsed_time", "label": "Elapsed (s)", "kind": "time" }, + { "key": "mpi_ranks", "label": "MPI Ranks", "kind": "int" } + ], + "records": [ + { "case_id": "case0001", "elapsed_time": "1.967", "mpi_ranks": null } + ] +} +``` -- `{ "header": [...], "records": [...] }` +`columns` are the solver's timing columns (`kind` is `time`, `int`, `float` or +`text`). Each record holds `case_id` plus one value per column `key`, `null` +when the log does not give it. Cases without a timing log have no record. Both +lists are empty for a solver without timing columns (code_aster). ## `GET /api/restart_origin` @@ -138,9 +214,9 @@ Purpose: Query parameters: - `case` (required) -- `files` (optional comma list): defaults to internal anomaly files -- `max_hits` (optional int, default `200`, clamped `1..500`) -- `context` (optional int, default `6`, clamped `0..50`): lines before and after hit +- `files` (optional comma list): defaults to the solver's `error_files` (see `/api/app_config`) +- `max_hits` (optional int `1..500`, default `200`) +- `context` (optional int `0..50`, default `6`): lines before and after hit - `sev` (optional): `all`, `error`, `warn`, `info`, or comma mix - `q` (optional): plain text filter @@ -177,7 +253,7 @@ Purpose: Query parameters: - `case` (required) -- `columns` (optional comma/space list) +- `columns` (optional comma/space list, default: the solver's `default_residual_columns`, else the first two residuals) - `width` (optional int, default `900`) - `height` (optional int, default `500`) - `x_min` (optional float, default `0`) @@ -196,73 +272,104 @@ Purpose: Query parameters: - `case` (required) -- `file` (optional, default: the first entry of the solver's `tail_files`, `run_solver.log` for code_saturne) +- `file` (optional, default: the first file `/api/tail_files` lists for the case) - `n` (optional int, default `200`) Response content-type: - `text/plain` -## `GET /api/resu_files` +## `GET /api/tail_files` Purpose: -- list files in latest RESU run +- list the log files the Log Tail panel can show for one case, best first Query parameters: - `case` (required) -- `limit` (optional int, default `2000`) Response: -- `{ "files": [...] }` +```json +{ "files": ["run_solver.log", "csauto.stdout", "csauto.stderr", "performance.log", "summary", "RESU/20261007-1437/setup.log"] } +``` -## `GET /api/resu_dirs` +The solver's `tail_files` that exist come first; glob entries become paths +relative to the case. The other `*.log` files of the latest run follow. + +## `GET /api/tail_lines` Purpose: -- list RESU run directories sorted by recency +- return the last lines of a case file, each with the severity the solver's + anomaly patterns give it (what the Log Tail colours) Query parameters: - `case` (required) +- `file` (optional, same default as `/api/tail`) +- `n` (optional int, default `200`) Response: -- `{ "dirs": ["20260308-1413", "20260308-1347", ...] }` +```json +{ + "file": "run_solver.log", + "lines": [ + { "text": " Time step 12", "severity": null }, + { "text": "Warning: clipping of k", "severity": "warn" } + ] +} +``` -## `GET /api/probes` +`severity` is `error`, `warn`, `info` or `null`. + +## `GET /api/resu_files` Purpose: -- list available probe/profile files for one case +- list the files of the case's latest run folder, relative to the case Query parameters: - `case` (required) -- `scope` (optional): `probes` (default) or `profiles` -- `limit` (optional int, default `200`) +- `limit` (optional int, default `2000`) Response: - `{ "files": [...] }` -## `GET /api/probe_data` +## `GET /api/resu_dirs` Purpose: -- return probe CSV records +- list the case's run folders, newest first: the folders the solver reports as + runs (code_saturne: each `RESU/`; code_aster: `RESU` itself) Query parameters: - `case` (required) -- `probe` (required) + +Response: + +- `{ "dirs": ["20260308-1413", "20260308-1347", ...] }` + +## `GET /api/probes` + +Purpose: + +- list the probe/profile files of one or more cases (names merged, no duplicates) + +Query parameters: + +- `case` (required) +- `scope` (optional): `probes` (default) or `profiles` - `limit` (optional int, default `200`) Response: -- `{ "header": [...], "records": [...] }` +- `{ "files": [...] }` ## `GET /api/probe_position` @@ -290,7 +397,7 @@ Purpose: Query parameters: - `case` (required) -- `probe` or `probes` (required, comma or repeated) +- `probe` (required, comma or repeated) Response: @@ -305,7 +412,7 @@ Purpose: Query parameters: - `case` (required) -- `probe` or `probes` (required) +- `probe` (required, comma or repeated) - `axis` (optional, default `time`) - `columns` (optional comma/space list) - `width` (optional int, default `900`) @@ -327,7 +434,10 @@ Purpose: Query parameters: - `case` (required) -- `kind` (required): example `setup.xml`, `doe_row.csv`, `listing`, ... +- `kind` (required): a path relative to the case (`doe_row.csv`, + `DATA/setup.xml`), or a name the solver resolves: code_saturne `setup.xml` + and run files such as `run_solver.log` (from the latest run that has them), + code_aster `export` Response content-type: @@ -343,80 +453,41 @@ Query parameters: - `case` (required) - `base` (optional, default first selected case) -- `kind` (optional, default `setup.xml`) +- `kind` (optional, default: the solver's first compare kind, `setup.xml` for + code_saturne, `export` for code_aster) - `filter` (optional regex) Response content-type: - `text/plain` diff output -## `GET /api/case_diff` +## `GET /api/settings/telemetry` Purpose: -- diff a file between exactly two cases - -Query parameters: - -- `case1` (required) -- `case2` (required) -- `kind` (required) - -Response content-type: - -- `text/plain` - -## `GET /api/history` - -Purpose: - -- read per-case action history - -Query parameters: - -- `case` (required) -- `limit` (optional int, default `100`, clamped `1..1000`) -- `include_refresh` (optional boolean, default false) -- `actions` (optional comma list to include) -- `q` (optional text filter) +- read whether anonymous usage telemetry is enabled Response: -- `{ "items": [...] }` - -## POST endpoints - -## `POST /api/highlight_xml` - -Purpose: - -- return highlighted HTML for XML content - -Payload: - ```json -{ "content": "..." } +{ "enabled": true } ``` -Response content-type: - -- `text/html` +## POST endpoints -## `POST /api/highlight_diff` +## `POST /api/settings/telemetry` Purpose: -- return highlighted HTML for unified diff content +- enable or disable anonymous usage telemetry Payload: ```json -{ "content": "@@ ..." } +{ "enabled": false } ``` -Response content-type: - -- `text/html` +Response: the new setting, as for `GET /api/settings/telemetry`. ## `POST /api/case_file` @@ -511,7 +582,12 @@ Payload example: Rules: - `cases` is required -- `keep_resu` and `delete_resu` are mutually exclusive +- `keep_resu` and `delete_resu` are mutually exclusive; they name run folders as + `/api/resu_dirs` lists them +- only the run folders the solver reports are deleted (code_saturne: each + `RESU/`; code_aster: `RESU` itself, one run per case) +- `RUNNING` and `PENDING` cases are skipped +- with `prune_resu`, a `DONE` or `FAILED` case left without any run returns to `PREPARED` Response: @@ -540,6 +616,8 @@ Payload: Behavior: - multi-case kill runs in parallel +- docker runs: the case's container is stopped (found from `.csauto.cid`, else + by its labels among this campaign's containers) - returns `500` if any selected case fails to stop Success response: @@ -552,28 +630,32 @@ Success response: Purpose: -- send a live steering directive to one or more running cases, by dropping a - `control_file` into the active `RESU//` directory (code_saturne polls - it once per time step) — an alternative to killing the process +- send one of the solver's live control actions to one or more running cases, + an alternative to killing the process. code_saturne drops a `control_file` + into the active `RESU//` directory, which it polls once per time step. Payload: ```json -{ "cases": ["case0001", "case0002"], "action": "stop", "value": null } +{ "cases": ["case0001", "case0002"], "action": "extend", "value": 500 } ``` -- `action`: one of `"stop"`, `"extend"`, `"checkpoint"`, `"flush"` -- `value`: required positive integer for `"extend"` (additional time steps); ignored otherwise +- `action`: one of the solver's `control_actions` (see `/api/app_config`); + code_saturne: `stop`, `extend`, `checkpoint`, `flush` +- `value`: a number, required (and positive) when the action has a + `value_label`, refused otherwise; a whole number when its `value_kind` is + `int`. Only code_saturne's `extend` takes one (additional time steps). Behavior: +- `400` for a solver without live control, an unknown action, or a bad `value` - multi-case control runs in parallel -- every selected case must currently be `RUNNING`, or the request fails +- every selected case must currently be `RUNNING` - `extend` raises the case's actual configured iteration limit (as code_saturne reports it, not csauto's own `--nt`/OpenMP thread count) by `value`; repeated extends stack correctly -- returns `500` if any selected case fails (not `RUNNING`, no active RESU - directory, invalid `value` for `extend`, etc.) +- returns `500` if any selected case fails (not `RUNNING`, no active run + folder, etc.) - each action is logged to the case's `.csauto.history.jsonl` Success response: @@ -586,7 +668,7 @@ Success response: Purpose: -- launch code_saturne GUI for one case on server side +- launch the solver's GUI (code_saturne) for one case on server side Payload: @@ -596,6 +678,7 @@ Payload: Notes: +- `400` for a solver without a GUI - requires server `DISPLAY` - runtime resolution errors are returned as `500` @@ -640,8 +723,22 @@ Rules: - `cases`, `n`, `nt` are required - `n`, `nt`, `max_parallel` must be integers `> 0` -- `restart_mode` accepted values: `iterations`, `physical_time` -- `restart_value` must match selected mode constraints +- without `max_parallel`, every selected case starts at once (`max_parallel` in + `csauto.toml` only applies to `csauto run`) +- a restart needs the `restart` capability (code_saturne only) +- `restart_mode` must be one of the solver's `restart_modes` (see + `/api/app_config`); code_saturne: `iterations`, `physical_time` +- `restart_value` must be positive, and a whole number for an `int` mode; it + needs a `restart_mode` +- without `restart_mode`, code_saturne restarts with the limits already in the case's setup +- `restart_path` (optional) picks the run to restart from: a run folder name + (`20260308-1413`) or a `RESU//checkpoint` path. By default code_saturne + restarts from the latest run that has a checkpoint. + +A case the solver refuses to launch (a restart without checkpoint, say) keeps +its status, and the other selected cases still launch. The response is then +`500` and names the refused cases: +`Launch error: 1 case(s) not launched: case0003: No checkpoint found for case0003`. Success response: @@ -654,9 +751,10 @@ Success response: Common status codes: - `200`: success -- `400`: missing/invalid parameters +- `400`: missing/invalid parameters, or an action the solver does not support - `401`: unauthorized (token) - `404`: resource not found +- `422`: a parameter of the wrong type or out of range (for example `"n": 1.5`) - `500`: internal/runtime/launch errors Common error messages: @@ -666,7 +764,11 @@ Common error messages: - `Missing case, probe parameters` - `Missing case, kind, content parameters` - `n, nt, and max_parallel must be integers > 0` -- `restart_mode must be iterations or physical_time` +- `Solver 'code_aster' does not support restart` +- `Unknown restart_mode 'iter' (expected: iterations, physical_time)` +- `iterations needs a whole number (Iterations)` +- `Invalid action (expected one of: stop, extend, checkpoint, flush)` +- `extend needs a positive value (Additional time steps)` ## cURL examples @@ -683,6 +785,12 @@ curl -s -H "X-CSAUTO-TOKEN: my-token" \ "http://127.0.0.1:8000/api/status" ``` +See what the campaign's solver offers: + +```bash +curl -s "http://127.0.0.1:8000/api/app_config" +``` + Fetch residual SVG: ```bash diff --git a/docs/architecture.md b/docs/architecture.md index bce845e..9f76f72 100644 --- a/docs/architecture.md +++ b/docs/architecture.md @@ -15,14 +15,14 @@ The web UI is the primary interface for daily operations. After `prepare` and op - `csauto/cli.py` - CLI argument parsing and command dispatch - `csauto/config.py` - `csauto.toml` loading and `Config` class -- `csauto/solvers/` - solver adapter boundary: protocol, code_saturne adapter, test stub (see below) +- `csauto/solvers/` - solver adapters: the `SolverAdapter` base class, code_saturne, code_aster, the test stub (see below) - `csauto/doe.py` - DOE parsing and case generation - `csauto/template.py` - placeholder and IF rendering - `csauto/runner.py` - launch, restart, kill, status transitions -- `csauto/control.py` - live steering (stop/extend/checkpoint/flush) orchestration, directives applied by the adapter +- `csauto/control.py` - live control orchestration; the actions are declared and applied by the adapter - `csauto/execution.py` - runtime resolution and generic runtime command wrapping (docker/native/singularity) - `csauto/docker.py` - Docker container commands (run, GUI, terminate) -- `csauto/logs.py` - code_saturne log parsing (outcome, anomalies, tails, restart origin), used via the adapter +- `csauto/logs.py` - generic log engine: tails, the incremental anomaly scanner, outcome scanning, recency checks - `csauto/residuals.py` - residual collection and SVG rendering - `csauto/probes.py` - probes/profiles collection and SVG rendering - `csauto/svg_utils.py` - shared SVG rendering primitives (axes, ticks, legends) @@ -41,92 +41,73 @@ The web UI is the primary interface for daily operations. After `prepare` and op ## Solver adapter boundary -All solver-specific knowledge lives behind the `SolverAdapter` protocol -(`csauto/solvers/base.py`). No module outside `csauto/solvers/` references -solver conventions directly; a source-scan test -(`tests/unit/test_solver_boundary.py`) enforces this on every module of the -package, so a new module is covered without registering it. The adapter is selected -by the `solver` key in `csauto.toml` (default `code_saturne`) and threaded -through entry points: the CLI builds it once in `main`, the web app stores it -on the shared `FastAPIContext` as `ctx.adapter`. Generic functions accept an -optional `adapter` argument and fall back to the code_saturne adapter, so -direct calls keep working. +csauto knows each solver through one class, a subclass of `SolverAdapter` +(`csauto/solvers/base.py`). The rest of csauto holds the machinery that is the +same for every solver, and the adapter supplies what differs: how to start the +solver, where its files are, and how to read its output. Generic mechanism, +solver-declared vocabulary. ``` csauto/solvers/__init__.py # available_solvers(), get_solver_adapter(name) -csauto/solvers/base.py # SolverAdapter protocol + SolverAdapterBase defaults +csauto/solvers/base.py # SolverAdapter: declarations, hooks and their defaults csauto/solvers/code_saturne.py # CodeSaturneAdapter +csauto/solvers/code_aster.py # CodeAsterAdapter csauto/solvers/stub.py # StubAdapter (fake solver used by integration tests) +csauto/solvers/logos/ # solver logos and icons served to the dashboard ``` -An adapter supplies: - -- **Commands**: `run_argv`/`gui_argv` fragments composed by the generic - runtime wrapping in `execution.py`/`docker.py`, plus `build_slurm_script` - for solvers that need a full batch script instead of `sbatch --wrap`, and - `mpi_env` for scheduler-time environment variables. -- **Restart**: `build_restart_args` (checkpoint discovery and solver restart - flags). -- **Outcome and progress**: `detect_outcome` (DONE/FAILED from solver output) - and `read_progress` (current iteration). -- **File conventions**: setup/run-config discovery, `results_dirname`, - shared template dirs (`MESH`/`POST` for code_saturne), the friendly-name - file catalog (`locate_case_file`), results listing, cleanup log names. -- **Analytics**: residuals/probes/performance discovery and parsing (SVG - rendering stays generic in `svg_utils.py`). -- **Dashboard surface**: the adapter declares its tabs in `dashboard_panels`, - and nothing else (runtime, backend, settings) changes that list; a test - checks each declared tab is feedable. `capabilities` is derived from what the - adapter provides (an overridden `find_residuals_files`, `list_probe_files`, - `build_restart_args` or `gui_argv`, or a non-empty `compare_kinds`, - `performance_columns` or `control_actions`) and drives the action buttons. - Both are served to the frontend by `/api/app_config`, and capabilities are - enforced server side by `FastAPIContext.require_capability`. An adapter that - declares `capabilities` raises `TypeError` at import time. - `performance_columns` also drives the Timing Snapshot columns and the - performance CSV export keys, `compare_kinds` the compare panel's file list - (first entry is the default), and `anomaly_file_names` doubles as the Recent - Errors file list. -- **Control**: `apply_control` for live stop/extend/checkpoint/flush - directives, with `control_actions` declaring what the solver supports. -- **Doctor**: `doctor_checks` for solver-specific environment validation. - -Generic mechanism, solver-declared vocabulary: modules outside -`csauto/solvers/` hold the machinery (log tailing, the incremental anomaly -scanner, outcome scanning, CSV reading, SVG rendering), and the adapter supplies -the strings and file layout it runs on (log names, verdict and anomaly regexes, -results subdirectories, file formats such as `performance.log`). A new solver -writes its own vocabulary and reuses the machinery as is. - -Ownership across the runtime x solver matrix: docker mounts and labels, -singularity exec prefixes, `sbatch --wrap` submission, local `Popen`, process -and container termination, launch slots, and the registry are runtime/generic -concerns and stay outside the adapter. The one deliberate exception is the -3-stage singularity Slurm script (`stage/initialize -> srun cs_solver -> -finalize`), which encodes code_saturne workflow knowledge and is owned -entirely by `CodeSaturneAdapter.build_slurm_script`. - -Accepted residue, by design, listed in `ACCEPTED_RESIDUE` in +The adapter is chosen by the `solver` key of `csauto.toml`. `csauto prepare` +records it in `RUNS/campaign.json`, and every later command on that campaign +uses the recorded solver, whatever directory it runs from. The CLI builds the +adapter once in `main`; the web app keeps it on `FastAPIContext` as +`ctx.adapter`. + +What stays generic, and what the adapter supplies: + +| Concern | Generic code | Adapter | +|---|---|---| +| Case generation | DOE parsing, placeholder and IF rendering, shared dirs (`doe.py`, `template.py`) | the setup file and run config, shared dir names, files never rendered | +| Launch | runtime selection, native/docker/apptainer wrapping with the case folder as working directory, `sbatch --wrap` with `--ntasks`/`--cpus-per-task`, exit status recording (`execution.py`, `docker.py`, `runner.py`) | `run_argv`, `container_bin_name`, `container_setup`, `supported_runtimes`, `prepare_launch`, optional `build_slurm_script` and `mpi_env` | +| Run state | liveness of the process or Slurm job, the registry, launch slots; a run ends when its process ends | `detect_outcome` (else the exit status decides), `read_progress`, `read_restart_origin` | +| Results | Clean, results size, file listings | `results_dirname`, `list_run_dirs` (the only folders Clean deletes), `locate_case_file` | +| Logs | tailing, the incremental anomaly scanner, `scan_outcome` (`logs.py`) | log names (`tail_file_names`, `anomaly_file_names`), anomaly patterns and ignores | +| Analytics | CSV reading, SVG rendering (`residuals.py`, `probes.py`, `svg_utils.py`) | where the residual, probe, profile and timing files are, and how to parse them | +| Dashboard | every panel and button, driven by `/api/app_config` | `dashboard_panels`, compare kinds, timing columns, control actions, restart modes, default residual curves, logo and icon | + +The adapter's `capabilities` (residuals, probes, performance, compare, +control, restart, gui) are derived from what it implements. The dashboard +shows only the actions an adapter can perform, and the API refuses the others +with a 400 (`FastAPIContext.require_capability`). + +Every registered adapter must pass `tests/unit/test_adapter_conformance.py`, +which checks its declarations against a sample finished case. +`tests/unit/test_solver_boundary.py` scans every Python module outside +`csauto/solvers/` for code_saturne file names and log markers; it catches +names, not behaviour, which is what the conformance suite and the shared +tests are for. + +Accepted residue, listed in `ACCEPTED_RESIDUE` in `tests/unit/test_solver_boundary.py`: the HTTP API keeps its historical names -and shapes (`/api/resu_dirs`, `resu_removed`, the performance record fields, -the `profiles` scope of `/api/probes`), the TOML key and CLI flag -`saturne_bin` / `--saturne-bin` keep their names, and `config.py` keeps the -code_saturne docker image as its `docker_image` default. +(`/api/resu_dirs`, `/api/resu_files`, `resu_removed`, `resu_size_mb`, the +`profiles` scope of `/api/probes`), and the TOML key and CLI flag +`saturne_bin` / `--saturne-bin` (the native solver executable, whatever the +solver) keep their names. `StubAdapter` (`solver = "stub"`) is a shipped fake solver: it runs a short -Python script writing `OUT/run_0001/stub.log` and lets integration tests cover -prepare -> run -> status -> control end to end without a real solver installed. +Python script writing `OUT/run_0001/stub.log` and lets the tests cover +prepare, run, status and control without a real solver installed. Adding a solver means writing one adapter class and registering it in -`csauto/solvers/__init__.py`; the core does not change. See -[Adding a new solver](./adding-a-solver.md) for the step-by-step guide. +`csauto/solvers/__init__.py`. See [Adding a new solver](./adding-a-solver.md). ## Persistent data model - `RUNS/registry.json` - global case state +- `RUNS/campaign.json` - the solver the campaign was prepared for - `RUNS/caseXXXX/doe_row.csv` - resolved DOE row per case - `RUNS/caseXXXX/.csauto.history.jsonl` - per-case action history - `RUNS/caseXXXX/.csauto.jobid` - scheduler job id when relevant +- `RUNS/caseXXXX/.csauto.exitcode` - exit status of the last run command ## Runtime model @@ -139,8 +120,12 @@ Supported runtimes: Launch modes: -- local detached process (`nohup`/`Popen`) -- Slurm submission (`sbatch --wrap`, monitored via `squeue`) +- local detached process (`nohup`/`Popen`), started inside the case folder +- Slurm submission (`sbatch --wrap` or an adapter-built script, monitored via `squeue`) + +Containers mount the campaign folder at the adapter's `container_root` +(`/mnt` by default) and run with `--rm`; symlinked shared dirs are mounted at +their own path so `../MESH` resolves inside the container. ## Testing strategy diff --git a/docs/cli.md b/docs/cli.md index f87a61f..3807ac1 100644 --- a/docs/cli.md +++ b/docs/cli.md @@ -1,11 +1,11 @@ # CLI Reference -> **The web UI is the recommended interface for daily operations** — launching +> **The web UI is the recommended interface for daily operations**: launching > cases, monitoring runs, restarting from checkpoint, inspecting logs and > residuals, cleaning up. Start it with `csauto serve RUNS`. > > Use the CLI when you need: -> - **Setup steps** (`prepare`, `doctor`) — no UI equivalent +> - **Setup steps** (`prepare`, `doctor`): no UI equivalent > - **Scripting and automation** in CI/CD pipelines or shell scripts > - **Data export** to CSV/SVG (`residuals`, `perf`) > - **Terminal-only** access (no SSH tunnel set up) @@ -26,22 +26,26 @@ csauto --config /path/to/csauto.toml ... If `--config` is omitted, config discovery follows the order in [config.md](./config.md). +Commands that take a `` use the solver recorded in +`/campaign.json` by `prepare`, whatever directory they run from. + --- ## Command overview | Command | What it does | UI equivalent | |---|---|---| -| `prepare` | Generate case folders from DOE + template | — (CLI only) | -| `doctor` | Run pre-launch environment checks | — (CLI only) | -| `serve` | Start the primary FastAPI web UI + HTTP API server | — (starts the UI) | -| `run` | Launch selected or all prepared cases | Status panel → Run Selected | +| `prepare` | Generate case folders from DOE + template | CLI only | +| `doe` | Generate a `doe.csv` from a parameter spec (see [doe-format.md](./doe-format.md#generating-doecsv-with-csauto-doe)) | CLI only | +| `doctor` | Run pre-launch environment checks | CLI only | +| `serve` | Start the primary FastAPI web UI + HTTP API server | Starts the UI | +| `run` | Launch the selected cases, or every case not `RUNNING` | Status panel → Run | | `status` | Refresh and print current case states | Status panel (auto-refreshes) | | `tail` | Stream a case log file (like `tail -f`) | Log Tail panel | -| `control` | Steer a running case (stop/extend/checkpoint/flush) without killing it | Status panel → Stop, More ▾ menu (Extend/Checkpoint/Flush) | +| `control` | Send one of the solver's live control actions to a running case (code_saturne: stop, extend, checkpoint, flush) | Status panel → Control menu | | `residuals` | Export residuals data and/or SVG plot | Residuals Plot panel | -| `perf` | Extract performance metrics from logs | Timing Snapshot panel | -| `cleanup` | Prune old data and truncate heavy logs | Status panel → Clean Selected | +| `perf` | Export the solver's timing metrics | Timing Snapshot panel | +| `cleanup` | Prune old run folders and truncate heavy logs | Status panel → Clean | --- @@ -58,25 +62,32 @@ csauto prepare Arguments: - ``: parameter table with header row (see [doe-format.md](./doe-format.md)) -- ``: base case root containing `setup.xml` (at root or under `DATA/`) -- ``: destination root where `caseXXXX/` folders are created +- ``: base case root containing the solver's setup file (code_saturne: + `setup.xml`, at the root or under `DATA/`; code_aster: a single `.export` file) +- ``: destination root where the case folders are created (`case0001/`, + ..., or the DOE's `case_id` values) Options: -- `--mesh-mode {copy,symlink}`: how to place the shared `MESH`/`POST` dirs (siblings of - ``) into ``. Defaults to `mesh_mode` in `csauto.toml` - (itself defaulting to `symlink`; container runtimes bind-mount the symlink - targets automatically). See [concepts.md](./concepts.md#shared-meshpost-directories) - for the tradeoffs. +- `--mesh-mode {copy,symlink}`: how to place the solver's shared dirs (siblings of + ``: `MESH` and `POST` for code_saturne, `MESH` for code_aster) into + ``. Defaults to `mesh_mode` in `csauto.toml` (itself defaulting to + `symlink`; container runtimes bind-mount the symlink targets automatically). See + [concepts.md](./concepts.md#shared-meshpost-directories) for the tradeoffs. - `--strict`: fail (instead of warn) when a DOE column matches nothing in the - template — the same silent-mismatch failure mode `csauto doe` checks for at + template, the same silent-mismatch failure mode `csauto doe` checks for at generation time. +`prepare` records the solver (`solver` in `csauto.toml`, `code_saturne` by +default) in `/campaign.json`, and refuses to add cases to a folder +prepared for another solver. + Generated files: ``` / ├── registry.json +├── campaign.json ← the solver of this campaign ├── case0001/ │ ├── DATA/setup.xml ← rendered from template │ └── doe_row.csv ← DOE values used for this case @@ -93,20 +104,26 @@ csauto prepare /data/doe.csv /data/TEMPLATE /data/RUNS Common errors: -- `setup.xml` missing from template -- placeholder variable not found in DOE header +- the solver's setup file is missing from the template +- a placeholder variable is not found in the DOE header (the error names the file; + write `\{name}` to keep a literal `{name}`) - empty DOE value for an active placeholder -- existing case folder conflicts with the current DOE/template content +- an existing case folder no longer matches the current DOE/template content + (a new column or a template change does this to every case): `prepare` stops there +- `` holds a campaign of another solver --- ## `run` -> **UI equivalent**: Status panel → select cases → **Run Selected** (recommended +> **UI equivalent**: Status panel → select cases → **Run** (recommended > for interactive use). Use this CLI command for scripting or when the UI is not running. -Launches one or more prepared cases. Cases run as background processes (local) or -Slurm batch jobs depending on the configuration. +Launches cases: by default every case of the campaign that is not `RUNNING`, +finished ones included (a code_saturne case gets a new run, a code_aster case +replaces its results). `--case` limits the launch to the named cases, `--resume` +to `FAILED` ones. Cases run as background processes (local) or Slurm batch jobs +depending on the configuration. ```bash csauto run --n --nt [options] @@ -114,18 +131,18 @@ csauto run --n --nt [options] Required arguments: -- ``: root folder containing the `caseXXXX/` directories +- ``: the campaign folder created by `prepare` - `--n N`: number of MPI ranks per case (must be `> 0`) - `--nt N`: number of OpenMP threads per MPI rank (must be `> 0`) Options: -- `--max-parallel N`: maximum number of cases running simultaneously (default: from config) -- `--case CASE_ID`: launch only specific cases — repeatable +- `--max-parallel N`: maximum number of the campaign's cases running at the same time, those already running included (default: `max_parallel` from config, which defaults to `1`) +- `--case CASE_ID`: launch only specific cases (repeatable) - `--resume`: launch only cases currently in `FAILED` status - `--runtime auto|docker|singularity|native`: override runtime from config -- `--docker-image IMAGE`: override Docker image -- `--saturne-bin PATH`: override native code_saturne binary path +- `--docker-image IMAGE`: Docker image (default: `docker_image` from config, else the solver's own image) +- `--saturne-bin PATH`: the native solver executable (`code_saturne`, or `run_aster` for code_aster) - `--singularity-image PATH`: override Singularity image - `--singularity-bin PATH`: override Singularity/Apptainer binary path - `--no-doctor`: skip pre-launch environment checks @@ -133,7 +150,16 @@ Options: Notes: - Restart (from checkpoint) is available only via the web UI or API, not via this CLI command -- Slurm submission is controlled by `use_slurm` in `csauto.toml` or `CSAUTO_USE_SLURM` +- Cases already `RUNNING` are skipped +- The solver starts inside the case folder, whatever the runtime. Docker runs + use `docker run --rm` with the campaign folder mounted at `/mnt` +- How `--n` and `--nt` are used depends on the solver: code_saturne receives + them as `-n` and `--nt`; code_aster runs `.csauto.export`, a copy of the case's + export with `mpi_nbcpu` set from `--n` and `ncpus` from `--nt` +- A case the solver refuses to launch keeps its status, the other cases still + launch, and the command ends with an error naming the refused cases +- Slurm submission is controlled by `use_slurm` in `csauto.toml` or `CSAUTO_USE_SLURM`. + `sbatch --wrap` jobs request `--ntasks` from `--n` and `--cpus-per-task` from `--nt` Examples: @@ -182,7 +208,8 @@ csauto status RUNS > a work session and keep it running. See [web-ui.md](./web-ui.md) for the full > UI guide. -Starts the primary FastAPI web UI and HTTP REST API server. +Starts the primary FastAPI web UI and HTTP REST API server. The dashboard shows +the panels and actions of the campaign's solver. ```bash csauto serve [--host 127.0.0.1] [--port 8000] [--token TOKEN] [--no-doctor] @@ -213,8 +240,8 @@ See [web-ui.md](./web-ui.md) for the full UI guide. ## `tail` -> **UI equivalent**: **Log Tail** panel in the web UI — same file selection, -> live streaming, and severity filtering, directly in the browser. +> **UI equivalent**: **Log Tail** panel in the web UI, with the same file +> selection, live streaming, and severity filtering, directly in the browser. > Use this CLI command for quick terminal access or when the UI is not running. Streams the end of a case log file, like `tail -f`. @@ -226,79 +253,87 @@ csauto tail --case CASE_ID [--file FILE] [-n LINES] [--no-follow] Options: - `--case CASE_ID`: case to inspect (required) -- `--file FILE`: log file to read. Common values: - - `listing` — main solver log (default) - - `run_solver.log` — solver launch log - - `csauto.stdout` — csauto launch output (useful if the process didn't start) - - `csauto.stderr` — csauto launch errors -- `-n N`: initial number of lines to display (default: `20`) +- `--file FILE`: log file to read. By default, the first file the Log Tail + offers for the case, usually the solver's main log (`run_solver.log` for + code_saturne, `csauto.stdout` for code_aster). Other common values: + - `csauto.stdout`: the run command's output (useful if the solver didn't start) + - `csauto.stderr`: the run command's errors + - `listing`: code_saturne's main log on older versions + - any path relative to the case +- `-n N`: number of lines shown at start (default: `20`) - `--no-follow`: print once and exit instead of following new lines Examples: ```bash -# Follow main solver log, show last 200 lines -csauto tail RUNS --case case0001 --file listing -n 200 +# Follow the solver's main log +csauto tail RUNS --case case0001 -# One-shot read of launch log -csauto tail RUNS --case case0001 --file csauto.stdout -n 50 --no-follow +# One-shot read of the launch log +csauto tail RUNS --case case0001 --file csauto.stdout --no-follow ``` --- ## `control` -> **UI equivalent**: Status panel → **Stop** button, plus a **More ▾** menu -> with Extend, Checkpoint, and Flush. +> **UI equivalent**: Status panel → **Control** menu, which lists the same actions. + +Sends one of the solver's live control actions to a running case. The actions +depend on the solver, and `csauto doctor RUNS` lists them with the value each +one takes: -Sends a live steering directive to a running case by dropping a -`control_file` into its active `RESU//` directory, which code_saturne -polls once per time step. This is the non-destructive alternative to killing -the process: the solver finishes its current step cleanly instead of being -interrupted mid-iteration. +``` +[OK] solver code_saturne: control actions stop, extend , checkpoint, flush +``` ```bash -csauto control [--stop | --extend N | --checkpoint | --flush] +csauto control [value] ``` -Exactly one action is required: +For code_saturne, csauto drops a `control_file` into the case's active +`RESU//` directory, which code_saturne polls once per time step. This is +the non-destructive alternative to killing the process: the solver finishes its +current step cleanly instead of being interrupted mid-iteration. Its actions: -- `--stop`: graceful stop — finish the current time step, write a checkpoint, +- `stop`: graceful stop. Finish the current time step, write a checkpoint, and exit. No restart is needed afterwards; the run is already at a consistent state. -- `--extend N`: raise the case's configured iteration limit (`nt_max`, as - code_saturne itself reports it — not csauto's own `--nt`/OpenMP thread count) +- `extend N`: raise the case's configured iteration limit (`nt_max`, as + code_saturne itself reports it, not csauto's own `--nt`/OpenMP thread count) by `N`, so it keeps running past a limit it's about to hit instead of stopping. csauto reads the actual limit from the solver's own logs (`setup.log`, or a prior extend's echo in `run_solver.log`/`listing`), so repeated extends compound correctly. Falls back to the case's current iteration if the configured limit can't be read yet (e.g. right after launch, before `setup.log` is written), or `0` if that isn't available either. -- `--checkpoint`: request a checkpoint at the next time step, without +- `checkpoint`: request a checkpoint at the next time step, without stopping the run. -- `--flush`: flush logs and time plots at the next time step. +- `flush`: flush logs and time plots at the next time step. -The case must be `RUNNING` for any of these to apply. Each action is logged -to the case's `.csauto.history.jsonl`. +The case must be `RUNNING`. An action that takes a value refuses to run +without one, and the others refuse a value. Each action is logged to the +case's `.csauto.history.jsonl`. code_aster has no live control actions. Examples: ```bash -csauto control RUNS case0007 --stop -csauto control RUNS case0007 --extend 500 -csauto control RUNS case0007 --checkpoint -csauto control RUNS case0007 --flush +csauto control RUNS case0007 stop +csauto control RUNS case0007 extend 500 +csauto control RUNS case0007 checkpoint +csauto control RUNS case0007 flush ``` --- ## `residuals` -> **UI equivalent**: **Residuals Plot** panel — interactive case selection, +> **UI equivalent**: **Residuals Plot** panel, with interactive case selection, > quantity picker, and live chart. Use this CLI command when you need to export > data to CSV or SVG for reports or external processing. Collects residual data from one or more cases and optionally renders an SVG plot. +Residuals are available for solvers that provide them (code_saturne). ```bash csauto residuals --case CASE_ID [--case CASE_ID ...] [--out FILE] [--plot FILE] [--columns COL ...] @@ -306,13 +341,14 @@ csauto residuals --case CASE_ID [--case CASE_ID ...] [--out FILE] [-- Options: -- `--case CASE_ID`: case to include — required, repeatable +- `--case CASE_ID`: case to include (required, repeatable) - `--out FILE`: write merged CSV to this path (stdout if omitted) - `--plot FILE`: render residuals as SVG to this path - `--columns COL [COL ...]`: limit SVG plot to these residual quantities The output CSV has one row per iteration, with columns for `case_id`, -`iteration`, and each residual quantity found in `residuals.csv`. +`iteration`, and each residual quantity found in code_saturne's `residuals.csv` +(or parsed from `run_solver.log` when that file is missing). Examples: @@ -329,10 +365,13 @@ csauto residuals RUNS --case case0001 --case case0002 \ ## `perf` -> **UI equivalent**: **Timing Snapshot** panel — select a case and click **Load**. +> **UI equivalent**: **Timing Snapshot** panel, which lists the timings of every +> case that has a timing log and refreshes on its own (narrow with **Cases**, +> export with **Download as CSV**). > Use this CLI command to export metrics to CSV for batch comparison or reporting. -Extracts timing and performance metrics from `performance.log` for one or more cases. +Extracts timing metrics from the solver's timing log (code_saturne: +`performance.log`) for one or more cases. ```bash csauto perf --case CASE_ID [--case CASE_ID ...] [--out FILE] @@ -340,11 +379,12 @@ csauto perf --case CASE_ID [--case CASE_ID ...] [--out FILE] Options: -- `--case CASE_ID`: case to include — required, repeatable +- `--case CASE_ID`: case to include (required, repeatable) - `--out FILE`: write CSV to this path (stdout if omitted) -The output CSV includes: elapsed time, number of processes, number of threads, -solver phase timings (initialization, time loop, I/O), and derived metrics. +The output CSV has `case_id` plus the solver's timing columns, the same as the +Timing Snapshot panel. For code_saturne: `elapsed_time`, `io_time`, +`linear_solver_time`, `gradients_time`, `balances_time`, `mpi_ranks`, `threads`. Examples: @@ -369,22 +409,29 @@ csauto doctor Checks performed: - `RUNS/` directory is writable -- At least one `case*` directory exists -- `setup.xml` is present in each case -- Runtime binary / image is accessible (reads `csauto.toml` — native binary, Singularity image, or Docker) -- X11 display availability (for GUI launch) +- At least one case exists (a folder listed in `registry.json` or holding a `doe_row.csv`) +- The solver's setup file is present in each case (`setup.xml`, or the `.export` for code_aster) +- What the solver offers: dashboard panels, capabilities, live control actions, and supported runtimes +- The runtime is usable (reads `csauto.toml`): the native executable, the Singularity + binary and image, or the `docker` command (the Docker image itself is not checked) +- X11 display availability (for GUI launch, code_saturne) +- Web dependencies (`fastapi`, `uvicorn`, `pydantic`) for `csauto serve` -Each check prints `[OK]` or `[FAIL]`. Fix all failures before running. +Each check prints `[OK]`, `[WARN]` or `[FAIL]`. Fix all failures before running. --- ## `cleanup` -> **UI equivalent**: Status panel → select cases → **Clean Selected**. The UI -> popup lets you choose interactively what to keep or delete. +> **UI equivalent**: Status panel → select cases → **Clean**. The UI +> popup lets you choose interactively which runs to keep or delete; Clean also +> cuts the solver's logs over 50 MB down to their last 50 MB and removes `.csauto.cid`. > Use this CLI command for scripting, scheduled cleanups, or disk-space emergencies. -Removes old RESU directories and truncates oversized logs. +Removes old run folders and truncates oversized logs. `--prune-resu` deletes +only the run folders the solver reports: each `RESU/` for code_saturne, +`RESU` itself for code_aster (one run per case). `RUNNING` and `PENDING` cases +are skipped. This command does not change case statuses. ```bash csauto cleanup [options] @@ -392,12 +439,12 @@ csauto cleanup [options] Options: -- `--prune-resu`: enable removal of old RESU run directories -- `--keep-last N`: keep the N most recent RESU dirs per case (default: `1`) -- `--max-log-mb X`: truncate log files larger than X MB +- `--prune-resu`: enable removal of old run folders +- `--keep-last N`: keep the N most recent run folders per case (default: `1`, `0` to delete all) +- `--max-log-mb X`: truncate the solver's log files larger than X MB, keeping their end - `--clear-cid`: remove `.csauto.cid` process tracking files - `--clear-pyc`: remove `__pycache__` directories under case folders -- `--dry-run`: preview what would be deleted — no actual changes +- `--dry-run`: preview what would be deleted, without any actual change If no cleanup option is provided, the command exits with an informational message and makes no changes. @@ -411,12 +458,12 @@ csauto cleanup RUNS --prune-resu --keep-last 1 --max-log-mb 100 --dry-run Examples: ```bash -# Remove all but the latest RESU run, truncate logs > 100 MB +# Remove all but the latest run, truncate logs > 100 MB csauto cleanup RUNS --prune-resu --keep-last 1 --max-log-mb 100 # Same, but preview first csauto cleanup RUNS --prune-resu --keep-last 1 --max-log-mb 100 --dry-run -# Remove all RESU history (keep none) +# Remove every run (keep none) csauto cleanup RUNS --prune-resu --keep-last 0 ``` diff --git a/docs/concepts.md b/docs/concepts.md index 06d19bb..5e4c497 100644 --- a/docs/concepts.md +++ b/docs/concepts.md @@ -7,9 +7,9 @@ Reading it once will make everything else click. When you run a code_saturne simulation study, you typically need to explore many parameter combinations: different inlet velocities, turbulence models, mesh -refinements, boundary conditions. Setting up each case by hand — copying -directories, editing XML files, launching processes, tracking outcomes — does not -scale beyond a handful of cases. +refinements, boundary conditions. Setting up each case by hand (copying +directories, editing XML files, launching processes, tracking outcomes) does not +scale beyond a handful of cases. The same holds for a code_aster study. csauto automates this entire loop: @@ -36,7 +36,7 @@ monitors everything. ## Key concepts -### DOE — Design of Experiments table +### DOE: Design of Experiments table Your parameter space is described in a CSV file called the **DOE** (Design of Experiments). Each row is one simulation case. Each column is one input parameter. @@ -54,11 +54,21 @@ and generates one case directory per row. The `case_id` column is optional. If absent, csauto auto-generates IDs: `case0001`, `case0002`, etc. +### Solver + +The **solver** is set by `solver` in `csauto.toml`: `code_saturne` (the default) +or `code_aster`. csauto knows each solver through an adapter that says how to +start it, where its files are, and how to read its output, so the dashboard +shows what that solver offers. `csauto prepare` records the solver in +`RUNS/campaign.json`; every later command on that `RUNS` folder uses it, from +any directory. + ### Template The **template** is your reference case directory. It contains all the files -needed to run one code_saturne simulation: `setup.xml`, optionally `run.cfg`, -optionally user source files under `SRC/`. +needed to run one simulation. For code_saturne: `setup.xml`, optionally +`run.cfg`, optionally user source files under `SRC/`. For code_aster: one +`.export` file and the command files it lists. Instead of hard-coded values, the template uses **placeholders**: @@ -79,21 +89,25 @@ row, evaluates IF conditions, and writes the result into each case directory. ### Placeholder syntax -- `{column_name}` — replaced with the DOE value for that column -- `...` — block included only if condition is true -- `...` — block included only if condition is false -- `...` — block included only if column value is truthy +- `{column_name}`: replaced with the DOE value for that column +- `...`: block included only if condition is true +- `...`: block included only if the value differs +- `...`: block included only if column value is truthy +- `\{name}`: rendered as a literal `{name}`, for braces that belong to the input + language (Python f-strings or sets in a code_aster `.comm` file); see + [doe-format.md](./doe-format.md#placeholder-syntax) Shell variables like `${HOME}` are left untouched. ### Case directory -A **case** (`caseXXXX`) is a fully resolved copy of your template for one DOE -row. After `csauto prepare`, each case contains: +A **case** (`caseXXXX`, or the DOE's `case_id`) is a fully resolved copy of your +template for one DOE row. After `csauto prepare`, each case contains: ``` RUNS/ ├── registry.json ← global state for all cases +├── campaign.json ← the solver of this campaign ├── case0001/ │ ├── DATA/ │ │ └── setup.xml ← rendered from template + DOE row @@ -104,7 +118,8 @@ RUNS/ ``` The `doe_row.csv` file inside each case records exactly which parameter values -were used — useful for traceability. +were used, which is useful for traceability. With the registry, it is also how +csauto recognizes a case folder. ### RUNS directory @@ -124,20 +139,22 @@ the browser: launching, monitoring, restarting, cleaning. The **registry** (`RUNS/registry.json`) is csauto's persistent state. It stores the current status, process IDs, Slurm job IDs, iteration count, and metadata for -every case. You never edit it manually — csauto maintains it automatically. +every case. You never edit it manually: csauto maintains it automatically. ### Runtime -A **runtime** is the execution backend csauto uses to actually run code_saturne: +A **runtime** is the execution backend csauto uses to actually run the solver: | Runtime | When to use | |---|---| -| `native` | code_saturne binary installed directly on the machine | -| `docker` | code_saturne inside a Docker container | -| `singularity` | code_saturne inside a Singularity/Apptainer image (common on HPC) | -| `auto` | csauto detects the best available option | +| `native` | the solver installed directly on the machine (`code_saturne`, or `run_aster` for code_aster) | +| `docker` | the solver inside a Docker container (the image defaults to the solver's own) | +| `singularity` | the solver inside a Singularity/Apptainer image (common on HPC) | +| `auto` | csauto picks the first available among the runtimes the solver supports | -The runtime is set in `csauto.toml` or via CLI flags. +The runtime is set in `csauto.toml` or via CLI flags. Whatever the runtime, the +solver starts inside the case folder; containers mount the campaign folder at +`/mnt`. ### RESU directory @@ -147,8 +164,7 @@ when a run starts: ``` RUNS/case0001/RESU/ └── 20260308-1413/ ← one directory per run attempt - ├── listing ← main solver log - ├── run_solver.log + ├── run_solver.log ← main solver log (listing on older versions) ├── residuals.csv ├── performance.log ├── checkpoint/ ← restart data @@ -159,14 +175,18 @@ RUNS/case0001/RESU/ Each run attempt gets a timestamped directory. If you restart a case, a new `RESU//` directory is created alongside the previous ones. +code_aster writes its results straight into `RESU/` (the paths its `.export` +gives, such as `RESU/myresults.rmed`), so each case holds one run and a new run +replaces it. + ### Checkpoint and restart A **checkpoint** is the restart data saved by code_saturne at the end of (or during) a run. It lives at `RESU//checkpoint/`. csauto resolves the latest checkpoint automatically. From the web UI, select -the case, click **Restart Selected**, choose a stop criterion, and submit — -no need to know the checkpoint path. +the case, click **Restart**, choose a stop criterion, and submit: no need to +know the checkpoint path. Restart is available for code_saturne. --- @@ -178,15 +198,19 @@ A case moves through these states: [prepare] │ ▼ -PREPARED ──► [run] ──► RUNNING ──► DONE - │ - └──► FAILED +PREPARED ──► [run] ──► PENDING ──► RUNNING ──► DONE + │ + └──► FAILED ``` -- **PREPARED**: case directory exists, never launched -- **RUNNING**: active process or Slurm job -- **DONE**: completed successfully (log signature detected) -- **FAILED**: abnormal termination or error detected +- **PREPARED**: case directory exists, not launched yet (or the dashboard's Clean deleted all its runs) +- **PENDING**: next in line, waiting for a free launch slot (Max Parallel); the + other cases of the batch keep their status until their turn +- **RUNNING**: active process or Slurm job. A case stays `RUNNING` until its + process or job is gone, even after its log prints a verdict +- **DONE**: the run ended and the solver reported success, or, when its logs give + no verdict, its command exited with status 0 +- **FAILED**: the solver reported a failure, or, with no verdict, its command did not exit with status 0 For finished cases, you can set a convergence label (`Converged` / `Not converged`) from the UI context menu. @@ -195,12 +219,13 @@ For finished cases, you can set a convergence label (`Converged` / ## Shared MESH/POST directories -`prepare` places one `MESH/` and one `POST/` folder directly under `RUNS/` (not -per-case) so every case can reference the mesh with a relative `../MESH` path. -How that folder gets there is controlled by `mesh_mode` in `csauto.toml` (or -`--mesh-mode` on `csauto prepare`): +`prepare` places the solver's shared folders (code_saturne: `MESH/` and `POST/`; +code_aster: `MESH/`) directly under `RUNS/` (not per-case) so every case can +reference the mesh with a relative `../MESH` path (a code_aster `.export` lists +`../MESH/`). How that folder gets there is controlled by `mesh_mode` in +`csauto.toml` (or `--mesh-mode` on `csauto prepare`): -- `symlink` (default) — `RUNS/MESH` and `RUNS/POST` become symlinks to the +- `symlink` (default): `RUNS/MESH` and `RUNS/POST` become symlinks to the original directories instead of copies, so large meshes (`.med` files can be gigabytes) are never duplicated per study. Container runtimes handle this transparently: `csauto run` bind-mounts each symlink target into the @@ -208,9 +233,9 @@ How that folder gets there is controlled by `mesh_mode` in `csauto.toml` (or writable), so the symlinks stored in `RUNS/` resolve identically on both sides. A broken symlink (target deleted or moved) is still detected up front and reported before launching. -- `copy` — the template's sibling `MESH/`/`POST/` dirs are physically copied - into `RUNS/`. Uses more disk, but makes `RUNS/` fully self-contained — useful - when the runs directory is moved or archived independently of the study. +- `copy`: the template's sibling `MESH/`/`POST/` dirs are physically copied + into `RUNS/`. Uses more disk, but makes `RUNS/` fully self-contained, which is + useful when the runs directory is moved or archived independently of the study. - On Windows, creating a symlink may require developer mode or elevated privileges; `prepare` falls back to copying (with a warning) if the symlink cannot be created. @@ -223,7 +248,7 @@ On HPC clusters, csauto submits each case as a Slurm job via `sbatch` instead of launching a local background process. The job ID is tracked in the registry. Status refreshes use `squeue` to detect whether the job is still running. -Local and Slurm modes are configured in `csauto.toml` — see [config.md](./config.md). +Local and Slurm modes are configured in `csauto.toml`; see [config.md](./config.md). --- @@ -238,9 +263,10 @@ my-campaign/ │ └── setup.xml └── RUNS/ ← generated cases (created by prepare) ├── registry.json + ├── campaign.json ├── case0001/ └── case0002/ ``` Keep `RUNS/` out of version control (add it to `.gitignore`). Track -`doe.csv` and `TEMPLATE/` — they are your actual inputs. +`doe.csv` and `TEMPLATE/`: they are your actual inputs. diff --git a/docs/config.md b/docs/config.md index 20b8c60..437d42e 100644 --- a/docs/config.md +++ b/docs/config.md @@ -24,7 +24,7 @@ If no file is found, all default values are used. runtime = "native" saturne_bin = "/opt/code_saturne/bin/code_saturne" -# No Slurm, run up to 2 cases at the same time +# No Slurm; csauto run launches at most 2 cases at a time use_slurm = false max_parallel = 2 @@ -46,7 +46,7 @@ use_slurm = true # MPI options injected via CS_MPIEXEC_OPTIONS for each sbatch job mpi_exec_options = "--mca btl vader,self,tcp --bind-to core" -# Allow up to 20 jobs in the queue simultaneously +# csauto run keeps at most 20 jobs submitted (queued or running) at a time max_parallel = 20 # Serve UI on login node, tunnel with: ssh -L 8000:127.0.0.1:8000 login-node @@ -68,16 +68,17 @@ host = "127.0.0.1" port = 8000 ``` -With `use_slurm = true`, `csauto` submits a dedicated batch script for the -Singularity runtime. The job follows the same pattern as a manual HPC launch: +For code_saturne with `use_slurm = true`, `csauto` submits a dedicated batch +script for the Singularity runtime (`.csauto.slurm.sh` in the case folder). The +job follows the same pattern as a manual HPC launch: `code_saturne run --stage --initialize`, then `srun ./cs_solver --mpi`, then -`code_saturne run --finalize`. +`code_saturne run --finalize`. Other runs are submitted with `sbatch --wrap`. ### Docker container ```toml runtime = "docker" -docker_image = "simvia/code_saturne" +docker_image = "simvia/code_saturne" # optional: the solver's own image by default use_slurm = false max_parallel = 2 @@ -86,6 +87,22 @@ host = "127.0.0.1" port = 8000 ``` +Containers mount the campaign folder at `/mnt` and start the solver inside the +case folder (`docker run --rm --entrypoint ...`), so the image does not need +the solver as its entrypoint. + +### code_aster + +```toml +solver = "code_aster" +runtime = "docker" # docker_image defaults to simvia/code_aster:17.4.0 + +max_parallel = 2 +``` + +For the `native` runtime, `run_aster` must be in `PATH`, or `saturne_bin` must +point to it. + ### Remote access with authentication ```toml @@ -109,16 +126,16 @@ token = "your-secret-token" | Key | Default | Description | |---|---|---| -| `solver` | `code_saturne` | Solver adapter used for command building, output parsing, and file conventions (`code_saturne`, or `stub` for testing; see [architecture.md](./architecture.md#solver-adapter-boundary)) | +| `solver` | `code_saturne` | The campaign's solver: `code_saturne`, `code_aster`, or `stub` (a fake solver for tests). `csauto prepare` records it in `RUNS/campaign.json` (see [architecture.md](./architecture.md#solver-adapter-boundary)) | | `runtime` | `auto` | Execution backend: `auto`, `native`, `docker`, or `singularity` | -| `saturne_bin` | (auto-detected) | Path to the `code_saturne` binary for `native` runtime | -| `docker_image` | `simvia/code_saturne` | Docker image name for `docker` runtime | +| `saturne_bin` | (auto-detected) | Path to the native solver executable (`code_saturne`, or `run_aster` for code_aster) for `native` runtime | +| `docker_image` | (the solver's own image) | Docker image name for `docker` runtime; defaults to `simvia/code_saturne` for code_saturne, `simvia/code_aster:17.4.0` for code_aster | | `singularity_image` | (none) | Path or URI to `.sif` image for `singularity` runtime | | `singularity_bin` | (auto-detected) | Path to `apptainer` or `singularity` binary | | `use_slurm` | (auto-detected) | `true` to force Slurm submission, `false` to force local | -| `mpi_exec_options` | (none) | Options injected as `CS_MPIEXEC_OPTIONS` in Slurm jobs | -| `max_parallel` | `1` | Maximum simultaneous case launches | -| `mesh_mode` | `symlink` | How `prepare` places the shared `MESH`/`POST` dirs into `RUNS/`: `symlink` or `copy` (see [concepts.md](./concepts.md#shared-meshpost-directories)) | +| `mpi_exec_options` | (none) | MPI options for Slurm jobs, passed to code_saturne as `CS_MPIEXEC_OPTIONS` (code_aster ignores it) | +| `max_parallel` | `1` | Default of `csauto run --max-parallel`. The web UI does not read it: set Max Parallel in the Run or Restart dialog (left empty, every selected case starts at once) | +| `mesh_mode` | `symlink` | How `prepare` places the solver's shared dirs (`MESH`, plus `POST` for code_saturne) into `RUNS/`: `symlink` or `copy` (see [concepts.md](./concepts.md#shared-meshpost-directories)) | | `host` | `127.0.0.1` | Bind address for `serve` | | `port` | `8000` | Bind port for `serve` | | `[api].token` | (none) | API authentication token | @@ -139,8 +156,13 @@ token = "your-secret-token" **Runtime**: CLI flags (`--runtime`, `--saturne-bin`, etc.) override the TOML values. +**Solver**: commands on an existing campaign use the solver recorded in +`RUNS/campaign.json` by `prepare`, whatever directory they run from; a different +`solver` in `csauto.toml` is ignored with a warning. `prepare` refuses to add +cases to a folder prepared for another solver. + **Slurm detection order**: -1. `use_slurm` in `csauto.toml` — if set, this is authoritative +1. `use_slurm` in `csauto.toml`: if set, this is authoritative 2. `CSAUTO_USE_SLURM` environment variable 3. Auto-detection: checks if `sbatch` is in `PATH` and Slurm environment variables are set @@ -150,23 +172,28 @@ token = "your-secret-token" ## Auto runtime resolution -When `runtime = "auto"`, csauto tries backends in this order: +When `runtime = "auto"`, csauto tries backends in this order, among the +runtimes the solver supports (code_saturne and code_aster support all three): 1. Explicit `saturne_bin` set → use `native` 2. Explicit `singularity_image` set → use `singularity` 3. `docker` command available → use `docker` -4. `code_saturne` in `PATH` → use `native` +4. The solver's executable (`code_saturne`, `run_aster`) in `PATH` → use `native` 5. None found → error +Asking explicitly for a runtime the solver does not support is refused before +anything starts. + --- ## `mpi_exec_options` and Slurm -When Slurm submission is active and `mpi_exec_options` is set, the value is -injected as: +When Slurm submission is active and `mpi_exec_options` is set, code_saturne +receives the value as: ```bash CS_MPIEXEC_OPTIONS="" ``` -If not set, no `CS_MPIEXEC_OPTIONS` is injected. +With a container runtime, the variable is set inside the container instead. If +not set, no `CS_MPIEXEC_OPTIONS` is injected. code_aster ignores this option. diff --git a/docs/doe-format.md b/docs/doe-format.md index bcf292e..2a4dcc5 100644 --- a/docs/doe-format.md +++ b/docs/doe-format.md @@ -85,7 +85,7 @@ digits, `.`, `_`, `-`) and `case_id` is reserved. For `lhs`/`sobol`/`ccd`, continuous parameters are sampled using the chosen method, and discrete parameters are crossed with every sample (outer -product) — e.g. 10 LHS samples over one continuous parameter crossed with a +product): e.g. 10 LHS samples over one continuous parameter crossed with a 2-level discrete parameter yields 20 rows. Continuous values are rounded to `--round` digits (default 6). Use `--seed` @@ -98,7 +98,7 @@ CSV). Pass `--force` to overwrite an existing output file. placeholders and `` condition variables (from `./TEMPLATE` by default, or the directory given with `--template DIR`): -- a spec parameter matching nothing in the template is an **error** — a typo +- a spec parameter matching nothing in the template is an **error**: a typo like `u_inlett` vs `{u_inlet}` would otherwise generate a study that runs successfully with the template's hardcoded value, never varying the intended parameter; @@ -118,9 +118,12 @@ error. - If absent, IDs are auto-generated in sequence: `case0001`, `case0002`, ... - If provided: - Must be non-empty - - Allowed characters: letters, digits, `.`, `_`, `-` + - Allowed characters: letters, digits, `.`, `_`, `-`; the first one must be a + letter or a digit - `/` and `\` are forbidden - Example valid IDs: `case0001`, `run-A`, `mesh.fine` +- Every command works with any valid ID: csauto finds cases from its registry + and their `doe_row.csv`, not from their names --- @@ -133,10 +136,19 @@ Write `{column_name}` anywhere in your template files: ``` Rules: -- Every placeholder must have a matching column in the DOE header +- Every placeholder must have a matching column in the DOE header (the error + names the file that uses it) - Active placeholders cannot have an empty value - Shell-style `${VAR}` patterns are ignored (not processed) -- Placeholders work in `setup.xml`, `run.cfg`, and `SRC/*.cpp` user files +- Write `\{name}` to keep a literal `{name}`, when braces belong to the input + language (Python f-strings or sets in a code_aster `.comm` file, C/C++ code). + csauto removes the backslash when it generates the cases +- Placeholders work in every text file of the template: the solver's setup file + (`setup.xml`, or the code_aster `.export`), `run.cfg`, user sources such as + `SRC/*.cpp`, code_aster `.comm` files. Binary files, hidden files and editor + backup files are copied without rendering +- Rendered files keep their bytes: text in another encoding than UTF-8 (a + comment in Latin-1, say) comes out unchanged --- @@ -154,8 +166,8 @@ Supported forms: | Syntax | Included when | |---|---| -| `` | value is non-empty and not `false`/`0` | -| `` | value matches exactly | +| `` | value is not empty, `0`, `false`, `no`, `off` or `none` (any case) | +| `` or `` | value matches exactly | | `` | value does not match | The condition variable (`key`) must also have a matching column in the DOE header. @@ -164,11 +176,11 @@ The condition variable (`key`) must also have a matching column in the DOE heade ## Empty values and unused columns -- **Empty value for an active placeholder**: error — csauto stops with +- **Empty value for an active placeholder**: error, csauto stops with `Missing placeholder values for caseXXXX` - **Unused column** (no matching placeholder or IF condition): allowed, reported as a warning -- **Empty value inside an inactive IF block**: allowed — the block is skipped +- **Empty value inside an inactive IF block**: allowed, the block is skipped --- @@ -183,7 +195,7 @@ case0004,15.0,1.2,1.8e-5,k-omega,true,DOM ``` Notes: -- `radiation_model` is empty for `case0001` and `case0002` — this is fine because +- `radiation_model` is empty for `case0001` and `case0002`: this is fine because the template wraps `{radiation_model}` inside `` - The IF block is skipped entirely for those cases, so the empty value is never activated diff --git a/docs/formats.md b/docs/formats.md index 4123de2..62fe2fb 100644 --- a/docs/formats.md +++ b/docs/formats.md @@ -15,9 +15,9 @@ case0001,0.10,1.20 case0002,0.20,1.30 ``` -## `setup.xml` (template input) +## `setup.xml` (code_saturne template input) -Required template file. +Required template file for code_saturne. Accepted locations: @@ -26,14 +26,22 @@ Accepted locations: Supports placeholders and IF blocks. -## `run.cfg` (optional template input) +## `run.cfg` (optional code_saturne template input) Optional file, can be in template root or under `DATA/`. Also supports placeholders and IF blocks. +## `.export` (code_aster template input) + +Required template file for code_aster: exactly one `*.export` file at the root +of the template. It lists the command files, the mesh and the result files: +reference the shared mesh folder as `../MESH/` and write results under +`RESU/`. Like the `.comm` command files, it supports placeholders and IF blocks. + ## User source files in `SRC/` (optional template input) -Template text files under `SRC/` are also rendered. +Every text file of the template that holds placeholders or IF blocks is rendered, +including user sources under `SRC/`. Example: @@ -41,7 +49,8 @@ Example: Note: -- placeholders are detected using `{name}` syntax, so avoid ambiguous brace patterns in C/C++ code. +- placeholders are detected using `{name}` syntax; write `\{name}` for braces + that must stay as they are in C/C++ code (see [doe-format.md](./doe-format.md#placeholder-syntax)). ## `doe_row.csv` (generated per case) @@ -51,7 +60,25 @@ Generated at: RUNS/case0001/doe_row.csv ``` -Contains the resolved DOE values used for that case. +Contains the resolved DOE values used for that case. With the registry, it is +how csauto recognizes case folders. + +## `campaign.json` (campaign solver) + +Located at: + +```text +RUNS/campaign.json +``` + +Written by `csauto prepare`: + +```json +{ "solver": "code_aster" } +``` + +Every later command on the campaign uses this solver, whatever directory it +runs from. ## `registry.json` (global state) @@ -73,19 +100,36 @@ Stores status and metadata, including: Typical files: ```text -RUNS/case0001/csauto.stdout +RUNS/case0001/csauto.stdout ← output of the run command RUNS/case0001/csauto.stderr RUNS/case0001/.csauto.history.jsonl -RUNS/case0001/.csauto.jobid -RUNS/case0001/RESU//listing -RUNS/case0001/RESU//run_solver.log +RUNS/case0001/.csauto.exitcode ← exit status of the last run command +RUNS/case0001/.csauto.jobid ← Slurm job ID +RUNS/case0001/.csauto.cid ← Docker container ID +RUNS/case0001/.csauto.slurm.sh ← batch script, for solvers that write one +RUNS/case0001/.csauto.export ← code_aster: the export actually run +``` + +`.csauto.exitcode` is written when the run command ends, for local runs and +`sbatch --wrap` jobs. code_saturne writes its Slurm batch script for the +Singularity runtime. code_aster runs `.csauto.export`, a copy of the case's +`.export` with `mpi_nbcpu` and `ncpus` set from `n` and `nt`; the case's own +`.export` is never modified. + +code_saturne writes one folder per run: + +```text +RUNS/case0001/RESU//run_solver.log ← main solver log (listing on older versions) RUNS/case0001/RESU//residuals.csv RUNS/case0001/RESU//performance.log RUNS/case0001/RESU//monitoring/*.csv RUNS/case0001/RESU//profiles/*.csv ``` -## `residuals.csv` +code_aster writes its results straight into `RUNS/case0001/RESU/`, at the paths +its `.export` gives, so a case holds one run. + +## `residuals.csv` (code_saturne) Typical format: @@ -97,13 +141,13 @@ iteration,velocity,pressure If missing, residual fallback parsing from `run_solver.log` may be used. -## Probes and profiles CSV +## Probes and profiles CSV (code_saturne) - probes: `RESU//monitoring/*.csv` - profiles: `RESU//profiles/*.csv` UI labels are derived from physical quantity naming in filenames. -## `performance.log` +## `performance.log` (code_saturne) `csauto` extracts elapsed time, ranks, threads, solver timings, and IO timings from known text patterns. diff --git a/docs/limitations.md b/docs/limitations.md index b228eff..6d22c4a 100644 --- a/docs/limitations.md +++ b/docs/limitations.md @@ -1,8 +1,17 @@ # Limitations and Best Practices -## Log-based completion detection +## Solver features -`RUNNING -> DONE/FAILED` transitions rely on process/job status and log signatures. +The dashboard shows what the campaign's solver supports. Residuals, probes, +timings, restart, live control and the GUI are available for code_saturne. +code_aster campaigns get Status, Compare, Log Tail and Recent Errors; each +code_aster case holds one run, and a new run replaces its results. + +## Completion detection + +A run ends when its process or Slurm job is gone. Its status then comes from +the solver's verdict in its logs, or, when the logs give none, from the exit +status of its command (`.csauto.exitcode`: 0 means `DONE`). Best practice: keep clean per-run logs and avoid mixing historical logs. @@ -24,7 +33,7 @@ Best practice: ## GUI launch constraints -`open_gui` requires valid `DISPLAY` and X11 access. +`open_gui` (code_saturne) requires valid `DISPLAY` and X11 access. This is often unavailable on headless HPC nodes. ## Runtime feature differences @@ -33,17 +42,16 @@ Not all features are available across all runtimes: | Feature | native | singularity | docker | |---|:---:|:---:|:---:| -| Slurm (`sbatch`) | ✓ | ✓ | ✗ | -| `mpi_exec_options` | ✓ (Slurm only) | ✓ (Slurm only) | ✗ | +| Slurm (`sbatch`) | ✓ | ✓ | ✓ (needs Docker on the compute nodes) | +| `mpi_exec_options` | ✓ (Slurm only) | ✓ (Slurm only) | ✓ (Slurm only) | | `open_gui` | ✓ | ✓ | ✓ | | Container kill (`docker stop`) | ✗ | ✗ | ✓ | | Container ID tracking (`.csauto.cid`) | ✗ | ✗ | ✓ | -**Docker is incompatible with Slurm.** Even with `use_slurm = true` in `csauto.toml`, -Slurm submission is silently disabled for the Docker runtime. The reason is that Docker -requires a root-owned daemon (`dockerd`) running on every compute node, which is not -available on HPC clusters. If you have a Docker image, convert it to a Singularity image -first: +**Docker rarely works with Slurm.** csauto submits Docker runs to Slurm like the +others, but each compute node then needs a running Docker daemon (`dockerd`), +which HPC clusters seldom provide. If you have a Docker image, convert it to a +Singularity image first: ```bash apptainer pull code_saturne.sif docker://simvia/code_saturne @@ -53,14 +61,16 @@ Then use `runtime = "singularity"` with `use_slurm = true`. ## Scheduler scope -Built-in scheduler integration targets Slurm (`sbatch`/`squeue`/`scancel`), with -opportunistic support for PBS/Torque (`qsub`/`qstat`/`qdel`) and LSF (`bsub`/`bjobs`/`bkill`) -for job kill operations. Without a supported scheduler, launches run as local background processes. +Launching and status use Slurm (`sbatch`, `squeue`). Kill tries `scancel`, `qdel` +(PBS/Torque) and `bkill` (LSF), whichever is installed, on a job id taken from +the registry, `.csauto.jobid` or the case's logs. Without Slurm, launches run as +local background processes. ## Restart dependency -Restart requires valid checkpoint data under `RESU//checkpoint`. -Without checkpoints, restart cannot run. +Restart (code_saturne) requires valid checkpoint data under `RESU//checkpoint`. +Without checkpoints, restart cannot run: the case keeps its status and the +other selected cases still launch. ## Public API exposure diff --git a/docs/quickstart.md b/docs/quickstart.md index fe94132..d542eea 100644 --- a/docs/quickstart.md +++ b/docs/quickstart.md @@ -3,9 +3,13 @@ This guide walks you from zero to a running campaign with monitoring UI. It covers both **local** (workstation/server) and **Slurm** (HPC cluster) setups. -If you haven't read [Core concepts](./concepts.md) yet, do it first — it takes 5 +If you haven't read [Core concepts](./concepts.md) yet, do it first: it takes 5 minutes and will make this page much clearer. +This guide uses code_saturne. For code_aster, the steps are the same with +`solver = "code_aster"` in `csauto.toml`; [examples/codeaster-cube](../examples/codeaster-cube/README.md) +is a complete code_aster campaign. + --- ## Prerequisites @@ -15,7 +19,7 @@ minutes and will make this page much clearer. - A working code_saturne runtime (one of): - `native`: `code_saturne` binary installed and in `PATH`, or path set via `saturne_bin` - `singularity`: Apptainer or Singularity + a `.sif` image file - - `docker`: Docker engine running + a code_saturne image + - `docker`: Docker engine running (the image defaults to `simvia/code_saturne`) For Slurm: `sbatch`, `squeue`, `scancel` in `PATH`. @@ -77,7 +81,7 @@ port = 8000 ```toml runtime = "docker" -docker_image = "simvia/code_saturne" +docker_image = "simvia/code_saturne" # optional: the default image for code_saturne use_slurm = false max_parallel = 2 @@ -85,7 +89,9 @@ host = "127.0.0.1" port = 8000 ``` -See [config.md](./config.md) for all available keys and their defaults. +`max_parallel` is the default of `csauto run --max-parallel`; in the web UI, the +Run dialog has its own **Max Parallel** field. See [config.md](./config.md) for +all available keys and their defaults. --- @@ -102,7 +108,7 @@ case0003,1.2,kwSST,0.8 case0004,1.0,kwSST,0.8 ``` -- `case_id` is optional — omit it and csauto will generate `case0001`, `case0002`, ... +- `case_id` is optional: omit it and csauto will generate `case0001`, `case0002`, ... - Column names must exactly match the placeholders you use in the template. See [doe-format.md](./doe-format.md) for the full format specification. @@ -125,7 +131,7 @@ TEMPLATE/ Below are two real examples drawn from a `setup.xml`. -**Simple value substitution** — density is read from the DOE column `density_value`: +**Simple value substitution**: density is read from the DOE column `density_value`: ```xml @@ -133,7 +139,7 @@ Below are two real examples drawn from a `setup.xml`. ``` -**Conditional blocks** — the turbulence model section is included only when the +**Conditional blocks**: the turbulence model section is included only when the DOE column `turbulence_model` matches the condition. Only one block is active per case: @@ -154,7 +160,7 @@ per case: ``` -Note that `{ref_v}` is inside the `kwSST` block — it is only active (and +Note that `{ref_v}` is inside the `kwSST` block: it is only active (and therefore required in the DOE) when `turbulence_model == "kwSST"`. For rows where `turbulence_model` is `Spalart-Allmaras`, the entire block is dropped and the value of `ref_v` is ignored. @@ -162,6 +168,7 @@ and the value of `ref_v` is ignored. You can also place placeholders in: - `TEMPLATE/run.cfg` - `TEMPLATE/SRC/*.cpp` (user subroutines) +- any other text file of the template See [doe-format.md](./doe-format.md) for the full placeholder and IF block syntax. @@ -169,7 +176,7 @@ See [doe-format.md](./doe-format.md) for the full placeholder and IF block synta ## 5. Generate cases -> `prepare` is a terminal-only step — there is no UI equivalent. Run it from +> `prepare` is a terminal-only step: there is no UI equivalent. Run it from > the directory that contains `doe.csv` and `TEMPLATE/`. ```bash @@ -185,8 +192,9 @@ Expected output: ``` RUNS/ ├── registry.json +├── campaign.json ← the solver of this campaign (code_saturne) ├── case0001/ -│ ├── DATA/setup.xml ← {u_inlet} replaced with 12.0, etc. +│ ├── DATA/setup.xml ← {density_value} replaced with 1.2, etc. │ └── doe_row.csv ← the DOE values used for this case ├── case0002/ ├── case0003/ @@ -194,21 +202,22 @@ RUNS/ ``` If anything is wrong (missing placeholder column, empty value, missing `setup.xml`), -csauto reports the error before creating any files. +csauto stops with an error naming the problem. --- ## 6. Validate before launching -> `doctor` and `status` are terminal-only steps. Once they pass, everything -> else happens in the web UI. +> `doctor` is terminal-only (`csauto status` is the terminal view of the Status +> panel). Once it passes, everything else happens in the web UI. ```bash csauto doctor RUNS ``` This checks that: -- the runtime binary/image is accessible +- the runtime is available (for Docker, the `docker` command; the image itself + is not checked) - case directories have the expected structure - write access to `RUNS/` is available @@ -258,16 +267,19 @@ See [web-ui.md](./web-ui.md) for the full guide. In the **Status** panel, all your `PREPARED` cases appear in the table. 1. Select all cases: `Ctrl/Cmd + A` -2. Click **Run Selected** +2. Click **Run** 3. Fill in the popup: - - **n** — MPI ranks per case (e.g. `4`) - - **nt** — OpenMP threads per rank (e.g. `2`) - - **max parallel** — how many cases run simultaneously (e.g. `2`) -4. Click **Submit** + - **n**: MPI ranks per case (e.g. `4`) + - **nt**: OpenMP threads per rank (e.g. `2`) + - **Max Parallel**: how many cases run at the same time (e.g. `2`; left empty, + every selected case starts at once) +4. Click **Run** in the popup -Cases move to `RUNNING` status. The table refreshes automatically. +Cases move to `RUNNING`. The case next in line shows `PENDING` while it waits for +a free slot, and the others keep their status until their turn. The table +refreshes automatically. -**On a Slurm cluster**, the same UI flow applies — each case is submitted via +**On a Slurm cluster**, the same UI flow applies: each case is submitted via `sbatch` under the hood. You can verify with `squeue -u "$USER"` in the terminal. ### Alternative: launch from the command line @@ -294,12 +306,12 @@ csauto run RUNS --n 4 --nt 2 --resume Once cases are running, everything can be done from the browser: -- **Status panel** — monitor iteration count, duration, disk usage per case -- **Residuals Plot** — inspect solver convergence curves -- **Log Tail** — stream the `listing` file live (select case → Log Tail tab) -- **Recent Errors** — scan for errors and warnings after a case fails -- **Restart Selected** — restart from checkpoint without touching any files -- **Kill Selected** — stop a running case immediately +- **Status panel**: monitor iteration count, duration, disk usage per case +- **Residuals Plot**: inspect solver convergence curves +- **Log Tail**: stream the solver's log live (`run_solver.log`; select case → Log Tail tab) +- **Recent Errors**: scan for errors and warnings after a case fails +- **Restart**: restart from checkpoint without touching any files +- **Kill**: stop a running case immediately For terminal-based monitoring: @@ -307,8 +319,8 @@ For terminal-based monitoring: # Check status table csauto status RUNS -# Watch a log in real time -csauto tail RUNS --case case0001 --file listing -n 100 +# Watch the solver's log in real time +csauto tail RUNS --case case0001 # Export residuals as CSV + SVG csauto residuals RUNS --case case0001 --out residuals.csv --plot residuals.svg @@ -319,8 +331,9 @@ csauto residuals RUNS --case case0001 --out residuals.csv --plot residuals.svg ## 10. Cleanup In the **Status** panel, select the cases you want to clean and click -**Clean Selected**. A popup lets you choose which RESU runs to keep or delete, -and whether to truncate heavy logs. +**Clean**. A popup lets you choose which RESU runs to keep or delete. Clean also +cuts the solver's logs over 50 MB down to their last 50 MB and removes +`.csauto.cid`. Running and pending cases are left alone. ### Alternative: command line diff --git a/docs/run-lifecycle.md b/docs/run-lifecycle.md index 5feef88..cbc9270 100644 --- a/docs/run-lifecycle.md +++ b/docs/run-lifecycle.md @@ -1,6 +1,6 @@ # Run Lifecycle -A case moves through four states from creation to completion. +A case moves through five states from creation to completion. --- @@ -10,7 +10,10 @@ A case moves through four states from creation to completion. csauto prepare │ ▼ - PREPARED ──────► [run / Run Selected] + PREPARED ──────► [run / Run] + │ + ▼ + PENDING (next in line for a launch slot) │ ▼ RUNNING @@ -22,10 +25,10 @@ csauto prepare │ │ └───────────┬───────────┘ │ - [Restart Selected] + [run / Run / Restart] │ ▼ - RUNNING + PENDING ──► RUNNING ──► ... ``` --- @@ -35,46 +38,70 @@ csauto prepare ### `PREPARED` The case directory has been created by `csauto prepare` and is ready to launch. -No simulation has started yet. +No simulation has started yet. A finished case also returns to `PREPARED` when +the dashboard's Clean deletes all its runs. Relevant files: -- `RUNS/caseXXXX/DATA/setup.xml` — rendered from template -- `RUNS/caseXXXX/doe_row.csv` — DOE values used for this case -- `RUNS/registry.json` — registry entry with `status: PREPARED` +- `RUNS/caseXXXX/DATA/setup.xml`: rendered from template (code_saturne; the + `.export` and `.comm` files for code_aster) +- `RUNS/caseXXXX/doe_row.csv`: DOE values used for this case +- `RUNS/registry.json`: registry entry with `status: PREPARED` +- `RUNS/campaign.json`: the solver of the campaign + +### `PENDING` + +The case is next in line and waits for a free launch slot: fewer running cases +in the campaign than Max Parallel (`--max-parallel` for `csauto run`). The other +cases of the batch keep their status until their turn. If the solver refuses to +launch it (a code_saturne restart without checkpoint, say), the case goes back +to the status it had, and the other cases of the batch still launch. ### `RUNNING` -A simulation is active — either a local background process or a Slurm job. +A simulation is active: either a local background process or a Slurm job. +Every runtime starts the solver inside the case folder. Relevant files: -- `RUNS/caseXXXX/csauto.stdout` — csauto launch output -- `RUNS/caseXXXX/csauto.stderr` — csauto launch errors -- `RUNS/caseXXXX/.csauto.cid` — Docker container ID (Docker runtime only) -- `RUNS/caseXXXX/.csauto.jobid` — Slurm job ID (only when Slurm is active) -- `RUNS/caseXXXX/RESU//listing` — main solver log -- `RUNS/caseXXXX/RESU//run_solver.log` — solver launch log - -Status is refreshed by reading process/job state and log signatures: -- Local (native/singularity): checks if the PID stored in `registry.json` is still alive -- Docker: checks the container ID stored in `.csauto.cid` -- Slurm: calls `squeue` to check if the job ID is still active +- `RUNS/caseXXXX/csauto.stdout`: output of the run command +- `RUNS/caseXXXX/csauto.stderr`: errors of the run command +- `RUNS/caseXXXX/.csauto.cid`: Docker container ID (Docker runtime only) +- `RUNS/caseXXXX/.csauto.jobid`: Slurm job ID (only when Slurm is active) +- `RUNS/caseXXXX/.csauto.exitcode`: exit status of the run command, written + when it ends (local runs and `sbatch --wrap` jobs) +- `RUNS/caseXXXX/RESU//run_solver.log`: code_saturne's main log + (`listing` on older versions) + +Status is refreshed by checking whether the run is still alive: +- Local runs (native, docker, singularity): the PID stored in `registry.json` + (a PID that another process took over, after a reboot for instance, does not count) +- Slurm: `squeue` reports the job ID as active + +A case stays `RUNNING` until its process or job is gone, even after its log +prints a verdict: the solver may still be writing results. Only when `squeue` +cannot tell does a verdict (or a recorded exit status) end the run early. ### `DONE` -The simulation completed successfully. Code_Saturne wrote a normal completion -signature to the log. +The run ended and the solver reported success: code_saturne wrote a normal +completion message to its log, code_aster printed `DIAGNOSTIC JOB : OK` (or +`_ALARM`) in `csauto.stdout`. When the logs give no verdict, an exit status +of 0 in `.csauto.exitcode` means `DONE`. + +Relevant files (code_saturne, in `RESU//`): +- `residuals.csv`: solver residuals per iteration +- `performance.log`: timing and resource metrics +- `checkpoint/`: restart data (if code_saturne was configured to write checkpoints) +- `monitoring/*.csv`: probe output files (if configured) +- `profiles/*.csv`: profile output files (if configured) -Relevant files (in `RESU//`): -- `residuals.csv` — solver residuals per iteration -- `performance.log` — timing and resource metrics -- `checkpoint/` — restart data (if Code_Saturne was configured to write checkpoints) -- `monitoring/*.csv` — probe output files (if configured) -- `profiles/*.csv` — profile output files (if configured) +code_aster writes its results straight into `RESU/`. ### `FAILED` -The simulation terminated abnormally: the process exited with an error, the Slurm -job was cancelled or failed, or an error signature was detected in the log. +The run ended abnormally: the solver reported a failure (code_saturne: an error +in its log or a failure marker in its run folder; code_aster: any other +`DIAGNOSTIC JOB` verdict), or, with no verdict, the run command exited with +another status or recorded none (a cancelled Slurm job, say). --- @@ -91,12 +118,11 @@ Set from UI context menu (right-click) or via the API (`POST /api/case_convergen ## RESU directory structure -Each run attempt creates a new timestamped directory: +With code_saturne, each run attempt creates a new timestamped directory: ``` RUNS/case0001/RESU/ ├── 20260308-1413/ ← first run -│ ├── listing │ ├── run_solver.log │ ├── residuals.csv │ ├── performance.log @@ -108,34 +134,58 @@ RUNS/case0001/RESU/ ``` When you restart a case, a new `RESU//` directory is created alongside -the previous one. The Residuals Plot `Start from = 0` option displays data from -all RESU runs for the full history. +the previous one. The Residuals Plot always includes every run of the case; set +**Start from** to **Zero** to see the full history from iteration 0. -While a case is `RUNNING`, `csauto control` (CLI) and the Stop/Extend buttons -(web UI) drop a `control_file` into the active `RESU//` directory. -code_saturne polls this file once per time step, applies the directive, and -deletes it — so it's a transient handshake file, not part of the persisted -RESU output. +code_aster writes everything into `RESU/` itself, so a case holds one run and a +new run replaces it. + +While a code_saturne case is `RUNNING`, `csauto control` (CLI) and the Control +menu (web UI) drop a `control_file` into the active `RESU//` +directory. code_saturne polls this file once per time step, applies the +directive, and deletes it, so it's a transient handshake file, not part of the +persisted RESU output. + +--- + +## Cleaning runs + +Clean (dashboard) and `csauto cleanup --prune-resu` (CLI) delete only the run +folders the solver reports: each `RESU//` for code_saturne, `RESU` +itself for code_aster. Clean also cuts the solver's logs over 50 MB down to +their last 50 MB and removes `.csauto.cid` (`csauto cleanup` does so with +`--max-log-mb` and `--clear-cid`). Neither touches `RUNNING` or `PENDING` +cases. The dashboard's Clean returns a `DONE` or `FAILED` case to `PREPARED` +only when it leaves the case without any run; `csauto cleanup` leaves statuses +as they are. --- ## Slurm specifics - Job ID is stored in `.csauto.jobid` and in `registry.json` +- `sbatch --wrap` jobs request `--ntasks` from `n` and `--cpus-per-task` from + `nt`; code_saturne with the Singularity runtime submits its own batch script, + `.csauto.slurm.sh`, with the same requests - Status remains `RUNNING` while `squeue` reports the job as active -- When the job disappears from `squeue`, csauto inspects the log to determine - if the outcome was `DONE` or `FAILED` -- `Kill Selected` calls the appropriate scheduler command: `scancel` (Slurm), `qdel` (PBS/Torque), or `bkill` (LSF) +- When the job disappears from `squeue`, csauto reads the solver's verdict in + its logs, else the exit status in `.csauto.exitcode`, to decide between + `DONE` and `FAILED` +- `Kill` cancels the job with `scancel` (it also tries `qdel` and `bkill` when they are installed) + +For a Docker run, `Kill` stops the case's container, found from `.csauto.cid` +or by its `csauto.case_id` and `csauto.campaign` labels, so containers of other +campaigns are never touched. --- ## Per-case history -Every status change and action is appended to: +Every launch, refused launch, kill, control action and dashboard action (notes, +convergence labels, cleanups, file edits...) is appended to: ``` RUNS/caseXXXX/.csauto.history.jsonl ``` Each line is a JSON object with `ts`, `action`, and relevant metadata. -This file is readable with `GET /api/history?case=case0001`. diff --git a/docs/task-cookbook.md b/docs/task-cookbook.md index f41aeea..18a11f2 100644 --- a/docs/task-cookbook.md +++ b/docs/task-cookbook.md @@ -1,7 +1,7 @@ # Task Cookbook Copy/paste recipes for common operations. -The web UI is the primary interface — CLI alternatives are noted where available. +The web UI is the primary interface; CLI alternatives are noted where available. --- @@ -15,15 +15,13 @@ The web UI is the primary interface — CLI alternatives are noted where availab csauto prepare doe.csv TEMPLATE RUNS ``` -Run this again whenever you change `doe.csv` (new rows, new columns) or modify -template placeholders. +Run this again after adding rows to `doe.csv`: unchanged cases are kept and +new ones are added. -Important: - -- `prepare` is incremental for unchanged existing cases: re-running it adds only the - missing cases. -- If an existing case no longer matches the current DOE row or template content, - `prepare` fails for that case. +Important: after adding a column or changing the template, existing cases no +longer match. `prepare` stops at the first one (`Existing case differs from +current DOE/template content`). Generate into a new folder, or remove those +cases first. ### Add new cases to an existing campaign @@ -50,8 +48,8 @@ Fix all `[FAIL]` lines from `doctor` before proceeding. ### Launch all cases -In the **Status** panel: `Ctrl/Cmd + A` → **Run Selected** → fill in `n`, `nt`, -`max parallel` → **Submit**. +In the **Status** panel: `Ctrl/Cmd + A` → **Run** → fill in `n`, `nt`, +`max parallel` → **Run**. CLI alternative: @@ -61,7 +59,7 @@ csauto run RUNS --n 8 --nt 2 --max-parallel 4 ### Launch specific cases only -In the **Status** panel: select the target rows → **Run Selected**. +In the **Status** panel: select the target rows → **Run**. CLI alternative: @@ -71,7 +69,7 @@ csauto run RUNS --n 8 --nt 2 --case case0003 --case case0010 ### Re-run only failed cases -In the **Status** panel: filter by `FAILED` status → select all → **Run Selected**. +In the **Status** panel: filter by `FAILED` status → select all → **Run**. CLI alternative: @@ -81,7 +79,7 @@ csauto run RUNS --n 8 --nt 2 --resume ### Launch on Slurm with many cases -Same UI flow — with `use_slurm = true` in `csauto.toml`, each submission goes +Same UI flow: with `use_slurm = true` in `csauto.toml`, each submission goes through `sbatch` automatically. Verify with `squeue -u "$USER"` in the terminal. CLI alternative: @@ -131,23 +129,25 @@ csauto status RUNS ### Stream a case log in real time -In the **Log Tail** tab: select the case and file (`listing` for the solver log), -set line count, enable auto-scroll. +In the **Log Tail** tab: select the case and file (the solver's main log comes +first: `run_solver.log` for code_saturne, `csauto.stdout` for code_aster), set +line count, enable auto-scroll. CLI alternative: ```bash -# Main solver log -csauto tail RUNS --case case0001 --file listing -n 200 +# Main solver log (the default file) +csauto tail RUNS --case case0001 # Launch log (if process didn't start) -csauto tail RUNS --case case0001 --file csauto.stdout -n 50 --no-follow +csauto tail RUNS --case case0001 --file csauto.stdout --no-follow ``` ### Inspect residuals -In the **Residuals Plot** tab: select case(s), choose physical quantities, -set start point, click **Plot**. +In the **Residuals Plot** tab: select the **Cases** and **Variables**, and +choose **Start from**. The plot updates by itself (**Refresh** when auto-refresh +is off); **Download as PNG** saves it. CLI alternative (export to CSV + SVG): @@ -162,7 +162,8 @@ csauto residuals RUNS --case case0001 --case case0002 \ ### Inspect performance metrics -In the **Timing Snapshot** tab: select a case, click **Load**. +In the **Timing Snapshot** tab: every case with a timing log is listed. Narrow +the list with **Cases**, export it with **Download as CSV**. CLI alternative: @@ -173,8 +174,9 @@ csauto perf RUNS --case case0001 --case case0005 --out perf.csv ### Scan for errors after a failure -In the **Recent Errors** tab: select the case, choose severity (`error`, `warn`, -`all`), click **Scan**. +In the **Recent Errors** tab: select the case in **Cases** and a **Severity** +(All, Error, Warn, Info). The list updates by itself (**Refresh** when +auto-refresh is off). --- @@ -182,16 +184,20 @@ In the **Recent Errors** tab: select the case, choose severity (`error`, `warn`, ### Restart from checkpoint -In the **Status** panel: +Restart is available for code_saturne. In the **Status** panel: 1. Select the case(s) to restart -2. Click **Restart Selected** -3. Choose stop criterion: - - `Iterations` + number of additional iterations - - `Physical time` + additional physical time -4. Click **Submit** - -csauto resolves the latest checkpoint automatically. +2. Click **Restart** +3. Choose the **Mode**, how far to go: + - **Additional iterations**, then the number of iterations + - **Additional physical time**, then the time in seconds +4. With one case selected, **Restart from** picks the run to restart from + (default: **Latest run**, the newest run with a checkpoint). With several + cases, each one restarts from its own latest run. +5. Click **Restart** in the popup + +Through the API, `restart_path` picks the run the same way (for example +`"restart_path": "20260308-1413"`). API alternative: @@ -212,17 +218,19 @@ curl -s -X POST "http://127.0.0.1:8000/api/run_case" \ ## Steer a running case without killing it -A case about to hit its time step limit doesn't need a kill + restart round -trip. Use `csauto control` (or the Status panel's **Stop** / **More ▾** menu) -instead: +A code_saturne case about to hit its time step limit doesn't need a kill + +restart round trip. Use `csauto control` (or the Status panel's **Control** +menu) instead: ```bash -csauto control RUNS case0007 --stop # finish current step, checkpoint, exit -csauto control RUNS case0007 --extend 500 # keep going 500 more time steps -csauto control RUNS case0007 --checkpoint # checkpoint now, keep running -csauto control RUNS case0007 --flush # flush logs/time plots now +csauto control RUNS case0007 stop # finish current step, checkpoint, exit +csauto control RUNS case0007 extend 500 # keep going 500 more time steps +csauto control RUNS case0007 checkpoint # checkpoint now, keep running +csauto control RUNS case0007 flush # flush logs/time plots now ``` +The actions come from the solver; `csauto doctor RUNS` lists them. + API alternative: ```bash @@ -237,9 +245,9 @@ See [docs/cli.md](./cli.md#control) for details on each action. ## Kill running cases -In the **Status** panel: select the running cases → **Kill Selected**. Prefer -**Stop** (above) when you just want the run to wind down cleanly — Kill -discards in-flight work and requires restarting from the last checkpoint. +In the **Status** panel: select the running cases → **Kill**. Prefer the +`stop` control action (above) when you just want the run to wind down cleanly: +Kill discards in-flight work and requires restarting from the last checkpoint. API alternative: @@ -253,8 +261,12 @@ curl -s -X POST "http://127.0.0.1:8000/api/kill_case" \ ## Cleanup -In the **Status** panel: select cases → **Clean Selected**. The popup lets you -choose which RESU runs to keep or delete and whether to truncate heavy logs. +In the **Status** panel: select cases → **Clean**. The popup lets you choose +which runs to keep or delete. Of the results, Clean deletes only the solver's +run folders (each `RESU/` for code_saturne, `RESU` itself for code_aster). +It also cuts the solver's logs over 50 MB down to their last 50 MB and removes +`.csauto.cid`. It skips running and pending cases, and returns a finished case +to `PREPARED` once all its runs are gone. CLI alternative (always preview with `--dry-run` first): @@ -263,7 +275,7 @@ csauto cleanup RUNS --prune-resu --keep-last 1 --max-log-mb 100 --dry-run csauto cleanup RUNS --prune-resu --keep-last 1 --max-log-mb 100 --clear-cid ``` -Remove all RESU history (disk space emergency): +Remove every run (disk space emergency): ```bash csauto cleanup RUNS --prune-resu --keep-last 0 @@ -273,13 +285,15 @@ csauto cleanup RUNS --prune-resu --keep-last 0 ## Comparing cases -In the **Multi-Run Compare** tab: +In the **Compare** panel: + +1. Pick the **First case** and the **Second case** (the arrows button swaps them) +2. Pick the **File** (code_saturne: `setup.xml`, `doe_row.csv`, `run_solver.log`, + `performance.log`; code_aster: the export file, `doe_row.csv`) -1. Select cases to compare -2. Choose a base case (reference) -3. Choose file kind (`setup.xml`, `doe_row.csv`, `listing`, ...) -4. Optionally add a regex filter -5. Click **Compare** +The DOE values that differ and the side-by-side diff appear at once; type in +the **Search** box to jump between matching lines. A regex filter is available +through `GET /api/compare_runs` (`filter`). --- @@ -288,7 +302,7 @@ In the **Multi-Run Compare** tab: Right-click a `DONE` or `FAILED` row in the **Status** panel: - **Mark Converged** - **Mark Not Converged** -- **Clear** (remove label) +- **Clear Mark** (remove label) --- diff --git a/docs/troubleshooting.md b/docs/troubleshooting.md index 085993d..372ab74 100644 --- a/docs/troubleshooting.md +++ b/docs/troubleshooting.md @@ -3,7 +3,7 @@ This page maps error messages to their causes and fixes, and covers common diagnostic situations. -**First reflex**: run `csauto doctor RUNS` — it checks your runtime, +**First reflex**: run `csauto doctor RUNS`: it checks your runtime, directory structure, and environment in one command. --- @@ -13,12 +13,16 @@ directory structure, and environment in one command. ### `Variables without matching DOE columns: ...` **Cause**: a placeholder or IF condition variable in the template has no -corresponding column in `doe.csv`. +corresponding column in `doe.csv`. The message names the file that uses it. **Fix**: 1. Add the missing column(s) to the `doe.csv` header 2. Re-run `csauto prepare` +If the braces belong to the file's own language (a Python f-string or set in a +code_aster `.comm` file, C/C++ code), write `\{name}` to keep a literal `{name}` +instead (see [doe-format.md](./doe-format.md#placeholder-syntax)). + --- ### `Missing placeholder values for caseXXXX: ...` @@ -40,14 +44,42 @@ for that case. --- +### `.export file not found in ...` / `Several .export files in ...: keep only one.` + +**Cause**: a code_aster template needs exactly one `.export` file at its root. + +**Fix**: keep a single `*.export` file directly in `TEMPLATE/`. + +--- + +### `RUNS holds a code_saturne campaign; csauto.toml selects code_aster.` + +**Cause**: `csauto prepare` was asked to add cases for one solver to a folder +prepared for another (recorded in `RUNS/campaign.json`). + +**Fix**: prepare into a new folder, or set `solver` in `csauto.toml` to the +campaign's solver. + +--- + +### `Warning: RUNS was prepared for code_saturne; ignoring solver = 'code_aster' from ...` + +**Cause**: the `csauto.toml` found for this command selects another solver than +the one the campaign was prepared for. csauto uses the campaign's solver. + +**Fix**: nothing is needed. To silence it, run the command from the campaign's +own directory or fix `solver` in that `csauto.toml`. + +--- + ### `No checkpoint found for caseXXXX` **Cause**: a restart was requested but no RESU run contains a `checkpoint/` -directory. +directory. The case keeps its status; the other selected cases still launch. **Fix**: 1. Check that `RESU//checkpoint/` exists and is non-empty -2. If no checkpoint exists, run a fresh simulation first — code_saturne must write +2. If no checkpoint exists, run a fresh simulation first: code_saturne must write at least one checkpoint before a restart is possible --- @@ -62,15 +94,17 @@ checkpoint iteration. --- -### `Invalid restart_mode (must be iterations or physical_time)` +### `Unknown restart_mode '...' (expected: iterations, physical_time)` -**Cause**: invalid `restart_mode` value. +**Cause**: the restart mode is not one the solver offers. The old names +`iteration`, `iter`, `time` and `tmax` are no longer accepted. -**Fix**: set `restart_mode` to exactly `iterations` or `physical_time`. +**Fix**: use one of the names the message lists (`/api/app_config` lists them +as `restart_modes`). --- -### `restart_value must be an integer > 0 for restart_mode=iterations` +### `iterations needs a whole number (Iterations)` / `iterations needs a positive value (Iterations)` **Cause**: the restart increment is not a valid positive integer. @@ -78,7 +112,7 @@ checkpoint iteration. --- -### `restart_value must be > 0 for restart_mode=physical_time` +### `physical_time needs a positive value (Time (s))` **Cause**: the physical time increment is not a valid positive number. @@ -86,9 +120,29 @@ checkpoint iteration. --- +### `csauto control: error: the following arguments are required: action` / `csauto: error: unrecognized arguments: --extend` + +**Cause**: the action is a word after the case, not a flag: the `--stop`, +`--extend N`, `--checkpoint` and `--flush` flags are gone. + +**Fix**: `csauto control RUNS case0007 stop`, or `csauto control RUNS case0007 extend 500`. + +--- + +### `Invalid control action: '...' (expected one of: stop, extend, checkpoint, flush)` + +**Cause**: `csauto control` was given an action the solver does not offer. + +**Fix**: use one of the listed actions; `csauto doctor RUNS` lists them with +the value each one takes. + +--- + ### `n, nt, and max_parallel must be integers > 0` -**Cause**: one of the run parameters is zero, negative, or not an integer. +**Cause**: `n`, `nt` or `max_parallel` sent to the API (`POST /api/run_case`) +is zero or negative (non-integers are refused with `422`). `csauto run` prints +`nprocs and nt must be > 0` or `max_parallel must be > 0` instead. **Fix**: provide strictly positive integers for all three values. @@ -103,10 +157,10 @@ is configured. --- -### `DISPLAY not set (GUI unavailable)` +### `DISPLAY not set (GUI unavailable)` / `DISPLAY not set on server` -**Cause**: a GUI launch (`Open GUI` from the UI) was requested on a headless server -without an X11 display. +**Cause**: `csauto doctor` warns that no X11 display is set; **Open GUI** +(code_saturne) then fails with `DISPLAY not set on server`. **Fix**: configure X11 forwarding or avoid GUI launch on headless nodes. @@ -117,7 +171,7 @@ without an X11 display. **Cause**: the API token is missing or invalid. **Fix**: -- In the UI: click `Token` and enter the correct token +- In the UI: open Settings (gear icon) and enter the token under **API token** - In API calls: send `X-CSAUTO-TOKEN: ` or `Authorization: Bearer ` --- @@ -128,7 +182,7 @@ without an X11 display. 1. Check `RUNS/caseXXXX/csauto.stdout` for launch errors 2. Check `RUNS/caseXXXX/csauto.stderr` for process errors -3. On Slurm: `squeue -u "$USER"` — verify the job is still queued or running +3. On Slurm: `squeue -u "$USER"`, to verify the job is still queued or running 4. Re-run `csauto status RUNS` to force a registry refresh 5. If the process or job is no longer alive, the status should update to `DONE` or `FAILED` on the next refresh @@ -137,38 +191,44 @@ without an X11 display. ### Case finished but status shows `RUNNING` -csauto detects completion from process/job status combined with log signatures. +A case stays `RUNNING` while its process or Slurm job is alive, even after its +log prints the end of the calculation: the solver may still be writing results. Force a refresh: ```bash csauto status RUNS ``` -If it still doesn't update, check `listing` or `run_solver.log` for a normal -completion message. +If it still doesn't update, check whether the run is still alive (`ps`, +`docker ps`, or `squeue`). Once it is gone, the status follows the solver's +verdict in its logs (`run_solver.log` for code_saturne, `csauto.stdout` for +code_aster), or the exit status in `.csauto.exitcode`. --- -### Runtime not found (docker / code_saturne / apptainer) +### Runtime not found (docker / code_saturne / run_aster / apptainer) -1. Run `csauto doctor RUNS` — it will identify the exact failing check +1. Run `csauto doctor RUNS`: it will identify the exact failing check 2. Verify the binary is in `PATH` or set the explicit path in `csauto.toml`: - - `saturne_bin = "/path/to/code_saturne"` + - `saturne_bin = "/path/to/code_saturne"` (or to `run_aster` for code_aster) - `singularity_bin = "/path/to/apptainer"` - `singularity_image = "/path/to/image.sif"` - - `docker_image = "image:tag"` (and confirm Docker daemon is running) + - `docker_image = "image:tag"` (optional, the solver's own image by default; + confirm the Docker daemon is running) --- ### Missing residuals, probes, or profiles in the UI -- **Residuals**: check `RESU//residuals.csv` — if missing, csauto falls +These panels exist for code_saturne only. + +- **Residuals**: check `RESU//residuals.csv`; if missing, csauto falls back to parsing `run_solver.log` - **Probes**: check `RESU//monitoring/*.csv` - **Profiles**: check `RESU//profiles/*.csv` -If you restarted a case and data from the first run seems missing, use -`Start from = 0` in the Residuals Plot to include all RESU directories. +The Residuals Plot always includes every run of the case: after a restart, set +**Start from** to **Zero** to see the history from iteration 0. --- @@ -192,7 +252,10 @@ Always test with `--dry-run` first: csauto cleanup RUNS --prune-resu --keep-last 1 --max-log-mb 100 --dry-run ``` -This prints what would be deleted without actually deleting anything. +This prints how many run folders and logs would be affected, without deleting +anything. `--prune-resu` only deletes the run folders the solver reports (each +`RESU/` for code_saturne, `RESU` itself for code_aster), and cleanup skips +`RUNNING` and `PENDING` cases. --- @@ -206,4 +269,5 @@ Fix every `[FAIL]` line before launching. Common causes: - Runtime binary not found - Image file not accessible - `RUNS/` directory not writable -- No `case*` directories found in `RUNS/` +- No case found in `RUNS/` (run `csauto prepare` first) +- The solver's setup file missing from some cases diff --git a/docs/web-ui.md b/docs/web-ui.md index 056e16c..cbbfe56 100644 --- a/docs/web-ui.md +++ b/docs/web-ui.md @@ -28,9 +28,15 @@ The header always shows: When a filter is active, each metric shows the filtered count out of the total (e.g., "2 / 5"). -Branding is solver-aware: code_saturne campaigns show the Code_Saturne logo in -the header, other solvers show their name as text, and the browser-tab favicon -switches to a solver-specific icon when the frontend ships one. +The header shows the solver's logo and the browser tab its icon, both provided +by the solver adapter; a solver without a logo shows its name as text. Until +the dashboard has loaded the solver's description from the server, it shows +only the Status, Log Tail and Recent Errors panels and no solver action. + +The panels and buttons depend on the solver: each one appears only when the +solver provides what it needs (see +[Adding a new solver](./adding-a-solver.md#4-fill-the-dashboard)). The examples +below use code_saturne, which uses all of them. **Settings** (gear icon, top right): opens a dialog where you can set the **API token** (if the server requires authentication) and the **auto-refresh @@ -60,10 +66,10 @@ The toolbar provides: | `THREAD COUNT` | Number of OpenMP threads per rank | | `LAST ITER` | Last completed iteration | | `DURATION` | Elapsed time since launch | -| `RESU SIZE (MB)` | Total RESU disk usage | +| `RESULTS (MB)` | Disk usage of the case's results folder | | `LAST MODIFIED` | Timestamp of the last state change | -Each row also has an **Open GUI** button to launch the code_saturne GUI for that case. +When the solver has a GUI (code_saturne does), each row also has an **Open GUI** button that opens it on the case's setup file. ### Selecting cases @@ -80,46 +86,50 @@ Each row also has an **Open GUI** button to launch the code_saturne GUI for that With one or more cases selected, the action buttons activate: **Run**: launch the selected cases (`PREPARED`, `DONE`, or `FAILED`). A popup -asks for `--n` (MPI ranks), `--nt` (OMP threads), and `--max-parallel`. - -**Restart**: restart from the latest checkpoint. A popup asks for the -stop criterion: -- `Iterations`: add N more iterations beyond the current checkpoint -- `Physical time`: run until a physical time target - -csauto automatically finds the latest checkpoint and computes the absolute -target value. You do not need to know the checkpoint path. - -**Stop**: gracefully stop the selected running cases — code_saturne finishes -its current time step, writes a checkpoint, and exits on its own. Unlike -Kill, no process is signaled and no restart is needed afterwards. - -**More ▾**: secondary controls for running cases, next to Stop: -- **Extend**: raise the time step limit so the case keeps going instead of - stopping. A popup asks how many additional time steps to add to the case's - configured limit (repeated extends stack correctly). -- **Checkpoint**: request a checkpoint at the next time step, without - stopping the run. Useful for grabbing a restart point mid-run. This does - not add a marker to the Residuals/Probes plots — those only mark actual - restarts (a new run launched from a checkpoint), not in-place checkpoints. -- **Flush**: force logs and time-plot/probe files to be written to disk - immediately, without waiting for the next automatic write. Doesn't affect - the simulation itself. - -**Kill**: send a termination signal to the selected running cases. -Works for both local processes and Slurm jobs. Use Stop instead when you -just want the run to wind down cleanly — Kill discards in-flight work and -requires restarting from the last checkpoint. - -**Clean**: remove old RESU directories and/or truncate heavy logs for -the selected cases. A popup lets you choose which RESU runs to keep or delete. +asks for **MPI Ranks (n)**, **OMP Threads (nt)** and **Max Parallel** (left +empty, every selected case starts at once). + +**Restart** (when the solver supports it): continue finished cases. A popup +offers the solver's restart modes and asks for a value when the mode takes +one. With code_saturne: +- `Additional iterations`: add N more iterations beyond the checkpoint +- `Additional physical time`: run for that much more physical time + +**Restart from** picks the run to restart from (one case selected); by default +csauto uses the latest run that has a checkpoint and computes the absolute +target value for you. + +**Control** (when the solver supports live control): a menu of the actions the +solver offers for running cases. Actions that take a value ask for it; the +others ask for confirmation. With code_saturne: +- **Stop gracefully**: finish the current time step, write a checkpoint and + exit. Unlike Kill, no process is signaled and no restart is needed. +- **Extend**: raise the time step limit so the case keeps going. Asks for the + number of additional time steps (repeated extends stack correctly). +- **Write a checkpoint**: at the next time step, without stopping the run. + Plots mark restarts (new runs launched from a checkpoint), not in-place + checkpoints. +- **Flush logs and plots**: write logs and probe files to disk now. It does + not affect the simulation. + +**Kill**: stop the selected running cases at once. Works for local processes, +containers and Slurm jobs. Prefer a graceful stop when the solver offers one: +Kill discards in-flight work. + +**Clean**: delete old run folders and/or shorten heavy logs for the selected +finished cases. A popup lets you choose which run folders to keep or delete. +Clean only deletes the folders the solver reports as runs (code_saturne: each +`RESU/`; code_aster: `RESU` itself, its single run) and never touches +running cases. A case whose runs were all deleted returns to `PREPARED`. Clean +also shortens logs larger than 50 MB to their last 50 MB and removes the +docker container id file (`.csauto.cid`). ### Context menu on finished cases Right-click a `DONE` or `FAILED` row to: - **Mark Converged**: set convergence label to `converged` - **Mark Not Converged**: set to `not converged` -- **Clear**: remove the convergence label +- **Clear Mark**: remove the convergence label --- @@ -132,7 +142,7 @@ Use this panel to inspect solver convergence for one or more cases. 1. Select one or more cases from the **Cases** dropdown 2. Choose the **Variables** to plot (e.g., velocity, pressure) 3. Choose the **Start from** point: - - `Zero`: plot from the very beginning, including previous runs in RESU history + - `Zero`: plot from the very beginning, including the case's previous runs - `Restart start`: start from the last restart checkpoint iteration - `Custom`: manually set the minimum iteration to display 4. The chart updates automatically when auto-refresh is enabled @@ -148,12 +158,12 @@ Click **Download as PNG** to export the chart. ![Probes and Profiles](./assets/ui-probes.png) -This panel has two tabs — **Probes** and **Profiles** — each shown only when -the relevant output files exist in the case's RESU directory. +This panel has two tabs, **Probes** and **Profiles**, each shown when the case +has such files (with code_saturne, in its latest `RESU/`). ### Probes tab -Shown when `RESU//monitoring/*.csv` files exist. +With code_saturne: `RESU//monitoring/*.csv`. 1. Select one or more cases from the **Cases** dropdown 2. Choose the **Quantity** (probe file to read, e.g., CourantNb) @@ -165,7 +175,7 @@ The spatial coordinates of each selected probe are displayed below the controls. ### Profiles tab -Shown when `RESU//profiles/*.csv` files exist. +With code_saturne: `RESU//profiles/*.csv`. 1. Select one or more cases from the **Cases** dropdown 2. Choose the **Profile** file @@ -212,9 +222,10 @@ Steps: swap button to switch them) 2. The panel shows a **parameter diff** summary (e.g., "1 difference out of 3 parameters"). Click **Show all parameters** to see matching parameters too -3. Choose a **File** to compare — the list is declared by the solver adapter, - and its first entry is the default (with code_saturne: `setup.xml`, - `doe_row.csv`, `run_solver.log`, or `performance.log`) +3. Choose a **File** to compare: the list comes from the solver, and its first + entry is the default (code_saturne: `setup.xml`, `doe_row.csv`, + `run_solver.log`, `performance.log`; code_aster: the export file and + `doe_row.csv`) 4. Use the **Search** bar to filter lines The output shows a side-by-side diff with line numbers. Differing lines are @@ -228,13 +239,15 @@ highlighted for quick identification. Stream the end of a case log file, similar to `tail -f`. -**Which file to read:** +The **File** list puts the solver's main logs first, then `csauto.stdout` and +`csauto.stderr` (the console output of the launch, available for every solver) +and the other `*.log` files of the latest run. The first file is selected by +default. | Situation | File to use | |---|---| -| Solver running, check progress | `listing` | -| Solver error or crash | `run_solver.log` | -| Launch issue (process didn't start) | `csauto.stdout` / `csauto.stderr` | +| Solver running, check progress | the solver's main log (code_saturne: `run_solver.log`; code_aster: `csauto.stdout`) | +| Launch issue (the solver did not start) | `csauto.stderr` / `csauto.stdout` | | Slurm submission issue | `csauto.stdout` | Controls: @@ -242,7 +255,8 @@ Controls: - **File**: choose the log file - **Lines**: number of lines to display (default 80) - **Filter**: regex filter to match specific lines -- **Severity**: filter by `error`, `warn`, or `All` +- **Severity**: filter by `Error`, `Warn`, `Info` or `All`. Lines are coloured + with the same patterns Recent Errors uses for this solver The bottom bar shows: - A **line count** indicator (filtered lines / total, e.g., "80 / 80") @@ -264,9 +278,9 @@ want a quick summary of what went wrong without reading the full log. Controls: - **Cases**: select which cases to scan -- **Files**: select which log files to include (multi-select; the list is - declared by the solver adapter — with code_saturne: `csauto.stderr`, - `run_solver.log`, `listing`, `csauto.stdout`) +- **Files**: select which log files to include (multi-select; the list comes + from the solver; with code_saturne: `csauto.stderr`, `run_solver.log`, + `listing`, `csauto.stdout`) - **Severity**: `All`, `Error`, `Warn`, `Info` - **Search**: plain-text search within matched lines - **Context**: how many lines before and after each hit to display (default 6) diff --git a/examples/codeaster-cube/README.md b/examples/codeaster-cube/README.md index 869e23a..fe04e44 100644 --- a/examples/codeaster-cube/README.md +++ b/examples/codeaster-cube/README.md @@ -6,19 +6,19 @@ A complete campaign showcasing the main csauto features with code_aster. Simulates a cube under triaxial traction. The DOE combines: -- **2 values of imposed displacement along x, y or z** — 1.0e-3 and 0.0 -- **2 meshes** — `mesh1.med` and `mesh2.med` -- **1 additional case** - with non valid values for imposed displacements +- **2 values of imposed displacement along x, y or z**: 1.0e-3 and 0.0 +- **2 meshes**: `mesh1.med` and `mesh2.med` +- **1 additional case** with an invalid imposed displacement, which fails on purpose This produces **9 cases**. The template demonstrates: -- **value placeholders** — `{depl_x}`, `{depl_y}`, `{depl_z}`, `{mesh_name}` in both `export` and `comm` files -- **conditional way in command file** — with an `if` situation related to values of the DOE +- **value placeholders**: `{depl_x}`, `{depl_y}`, `{depl_z}` in the `comm` file and `{mesh_name}` in the `export` file +- **a condition in the command file**: a Python `if` on the DOE values, which stops the invalid case with an error ## Files ``` codeaster-cube/ -├── csauto.toml ← runtime configuration (Docker) +├── csauto.toml ← solver and runtime configuration (Docker) ├── doe.csv ← 9 cases ├── TEMPLATE/ │ ├── study.comm ← a code_aster command file @@ -29,22 +29,29 @@ codeaster-cube/ └── mesh2.med ← second mesh variant ``` -> **WARNING**: As the project currently stands, in an `export` file contained in `TEMPLATE`, the paths specified for the input meshes must be prefixed with the `MESH/` path, and the output files to be saved must be prefixed with the `RESU/` path. +`MESH` is shared by every case: `csauto prepare` places it next to the cases +(`RUNS/MESH`), so `study.export` references a mesh as `../MESH/{mesh_name}`. +Results are written under `RESU/` (`RESU/myresults.rmed`), the folder csauto +treats as the case's run: its size shows in the status table, and Clean deletes +it when asked to keep no run. ## Prerequisites - csauto installed (`csauto --version` works) -- A working code_aster runtime: Docker or Singularity image (native is coming) +- A working code_aster runtime: Docker (the default image is + `simvia/code_aster:17.4.0`), a Singularity image, or `run_aster` installed natively ## 1. Configure your runtime A `csauto.toml` is already provided with a Docker configuration. Edit it to -match your environment, or replace it entirely. Examples: +match your environment, or replace it entirely. Keep `solver = "code_aster"`: +without it, csauto expects a code_saturne case. Examples: **Docker (provided):** ```toml +solver = "code_aster" runtime = "docker" -docker_image = "simvia/code_aster:17.4.0" +docker_image = "simvia/code_aster:17.4.0" # the default for code_aster host = "127.0.0.1" port = 8000 @@ -55,6 +62,7 @@ token = "your-secret-token" **Singularity image:** ```toml +solver = "code_aster" runtime = "singularity" singularity_image = "/path/to/code_aster_17.4.0.sif" @@ -65,6 +73,19 @@ port = 8000 token = "your-secret-token" ``` +**Native `run_aster`:** +```toml +solver = "code_aster" +runtime = "native" +saturne_bin = "/path/to/run_aster" # optional when run_aster is in PATH + +host = "127.0.0.1" +port = 8000 + +[api] +token = "your-secret-token" +``` + ## 2. Generate the case ```bash @@ -76,8 +97,9 @@ Expected output: ``` RUNS/ ├── registry.json +├── campaign.json ← records the code_aster solver +├── MESH/ ← link to the example's MESH folder (mesh_mode = "symlink") ├── case0001/ -│ ├── MESH/ ← selected mesh from MESH/ │ ├── study.comm ← a copy of the code_aster command file with the input values │ ├── study.export ← a copy of the code_aster export file with the input values │ └── doe_row.csv @@ -106,11 +128,17 @@ Open [http://127.0.0.1:8000](http://127.0.0.1:8000). In the **Status** panel: 1. Select one or more cases (`Ctrl+A` to select all) -2. Click **Run Selected** +2. Click **Run** 3. Set **n** = 1 (MPI rank), **nt** = 1 (thread) -4. Click **Submit** +4. Click **Run** in the popup + +csauto writes **n** and **nt** into `.csauto.export` (as `mpi_nbcpu` and +`ncpus`), a copy of the case's `study.export` that `run_aster` runs; the case's +own export is never modified. -Cases move to `RUNNING`. Once complete they show `DONE`. +Cases move to `RUNNING`. Once complete they show `DONE`, except `case0001`, +whose invalid displacement stops the command file: it shows `FAILED`, with +`DIAGNOSTIC JOB : _ABNORMAL_ABORT` in its `csauto.stdout`. ## Alternative: launch from the terminal @@ -121,6 +149,11 @@ csauto run RUNS --n 1 --nt 1 ## Explore the results From the web UI: -- **Residuals Plot** — not in the current version `#TODO` -- **Probes** — not in the current version `#TODO` -- **Log Tail** — live solver output +- **Log Tail**: `csauto.stdout` (the output of `run_aster`, which ends with the + `DIAGNOSTIC JOB` verdict), the `output.mess` message file, and `csauto.stderr` +- **Recent Errors**: code_aster alarms (``) and errors (``, ``, ``) + from `csauto.stdout` and `csauto.stderr` +- **Compare**: the export file or `doe_row.csv`, side by side across cases + +Residuals, probes and timings are not available for code_aster. The results +themselves are in `RUNS/caseXXXX/RESU/myresults.rmed`. diff --git a/examples/single-case/README.md b/examples/single-case/README.md index 182b5f6..2df01bd 100644 --- a/examples/single-case/README.md +++ b/examples/single-case/README.md @@ -9,16 +9,17 @@ that your csauto installation and code_saturne runtime are working end to end. Simulates an internal flow over a stepped channel geometry with an immersed cylinder (volume-penalization IBM). The DOE combines: -- **2 fluid densities** — 1.1 and 1.2 kg/m³ -- **2 turbulence models** — Spalart-Allmaras and k-omega SST -- **2 meshes** — `mesh1.med` and `mesh2.med` -- **2 penalization coefficients** — K0 = 1000 and 2000 - -This produces **8 cases** (full factorial). The template demonstrates: -- **value placeholders** — `{density_value}`, `{ref_v}`, `{mesh}`, `{K0}` -- **conditional blocks** — `` to switch +- **2 fluid densities**: 1.1 and 1.2 kg/m³ +- **2 turbulence models**: Spalart-Allmaras and k-omega SST +- **2 meshes**: `mesh1.med` and `mesh2.med` +- **2 penalization coefficients**: K0 = 1000 (with `mesh1.med`) and 2000 (with `mesh2.med`) + +This produces **8 cases**: 2 densities × 2 models × 2 meshes, each mesh with its +own K0. The template demonstrates: +- **value placeholders**: `{density_value}`, `{ref_v}`, `{mesh}`, `{K0}` +- **conditional blocks**: `` to switch between Spalart-Allmaras and k-omega SST sections -- **user source compilation** — `TEMPLATE/SRC/cs_user_source_terms.cpp` with a +- **user source compilation**: `TEMPLATE/SRC/cs_user_source_terms.cpp` with a `{K0}` placeholder, compiled by code_saturne at run time ## Files @@ -96,10 +97,12 @@ Expected output: ``` RUNS/ ├── registry.json +├── campaign.json ← records the code_saturne solver +├── MESH/ ← link to single-case/MESH (mesh_mode = "symlink") +├── POST/ ← link to single-case/POST ├── case0001/ │ ├── DATA/setup.xml ← all placeholders substituted, IF blocks resolved │ ├── SRC/ ← cs_user_source_terms.cpp with K0 substituted -│ ├── MESH/ ← selected mesh copied from single-case/MESH/ │ └── doe_row.csv ├── case0002/ │ └── ... @@ -126,9 +129,9 @@ Open [http://127.0.0.1:8000](http://127.0.0.1:8000). In the **Status** panel: 1. Select one or more cases (`Ctrl+A` to select all) -2. Click **Run Selected** +2. Click **Run** 3. Set **n** = 1 (MPI rank), **nt** = 1 (thread) -4. Click **Submit** +4. Click **Run** in the popup Cases move to `RUNNING`. Once complete they show `DONE`. @@ -141,6 +144,6 @@ csauto run RUNS --n 1 --nt 1 ## Explore the results From the web UI: -- **Residuals Plot** — convergence curves -- **Log Tail** — live solver output (`listing` file) -- **Probes** — time series at the two probe points defined in the mesh +- **Residuals Plot**: convergence curves +- **Log Tail**: live solver output (`run_solver.log`) +- **Probes**: time series at the two probe points defined in `setup.xml` diff --git a/tests/README.md b/tests/README.md index e971693..0c77a8f 100644 --- a/tests/README.md +++ b/tests/README.md @@ -24,6 +24,27 @@ pytest tests/web -q - `tests/runner/` - launch/status/kill orchestration behavior - `tests/web/` - HTTP API behavior +## Solver adapters + +- `tests/unit/test_adapter_conformance.py` runs the same contract checks on + every registered solver adapter, against a sample finished case written by a + `sample_` function. A new adapter adds its own sample there (see + [Adding a new solver](../docs/adding-a-solver.md)). +- `tests/unit/test_solver_boundary.py` scans every module outside + `csauto/solvers/` for code_saturne file names and log markers. +- `tests/integration/test_docker_solvers.py` runs the shipped code_saturne and + code_aster examples for real in their docker images. It is opt-in: + +```bash +docker pull simvia/code_saturne +docker pull simvia/code_aster:17.4.0 +CSAUTO_DOCKER_TESTS=1 pytest tests/integration/test_docker_solvers.py -q +``` + +These runs write their cases under `CSAUTO_DOCKER_TEST_DIR` (default +`~/.cache/csauto-docker-tests`) instead of `tmp_path`, because Docker Desktop on +WSL2 cannot mount `/tmp`. + ## Testing guidelines - test public APIs and public behavior @@ -36,7 +57,8 @@ pytest tests/web -q Common fixtures are defined in `tests/conftest.py`: - `runs_dir` -- `case_factory` +- `case_factory`: writes a case with `DATA/setup.xml` and the `doe_row.csv` + by which csauto recognizes a case folder - `registry_factory` ## When adding tests From f9b8057aaf4935fb380412d54b74562fa97ef3c6 Mon Sep 17 00:00:00 2001 From: Ulysse Bouchet Date: Wed, 7 Oct 2026 17:51:58 +0200 Subject: [PATCH 13/21] fix: harden run liveness, container mounts, Clean and file access Run liveness: a PID is identified by the boot id and its start time in clock ticks, recorded at launch, instead of the wall-clock launch time, which broke when WSL2 stepped the clock after a sleep. A PID owned by another user goes through the same check. Slurm jobs and local runs end with the solver's exit status, and a queued case no longer flips to DONE or FAILED from its previous run's logs. Containers mount the campaign at /csauto instead of /mnt, where WSL drives and data disks live, and a shared folder that would land inside that mount point is refused before launch. A campaign recorded for another solver drops the docker_image, saturne_bin and singularity_image of the csauto.toml in use, an unknown recorded solver is a clear error, and campaign.json is written before the first case. Cases written by csauto 0.5 (CRLF, non-UTF-8 bytes) still match on a new prepare, and files with a NUL byte past the first 8 KiB are copied verbatim. Clean leaves alone a case that has none of the folders to keep (the dashboard now offers folder choices for one case at a time), lists the running cases it skipped, resets only cases whose runs it deleted, and csauto cleanup refreshes statuses first. Every file route goes through find_case_file, which refuses files outside the case folder; a NUL byte in a name is a 404. Restarting from a run without checkpoint is refused. The Log Tail offers the current run's logs only, probe columns read the header only, and the unused info anomaly label is gone. --- CHANGELOG.md | 23 ++++--- csauto/cli.py | 46 ++++++++----- csauto/doe.py | 25 ++++++- csauto/execution.py | 9 ++- csauto/fastapi_routes/actions.py | 13 ++-- csauto/fastapi_routes/case_data.py | 12 +++- csauto/fastapi_routes/common.py | 1 + csauto/fastapi_routes/compare.py | 3 +- csauto/logs.py | 32 ++++++--- csauto/maintenance.py | 9 ++- csauto/pathutil.py | 5 +- csauto/probes.py | 14 ++-- csauto/runner.py | 53 +++++++------- csauto/solvers/base.py | 16 +++-- csauto/solvers/code_saturne.py | 38 +++++----- csauto/solvers/stub.py | 5 +- csauto/web_support.py | 9 +-- docs/adding-a-solver.md | 13 ++-- docs/api.md | 2 +- docs/architecture.md | 2 +- docs/cli.md | 8 ++- docs/concepts.md | 2 +- docs/config.md | 4 +- docs/troubleshooting.md | 32 ++++++++- docs/web-ui.md | 14 ++-- .../assets/{2.DKE6ochW.css => 2.Bl1bTUX7.css} | 2 +- .../dist/_app/immutable/chunks/BpkEXo81.js | 1 - .../dist/_app/immutable/chunks/CQT0YWjJ.js | 1 + .../{app.BMY5BpkA.js => app.CCuNkhVQ.js} | 4 +- .../_app/immutable/entry/start.BP9vIbbj.js | 1 + .../_app/immutable/entry/start.DjSZr7_o.js | 1 - .../nodes/{1.ByPKQG-z.js => 1.NvMM6EdY.js} | 2 +- .../nodes/{2.Bd0QboKC.js => 2.BZAvu-cK.js} | 66 +++++++++--------- frontend/dist/_app/version.json | 2 +- frontend/dist/index.html | 12 ++-- frontend/src/app.css | 3 - frontend/src/lib/api/types.ts | 3 +- .../lib/components/dialogs/CleanDialog.svelte | 18 +++-- .../components/errors/RecentErrorsCard.svelte | 1 - .../lib/components/status/StatusCard.svelte | 5 +- .../lib/components/tail/LogTailCard.svelte | 3 +- .../src/lib/components/tail/TailOutput.svelte | 1 - tests/integration/test_campaign_solver.py | 22 ++++++ tests/integration/test_render_svg.py | 11 +++ tests/runner/test_runner.py | 69 ++++++++++++++++--- tests/unit/test_docker.py | 2 +- tests/unit/test_doe.py | 23 +++++++ tests/unit/test_execution.py | 17 ++++- tests/unit/test_logs.py | 22 ++++++ tests/unit/test_maintenance.py | 26 +++++++ tests/unit/test_solvers.py | 2 +- tests/web/test_adapter_api.py | 39 ++++++++++- tests/web/test_api.py | 2 +- 53 files changed, 537 insertions(+), 214 deletions(-) rename frontend/dist/_app/immutable/assets/{2.DKE6ochW.css => 2.Bl1bTUX7.css} (83%) delete mode 100644 frontend/dist/_app/immutable/chunks/BpkEXo81.js create mode 100644 frontend/dist/_app/immutable/chunks/CQT0YWjJ.js rename frontend/dist/_app/immutable/entry/{app.BMY5BpkA.js => app.CCuNkhVQ.js} (93%) create mode 100644 frontend/dist/_app/immutable/entry/start.BP9vIbbj.js delete mode 100644 frontend/dist/_app/immutable/entry/start.DjSZr7_o.js rename frontend/dist/_app/immutable/nodes/{1.ByPKQG-z.js => 1.NvMM6EdY.js} (78%) rename frontend/dist/_app/immutable/nodes/{2.Bd0QboKC.js => 2.BZAvu-cK.js} (59%) diff --git a/CHANGELOG.md b/CHANGELOG.md index c6219d0..a71d42a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,20 +10,20 @@ Make csauto ready for solvers other than code_saturne: one adapter class describ ### Added - An adapter conformance suite (`tests/unit/test_adapter_conformance.py`): every registered solver is checked against a sample finished case, so a new adapter learns what the dashboard would miss before a user does. Real runs of the shipped code_saturne and code_aster examples in their docker images are available with `CSAUTO_DOCKER_TESTS=1` (`tests/integration/test_docker_solvers.py`) -- Campaigns record their solver: `csauto prepare` writes `RUNS/campaign.json`, every later command on that folder uses it from any directory, and `prepare` refuses to mix two solvers in one folder -- Runs record their exit status (`.csauto.exitcode`): when the solver's logs give no verdict, exit status 0 means DONE, anything else FAILED. An adapter no longer has to implement `detect_outcome` +- Campaigns record their solver: `csauto prepare` writes `RUNS/campaign.json`, every later command on that folder uses it from any directory, and `prepare` refuses to mix two solvers in one folder. When the `csauto.toml` in use selects another solver, its `docker_image`, `saturne_bin` and `singularity_image` are ignored too (with a warning), since they belong to that other solver +- Runs record their exit status (`.csauto.exitcode`): when the solver's logs give no verdict, exit status 0 means DONE, anything else FAILED. An adapter no longer has to implement `detect_outcome`. Slurm jobs still end with the solver's own status - Adapter declarations for what used to be code_saturne assumptions: `supported_runtimes`, `container_setup` (shell commands run in the container before the solver), `prepare_launch` (files written before each launch), `restart_modes`, typed `ControlAction` entries, `default_residual_columns`, `logo_file` and `icon_file`, and `read_probe_file` for probe formats other than CSV - `\{name}` in a template keeps a literal `{name}`, for Python f-strings and sets in code_aster `.comm` files - API: `/api/tail_files` (the Log Tail file list), `/api/tail_lines` (each line with the severity the solver's anomaly patterns give it), `/api/solver_logo` and `/api/solver_icon`; `/api/app_config` gains `restart_modes`, `default_residual_columns`, `logo` and `icon` ### Changed - `SolverAdapterBase` and the `SolverAdapter` protocol are merged into one base class, `SolverAdapter`. `run_argv` receives the case folder, and the solver starts inside it in every runtime; `gui_argv` receives the setup file's path relative to the case -- Docker runs use `--entrypoint` and `--rm`, so solver images no longer need the solver as their entrypoint and stopped containers no longer pile up. Containers mount the campaign folder at `/mnt` instead of the image user's home, where the solvers wrote `.cache`, `.config` and `.tmp_run_aster` into the campaign folder +- Docker runs use `--entrypoint` and `--rm`, so solver images no longer need the solver as their entrypoint and stopped containers no longer pile up. **Breaking for custom images:** the solver executable must now be on the image's `PATH`, and an image that relied on its own entrypoint script to set up the environment must provide that environment through `ENV` (or the adapter's `container_setup`). Containers mount the campaign folder at `/csauto` instead of the image user's home, where the solvers wrote `.cache`, `.config` and `.tmp_run_aster` into the campaign folder; a shared folder whose target would land inside that mount point is refused before launch - `csauto control RUNS CASE ACTION [VALUE]` replaces `--stop`, `--extend N`, `--checkpoint` and `--flush`; the actions come from the solver and `csauto doctor` lists them. `/api/app_config` returns `control_actions` as `{name, label, value_label, value_kind}` objects and `/api/control_case` checks the value against them -- Restart modes come from the solver: `/api/run_case` refuses other names (the `iteration`, `iter`, `time` and `tmax` aliases are gone) and accepts a `restart_path` naming the run to restart from +- Restart modes come from the solver: `/api/run_case` refuses other names (the `iteration`, `iter`, `time` and `tmax` aliases are gone) and accepts a `restart_path` naming the run to restart from, refusing a run that holds no checkpoint - `docker_image` defaults to the solver's own image; it used to default to `simvia/code_saturne` whatever the solver - A run stays RUNNING until its process or Slurm job ends, even after its log prints a verdict, so its launch slot is not reused and Kill still reaches it -- Clean only deletes the folders the adapter reports as runs (`list_run_dirs`) and never touches RUNNING or PENDING cases; a finished case returns to PREPARED only when Clean deleted all its runs, not after a logs-only clean +- Clean only deletes the folders the adapter reports as runs (`list_run_dirs`) and never touches RUNNING or PENDING cases, which it now lists (in a dashboard notice, and at the end of `csauto cleanup`, which refreshes statuses first so a run that has ended is cleaned); a finished case returns to PREPARED only when Clean deleted all its runs, not after a logs-only clean or when it had no run to delete - Cases are found from the registry and their `doe_row.csv` instead of folder names starting with `case`, so custom case ids work with `doctor`, `run`, `serve` and `cleanup` - `/api/perf` returns the solver's own timing columns - code_aster: runs `run_aster` through the shared launch path, so the native runtime and Slurm work and the docker command is properly quoted; `n` and `nt` are applied through `.csauto.export`, a copy of the case's export written at each launch (the case's export is never modified, so `csauto prepare` can extend a launched campaign); the verdict is read from `csauto.stdout`; `RESU` holds each case's single run; `MESH` is the only shared folder and is referenced as `../MESH` (the example was updated); the Compare panel offers the export file; code_aster message boxes are flagged in Recent Errors @@ -31,6 +31,7 @@ Make csauto ready for solvers other than code_saturne: one adapter class describ - The dashboard reads everything solver-specific from the server: the Control menu lists the solver's actions, the Restart dialog its modes and the run to restart from, the Log Tail its log files with severities computed from the solver's patterns, and the header its logo and favicon (now shipped with the adapter in `csauto/solvers/logos/` instead of `frontend/static`). Labels no longer assume code_saturne ("Run folders", "Results (MB)"), and the residual plot preselects the solver's default curves - Dashboard panels and action buttons are derived from what the solver adapter implements, rather than declared: a panel appears when the adapter provides what feeds it (`find_residuals_files`, `list_probe_files`, or a non-empty `compare_kinds` / `performance_columns` / `control_actions`), and the Restart, Stop, control and Open GUI controls follow the same rule. Solvers other than code_saturne lose the panels and buttons they could never feed: code_aster and the stub solver now show Status, Compare, Log Tail and Recent Errors only. code_saturne is unchanged - `csauto doctor` reports the panels and capabilities derived for the configured solver +- The `info` anomaly label is gone, with the Info choice of the Log Tail and Recent Errors severity filters: no solver produced it, so that filter always came up empty. Adapter patterns are labelled `error` or `warn` - `/api/probes` takes `scope=probes` instead of `scope=monitoring` (a code_saturne directory name); `profiles` is unchanged. `/api/tail` defaults to the solver's own main log instead of `listing`, and the Log Tail file priority comes from the new adapter attribute `tail_file_names`, exposed as `tail_files` in `/api/app_config` - code_saturne conventions (log names, outcome, progress and restart patterns, the `RESU` results layout, the `performance.log` parser, setup.xml and run.cfg discovery) moved from `logs.py`, `probes.py`, `residuals.py` and `template.py` into the code_saturne adapter, which now drives the generic log engine with its own vocabulary. CFD anomaly warnings (`divergence`, `cfl`, `clipping`, ...) and the "No error detected" exception now apply to code_saturne only, so Recent Errors no longer flags them for other solvers - The solver boundary test now scans every module outside `csauto/solvers/` for a wider set of code_saturne conventions (`listing`, `monitoring`, `run_solver.log`, `performance.log`, ...), with the deliberate residue listed in one named allowlist. The leaks it found are gone: the read-only `MESH` mount is the new adapter attribute `readonly_shared_dir_names`, and `csauto tail` defaults to the solver's main log instead of `listing` @@ -48,14 +49,20 @@ Make csauto ready for solvers other than code_saturne: one adapter class describ - `sbatch --wrap` submissions requested no resources, so an MPI run got a single task; they now request `--ntasks` and `--cpus-per-task` - A launch the solver refused (a restart without a checkpoint, an unsupported runtime) left the case PENDING with no way back and skipped the rest of the batch. The case keeps its previous status, the other cases still launch, and the error lists the refused cases - `csauto run` with a relative runs folder broke docker launches (the container id file path was relative to the wrong folder) -- A PID reused by another process (after a reboot, for example) kept a finished case RUNNING; the process start time is now checked against the launch time -- Template rendering silently dropped non-UTF-8 bytes (Latin-1 accents in French comments) and read large binaries in full; files now keep their bytes, and binaries are detected from their first bytes -- An adapter anomaly pattern with a label other than `error`, `warn` or `info` made Recent Errors fail with HTTP 500; such labels are now refused when the adapter is defined +- A PID reused by another process (after a reboot, for example) kept a finished case RUNNING. csauto now records the boot id and the process start time (in clock ticks since boot, which clock steps, DST and time zones leave alone) at launch, and a PID that no longer matches counts as ended, including when another user owns it +- Template rendering silently dropped non-UTF-8 bytes (Latin-1 accents in French comments) and read large binaries in full; files now keep their bytes, and binaries are detected from their first 8 KiB or from a NUL byte further on +- `csauto prepare` on a campaign prepared by csauto 0.5 reported "Existing case differs" for files with CRLF line endings or non-UTF-8 bytes; cases written that way still match +- A `csauto prepare` that failed on one DOE row left that case half made, with unrendered placeholders, which blocked every later prepare; a failing row now leaves nothing behind +- An adapter anomaly pattern with an unknown label made Recent Errors fail with HTTP 500; such labels are now refused when the adapter is defined - Probe plots ignored a `Time` or `TIME` axis column, and the probe position fell back to the first coordinate row for a probe it could not match - Residual rows without an `iteration` column were all drawn at x = 0; they are now plotted in row order, with a warning - The Log Tail never offered `csauto.stdout` and `csauto.stderr`, so it stayed empty for solvers that log to their console and for runs that failed before writing a results folder - When `/api/app_config` failed once (for example before the API token was entered), the dashboard showed the full code_saturne interface until a reload. It now shows only Status, Log Tail and Recent Errors until the solver's description loads, and fetches it again with a growing delay or as soon as a token is saved - The Log Tail's case selector disappeared when the selected case had no log yet, leaving the panel stuck on that case +- Clean's "Keep specific folders" on several cases deleted every run of all cases but one: the folder list came from a single case. The folder choices are now offered for one case at a time, and Clean leaves alone a case that has none of the folders to keep +- A queued (PENDING) case could flip to DONE or FAILED on the next refresh, from the logs of its previous run +- `csauto tail -n N` printed fewer than N lines when they were long: it only read the last 4 KB of the file +- The file routes (`/api/tail`, `/api/tail_lines`, `/api/case_file`, Compare, Recent Errors) now refuse any file a solver adapter resolves outside the case folder, and a file name with a NUL byte returns 404 instead of HTTP 500. A huge `restart_value` returned HTTP 500 as well ## [0.5.0] - 2026-08-03 diff --git a/csauto/cli.py b/csauto/cli.py index 7cb27d3..5e15a37 100644 --- a/csauto/cli.py +++ b/csauto/cli.py @@ -20,14 +20,14 @@ tail_log, ) from .maintenance import cleanup_runs, run_doctor -from .registry import read_campaign_solver, write_campaign_solver +from .registry import read_campaign_solver from .residuals import ( collect_residuals, plot_residuals, ) from .runner import refresh_status, run_cases from .serve_commands import add_serve_subcommands, dispatch_serve_command -from .solvers import get_solver_adapter +from .solvers import available_solvers, get_solver_adapter from .warn import error, flush_warnings, warn @@ -403,14 +403,26 @@ def _print_doctor(items: Sequence[object]) -> bool: return failed -def _campaign_solver(runs_dir: Path | None, config: Config) -> str: - """The solver of the campaign in `runs_dir` when it was recorded, else the configured one.""" +def _use_campaign_solver(runs_dir: Path | None, config: Config) -> bool: + """Switch `config` to the solver the campaign in `runs_dir` was prepared for. + + Returns True when that replaced the configured solver: the configuration's + solver-specific settings (docker image, solver executable, apptainer image) + then belong to another solver and are dropped. + """ recorded = read_campaign_solver(runs_dir) if runs_dir is not None else None - if not recorded: - return config.solver - if config.path is not None and recorded != config.solver: - warn(f"{runs_dir} was prepared for {recorded}; ignoring solver = {config.solver!r} from {config.path}") - return recorded + if not recorded or recorded == config.solver: + return False + if recorded not in available_solvers(): + raise ValueError(f"{runs_dir}/campaign.json names an unknown solver: {recorded!r}") + if config.path is not None: + warn( + f"{runs_dir} was prepared for {recorded}: ignoring solver, docker_image, saturne_bin " + f"and singularity_image from {config.path}" + ) + config.solver = recorded + config.docker_image = config.saturne_bin = config.singularity_image = None + return True def main(argv: Sequence[str] | None = None) -> int: @@ -418,19 +430,17 @@ def main(argv: Sequence[str] | None = None) -> int: config_path = _preparse_config(argv_list) config = load_config(config_path) parser, args = parse_arguments(argv_list, config) - # Commands on an existing campaign use the solver it was prepared for, so - # they work from any directory; serve reads it from config.solver. - config.solver = _campaign_solver(getattr(args, "runs_dir", None), config) - adapter = get_solver_adapter(config.solver) try: + # Commands on an existing campaign use the solver it was prepared for, so + # they work from any directory; serve reads it from config.solver. + if _use_campaign_solver(getattr(args, "runs_dir", None), config): + parser, args = parse_arguments(argv_list, config) # drop the other solver's defaults + adapter = get_solver_adapter(config.solver) if args.command is None: parser.print_help() return 0 elif args.command == "prepare": - recorded = read_campaign_solver(args.output_root) - if recorded and recorded != adapter.name: - raise ValueError(f"{args.output_root} holds a {recorded} campaign; csauto.toml selects {adapter.name}.") headers, rows = load_doe(args.doe_csv) generate_cases( headers, @@ -441,7 +451,6 @@ def main(argv: Sequence[str] | None = None) -> int: adapter=adapter, strict=args.strict, ) - write_campaign_solver(args.output_root, adapter.name) elif args.command == "doe": from .doe_generate import check_spec_against_template, generate_rows, load_doe_spec, write_doe_csv @@ -556,6 +565,7 @@ def main(argv: Sequence[str] | None = None) -> int: if not (args.prune_resu or args.max_log_mb > 0 or args.clear_cid or args.clear_pyc): print("No action specified. Use --prune-resu/--max-log-mb/--clear-cid/--clear-pyc.") return 0 + refresh_status(args.runs_dir, adapter=adapter) # finalize runs that ended, so they are not skipped report = cleanup_runs( args.runs_dir, prune_resu=args.prune_resu, @@ -575,6 +585,8 @@ def main(argv: Sequence[str] | None = None) -> int: print(f"{prefix}.csauto.cid removed: {report.cid_removed}") if args.clear_pyc: print(f"{prefix}__pycache__ removed: {report.pycache_removed}") + if report.skipped_active: + print(f"Skipped running or queued cases: {', '.join(report.skipped_active)}") elif args.command == "completion": from .completion import generate_bash, generate_zsh diff --git a/csauto/doe.py b/csauto/doe.py index f86dd8b..89505ef 100644 --- a/csauto/doe.py +++ b/csauto/doe.py @@ -8,7 +8,14 @@ from pathlib import Path from typing import Any -from .registry import DOE_ROW_FILENAME, STATUS_PREPARED, registry_transaction, update_case +from .registry import ( + DOE_ROW_FILENAME, + STATUS_PREPARED, + read_campaign_solver, + registry_transaction, + update_case, + write_campaign_solver, +) from .template import ( ESCAPED_PLACEHOLDER_PATTERN, extract_condition_variables, @@ -43,6 +50,11 @@ def _write_text(path: Path, text: str) -> None: path.write_bytes(text.encode("utf-8", errors="surrogateescape")) +def _legacy_form(text: str) -> bytes: + """How csauto 0.5 wrote a rendered file: LF line endings, non-UTF-8 bytes dropped.""" + return text.replace("\r\n", "\n").replace("\r", "\n").encode("utf-8", errors="ignore") + + def _is_binary(path: Path) -> bool: with path.open("rb") as handle: return b"\x00" in handle.read(BINARY_SNIFF_BYTES) @@ -187,6 +199,8 @@ def _collect_render_targets(template_dir: Path, adapter) -> list[tuple[Path, str text = _read_text(path) except OSError: continue + if "\x00" in text: # binary past the sniffed head + continue placeholders = extract_placeholders(text) cond_vars = extract_condition_variables(text) # A file whose only braces are escaped still needs rendering, to drop the backslashes. @@ -248,7 +262,9 @@ def _existing_case_matches( case_text = _read_text(case_path) except OSError: return False - if case_text != rendered_targets[rel_path]: + if case_text != rendered_targets[rel_path] and _legacy_form(case_text) != _legacy_form( + rendered_targets[rel_path] + ): return False continue try: @@ -315,6 +331,9 @@ def generate_cases( raise FileNotFoundError(f"Template directory not found: {template_dir}") adapter = adapter or _default_adapter() + recorded = read_campaign_solver(output_dir) + if recorded and recorded != adapter.name: + raise ValueError(f"{output_dir} holds a {recorded} campaign; csauto.toml selects {adapter.name}.") template_setup = adapter.find_setup_file(template_dir) setup_text = _read_text(template_setup) @@ -357,6 +376,8 @@ def generate_cases( _report_unused_columns(headers, required_columns, strict=strict) output_dir.mkdir(parents=True, exist_ok=True) + # Recorded before any case exists, so commands always know the campaign's solver. + write_campaign_solver(output_dir, adapter.name) setup_relative = template_setup.relative_to(template_dir) shared_root = template_dir.parent diff --git a/csauto/execution.py b/csauto/execution.py index ae437d3..61f5296 100644 --- a/csauto/execution.py +++ b/csauto/execution.py @@ -196,7 +196,9 @@ def shared_dir_symlink_mounts( return mounts -def check_shared_dir_symlinks(runs_dir: Path, runtime: str, shared_dirs: Sequence[str]) -> None: +def check_shared_dir_symlinks( + runs_dir: Path, runtime: str, shared_dirs: Sequence[str], container_root: str | None = None +) -> None: """Raise if a symlinked shared dir cannot be made visible inside a container. Symlink targets outside `runs_dir` are bind-mounted into containers at the @@ -206,6 +208,11 @@ def check_shared_dir_symlinks(runs_dir: Path, runtime: str, shared_dirs: Sequenc if runtime not in (RUNTIME_DOCKER, RUNTIME_SINGULARITY): return for target, _readonly in shared_dir_symlink_mounts(runs_dir, shared_dirs): + if container_root and (target == Path(container_root) or Path(container_root) in target.parents): + raise RuntimeError( + f"{target} is mounted at its own path inside the {runtime} container, which collides with " + f"the campaign mount point {container_root}. Move it, or prepare with mesh_mode=copy." + ) if not target.is_dir(): raise RuntimeError( f"{runs_dir} contains a shared-dir symlink to {target}, which does not exist, " diff --git a/csauto/fastapi_routes/actions.py b/csauto/fastapi_routes/actions.py index c5dd81c..4e9efda 100644 --- a/csauto/fastapi_routes/actions.py +++ b/csauto/fastapi_routes/actions.py @@ -7,6 +7,7 @@ from ..control import control_case from ..execution import resolve_runtime +from ..logs import find_case_file from ..maintenance import cleanup_runs from ..registry import STATUS_DONE, STATUS_FAILED, STATUS_PREPARED, STATUS_RUNNING, registry_transaction, update_case from ..runner import run_cases @@ -65,7 +66,7 @@ class RunCasePayload(BaseModel): max_parallel: int | None = None restart: bool = False restart_mode: str = "" - restart_value: int | float | None = None + restart_value: float | None = None restart_path: str | None = None def normalize_cases(raw: list[str] | str | None) -> list[str] | None: @@ -117,13 +118,9 @@ def api_case_file_update( if not payload.kind or payload.content is None: raise ctx.http_exception_cls(status_code=400, detail="Missing case, kind, content parameters") case_id, case_dir = ctx.validated_case_dir(payload.case) - target = ctx.adapter.locate_case_file(case_dir, payload.kind) + target = find_case_file(case_dir, payload.kind, ctx.adapter) if not target: raise ctx.http_exception_cls(status_code=404, detail=f"File {payload.kind} not found for {case_id}") - try: - target.resolve().relative_to(case_dir.resolve()) - except ValueError as exc: - raise ctx.http_exception_cls(status_code=403, detail="Access denied") from exc try: target.write_text(payload.content, encoding="utf-8") except OSError as exc: @@ -213,6 +210,7 @@ def api_cleanup_cases( if keep_resu and delete_resu: raise ctx.http_exception_cls(status_code=400, detail="keep_resu and delete_resu are mutually exclusive") + had_runs = {case_id for case_id in case_ids if ctx.adapter.list_run_dirs(ctx.runs_dir / case_id)} report = cleanup_runs( ctx.runs_dir, prune_resu=bool(payload.prune_resu), @@ -230,7 +228,7 @@ def api_cleanup_cases( # A finished case whose runs were all deleted goes back to PREPARED. if payload.prune_resu and not payload.dry_run: with registry_transaction(ctx.runs_dir) as registry: - for case_id in case_ids: + for case_id in had_runs: if ctx.adapter.list_run_dirs(ctx.runs_dir / case_id): continue current = registry.get(case_id, {}).get("status", "") @@ -263,6 +261,7 @@ def api_cleanup_cases( "bytes_freed": report.bytes_freed, "cid_removed": report.cid_removed, "pycache_removed": report.pycache_removed, + "skipped_active": report.skipped_active, } @app.post("/api/kill_case", response_model=SuccessResponse) diff --git a/csauto/fastapi_routes/case_data.py b/csauto/fastapi_routes/case_data.py index 5e8fcc8..d4cdc76 100644 --- a/csauto/fastapi_routes/case_data.py +++ b/csauto/fastapi_routes/case_data.py @@ -1,7 +1,13 @@ import math from typing import Annotated, Any -from ..logs import GENERIC_ANOMALY_PATTERNS, highlight_anomaly_line, list_tail_files, read_tail_lines +from ..logs import ( + GENERIC_ANOMALY_PATTERNS, + find_case_file, + highlight_anomaly_line, + list_tail_files, + read_tail_lines, +) from ..probes import probe_columns, probe_position, render_probe_svg from ..web_support import log_case_action from .common import shared_models @@ -75,7 +81,7 @@ def api_tail( case_id = ctx.validate_case(query.case) case_dir = ctx.runs_dir / case_id file_name = query.file or _default_tail_file(case_dir) - file_path = ctx.adapter.locate_case_file(case_dir, file_name) if case_dir.is_dir() else None + file_path = find_case_file(case_dir, file_name, ctx.adapter) if case_dir.is_dir() else None if not file_path: raise ctx.http_exception_cls(status_code=404, detail=f"File {file_name} not found for {case_id}") log_case_action( @@ -108,7 +114,7 @@ def api_tail_lines( ctx.require_auth(x_csauto_token, authorization) case_id, case_dir = ctx.validated_case_dir(query.case) file_name = query.file or _default_tail_file(case_dir) - file_path = ctx.adapter.locate_case_file(case_dir, file_name) + file_path = find_case_file(case_dir, file_name, ctx.adapter) if not file_path: raise ctx.http_exception_cls(status_code=404, detail=f"File {file_name} not found for {case_id}") patterns = (*GENERIC_ANOMALY_PATTERNS, *ctx.adapter.anomaly_patterns) diff --git a/csauto/fastapi_routes/common.py b/csauto/fastapi_routes/common.py index 2253678..06a99c5 100644 --- a/csauto/fastapi_routes/common.py +++ b/csauto/fastapi_routes/common.py @@ -77,6 +77,7 @@ class CleanupResponse(BaseModel): bytes_freed: int = 0 cid_removed: int = 0 pycache_removed: int = 0 + skipped_active: list[str] = [] class ProbePositionResponse(BaseModel): """Response from probe position lookup.""" diff --git a/csauto/fastapi_routes/compare.py b/csauto/fastapi_routes/compare.py index 1c4c9c0..c453165 100644 --- a/csauto/fastapi_routes/compare.py +++ b/csauto/fastapi_routes/compare.py @@ -3,6 +3,7 @@ from typing import Any from ..diff import compare_runs_diff +from ..logs import find_case_file from ..web_support import log_case_action @@ -23,7 +24,7 @@ def api_case_file( if not kind: raise ctx.http_exception_cls(status_code=400, detail="Missing case, kind parameters") case_id, case_dir = ctx.validated_case_dir(case) - target = ctx.adapter.locate_case_file(case_dir, kind) + target = find_case_file(case_dir, kind, ctx.adapter) if not target: raise ctx.http_exception_cls(status_code=404, detail=f"File {kind} not found for {case_id}") return PlainTextResponse(target.read_text(encoding="utf-8", errors="ignore")) diff --git a/csauto/logs.py b/csauto/logs.py index 5676d20..5d86cd0 100644 --- a/csauto/logs.py +++ b/csauto/logs.py @@ -14,6 +14,7 @@ from datetime import datetime from pathlib import Path +from .pathutil import is_within_root from .registry import STATUS_DONE, STATUS_FAILED from .warn import warn @@ -39,7 +40,7 @@ def _default_adapter(): ), ("warn", re.compile(r"(warning|limit reached)", re.IGNORECASE)), ) -ANOMALY_SEVERITY = {"error": 2, "warn": 1, "info": 0} +ANOMALY_SEVERITY = {"error": 2, "warn": 1} ANOMALY_CONTEXT_DEFAULT = 6 ANOMALY_CONTEXT_MAX = 50 ANOMALY_FILE_CACHE_MAX = 256 @@ -108,7 +109,7 @@ def highlight_anomaly_line( parts.append(f'{html_lib.escape(line[start:end])}') last = end parts.append(html_lib.escape(line[last:])) - return "".join(parts), severity or "info" + return "".join(parts), severity or "warn" def _new_anomaly_file_cache(path: Path, *, device: int | None, inode: int | None) -> AnomalyFileCache: @@ -264,7 +265,7 @@ def collect_recent_errors( continue seen_paths: set[str] = set() for name in files_to_scan: - path = adapter.locate_case_file(case_dir, name) + path = find_case_file(case_dir, name, adapter) if not path or not path.is_file(): continue # Aliased names (adapters mapping several conventional names onto @@ -338,7 +339,9 @@ def add(name: str, path: Path) -> None: seen.add(resolved) files.append(name) - latest = adapter.latest_run_dir(case_dir) + run_dirs = adapter.list_run_dirs(case_dir) + latest = run_dirs[0] if run_dirs else None + older_runs = [run_dir.resolve() for run_dir in run_dirs[1:]] folders = [case_dir, *([latest] if latest and latest != case_dir else [])] for name in adapter.tail_file_names: if any(char in name for char in "*?["): @@ -346,8 +349,9 @@ def add(name: str, path: Path) -> None: for path in sorted(folder.glob(name)): add(path.relative_to(case_dir).as_posix(), path) continue - path = adapter.locate_case_file(case_dir, name) - if path: + path = find_case_file(case_dir, name, adapter) + # A previous run's copy would pass for the current run's log while a new run starts. + if path and not any(is_within_root(path, run_dir) for run_dir in older_runs): add(name, path) if latest: for path in sorted(latest.glob("*.log")): @@ -355,10 +359,20 @@ def add(name: str, path: Path) -> None: return files -def read_case_file_text(case_dir: Path, name: str, adapter=None) -> str: - """Read a case file content as text.""" +def find_case_file(case_dir: Path, name: str, adapter=None) -> Path | None: + """adapter.locate_case_file, refused when the file it finds lies outside the case folder. + + Names come from API requests too, so core code goes through here instead of + trusting every adapter override to stay inside the case. + """ adapter = adapter or _default_adapter() path = adapter.locate_case_file(case_dir, name) + return path if path and is_within_root(path, case_dir.resolve()) else None + + +def read_case_file_text(case_dir: Path, name: str, adapter=None) -> str: + """Read a case file content as text.""" + path = find_case_file(case_dir, name, adapter) if not path: raise FileNotFoundError(f"File {name} not found for {case_dir.name}") return path.read_text(encoding="utf-8", errors="ignore") @@ -433,7 +447,7 @@ def tail_log( adapter = adapter or _default_adapter() file_name = file_name or next(iter(list_tail_files(case_dir, adapter)), adapter.tail_file_names[0]) - path = adapter.locate_case_file(case_dir, file_name) + path = find_case_file(case_dir, file_name, adapter) if not path: raise FileNotFoundError(f"File {file_name} not found for {case}") diff --git a/csauto/maintenance.py b/csauto/maintenance.py index 055a98c..314bed8 100644 --- a/csauto/maintenance.py +++ b/csauto/maintenance.py @@ -4,7 +4,7 @@ import os import shutil from collections.abc import Iterable, Sequence -from dataclasses import dataclass +from dataclasses import dataclass, field from pathlib import Path from .pathutil import is_within_root @@ -183,6 +183,7 @@ class CleanupReport: bytes_freed: int = 0 cid_removed: int = 0 pycache_removed: int = 0 + skipped_active: list[str] = field(default_factory=list) def _truncate_file(path: Path, max_bytes: int) -> int: @@ -275,12 +276,16 @@ def cleanup_runs( for case_dir in _iter_case_dirs(runs_dir, cases): if statuses.get(case_dir.name) in (STATUS_RUNNING, STATUS_PENDING): # Never delete or truncate files a live run is writing. + report.skipped_active.append(case_dir.name) continue # Only the folders the adapter reports as runs are ever deleted. resu_dirs = adapter.list_run_dirs(case_dir) if prune_resu: if keep_names: - targets = [resu_dir for resu_dir in resu_dirs if resu_dir.name not in keep_names] + # A case that has none of the kept folders keeps everything: the + # names were picked from another case's runs, or mistyped. + kept = [resu_dir for resu_dir in resu_dirs if resu_dir.name in keep_names] + targets = [resu_dir for resu_dir in resu_dirs if resu_dir.name not in keep_names] if kept else [] elif delete_names: targets = [resu_dir for resu_dir in resu_dirs if resu_dir.name in delete_names] else: diff --git a/csauto/pathutil.py b/csauto/pathutil.py index fcdddf2..5ec709b 100644 --- a/csauto/pathutil.py +++ b/csauto/pathutil.py @@ -17,7 +17,10 @@ def safe_subpath(base: Path, relative: str | Path) -> Path | None: rel = Path(relative) if not str(relative) or rel.is_absolute(): return None - candidate = (base / rel).resolve() + try: + candidate = (base / rel).resolve() + except (OSError, ValueError): # a NUL byte, a symlink loop + return None if not is_within_root(candidate, base.resolve()): return None return candidate diff --git a/csauto/probes.py b/csauto/probes.py index 5a7c2c3..6d753b6 100644 --- a/csauto/probes.py +++ b/csauto/probes.py @@ -1,6 +1,7 @@ from __future__ import annotations import csv +import itertools import math from collections.abc import Mapping, Sequence from pathlib import Path @@ -121,8 +122,11 @@ def locate_run_csv_files( return [] -def read_csv_table(path: Path) -> tuple[list[str], list[dict[str, str]]]: - """(columns, rows) of a comma-separated CSV file with a header line, keys and values stripped.""" +def read_csv_table(path: Path, max_rows: int | None = None) -> tuple[list[str], list[dict[str, str]]]: + """(columns, rows) of a comma-separated CSV file with a header line, keys and values stripped. + + max_rows stops reading after that many rows (0 reads the header only). + """ with path.open(newline="", encoding="utf-8", errors="ignore") as handle: reader = csv.DictReader(handle) if reader.fieldnames is None: @@ -130,7 +134,7 @@ def read_csv_table(path: Path) -> tuple[list[str], list[dict[str, str]]]: columns = [name.strip() for name in reader.fieldnames if name is not None] rows = [ {key.strip(): value.strip() if isinstance(value, str) else value for key, value in row.items() if key} - for row in reader + for row in itertools.islice(reader, max_rows) ] return columns, rows @@ -263,7 +267,7 @@ def probe_position( continue try: rows_with_coords: list[tuple[Mapping[str, str], float, float, float | None]] = [] - for row in adapter.read_probe_file(probe_path)[1][:200]: + for row in adapter.read_probe_file(probe_path, max_rows=200)[1]: x = _extract_coord_value(row, "x") y = _extract_coord_value(row, "y") z = _extract_coord_value(row, "z") @@ -354,7 +358,7 @@ def probe_columns(runs_dir: Path, case: str, probe_files: str | Sequence[str], a probe_path = locate_probe_file(case_dir, probe_file, adapter=adapter) if not probe_path or not probe_path.is_file(): raise FileNotFoundError(f"Probe file not found: {probe_file}") - for name in adapter.read_probe_file(probe_path)[0]: + for name in adapter.read_probe_file(probe_path, max_rows=0)[0]: if name and name not in seen: seen.add(name) columns.append(name) diff --git a/csauto/runner.py b/csauto/runner.py index af6ca91..534865a 100644 --- a/csauto/runner.py +++ b/csauto/runner.py @@ -57,9 +57,6 @@ LAUNCH_LOCKFILE = ".csauto.launch.lock" # Written in the case folder by the launch wrapper when the run command ends. EXIT_CODE_FILE = ".csauto.exitcode" -# How far the start time of a live PID may be from the recorded launch time -# before the PID is considered reused by another process. -PID_START_TOLERANCE_S = 120.0 LAUNCH_THREAD_LOCK = threading.RLock() RESULTS_SIZE_CACHE_LOCK = threading.RLock() RESULTS_SIZE_CACHE: dict[str, dict[str, float | None]] = {} @@ -177,7 +174,7 @@ def _submit_slurm_job( env_prefix = " ".join(f"{key}={shlex.quote(value)}" for key, value in sorted((env or {}).items())) if env_prefix: wrapped = f"{env_prefix} {wrapped}" - wrapped = f"{wrapped}; echo $? > {EXIT_CODE_FILE}" + wrapped = f"{wrapped}; rc=$?; echo $rc > {EXIT_CODE_FILE}; exit $rc" submit_cmd = [ "sbatch", "--parsable", @@ -478,7 +475,8 @@ def _launch_slurm( def _with_exit_code(command: Sequence[object]) -> list[str]: """Run `command` through sh, which writes its exit status to EXIT_CODE_FILE when it ends.""" - return ["nohup", "sh", "-c", f'"$@"; echo $? > {EXIT_CODE_FILE}', "csauto-run", *_strip_nohup_prefix(command)] + script = f'"$@"; rc=$?; echo $rc > {EXIT_CODE_FILE}; exit $rc' + return ["nohup", "sh", "-c", script, "csauto-run", *_strip_nohup_prefix(command)] def exit_status_outcome(case_dir: Path, start_time: str | None) -> str | None: @@ -554,6 +552,7 @@ def _launch_local( start_time=timestamp_now(), end_time=None, pid=proc.pid, + pid_identity=process_identity(proc.pid), job_id=None, ) if cidfile: @@ -759,22 +758,22 @@ def _is_zombie(pid: int) -> bool: return bool(fields) and fields[0] == "Z" -def _process_start_epoch(pid: int) -> float | None: - """When the process started (seconds since the epoch), from procfs; None without it.""" +def process_identity(pid: int) -> str | None: + """ ":" of a process, from procfs, or None without it. + + Unlike wall-clock times, neither part changes when the clock is stepped + (WSL2 resyncs often), at a DST change or with another timezone, so it tells + a launched process from another one that later got the same PID. + """ try: + boot_id = Path("/proc/sys/kernel/random/boot_id").read_text(encoding="utf-8").strip() stat = Path(f"/proc/{pid}/stat").read_text(encoding="utf-8", errors="ignore") - boot = next( - float(line.split()[1]) - for line in Path("/proc/stat").read_text(encoding="utf-8", errors="ignore").splitlines() - if line.startswith("btime ") - ) - start_ticks = float(stat.rpartition(")")[2].split()[19]) - return boot + start_ticks / os.sysconf("SC_CLK_TCK") - except (OSError, ValueError, IndexError, StopIteration): + return f"{boot_id}:{stat.rpartition(')')[2].split()[19]}" + except (OSError, IndexError): return None -def is_process_alive(pid: int, started_at: float | None = None) -> bool: +def is_process_alive(pid: int, identity: str | None = None) -> bool: """Check if a PID is alive (best effort, POSIX-oriented). A zombie counts as dead. `os.kill(pid, 0)` still succeeds for a process that @@ -782,16 +781,16 @@ def is_process_alive(pid: int, started_at: float | None = None) -> bool: long-lived web server becomes: `run_cases` spawns it with Popen and never waits. Treating that as alive kept finished cases RUNNING forever. - With `started_at` (the recorded launch time), a live PID whose process - started at another time counts as dead: the PID was reused, for instance - after a reboot. + With `identity` (from process_identity at launch), a PID now held by + another process counts as dead: the PID was reused, for instance after a + reboot, possibly by another user's process. """ try: os.kill(pid, 0) except ProcessLookupError: return False except PermissionError: - return True + pass # alive but owned by someone else: check the identity below except OSError: return False if _is_zombie(pid): @@ -800,9 +799,9 @@ def is_process_alive(pid: int, started_at: float | None = None) -> bool: with contextlib.suppress(ChildProcessError, OSError): os.waitpid(pid, os.WNOHANG) return False - if started_at is not None: - process_start = _process_start_epoch(pid) - if process_start is not None and abs(process_start - started_at) > PID_START_TOLERANCE_S: + if identity is not None: + current = process_identity(pid) + if current is not None and current != identity: return False return True @@ -815,7 +814,7 @@ def _run_alive(record: Mapping[str, Any], job_active: Callable[[str], bool | Non pid_number = int(pid) except (TypeError, ValueError): return False - return is_process_alive(pid_number, started_at=parse_start_time(record.get("start_time"))) + return is_process_alive(pid_number, identity=record.get("pid_identity")) job_id = _normalize_job_id(record.get("job_id")) if job_id: return job_active(job_id) @@ -919,8 +918,10 @@ def _compute_refresh_result( end_time = end_time or timestamp_now() pid = None job_id = None - elif status != STATUS_DONE and has_started: - # Only check for completion if a run was actually started. + elif status not in (STATUS_DONE, STATUS_PENDING) and has_started: + # Only check for completion if a run was actually started. A queued + # (PENDING) case still has the previous run's logs, which say nothing + # about the run it waits for. outcome = adapter.detect_outcome(case_dir, start_time) if outcome: status = outcome diff --git a/csauto/solvers/base.py b/csauto/solvers/base.py index a49277a..07f9b06 100644 --- a/csauto/solvers/base.py +++ b/csauto/solvers/base.py @@ -58,7 +58,7 @@ class RestartMode(NamedTuple): ALL_DASHBOARD_PANELS = ("status", "residuals", "probes", "performance", "compare", "tail", "errors") ALL_RUNTIMES = (RUNTIME_NATIVE, RUNTIME_DOCKER, RUNTIME_SINGULARITY) -ANOMALY_LABELS = ("error", "warn", "info") +ANOMALY_LABELS = ("error", "warn") VALUE_KINDS = ("int", "float") CAPABILITY_RESIDUALS = "residuals" @@ -92,8 +92,9 @@ class SolverAdapter(ABC): # Launch. supported_runtimes: ClassVar[frozenset[str]] = frozenset(ALL_RUNTIMES) # Where the campaign folder is mounted inside containers. Keep it out of - # the image user's home, or the solver's own dotfiles land in the campaign. - container_root: ClassVar[str] = "/mnt" + # the image user's home (the solver's dotfiles would land in the campaign) + # and away from host paths such as /mnt (WSL drives, data disks). + container_root: ClassVar[str] = "/csauto" # Shell commands run inside containers before the solver, for images whose # environment must be activated first (e.g. "source /opt/activate.sh"). container_setup: ClassVar[str] = "" @@ -274,7 +275,9 @@ def preflight(self, runs_dir: Path, runtime: str) -> None: """Checks run once before a batch of launches; raise to refuse the batch.""" from ..execution import check_shared_dir_symlinks - check_shared_dir_symlinks(runs_dir, runtime, shared_dirs=self.shared_dir_names) + check_shared_dir_symlinks( + runs_dir, runtime, shared_dirs=self.shared_dir_names, container_root=self.container_root + ) # Run state. @@ -408,15 +411,16 @@ def locate_probe_files(self, case_dir: Path, probe_ref: str, include_history: bo """Files holding the probe `probe_ref`: the latest one, or every run's oldest first.""" return [] - def read_probe_file(self, path: Path) -> tuple[list[str], list[dict[str, str]]]: + def read_probe_file(self, path: Path, max_rows: int | None = None) -> tuple[list[str], list[dict[str, str]]]: """(columns, rows) of one probe file. The default reads a comma-separated CSV. Override it to read another format (SERAFIN, MED...) directly. Time series need a "t" or "time" column (any case) or an "iteration" column. + max_rows caps the rows returned: 0 when only the columns are needed. """ from ..probes import read_csv_table - return read_csv_table(path) + return read_csv_table(path, max_rows) def find_performance_log(self, case_dir: Path) -> Path | None: return None diff --git a/csauto/solvers/code_saturne.py b/csauto/solvers/code_saturne.py index c24d5f4..7e6621e 100644 --- a/csauto/solvers/code_saturne.py +++ b/csauto/solvers/code_saturne.py @@ -308,6 +308,18 @@ def _last_match(lines: Sequence[str], patterns: Sequence[re.Pattern[str]], cast: return None +def _has_checkpoint(run_dir: Path) -> bool: + """True when the run folder holds code_saturne checkpoint files (*.csc).""" + checkpoint_dir = run_dir / "checkpoint" + try: + return checkpoint_dir.is_dir() and any( + child.is_file() and (child.name.endswith(".csc") or ".csc." in child.name) + for child in checkpoint_dir.iterdir() + ) + except OSError: + return False + + def _require_positive_restart_value( restart_value: int | float | None, mode_label: str, @@ -553,28 +565,12 @@ def build_restart_args( f"restart_path must be a run id (e.g. 20260308-0923) or a " f"{self.results_dirname}//checkpoint path" ) + if not _has_checkpoint(self.results_root(case_dir) / restart_run_id): + raise ValueError(f"Run {restart_run_id} of {case_dir.name} has no checkpoint to restart from") else: - resu_root = self.results_root(case_dir) - if resu_root.is_dir(): - try: - resu_dirs = [p for p in resu_root.iterdir() if p.is_dir()] - resu_dirs.sort(key=lambda p: p.stat().st_mtime, reverse=True) - except OSError: - resu_dirs = [] - for run_dir in resu_dirs: - checkpoint_dir = run_dir / "checkpoint" - if not checkpoint_dir.is_dir(): - continue - try: - has_checkpoint = any( - child.is_file() and (child.name.endswith(".csc") or ".csc." in child.name) - for child in checkpoint_dir.iterdir() - ) - except OSError: - has_checkpoint = False - if has_checkpoint: - restart_run_id = run_dir.name - break + restart_run_id = next( + (run_dir.name for run_dir in self.list_run_dirs(case_dir) if _has_checkpoint(run_dir)), None + ) if not restart_run_id: raise ValueError(f"No checkpoint found for {case_dir.name}") details["restart_run_id"] = restart_run_id diff --git a/csauto/solvers/stub.py b/csauto/solvers/stub.py index 4fde63b..a9dd071 100644 --- a/csauto/solvers/stub.py +++ b/csauto/solvers/stub.py @@ -13,6 +13,7 @@ from pathlib import Path from typing import Any, ClassVar +from ..pathutil import safe_subpath from ..registry import STATUS_DONE, STATUS_FAILED from .base import CompareKind, ControlAction, SolverAdapter @@ -67,8 +68,8 @@ def locate_case_file(self, case_dir: Path, name: str) -> Path | None: if direct: return direct for run_dir in self.list_run_dirs(case_dir): - candidate = run_dir / name - if candidate.is_file(): + candidate = safe_subpath(run_dir, name) # never leave the run folder + if candidate and candidate.is_file(): return candidate return None diff --git a/csauto/web_support.py b/csauto/web_support.py index c5b2562..1bad643 100644 --- a/csauto/web_support.py +++ b/csauto/web_support.py @@ -9,7 +9,7 @@ from .docker import find_container_id_for_case, read_container_id, terminate_container from .execution import RUNTIME_DOCKER -from .logs import read_tail_lines +from .logs import find_case_file, read_tail_lines from .pathutil import is_within_root from .registry import append_history, load_registry, registry_transaction, timestamp_now, update_case from .runner import final_outcome, is_process_alive, terminate_pid @@ -187,7 +187,7 @@ def discover_job_id(case_dir: Path, job_id_patterns: Sequence[re.Pattern[str]], seen: set[str] = set() candidates: list[Path] = [] for name in adapter.anomaly_file_names: - file_path = adapter.locate_case_file(case_dir, name) + file_path = find_case_file(case_dir, name, adapter) if not file_path or not file_path.is_file(): continue key = str(file_path.resolve()) @@ -240,7 +240,7 @@ def count_running_cases(runs_dir: Path, status_running: str) -> int: pid_alive = False if pid is not None: try: - pid_alive = is_process_alive(int(pid)) + pid_alive = is_process_alive(int(pid), identity=record.get("pid_identity")) except (TypeError, ValueError): pid_alive = False if pid_alive: @@ -315,6 +315,7 @@ def kill_case( start_time = record.get("start_time") previous_end_time = record.get("end_time") pid_raw = record.get("pid") + pid_identity = record.get("pid_identity") if pid_raw is None and not container_id and not job_id: raise ValueError(f"No PID, container_id or job_id for {case_id}") @@ -339,7 +340,7 @@ def kill_case( pid_int = int(pid_raw) except (TypeError, ValueError) as exc: raise ValueError(f"Invalid PID for {case_id}") from exc - if is_process_alive(pid_int): + if is_process_alive(pid_int, identity=pid_identity): terminate_pid(pid_int) pid_alive = True details["pid_killed"] = True diff --git a/docs/adding-a-solver.md b/docs/adding-a-solver.md index 3d3b0d2..83adc15 100644 --- a/docs/adding-a-solver.md +++ b/docs/adding-a-solver.md @@ -119,10 +119,10 @@ once your adapter feeds it; the conformance suite refuses a tab nothing feeds. | Tab | What to add | |---|---| | Log Tail | Nothing. It offers `csauto.stdout` and `csauto.stderr` (the solver's console output) plus every `*.log` file of the latest run. Set `tail_file_names` to put your main logs first; entries may be globs, such as `"*.mess"`. | -| Recent Errors | Nothing. It scans `anomaly_file_names` for crashes, tracebacks, `error:` lines and warnings. Add your solver's own markers with `anomaly_patterns` (labels `"error"`, `"warn"` or `"info"`) and silence false positives with `anomaly_ignore_patterns`. The Log Tail colours lines with the same patterns. | +| Recent Errors | Nothing. It scans `anomaly_file_names` for crashes, tracebacks, `error:` lines and warnings. Add your solver's own markers with `anomaly_patterns` (labels `"error"` or `"warn"`) and silence false positives with `anomaly_ignore_patterns`. The Log Tail colours lines with the same patterns. | | Compare | `compare_kinds`: `CompareKind(value, label)` entries. The value is a name handed to `locate_case_file`, so it can be an alias for a file whose name changes per case (code_aster maps `"export"` to the case's `.export`). The first entry is the default. | | Residuals | `find_residuals_files` returning CSV files with an `iteration` column and one column per residual, or `parse_live_residuals` returning rows parsed from a log. `default_residual_columns` names the curves shown first. | -| Probes | `list_probe_files` and `locate_probe_files`. Time series need a `t` or `time` column. Files are read as comma-separated CSV; override `read_probe_file` for another format. `list_profile_files` adds spatial profiles. | +| Probes | `list_probe_files` and `locate_probe_files`. Time series need a `t` or `time` column. Files are read as comma-separated CSV; override `read_probe_file(path, max_rows)` for another format (return at most `max_rows` rows when it is set: 0 means only the column names are needed). `list_profile_files` adds spatial profiles. | | Timing Snapshot | `performance_columns` (`PerfColumn(key, label, kind)`, kind `"time"`, `"int"`, `"float"` or `"text"`), `find_performance_log`, and `parse_performance` returning values under those keys. `csauto perf` exports the same columns. | The status table's **Last Iter** column comes from `read_progress`. @@ -180,7 +180,10 @@ everything into `results_dirname` itself, return `[self.results_root(case_dir)]` `locate_case_file(case_dir, name)` turns the names used by the Log Tail, Recent Errors and Compare into files. The default resolves paths relative to the case folder; extend it when your logs live in run folders (see -`StubAdapter` and `CodeSaturneAdapter`). +`StubAdapter` and `CodeSaturneAdapter`). These names can come from API +requests: build paths with `pathutil.safe_subpath(folder, name)`, which refuses +`..` and absolute paths, as the stub does. csauto also ignores any file you +return from outside the case folder. ### The solver needs a file written at launch @@ -210,7 +213,7 @@ in separate steps), return it from `build_slurm_script`. `mpi_env` turns the `supported_runtimes` lists the runtimes the solver can use (`native`, `docker`, `singularity`). Auto mode only picks among them, and asking for another one is refused before anything starts. Containers mount the campaign -folder at `container_root` (`/mnt` by default). Keep it out of the image +folder at `container_root` (`/csauto` by default). Keep it out of the image user's home directory, or the solver's own settings and caches end up in the campaign folder. @@ -234,7 +237,7 @@ Optional, with their default: | Member | Default | |---|---| | `supported_runtimes` | native, docker and singularity | -| `container_root` | `"/mnt"` | +| `container_root` | `"/csauto"` | | `container_setup` | none | | `shared_dir_names`, `readonly_shared_dir_names` | none: folders next to `TEMPLATE` shared by every case (code_saturne: `MESH`, `POST`), reached as `../MESH` from a case | | `template_input_names` | none: files never rendered | diff --git a/docs/api.md b/docs/api.md index 217ea9d..68fe2d9 100644 --- a/docs/api.md +++ b/docs/api.md @@ -323,7 +323,7 @@ Response: } ``` -`severity` is `error`, `warn`, `info` or `null`. +`severity` is `error`, `warn` or `null`. ## `GET /api/resu_files` diff --git a/docs/architecture.md b/docs/architecture.md index 9f76f72..bc2c4aa 100644 --- a/docs/architecture.md +++ b/docs/architecture.md @@ -124,7 +124,7 @@ Launch modes: - Slurm submission (`sbatch --wrap` or an adapter-built script, monitored via `squeue`) Containers mount the campaign folder at the adapter's `container_root` -(`/mnt` by default) and run with `--rm`; symlinked shared dirs are mounted at +(`/csauto` by default) and run with `--rm`; symlinked shared dirs are mounted at their own path so `../MESH` resolves inside the container. ## Testing strategy diff --git a/docs/cli.md b/docs/cli.md index 3807ac1..30d3d9f 100644 --- a/docs/cli.md +++ b/docs/cli.md @@ -152,7 +152,7 @@ Notes: - Restart (from checkpoint) is available only via the web UI or API, not via this CLI command - Cases already `RUNNING` are skipped - The solver starts inside the case folder, whatever the runtime. Docker runs - use `docker run --rm` with the campaign folder mounted at `/mnt` + use `docker run --rm` with the campaign folder mounted at `/csauto` - How `--n` and `--nt` are used depends on the solver: code_saturne receives them as `-n` and `--nt`; code_aster runs `.csauto.export`, a copy of the case's export with `mpi_nbcpu` set from `--n` and `ncpus` from `--nt` @@ -430,8 +430,10 @@ Each check prints `[OK]`, `[WARN]` or `[FAIL]`. Fix all failures before running. Removes old run folders and truncates oversized logs. `--prune-resu` deletes only the run folders the solver reports: each `RESU/` for code_saturne, -`RESU` itself for code_aster (one run per case). `RUNNING` and `PENDING` cases -are skipped. This command does not change case statuses. +`RESU` itself for code_aster (one run per case). Statuses are refreshed first, +as `csauto status` does, so a run that has ended is not taken for a running +one; `RUNNING` and `PENDING` cases are then skipped and listed. Unlike the +dashboard's Clean, this command never resets a case to `PREPARED`. ```bash csauto cleanup [options] diff --git a/docs/concepts.md b/docs/concepts.md index 5e4c497..6330a68 100644 --- a/docs/concepts.md +++ b/docs/concepts.md @@ -154,7 +154,7 @@ A **runtime** is the execution backend csauto uses to actually run the solver: The runtime is set in `csauto.toml` or via CLI flags. Whatever the runtime, the solver starts inside the case folder; containers mount the campaign folder at -`/mnt`. +`/csauto`. ### RESU directory diff --git a/docs/config.md b/docs/config.md index 437d42e..ba47f54 100644 --- a/docs/config.md +++ b/docs/config.md @@ -87,7 +87,7 @@ host = "127.0.0.1" port = 8000 ``` -Containers mount the campaign folder at `/mnt` and start the solver inside the +Containers mount the campaign folder at `/csauto` and start the solver inside the case folder (`docker run --rm --entrypoint ...`), so the image does not need the solver as its entrypoint. @@ -129,7 +129,7 @@ token = "your-secret-token" | `solver` | `code_saturne` | The campaign's solver: `code_saturne`, `code_aster`, or `stub` (a fake solver for tests). `csauto prepare` records it in `RUNS/campaign.json` (see [architecture.md](./architecture.md#solver-adapter-boundary)) | | `runtime` | `auto` | Execution backend: `auto`, `native`, `docker`, or `singularity` | | `saturne_bin` | (auto-detected) | Path to the native solver executable (`code_saturne`, or `run_aster` for code_aster) for `native` runtime | -| `docker_image` | (the solver's own image) | Docker image name for `docker` runtime; defaults to `simvia/code_saturne` for code_saturne, `simvia/code_aster:17.4.0` for code_aster | +| `docker_image` | (the solver's own image) | Docker image name for `docker` runtime; defaults to `simvia/code_saturne` for code_saturne, `simvia/code_aster:17.4.0` for code_aster. csauto starts the solver with `--entrypoint`, so in a custom image the solver must be on `PATH` and its environment set through `ENV` | | `singularity_image` | (none) | Path or URI to `.sif` image for `singularity` runtime | | `singularity_bin` | (auto-detected) | Path to `apptainer` or `singularity` binary | | `use_slurm` | (auto-detected) | `true` to force Slurm submission, `false` to force local | diff --git a/docs/troubleshooting.md b/docs/troubleshooting.md index 372ab74..b8fcc58 100644 --- a/docs/troubleshooting.md +++ b/docs/troubleshooting.md @@ -62,13 +62,28 @@ campaign's solver. --- -### `Warning: RUNS was prepared for code_saturne; ignoring solver = 'code_aster' from ...` +### `Warning: RUNS was prepared for code_saturne: ignoring solver, docker_image, saturne_bin and singularity_image from ...` **Cause**: the `csauto.toml` found for this command selects another solver than -the one the campaign was prepared for. csauto uses the campaign's solver. +the one the campaign was prepared for. csauto uses the campaign's solver, with +that solver's default image and executable: the image and paths in that file +belong to the other solver. **Fix**: nothing is needed. To silence it, run the command from the campaign's -own directory or fix `solver` in that `csauto.toml`. +own directory or fix `solver` in that `csauto.toml`. To use your own image for +this campaign, pass `--docker-image` (or `--saturne-bin`, `--singularity-image`) +on the command line, or set it in a `csauto.toml` that selects the campaign's +solver. + +--- + +### `RUNS/campaign.json names an unknown solver: 'xyz'` + +**Cause**: the campaign was prepared with a solver this csauto installation +does not have (a newer csauto, say), or `campaign.json` was edited. + +**Fix**: use the csauto that prepared the campaign, or correct the solver name +in `RUNS/campaign.json` (`code_saturne` or `code_aster`). --- @@ -84,6 +99,17 @@ directory. The case keeps its status; the other selected cases still launch. --- +### `Run 20260101-1000 of caseXXXX has no checkpoint to restart from` + +**Cause**: the run chosen in the Restart dialog's **Restart from** (or passed +as `restart_path`) holds no checkpoint, usually because it failed before +writing one. The case keeps its status; the other selected cases still launch. + +**Fix**: pick another run, or leave **Restart from** on its default, the most +recent run that has a checkpoint. + +--- + ### `The requested number of time steps ... nt_max ... has to be greater than nt_prev` **Cause**: the restart target iteration is not strictly greater than the number of diff --git a/docs/web-ui.md b/docs/web-ui.md index cbbfe56..6ff200d 100644 --- a/docs/web-ui.md +++ b/docs/web-ui.md @@ -117,10 +117,12 @@ containers and Slurm jobs. Prefer a graceful stop when the solver offers one: Kill discards in-flight work. **Clean**: delete old run folders and/or shorten heavy logs for the selected -finished cases. A popup lets you choose which run folders to keep or delete. -Clean only deletes the folders the solver reports as runs (code_saturne: each -`RESU/`; code_aster: `RESU` itself, its single run) and never touches -running cases. A case whose runs were all deleted returns to `PREPARED`. Clean +finished cases. A popup lets you keep the latest N runs, delete them all, or, +with a single case selected, pick the run folders to keep or delete (run +folders are named per case). Clean only deletes the folders the solver reports +as runs (code_saturne: each `RESU/`; code_aster: `RESU` itself, its single +run) and never touches running or queued cases; a notice lists the ones it +skipped. A case whose runs were all deleted returns to `PREPARED`. Clean also shortens logs larger than 50 MB to their last 50 MB and removes the docker container id file (`.csauto.cid`). @@ -255,7 +257,7 @@ Controls: - **File**: choose the log file - **Lines**: number of lines to display (default 80) - **Filter**: regex filter to match specific lines -- **Severity**: filter by `Error`, `Warn`, `Info` or `All`. Lines are coloured +- **Severity**: filter by `Error`, `Warn` or `All`. Lines are coloured with the same patterns Recent Errors uses for this solver The bottom bar shows: @@ -281,7 +283,7 @@ Controls: - **Files**: select which log files to include (multi-select; the list comes from the solver; with code_saturne: `csauto.stderr`, `run_solver.log`, `listing`, `csauto.stdout`) -- **Severity**: `All`, `Error`, `Warn`, `Info` +- **Severity**: `All`, `Error`, `Warn` - **Search**: plain-text search within matched lines - **Context**: how many lines before and after each hit to display (default 6) diff --git a/frontend/dist/_app/immutable/assets/2.DKE6ochW.css b/frontend/dist/_app/immutable/assets/2.Bl1bTUX7.css similarity index 83% rename from frontend/dist/_app/immutable/assets/2.DKE6ochW.css rename to frontend/dist/_app/immutable/assets/2.Bl1bTUX7.css index 3454f86..2857cb9 100644 --- a/frontend/dist/_app/immutable/assets/2.DKE6ochW.css +++ b/frontend/dist/_app/immutable/assets/2.Bl1bTUX7.css @@ -1 +1 @@ -/*! tailwindcss v4.2.2 | MIT License | https://tailwindcss.com */@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-ease:initial}}}@layer theme{:root,:host{--font-mono:"JetBrains Mono", "Fira Code", "Cascadia Code", "Courier New", monospace;--color-red-600:oklch(57.7% .245 27.325);--color-white:#fff;--spacing:.25rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height: 1.5 ;--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--font-weight-light:300;--font-weight-normal:400;--font-weight-semibold:600;--font-weight-bold:700;--tracking-tight:-.025em;--tracking-wide:.025em;--radius-sm:.25rem;--radius-md:.375rem;--radius-lg:.5rem;--ease-in-out:cubic-bezier(.4, 0, .2, 1);--animate-pulse:pulse 2s cubic-bezier(.4, 0, .6, 1) infinite;--blur-sm:8px;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:"edf-2020";--default-mono-font-family:var(--font-mono);--color-edf-orange-fonce:#d6430a;--color-edf-orange-moyen:#ff861d;--color-edf-orange-clair:#ffb210;--color-edf-vert-fonce:#307a10;--color-edf-bleu-fonce:#001a70;--color-edf-bleu-moyen:#1057c8;--color-edf-bleu-clair:#1089ff;--color-edf-noir:#333;--color-edf-slate:#f8f7f7;--color-edf-gris-moyen:#dedede;--color-edf-gris-clair:#f8f7f7;--color-edf-blanc:#fff;--color-bg:var(--color-edf-slate);--color-ink:var(--color-edf-noir);--color-muted:#787878;--color-card:var(--color-edf-blanc);--color-border:var(--color-edf-gris-moyen);--color-table-head:var(--color-edf-gris-clair);--color-table-row:var(--color-edf-blanc);--color-table-hover:#f5f5f4;--color-table-selected:#e8eff8;--color-table-selected-hover:#dce7f4;--animate-rise:rise .35s ease both}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;-moz-tab-size:4;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){-webkit-appearance:button;-moz-appearance:button;appearance:button}::file-selector-button{-webkit-appearance:button;-moz-appearance:button;appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.pointer-events-auto{pointer-events:auto}.pointer-events-none{pointer-events:none}.visible{visibility:visible}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.sticky\!{position:sticky!important}.inset-0{inset:calc(var(--spacing) * 0)}.start{inset-inline-start:var(--spacing)}.end{inset-inline-end:var(--spacing)}.end\!{inset-inline-end:var(--spacing)!important}.top-0{top:calc(var(--spacing) * 0)}.top-1\/2{top:50%}.right-0{right:calc(var(--spacing) * 0)}.right-2{right:calc(var(--spacing) * 2)}.right-4{right:calc(var(--spacing) * 4)}.bottom-4{bottom:calc(var(--spacing) * 4)}.left-0{left:calc(var(--spacing) * 0)}.z-10{z-index:10}.z-40{z-index:40}.z-50{z-index:50}.z-80{z-index:80}.z-\[1\]{z-index:1}.z-\[1000\]{z-index:1000}.col-span-6{grid-column:span 6/span 6}.col-span-12{grid-column:span 12/span 12}.container{width:100%}@media(min-width:40rem){.container{max-width:40rem}}@media(min-width:48rem){.container{max-width:48rem}}@media(min-width:64rem){.container{max-width:64rem}}@media(min-width:80rem){.container{max-width:80rem}}@media(min-width:96rem){.container{max-width:96rem}}.m-0{margin:calc(var(--spacing) * 0)}.mx-auto{margin-inline:auto}.mt-1{margin-top:calc(var(--spacing) * 1)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mr-2{margin-right:calc(var(--spacing) * 2)}.mr-auto{margin-right:auto}.mb-0{margin-bottom:calc(var(--spacing) * 0)}.mb-1{margin-bottom:calc(var(--spacing) * 1)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-2\.5{margin-bottom:calc(var(--spacing) * 2.5)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-3\.5{margin-bottom:calc(var(--spacing) * 3.5)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.mb-4\.5{margin-bottom:calc(var(--spacing) * 4.5)}.mb-5{margin-bottom:calc(var(--spacing) * 5)}.ml-1{margin-left:calc(var(--spacing) * 1)}.ml-auto{margin-left:auto}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.table{display:table}.aspect-\[900\/500\]{aspect-ratio:900/500}.h-7{height:calc(var(--spacing) * 7)}.h-9{height:calc(var(--spacing) * 9)}.h-10{height:calc(var(--spacing) * 10)}.h-14{height:calc(var(--spacing) * 14)}.h-\[3px\]{height:3px}.h-\[10px\]{height:10px}.h-\[14px\]{height:14px}.h-\[30px\]{height:30px}.h-\[34px\]{height:34px}.h-full{height:100%}.max-h-\[240px\]{max-height:240px}.max-h-\[260px\]{max-height:260px}.max-h-\[500px\]{max-height:500px}.\!min-h-\[80px\]{min-height:80px!important}.w-9{width:calc(var(--spacing) * 9)}.w-32\.5{width:calc(var(--spacing) * 32.5)}.w-37\.5{width:calc(var(--spacing) * 37.5)}.w-\[10px\]{width:10px}.w-\[14px\]{width:14px}.w-\[30px\]{width:30px}.w-\[40px\]{width:40px}.w-\[70px\]{width:70px}.w-\[72px\]{width:72px}.w-\[80px\]{width:80px}.w-\[90px\]{width:90px}.w-\[110px\]{width:110px}.w-\[130px\]{width:130px}.w-\[140px\]{width:140px}.w-\[150px\]{width:150px}.w-\[160px\]{width:160px}.w-\[180px\]{width:180px}.w-\[200px\]{width:200px}.w-\[min\(420px\,96vw\)\]{width:min(420px,96vw)}.w-\[min\(1200px\,94vw\)\]{width:min(1200px,94vw)}.w-\[min\(\{maxWidth\}\,96vw\)\]{width:min({maxWidth},96vw)}.w-auto{width:auto}.w-full{width:100%}.w-max{width:max-content}.max-w-\[140px\]{max-width:140px}.max-w-\[320px\]{max-width:320px}.max-w-\[920px\]{max-width:920px}.\!min-w-0{min-width:calc(var(--spacing) * 0)!important}.min-w-\[36px\]{min-width:36px}.min-w-\[40px\]{min-width:40px}.min-w-\[72px\]{min-width:72px}.min-w-\[170px\]{min-width:170px}.min-w-\[200px\]{min-width:200px}.min-w-full{min-width:100%}.shrink-0{flex-shrink:0}.border-collapse{border-collapse:collapse}.-translate-y-1\/2{--tw-translate-y: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y)}.rotate-180{rotate:180deg}.animate-pulse{animation:var(--animate-pulse)}.animate-rise{animation:var(--animate-rise)}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.appearance-none{-webkit-appearance:none;-moz-appearance:none;appearance:none}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-baseline{align-items:baseline}.items-center{align-items:center}.items-end{align-items:flex-end}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.gap-0\.5{gap:calc(var(--spacing) * .5)}.gap-1{gap:calc(var(--spacing) * 1)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-2\.5{gap:calc(var(--spacing) * 2.5)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-5{gap:calc(var(--spacing) * 5)}.gap-6{gap:calc(var(--spacing) * 6)}.gap-x-4{column-gap:calc(var(--spacing) * 4)}.gap-y-1\.5{row-gap:calc(var(--spacing) * 1.5)}.self-end{align-self:flex-end}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-clip{overflow:clip}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-\[10px\]{border-radius:10px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-sm{border-radius:var(--radius-sm)}.border{border-style:var(--tw-border-style);border-width:1px}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.border-none{--tw-border-style:none;border-style:none}.border-\[rgba\(51\,51\,51\,0\.08\)\]{border-color:#33333314}.border-border{border-color:var(--color-border)}.border-edf-bleu-moyen{border-color:var(--color-edf-bleu-moyen)}.border-edf-gris-moyen{border-color:var(--color-edf-gris-moyen)}.border-transparent{border-color:#0000}.bg-\[rgba\(0\,26\,112\,0\.3\)\]{background-color:#001a704d}.bg-\[rgba\(16\,87\,200\,0\.06\)\]{background-color:#1057c80f}.bg-\[rgba\(48\,122\,16\,0\.04\)\]{background-color:#307a100a}.bg-\[rgba\(48\,122\,16\,0\.06\)\]{background-color:#307a100f}.bg-\[rgba\(48\,122\,16\,0\.08\)\]{background-color:#307a1014}.bg-\[rgba\(214\,67\,10\,0\.04\)\]{background-color:#d6430a0a}.bg-\[rgba\(214\,67\,10\,0\.06\)\]{background-color:#d6430a0f}.bg-\[rgba\(214\,67\,10\,0\.08\)\]{background-color:#d6430a14}.bg-\[rgba\(214\,67\,10\,0\.12\)\]{background-color:#d6430a1f}.bg-\[rgba\(255\,178\,16\,0\.1\)\]{background-color:#ffb2101a}.bg-\[rgba\(255\,178\,16\,0\.3\)\]{background-color:#ffb2104d}.bg-\[rgba\(255\,178\,16\,0\.6\)\]{background-color:#ffb21099}.bg-card{background-color:var(--color-card)}.bg-edf-blanc{background-color:var(--color-edf-blanc)}.bg-edf-bleu-moyen{background-color:var(--color-edf-bleu-moyen)}.bg-edf-gris-clair{background-color:var(--color-edf-gris-clair)}.bg-edf-orange-fonce{background-color:var(--color-edf-orange-fonce)}.bg-edf-orange-moyen{background-color:var(--color-edf-orange-moyen)}.bg-edf-vert-fonce{background-color:var(--color-edf-vert-fonce)}.bg-transparent{background-color:#0000}.bg-white{background-color:var(--color-white)}.bg-white\/60{background-color:#fff9}@supports (color:color-mix(in lab,red,red)){.bg-white\/60{background-color:color-mix(in oklab,var(--color-white) 60%,transparent)}}.p-0{padding:calc(var(--spacing) * 0)}.p-1{padding:calc(var(--spacing) * 1)}.p-2\.5{padding:calc(var(--spacing) * 2.5)}.p-4{padding:calc(var(--spacing) * 4)}.p-4\.5{padding:calc(var(--spacing) * 4.5)}.p-5{padding:calc(var(--spacing) * 5)}.p-\[16px_18px_18px\]{padding:16px 18px 18px}.\!px-2\.5{padding-inline:calc(var(--spacing) * 2.5)!important}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-3\.5{padding-inline:calc(var(--spacing) * 3.5)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-\[1px\]{padding-inline:1px}.px-\[10px\]{padding-inline:10px}.\!py-0{padding-block:calc(var(--spacing) * 0)!important}.\!py-1{padding-block:calc(var(--spacing) * 1)!important}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:calc(var(--spacing) * 1)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-2\.5{padding-block:calc(var(--spacing) * 2.5)}.py-4{padding-block:calc(var(--spacing) * 4)}.py-8{padding-block:calc(var(--spacing) * 8)}.py-\[7px\]{padding-block:7px}.pt-3{padding-top:calc(var(--spacing) * 3)}.pt-5{padding-top:calc(var(--spacing) * 5)}.pr-2{padding-right:calc(var(--spacing) * 2)}.pr-7{padding-right:calc(var(--spacing) * 7)}.pb-3{padding-bottom:calc(var(--spacing) * 3)}.pb-12{padding-bottom:calc(var(--spacing) * 12)}.pl-2\.5{padding-left:calc(var(--spacing) * 2.5)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.font-\[edf-2020-soft\]{font-family:edf-2020-soft}.font-mono{font-family:var(--font-mono)}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[11px\]{font-size:11px}.text-\[12\.5px\]{font-size:12.5px}.text-\[13px\]{font-size:13px}.leading-\[1\.6\]{--tw-leading:1.6;line-height:1.6}.leading-\[1\.45\]{--tw-leading:1.45;line-height:1.45}.leading-none{--tw-leading:1;line-height:1}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-light{--tw-font-weight:var(--font-weight-light);font-weight:var(--font-weight-light)}.font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.text-ellipsis{text-overflow:ellipsis}.whitespace-nowrap{white-space:nowrap}.whitespace-pre{white-space:pre}.whitespace-pre-wrap{white-space:pre-wrap}.text-edf-bleu-clair{color:var(--color-edf-bleu-clair)}.text-edf-bleu-fonce{color:var(--color-edf-bleu-fonce)}.text-edf-bleu-moyen{color:var(--color-edf-bleu-moyen)}.text-edf-gris-moyen{color:var(--color-edf-gris-moyen)}.text-edf-noir{color:var(--color-edf-noir)}.text-edf-orange-fonce{color:var(--color-edf-orange-fonce)}.text-edf-vert-fonce{color:var(--color-edf-vert-fonce)}.text-ink{color:var(--color-ink)}.text-muted{color:var(--color-muted)}.text-red-600{color:var(--color-red-600)}.text-white{color:var(--color-white)}.italic{font-style:italic}.opacity-40{opacity:.4}.opacity-50{opacity:.5}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.blur{--tw-blur:blur(8px);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.backdrop-blur-sm{--tw-backdrop-blur:blur(var(--blur-sm));-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.transition-\[background\]{transition-property:background;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-100{--tw-duration:.1s;transition-duration:.1s}.duration-150{--tw-duration:.15s;transition-duration:.15s}.duration-\[120ms\]{--tw-duration:.12s;transition-duration:.12s}.ease-in-out{--tw-ease:var(--ease-in-out);transition-timing-function:var(--ease-in-out)}.select-all{-webkit-user-select:all;user-select:all}.select-none{-webkit-user-select:none;user-select:none}@media(hover:hover){.hover\:border-border:hover{border-color:var(--color-border)}.hover\:border-edf-bleu-clair:hover{border-color:var(--color-edf-bleu-clair)}.hover\:border-edf-gris-moyen:hover{border-color:var(--color-edf-gris-moyen)}.hover\:bg-\[rgb\(12\,72\,170\)\]:hover{background-color:#0c48aa}.hover\:bg-\[rgb\(38\,98\,12\)\]:hover{background-color:#26620c}.hover\:bg-\[rgb\(180\,56\,8\)\]:hover{background-color:#b43808}.hover\:bg-\[rgb\(230\,118\,20\)\]:hover{background-color:#e67614}.hover\:bg-edf-gris-clair:hover{background-color:var(--color-edf-gris-clair)}.hover\:text-muted:hover{color:var(--color-muted)}.hover\:underline:hover{text-decoration-line:underline}.hover\:decoration-dotted:hover{text-decoration-style:dotted}.hover\:underline-offset-2:hover{text-underline-offset:2px}}.focus\:border-edf-bleu-moyen:focus{border-color:var(--color-edf-bleu-moyen)}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:opacity-40:disabled{opacity:.4}@media not all and (min-width:64rem){.max-lg\:order-3{order:3}.max-lg\:h-auto{height:auto}.max-lg\:w-full{width:100%}.max-lg\:flex-wrap{flex-wrap:wrap}.max-lg\:gap-2{gap:calc(var(--spacing) * 2)}.max-lg\:gap-3{gap:calc(var(--spacing) * 3)}}}@font-face{font-family:edf-2020;src:url(./EDF2020W01-Regular.DEtAzL8F.woff2)format("woff2");font-weight:400;font-style:normal;font-display:swap}@font-face{font-family:edf-2020;src:url(./EDF2020W01-Bold.Bub472Sg.woff2)format("woff2");font-weight:700;font-style:normal;font-display:swap}@font-face{font-family:edf-2020;src:url(./EDF2020W01-Light.D7COPh2m.woff2)format("woff2");font-weight:300;font-style:normal;font-display:swap}@font-face{font-family:edf-2020;src:url(./EDF2020W01-Italic.CtMn0wF8.woff2)format("woff2");font-weight:400;font-style:italic;font-display:swap}@font-face{font-family:edf-2020-soft;src:url(./EDF2020Soft-BoldItalic.y4KHcb-c.woff2)format("woff2");font-weight:700;font-style:italic;font-display:swap}@font-face{font-family:edf-2020-soft;src:url(./EDF2020Soft-Italic.CTdZcEjD.woff2)format("woff2");font-weight:400;font-style:italic;font-display:swap}@font-face{font-family:edf-2020-soft;src:url(./EDF2020Soft-LightItalic.DlUXaATs.woff2)format("woff2");font-weight:300;font-style:italic;font-display:swap}html{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}body{color:var(--color-ink);background:var(--color-bg);min-height:100vh;margin:0}input,select,textarea{border:1px solid var(--color-border);height:30px;color:var(--color-ink);background:#fff;border-radius:6px;padding:5px 10px;font-family:inherit;font-size:13px;transition:border-color .15s}textarea,select[multiple]{height:auto}input[type=number]::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}input[type=number]::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}input[type=number]{-moz-appearance:textfield}input:focus,select:focus,textarea:focus{border-color:var(--color-edf-bleu-moyen);outline:none}select{min-width:160px}select[multiple]{min-width:180px}textarea{width:100%;min-height:160px;font-family:var(--font-mono);font-size:12px}[data-icon]:before{content:attr(data-icon);opacity:.8;justify-content:center;align-items:center;font-size:12px;display:inline-flex}.table-wrap{border:1px solid var(--color-border);background:var(--color-table-row);border-radius:8px;overflow-x:auto}#status-table{border-collapse:separate;border-spacing:0;width:max-content;min-width:100%}table{border-collapse:collapse;width:100%;min-width:760px}th,td{text-align:left;border-bottom:1px solid var(--color-edf-gris-clair);padding:8px 10px;font-size:13px}th{text-transform:uppercase;letter-spacing:.12em;color:var(--color-muted);background:var(--color-table-head);z-index:1;font-size:11px;font-weight:700;position:sticky;top:0}th.status-col-doe,th.status-col-calc{white-space:nowrap}td.status-col-doe{font-family:var(--font-mono);font-size:12px}td.case-id{font-weight:700}tbody tr{background:var(--color-table-row)}tbody tr:hover{background:var(--color-table-hover)}tbody tr.row-selected{background:var(--color-table-selected)}tbody tr.row-selected:hover{background:var(--color-table-selected-hover)}#status-body tr,#status-body td{-webkit-user-select:none;user-select:none}th.status-sortable{cursor:pointer;-webkit-user-select:none;user-select:none}th.status-sortable:hover{color:var(--color-edf-bleu-moyen)}#status-doe-select{min-width:220px;max-width:360px}#status-table thead tr,#status-table tbody tr{height:34px}#status-table-wrap{max-height:374px;overflow-y:auto}#status-table-wrap.sticky-enabled th.sticky-left,#status-table-wrap.sticky-enabled th.sticky-right{background:var(--color-table-head);z-index:4;position:sticky}#status-table-wrap.sticky-enabled td.sticky-left,#status-table-wrap.sticky-enabled td.sticky-right{background:var(--color-table-row);z-index:3;position:sticky}#status-table-wrap.sticky-enabled .sticky-right{right:0}#status-table-wrap.sticky-enabled .sticky-divider{border-right:1px solid var(--color-border)}#status-table-wrap.sticky-enabled .sticky-right.sticky-divider{border-left:1px solid var(--color-border);border-right:none}#status-table-wrap.sticky-enabled tbody tr:hover td.sticky-left,#status-table-wrap.sticky-enabled tbody tr:hover td.sticky-right{background:var(--color-table-hover)}#status-table-wrap.sticky-enabled tbody tr.row-selected td.sticky-left,#status-table-wrap.sticky-enabled tbody tr.row-selected td.sticky-right{background:var(--color-table-selected)}#status-table-wrap.sticky-enabled tbody tr.row-selected:hover td.sticky-left,#status-table-wrap.sticky-enabled tbody tr.row-selected:hover td.sticky-right{background:var(--color-table-selected-hover)}.status-pill{letter-spacing:.1em;text-transform:uppercase;border:1px solid #0000;border-radius:4px;align-items:center;padding:3px 8px;font-size:10px;font-weight:700;display:inline-flex}.status-running{color:var(--color-edf-bleu-fonce);background:#1089ff1a;border-color:#1089ff40}.status-done{color:var(--color-edf-vert-fonce);background:#307a1014;border-color:#307a1033}.status-failed{color:var(--color-edf-orange-fonce);background:#d6430a14;border-color:#d6430a40}.status-converged{color:var(--color-edf-vert-fonce);background:#307a101f;border-color:#307a104d}.status-not-converged{color:var(--color-edf-orange-fonce);background:#d6430a1a;border-color:#d6430a40}.status-prepared,.status-unknown{background:var(--color-edf-gris-clair);color:var(--color-muted);border-color:var(--color-border)}.is-active{color:var(--color-edf-bleu-fonce);background:#1057c814;border-color:#1057c833;font-weight:700}#status-card:focus{outline:none}.link-btn{color:var(--color-edf-bleu-moyen);cursor:pointer;background:0 0;border:none;font-size:12px}.link-btn:hover{text-decoration:underline}#perf-table{min-width:920px}#perf-table tbody tr:hover{background:inherit}pre,.code-box{color:var(--color-edf-gris-clair);max-height:320px;font-size:12px;font-family:var(--font-mono);background:#1e1e2d;border-radius:8px;padding:10px 12px;overflow:auto}.code-box{white-space:pre}.tail-pane{white-space:normal;max-height:320px;padding:8px 10px;overflow:auto}.tail-meta{margin:2px 0 8px}.tail-line{white-space:pre;border-radius:3px;margin:0 -4px;padding:0 4px;line-height:1.45}.tail-sev-error{color:var(--color-edf-orange-clair);background:#d6430a33}.tail-sev-warn{color:var(--color-edf-orange-clair);background:#ffb21026}.tail-sev-info{color:var(--color-edf-gris-moyen)}.tail-query-hit{color:var(--color-edf-noir);background:#ffb21080;border-radius:2px;padding:0 2px}.tail-filter-error{color:var(--color-edf-orange-clair);margin-bottom:6px;font-weight:600}.tail-new{animation:2.6s ease-out tailFlash}@keyframes tailFlash{0%{background-color:#1089ff33}to{background-color:#0000}}code{background:#ff861d14;border-radius:4px;padding:2px 6px;font-size:12px}.error-list{border-radius:8px;flex-direction:column;gap:8px;max-height:320px;display:flex;overflow:auto}.error-item{background:#d6430a0a;border:1px solid #d6430a33;border-radius:8px;padding:10px 12px}.error-meta{color:var(--color-edf-orange-fonce);margin-bottom:0;font-size:11px;font-weight:700}.error-meta-row{justify-content:space-between;align-items:center;gap:10px;margin-bottom:0;display:flex}.error-meta-row+.error-line{margin-top:6px}.error-meta-row .error-meta{text-align:left;flex:1;margin:0}.error-badges{flex-wrap:wrap;align-items:center;gap:6px;display:inline-flex}.error-badge{color:var(--color-edf-orange-fonce);background:#d6430a14;border:1px solid #0000;border-radius:4px;align-items:center;padding:2px 7px;font-size:10px;font-weight:700;display:inline-flex}.error-badge-new{color:var(--color-edf-bleu-fonce);background:#1057c814;border-color:#1057c833}.error-line{font-family:var(--font-mono);white-space:pre-wrap;color:var(--color-edf-noir);font-size:12px}.error-empty{color:var(--color-muted);padding:6px 0;font-size:12px}.error-sev-warn{background:#ffb2100a;border-color:#ffb2104d}.error-sev-warn .error-meta,.error-sev-warn .error-line{color:var(--color-edf-orange-fonce)}.error-sev-info{background:#1089ff08;border-color:#1089ff33}.error-sev-info .error-meta,.error-sev-info .error-line{color:var(--color-edf-bleu-fonce)}.err-hit{background:#d6430a40;border-radius:2px;padding:0 2px}.error-sev-warn .err-hit{background:#ffb21059}.error-sev-info .err-hit{background:#1089ff33}.error-item-toggle{cursor:pointer;-webkit-user-select:none;user-select:none;width:100%;font:inherit;color:inherit;text-align:left;background:0 0;border:none;padding:0}.error-expand-icon{color:var(--color-muted);align-items:center;margin-right:4px;display:inline-flex}@keyframes rise{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}@media(max-width:980px){main>section{grid-column:span 12!important}table{min-width:640px}}@media(prefers-reduced-motion:reduce){*{transition:none!important;animation:none!important}}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@keyframes pulse{50%{opacity:.5}}.icon{vertical-align:-2px;display:inline-block}div.svelte-1kfua4v svg{display:block;max-width:100%;height:auto} +/*! tailwindcss v4.2.2 | MIT License | https://tailwindcss.com */@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-ease:initial}}}@layer theme{:root,:host{--font-mono:"JetBrains Mono", "Fira Code", "Cascadia Code", "Courier New", monospace;--color-red-600:oklch(57.7% .245 27.325);--color-white:#fff;--spacing:.25rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height: 1.5 ;--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--font-weight-light:300;--font-weight-normal:400;--font-weight-semibold:600;--font-weight-bold:700;--tracking-tight:-.025em;--tracking-wide:.025em;--radius-sm:.25rem;--radius-md:.375rem;--radius-lg:.5rem;--ease-in-out:cubic-bezier(.4, 0, .2, 1);--animate-pulse:pulse 2s cubic-bezier(.4, 0, .6, 1) infinite;--blur-sm:8px;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:"edf-2020";--default-mono-font-family:var(--font-mono);--color-edf-orange-fonce:#d6430a;--color-edf-orange-moyen:#ff861d;--color-edf-orange-clair:#ffb210;--color-edf-vert-fonce:#307a10;--color-edf-bleu-fonce:#001a70;--color-edf-bleu-moyen:#1057c8;--color-edf-bleu-clair:#1089ff;--color-edf-noir:#333;--color-edf-slate:#f8f7f7;--color-edf-gris-moyen:#dedede;--color-edf-gris-clair:#f8f7f7;--color-edf-blanc:#fff;--color-bg:var(--color-edf-slate);--color-ink:var(--color-edf-noir);--color-muted:#787878;--color-card:var(--color-edf-blanc);--color-border:var(--color-edf-gris-moyen);--color-table-head:var(--color-edf-gris-clair);--color-table-row:var(--color-edf-blanc);--color-table-hover:#f5f5f4;--color-table-selected:#e8eff8;--color-table-selected-hover:#dce7f4;--animate-rise:rise .35s ease both}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;-moz-tab-size:4;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){-webkit-appearance:button;-moz-appearance:button;appearance:button}::file-selector-button{-webkit-appearance:button;-moz-appearance:button;appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.pointer-events-auto{pointer-events:auto}.pointer-events-none{pointer-events:none}.visible{visibility:visible}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.sticky\!{position:sticky!important}.inset-0{inset:calc(var(--spacing) * 0)}.start{inset-inline-start:var(--spacing)}.end{inset-inline-end:var(--spacing)}.end\!{inset-inline-end:var(--spacing)!important}.top-0{top:calc(var(--spacing) * 0)}.top-1\/2{top:50%}.right-0{right:calc(var(--spacing) * 0)}.right-2{right:calc(var(--spacing) * 2)}.right-4{right:calc(var(--spacing) * 4)}.bottom-4{bottom:calc(var(--spacing) * 4)}.left-0{left:calc(var(--spacing) * 0)}.z-10{z-index:10}.z-40{z-index:40}.z-50{z-index:50}.z-80{z-index:80}.z-\[1\]{z-index:1}.z-\[1000\]{z-index:1000}.col-span-6{grid-column:span 6/span 6}.col-span-12{grid-column:span 12/span 12}.container{width:100%}@media(min-width:40rem){.container{max-width:40rem}}@media(min-width:48rem){.container{max-width:48rem}}@media(min-width:64rem){.container{max-width:64rem}}@media(min-width:80rem){.container{max-width:80rem}}@media(min-width:96rem){.container{max-width:96rem}}.m-0{margin:calc(var(--spacing) * 0)}.mx-auto{margin-inline:auto}.mt-1{margin-top:calc(var(--spacing) * 1)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mr-2{margin-right:calc(var(--spacing) * 2)}.mr-auto{margin-right:auto}.mb-0{margin-bottom:calc(var(--spacing) * 0)}.mb-1{margin-bottom:calc(var(--spacing) * 1)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-2\.5{margin-bottom:calc(var(--spacing) * 2.5)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-3\.5{margin-bottom:calc(var(--spacing) * 3.5)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.mb-4\.5{margin-bottom:calc(var(--spacing) * 4.5)}.mb-5{margin-bottom:calc(var(--spacing) * 5)}.ml-1{margin-left:calc(var(--spacing) * 1)}.ml-auto{margin-left:auto}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.table{display:table}.aspect-\[900\/500\]{aspect-ratio:900/500}.h-7{height:calc(var(--spacing) * 7)}.h-9{height:calc(var(--spacing) * 9)}.h-10{height:calc(var(--spacing) * 10)}.h-14{height:calc(var(--spacing) * 14)}.h-\[3px\]{height:3px}.h-\[10px\]{height:10px}.h-\[14px\]{height:14px}.h-\[30px\]{height:30px}.h-\[34px\]{height:34px}.h-full{height:100%}.max-h-\[240px\]{max-height:240px}.max-h-\[260px\]{max-height:260px}.max-h-\[500px\]{max-height:500px}.\!min-h-\[80px\]{min-height:80px!important}.w-9{width:calc(var(--spacing) * 9)}.w-32\.5{width:calc(var(--spacing) * 32.5)}.w-37\.5{width:calc(var(--spacing) * 37.5)}.w-\[10px\]{width:10px}.w-\[14px\]{width:14px}.w-\[30px\]{width:30px}.w-\[40px\]{width:40px}.w-\[70px\]{width:70px}.w-\[72px\]{width:72px}.w-\[80px\]{width:80px}.w-\[90px\]{width:90px}.w-\[110px\]{width:110px}.w-\[130px\]{width:130px}.w-\[140px\]{width:140px}.w-\[150px\]{width:150px}.w-\[160px\]{width:160px}.w-\[180px\]{width:180px}.w-\[200px\]{width:200px}.w-\[min\(420px\,96vw\)\]{width:min(420px,96vw)}.w-\[min\(1200px\,94vw\)\]{width:min(1200px,94vw)}.w-\[min\(\{maxWidth\}\,96vw\)\]{width:min({maxWidth},96vw)}.w-auto{width:auto}.w-full{width:100%}.w-max{width:max-content}.max-w-\[140px\]{max-width:140px}.max-w-\[320px\]{max-width:320px}.max-w-\[920px\]{max-width:920px}.\!min-w-0{min-width:calc(var(--spacing) * 0)!important}.min-w-\[36px\]{min-width:36px}.min-w-\[40px\]{min-width:40px}.min-w-\[72px\]{min-width:72px}.min-w-\[170px\]{min-width:170px}.min-w-\[200px\]{min-width:200px}.min-w-full{min-width:100%}.shrink-0{flex-shrink:0}.border-collapse{border-collapse:collapse}.-translate-y-1\/2{--tw-translate-y: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y)}.rotate-180{rotate:180deg}.animate-pulse{animation:var(--animate-pulse)}.animate-rise{animation:var(--animate-rise)}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.appearance-none{-webkit-appearance:none;-moz-appearance:none;appearance:none}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-baseline{align-items:baseline}.items-center{align-items:center}.items-end{align-items:flex-end}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.gap-0\.5{gap:calc(var(--spacing) * .5)}.gap-1{gap:calc(var(--spacing) * 1)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-2\.5{gap:calc(var(--spacing) * 2.5)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-5{gap:calc(var(--spacing) * 5)}.gap-6{gap:calc(var(--spacing) * 6)}.gap-x-4{column-gap:calc(var(--spacing) * 4)}.gap-y-1\.5{row-gap:calc(var(--spacing) * 1.5)}.self-end{align-self:flex-end}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-clip{overflow:clip}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-\[10px\]{border-radius:10px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-sm{border-radius:var(--radius-sm)}.border{border-style:var(--tw-border-style);border-width:1px}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.border-none{--tw-border-style:none;border-style:none}.border-\[rgba\(51\,51\,51\,0\.08\)\]{border-color:#33333314}.border-border{border-color:var(--color-border)}.border-edf-bleu-moyen{border-color:var(--color-edf-bleu-moyen)}.border-edf-gris-moyen{border-color:var(--color-edf-gris-moyen)}.border-transparent{border-color:#0000}.bg-\[rgba\(0\,26\,112\,0\.3\)\]{background-color:#001a704d}.bg-\[rgba\(16\,87\,200\,0\.06\)\]{background-color:#1057c80f}.bg-\[rgba\(48\,122\,16\,0\.04\)\]{background-color:#307a100a}.bg-\[rgba\(48\,122\,16\,0\.06\)\]{background-color:#307a100f}.bg-\[rgba\(48\,122\,16\,0\.08\)\]{background-color:#307a1014}.bg-\[rgba\(214\,67\,10\,0\.04\)\]{background-color:#d6430a0a}.bg-\[rgba\(214\,67\,10\,0\.06\)\]{background-color:#d6430a0f}.bg-\[rgba\(214\,67\,10\,0\.08\)\]{background-color:#d6430a14}.bg-\[rgba\(214\,67\,10\,0\.12\)\]{background-color:#d6430a1f}.bg-\[rgba\(255\,178\,16\,0\.1\)\]{background-color:#ffb2101a}.bg-\[rgba\(255\,178\,16\,0\.3\)\]{background-color:#ffb2104d}.bg-\[rgba\(255\,178\,16\,0\.6\)\]{background-color:#ffb21099}.bg-card{background-color:var(--color-card)}.bg-edf-blanc{background-color:var(--color-edf-blanc)}.bg-edf-bleu-moyen{background-color:var(--color-edf-bleu-moyen)}.bg-edf-gris-clair{background-color:var(--color-edf-gris-clair)}.bg-edf-orange-fonce{background-color:var(--color-edf-orange-fonce)}.bg-edf-orange-moyen{background-color:var(--color-edf-orange-moyen)}.bg-edf-vert-fonce{background-color:var(--color-edf-vert-fonce)}.bg-transparent{background-color:#0000}.bg-white{background-color:var(--color-white)}.bg-white\/60{background-color:#fff9}@supports (color:color-mix(in lab,red,red)){.bg-white\/60{background-color:color-mix(in oklab,var(--color-white) 60%,transparent)}}.p-0{padding:calc(var(--spacing) * 0)}.p-1{padding:calc(var(--spacing) * 1)}.p-2\.5{padding:calc(var(--spacing) * 2.5)}.p-4{padding:calc(var(--spacing) * 4)}.p-4\.5{padding:calc(var(--spacing) * 4.5)}.p-5{padding:calc(var(--spacing) * 5)}.p-\[16px_18px_18px\]{padding:16px 18px 18px}.\!px-2\.5{padding-inline:calc(var(--spacing) * 2.5)!important}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-3\.5{padding-inline:calc(var(--spacing) * 3.5)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-\[1px\]{padding-inline:1px}.px-\[10px\]{padding-inline:10px}.\!py-0{padding-block:calc(var(--spacing) * 0)!important}.\!py-1{padding-block:calc(var(--spacing) * 1)!important}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:calc(var(--spacing) * 1)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-2\.5{padding-block:calc(var(--spacing) * 2.5)}.py-4{padding-block:calc(var(--spacing) * 4)}.py-8{padding-block:calc(var(--spacing) * 8)}.py-\[7px\]{padding-block:7px}.pt-3{padding-top:calc(var(--spacing) * 3)}.pt-5{padding-top:calc(var(--spacing) * 5)}.pr-2{padding-right:calc(var(--spacing) * 2)}.pr-7{padding-right:calc(var(--spacing) * 7)}.pb-3{padding-bottom:calc(var(--spacing) * 3)}.pb-12{padding-bottom:calc(var(--spacing) * 12)}.pl-2\.5{padding-left:calc(var(--spacing) * 2.5)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.font-\[edf-2020-soft\]{font-family:edf-2020-soft}.font-mono{font-family:var(--font-mono)}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[11px\]{font-size:11px}.text-\[12\.5px\]{font-size:12.5px}.text-\[13px\]{font-size:13px}.leading-\[1\.6\]{--tw-leading:1.6;line-height:1.6}.leading-\[1\.45\]{--tw-leading:1.45;line-height:1.45}.leading-none{--tw-leading:1;line-height:1}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-light{--tw-font-weight:var(--font-weight-light);font-weight:var(--font-weight-light)}.font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.text-ellipsis{text-overflow:ellipsis}.whitespace-nowrap{white-space:nowrap}.whitespace-pre{white-space:pre}.whitespace-pre-wrap{white-space:pre-wrap}.text-edf-bleu-clair{color:var(--color-edf-bleu-clair)}.text-edf-bleu-fonce{color:var(--color-edf-bleu-fonce)}.text-edf-bleu-moyen{color:var(--color-edf-bleu-moyen)}.text-edf-gris-moyen{color:var(--color-edf-gris-moyen)}.text-edf-noir{color:var(--color-edf-noir)}.text-edf-orange-fonce{color:var(--color-edf-orange-fonce)}.text-edf-vert-fonce{color:var(--color-edf-vert-fonce)}.text-ink{color:var(--color-ink)}.text-muted{color:var(--color-muted)}.text-red-600{color:var(--color-red-600)}.text-white{color:var(--color-white)}.italic{font-style:italic}.opacity-40{opacity:.4}.opacity-50{opacity:.5}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.blur{--tw-blur:blur(8px);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.backdrop-blur-sm{--tw-backdrop-blur:blur(var(--blur-sm));-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.transition-\[background\]{transition-property:background;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-100{--tw-duration:.1s;transition-duration:.1s}.duration-150{--tw-duration:.15s;transition-duration:.15s}.duration-\[120ms\]{--tw-duration:.12s;transition-duration:.12s}.ease-in-out{--tw-ease:var(--ease-in-out);transition-timing-function:var(--ease-in-out)}.select-all{-webkit-user-select:all;user-select:all}.select-none{-webkit-user-select:none;user-select:none}@media(hover:hover){.hover\:border-border:hover{border-color:var(--color-border)}.hover\:border-edf-bleu-clair:hover{border-color:var(--color-edf-bleu-clair)}.hover\:border-edf-gris-moyen:hover{border-color:var(--color-edf-gris-moyen)}.hover\:bg-\[rgb\(12\,72\,170\)\]:hover{background-color:#0c48aa}.hover\:bg-\[rgb\(38\,98\,12\)\]:hover{background-color:#26620c}.hover\:bg-\[rgb\(180\,56\,8\)\]:hover{background-color:#b43808}.hover\:bg-\[rgb\(230\,118\,20\)\]:hover{background-color:#e67614}.hover\:bg-edf-gris-clair:hover{background-color:var(--color-edf-gris-clair)}.hover\:text-muted:hover{color:var(--color-muted)}.hover\:underline:hover{text-decoration-line:underline}.hover\:decoration-dotted:hover{text-decoration-style:dotted}.hover\:underline-offset-2:hover{text-underline-offset:2px}}.focus\:border-edf-bleu-moyen:focus{border-color:var(--color-edf-bleu-moyen)}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:opacity-40:disabled{opacity:.4}@media not all and (min-width:64rem){.max-lg\:order-3{order:3}.max-lg\:h-auto{height:auto}.max-lg\:w-full{width:100%}.max-lg\:flex-wrap{flex-wrap:wrap}.max-lg\:gap-2{gap:calc(var(--spacing) * 2)}.max-lg\:gap-3{gap:calc(var(--spacing) * 3)}}}@font-face{font-family:edf-2020;src:url(./EDF2020W01-Regular.DEtAzL8F.woff2)format("woff2");font-weight:400;font-style:normal;font-display:swap}@font-face{font-family:edf-2020;src:url(./EDF2020W01-Bold.Bub472Sg.woff2)format("woff2");font-weight:700;font-style:normal;font-display:swap}@font-face{font-family:edf-2020;src:url(./EDF2020W01-Light.D7COPh2m.woff2)format("woff2");font-weight:300;font-style:normal;font-display:swap}@font-face{font-family:edf-2020;src:url(./EDF2020W01-Italic.CtMn0wF8.woff2)format("woff2");font-weight:400;font-style:italic;font-display:swap}@font-face{font-family:edf-2020-soft;src:url(./EDF2020Soft-BoldItalic.y4KHcb-c.woff2)format("woff2");font-weight:700;font-style:italic;font-display:swap}@font-face{font-family:edf-2020-soft;src:url(./EDF2020Soft-Italic.CTdZcEjD.woff2)format("woff2");font-weight:400;font-style:italic;font-display:swap}@font-face{font-family:edf-2020-soft;src:url(./EDF2020Soft-LightItalic.DlUXaATs.woff2)format("woff2");font-weight:300;font-style:italic;font-display:swap}html{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}body{color:var(--color-ink);background:var(--color-bg);min-height:100vh;margin:0}input,select,textarea{border:1px solid var(--color-border);height:30px;color:var(--color-ink);background:#fff;border-radius:6px;padding:5px 10px;font-family:inherit;font-size:13px;transition:border-color .15s}textarea,select[multiple]{height:auto}input[type=number]::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}input[type=number]::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}input[type=number]{-moz-appearance:textfield}input:focus,select:focus,textarea:focus{border-color:var(--color-edf-bleu-moyen);outline:none}select{min-width:160px}select[multiple]{min-width:180px}textarea{width:100%;min-height:160px;font-family:var(--font-mono);font-size:12px}[data-icon]:before{content:attr(data-icon);opacity:.8;justify-content:center;align-items:center;font-size:12px;display:inline-flex}.table-wrap{border:1px solid var(--color-border);background:var(--color-table-row);border-radius:8px;overflow-x:auto}#status-table{border-collapse:separate;border-spacing:0;width:max-content;min-width:100%}table{border-collapse:collapse;width:100%;min-width:760px}th,td{text-align:left;border-bottom:1px solid var(--color-edf-gris-clair);padding:8px 10px;font-size:13px}th{text-transform:uppercase;letter-spacing:.12em;color:var(--color-muted);background:var(--color-table-head);z-index:1;font-size:11px;font-weight:700;position:sticky;top:0}th.status-col-doe,th.status-col-calc{white-space:nowrap}td.status-col-doe{font-family:var(--font-mono);font-size:12px}td.case-id{font-weight:700}tbody tr{background:var(--color-table-row)}tbody tr:hover{background:var(--color-table-hover)}tbody tr.row-selected{background:var(--color-table-selected)}tbody tr.row-selected:hover{background:var(--color-table-selected-hover)}#status-body tr,#status-body td{-webkit-user-select:none;user-select:none}th.status-sortable{cursor:pointer;-webkit-user-select:none;user-select:none}th.status-sortable:hover{color:var(--color-edf-bleu-moyen)}#status-doe-select{min-width:220px;max-width:360px}#status-table thead tr,#status-table tbody tr{height:34px}#status-table-wrap{max-height:374px;overflow-y:auto}#status-table-wrap.sticky-enabled th.sticky-left,#status-table-wrap.sticky-enabled th.sticky-right{background:var(--color-table-head);z-index:4;position:sticky}#status-table-wrap.sticky-enabled td.sticky-left,#status-table-wrap.sticky-enabled td.sticky-right{background:var(--color-table-row);z-index:3;position:sticky}#status-table-wrap.sticky-enabled .sticky-right{right:0}#status-table-wrap.sticky-enabled .sticky-divider{border-right:1px solid var(--color-border)}#status-table-wrap.sticky-enabled .sticky-right.sticky-divider{border-left:1px solid var(--color-border);border-right:none}#status-table-wrap.sticky-enabled tbody tr:hover td.sticky-left,#status-table-wrap.sticky-enabled tbody tr:hover td.sticky-right{background:var(--color-table-hover)}#status-table-wrap.sticky-enabled tbody tr.row-selected td.sticky-left,#status-table-wrap.sticky-enabled tbody tr.row-selected td.sticky-right{background:var(--color-table-selected)}#status-table-wrap.sticky-enabled tbody tr.row-selected:hover td.sticky-left,#status-table-wrap.sticky-enabled tbody tr.row-selected:hover td.sticky-right{background:var(--color-table-selected-hover)}.status-pill{letter-spacing:.1em;text-transform:uppercase;border:1px solid #0000;border-radius:4px;align-items:center;padding:3px 8px;font-size:10px;font-weight:700;display:inline-flex}.status-running{color:var(--color-edf-bleu-fonce);background:#1089ff1a;border-color:#1089ff40}.status-done{color:var(--color-edf-vert-fonce);background:#307a1014;border-color:#307a1033}.status-failed{color:var(--color-edf-orange-fonce);background:#d6430a14;border-color:#d6430a40}.status-converged{color:var(--color-edf-vert-fonce);background:#307a101f;border-color:#307a104d}.status-not-converged{color:var(--color-edf-orange-fonce);background:#d6430a1a;border-color:#d6430a40}.status-prepared,.status-unknown{background:var(--color-edf-gris-clair);color:var(--color-muted);border-color:var(--color-border)}.is-active{color:var(--color-edf-bleu-fonce);background:#1057c814;border-color:#1057c833;font-weight:700}#status-card:focus{outline:none}.link-btn{color:var(--color-edf-bleu-moyen);cursor:pointer;background:0 0;border:none;font-size:12px}.link-btn:hover{text-decoration:underline}#perf-table{min-width:920px}#perf-table tbody tr:hover{background:inherit}pre,.code-box{color:var(--color-edf-gris-clair);max-height:320px;font-size:12px;font-family:var(--font-mono);background:#1e1e2d;border-radius:8px;padding:10px 12px;overflow:auto}.code-box{white-space:pre}.tail-pane{white-space:normal;max-height:320px;padding:8px 10px;overflow:auto}.tail-meta{margin:2px 0 8px}.tail-line{white-space:pre;border-radius:3px;margin:0 -4px;padding:0 4px;line-height:1.45}.tail-sev-error{color:var(--color-edf-orange-clair);background:#d6430a33}.tail-sev-warn{color:var(--color-edf-orange-clair);background:#ffb21026}.tail-query-hit{color:var(--color-edf-noir);background:#ffb21080;border-radius:2px;padding:0 2px}.tail-filter-error{color:var(--color-edf-orange-clair);margin-bottom:6px;font-weight:600}.tail-new{animation:2.6s ease-out tailFlash}@keyframes tailFlash{0%{background-color:#1089ff33}to{background-color:#0000}}code{background:#ff861d14;border-radius:4px;padding:2px 6px;font-size:12px}.error-list{border-radius:8px;flex-direction:column;gap:8px;max-height:320px;display:flex;overflow:auto}.error-item{background:#d6430a0a;border:1px solid #d6430a33;border-radius:8px;padding:10px 12px}.error-meta{color:var(--color-edf-orange-fonce);margin-bottom:0;font-size:11px;font-weight:700}.error-meta-row{justify-content:space-between;align-items:center;gap:10px;margin-bottom:0;display:flex}.error-meta-row+.error-line{margin-top:6px}.error-meta-row .error-meta{text-align:left;flex:1;margin:0}.error-badges{flex-wrap:wrap;align-items:center;gap:6px;display:inline-flex}.error-badge{color:var(--color-edf-orange-fonce);background:#d6430a14;border:1px solid #0000;border-radius:4px;align-items:center;padding:2px 7px;font-size:10px;font-weight:700;display:inline-flex}.error-badge-new{color:var(--color-edf-bleu-fonce);background:#1057c814;border-color:#1057c833}.error-line{font-family:var(--font-mono);white-space:pre-wrap;color:var(--color-edf-noir);font-size:12px}.error-empty{color:var(--color-muted);padding:6px 0;font-size:12px}.error-sev-warn{background:#ffb2100a;border-color:#ffb2104d}.error-sev-warn .error-meta,.error-sev-warn .error-line{color:var(--color-edf-orange-fonce)}.error-sev-info{background:#1089ff08;border-color:#1089ff33}.error-sev-info .error-meta,.error-sev-info .error-line{color:var(--color-edf-bleu-fonce)}.err-hit{background:#d6430a40;border-radius:2px;padding:0 2px}.error-sev-warn .err-hit{background:#ffb21059}.error-sev-info .err-hit{background:#1089ff33}.error-item-toggle{cursor:pointer;-webkit-user-select:none;user-select:none;width:100%;font:inherit;color:inherit;text-align:left;background:0 0;border:none;padding:0}.error-expand-icon{color:var(--color-muted);align-items:center;margin-right:4px;display:inline-flex}@keyframes rise{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}@media(max-width:980px){main>section{grid-column:span 12!important}table{min-width:640px}}@media(prefers-reduced-motion:reduce){*{transition:none!important;animation:none!important}}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@keyframes pulse{50%{opacity:.5}}.icon{vertical-align:-2px;display:inline-block}div.svelte-1kfua4v svg{display:block;max-width:100%;height:auto} diff --git a/frontend/dist/_app/immutable/chunks/BpkEXo81.js b/frontend/dist/_app/immutable/chunks/BpkEXo81.js deleted file mode 100644 index 84b1e4e..0000000 --- a/frontend/dist/_app/immutable/chunks/BpkEXo81.js +++ /dev/null @@ -1 +0,0 @@ -var te=t=>{throw TypeError(t)};var je=(t,e,n)=>e.has(t)||te("Cannot "+n);var v=(t,e,n)=>(je(t,e,"read from private field"),n?n.call(t):e.get(t)),U=(t,e,n)=>e.has(t)?te("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(t):e.set(t,n);import{bf as Ut,bg as Ne,aK as T,o as I,$ as O,aJ as mt,bh as qe}from"./VJhVTb1A.js";import{o as ee}from"./Cz6m6K8p.js";const K=[];function Dt(t,e=Ut){let n=null;const a=new Set;function r(o){if(Ne(t,o)&&(t=o,n)){const l=!K.length;for(const c of a)c[1](),K.push(c,t);if(l){for(let c=0;c{a.delete(c),a.size===0&&n&&(n(),n=null)}}return{set:r,update:i,subscribe:s}}class Vt{constructor(e,n){this.status=e,typeof n=="string"?this.body={message:n}:n?this.body=n:this.body={message:`Error: ${e}`}}toString(){return JSON.stringify(this.body)}}class zt{constructor(e,n){this.status=e,this.location=n}}class Kt extends Error{constructor(e,n,a){super(a),this.status=e,this.text=n}}new URL("sveltekit-internal://");function De(t,e){return t==="/"||e==="ignore"?t:e==="never"?t.endsWith("/")?t.slice(0,-1):t:e==="always"&&!t.endsWith("/")?t+"/":t}function Ve(t){return t.split("%25").map(decodeURI).join("%25")}function ze(t){for(const e in t)t[e]=decodeURIComponent(t[e]);return t}function Tt({href:t}){return t.split("#")[0]}function Ke(...t){let e=5381;for(const n of t)if(typeof n=="string"){let a=n.length;for(;a;)e=e*33^n.charCodeAt(--a)}else if(ArrayBuffer.isView(n)){const a=new Uint8Array(n.buffer,n.byteOffset,n.byteLength);let r=a.length;for(;r;)e=e*33^a[--r]}else throw new TypeError("value must be a string or TypedArray");return(e>>>0).toString(36)}new TextEncoder;new TextDecoder;function Be(t){const e=atob(t),n=new Uint8Array(e.length);for(let a=0;a((t instanceof Request?t.method:(e==null?void 0:e.method)||"GET")!=="GET"&&H.delete(Bt(t)),Me(t,e));const H=new Map;function Fe(t,e){const n=Bt(t,e),a=document.querySelector(n);if(a!=null&&a.textContent){a.remove();let{body:r,...i}=JSON.parse(a.textContent);const s=a.getAttribute("data-ttl");return s&&H.set(n,{body:r,init:i,ttl:1e3*Number(s)}),a.getAttribute("data-b64")!==null&&(r=Be(r)),Promise.resolve(new Response(r,i))}return window.fetch(t,e)}function Ge(t,e,n){if(H.size>0){const a=Bt(t,n),r=H.get(a);if(r){if(performance.now(){const r=/^\[\.\.\.(\w+)(?:=(\w+))?\]$/.exec(a);if(r)return e.push({name:r[1],matcher:r[2],optional:!1,rest:!0,chained:!0}),"(?:/([^]*))?";const i=/^\[\[(\w+)(?:=(\w+))?\]\]$/.exec(a);if(i)return e.push({name:i[1],matcher:i[2],optional:!0,rest:!1,chained:!0}),"(?:/([^/]+))?";if(!a)return;const s=a.split(/\[(.+?)\](?!\])/);return"/"+s.map((l,c)=>{if(c%2){if(l.startsWith("x+"))return It(String.fromCharCode(parseInt(l.slice(2),16)));if(l.startsWith("u+"))return It(String.fromCharCode(...l.slice(2).split("-").map(m=>parseInt(m,16))));const d=We.exec(l),[,u,w,p,f]=d;return e.push({name:p,matcher:f,optional:!!u,rest:!!w,chained:w?c===1&&s[0]==="":!1}),w?"([^]*?)":u?"([^/]*)?":"([^/]+?)"}return It(l)}).join("")}).join("")}/?$`),params:e}}function Ye(t){return t!==""&&!/^\([^)]+\)$/.test(t)}function He(t){return t.slice(1).split("/").filter(Ye)}function Xe(t,e,n){const a={},r=t.slice(1),i=r.filter(o=>o!==void 0);let s=0;for(let o=0;od).join("/"),s=0),c===void 0)if(l.rest)c="";else continue;if(!l.matcher||n[l.matcher](c)){a[l.name]=c;const d=e[o+1],u=r[o+1];d&&!d.rest&&d.optional&&u&&l.chained&&(s=0),!d&&!u&&Object.keys(a).length===i.length&&(s=0);continue}if(l.optional&&l.chained){s++;continue}return}if(!s)return a}function It(t){return t.normalize().replace(/[[\]]/g,"\\$&").replace(/%/g,"%25").replace(/\//g,"%2[Ff]").replace(/\?/g,"%3[Ff]").replace(/#/g,"%23").replace(/[.*+?^${}()|\\]/g,"\\$&")}function Qe({nodes:t,server_loads:e,dictionary:n,matchers:a}){const r=new Set(e);return Object.entries(n).map(([o,[l,c,d]])=>{const{pattern:u,params:w}=Je(o),p={id:o,exec:f=>{const m=u.exec(f);if(m)return Xe(m,w,a)},errors:[1,...d||[]].map(f=>t[f]),layouts:[0,...c||[]].map(s),leaf:i(l)};return p.errors.length=p.layouts.length=Math.max(p.errors.length,p.layouts.length),p});function i(o){const l=o<0;return l&&(o=~o),[l,t[o]]}function s(o){return o===void 0?o:[r.has(o),t[o]]}}function ge(t,e=JSON.parse){try{return e(sessionStorage[t])}catch{}}function ne(t,e,n=JSON.stringify){const a=n(e);try{sessionStorage[t]=a}catch{}}var fe;const A=((fe=globalThis.__sveltekit_1p1gamz)==null?void 0:fe.base)??"";var ue;const Ze=((ue=globalThis.__sveltekit_1p1gamz)==null?void 0:ue.assets)??A??"",tn="1791385109868",me="sveltekit:snapshot",_e="sveltekit:scroll",we="sveltekit:states",en="sveltekit:pageurl",M="sveltekit:history",Q="sveltekit:navigation",q={tap:1,hover:2,viewport:3,eager:4,off:-1,false:-1},Mt=location.origin;function ve(t){if(t instanceof URL)return t;let e=document.baseURI;if(!e){const n=document.getElementsByTagName("base");e=n.length?n[0].href:document.URL}return new URL(t,e)}function V(){return{x:pageXOffset,y:pageYOffset}}function B(t,e){return t.getAttribute(`data-sveltekit-${e}`)}const re={...q,"":q.hover};function ye(t){let e=t.assignedSlot??t.parentNode;return(e==null?void 0:e.nodeType)===11&&(e=e.host),e}function be(t,e){for(;t&&t!==e;){if(t.nodeName.toUpperCase()==="A"&&t.hasAttribute("href"))return t;t=ye(t)}}function $t(t,e,n){let a;try{if(a=new URL(t instanceof SVGAElement?t.href.baseVal:t.href,document.baseURI),n&&a.hash.match(/^#[^/]/)){const o=location.hash.split("#")[1]||"/";a.hash=`#${o}${a.hash}`}}catch{}const r=t instanceof SVGAElement?t.target.baseVal:t.target,i=!a||!!r||Rt(a,e,n)||(t.getAttribute("rel")||"").split(/\s+/).includes("external"),s=(a==null?void 0:a.origin)===Mt&&t.hasAttribute("download");return{url:a,external:i,target:r,download:s}}function _t(t){let e=null,n=null,a=null,r=null,i=null,s=null,o=t;for(;o&&o!==document.documentElement;)a===null&&(a=B(o,"preload-code")),r===null&&(r=B(o,"preload-data")),e===null&&(e=B(o,"keepfocus")),n===null&&(n=B(o,"noscroll")),i===null&&(i=B(o,"reload")),s===null&&(s=B(o,"replacestate")),o=ye(o);function l(c){switch(c){case"":case"true":return!0;case"off":case"false":return!1;default:return}}return{preload_code:re[a??"off"],preload_data:re[r??"off"],keepfocus:l(e),noscroll:l(n),reload:l(i),replace_state:l(s)}}function ae(t){const e=Dt(t);let n=!0;function a(){n=!0,e.update(s=>s)}function r(s){n=!1,e.set(s)}function i(s){let o;return e.subscribe(l=>{(o===void 0||n&&l!==o)&&s(o=l)})}return{notify:a,set:r,subscribe:i}}const ke={v:()=>{}};function nn(){const{set:t,subscribe:e}=Dt(!1);let n;async function a(){clearTimeout(n);try{const r=await fetch(`${Ze}/_app/version.json`,{headers:{pragma:"no-cache","cache-control":"no-cache"}});if(!r.ok)return!1;const s=(await r.json()).version!==tn;return s&&(t(!0),ke.v(),clearTimeout(n)),s}catch{return!1}}return{subscribe:e,check:a}}function Rt(t,e,n){return t.origin!==Mt||!t.pathname.startsWith(e)?!0:n?t.pathname!==location.pathname:!1}function On(t){}const Se=new Set(["load","prerender","csr","ssr","trailingSlash","config"]);[...Se];const rn=new Set([...Se]);[...rn];function an(t){return t.filter(e=>e!=null)}function Ft(t){return t instanceof Vt||t instanceof Kt?t.status:500}function on(t){return t instanceof Kt?t.text:"Internal Error"}let R,Z,Ot;const sn=ee.toString().includes("$$")||/function \w+\(\) \{\}/.test(ee.toString()),oe="a:";var at,ot,st,it,lt,ct,ft,ut,de,dt,he,ht,pe;sn?(R={data:{},form:null,error:null,params:{},route:{id:null},state:{},status:-1,url:new URL(oe)},Z={current:null},Ot={current:!1}):(R=new(de=class{constructor(){U(this,at,T({}));U(this,ot,T(null));U(this,st,T(null));U(this,it,T({}));U(this,lt,T({id:null}));U(this,ct,T({}));U(this,ft,T(-1));U(this,ut,T(new URL(oe)))}get data(){return I(v(this,at))}set data(e){O(v(this,at),e)}get form(){return I(v(this,ot))}set form(e){O(v(this,ot),e)}get error(){return I(v(this,st))}set error(e){O(v(this,st),e)}get params(){return I(v(this,it))}set params(e){O(v(this,it),e)}get route(){return I(v(this,lt))}set route(e){O(v(this,lt),e)}get state(){return I(v(this,ct))}set state(e){O(v(this,ct),e)}get status(){return I(v(this,ft))}set status(e){O(v(this,ft),e)}get url(){return I(v(this,ut))}set url(e){O(v(this,ut),e)}},at=new WeakMap,ot=new WeakMap,st=new WeakMap,it=new WeakMap,lt=new WeakMap,ct=new WeakMap,ft=new WeakMap,ut=new WeakMap,de),Z=new(he=class{constructor(){U(this,dt,T(null))}get current(){return I(v(this,dt))}set current(e){O(v(this,dt),e)}},dt=new WeakMap,he),Ot=new(pe=class{constructor(){U(this,ht,T(!1))}get current(){return I(v(this,ht))}set current(e){O(v(this,ht),e)}},ht=new WeakMap,pe),ke.v=()=>Ot.current=!0);function ln(t){Object.assign(R,t)}const cn=new Set(["icon","shortcut icon","apple-touch-icon"]);let J=null;const j=ge(_e)??{},tt=ge(me)??{},C={url:ae({}),page:ae({}),navigating:Dt(null),updated:nn()};function Gt(t){j[t]=V()}function fn(t,e){let n=t+1;for(;j[n];)delete j[n],n+=1;for(n=e+1;tt[n];)delete tt[n],n+=1}function et(t,e=!1){return e?location.replace(t.href):location.href=t.href,new Promise(()=>{})}async function Ee(){if("serviceWorker"in navigator){const t=await navigator.serviceWorker.getRegistration(A||"/");t&&await t.update()}}function se(){}let Wt,Ct,wt,P,jt,S;const vt=[],yt=[];let y=null;function Nt(){var t;(t=y==null?void 0:y.fork)==null||t.then(e=>e==null?void 0:e.discard()),y=null}const gt=new Map,Re=new Set,un=new Set,X=new Set;let _={branch:[],error:null,url:null},xe=!1,bt=!1,ie=!0,nt=!1,Y=!1,Le=!1,Jt=!1,Ae,k,L,D;const kt=new Set,le=new Map;async function jn(t,e,n){var i,s,o,l,c;(i=globalThis.__sveltekit_1p1gamz)!=null&&i.data&&globalThis.__sveltekit_1p1gamz.data,document.URL!==location.href&&(location.href=location.href),S=t,await((o=(s=t.hooks).init)==null?void 0:o.call(s)),Wt=Qe(t),P=document.documentElement,jt=e,Ct=t.nodes[0],wt=t.nodes[1],Ct(),wt(),k=(l=history.state)==null?void 0:l[M],L=(c=history.state)==null?void 0:c[Q],k||(k=L=Date.now(),history.replaceState({...history.state,[M]:k,[Q]:L},""));const a=j[k];function r(){a&&(history.scrollRestoration="manual",scrollTo(a.x,a.y))}n?(r(),await Rn(jt,n)):(await F({type:"enter",url:ve(S.hash?An(new URL(location.href)):location.href),replace_state:!0}),r()),En()}function dn(){vt.length=0,Jt=!1}function Ue(t){yt.some(e=>e==null?void 0:e.snapshot)&&(tt[t]=yt.map(e=>{var n;return(n=e==null?void 0:e.snapshot)==null?void 0:n.capture()}))}function Te(t){var e;(e=tt[t])==null||e.forEach((n,a)=>{var r,i;(i=(r=yt[a])==null?void 0:r.snapshot)==null||i.restore(n)})}function ce(){Gt(k),ne(_e,j),Ue(L),ne(me,tt)}async function hn(t,e,n,a){let r;e.invalidateAll&&Nt(),await F({type:"goto",url:ve(t),keepfocus:e.keepFocus,noscroll:e.noScroll,replace_state:e.replaceState,state:e.state,redirect_count:n,nav_token:a,accept:()=>{e.invalidateAll&&(Jt=!0,r=[...le.keys()]),e.invalidate&&e.invalidate.forEach(Sn)}}),e.invalidateAll&&mt().then(mt).then(()=>{le.forEach(({resource:i},s)=>{var o;r!=null&&r.includes(s)&&((o=i.refresh)==null||o.call(i))})})}async function pn(t){if(t.id!==(y==null?void 0:y.id)){Nt();const e={};kt.add(e),y={id:t.id,token:e,promise:Oe({...t,preload:e}).then(n=>(kt.delete(e),n.type==="loaded"&&n.state.error&&Nt(),n)),fork:null}}return y.promise}async function Pt(t){var n;const e=(n=await xt(t,!1))==null?void 0:n.route;e&&await Promise.all([...e.layouts,e.leaf].filter(Boolean).map(a=>a[1]()))}async function Ie(t,e,n){var i;const a={params:_.params,route:{id:((i=_.route)==null?void 0:i.id)??null},url:new URL(location.href)};_={...t.state,nav:a};const r=document.querySelector("style[data-sveltekit]");if(r&&r.remove(),Object.assign(R,t.props.page),Ae=new S.root({target:e,props:{...t.props,stores:C,components:yt},hydrate:n,sync:!1,transformError:void 0}),await Promise.resolve(),Te(L),n){const s={from:null,to:{...a,scroll:j[k]??V()},willUnload:!1,type:"enter",complete:Promise.resolve()};X.forEach(o=>o(s))}bt=!0}async function St({url:t,params:e,branch:n,errors:a,status:r,error:i,route:s,form:o}){let l="never";if(A&&(t.pathname===A||t.pathname===A+"/"))l="always";else for(const f of n)(f==null?void 0:f.slash)!==void 0&&(l=f.slash);t.pathname=De(t.pathname,l),t.search=t.search;const c={type:"loaded",state:{url:t,params:e,branch:n,error:i,route:s},props:{constructors:an(n).map(f=>f.node.component),page:Zt(R)}};o!==void 0&&(c.props.form=o);let d={},u=!R,w=0;for(let f=0;fo(new URL(s))))return!0;return!1}function Ht(t,e){return(t==null?void 0:t.type)==="data"?t:(t==null?void 0:t.type)==="skip"?e??null:null}function _n(t,e){if(!t)return new Set(e.searchParams.keys());const n=new Set([...t.searchParams.keys(),...e.searchParams.keys()]);for(const a of n){const r=t.searchParams.getAll(a),i=e.searchParams.getAll(a);r.every(s=>i.includes(s))&&i.every(s=>r.includes(s))&&n.delete(a)}return n}function wn({error:t,url:e,route:n,params:a}){return{type:"loaded",state:{error:t,url:e,route:n,params:a,branch:[]},props:{page:Zt(R),constructors:[]}}}async function Oe({id:t,invalidating:e,url:n,params:a,route:r,preload:i}){if((y==null?void 0:y.id)===t)return kt.delete(y.token),y.promise;const{errors:s,layouts:o,leaf:l}=r,c=[...o,l];s.forEach(h=>h==null?void 0:h().catch(()=>{})),c.forEach(h=>h==null?void 0:h[1]().catch(()=>{}));const d=_.url?t!==Et(_.url):!1,u=_.route?r.id!==_.route.id:!1,w=_n(_.url,n);let p=!1;const f=c.map(async(h,g)=>{var $;if(!h)return;const b=_.branch[g];return h[1]===(b==null?void 0:b.loader)&&!mn(p,u,d,w,($=b.universal)==null?void 0:$.uses,a)?b:(p=!0,Yt({loader:h[1],url:n,params:a,route:r,parent:async()=>{var pt;const N={};for(let z=0;z{});const m=[];for(let h=0;hPromise.resolve({}),server_data_node:Ht(i)}),o={node:await wt(),loader:wt,universal:null,server:null,data:null};return St({url:n,params:r,branch:[s,o],status:t,error:e,errors:[],route:null})}catch(s){if(s instanceof zt)return hn(new URL(s.location,location.href),{},0);throw s}}async function yn(t){const e=t.href;if(gt.has(e))return gt.get(e);let n;try{const a=(async()=>{let r=await S.hooks.reroute({url:new URL(t),fetch:async(i,s)=>gn(i,s,t).promise})??t;if(typeof r=="string"){const i=new URL(t);S.hash?i.hash=r:i.pathname=r,r=i}return r})();gt.set(e,a),n=await a}catch{gt.delete(e);return}return n}async function xt(t,e){if(t&&!Rt(t,A,S.hash)){const n=await yn(t);if(!n)return;const a=bn(n);for(const r of Wt){const i=r.exec(a);if(i)return{id:Et(t),invalidating:e,route:r,params:ze(i),url:t}}}}function bn(t){return Ve(S.hash?t.hash.replace(/^#/,"").replace(/[?#].+/,""):t.pathname.slice(A.length))||"/"}function Et(t){return(S.hash?t.hash.replace(/^#/,""):t.pathname)+t.search}function Pe({url:t,type:e,intent:n,delta:a,event:r,scroll:i}){let s=!1;const o=Qt(_,n,t,e,i??null);a!==void 0&&(o.navigation.delta=a),r!==void 0&&(o.navigation.event=r);const l={...o.navigation,cancel:()=>{s=!0,o.reject(new Error("navigation cancelled"))}};return nt||Re.forEach(c=>c(l)),s?null:o}async function F({type:t,url:e,popped:n,keepfocus:a,noscroll:r,replace_state:i,state:s={},redirect_count:o=0,nav_token:l={},accept:c=se,block:d=se,event:u}){var z;const w=D;D=l;const p=await xt(e,!1),f=t==="enter"?Qt(_,p,e,t):Pe({url:e,type:t,delta:n==null?void 0:n.delta,intent:p,scroll:n==null?void 0:n.scroll,event:u});if(!f){d(),D===l&&(D=w);return}const m=k,h=L;c(),nt=!0,bt&&f.navigation.type!=="enter"&&C.navigating.set(Z.current=f.navigation);let g=p&&await Oe(p);if(!g){if(Rt(e,A,S.hash))return await et(e,i);g=await $e(e,{id:null},await rt(new Kt(404,"Not Found",`Not found: ${e.pathname}`),{url:e,params:{},route:{id:null}}),404,i)}if(e=(p==null?void 0:p.url)||e,D!==l)return f.reject(new Error("navigation aborted")),!1;if(g.type==="redirect"){if(o<20){await F({type:t,url:new URL(g.location,e),popped:n,keepfocus:a,noscroll:r,replace_state:i,state:s,redirect_count:o+1,nav_token:l}),f.fulfil(void 0);return}g=await Xt({status:500,error:await rt(new Error("Redirect loop"),{url:e,params:{},route:{id:null}}),url:e,route:{id:null}})}else g.props.page.status>=400&&await C.updated.check()&&(await Ee(),await et(e,i));if(dn(),Gt(m),Ue(h),g.props.page.url.pathname!==e.pathname&&(e.pathname=g.props.page.url.pathname),s=n?n.state:s,!n){const E=i?0:1,G={[M]:k+=E,[Q]:L+=E,[we]:s};(i?history.replaceState:history.pushState).call(history,G,"",e),i||fn(k,L)}const b=p&&(y==null?void 0:y.id)===p.id?y.fork:null;y=null,g.props.page.state=s;let x;if(bt){const E=(await Promise.all(Array.from(un,W=>W(f.navigation)))).filter(W=>typeof W=="function");if(E.length>0){let W=function(){E.forEach(At=>{X.delete(At)})};E.push(W),E.forEach(At=>{X.add(At)})}const G=f.navigation.to;_={...g.state,nav:{params:G.params,route:G.route,url:G.url}},g.props.page&&(g.props.page.url=e);const Lt=b&&await b;Lt?x=Lt.commit():(J=null,Ae.$set(g.props),J&&Object.assign(g.props.page,J),ln(g.props.page),x=(z=qe)==null?void 0:z()),Le=!0}else await Ie(g,jt,!1);const{activeElement:$}=document;await x,await mt(),await mt();let N=null;if(ie){const E=n?n.scroll:r?V():null;E?scrollTo(E.x,E.y):(N=e.hash&&document.getElementById(Ce(e)))?N.scrollIntoView():scrollTo(0,0)}const pt=document.activeElement!==$&&document.activeElement!==document.body;!a&&!pt&&Ln(e,!N),ie=!0,g.props.page&&(J&&Object.assign(g.props.page,J),Object.assign(R,g.props.page)),nt=!1,t==="popstate"&&Te(L),f.fulfil(void 0),f.navigation.to&&(f.navigation.to.scroll=V()),X.forEach(E=>E(f.navigation)),C.navigating.set(Z.current=null)}async function $e(t,e,n,a,r){return t.origin===Mt&&t.pathname===location.pathname&&!xe?await Xt({status:a,error:n,url:t,route:e}):await et(t,r)}function kn(){let t,e={element:void 0,href:void 0},n;P.addEventListener("mousemove",o=>{const l=o.target;clearTimeout(t),t=setTimeout(()=>{i(l,q.hover)},20)});function a(o){o.defaultPrevented||i(o.composedPath()[0],q.tap)}P.addEventListener("mousedown",a),P.addEventListener("touchstart",a,{passive:!0});const r=new IntersectionObserver(o=>{for(const l of o)l.isIntersecting&&(Pt(new URL(l.target.href)),r.unobserve(l.target))},{threshold:0});async function i(o,l){const c=be(o,P),d=c===e.element&&(c==null?void 0:c.href)===e.href&&l>=n;if(!c||d)return;const{url:u,external:w,download:p}=$t(c,A,S.hash);if(w||p)return;const f=_t(c),m=u&&Et(_.url)===Et(u);if(!(f.reload||m))if(l<=f.preload_data){e={element:c,href:c.href},n=q.tap;const h=await xt(u,!1);if(!h)return;pn(h)}else l<=f.preload_code&&(e={element:c,href:c.href},n=l,Pt(u))}function s(){r.disconnect();for(const o of P.querySelectorAll("a")){const{url:l,external:c,download:d}=$t(o,A,S.hash);if(c||d)continue;const u=_t(o);u.reload||(u.preload_code===q.viewport&&r.observe(o),u.preload_code===q.eager&&Pt(l))}}X.add(s),s()}function rt(t,e){if(t instanceof Vt)return t.body;const n=Ft(t),a=on(t);return S.hooks.handleError({error:t,event:e,status:n,message:a})??{message:a}}function Sn(t){if(typeof t=="function")vt.push(t);else{const{href:e}=new URL(t,location.href);vt.push(n=>n.href===e)}}function En(){var e;history.scrollRestoration="manual",addEventListener("beforeunload",n=>{let a=!1;if(ce(),!nt){const r=Qt(_,void 0,null,"leave"),i={...r.navigation,cancel:()=>{a=!0,r.reject(new Error("navigation cancelled"))}};Re.forEach(s=>s(i))}a?(n.preventDefault(),n.returnValue=""):history.scrollRestoration="auto"}),addEventListener("visibilitychange",()=>{document.visibilityState==="hidden"&&ce()}),(e=navigator.connection)!=null&&e.saveData||kn(),P.addEventListener("click",async n=>{if(n.button||n.which!==1||n.metaKey||n.ctrlKey||n.shiftKey||n.altKey||n.defaultPrevented)return;const a=be(n.composedPath()[0],P);if(!a)return;const{url:r,external:i,target:s,download:o}=$t(a,A,S.hash);if(!r)return;if(s==="_parent"||s==="_top"){if(window.parent!==window)return}else if(s&&s!=="_self")return;const l=_t(a);if(!(a instanceof SVGAElement)&&r.protocol!==location.protocol&&!(r.protocol==="https:"||r.protocol==="http:")||o)return;const[d,u]=(S.hash?r.hash.replace(/^#/,""):r.href).split("#"),w=d===Tt(location);if(i||l.reload&&(!w||!u)){Pe({url:r,type:"link",event:n})?nt=!0:n.preventDefault();return}if(u!==void 0&&w){const[,p]=_.url.href.split("#");if(p===u){if(n.preventDefault(),u===""||u==="top"&&a.ownerDocument.getElementById("top")===null)scrollTo({top:0});else{const f=a.ownerDocument.getElementById(decodeURIComponent(u));f&&(f.scrollIntoView(),f.focus())}return}if(Y=!0,Gt(k),t(r),!l.replace_state)return;Y=!1}n.preventDefault(),await new Promise(p=>{requestAnimationFrame(()=>{setTimeout(p,0)}),setTimeout(p,100)}),await F({type:"link",url:r,keepfocus:l.keepfocus,noscroll:l.noscroll,replace_state:l.replace_state??r.href===location.href,event:n})}),P.addEventListener("submit",n=>{if(n.defaultPrevented)return;const a=HTMLFormElement.prototype.cloneNode.call(n.target),r=n.submitter;if(((r==null?void 0:r.formTarget)||a.target)==="_blank"||((r==null?void 0:r.formMethod)||a.method)!=="get")return;const o=new URL((r==null?void 0:r.hasAttribute("formaction"))&&(r==null?void 0:r.formAction)||a.action);if(Rt(o,A,!1))return;const l=n.target,c=_t(l);if(c.reload)return;n.preventDefault(),n.stopPropagation();const d=new FormData(l,r);o.search=new URLSearchParams(d).toString(),F({type:"form",url:o,keepfocus:c.keepfocus,noscroll:c.noscroll,replace_state:c.replace_state??o.href===location.href,event:n})}),addEventListener("popstate",async n=>{var a;if(!qt){if((a=n.state)!=null&&a[M]){const r=n.state[M];if(D={},r===k)return;const i=j[r],s=n.state[we]??{},o=new URL(n.state[en]??location.href),l=n.state[Q],c=_.url?Tt(location)===Tt(_.url):!1;if(l===L&&(Le||c)){s!==R.state&&(R.state=s),t(o),j[k]=V(),i&&scrollTo(i.x,i.y),k=r;return}const u=r-k;await F({type:"popstate",url:o,popped:{state:s,scroll:i,delta:u},accept:()=>{k=r,L=l},block:()=>{history.go(-u)},nav_token:D,event:n})}else if(!Y){const r=new URL(location.href);t(r),S.hash&&location.reload()}}}),addEventListener("hashchange",()=>{Y&&(Y=!1,history.replaceState({...history.state,[M]:++k,[Q]:L},"",location.href))});for(const n of document.querySelectorAll("link"))cn.has(n.rel)&&(n.href=n.href);addEventListener("pageshow",n=>{n.persisted&&C.navigating.set(Z.current=null)});function t(n){_.url=R.url=n,C.page.set(Zt(R)),C.page.notify()}}async function Rn(t,{status:e=200,error:n,node_ids:a,params:r,route:i,server_route:s,data:o,form:l}){xe=!0;const c=new URL(location.href);let d;({params:r={},route:i={id:null}}=await xt(c,!1)||{}),d=Wt.find(({id:p})=>p===i.id);let u,w=!0;try{const p=a.map(async(m,h)=>{const g=o[h];return g!=null&&g.uses&&(g.uses=xn(g.uses)),Yt({loader:S.nodes[m],url:c,params:r,route:i,parent:async()=>{const b={};for(let x=0;x{const o=history.state;qt=!0,location.replace(new URL(`#${a}`,location.href)),history.replaceState(o,"",t),e&&scrollTo(i,s),qt=!1})}else{const i=document.body,s=i.getAttribute("tabindex");i.tabIndex=-1,i.focus({preventScroll:!0,focusVisible:!1}),s!==null?i.setAttribute("tabindex",s):i.removeAttribute("tabindex")}const r=getSelection();if(r&&r.type!=="None"){const i=[];for(let s=0;s{if(r.rangeCount===i.length){for(let s=0;s{i=u,s=w});return o.catch(()=>{}),{navigation:{from:{params:t.params,route:{id:((c=t.route)==null?void 0:c.id)??null},url:t.url,scroll:V()},to:n&&{params:(e==null?void 0:e.params)??null,route:{id:((d=e==null?void 0:e.route)==null?void 0:d.id)??null},url:n,scroll:r},willUnload:!e,type:a,complete:o},fulfil:i,reject:s}}function Zt(t){return{data:t.data,error:t.error,form:t.form,params:t.params,route:t.route,state:t.state,status:t.status,url:t.url}}function An(t){const e=new URL(t);return e.hash=decodeURIComponent(t.hash),e}function Ce(t){let e;if(S.hash){const[,,n]=t.hash.split("#",3);e=n??""}else e=t.hash.slice(1);return decodeURIComponent(e)}export{jn as a,On as l,R as p,C as s}; diff --git a/frontend/dist/_app/immutable/chunks/CQT0YWjJ.js b/frontend/dist/_app/immutable/chunks/CQT0YWjJ.js new file mode 100644 index 0000000..54ce783 --- /dev/null +++ b/frontend/dist/_app/immutable/chunks/CQT0YWjJ.js @@ -0,0 +1 @@ +var te=t=>{throw TypeError(t)};var je=(t,e,n)=>e.has(t)||te("Cannot "+n);var v=(t,e,n)=>(je(t,e,"read from private field"),n?n.call(t):e.get(t)),U=(t,e,n)=>e.has(t)?te("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(t):e.set(t,n);import{bf as Ut,bg as Ne,aK as T,o as I,$ as O,aJ as mt,bh as qe}from"./VJhVTb1A.js";import{o as ee}from"./Cz6m6K8p.js";const B=[];function Dt(t,e=Ut){let n=null;const a=new Set;function r(o){if(Ne(t,o)&&(t=o,n)){const l=!B.length;for(const c of a)c[1](),B.push(c,t);if(l){for(let c=0;c{a.delete(c),a.size===0&&n&&(n(),n=null)}}return{set:r,update:i,subscribe:s}}class Vt{constructor(e,n){this.status=e,typeof n=="string"?this.body={message:n}:n?this.body=n:this.body={message:`Error: ${e}`}}toString(){return JSON.stringify(this.body)}}class Kt{constructor(e,n){this.status=e,this.location=n}}class Bt extends Error{constructor(e,n,a){super(a),this.status=e,this.text=n}}new URL("sveltekit-internal://");function De(t,e){return t==="/"||e==="ignore"?t:e==="never"?t.endsWith("/")?t.slice(0,-1):t:e==="always"&&!t.endsWith("/")?t+"/":t}function Ve(t){return t.split("%25").map(decodeURI).join("%25")}function Ke(t){for(const e in t)t[e]=decodeURIComponent(t[e]);return t}function Tt({href:t}){return t.split("#")[0]}function Be(...t){let e=5381;for(const n of t)if(typeof n=="string"){let a=n.length;for(;a;)e=e*33^n.charCodeAt(--a)}else if(ArrayBuffer.isView(n)){const a=new Uint8Array(n.buffer,n.byteOffset,n.byteLength);let r=a.length;for(;r;)e=e*33^a[--r]}else throw new TypeError("value must be a string or TypedArray");return(e>>>0).toString(36)}new TextEncoder;new TextDecoder;function Me(t){const e=atob(t),n=new Uint8Array(e.length);for(let a=0;a((t instanceof Request?t.method:(e==null?void 0:e.method)||"GET")!=="GET"&&H.delete(Mt(t)),ze(t,e));const H=new Map;function Fe(t,e){const n=Mt(t,e),a=document.querySelector(n);if(a!=null&&a.textContent){a.remove();let{body:r,...i}=JSON.parse(a.textContent);const s=a.getAttribute("data-ttl");return s&&H.set(n,{body:r,init:i,ttl:1e3*Number(s)}),a.getAttribute("data-b64")!==null&&(r=Me(r)),Promise.resolve(new Response(r,i))}return window.fetch(t,e)}function Ge(t,e,n){if(H.size>0){const a=Mt(t,n),r=H.get(a);if(r){if(performance.now(){const r=/^\[\.\.\.(\w+)(?:=(\w+))?\]$/.exec(a);if(r)return e.push({name:r[1],matcher:r[2],optional:!1,rest:!0,chained:!0}),"(?:/([^]*))?";const i=/^\[\[(\w+)(?:=(\w+))?\]\]$/.exec(a);if(i)return e.push({name:i[1],matcher:i[2],optional:!0,rest:!1,chained:!0}),"(?:/([^/]+))?";if(!a)return;const s=a.split(/\[(.+?)\](?!\])/);return"/"+s.map((l,c)=>{if(c%2){if(l.startsWith("x+"))return It(String.fromCharCode(parseInt(l.slice(2),16)));if(l.startsWith("u+"))return It(String.fromCharCode(...l.slice(2).split("-").map(m=>parseInt(m,16))));const d=We.exec(l),[,u,w,p,f]=d;return e.push({name:p,matcher:f,optional:!!u,rest:!!w,chained:w?c===1&&s[0]==="":!1}),w?"([^]*?)":u?"([^/]*)?":"([^/]+?)"}return It(l)}).join("")}).join("")}/?$`),params:e}}function Ye(t){return t!==""&&!/^\([^)]+\)$/.test(t)}function He(t){return t.slice(1).split("/").filter(Ye)}function Xe(t,e,n){const a={},r=t.slice(1),i=r.filter(o=>o!==void 0);let s=0;for(let o=0;od).join("/"),s=0),c===void 0)if(l.rest)c="";else continue;if(!l.matcher||n[l.matcher](c)){a[l.name]=c;const d=e[o+1],u=r[o+1];d&&!d.rest&&d.optional&&u&&l.chained&&(s=0),!d&&!u&&Object.keys(a).length===i.length&&(s=0);continue}if(l.optional&&l.chained){s++;continue}return}if(!s)return a}function It(t){return t.normalize().replace(/[[\]]/g,"\\$&").replace(/%/g,"%25").replace(/\//g,"%2[Ff]").replace(/\?/g,"%3[Ff]").replace(/#/g,"%23").replace(/[.*+?^${}()|\\]/g,"\\$&")}function Qe({nodes:t,server_loads:e,dictionary:n,matchers:a}){const r=new Set(e);return Object.entries(n).map(([o,[l,c,d]])=>{const{pattern:u,params:w}=Je(o),p={id:o,exec:f=>{const m=u.exec(f);if(m)return Xe(m,w,a)},errors:[1,...d||[]].map(f=>t[f]),layouts:[0,...c||[]].map(s),leaf:i(l)};return p.errors.length=p.layouts.length=Math.max(p.errors.length,p.layouts.length),p});function i(o){const l=o<0;return l&&(o=~o),[l,t[o]]}function s(o){return o===void 0?o:[r.has(o),t[o]]}}function ge(t,e=JSON.parse){try{return e(sessionStorage[t])}catch{}}function ne(t,e,n=JSON.stringify){const a=n(e);try{sessionStorage[t]=a}catch{}}var fe;const A=((fe=globalThis.__sveltekit_bd2a1k)==null?void 0:fe.base)??"";var ue;const Ze=((ue=globalThis.__sveltekit_bd2a1k)==null?void 0:ue.assets)??A??"",tn="1791387960077",me="sveltekit:snapshot",_e="sveltekit:scroll",we="sveltekit:states",en="sveltekit:pageurl",z="sveltekit:history",Q="sveltekit:navigation",q={tap:1,hover:2,viewport:3,eager:4,off:-1,false:-1},zt=location.origin;function ve(t){if(t instanceof URL)return t;let e=document.baseURI;if(!e){const n=document.getElementsByTagName("base");e=n.length?n[0].href:document.URL}return new URL(t,e)}function V(){return{x:pageXOffset,y:pageYOffset}}function M(t,e){return t.getAttribute(`data-sveltekit-${e}`)}const re={...q,"":q.hover};function ye(t){let e=t.assignedSlot??t.parentNode;return(e==null?void 0:e.nodeType)===11&&(e=e.host),e}function be(t,e){for(;t&&t!==e;){if(t.nodeName.toUpperCase()==="A"&&t.hasAttribute("href"))return t;t=ye(t)}}function $t(t,e,n){let a;try{if(a=new URL(t instanceof SVGAElement?t.href.baseVal:t.href,document.baseURI),n&&a.hash.match(/^#[^/]/)){const o=location.hash.split("#")[1]||"/";a.hash=`#${o}${a.hash}`}}catch{}const r=t instanceof SVGAElement?t.target.baseVal:t.target,i=!a||!!r||Rt(a,e,n)||(t.getAttribute("rel")||"").split(/\s+/).includes("external"),s=(a==null?void 0:a.origin)===zt&&t.hasAttribute("download");return{url:a,external:i,target:r,download:s}}function _t(t){let e=null,n=null,a=null,r=null,i=null,s=null,o=t;for(;o&&o!==document.documentElement;)a===null&&(a=M(o,"preload-code")),r===null&&(r=M(o,"preload-data")),e===null&&(e=M(o,"keepfocus")),n===null&&(n=M(o,"noscroll")),i===null&&(i=M(o,"reload")),s===null&&(s=M(o,"replacestate")),o=ye(o);function l(c){switch(c){case"":case"true":return!0;case"off":case"false":return!1;default:return}}return{preload_code:re[a??"off"],preload_data:re[r??"off"],keepfocus:l(e),noscroll:l(n),reload:l(i),replace_state:l(s)}}function ae(t){const e=Dt(t);let n=!0;function a(){n=!0,e.update(s=>s)}function r(s){n=!1,e.set(s)}function i(s){let o;return e.subscribe(l=>{(o===void 0||n&&l!==o)&&s(o=l)})}return{notify:a,set:r,subscribe:i}}const ke={v:()=>{}};function nn(){const{set:t,subscribe:e}=Dt(!1);let n;async function a(){clearTimeout(n);try{const r=await fetch(`${Ze}/_app/version.json`,{headers:{pragma:"no-cache","cache-control":"no-cache"}});if(!r.ok)return!1;const s=(await r.json()).version!==tn;return s&&(t(!0),ke.v(),clearTimeout(n)),s}catch{return!1}}return{subscribe:e,check:a}}function Rt(t,e,n){return t.origin!==zt||!t.pathname.startsWith(e)?!0:n?t.pathname!==location.pathname:!1}function On(t){}const Se=new Set(["load","prerender","csr","ssr","trailingSlash","config"]);[...Se];const rn=new Set([...Se]);[...rn];function an(t){return t.filter(e=>e!=null)}function Ft(t){return t instanceof Vt||t instanceof Bt?t.status:500}function on(t){return t instanceof Bt?t.text:"Internal Error"}let R,Z,Ot;const sn=ee.toString().includes("$$")||/function \w+\(\) \{\}/.test(ee.toString()),oe="a:";var at,ot,st,it,lt,ct,ft,ut,de,dt,he,ht,pe;sn?(R={data:{},form:null,error:null,params:{},route:{id:null},state:{},status:-1,url:new URL(oe)},Z={current:null},Ot={current:!1}):(R=new(de=class{constructor(){U(this,at,T({}));U(this,ot,T(null));U(this,st,T(null));U(this,it,T({}));U(this,lt,T({id:null}));U(this,ct,T({}));U(this,ft,T(-1));U(this,ut,T(new URL(oe)))}get data(){return I(v(this,at))}set data(e){O(v(this,at),e)}get form(){return I(v(this,ot))}set form(e){O(v(this,ot),e)}get error(){return I(v(this,st))}set error(e){O(v(this,st),e)}get params(){return I(v(this,it))}set params(e){O(v(this,it),e)}get route(){return I(v(this,lt))}set route(e){O(v(this,lt),e)}get state(){return I(v(this,ct))}set state(e){O(v(this,ct),e)}get status(){return I(v(this,ft))}set status(e){O(v(this,ft),e)}get url(){return I(v(this,ut))}set url(e){O(v(this,ut),e)}},at=new WeakMap,ot=new WeakMap,st=new WeakMap,it=new WeakMap,lt=new WeakMap,ct=new WeakMap,ft=new WeakMap,ut=new WeakMap,de),Z=new(he=class{constructor(){U(this,dt,T(null))}get current(){return I(v(this,dt))}set current(e){O(v(this,dt),e)}},dt=new WeakMap,he),Ot=new(pe=class{constructor(){U(this,ht,T(!1))}get current(){return I(v(this,ht))}set current(e){O(v(this,ht),e)}},ht=new WeakMap,pe),ke.v=()=>Ot.current=!0);function ln(t){Object.assign(R,t)}const cn=new Set(["icon","shortcut icon","apple-touch-icon"]);let J=null;const j=ge(_e)??{},tt=ge(me)??{},C={url:ae({}),page:ae({}),navigating:Dt(null),updated:nn()};function Gt(t){j[t]=V()}function fn(t,e){let n=t+1;for(;j[n];)delete j[n],n+=1;for(n=e+1;tt[n];)delete tt[n],n+=1}function et(t,e=!1){return e?location.replace(t.href):location.href=t.href,new Promise(()=>{})}async function Ee(){if("serviceWorker"in navigator){const t=await navigator.serviceWorker.getRegistration(A||"/");t&&await t.update()}}function se(){}let Wt,Ct,wt,P,jt,S;const vt=[],yt=[];let y=null;function Nt(){var t;(t=y==null?void 0:y.fork)==null||t.then(e=>e==null?void 0:e.discard()),y=null}const gt=new Map,Re=new Set,un=new Set,X=new Set;let _={branch:[],error:null,url:null},xe=!1,bt=!1,ie=!0,nt=!1,Y=!1,Le=!1,Jt=!1,Ae,k,L,D;const kt=new Set,le=new Map;async function jn(t,e,n){var i,s,o,l,c;(i=globalThis.__sveltekit_bd2a1k)!=null&&i.data&&globalThis.__sveltekit_bd2a1k.data,document.URL!==location.href&&(location.href=location.href),S=t,await((o=(s=t.hooks).init)==null?void 0:o.call(s)),Wt=Qe(t),P=document.documentElement,jt=e,Ct=t.nodes[0],wt=t.nodes[1],Ct(),wt(),k=(l=history.state)==null?void 0:l[z],L=(c=history.state)==null?void 0:c[Q],k||(k=L=Date.now(),history.replaceState({...history.state,[z]:k,[Q]:L},""));const a=j[k];function r(){a&&(history.scrollRestoration="manual",scrollTo(a.x,a.y))}n?(r(),await Rn(jt,n)):(await F({type:"enter",url:ve(S.hash?An(new URL(location.href)):location.href),replace_state:!0}),r()),En()}function dn(){vt.length=0,Jt=!1}function Ue(t){yt.some(e=>e==null?void 0:e.snapshot)&&(tt[t]=yt.map(e=>{var n;return(n=e==null?void 0:e.snapshot)==null?void 0:n.capture()}))}function Te(t){var e;(e=tt[t])==null||e.forEach((n,a)=>{var r,i;(i=(r=yt[a])==null?void 0:r.snapshot)==null||i.restore(n)})}function ce(){Gt(k),ne(_e,j),Ue(L),ne(me,tt)}async function hn(t,e,n,a){let r;e.invalidateAll&&Nt(),await F({type:"goto",url:ve(t),keepfocus:e.keepFocus,noscroll:e.noScroll,replace_state:e.replaceState,state:e.state,redirect_count:n,nav_token:a,accept:()=>{e.invalidateAll&&(Jt=!0,r=[...le.keys()]),e.invalidate&&e.invalidate.forEach(Sn)}}),e.invalidateAll&&mt().then(mt).then(()=>{le.forEach(({resource:i},s)=>{var o;r!=null&&r.includes(s)&&((o=i.refresh)==null||o.call(i))})})}async function pn(t){if(t.id!==(y==null?void 0:y.id)){Nt();const e={};kt.add(e),y={id:t.id,token:e,promise:Oe({...t,preload:e}).then(n=>(kt.delete(e),n.type==="loaded"&&n.state.error&&Nt(),n)),fork:null}}return y.promise}async function Pt(t){var n;const e=(n=await xt(t,!1))==null?void 0:n.route;e&&await Promise.all([...e.layouts,e.leaf].filter(Boolean).map(a=>a[1]()))}async function Ie(t,e,n){var i;const a={params:_.params,route:{id:((i=_.route)==null?void 0:i.id)??null},url:new URL(location.href)};_={...t.state,nav:a};const r=document.querySelector("style[data-sveltekit]");if(r&&r.remove(),Object.assign(R,t.props.page),Ae=new S.root({target:e,props:{...t.props,stores:C,components:yt},hydrate:n,sync:!1,transformError:void 0}),await Promise.resolve(),Te(L),n){const s={from:null,to:{...a,scroll:j[k]??V()},willUnload:!1,type:"enter",complete:Promise.resolve()};X.forEach(o=>o(s))}bt=!0}async function St({url:t,params:e,branch:n,errors:a,status:r,error:i,route:s,form:o}){let l="never";if(A&&(t.pathname===A||t.pathname===A+"/"))l="always";else for(const f of n)(f==null?void 0:f.slash)!==void 0&&(l=f.slash);t.pathname=De(t.pathname,l),t.search=t.search;const c={type:"loaded",state:{url:t,params:e,branch:n,error:i,route:s},props:{constructors:an(n).map(f=>f.node.component),page:Zt(R)}};o!==void 0&&(c.props.form=o);let d={},u=!R,w=0;for(let f=0;fo(new URL(s))))return!0;return!1}function Ht(t,e){return(t==null?void 0:t.type)==="data"?t:(t==null?void 0:t.type)==="skip"?e??null:null}function _n(t,e){if(!t)return new Set(e.searchParams.keys());const n=new Set([...t.searchParams.keys(),...e.searchParams.keys()]);for(const a of n){const r=t.searchParams.getAll(a),i=e.searchParams.getAll(a);r.every(s=>i.includes(s))&&i.every(s=>r.includes(s))&&n.delete(a)}return n}function wn({error:t,url:e,route:n,params:a}){return{type:"loaded",state:{error:t,url:e,route:n,params:a,branch:[]},props:{page:Zt(R),constructors:[]}}}async function Oe({id:t,invalidating:e,url:n,params:a,route:r,preload:i}){if((y==null?void 0:y.id)===t)return kt.delete(y.token),y.promise;const{errors:s,layouts:o,leaf:l}=r,c=[...o,l];s.forEach(h=>h==null?void 0:h().catch(()=>{})),c.forEach(h=>h==null?void 0:h[1]().catch(()=>{}));const d=_.url?t!==Et(_.url):!1,u=_.route?r.id!==_.route.id:!1,w=_n(_.url,n);let p=!1;const f=c.map(async(h,g)=>{var $;if(!h)return;const b=_.branch[g];return h[1]===(b==null?void 0:b.loader)&&!mn(p,u,d,w,($=b.universal)==null?void 0:$.uses,a)?b:(p=!0,Yt({loader:h[1],url:n,params:a,route:r,parent:async()=>{var pt;const N={};for(let K=0;K{});const m=[];for(let h=0;hPromise.resolve({}),server_data_node:Ht(i)}),o={node:await wt(),loader:wt,universal:null,server:null,data:null};return St({url:n,params:r,branch:[s,o],status:t,error:e,errors:[],route:null})}catch(s){if(s instanceof Kt)return hn(new URL(s.location,location.href),{},0);throw s}}async function yn(t){const e=t.href;if(gt.has(e))return gt.get(e);let n;try{const a=(async()=>{let r=await S.hooks.reroute({url:new URL(t),fetch:async(i,s)=>gn(i,s,t).promise})??t;if(typeof r=="string"){const i=new URL(t);S.hash?i.hash=r:i.pathname=r,r=i}return r})();gt.set(e,a),n=await a}catch{gt.delete(e);return}return n}async function xt(t,e){if(t&&!Rt(t,A,S.hash)){const n=await yn(t);if(!n)return;const a=bn(n);for(const r of Wt){const i=r.exec(a);if(i)return{id:Et(t),invalidating:e,route:r,params:Ke(i),url:t}}}}function bn(t){return Ve(S.hash?t.hash.replace(/^#/,"").replace(/[?#].+/,""):t.pathname.slice(A.length))||"/"}function Et(t){return(S.hash?t.hash.replace(/^#/,""):t.pathname)+t.search}function Pe({url:t,type:e,intent:n,delta:a,event:r,scroll:i}){let s=!1;const o=Qt(_,n,t,e,i??null);a!==void 0&&(o.navigation.delta=a),r!==void 0&&(o.navigation.event=r);const l={...o.navigation,cancel:()=>{s=!0,o.reject(new Error("navigation cancelled"))}};return nt||Re.forEach(c=>c(l)),s?null:o}async function F({type:t,url:e,popped:n,keepfocus:a,noscroll:r,replace_state:i,state:s={},redirect_count:o=0,nav_token:l={},accept:c=se,block:d=se,event:u}){var K;const w=D;D=l;const p=await xt(e,!1),f=t==="enter"?Qt(_,p,e,t):Pe({url:e,type:t,delta:n==null?void 0:n.delta,intent:p,scroll:n==null?void 0:n.scroll,event:u});if(!f){d(),D===l&&(D=w);return}const m=k,h=L;c(),nt=!0,bt&&f.navigation.type!=="enter"&&C.navigating.set(Z.current=f.navigation);let g=p&&await Oe(p);if(!g){if(Rt(e,A,S.hash))return await et(e,i);g=await $e(e,{id:null},await rt(new Bt(404,"Not Found",`Not found: ${e.pathname}`),{url:e,params:{},route:{id:null}}),404,i)}if(e=(p==null?void 0:p.url)||e,D!==l)return f.reject(new Error("navigation aborted")),!1;if(g.type==="redirect"){if(o<20){await F({type:t,url:new URL(g.location,e),popped:n,keepfocus:a,noscroll:r,replace_state:i,state:s,redirect_count:o+1,nav_token:l}),f.fulfil(void 0);return}g=await Xt({status:500,error:await rt(new Error("Redirect loop"),{url:e,params:{},route:{id:null}}),url:e,route:{id:null}})}else g.props.page.status>=400&&await C.updated.check()&&(await Ee(),await et(e,i));if(dn(),Gt(m),Ue(h),g.props.page.url.pathname!==e.pathname&&(e.pathname=g.props.page.url.pathname),s=n?n.state:s,!n){const E=i?0:1,G={[z]:k+=E,[Q]:L+=E,[we]:s};(i?history.replaceState:history.pushState).call(history,G,"",e),i||fn(k,L)}const b=p&&(y==null?void 0:y.id)===p.id?y.fork:null;y=null,g.props.page.state=s;let x;if(bt){const E=(await Promise.all(Array.from(un,W=>W(f.navigation)))).filter(W=>typeof W=="function");if(E.length>0){let W=function(){E.forEach(At=>{X.delete(At)})};E.push(W),E.forEach(At=>{X.add(At)})}const G=f.navigation.to;_={...g.state,nav:{params:G.params,route:G.route,url:G.url}},g.props.page&&(g.props.page.url=e);const Lt=b&&await b;Lt?x=Lt.commit():(J=null,Ae.$set(g.props),J&&Object.assign(g.props.page,J),ln(g.props.page),x=(K=qe)==null?void 0:K()),Le=!0}else await Ie(g,jt,!1);const{activeElement:$}=document;await x,await mt(),await mt();let N=null;if(ie){const E=n?n.scroll:r?V():null;E?scrollTo(E.x,E.y):(N=e.hash&&document.getElementById(Ce(e)))?N.scrollIntoView():scrollTo(0,0)}const pt=document.activeElement!==$&&document.activeElement!==document.body;!a&&!pt&&Ln(e,!N),ie=!0,g.props.page&&(J&&Object.assign(g.props.page,J),Object.assign(R,g.props.page)),nt=!1,t==="popstate"&&Te(L),f.fulfil(void 0),f.navigation.to&&(f.navigation.to.scroll=V()),X.forEach(E=>E(f.navigation)),C.navigating.set(Z.current=null)}async function $e(t,e,n,a,r){return t.origin===zt&&t.pathname===location.pathname&&!xe?await Xt({status:a,error:n,url:t,route:e}):await et(t,r)}function kn(){let t,e={element:void 0,href:void 0},n;P.addEventListener("mousemove",o=>{const l=o.target;clearTimeout(t),t=setTimeout(()=>{i(l,q.hover)},20)});function a(o){o.defaultPrevented||i(o.composedPath()[0],q.tap)}P.addEventListener("mousedown",a),P.addEventListener("touchstart",a,{passive:!0});const r=new IntersectionObserver(o=>{for(const l of o)l.isIntersecting&&(Pt(new URL(l.target.href)),r.unobserve(l.target))},{threshold:0});async function i(o,l){const c=be(o,P),d=c===e.element&&(c==null?void 0:c.href)===e.href&&l>=n;if(!c||d)return;const{url:u,external:w,download:p}=$t(c,A,S.hash);if(w||p)return;const f=_t(c),m=u&&Et(_.url)===Et(u);if(!(f.reload||m))if(l<=f.preload_data){e={element:c,href:c.href},n=q.tap;const h=await xt(u,!1);if(!h)return;pn(h)}else l<=f.preload_code&&(e={element:c,href:c.href},n=l,Pt(u))}function s(){r.disconnect();for(const o of P.querySelectorAll("a")){const{url:l,external:c,download:d}=$t(o,A,S.hash);if(c||d)continue;const u=_t(o);u.reload||(u.preload_code===q.viewport&&r.observe(o),u.preload_code===q.eager&&Pt(l))}}X.add(s),s()}function rt(t,e){if(t instanceof Vt)return t.body;const n=Ft(t),a=on(t);return S.hooks.handleError({error:t,event:e,status:n,message:a})??{message:a}}function Sn(t){if(typeof t=="function")vt.push(t);else{const{href:e}=new URL(t,location.href);vt.push(n=>n.href===e)}}function En(){var e;history.scrollRestoration="manual",addEventListener("beforeunload",n=>{let a=!1;if(ce(),!nt){const r=Qt(_,void 0,null,"leave"),i={...r.navigation,cancel:()=>{a=!0,r.reject(new Error("navigation cancelled"))}};Re.forEach(s=>s(i))}a?(n.preventDefault(),n.returnValue=""):history.scrollRestoration="auto"}),addEventListener("visibilitychange",()=>{document.visibilityState==="hidden"&&ce()}),(e=navigator.connection)!=null&&e.saveData||kn(),P.addEventListener("click",async n=>{if(n.button||n.which!==1||n.metaKey||n.ctrlKey||n.shiftKey||n.altKey||n.defaultPrevented)return;const a=be(n.composedPath()[0],P);if(!a)return;const{url:r,external:i,target:s,download:o}=$t(a,A,S.hash);if(!r)return;if(s==="_parent"||s==="_top"){if(window.parent!==window)return}else if(s&&s!=="_self")return;const l=_t(a);if(!(a instanceof SVGAElement)&&r.protocol!==location.protocol&&!(r.protocol==="https:"||r.protocol==="http:")||o)return;const[d,u]=(S.hash?r.hash.replace(/^#/,""):r.href).split("#"),w=d===Tt(location);if(i||l.reload&&(!w||!u)){Pe({url:r,type:"link",event:n})?nt=!0:n.preventDefault();return}if(u!==void 0&&w){const[,p]=_.url.href.split("#");if(p===u){if(n.preventDefault(),u===""||u==="top"&&a.ownerDocument.getElementById("top")===null)scrollTo({top:0});else{const f=a.ownerDocument.getElementById(decodeURIComponent(u));f&&(f.scrollIntoView(),f.focus())}return}if(Y=!0,Gt(k),t(r),!l.replace_state)return;Y=!1}n.preventDefault(),await new Promise(p=>{requestAnimationFrame(()=>{setTimeout(p,0)}),setTimeout(p,100)}),await F({type:"link",url:r,keepfocus:l.keepfocus,noscroll:l.noscroll,replace_state:l.replace_state??r.href===location.href,event:n})}),P.addEventListener("submit",n=>{if(n.defaultPrevented)return;const a=HTMLFormElement.prototype.cloneNode.call(n.target),r=n.submitter;if(((r==null?void 0:r.formTarget)||a.target)==="_blank"||((r==null?void 0:r.formMethod)||a.method)!=="get")return;const o=new URL((r==null?void 0:r.hasAttribute("formaction"))&&(r==null?void 0:r.formAction)||a.action);if(Rt(o,A,!1))return;const l=n.target,c=_t(l);if(c.reload)return;n.preventDefault(),n.stopPropagation();const d=new FormData(l,r);o.search=new URLSearchParams(d).toString(),F({type:"form",url:o,keepfocus:c.keepfocus,noscroll:c.noscroll,replace_state:c.replace_state??o.href===location.href,event:n})}),addEventListener("popstate",async n=>{var a;if(!qt){if((a=n.state)!=null&&a[z]){const r=n.state[z];if(D={},r===k)return;const i=j[r],s=n.state[we]??{},o=new URL(n.state[en]??location.href),l=n.state[Q],c=_.url?Tt(location)===Tt(_.url):!1;if(l===L&&(Le||c)){s!==R.state&&(R.state=s),t(o),j[k]=V(),i&&scrollTo(i.x,i.y),k=r;return}const u=r-k;await F({type:"popstate",url:o,popped:{state:s,scroll:i,delta:u},accept:()=>{k=r,L=l},block:()=>{history.go(-u)},nav_token:D,event:n})}else if(!Y){const r=new URL(location.href);t(r),S.hash&&location.reload()}}}),addEventListener("hashchange",()=>{Y&&(Y=!1,history.replaceState({...history.state,[z]:++k,[Q]:L},"",location.href))});for(const n of document.querySelectorAll("link"))cn.has(n.rel)&&(n.href=n.href);addEventListener("pageshow",n=>{n.persisted&&C.navigating.set(Z.current=null)});function t(n){_.url=R.url=n,C.page.set(Zt(R)),C.page.notify()}}async function Rn(t,{status:e=200,error:n,node_ids:a,params:r,route:i,server_route:s,data:o,form:l}){xe=!0;const c=new URL(location.href);let d;({params:r={},route:i={id:null}}=await xt(c,!1)||{}),d=Wt.find(({id:p})=>p===i.id);let u,w=!0;try{const p=a.map(async(m,h)=>{const g=o[h];return g!=null&&g.uses&&(g.uses=xn(g.uses)),Yt({loader:S.nodes[m],url:c,params:r,route:i,parent:async()=>{const b={};for(let x=0;x{const o=history.state;qt=!0,location.replace(new URL(`#${a}`,location.href)),history.replaceState(o,"",t),e&&scrollTo(i,s),qt=!1})}else{const i=document.body,s=i.getAttribute("tabindex");i.tabIndex=-1,i.focus({preventScroll:!0,focusVisible:!1}),s!==null?i.setAttribute("tabindex",s):i.removeAttribute("tabindex")}const r=getSelection();if(r&&r.type!=="None"){const i=[];for(let s=0;s{if(r.rangeCount===i.length){for(let s=0;s{i=u,s=w});return o.catch(()=>{}),{navigation:{from:{params:t.params,route:{id:((c=t.route)==null?void 0:c.id)??null},url:t.url,scroll:V()},to:n&&{params:(e==null?void 0:e.params)??null,route:{id:((d=e==null?void 0:e.route)==null?void 0:d.id)??null},url:n,scroll:r},willUnload:!e,type:a,complete:o},fulfil:i,reject:s}}function Zt(t){return{data:t.data,error:t.error,form:t.form,params:t.params,route:t.route,state:t.state,status:t.status,url:t.url}}function An(t){const e=new URL(t);return e.hash=decodeURIComponent(t.hash),e}function Ce(t){let e;if(S.hash){const[,,n]=t.hash.split("#",3);e=n??""}else e=t.hash.slice(1);return decodeURIComponent(e)}export{jn as a,On as l,R as p,C as s}; diff --git a/frontend/dist/_app/immutable/entry/app.BMY5BpkA.js b/frontend/dist/_app/immutable/entry/app.CCuNkhVQ.js similarity index 93% rename from frontend/dist/_app/immutable/entry/app.BMY5BpkA.js rename to frontend/dist/_app/immutable/entry/app.CCuNkhVQ.js index 239aec7..dcef1bd 100644 --- a/frontend/dist/_app/immutable/entry/app.BMY5BpkA.js +++ b/frontend/dist/_app/immutable/entry/app.CCuNkhVQ.js @@ -1,2 +1,2 @@ -const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["../nodes/0.DecrOZwe.js","../chunks/C14P8jaG.js","../chunks/VJhVTb1A.js","../chunks/CiUbu-1F.js","../chunks/U5yjBaoU.js","../nodes/1.ByPKQG-z.js","../chunks/DmjnTBOd.js","../chunks/BeON-0X8.js","../chunks/BpkEXo81.js","../chunks/Cz6m6K8p.js","../nodes/2.Bd0QboKC.js","../chunks/zf4GFcxs.js","../assets/2.DKE6ochW.css"])))=>i.map(i=>d[i]); -var H=t=>{throw TypeError(t)};var J=(t,e,s)=>e.has(t)||H("Cannot "+s);var l=(t,e,s)=>(J(t,e,"read from private field"),s?s.call(t):e.get(t)),S=(t,e,s)=>e.has(t)?H("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(t):e.set(t,s),C=(t,e,s,o)=>(J(t,e,"write to private field"),o?o.call(t,s):e.set(t,s),s);import{$ as L,ab as X,o as g,aH as Z,au as M,aI as N,x as $,u as ee,j as te,aJ as re,g as j,C as se,z as ae,aK as A,A as ne,B as oe,aL as B,y as ce}from"../chunks/VJhVTb1A.js";import{h as ie,m as le,u as ue,s as fe}from"../chunks/BeON-0X8.js";import{a as w,c as I,f as W,t as me}from"../chunks/C14P8jaG.js";import{o as de}from"../chunks/Cz6m6K8p.js";import{p as T,i as D,c as V,b as q}from"../chunks/zf4GFcxs.js";function he(t){return class extends _e{constructor(e){super({component:t,...e})}}}var y,m;class _e{constructor(e){S(this,y);S(this,m);var _;var s=new Map,o=(a,r)=>{var c=N(r,!1,!1);return s.set(a,c),c};const u=new Proxy({...e.props||{},$$events:{}},{get(a,r){return g(s.get(r)??o(r,Reflect.get(a,r)))},has(a,r){return r===X?!0:(g(s.get(r)??o(r,Reflect.get(a,r))),Reflect.has(a,r))},set(a,r,c){return L(s.get(r)??o(r,c),c),Reflect.set(a,r,c)}});C(this,m,(e.hydrate?ie:le)(e.component,{target:e.target,anchor:e.anchor,props:u,context:e.context,intro:e.intro??!1,recover:e.recover,transformError:e.transformError})),(!((_=e==null?void 0:e.props)!=null&&_.$$host)||e.sync===!1)&&Z(),C(this,y,u.$$events);for(const a of Object.keys(l(this,m)))a==="$set"||a==="$destroy"||a==="$on"||M(this,a,{get(){return l(this,m)[a]},set(r){l(this,m)[a]=r},enumerable:!0});l(this,m).$set=a=>{Object.assign(u,a)},l(this,m).$destroy=()=>{ue(l(this,m))}}$set(e){l(this,m).$set(e)}$on(e,s){l(this,y)[e]=l(this,y)[e]||[];const o=(...u)=>s.call(this,...u);return l(this,y)[e].push(o),()=>{l(this,y)[e]=l(this,y)[e].filter(u=>u!==o)}}$destroy(){l(this,m).$destroy()}}y=new WeakMap,m=new WeakMap;const ve="modulepreload",ge=function(t,e){return new URL(t,e).href},K={},U=function(e,s,o){let u=Promise.resolve();if(s&&s.length>0){let a=function(i){return Promise.all(i.map(v=>Promise.resolve(v).then(b=>({status:"fulfilled",value:b}),b=>({status:"rejected",reason:b}))))};const r=document.getElementsByTagName("link"),c=document.querySelector("meta[property=csp-nonce]"),k=(c==null?void 0:c.nonce)||(c==null?void 0:c.getAttribute("nonce"));u=a(s.map(i=>{if(i=ge(i,o),i in K)return;K[i]=!0;const v=i.endsWith(".css"),b=v?'[rel="stylesheet"]':"";if(!!o)for(let n=r.length-1;n>=0;n--){const f=r[n];if(f.href===i&&(!v||f.rel==="stylesheet"))return}else if(document.querySelector(`link[href="${i}"]${b}`))return;const h=document.createElement("link");if(h.rel=v?"stylesheet":ve,v||(h.as="script"),h.crossOrigin="",h.href=i,k&&h.setAttribute("nonce",k),document.head.appendChild(h),v)return new Promise((n,f)=>{h.addEventListener("load",n),h.addEventListener("error",()=>f(new Error(`Unable to preload CSS for ${i}`)))})}))}function _(a){const r=new Event("vite:preloadError",{cancelable:!0});if(r.payload=a,window.dispatchEvent(r),!r.defaultPrevented)throw a}return u.then(a=>{for(const r of a||[])r.status==="rejected"&&_(r.reason);return e().catch(_)})},Se={};var ye=W('
        '),be=W(" ",1);function Ee(t,e){$(e,!0);let s=T(e,"components",23,()=>[]),o=T(e,"data_0",3,null),u=T(e,"data_1",3,null);ee(()=>e.stores.page.set(e.page)),te(()=>{e.stores,e.page,e.constructors,s(),e.form,o(),u(),e.stores.page.notify()});let _=A(!1),a=A(!1),r=A(null);de(()=>{const n=e.stores.page.subscribe(()=>{g(_)&&(L(a,!0),re().then(()=>{L(r,document.title||"untitled page",!0)}))});return L(_,!0),n});const c=B(()=>e.constructors[1]);var k=be(),i=j(k);{var v=n=>{const f=B(()=>e.constructors[0]);var E=I(),x=j(E);V(x,()=>g(f),(P,R)=>{q(R(P,{get data(){return o()},get form(){return e.form},get params(){return e.page.params},children:(d,Re)=>{var G=I(),p=j(G);V(p,()=>g(c),(F,Q)=>{q(Q(F,{get data(){return u()},get form(){return e.form},get params(){return e.page.params}}),O=>s()[1]=O,()=>{var O;return(O=s())==null?void 0:O[1]})}),w(d,G)},$$slots:{default:!0}}),d=>s()[0]=d,()=>{var d;return(d=s())==null?void 0:d[0]})}),w(n,E)},b=n=>{const f=B(()=>e.constructors[0]);var E=I(),x=j(E);V(x,()=>g(f),(P,R)=>{q(R(P,{get data(){return o()},get form(){return e.form},get params(){return e.page.params}}),d=>s()[0]=d,()=>{var d;return(d=s())==null?void 0:d[0]})}),w(n,E)};D(i,n=>{e.constructors[1]?n(v):n(b,-1)})}var z=se(i,2);{var h=n=>{var f=ye(),E=ne(f);{var x=P=>{var R=me();ce(()=>fe(R,g(r))),w(P,R)};D(E,P=>{g(a)&&P(x)})}oe(f),w(n,f)};D(z,n=>{g(_)&&n(h)})}w(t,k),ae()}const Ce=he(Ee),Ae=[()=>U(()=>import("../nodes/0.DecrOZwe.js"),__vite__mapDeps([0,1,2,3,4]),import.meta.url),()=>U(()=>import("../nodes/1.ByPKQG-z.js"),__vite__mapDeps([5,1,2,6,7,8,9]),import.meta.url),()=>U(()=>import("../nodes/2.Bd0QboKC.js"),__vite__mapDeps([10,1,2,9,11,4,7,3,6,12]),import.meta.url)],Be=[],Ie={"/":[2]},Y={handleError:(({error:t})=>{console.error(t)}),reroute:(()=>{}),transport:{}},Pe=Object.fromEntries(Object.entries(Y.transport).map(([t,e])=>[t,e.decode])),Te=Object.fromEntries(Object.entries(Y.transport).map(([t,e])=>[t,e.encode])),De=!1,Ve=(t,e)=>Pe[t](e);export{Ve as decode,Pe as decoders,Ie as dictionary,Te as encoders,De as hash,Y as hooks,Se as matchers,Ae as nodes,Ce as root,Be as server_loads}; +const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["../nodes/0.DecrOZwe.js","../chunks/C14P8jaG.js","../chunks/VJhVTb1A.js","../chunks/CiUbu-1F.js","../chunks/U5yjBaoU.js","../nodes/1.NvMM6EdY.js","../chunks/DmjnTBOd.js","../chunks/BeON-0X8.js","../chunks/CQT0YWjJ.js","../chunks/Cz6m6K8p.js","../nodes/2.BZAvu-cK.js","../chunks/zf4GFcxs.js","../assets/2.Bl1bTUX7.css"])))=>i.map(i=>d[i]); +var H=t=>{throw TypeError(t)};var J=(t,e,s)=>e.has(t)||H("Cannot "+s);var l=(t,e,s)=>(J(t,e,"read from private field"),s?s.call(t):e.get(t)),S=(t,e,s)=>e.has(t)?H("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(t):e.set(t,s),C=(t,e,s,o)=>(J(t,e,"write to private field"),o?o.call(t,s):e.set(t,s),s);import{$ as L,ab as X,o as g,aH as Z,au as M,aI as N,x as $,u as ee,j as te,aJ as re,g as j,C as se,z as ae,aK as A,A as ne,B as oe,aL as B,y as ce}from"../chunks/VJhVTb1A.js";import{h as ie,m as le,u as ue,s as fe}from"../chunks/BeON-0X8.js";import{a as w,c as I,f as W,t as me}from"../chunks/C14P8jaG.js";import{o as de}from"../chunks/Cz6m6K8p.js";import{p as T,i as D,c as V,b as q}from"../chunks/zf4GFcxs.js";function he(t){return class extends _e{constructor(e){super({component:t,...e})}}}var y,m;class _e{constructor(e){S(this,y);S(this,m);var _;var s=new Map,o=(a,r)=>{var c=N(r,!1,!1);return s.set(a,c),c};const u=new Proxy({...e.props||{},$$events:{}},{get(a,r){return g(s.get(r)??o(r,Reflect.get(a,r)))},has(a,r){return r===X?!0:(g(s.get(r)??o(r,Reflect.get(a,r))),Reflect.has(a,r))},set(a,r,c){return L(s.get(r)??o(r,c),c),Reflect.set(a,r,c)}});C(this,m,(e.hydrate?ie:le)(e.component,{target:e.target,anchor:e.anchor,props:u,context:e.context,intro:e.intro??!1,recover:e.recover,transformError:e.transformError})),(!((_=e==null?void 0:e.props)!=null&&_.$$host)||e.sync===!1)&&Z(),C(this,y,u.$$events);for(const a of Object.keys(l(this,m)))a==="$set"||a==="$destroy"||a==="$on"||M(this,a,{get(){return l(this,m)[a]},set(r){l(this,m)[a]=r},enumerable:!0});l(this,m).$set=a=>{Object.assign(u,a)},l(this,m).$destroy=()=>{ue(l(this,m))}}$set(e){l(this,m).$set(e)}$on(e,s){l(this,y)[e]=l(this,y)[e]||[];const o=(...u)=>s.call(this,...u);return l(this,y)[e].push(o),()=>{l(this,y)[e]=l(this,y)[e].filter(u=>u!==o)}}$destroy(){l(this,m).$destroy()}}y=new WeakMap,m=new WeakMap;const ve="modulepreload",ge=function(t,e){return new URL(t,e).href},K={},U=function(e,s,o){let u=Promise.resolve();if(s&&s.length>0){let a=function(i){return Promise.all(i.map(v=>Promise.resolve(v).then(b=>({status:"fulfilled",value:b}),b=>({status:"rejected",reason:b}))))};const r=document.getElementsByTagName("link"),c=document.querySelector("meta[property=csp-nonce]"),k=(c==null?void 0:c.nonce)||(c==null?void 0:c.getAttribute("nonce"));u=a(s.map(i=>{if(i=ge(i,o),i in K)return;K[i]=!0;const v=i.endsWith(".css"),b=v?'[rel="stylesheet"]':"";if(!!o)for(let n=r.length-1;n>=0;n--){const f=r[n];if(f.href===i&&(!v||f.rel==="stylesheet"))return}else if(document.querySelector(`link[href="${i}"]${b}`))return;const h=document.createElement("link");if(h.rel=v?"stylesheet":ve,v||(h.as="script"),h.crossOrigin="",h.href=i,k&&h.setAttribute("nonce",k),document.head.appendChild(h),v)return new Promise((n,f)=>{h.addEventListener("load",n),h.addEventListener("error",()=>f(new Error(`Unable to preload CSS for ${i}`)))})}))}function _(a){const r=new Event("vite:preloadError",{cancelable:!0});if(r.payload=a,window.dispatchEvent(r),!r.defaultPrevented)throw a}return u.then(a=>{for(const r of a||[])r.status==="rejected"&&_(r.reason);return e().catch(_)})},Se={};var ye=W('
        '),be=W(" ",1);function Ee(t,e){$(e,!0);let s=T(e,"components",23,()=>[]),o=T(e,"data_0",3,null),u=T(e,"data_1",3,null);ee(()=>e.stores.page.set(e.page)),te(()=>{e.stores,e.page,e.constructors,s(),e.form,o(),u(),e.stores.page.notify()});let _=A(!1),a=A(!1),r=A(null);de(()=>{const n=e.stores.page.subscribe(()=>{g(_)&&(L(a,!0),re().then(()=>{L(r,document.title||"untitled page",!0)}))});return L(_,!0),n});const c=B(()=>e.constructors[1]);var k=be(),i=j(k);{var v=n=>{const f=B(()=>e.constructors[0]);var E=I(),x=j(E);V(x,()=>g(f),(P,R)=>{q(R(P,{get data(){return o()},get form(){return e.form},get params(){return e.page.params},children:(d,Re)=>{var G=I(),p=j(G);V(p,()=>g(c),(F,Q)=>{q(Q(F,{get data(){return u()},get form(){return e.form},get params(){return e.page.params}}),O=>s()[1]=O,()=>{var O;return(O=s())==null?void 0:O[1]})}),w(d,G)},$$slots:{default:!0}}),d=>s()[0]=d,()=>{var d;return(d=s())==null?void 0:d[0]})}),w(n,E)},b=n=>{const f=B(()=>e.constructors[0]);var E=I(),x=j(E);V(x,()=>g(f),(P,R)=>{q(R(P,{get data(){return o()},get form(){return e.form},get params(){return e.page.params}}),d=>s()[0]=d,()=>{var d;return(d=s())==null?void 0:d[0]})}),w(n,E)};D(i,n=>{e.constructors[1]?n(v):n(b,-1)})}var z=se(i,2);{var h=n=>{var f=ye(),E=ne(f);{var x=P=>{var R=me();ce(()=>fe(R,g(r))),w(P,R)};D(E,P=>{g(a)&&P(x)})}oe(f),w(n,f)};D(z,n=>{g(_)&&n(h)})}w(t,k),ae()}const Ce=he(Ee),Ae=[()=>U(()=>import("../nodes/0.DecrOZwe.js"),__vite__mapDeps([0,1,2,3,4]),import.meta.url),()=>U(()=>import("../nodes/1.NvMM6EdY.js"),__vite__mapDeps([5,1,2,6,7,8,9]),import.meta.url),()=>U(()=>import("../nodes/2.BZAvu-cK.js"),__vite__mapDeps([10,1,2,9,11,4,7,3,6,12]),import.meta.url)],Be=[],Ie={"/":[2]},Y={handleError:(({error:t})=>{console.error(t)}),reroute:(()=>{}),transport:{}},Pe=Object.fromEntries(Object.entries(Y.transport).map(([t,e])=>[t,e.decode])),Te=Object.fromEntries(Object.entries(Y.transport).map(([t,e])=>[t,e.encode])),De=!1,Ve=(t,e)=>Pe[t](e);export{Ve as decode,Pe as decoders,Ie as dictionary,Te as encoders,De as hash,Y as hooks,Se as matchers,Ae as nodes,Ce as root,Be as server_loads}; diff --git a/frontend/dist/_app/immutable/entry/start.BP9vIbbj.js b/frontend/dist/_app/immutable/entry/start.BP9vIbbj.js new file mode 100644 index 0000000..139588b --- /dev/null +++ b/frontend/dist/_app/immutable/entry/start.BP9vIbbj.js @@ -0,0 +1 @@ +import{l as o,a as r}from"../chunks/CQT0YWjJ.js";export{o as load_css,r as start}; diff --git a/frontend/dist/_app/immutable/entry/start.DjSZr7_o.js b/frontend/dist/_app/immutable/entry/start.DjSZr7_o.js deleted file mode 100644 index dee2c47..0000000 --- a/frontend/dist/_app/immutable/entry/start.DjSZr7_o.js +++ /dev/null @@ -1 +0,0 @@ -import{l as o,a as r}from"../chunks/BpkEXo81.js";export{o as load_css,r as start}; diff --git a/frontend/dist/_app/immutable/nodes/1.ByPKQG-z.js b/frontend/dist/_app/immutable/nodes/1.NvMM6EdY.js similarity index 78% rename from frontend/dist/_app/immutable/nodes/1.ByPKQG-z.js rename to frontend/dist/_app/immutable/nodes/1.NvMM6EdY.js index b8e9403..c5cbf90 100644 --- a/frontend/dist/_app/immutable/nodes/1.ByPKQG-z.js +++ b/frontend/dist/_app/immutable/nodes/1.NvMM6EdY.js @@ -1 +1 @@ -import{a as g,f as h}from"../chunks/C14P8jaG.js";import{i as l}from"../chunks/DmjnTBOd.js";import{x as v,g as d,y as x,z as _,A as e,B as o,C as $}from"../chunks/VJhVTb1A.js";import{s as p}from"../chunks/BeON-0X8.js";import{s as k,p as m}from"../chunks/BpkEXo81.js";const b={get error(){return m.error},get status(){return m.status}};k.updated.check;const i=b;var y=h("

        ",1);function j(f,n){v(n,!1),l();var t=y(),r=d(t),c=e(r,!0);o(r);var s=$(r,2),u=e(s,!0);o(s),x(()=>{var a;p(c,i.status),p(u,(a=i.error)==null?void 0:a.message)}),g(f,t),_()}export{j as component}; +import{a as g,f as h}from"../chunks/C14P8jaG.js";import{i as l}from"../chunks/DmjnTBOd.js";import{x as v,g as d,y as x,z as _,A as e,B as o,C as $}from"../chunks/VJhVTb1A.js";import{s as p}from"../chunks/BeON-0X8.js";import{s as k,p as m}from"../chunks/CQT0YWjJ.js";const b={get error(){return m.error},get status(){return m.status}};k.updated.check;const i=b;var y=h("

        ",1);function j(f,n){v(n,!1),l();var t=y(),r=d(t),c=e(r,!0);o(r);var s=$(r,2),u=e(s,!0);o(s),x(()=>{var a;p(c,i.status),p(u,(a=i.error)==null?void 0:a.message)}),g(f,t),_()}export{j as component}; diff --git a/frontend/dist/_app/immutable/nodes/2.Bd0QboKC.js b/frontend/dist/_app/immutable/nodes/2.BZAvu-cK.js similarity index 59% rename from frontend/dist/_app/immutable/nodes/2.Bd0QboKC.js rename to frontend/dist/_app/immutable/nodes/2.BZAvu-cK.js index 1736a27..f819ccc 100644 --- a/frontend/dist/_app/immutable/nodes/2.Bd0QboKC.js +++ b/frontend/dist/_app/immutable/nodes/2.BZAvu-cK.js @@ -1,5 +1,5 @@ -import{b as Pr,a as d,f as E,c as Se,t as Oe,d as Ot}from"../chunks/C14P8jaG.js";import{o as fn,a as vr}from"../chunks/Cz6m6K8p.js";import{h as Le,L as St,G as Lt,c as $r,J as qt,b as na,o as e,N as Ga,ag as Wa,O as Mn,P as It,f as pt,ay as aa,aF as Xa,ao as Tn,e as mt,a as cr,aM as Ya,s as Qa,a5 as Ja,aN as oa,aE as vn,aO as Za,a7 as An,aP as eo,aQ as to,aI as ro,aR as gt,aS as sa,a1 as no,r as la,p as ia,aT as jr,ae as ca,aU as ao,aV as oo,aC as so,m as lo,d as Er,az as ua,y as Q,F as da,aW as io,aG as co,aA as uo,D as fa,aX as va,aY as fo,aZ as vo,E as go,aw as ga,S as Lr,k as ur,a_ as ha,a$ as ho,b0 as mo,b1 as ma,b2 as po,b3 as _o,b4 as gr,b5 as bo,b6 as xo,b7 as yo,b8 as wo,b9 as ko,ba as Co,bb as So,aJ as Pt,U as Po,aK as D,_ as se,$ as v,A as C,B as h,x as Me,g as B,z as Te,C as M,j as Ee,ap as Ce,aL as O,bc as $o,q as jt,bd as Ro,be as st,bf as Eo}from"../chunks/VJhVTb1A.js";import{p as he,i as X,b as rt,c as No,l as Ge,s as Ye}from"../chunks/zf4GFcxs.js";import{i as Mo,a as To,d as le,b as qe,c as Ao,n as Lo,e as Fo,s as re,f as et}from"../chunks/BeON-0X8.js";import{s as ft}from"../chunks/CiUbu-1F.js";import{i as Do}from"../chunks/DmjnTBOd.js";import{B as Io}from"../chunks/U5yjBaoU.js";function gn(t,r){return r}function zo(t,r,a){for(var n=[],o=r.length,s,l=r.length,c=0;c{if(s){if(s.pending.delete(T),s.done.add(T),s.pending.size===0){var w=t.outrogroups;Qr(t,vn(s.done)),w.delete(s),w.size===0&&(t.outrogroups=null)}}else l-=1},!1)}if(l===0){var u=n.length===0&&a!==null;if(u){var y=a,p=y.parentNode;so(p),p.append(y),t.items.clear()}Qr(t,r,!u)}else s={pending:new Set(r),done:new Set},(t.outrogroups??(t.outrogroups=new Set)).add(s)}function Qr(t,r,a=!0){var n;if(t.pending.size>0){n=new Set;for(const l of t.pending.values())for(const c of l)n.add(t.items.get(c).e)}for(var o=0;o{var x=a();return oa(x)?x:x==null?[]:vn(x)}),w,N=new Map,A=!0;function b(x){(P.effect.f&no)===0&&(P.pending.delete(x),P.fallback=p,Oo(P,w,l,r,n),p!==null&&(w.length===0?(p.f>)===0?la(p):(p.f^=gt,lr(p,null,l)):ia(p,()=>{p=null})))}function f(x){P.pending.delete(x)}var _=na(()=>{w=e(T);var x=w.length;let S=!1;if(Le){var R=Ga(l)===Wa;R!==(x===0)&&(l=Mn(),St(l),It(!1),S=!0)}for(var m=new Set,$=mt,F=Qa(),L=0;Ls(l)):(p=cr(()=>s(Ln??(Ln=$r()))),p.f|=gt)),x>m.size&&Ya(),Le&&x>0&&St(Mn()),!A)if(N.set($,m),F){for(const[I,G]of c)m.has(I)||$.skip_effect(G.e);$.oncommit(b),$.ondiscard(f)}else b($);S&&It(!0),e(T)}),P={effect:_,items:c,pending:N,outrogroups:null,fallback:p};A=!1,Le&&(l=pt)}function nr(t){for(;t!==null&&(t.f&ao)===0;)t=t.next;return t}function Oo(t,r,a,n,o){var H,z,V,I,G,j,q,g,i;var s=(n&oo)!==0,l=r.length,c=t.items,u=nr(t.effect.first),y,p=null,T,w=[],N=[],A,b,f,_;if(s)for(_=0;_0){var L=(n&sa)!==0&&l===0?a:null;if(s){for(_=0;_{var k,U;if(T!==void 0)for(f of T)(U=(k=f.nodes)==null?void 0:k.a)==null||U.apply()})}function Ho(t,r,a,n,o,s,l,c){var u=(l&eo)!==0?(l&to)===0?ro(a,!1,!1):An(a):null,y=(l&Za)!==0?An(o):null;return{v:u,i:y,e:cr(()=>(s(r,u??a,y??o,c),()=>{t.delete(n)}))}}function lr(t,r,a){if(t.nodes)for(var n=t.nodes.start,o=t.nodes.end,s=r&&(r.f>)===0?r.nodes.start:a;n!==null;){var l=ua(n);if(s.before(n),n===o)return;n=l}}function yt(t,r,a){r===null?t.effect.first=a:r.next=a,a===null?t.effect.last=r:a.prev=r}function Fr(t,r,a=!1,n=!1,o=!1,s=!1){var l=t,c="";if(a){var u=t;Le&&(l=St(Lt(u)))}Q(()=>{var y=da;if(c===(c=r()??"")){Le&&qt();return}if(a&&!Le){y.nodes=null,u.innerHTML=c,c!==""&&Pr(Lt(u),u.lastChild);return}if(y.nodes!==null&&(io(y.nodes.start,y.nodes.end),y.nodes=null),c!==""){if(Le){pt.data;for(var p=qt(),T=p;p!==null&&(p.nodeType!==aa||p.data!=="");)T=p,p=ua(p);if(p===null)throw co(),uo;Pr(pt,T),l=St(p);return}var w=n?va:o?fo:void 0,N=fa(n?"svg":o?"math":"template",w);N.innerHTML=c;var A=n||o?N:N.content;if(Pr(Lt(A),A.lastChild),n||o)for(;Lt(A);)l.before(Lt(A));else l.before(A)}})}function We(t,r,a,n,o){var c;Le&&qt();var s=(c=r.$$slots)==null?void 0:c[a],l=!1;s===!0&&(s=r.children,l=!0),s===void 0||s(t,l?()=>n:n)}function jo(t,r,a,n,o,s){let l=Le;Le&&qt();var c=null;Le&&pt.nodeType===vo&&(c=pt,qt());var u=Le?pt:t,y=new Io(u,!1);na(()=>{const p=r()||null;var T=va;if(p===null){y.ensure(null,null);return}return y.ensure(p,w=>{if(p){if(c=Le?c:fa(p,T),Pr(c,c),n){Le&&Mo(p)&&c.append(document.createComment(""));var N=Le?Lt(c):c.appendChild($r());Le&&(N===null?It(!1):St(N)),n(c,N)}da.nodes.end=c,w.before(c)}Le&&St(w)}),()=>{}},go),ga(()=>{}),l&&(It(!0),St(u))}function Uo(t,r,a){Lr(()=>{var n=ur(()=>r(t,a==null?void 0:a())||{});if(n!=null&&n.destroy)return()=>n.destroy()})}function Vo(t,r){var a=void 0,n;ha(()=>{a!==(a=r())&&(n&&(Er(n),n=null),a&&(n=cr(()=>{Lr(()=>a(t))})))})}function pa(t){var r,a,n="";if(typeof t=="string"||typeof t=="number")n+=t;else if(typeof t=="object")if(Array.isArray(t)){var o=t.length;for(r=0;r=0;){var c=l+s;(l===0||Fn.includes(n[l-1]))&&(c===n.length||Fn.includes(n[c]))?n=(l===0?"":n.substring(0,l))+n.substring(c+1):l=c}}return n===""?null:n}function Dn(t,r=!1){var a=r?" !important;":";",n="";for(var o of Object.keys(t)){var s=t[o];s!=null&&s!==""&&(n+=" "+o+": "+s+a)}return n}function Ur(t){return t[0]!=="-"||t[1]!=="-"?t.toLowerCase():t}function Ko(t,r){if(r){var a="",n,o;if(Array.isArray(r)?(n=r[0],o=r[1]):n=r,t){t=String(t).replaceAll(/\s*\/\*.*?\*\/\s*/g,"").trim();var s=!1,l=0,c=!1,u=[];n&&u.push(...Object.keys(n).map(Ur)),o&&u.push(...Object.keys(o).map(Ur));var y=0,p=-1;const b=t.length;for(var T=0;T{Nr(t,t.__value)});r.observe(t,{childList:!0,subtree:!0,attributes:!0,attributeFilter:["value"]}),ga(()=>{r.disconnect()})}function In(t,r,a=r){var n=new WeakSet,o=!0;ma(t,"change",s=>{var l=s?"[selected]":":checked",c;if(t.multiple)c=[].map.call(t.querySelectorAll(l),ir);else{var u=t.querySelector(l)??t.querySelector("option:not([disabled])");c=u&&ir(u)}a(c),t.__value=c,mt!==null&&n.add(mt)}),Lr(()=>{var s=r();if(t===document.activeElement){var l=mt;if(n.has(l))return}if(Nr(t,s,o),o&&s===void 0){var c=t.querySelector(":checked");c!==null&&(s=ir(c),a(s))}t.__value=s,o=!1}),_a(t)}function ir(t){return"__value"in t?t.__value:t.value}const ar=Symbol("class"),or=Symbol("style"),ba=Symbol("is custom element"),xa=Symbol("is html"),Go=gr?"link":"LINK",Wo=gr?"input":"INPUT",Xo=gr?"option":"OPTION",Yo=gr?"select":"SELECT",Qo=gr?"progress":"PROGRESS";function Ke(t){if(Le){var r=!1,a=()=>{if(!r){if(r=!0,t.hasAttribute("value")){var n=t.value;ye(t,"value",null),t.value=n}if(t.hasAttribute("checked")){var o=t.checked;ye(t,"checked",null),t.checked=o}}};t.__on_r=a,ca(a),yo()}}function hn(t,r){var a=mn(t);a.value===(a.value=r??void 0)||t.value===r&&(r!==0||t.nodeName!==Qo)||(t.value=r??"")}function Jo(t,r){r?t.hasAttribute("selected")||t.setAttribute("selected",""):t.removeAttribute("selected")}function ye(t,r,a,n){var o=mn(t);Le&&(o[r]=t.getAttribute(r),r==="src"||r==="srcset"||r==="href"&&t.nodeName===Go)||o[r]!==(o[r]=a)&&(r==="loading"&&(t[Co]=a),a==null?t.removeAttribute(r):typeof a!="string"&&ya(t).includes(r)?t[r]=a:t.setAttribute(r,a))}function Zo(t,r,a,n,o=!1,s=!1){if(Le&&o&&t.nodeName===Wo){var l=t,c=l.type==="checkbox"?"defaultChecked":"defaultValue";c in a||Ke(l)}var u=mn(t),y=u[ba],p=!u[xa];let T=Le&&y;T&&It(!1);var w=r||{},N=t.nodeName===Xo;for(var A in r)A in a||(a[A]=null);a.class?a.class=dt(a.class):a[ar]&&(a.class=null),a[or]&&(a.style??(a.style=null));var b=ya(t);for(const m in a){let $=a[m];if(N&&m==="value"&&$==null){t.value=t.__value="",w[m]=$;continue}if(m==="class"){var f=t.namespaceURI==="http://www.w3.org/1999/xhtml";ke(t,f,$,n,r==null?void 0:r[ar],a[ar]),w[m]=$,w[ar]=a[ar];continue}if(m==="style"){Xe(t,$,r==null?void 0:r[or],a[or]),w[m]=$,w[or]=a[or];continue}var _=w[m];if(!($===_&&!($===void 0&&t.hasAttribute(m)))){w[m]=$;var P=m[0]+m[1];if(P!=="$$")if(P==="on"){const F={},L="$$"+m;let H=m.slice(2);var x=Fo(H);if(To(H)&&(H=H.slice(0,-7),F.capture=!0),!x&&_){if($!=null)continue;t.removeEventListener(H,w[L],F),w[L]=null}if(x)le(H,t,$),qe([H]);else if($!=null){let z=function(V){w[m].call(this,V)};w[L]=Ao(H,t,z,F)}}else if(m==="style")ye(t,m,$);else if(m==="autofocus")bo(t,!!$);else if(!y&&(m==="__value"||m==="value"&&$!=null))t.value=t.__value=$;else if(m==="selected"&&N)Jo(t,$);else{var S=m;p||(S=Lo(S));var R=S==="defaultValue"||S==="defaultChecked";if($==null&&!y&&!R)if(u[m]=null,S==="value"||S==="checked"){let F=t;const L=r===void 0;if(S==="value"){let H=F.defaultValue;F.removeAttribute(S),F.defaultValue=H,F.value=F.__value=L?H:null}else{let H=F.defaultChecked;F.removeAttribute(S),F.defaultChecked=H,F.checked=L?H:!1}}else t.removeAttribute(m);else R||b.includes(S)&&(y||typeof $!="string")?(t[S]=$,S in u&&(u[S]=xo)):typeof $!="function"&&ye(t,S,$)}}}return T&&It(!0),w}function zn(t,r,a=[],n=[],o=[],s,l=!1,c=!1){po(o,a,n,u=>{var y=void 0,p={},T=t.nodeName===Yo,w=!1;if(ha(()=>{var A=r(...u.map(e)),b=Zo(t,y,A,s,l,c);w&&T&&"value"in A&&Nr(t,A.value);for(let _ of Object.getOwnPropertySymbols(p))A[_]||Er(p[_]);for(let _ of Object.getOwnPropertySymbols(A)){var f=A[_];_.description===_o&&(!y||f!==y[_])&&(p[_]&&Er(p[_]),p[_]=cr(()=>Vo(t,()=>f))),b[_]=f}y=b}),T){var N=t;Lr(()=>{Nr(N,y.value,!0),_a(N)})}w=!0})}function mn(t){return t.__attributes??(t.__attributes={[ba]:t.nodeName.includes("-"),[xa]:t.namespaceURI===wo})}var On=new Map;function ya(t){var r=t.getAttribute("is")||t.nodeName,a=On.get(r);if(a)return a;On.set(r,a=[]);for(var n,o=t,s=Element.prototype;s!==o;){n=So(o);for(var l in n)n[l].set&&a.push(l);o=ko(o)}return a}function Ze(t,r,a=r){var n=new WeakSet;ma(t,"input",async o=>{var s=o?t.defaultValue:t.value;if(s=Br(t)?qr(s):s,a(s),mt!==null&&n.add(mt),await Pt(),s!==(s=r())){var l=t.selectionStart,c=t.selectionEnd,u=t.value.length;if(t.value=s??"",c!==null){var y=t.value.length;l===c&&c===u&&y>u?(t.selectionStart=y,t.selectionEnd=y):(t.selectionStart=l,t.selectionEnd=Math.min(c,y))}}}),(Le&&t.defaultValue!==t.value||ur(r)==null&&t.value)&&(a(Br(t)?qr(t.value):t.value),mt!==null&&n.add(mt)),Po(()=>{var o=r();if(t===document.activeElement){var s=mt;if(n.has(s))return}Br(t)&&o===qr(t.value)||t.type==="date"&&!o&&!t.value||o!==t.value&&(t.value=o??"")})}function Br(t){var r=t.type;return r==="number"||r==="range"}function qr(t){return t===""?null:+t}let bt=D(se({type:"none",props:{},resolve:null}));function es(){return e(bt)}function ot(t=void 0){const{resolve:r}=e(bt);v(bt,{type:"none",props:{},resolve:null},!0),r==null||r(t)}function ts(t){return new Promise(r=>{v(bt,{type:"run",props:{cases:t},resolve:r},!0)})}function rs(t){return new Promise(r=>{v(bt,{type:"restart",props:{cases:t},resolve:r},!0)})}function ns(t){return new Promise(r=>{v(bt,{type:"clean",props:{cases:t},resolve:r},!0)})}function tt(t,r="Alert"){return new Promise(a=>{v(bt,{type:"alert",props:{title:r,message:t},resolve:()=>a()},!0)})}function Hn(t,r="Confirm",a="OK",n="primary"){return new Promise(o=>{v(bt,{type:"confirm",props:{title:r,message:t,confirmLabel:a,confirmVariant:n},resolve:o},!0)})}function pn(t,r="",a="Input",n="",o=!1){return new Promise(s=>{v(bt,{type:"prompt",props:{title:a,message:t,value:r,placeholder:n,multiline:o},resolve:s},!0)})}var as=E('
        ');function Qt(t,r){function a(s){return document.body.appendChild(s),{destroy(){s.remove()}}}var n=as(),o=C(n);ft(o,()=>r.children),h(n),Uo(n,s=>a==null?void 0:a(s)),d(t,n)}var os=E('
        '),ss=E('
        ');function hr(t,r){Me(r,!0);const a=A=>{var b=ss(),f=C(b),_=C(f),P=C(_),x=C(P,!0);h(P);var S=M(P,2);{var R=L=>{var H=os(),z=C(H,!0);h(H),Q(()=>re(z,r.subtitle)),d(L,H)};X(S,L=>{r.subtitle&&L(R)})}h(_);var m=M(_,2);ft(m,()=>r.children);var $=M(m,2),F=C($);ft(F,()=>r.footer),h($),h(f),h(b),Q(()=>{ke(f,1,`w-[min(${n()??""},96vw)] bg-white border border-border rounded-[10px] p-4.5`),ye(f,"aria-labelledby",r.titleId),ye(P,"id",r.titleId),re(x,r.title)}),le("keydown",b,l),le("mousedown",b,u),le("click",b,y),d(A,b)};let n=he(r,"maxWidth",3,"520px"),o=he(r,"portal",3,!1);function s(){r.onCancel?r.onCancel():ot(null)}function l(A){A.key==="Escape"?s():A.key==="Enter"&&r.onConfirm&&r.onConfirm()}let c=!1;function u(A){c=A.target.dataset.backdrop!==void 0}function y(A){const b=A.target.dataset.backdrop!==void 0;c&&b&&s(),c=!1}var p=Se(),T=B(p);{var w=A=>{Qt(A,{children:(b,f)=>{a(b)}})},N=A=>{a(A)};X(T,A=>{o()?A(w):A(N,-1)})}d(t,p),Te()}qe(["keydown","mousedown","click"]);var ls=E("");function Re(t,r){let a=he(r,"variant",3,"primary"),n=he(r,"size",3,"default"),o=he(r,"disabled",3,!1);const s={default:"h-[34px] rounded-md px-3.5 leading-none text-[13px] tracking-wide",sm:"h-[30px] rounded-md px-2.5 leading-none text-xs"},l={primary:"bg-edf-bleu-moyen text-white border-none hover:bg-[rgb(12,72,170)]",secondary:"bg-white text-ink border border-border hover:bg-edf-gris-clair",run:"bg-edf-vert-fonce text-white border-none hover:bg-[rgb(38,98,12)]",warning:"bg-edf-orange-moyen text-white border-none hover:bg-[rgb(230,118,20)]",danger:"bg-edf-orange-fonce text-white border-none hover:bg-[rgb(180,56,8)]"};var c=ls(),u=C(c);ft(u,()=>r.children),h(c),Q(()=>{ke(c,1,`inline-flex items-center justify-center gap-1.5 font-bold cursor-pointer transition-colors duration-150 disabled:opacity-40 disabled:pointer-events-none ${s[n()]??""} ${l[a()]??""}`),c.disabled=o()}),le("click",c,function(...y){var p;(p=r.onclick)==null||p.apply(this,y)}),d(t,c)}qe(["click"]);var is=E(" ",1),cs=E(''),us=E(''),ds=E('
        '),fs=E('

        ',1);function vs(t,r){Me(r,!0);let a=he(r,"confirmLabel",3,"OK"),n=he(r,"confirmVariant",3,"primary"),o=he(r,"value",3,""),s=he(r,"placeholder",3,""),l=he(r,"multiline",3,!1);const c=o();let u=D(se(c)),y=D(void 0),p=D(void 0);Ee(()=>{var N;r.mode==="prompt"&&e(y)?(e(y).focus(),"select"in e(y)&&e(y).select()):e(p)&&((N=e(p).querySelector("button"))==null||N.focus())});function T(){r.mode==="prompt"?ot(e(u)):r.mode==="confirm"?ot(!0):ot()}function w(){r.mode==="confirm"?ot(!1):r.mode==="prompt"?ot(null):ot()}{const N=b=>{var f=is(),_=B(f);{var P=R=>{Re(R,{variant:"secondary",onclick:w,children:(m,$)=>{Ce();var F=Oe("Cancel");d(m,F)},$$slots:{default:!0}})};X(_,R=>{r.mode!=="alert"&&R(P)})}var x=M(_,2),S=C(x);Re(S,{get variant(){return n()},onclick:T,children:(R,m)=>{Ce();var $=Oe();Q(()=>re($,a())),d(R,$)},$$slots:{default:!0}}),h(x),rt(x,R=>v(p,R),()=>e(p)),d(b,f)};let A=O(()=>l()?void 0:T);hr(t,{get title(){return r.title},titleId:"app-dialog-title",get onConfirm(){return e(A)},onCancel:w,footer:N,children:(b,f)=>{var _=fs(),P=B(_),x=C(P,!0);h(P);var S=M(P,2);{var R=m=>{var $=ds(),F=C($);{var L=z=>{var V=cs();$o(V),rt(V,I=>v(y,I),()=>e(y)),Q(()=>ye(V,"placeholder",s())),Ze(V,()=>e(u),I=>v(u,I)),d(z,V)},H=z=>{var V=us();Ke(V),rt(V,I=>v(y,I),()=>e(y)),Q(()=>ye(V,"placeholder",s())),Ze(V,()=>e(u),I=>v(u,I)),d(z,V)};X(F,z=>{l()?z(L):z(H,-1)})}h($),d(m,$)};X(S,m=>{r.mode==="prompt"&&m(R)})}Q(()=>re(x,r.message)),d(b,_)},$$slots:{footer:!0,default:!0}})}Te()}var gs=E('');function Ne(t,r){var a=gs(),n=C(a),o=M(n);ft(o,()=>r.children),h(a),Q(()=>re(n,`${r.text??""} `)),d(t,a)}function kt(t,r){const a=localStorage.getItem(t);if(a===null)return r;const n=Number(a);return Number.isFinite(n)?n:r}function Ct(t,r){Number.isFinite(r)&&localStorage.setItem(t,String(r))}function hs(t,r){return localStorage.getItem(t)??r}function ms(){return{n:kt("csauto_run_n",1),nt:kt("csauto_run_nt",1),maxParallel:kt("csauto_run_max_parallel",0)||null}}function ps(t){Ct("csauto_run_n",t.n),Ct("csauto_run_nt",t.nt),t.maxParallel&&Ct("csauto_run_max_parallel",t.maxParallel)}function _s(){return{n:kt("csauto_restart_n",1),nt:kt("csauto_restart_nt",1),maxParallel:kt("csauto_restart_max_parallel",0)||null,mode:hs("csauto_restart_mode",""),value:kt("csauto_restart_value",100)}}function bs(t){Ct("csauto_restart_n",t.n),Ct("csauto_restart_nt",t.nt),t.maxParallel&&Ct("csauto_restart_max_parallel",t.maxParallel),localStorage.setItem("csauto_restart_mode",t.mode),Ct("csauto_restart_value",t.value)}function xs(){return{keepLast:kt("csauto_clean_keep_last",1)}}function ys(t){Ct("csauto_clean_keep_last",t.keepLast)}var ws=E(" ",1),ks=E(''),Cs=E(''),Ss=E(''),Ps=E('
        ');function $s(t,r){Me(r,!0);const a=ms(),n=a.maxParallel??(r.cases.length>1?r.cases.length:0);let o=D(se(a.n)),s=D(se(a.nt)),l=D(se(n));async function c(){if(!Number.isFinite(e(o))||e(o)<=0){await tt("MPI ranks must be an integer > 0.","Invalid value");return}if(!Number.isFinite(e(s))||e(s)<=0){await tt("Threads must be an integer > 0.","Invalid value");return}if(e(l)&&(!Number.isFinite(e(l))||e(l)<=0)){await tt("Max parallel must be empty or > 0.","Invalid value");return}const u={n:e(o),nt:e(s),maxParallel:e(l)||null};ps(u),ot(u)}{const u=T=>{var w=ws(),N=B(w);Re(N,{variant:"secondary",onclick:()=>ot(null),children:(b,f)=>{Ce();var _=Oe("Cancel");d(b,_)},$$slots:{default:!0}});var A=M(N,2);Re(A,{variant:"run",onclick:c,children:(b,f)=>{Ce();var _=Oe("Run");d(b,_)},$$slots:{default:!0}}),d(T,w)};let y=O(()=>r.cases.length),p=O(()=>r.cases.length>1?"s":"");hr(t,{title:"Run Cases",titleId:"run-dialog-title",get subtitle(){return`${e(y)??""} case${e(p)??""} selected`},onConfirm:c,footer:u,children:(T,w)=>{var N=Ps(),A=C(N);Ne(A,{text:"MPI Ranks (n)",children:(_,P)=>{var x=ks();Ke(x),Ze(x,()=>e(o),S=>v(o,S)),d(_,x)}});var b=M(A,2);Ne(b,{text:"OMP Threads (nt)",children:(_,P)=>{var x=Cs();Ke(x),Ze(x,()=>e(s),S=>v(s,S)),d(_,x)}});var f=M(b,2);Ne(f,{text:"Max Parallel",children:(_,P)=>{var x=Ss();Ke(x),Ze(x,()=>e(l),S=>v(l,S)),d(_,x)}}),h(N),d(T,N)},$$slots:{footer:!0,default:!0}})}Te()}const Jr="csauto_token";let wa=D(se(localStorage.getItem(Jr)??""));function _n(){return e(wa)}function ka(t){v(wa,t,!0),t?localStorage.setItem(Jr,t):localStorage.removeItem(Jr)}let kr=null;async function bn(t,r={}){const a=new Headers(r.headers),n=_n();n&&a.set("X-CSAUTO-TOKEN",n);const o=await fetch(t,{...r,headers:a});if(o.status===401){kr||(kr=pn("API token required:",n,"Authentication"));const s=await kr;return kr=null,s===null?o:(ka(s),a.set("X-CSAUTO-TOKEN",s),fetch(t,{...r,headers:a}))}return o}async function it(t){const r=await bn(t);if(!r.ok)throw new Error(`GET ${t} failed: ${r.status}`);return r.json()}async function xn(t){const r=await bn(t);if(!r.ok)throw new Error(`GET ${t} failed: ${r.status}`);return r.text()}async function Et(t,r){const a=await bn(t,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(r)});if(!a.ok){const n=await a.text().catch(()=>a.statusText);throw new Error(`POST ${t} failed (${a.status}): ${n}`)}return a.json()}function Dr(t){return t.map(r=>`case=${encodeURIComponent(r)}`).join("&")}function Rs(t=!1){return it(`/api/status${t?"?log=1":""}`)}function jn(t){return it(`/api/perf?${Dr(t)}`)}function Es(){return it("/api/app_config")}function Ns(t){return`/api/solver_logo?solver=${encodeURIComponent(t)}`}function Ms(t){return`/api/solver_icon?solver=${encodeURIComponent(t)}`}function Ts(t){return it(`/api/residual_columns?${Dr(t)}`).then(r=>r.columns??[])}function As(t,r,a={}){const n=new URLSearchParams;return t.forEach(o=>n.append("case",o)),n.set("columns",r.join(",")),a.width&&n.set("width",String(a.width)),a.height&&n.set("height",String(a.height)),a.xMin!==void 0&&n.set("x_min",String(a.xMin)),a.includeHistory&&n.set("include_history","true"),xn(`/api/residuals_svg?${n}`)}function Ca(t){return it(`/api/restart_origin?${Dr(t)}`)}function Ls(t){var a;const r=new URLSearchParams;return t.cases.forEach(n=>r.append("case",n)),(a=t.files)!=null&&a.length&&r.set("files",t.files.join(",")),t.maxHits&&r.set("max_hits",String(t.maxHits)),t.context!==void 0&&r.set("context",String(t.context)),t.sev&&r.set("sev",t.sev),t.q&&r.set("q",t.q),it(`/api/recent_errors?${r}`)}function Fs(t){return it(`/api/tail_files?case=${encodeURIComponent(t)}`).then(r=>r.files??[])}function Ds(t,r,a){const n=new URLSearchParams({case:t,file:r,n:String(a)});return it(`/api/tail_lines?${n}`)}function Sa(t){return it(`/api/resu_dirs?${Dr(t)}`).then(r=>r.dirs??[])}function Zr(t,r){const a=new URLSearchParams({scope:r});return t.forEach(n=>a.append("case",n)),it(`/api/probes?${a}`).then(n=>n.files??[])}function Is(t,r){const a=new URLSearchParams;return t.forEach(n=>a.append("case",n)),r.forEach(n=>a.append("probe",n)),it(`/api/probe_columns?${a}`).then(n=>n.columns??[])}function zs(t,r,a){const n=new URLSearchParams({case:t,probe:r});return a.forEach(o=>n.append("column",o)),it(`/api/probe_position?${n}`)}function Os(t){const r=new URLSearchParams;return t.cases.forEach(a=>r.append("case",a)),t.probes.forEach(a=>r.append("probe",a)),r.set("columns",t.columns.join(",")),t.axis&&r.set("axis",t.axis),t.xMin!==void 0&&r.set("x_min",String(t.xMin)),t.timeMin!==void 0&&r.set("time_min",String(t.timeMin)),r.set("include_history","true"),t.width&&r.set("width",String(t.width)),t.height&&r.set("height",String(t.height)),xn(`/api/probe_svg?${r}`)}function Hs(t){const r=new URLSearchParams;return t.cases.forEach(a=>r.append("case",a)),t.base&&r.set("base",t.base),t.kind&&r.set("kind",t.kind),t.filter&&r.set("filter",t.filter),xn(`/api/compare_runs?${r}`)}function Un(t){return Et("/api/run_case",{cases:t.cases,n:t.n,nt:t.nt,max_parallel:t.maxParallel??void 0,restart:t.restart??!1,restart_mode:t.restartMode??"",restart_value:t.restartValue??void 0,restart_path:t.restartPath||void 0}).then(()=>{})}function js(t){return Et("/api/kill_case",{cases:t}).then(()=>{})}function Us(t){return Et("/api/control_case",{cases:t.cases,action:t.action,value:t.value??null}).then(()=>{})}function Vs(t){return Et("/api/cleanup_cases",{cases:t.cases,keep_last:t.keepLast??1,prune_resu:t.pruneResu??!0,keep_resu:t.keepResu??[],delete_resu:t.deleteResu??[],max_log_mb:t.maxLogMb??50,clear_cid:!0,clear_pyc:!1})}function Bs(t,r){return Et("/api/case_note",{case:t,note:r}).then(()=>{})}function qs(t,r){return Et("/api/case_convergence",{case:t,convergence:r}).then(()=>{})}function Ks(t){return Et("/api/open_gui",{case:t}).then(()=>{})}function Gs(){return it("/api/settings/telemetry")}function Ws(t){return Et("/api/settings/telemetry",{enabled:t})}const Xs=["status","tail","errors"],Ys=3e4;let dr=D(null),Kr=!1,Gr=1e3,Vn;function $t(){return e(dr)}async function Pa(){if(!(e(dr)||Kr)){clearTimeout(Vn),Kr=!0;try{v(dr,await Es(),!0)}catch{Vn=setTimeout(Pa,Gr),Gr=Math.min(Gr*2,Ys)}finally{Kr=!1}}}function Tt(t){var r;return(((r=e(dr))==null?void 0:r.panels)??Xs).includes(t)}function en(t){var r;return((r=e(dr))==null?void 0:r.capabilities.includes(t))??!1}function yn(t){return t.map(r=>({value:r,label:r}))}function $a(t,r){return Number.isFinite(r)?r<=0?`${t.value_label} must be greater than 0.`:t.value_kind==="int"&&!Number.isInteger(r)?`${t.value_label} must be a whole number.`:"":`${t.value_label} must be a number.`}var Qs=E(" ",1),Js=E(''),Zs=E(''),el=E(''),tl=E(""),rl=E(""),nl=E(''),al=E(""),ol=E(""),sl=E('
        ',1);function ll(t,r){var A,b;Me(r,!0);const a=((A=$t())==null?void 0:A.restart_modes)??[],n=_s(),o=n.maxParallel??(r.cases.length>1?r.cases.length:0);let s=D(se(n.n)),l=D(se(n.nt)),c=D(se(o)),u=D(se(a.some(f=>f.name===n.mode)?n.mode:((b=a[0])==null?void 0:b.name)??"")),y=D(se(n.value)),p=D(""),T=D(se([])),w=O(()=>a.find(f=>f.name===e(u)));fn(async()=>{if(r.cases.length===1)try{v(T,await Sa(r.cases),!0)}catch{v(T,[],!0)}});async function N(){var P,x;if(!Number.isFinite(e(s))||e(s)<=0){await tt("MPI ranks must be an integer > 0.","Invalid value");return}if(!Number.isFinite(e(l))||e(l)<=0){await tt("Threads must be an integer > 0.","Invalid value");return}if(e(c)&&(!Number.isFinite(e(c))||e(c)<=0)){await tt("Max parallel must be empty or > 0.","Invalid value");return}const f=(P=e(w))!=null&&P.value_label?$a(e(w),e(y)):"";if(f){await tt(f,"Invalid value");return}const _={n:e(s),nt:e(l),maxParallel:e(c)||null,restartMode:e(u),restartValue:(x=e(w))!=null&&x.value_label?e(y):null,restartPath:e(p)||null};bs({n:e(s),nt:e(l),maxParallel:e(c)||null,mode:e(u),value:e(y)}),ot(_)}{const f=x=>{var S=Qs(),R=B(S);Re(R,{variant:"secondary",onclick:()=>ot(null),children:($,F)=>{Ce();var L=Oe("Cancel");d($,L)},$$slots:{default:!0}});var m=M(R,2);Re(m,{variant:"warning",onclick:N,children:($,F)=>{Ce();var L=Oe("Restart");d($,L)},$$slots:{default:!0}}),d(x,S)};let _=O(()=>r.cases.length),P=O(()=>r.cases.length>1?"s":"");hr(t,{title:"Restart Cases",titleId:"restart-dialog-title",get subtitle(){return`${e(_)??""} case${e(P)??""} selected`},onConfirm:N,footer:f,children:(x,S)=>{var R=sl(),m=B(R),$=C(m);Ne($,{text:"MPI Ranks (n)",children:(q,g)=>{var i=Js();Ke(i),Ze(i,()=>e(s),k=>v(s,k)),d(q,i)}});var F=M($,2);Ne(F,{text:"OMP Threads (nt)",children:(q,g)=>{var i=Zs();Ke(i),Ze(i,()=>e(l),k=>v(l,k)),d(q,i)}});var L=M(F,2);Ne(L,{text:"Max Parallel",children:(q,g)=>{var i=el();Ke(i),Ze(i,()=>e(c),k=>v(c,k)),d(q,i)}}),h(m);var H=M(m,2),z=C(H);{var V=q=>{Ne(q,{text:"Mode",children:(g,i)=>{var k=rl();Ue(k,21,()=>a,U=>U.name,(U,W)=>{var ee=tl(),ne=C(ee,!0);h(ee);var pe={};Q(()=>{re(ne,e(W).label),pe!==(pe=e(W).name)&&(ee.value=(ee.__value=e(W).name)??"")}),d(U,ee)}),h(k),In(k,()=>e(u),U=>v(u,U)),d(g,k)}})};X(z,q=>{a.length>0&&q(V)})}var I=M(z,2);{var G=q=>{Ne(q,{get text(){return e(w).value_label},children:(g,i)=>{var k=nl();Ke(k),Q(()=>{ye(k,"min",e(w).value_kind==="int"?"1":"0"),ye(k,"step",e(w).value_kind==="int"?"1":"any")}),Ze(k,()=>e(y),U=>v(y,U)),d(g,k)}})};X(I,q=>{var g;(g=e(w))!=null&&g.value_label&&q(G)})}var j=M(I,2);Ne(j,{text:"Restart from",children:(q,g)=>{var i=ol(),k=C(i);k.value=k.__value="";var U=M(k);Ue(U,16,()=>e(T),W=>W,(W,ee)=>{var ne=al(),pe=C(ne,!0);h(ne);var K={};Q(()=>{re(pe,ee),K!==(K=ee)&&(ne.value=(ne.__value=ee)??"")}),d(W,ne)}),h(i),Q(()=>{i.disabled=r.cases.length>1,ye(i,"title",r.cases.length>1?"Each case restarts from its own latest run":void 0)}),In(i,()=>e(p),W=>v(p,W)),d(q,i)}}),h(H),d(x,R)},$$slots:{footer:!0,default:!0}})}Te()}function Fe(t,r){let a=he(r,"size",3,14);var n=Se(),o=B(n);No(o,()=>r.icon,(s,l)=>{l(s,{get size(){return a()},class:"icon"})}),d(t,n)}/** +import{b as Pr,a as d,f as E,c as Se,t as Oe,d as Ot}from"../chunks/C14P8jaG.js";import{o as fn,a as vr}from"../chunks/Cz6m6K8p.js";import{h as Le,L as St,G as Lt,c as $r,J as qt,b as aa,o as e,N as Wa,ag as Xa,O as Mn,P as It,f as pt,ay as oa,aF as Ya,ao as Tn,e as mt,a as cr,aM as Qa,s as Ja,a5 as Za,aN as sa,aE as vn,aO as eo,a7 as An,aP as to,aQ as ro,aI as no,aR as gt,aS as ia,a1 as ao,r as la,p as ca,aT as jr,ae as ua,aU as oo,aV as so,aC as io,m as lo,d as Er,az as da,y as Q,F as fa,aW as co,aG as uo,aA as fo,D as va,aX as ga,aY as vo,aZ as go,E as ho,aw as ha,S as Lr,k as ur,a_ as ma,a$ as mo,b0 as po,b1 as pa,b2 as _o,b3 as bo,b4 as gr,b5 as xo,b6 as yo,b7 as wo,b8 as ko,b9 as Co,ba as So,bb as Po,aJ as Pt,U as $o,aK as D,_ as se,$ as v,A as k,B as h,x as Me,g as B,z as Te,C as M,j as Ee,ap as Ce,aL as O,bc as Ro,q as jt,bd as Eo,be as st,bf as No}from"../chunks/VJhVTb1A.js";import{p as he,i as X,b as rt,c as Mo,l as Ge,s as Ye}from"../chunks/zf4GFcxs.js";import{i as To,a as Ao,d as ie,b as qe,c as Lo,n as Fo,e as Do,s as re,f as et}from"../chunks/BeON-0X8.js";import{s as ft}from"../chunks/CiUbu-1F.js";import{i as Io}from"../chunks/DmjnTBOd.js";import{B as zo}from"../chunks/U5yjBaoU.js";function gn(t,r){return r}function Oo(t,r,a){for(var n=[],o=r.length,s,i=r.length,c=0;c{if(s){if(s.pending.delete(T),s.done.add(T),s.pending.size===0){var y=t.outrogroups;Qr(t,vn(s.done)),y.delete(s),y.size===0&&(t.outrogroups=null)}}else i-=1},!1)}if(i===0){var u=n.length===0&&a!==null;if(u){var w=a,p=w.parentNode;io(p),p.append(w),t.items.clear()}Qr(t,r,!u)}else s={pending:new Set(r),done:new Set},(t.outrogroups??(t.outrogroups=new Set)).add(s)}function Qr(t,r,a=!0){var n;if(t.pending.size>0){n=new Set;for(const i of t.pending.values())for(const c of i)n.add(t.items.get(c).e)}for(var o=0;o{var x=a();return sa(x)?x:x==null?[]:vn(x)}),y,N=new Map,A=!0;function b(x){(P.effect.f&ao)===0&&(P.pending.delete(x),P.fallback=p,Ho(P,y,i,r,n),p!==null&&(y.length===0?(p.f>)===0?la(p):(p.f^=gt,ir(p,null,i)):ca(p,()=>{p=null})))}function f(x){P.pending.delete(x)}var _=aa(()=>{y=e(T);var x=y.length;let S=!1;if(Le){var R=Wa(i)===Xa;R!==(x===0)&&(i=Mn(),St(i),It(!1),S=!0)}for(var m=new Set,$=mt,F=Ja(),L=0;Ls(i)):(p=cr(()=>s(Ln??(Ln=$r()))),p.f|=gt)),x>m.size&&Qa(),Le&&x>0&&St(Mn()),!A)if(N.set($,m),F){for(const[I,G]of c)m.has(I)||$.skip_effect(G.e);$.oncommit(b),$.ondiscard(f)}else b($);S&&It(!0),e(T)}),P={effect:_,items:c,pending:N,outrogroups:null,fallback:p};A=!1,Le&&(i=pt)}function nr(t){for(;t!==null&&(t.f&oo)===0;)t=t.next;return t}function Ho(t,r,a,n,o){var j,z,V,I,G,U,q,g,l;var s=(n&so)!==0,i=r.length,c=t.items,u=nr(t.effect.first),w,p=null,T,y=[],N=[],A,b,f,_;if(s)for(_=0;_0){var L=(n&ia)!==0&&i===0?a:null;if(s){for(_=0;_{var C,H;if(T!==void 0)for(f of T)(H=(C=f.nodes)==null?void 0:C.a)==null||H.apply()})}function jo(t,r,a,n,o,s,i,c){var u=(i&to)!==0?(i&ro)===0?no(a,!1,!1):An(a):null,w=(i&eo)!==0?An(o):null;return{v:u,i:w,e:cr(()=>(s(r,u??a,w??o,c),()=>{t.delete(n)}))}}function ir(t,r,a){if(t.nodes)for(var n=t.nodes.start,o=t.nodes.end,s=r&&(r.f>)===0?r.nodes.start:a;n!==null;){var i=da(n);if(s.before(n),n===o)return;n=i}}function yt(t,r,a){r===null?t.effect.first=a:r.next=a,a===null?t.effect.last=r:a.prev=r}function Fr(t,r,a=!1,n=!1,o=!1,s=!1){var i=t,c="";if(a){var u=t;Le&&(i=St(Lt(u)))}Q(()=>{var w=fa;if(c===(c=r()??"")){Le&&qt();return}if(a&&!Le){w.nodes=null,u.innerHTML=c,c!==""&&Pr(Lt(u),u.lastChild);return}if(w.nodes!==null&&(co(w.nodes.start,w.nodes.end),w.nodes=null),c!==""){if(Le){pt.data;for(var p=qt(),T=p;p!==null&&(p.nodeType!==oa||p.data!=="");)T=p,p=da(p);if(p===null)throw uo(),fo;Pr(pt,T),i=St(p);return}var y=n?ga:o?vo:void 0,N=va(n?"svg":o?"math":"template",y);N.innerHTML=c;var A=n||o?N:N.content;if(Pr(Lt(A),A.lastChild),n||o)for(;Lt(A);)i.before(Lt(A));else i.before(A)}})}function We(t,r,a,n,o){var c;Le&&qt();var s=(c=r.$$slots)==null?void 0:c[a],i=!1;s===!0&&(s=r.children,i=!0),s===void 0||s(t,i?()=>n:n)}function Uo(t,r,a,n,o,s){let i=Le;Le&&qt();var c=null;Le&&pt.nodeType===go&&(c=pt,qt());var u=Le?pt:t,w=new zo(u,!1);aa(()=>{const p=r()||null;var T=ga;if(p===null){w.ensure(null,null);return}return w.ensure(p,y=>{if(p){if(c=Le?c:va(p,T),Pr(c,c),n){Le&&To(p)&&c.append(document.createComment(""));var N=Le?Lt(c):c.appendChild($r());Le&&(N===null?It(!1):St(N)),n(c,N)}fa.nodes.end=c,y.before(c)}Le&&St(y)}),()=>{}},ho),ha(()=>{}),i&&(It(!0),St(u))}function Vo(t,r,a){Lr(()=>{var n=ur(()=>r(t,a==null?void 0:a())||{});if(n!=null&&n.destroy)return()=>n.destroy()})}function Bo(t,r){var a=void 0,n;ma(()=>{a!==(a=r())&&(n&&(Er(n),n=null),a&&(n=cr(()=>{Lr(()=>a(t))})))})}function _a(t){var r,a,n="";if(typeof t=="string"||typeof t=="number")n+=t;else if(typeof t=="object")if(Array.isArray(t)){var o=t.length;for(r=0;r=0;){var c=i+s;(i===0||Fn.includes(n[i-1]))&&(c===n.length||Fn.includes(n[c]))?n=(i===0?"":n.substring(0,i))+n.substring(c+1):i=c}}return n===""?null:n}function Dn(t,r=!1){var a=r?" !important;":";",n="";for(var o of Object.keys(t)){var s=t[o];s!=null&&s!==""&&(n+=" "+o+": "+s+a)}return n}function Ur(t){return t[0]!=="-"||t[1]!=="-"?t.toLowerCase():t}function Go(t,r){if(r){var a="",n,o;if(Array.isArray(r)?(n=r[0],o=r[1]):n=r,t){t=String(t).replaceAll(/\s*\/\*.*?\*\/\s*/g,"").trim();var s=!1,i=0,c=!1,u=[];n&&u.push(...Object.keys(n).map(Ur)),o&&u.push(...Object.keys(o).map(Ur));var w=0,p=-1;const b=t.length;for(var T=0;T{Nr(t,t.__value)});r.observe(t,{childList:!0,subtree:!0,attributes:!0,attributeFilter:["value"]}),ha(()=>{r.disconnect()})}function In(t,r,a=r){var n=new WeakSet,o=!0;pa(t,"change",s=>{var i=s?"[selected]":":checked",c;if(t.multiple)c=[].map.call(t.querySelectorAll(i),lr);else{var u=t.querySelector(i)??t.querySelector("option:not([disabled])");c=u&&lr(u)}a(c),t.__value=c,mt!==null&&n.add(mt)}),Lr(()=>{var s=r();if(t===document.activeElement){var i=mt;if(n.has(i))return}if(Nr(t,s,o),o&&s===void 0){var c=t.querySelector(":checked");c!==null&&(s=lr(c),a(s))}t.__value=s,o=!1}),ba(t)}function lr(t){return"__value"in t?t.__value:t.value}const ar=Symbol("class"),or=Symbol("style"),xa=Symbol("is custom element"),ya=Symbol("is html"),Wo=gr?"link":"LINK",Xo=gr?"input":"INPUT",Yo=gr?"option":"OPTION",Qo=gr?"select":"SELECT",Jo=gr?"progress":"PROGRESS";function Ke(t){if(Le){var r=!1,a=()=>{if(!r){if(r=!0,t.hasAttribute("value")){var n=t.value;ye(t,"value",null),t.value=n}if(t.hasAttribute("checked")){var o=t.checked;ye(t,"checked",null),t.checked=o}}};t.__on_r=a,ua(a),wo()}}function hn(t,r){var a=mn(t);a.value===(a.value=r??void 0)||t.value===r&&(r!==0||t.nodeName!==Jo)||(t.value=r??"")}function Zo(t,r){r?t.hasAttribute("selected")||t.setAttribute("selected",""):t.removeAttribute("selected")}function ye(t,r,a,n){var o=mn(t);Le&&(o[r]=t.getAttribute(r),r==="src"||r==="srcset"||r==="href"&&t.nodeName===Wo)||o[r]!==(o[r]=a)&&(r==="loading"&&(t[So]=a),a==null?t.removeAttribute(r):typeof a!="string"&&wa(t).includes(r)?t[r]=a:t.setAttribute(r,a))}function es(t,r,a,n,o=!1,s=!1){if(Le&&o&&t.nodeName===Xo){var i=t,c=i.type==="checkbox"?"defaultChecked":"defaultValue";c in a||Ke(i)}var u=mn(t),w=u[xa],p=!u[ya];let T=Le&&w;T&&It(!1);var y=r||{},N=t.nodeName===Yo;for(var A in r)A in a||(a[A]=null);a.class?a.class=dt(a.class):a[ar]&&(a.class=null),a[or]&&(a.style??(a.style=null));var b=wa(t);for(const m in a){let $=a[m];if(N&&m==="value"&&$==null){t.value=t.__value="",y[m]=$;continue}if(m==="class"){var f=t.namespaceURI==="http://www.w3.org/1999/xhtml";ke(t,f,$,n,r==null?void 0:r[ar],a[ar]),y[m]=$,y[ar]=a[ar];continue}if(m==="style"){Xe(t,$,r==null?void 0:r[or],a[or]),y[m]=$,y[or]=a[or];continue}var _=y[m];if(!($===_&&!($===void 0&&t.hasAttribute(m)))){y[m]=$;var P=m[0]+m[1];if(P!=="$$")if(P==="on"){const F={},L="$$"+m;let j=m.slice(2);var x=Do(j);if(Ao(j)&&(j=j.slice(0,-7),F.capture=!0),!x&&_){if($!=null)continue;t.removeEventListener(j,y[L],F),y[L]=null}if(x)ie(j,t,$),qe([j]);else if($!=null){let z=function(V){y[m].call(this,V)};y[L]=Lo(j,t,z,F)}}else if(m==="style")ye(t,m,$);else if(m==="autofocus")xo(t,!!$);else if(!w&&(m==="__value"||m==="value"&&$!=null))t.value=t.__value=$;else if(m==="selected"&&N)Zo(t,$);else{var S=m;p||(S=Fo(S));var R=S==="defaultValue"||S==="defaultChecked";if($==null&&!w&&!R)if(u[m]=null,S==="value"||S==="checked"){let F=t;const L=r===void 0;if(S==="value"){let j=F.defaultValue;F.removeAttribute(S),F.defaultValue=j,F.value=F.__value=L?j:null}else{let j=F.defaultChecked;F.removeAttribute(S),F.defaultChecked=j,F.checked=L?j:!1}}else t.removeAttribute(m);else R||b.includes(S)&&(w||typeof $!="string")?(t[S]=$,S in u&&(u[S]=yo)):typeof $!="function"&&ye(t,S,$)}}}return T&&It(!0),y}function zn(t,r,a=[],n=[],o=[],s,i=!1,c=!1){_o(o,a,n,u=>{var w=void 0,p={},T=t.nodeName===Qo,y=!1;if(ma(()=>{var A=r(...u.map(e)),b=es(t,w,A,s,i,c);y&&T&&"value"in A&&Nr(t,A.value);for(let _ of Object.getOwnPropertySymbols(p))A[_]||Er(p[_]);for(let _ of Object.getOwnPropertySymbols(A)){var f=A[_];_.description===bo&&(!w||f!==w[_])&&(p[_]&&Er(p[_]),p[_]=cr(()=>Bo(t,()=>f))),b[_]=f}w=b}),T){var N=t;Lr(()=>{Nr(N,w.value,!0),ba(N)})}y=!0})}function mn(t){return t.__attributes??(t.__attributes={[xa]:t.nodeName.includes("-"),[ya]:t.namespaceURI===ko})}var On=new Map;function wa(t){var r=t.getAttribute("is")||t.nodeName,a=On.get(r);if(a)return a;On.set(r,a=[]);for(var n,o=t,s=Element.prototype;s!==o;){n=Po(o);for(var i in n)n[i].set&&a.push(i);o=Co(o)}return a}function Ze(t,r,a=r){var n=new WeakSet;pa(t,"input",async o=>{var s=o?t.defaultValue:t.value;if(s=Br(t)?qr(s):s,a(s),mt!==null&&n.add(mt),await Pt(),s!==(s=r())){var i=t.selectionStart,c=t.selectionEnd,u=t.value.length;if(t.value=s??"",c!==null){var w=t.value.length;i===c&&c===u&&w>u?(t.selectionStart=w,t.selectionEnd=w):(t.selectionStart=i,t.selectionEnd=Math.min(c,w))}}}),(Le&&t.defaultValue!==t.value||ur(r)==null&&t.value)&&(a(Br(t)?qr(t.value):t.value),mt!==null&&n.add(mt)),$o(()=>{var o=r();if(t===document.activeElement){var s=mt;if(n.has(s))return}Br(t)&&o===qr(t.value)||t.type==="date"&&!o&&!t.value||o!==t.value&&(t.value=o??"")})}function Br(t){var r=t.type;return r==="number"||r==="range"}function qr(t){return t===""?null:+t}let bt=D(se({type:"none",props:{},resolve:null}));function ts(){return e(bt)}function ot(t=void 0){const{resolve:r}=e(bt);v(bt,{type:"none",props:{},resolve:null},!0),r==null||r(t)}function rs(t){return new Promise(r=>{v(bt,{type:"run",props:{cases:t},resolve:r},!0)})}function ns(t){return new Promise(r=>{v(bt,{type:"restart",props:{cases:t},resolve:r},!0)})}function as(t){return new Promise(r=>{v(bt,{type:"clean",props:{cases:t},resolve:r},!0)})}function tt(t,r="Alert"){return new Promise(a=>{v(bt,{type:"alert",props:{title:r,message:t},resolve:()=>a()},!0)})}function Hn(t,r="Confirm",a="OK",n="primary"){return new Promise(o=>{v(bt,{type:"confirm",props:{title:r,message:t,confirmLabel:a,confirmVariant:n},resolve:o},!0)})}function pn(t,r="",a="Input",n="",o=!1){return new Promise(s=>{v(bt,{type:"prompt",props:{title:a,message:t,value:r,placeholder:n,multiline:o},resolve:s},!0)})}var os=E('
        ');function Qt(t,r){function a(s){return document.body.appendChild(s),{destroy(){s.remove()}}}var n=os(),o=k(n);ft(o,()=>r.children),h(n),Vo(n,s=>a==null?void 0:a(s)),d(t,n)}var ss=E('
        '),is=E('
        ');function hr(t,r){Me(r,!0);const a=A=>{var b=is(),f=k(b),_=k(f),P=k(_),x=k(P,!0);h(P);var S=M(P,2);{var R=L=>{var j=ss(),z=k(j,!0);h(j),Q(()=>re(z,r.subtitle)),d(L,j)};X(S,L=>{r.subtitle&&L(R)})}h(_);var m=M(_,2);ft(m,()=>r.children);var $=M(m,2),F=k($);ft(F,()=>r.footer),h($),h(f),h(b),Q(()=>{ke(f,1,`w-[min(${n()??""},96vw)] bg-white border border-border rounded-[10px] p-4.5`),ye(f,"aria-labelledby",r.titleId),ye(P,"id",r.titleId),re(x,r.title)}),ie("keydown",b,i),ie("mousedown",b,u),ie("click",b,w),d(A,b)};let n=he(r,"maxWidth",3,"520px"),o=he(r,"portal",3,!1);function s(){r.onCancel?r.onCancel():ot(null)}function i(A){A.key==="Escape"?s():A.key==="Enter"&&r.onConfirm&&r.onConfirm()}let c=!1;function u(A){c=A.target.dataset.backdrop!==void 0}function w(A){const b=A.target.dataset.backdrop!==void 0;c&&b&&s(),c=!1}var p=Se(),T=B(p);{var y=A=>{Qt(A,{children:(b,f)=>{a(b)}})},N=A=>{a(A)};X(T,A=>{o()?A(y):A(N,-1)})}d(t,p),Te()}qe(["keydown","mousedown","click"]);var ls=E("");function Re(t,r){let a=he(r,"variant",3,"primary"),n=he(r,"size",3,"default"),o=he(r,"disabled",3,!1);const s={default:"h-[34px] rounded-md px-3.5 leading-none text-[13px] tracking-wide",sm:"h-[30px] rounded-md px-2.5 leading-none text-xs"},i={primary:"bg-edf-bleu-moyen text-white border-none hover:bg-[rgb(12,72,170)]",secondary:"bg-white text-ink border border-border hover:bg-edf-gris-clair",run:"bg-edf-vert-fonce text-white border-none hover:bg-[rgb(38,98,12)]",warning:"bg-edf-orange-moyen text-white border-none hover:bg-[rgb(230,118,20)]",danger:"bg-edf-orange-fonce text-white border-none hover:bg-[rgb(180,56,8)]"};var c=ls(),u=k(c);ft(u,()=>r.children),h(c),Q(()=>{ke(c,1,`inline-flex items-center justify-center gap-1.5 font-bold cursor-pointer transition-colors duration-150 disabled:opacity-40 disabled:pointer-events-none ${s[n()]??""} ${i[a()]??""}`),c.disabled=o()}),ie("click",c,function(...w){var p;(p=r.onclick)==null||p.apply(this,w)}),d(t,c)}qe(["click"]);var cs=E(" ",1),us=E(''),ds=E(''),fs=E('
        '),vs=E('

        ',1);function gs(t,r){Me(r,!0);let a=he(r,"confirmLabel",3,"OK"),n=he(r,"confirmVariant",3,"primary"),o=he(r,"value",3,""),s=he(r,"placeholder",3,""),i=he(r,"multiline",3,!1);const c=o();let u=D(se(c)),w=D(void 0),p=D(void 0);Ee(()=>{var N;r.mode==="prompt"&&e(w)?(e(w).focus(),"select"in e(w)&&e(w).select()):e(p)&&((N=e(p).querySelector("button"))==null||N.focus())});function T(){r.mode==="prompt"?ot(e(u)):r.mode==="confirm"?ot(!0):ot()}function y(){r.mode==="confirm"?ot(!1):r.mode==="prompt"?ot(null):ot()}{const N=b=>{var f=cs(),_=B(f);{var P=R=>{Re(R,{variant:"secondary",onclick:y,children:(m,$)=>{Ce();var F=Oe("Cancel");d(m,F)},$$slots:{default:!0}})};X(_,R=>{r.mode!=="alert"&&R(P)})}var x=M(_,2),S=k(x);Re(S,{get variant(){return n()},onclick:T,children:(R,m)=>{Ce();var $=Oe();Q(()=>re($,a())),d(R,$)},$$slots:{default:!0}}),h(x),rt(x,R=>v(p,R),()=>e(p)),d(b,f)};let A=O(()=>i()?void 0:T);hr(t,{get title(){return r.title},titleId:"app-dialog-title",get onConfirm(){return e(A)},onCancel:y,footer:N,children:(b,f)=>{var _=vs(),P=B(_),x=k(P,!0);h(P);var S=M(P,2);{var R=m=>{var $=fs(),F=k($);{var L=z=>{var V=us();Ro(V),rt(V,I=>v(w,I),()=>e(w)),Q(()=>ye(V,"placeholder",s())),Ze(V,()=>e(u),I=>v(u,I)),d(z,V)},j=z=>{var V=ds();Ke(V),rt(V,I=>v(w,I),()=>e(w)),Q(()=>ye(V,"placeholder",s())),Ze(V,()=>e(u),I=>v(u,I)),d(z,V)};X(F,z=>{i()?z(L):z(j,-1)})}h($),d(m,$)};X(S,m=>{r.mode==="prompt"&&m(R)})}Q(()=>re(x,r.message)),d(b,_)},$$slots:{footer:!0,default:!0}})}Te()}var hs=E('');function Ne(t,r){var a=hs(),n=k(a),o=M(n);ft(o,()=>r.children),h(a),Q(()=>re(n,`${r.text??""} `)),d(t,a)}function kt(t,r){const a=localStorage.getItem(t);if(a===null)return r;const n=Number(a);return Number.isFinite(n)?n:r}function Ct(t,r){Number.isFinite(r)&&localStorage.setItem(t,String(r))}function ms(t,r){return localStorage.getItem(t)??r}function ps(){return{n:kt("csauto_run_n",1),nt:kt("csauto_run_nt",1),maxParallel:kt("csauto_run_max_parallel",0)||null}}function _s(t){Ct("csauto_run_n",t.n),Ct("csauto_run_nt",t.nt),t.maxParallel&&Ct("csauto_run_max_parallel",t.maxParallel)}function bs(){return{n:kt("csauto_restart_n",1),nt:kt("csauto_restart_nt",1),maxParallel:kt("csauto_restart_max_parallel",0)||null,mode:ms("csauto_restart_mode",""),value:kt("csauto_restart_value",100)}}function xs(t){Ct("csauto_restart_n",t.n),Ct("csauto_restart_nt",t.nt),t.maxParallel&&Ct("csauto_restart_max_parallel",t.maxParallel),localStorage.setItem("csauto_restart_mode",t.mode),Ct("csauto_restart_value",t.value)}function ys(){return{keepLast:kt("csauto_clean_keep_last",1)}}function ws(t){Ct("csauto_clean_keep_last",t.keepLast)}var ks=E(" ",1),Cs=E(''),Ss=E(''),Ps=E(''),$s=E('
        ');function Rs(t,r){Me(r,!0);const a=ps(),n=a.maxParallel??(r.cases.length>1?r.cases.length:0);let o=D(se(a.n)),s=D(se(a.nt)),i=D(se(n));async function c(){if(!Number.isFinite(e(o))||e(o)<=0){await tt("MPI ranks must be an integer > 0.","Invalid value");return}if(!Number.isFinite(e(s))||e(s)<=0){await tt("Threads must be an integer > 0.","Invalid value");return}if(e(i)&&(!Number.isFinite(e(i))||e(i)<=0)){await tt("Max parallel must be empty or > 0.","Invalid value");return}const u={n:e(o),nt:e(s),maxParallel:e(i)||null};_s(u),ot(u)}{const u=T=>{var y=ks(),N=B(y);Re(N,{variant:"secondary",onclick:()=>ot(null),children:(b,f)=>{Ce();var _=Oe("Cancel");d(b,_)},$$slots:{default:!0}});var A=M(N,2);Re(A,{variant:"run",onclick:c,children:(b,f)=>{Ce();var _=Oe("Run");d(b,_)},$$slots:{default:!0}}),d(T,y)};let w=O(()=>r.cases.length),p=O(()=>r.cases.length>1?"s":"");hr(t,{title:"Run Cases",titleId:"run-dialog-title",get subtitle(){return`${e(w)??""} case${e(p)??""} selected`},onConfirm:c,footer:u,children:(T,y)=>{var N=$s(),A=k(N);Ne(A,{text:"MPI Ranks (n)",children:(_,P)=>{var x=Cs();Ke(x),Ze(x,()=>e(o),S=>v(o,S)),d(_,x)}});var b=M(A,2);Ne(b,{text:"OMP Threads (nt)",children:(_,P)=>{var x=Ss();Ke(x),Ze(x,()=>e(s),S=>v(s,S)),d(_,x)}});var f=M(b,2);Ne(f,{text:"Max Parallel",children:(_,P)=>{var x=Ps();Ke(x),Ze(x,()=>e(i),S=>v(i,S)),d(_,x)}}),h(N),d(T,N)},$$slots:{footer:!0,default:!0}})}Te()}const Jr="csauto_token";let ka=D(se(localStorage.getItem(Jr)??""));function _n(){return e(ka)}function Ca(t){v(ka,t,!0),t?localStorage.setItem(Jr,t):localStorage.removeItem(Jr)}let kr=null;async function bn(t,r={}){const a=new Headers(r.headers),n=_n();n&&a.set("X-CSAUTO-TOKEN",n);const o=await fetch(t,{...r,headers:a});if(o.status===401){kr||(kr=pn("API token required:",n,"Authentication"));const s=await kr;return kr=null,s===null?o:(Ca(s),a.set("X-CSAUTO-TOKEN",s),fetch(t,{...r,headers:a}))}return o}async function lt(t){const r=await bn(t);if(!r.ok)throw new Error(`GET ${t} failed: ${r.status}`);return r.json()}async function xn(t){const r=await bn(t);if(!r.ok)throw new Error(`GET ${t} failed: ${r.status}`);return r.text()}async function Et(t,r){const a=await bn(t,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(r)});if(!a.ok){const n=await a.text().catch(()=>a.statusText);throw new Error(`POST ${t} failed (${a.status}): ${n}`)}return a.json()}function Dr(t){return t.map(r=>`case=${encodeURIComponent(r)}`).join("&")}function Es(t=!1){return lt(`/api/status${t?"?log=1":""}`)}function jn(t){return lt(`/api/perf?${Dr(t)}`)}function Ns(){return lt("/api/app_config")}function Ms(t){return`/api/solver_logo?solver=${encodeURIComponent(t)}`}function Ts(t){return`/api/solver_icon?solver=${encodeURIComponent(t)}`}function As(t){return lt(`/api/residual_columns?${Dr(t)}`).then(r=>r.columns??[])}function Ls(t,r,a={}){const n=new URLSearchParams;return t.forEach(o=>n.append("case",o)),n.set("columns",r.join(",")),a.width&&n.set("width",String(a.width)),a.height&&n.set("height",String(a.height)),a.xMin!==void 0&&n.set("x_min",String(a.xMin)),a.includeHistory&&n.set("include_history","true"),xn(`/api/residuals_svg?${n}`)}function Sa(t){return lt(`/api/restart_origin?${Dr(t)}`)}function Fs(t){var a;const r=new URLSearchParams;return t.cases.forEach(n=>r.append("case",n)),(a=t.files)!=null&&a.length&&r.set("files",t.files.join(",")),t.maxHits&&r.set("max_hits",String(t.maxHits)),t.context!==void 0&&r.set("context",String(t.context)),t.sev&&r.set("sev",t.sev),t.q&&r.set("q",t.q),lt(`/api/recent_errors?${r}`)}function Ds(t){return lt(`/api/tail_files?case=${encodeURIComponent(t)}`).then(r=>r.files??[])}function Is(t,r,a){const n=new URLSearchParams({case:t,file:r,n:String(a)});return lt(`/api/tail_lines?${n}`)}function Pa(t){return lt(`/api/resu_dirs?${Dr(t)}`).then(r=>r.dirs??[])}function Zr(t,r){const a=new URLSearchParams({scope:r});return t.forEach(n=>a.append("case",n)),lt(`/api/probes?${a}`).then(n=>n.files??[])}function zs(t,r){const a=new URLSearchParams;return t.forEach(n=>a.append("case",n)),r.forEach(n=>a.append("probe",n)),lt(`/api/probe_columns?${a}`).then(n=>n.columns??[])}function Os(t,r,a){const n=new URLSearchParams({case:t,probe:r});return a.forEach(o=>n.append("column",o)),lt(`/api/probe_position?${n}`)}function Hs(t){const r=new URLSearchParams;return t.cases.forEach(a=>r.append("case",a)),t.probes.forEach(a=>r.append("probe",a)),r.set("columns",t.columns.join(",")),t.axis&&r.set("axis",t.axis),t.xMin!==void 0&&r.set("x_min",String(t.xMin)),t.timeMin!==void 0&&r.set("time_min",String(t.timeMin)),r.set("include_history","true"),t.width&&r.set("width",String(t.width)),t.height&&r.set("height",String(t.height)),xn(`/api/probe_svg?${r}`)}function js(t){const r=new URLSearchParams;return t.cases.forEach(a=>r.append("case",a)),t.base&&r.set("base",t.base),t.kind&&r.set("kind",t.kind),t.filter&&r.set("filter",t.filter),xn(`/api/compare_runs?${r}`)}function Un(t){return Et("/api/run_case",{cases:t.cases,n:t.n,nt:t.nt,max_parallel:t.maxParallel??void 0,restart:t.restart??!1,restart_mode:t.restartMode??"",restart_value:t.restartValue??void 0,restart_path:t.restartPath||void 0}).then(()=>{})}function Us(t){return Et("/api/kill_case",{cases:t}).then(()=>{})}function Vs(t){return Et("/api/control_case",{cases:t.cases,action:t.action,value:t.value??null}).then(()=>{})}function Bs(t){return Et("/api/cleanup_cases",{cases:t.cases,keep_last:t.keepLast??1,prune_resu:t.pruneResu??!0,keep_resu:t.keepResu??[],delete_resu:t.deleteResu??[],max_log_mb:t.maxLogMb??50,clear_cid:!0,clear_pyc:!1})}function qs(t,r){return Et("/api/case_note",{case:t,note:r}).then(()=>{})}function Ks(t,r){return Et("/api/case_convergence",{case:t,convergence:r}).then(()=>{})}function Gs(t){return Et("/api/open_gui",{case:t}).then(()=>{})}function Ws(){return lt("/api/settings/telemetry")}function Xs(t){return Et("/api/settings/telemetry",{enabled:t})}const Ys=["status","tail","errors"],Qs=3e4;let dr=D(null),Kr=!1,Gr=1e3,Vn;function $t(){return e(dr)}async function $a(){if(!(e(dr)||Kr)){clearTimeout(Vn),Kr=!0;try{v(dr,await Ns(),!0)}catch{Vn=setTimeout($a,Gr),Gr=Math.min(Gr*2,Qs)}finally{Kr=!1}}}function Tt(t){var r;return(((r=e(dr))==null?void 0:r.panels)??Ys).includes(t)}function en(t){var r;return((r=e(dr))==null?void 0:r.capabilities.includes(t))??!1}function yn(t){return t.map(r=>({value:r,label:r}))}function Ra(t,r){return Number.isFinite(r)?r<=0?`${t.value_label} must be greater than 0.`:t.value_kind==="int"&&!Number.isInteger(r)?`${t.value_label} must be a whole number.`:"":`${t.value_label} must be a number.`}var Js=E(" ",1),Zs=E(''),ei=E(''),ti=E(''),ri=E(""),ni=E(""),ai=E(''),oi=E(""),si=E(""),ii=E('
        ',1);function li(t,r){var A,b;Me(r,!0);const a=((A=$t())==null?void 0:A.restart_modes)??[],n=bs(),o=n.maxParallel??(r.cases.length>1?r.cases.length:0);let s=D(se(n.n)),i=D(se(n.nt)),c=D(se(o)),u=D(se(a.some(f=>f.name===n.mode)?n.mode:((b=a[0])==null?void 0:b.name)??"")),w=D(se(n.value)),p=D(""),T=D(se([])),y=O(()=>a.find(f=>f.name===e(u)));fn(async()=>{if(r.cases.length===1)try{v(T,await Pa(r.cases),!0)}catch{v(T,[],!0)}});async function N(){var P,x;if(!Number.isFinite(e(s))||e(s)<=0){await tt("MPI ranks must be an integer > 0.","Invalid value");return}if(!Number.isFinite(e(i))||e(i)<=0){await tt("Threads must be an integer > 0.","Invalid value");return}if(e(c)&&(!Number.isFinite(e(c))||e(c)<=0)){await tt("Max parallel must be empty or > 0.","Invalid value");return}const f=(P=e(y))!=null&&P.value_label?Ra(e(y),e(w)):"";if(f){await tt(f,"Invalid value");return}const _={n:e(s),nt:e(i),maxParallel:e(c)||null,restartMode:e(u),restartValue:(x=e(y))!=null&&x.value_label?e(w):null,restartPath:e(p)||null};xs({n:e(s),nt:e(i),maxParallel:e(c)||null,mode:e(u),value:e(w)}),ot(_)}{const f=x=>{var S=Js(),R=B(S);Re(R,{variant:"secondary",onclick:()=>ot(null),children:($,F)=>{Ce();var L=Oe("Cancel");d($,L)},$$slots:{default:!0}});var m=M(R,2);Re(m,{variant:"warning",onclick:N,children:($,F)=>{Ce();var L=Oe("Restart");d($,L)},$$slots:{default:!0}}),d(x,S)};let _=O(()=>r.cases.length),P=O(()=>r.cases.length>1?"s":"");hr(t,{title:"Restart Cases",titleId:"restart-dialog-title",get subtitle(){return`${e(_)??""} case${e(P)??""} selected`},onConfirm:N,footer:f,children:(x,S)=>{var R=ii(),m=B(R),$=k(m);Ne($,{text:"MPI Ranks (n)",children:(q,g)=>{var l=Zs();Ke(l),Ze(l,()=>e(s),C=>v(s,C)),d(q,l)}});var F=M($,2);Ne(F,{text:"OMP Threads (nt)",children:(q,g)=>{var l=ei();Ke(l),Ze(l,()=>e(i),C=>v(i,C)),d(q,l)}});var L=M(F,2);Ne(L,{text:"Max Parallel",children:(q,g)=>{var l=ti();Ke(l),Ze(l,()=>e(c),C=>v(c,C)),d(q,l)}}),h(m);var j=M(m,2),z=k(j);{var V=q=>{Ne(q,{text:"Mode",children:(g,l)=>{var C=ni();Ue(C,21,()=>a,H=>H.name,(H,W)=>{var ee=ri(),ne=k(ee,!0);h(ee);var pe={};Q(()=>{re(ne,e(W).label),pe!==(pe=e(W).name)&&(ee.value=(ee.__value=e(W).name)??"")}),d(H,ee)}),h(C),In(C,()=>e(u),H=>v(u,H)),d(g,C)}})};X(z,q=>{a.length>0&&q(V)})}var I=M(z,2);{var G=q=>{Ne(q,{get text(){return e(y).value_label},children:(g,l)=>{var C=ai();Ke(C),Q(()=>{ye(C,"min",e(y).value_kind==="int"?"1":"0"),ye(C,"step",e(y).value_kind==="int"?"1":"any")}),Ze(C,()=>e(w),H=>v(w,H)),d(g,C)}})};X(I,q=>{var g;(g=e(y))!=null&&g.value_label&&q(G)})}var U=M(I,2);Ne(U,{text:"Restart from",children:(q,g)=>{var l=si(),C=k(l);C.value=C.__value="";var H=M(C);Ue(H,16,()=>e(T),W=>W,(W,ee)=>{var ne=oi(),pe=k(ne,!0);h(ne);var K={};Q(()=>{re(pe,ee),K!==(K=ee)&&(ne.value=(ne.__value=ee)??"")}),d(W,ne)}),h(l),Q(()=>{l.disabled=r.cases.length>1,ye(l,"title",r.cases.length>1?"Each case restarts from its own latest run":void 0)}),In(l,()=>e(p),W=>v(p,W)),d(q,l)}}),h(j),d(x,R)},$$slots:{footer:!0,default:!0}})}Te()}function Fe(t,r){let a=he(r,"size",3,14);var n=Se(),o=B(n);Mo(o,()=>r.icon,(s,i)=>{i(s,{get size(){return a()},class:"icon"})}),d(t,n)}/** * @license lucide-svelte v1.0.1 - ISC * * ISC License @@ -46,7 +46,7 @@ import{b as Pr,a as d,f as E,c as Se,t as Oe,d as Ot}from"../chunks/C14P8jaG.js" * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. * - */const il={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":2,"stroke-linecap":"round","stroke-linejoin":"round"};/** + */const ci={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":2,"stroke-linecap":"round","stroke-linejoin":"round"};/** * @license lucide-svelte v1.0.1 - ISC * * ISC License @@ -93,7 +93,7 @@ import{b as Pr,a as d,f as E,c as Se,t as Oe,d as Ot}from"../chunks/C14P8jaG.js" * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. * - */const cl=t=>{for(const r in t)if(r.startsWith("aria-")||r==="role"||r==="title")return!0;return!1};/** + */const ui=t=>{for(const r in t)if(r.startsWith("aria-")||r==="role"||r==="title")return!0;return!1};/** * @license lucide-svelte v1.0.1 - ISC * * ISC License @@ -140,7 +140,7 @@ import{b as Pr,a as d,f as E,c as Se,t as Oe,d as Ot}from"../chunks/C14P8jaG.js" * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. * - */const Bn=(...t)=>t.filter((r,a,n)=>!!r&&r.trim()!==""&&n.indexOf(r)===a).join(" ").trim();var ul=Ot("");function Qe(t,r){const a=Ge(r,["children","$$slots","$$events","$$legacy"]),n=Ge(a,["name","color","size","strokeWidth","absoluteStrokeWidth","iconNode"]);Me(r,!1);let o=he(r,"name",8,void 0),s=he(r,"color",8,"currentColor"),l=he(r,"size",8,24),c=he(r,"strokeWidth",8,2),u=he(r,"absoluteStrokeWidth",8,!1),y=he(r,"iconNode",24,()=>[]);Do();var p=ul();zn(p,(N,A,b)=>({...il,...N,...n,width:l(),height:l(),stroke:s(),"stroke-width":A,class:b}),[()=>cl(n)?void 0:{"aria-hidden":"true"},()=>(jt(u()),jt(c()),jt(l()),ur(()=>u()?Number(c())*24/Number(l()):c())),()=>(jt(Bn),jt(o()),jt(a),ur(()=>Bn("lucide-icon","lucide",o()?`lucide-${o()}`:"",a.class)))]);var T=C(p);Ue(T,1,y,gn,(N,A)=>{var b=O(()=>Ro(e(A),2));let f=()=>e(b)[0],_=()=>e(b)[1];var P=Se(),x=B(P);jo(x,f,!0,(S,R)=>{zn(S,()=>({..._()}))}),d(N,P)});var w=M(T);We(w,r,"default",{}),h(p),d(t,p),Te()}function dl(t,r){const a=Ge(r,["children","$$slots","$$events","$$legacy"]);/** + */const Bn=(...t)=>t.filter((r,a,n)=>!!r&&r.trim()!==""&&n.indexOf(r)===a).join(" ").trim();var di=Ot("");function Qe(t,r){const a=Ge(r,["children","$$slots","$$events","$$legacy"]),n=Ge(a,["name","color","size","strokeWidth","absoluteStrokeWidth","iconNode"]);Me(r,!1);let o=he(r,"name",8,void 0),s=he(r,"color",8,"currentColor"),i=he(r,"size",8,24),c=he(r,"strokeWidth",8,2),u=he(r,"absoluteStrokeWidth",8,!1),w=he(r,"iconNode",24,()=>[]);Io();var p=di();zn(p,(N,A,b)=>({...ci,...N,...n,width:i(),height:i(),stroke:s(),"stroke-width":A,class:b}),[()=>ui(n)?void 0:{"aria-hidden":"true"},()=>(jt(u()),jt(c()),jt(i()),ur(()=>u()?Number(c())*24/Number(i()):c())),()=>(jt(Bn),jt(o()),jt(a),ur(()=>Bn("lucide-icon","lucide",o()?`lucide-${o()}`:"",a.class)))]);var T=k(p);Ue(T,1,w,gn,(N,A)=>{var b=O(()=>Eo(e(A),2));let f=()=>e(b)[0],_=()=>e(b)[1];var P=Se(),x=B(P);Uo(x,f,!0,(S,R)=>{zn(S,()=>({..._()}))}),d(N,P)});var y=M(T);We(y,r,"default",{}),h(p),d(t,p),Te()}function fi(t,r){const a=Ge(r,["children","$$slots","$$events","$$legacy"]);/** * @license lucide-svelte v1.0.1 - ISC * * ISC License @@ -187,7 +187,7 @@ import{b as Pr,a as d,f as E,c as Se,t as Oe,d as Ot}from"../chunks/C14P8jaG.js" * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. * - */const n=[["path",{d:"M12 5v14"}],["path",{d:"m19 12-7 7-7-7"}]];Qe(t,Ye({name:"arrow-down"},()=>a,{get iconNode(){return n},children:(o,s)=>{var l=Se(),c=B(l);We(c,r,"default",{}),d(o,l)},$$slots:{default:!0}}))}function fl(t,r){const a=Ge(r,["children","$$slots","$$events","$$legacy"]);/** + */const n=[["path",{d:"M12 5v14"}],["path",{d:"m19 12-7 7-7-7"}]];Qe(t,Ye({name:"arrow-down"},()=>a,{get iconNode(){return n},children:(o,s)=>{var i=Se(),c=B(i);We(c,r,"default",{}),d(o,i)},$$slots:{default:!0}}))}function vi(t,r){const a=Ge(r,["children","$$slots","$$events","$$legacy"]);/** * @license lucide-svelte v1.0.1 - ISC * * ISC License @@ -234,7 +234,7 @@ import{b as Pr,a as d,f as E,c as Se,t as Oe,d as Ot}from"../chunks/C14P8jaG.js" * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. * - */const n=[["path",{d:"M8 3 4 7l4 4"}],["path",{d:"M4 7h16"}],["path",{d:"m16 21 4-4-4-4"}],["path",{d:"M20 17H4"}]];Qe(t,Ye({name:"arrow-left-right"},()=>a,{get iconNode(){return n},children:(o,s)=>{var l=Se(),c=B(l);We(c,r,"default",{}),d(o,l)},$$slots:{default:!0}}))}function vl(t,r){const a=Ge(r,["children","$$slots","$$events","$$legacy"]);/** + */const n=[["path",{d:"M8 3 4 7l4 4"}],["path",{d:"M4 7h16"}],["path",{d:"m16 21 4-4-4-4"}],["path",{d:"M20 17H4"}]];Qe(t,Ye({name:"arrow-left-right"},()=>a,{get iconNode(){return n},children:(o,s)=>{var i=Se(),c=B(i);We(c,r,"default",{}),d(o,i)},$$slots:{default:!0}}))}function gi(t,r){const a=Ge(r,["children","$$slots","$$events","$$legacy"]);/** * @license lucide-svelte v1.0.1 - ISC * * ISC License @@ -281,7 +281,7 @@ import{b as Pr,a as d,f as E,c as Se,t as Oe,d as Ot}from"../chunks/C14P8jaG.js" * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. * - */const n=[["path",{d:"m5 12 7-7 7 7"}],["path",{d:"M12 19V5"}]];Qe(t,Ye({name:"arrow-up"},()=>a,{get iconNode(){return n},children:(o,s)=>{var l=Se(),c=B(l);We(c,r,"default",{}),d(o,l)},$$slots:{default:!0}}))}function wn(t,r){const a=Ge(r,["children","$$slots","$$events","$$legacy"]);/** + */const n=[["path",{d:"m5 12 7-7 7 7"}],["path",{d:"M12 19V5"}]];Qe(t,Ye({name:"arrow-up"},()=>a,{get iconNode(){return n},children:(o,s)=>{var i=Se(),c=B(i);We(c,r,"default",{}),d(o,i)},$$slots:{default:!0}}))}function wn(t,r){const a=Ge(r,["children","$$slots","$$events","$$legacy"]);/** * @license lucide-svelte v1.0.1 - ISC * * ISC License @@ -328,7 +328,7 @@ import{b as Pr,a as d,f as E,c as Se,t as Oe,d as Ot}from"../chunks/C14P8jaG.js" * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. * - */const n=[["path",{d:"m6 9 6 6 6-6"}]];Qe(t,Ye({name:"chevron-down"},()=>a,{get iconNode(){return n},children:(o,s)=>{var l=Se(),c=B(l);We(c,r,"default",{}),d(o,l)},$$slots:{default:!0}}))}function gl(t,r){const a=Ge(r,["children","$$slots","$$events","$$legacy"]);/** + */const n=[["path",{d:"m6 9 6 6 6-6"}]];Qe(t,Ye({name:"chevron-down"},()=>a,{get iconNode(){return n},children:(o,s)=>{var i=Se(),c=B(i);We(c,r,"default",{}),d(o,i)},$$slots:{default:!0}}))}function hi(t,r){const a=Ge(r,["children","$$slots","$$events","$$legacy"]);/** * @license lucide-svelte v1.0.1 - ISC * * ISC License @@ -375,7 +375,7 @@ import{b as Pr,a as d,f as E,c as Se,t as Oe,d as Ot}from"../chunks/C14P8jaG.js" * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. * - */const n=[["path",{d:"m9 18 6-6-6-6"}]];Qe(t,Ye({name:"chevron-right"},()=>a,{get iconNode(){return n},children:(o,s)=>{var l=Se(),c=B(l);We(c,r,"default",{}),d(o,l)},$$slots:{default:!0}}))}function hl(t,r){const a=Ge(r,["children","$$slots","$$events","$$legacy"]);/** + */const n=[["path",{d:"m9 18 6-6-6-6"}]];Qe(t,Ye({name:"chevron-right"},()=>a,{get iconNode(){return n},children:(o,s)=>{var i=Se(),c=B(i);We(c,r,"default",{}),d(o,i)},$$slots:{default:!0}}))}function mi(t,r){const a=Ge(r,["children","$$slots","$$events","$$legacy"]);/** * @license lucide-svelte v1.0.1 - ISC * * ISC License @@ -422,7 +422,7 @@ import{b as Pr,a as d,f as E,c as Se,t as Oe,d as Ot}from"../chunks/C14P8jaG.js" * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. * - */const n=[["circle",{cx:"12",cy:"12",r:"10"}],["path",{d:"m15 9-6 6"}],["path",{d:"m9 9 6 6"}]];Qe(t,Ye({name:"circle-x"},()=>a,{get iconNode(){return n},children:(o,s)=>{var l=Se(),c=B(l);We(c,r,"default",{}),d(o,l)},$$slots:{default:!0}}))}function mr(t,r){const a=Ge(r,["children","$$slots","$$events","$$legacy"]);/** + */const n=[["circle",{cx:"12",cy:"12",r:"10"}],["path",{d:"m15 9-6 6"}],["path",{d:"m9 9 6 6"}]];Qe(t,Ye({name:"circle-x"},()=>a,{get iconNode(){return n},children:(o,s)=>{var i=Se(),c=B(i);We(c,r,"default",{}),d(o,i)},$$slots:{default:!0}}))}function mr(t,r){const a=Ge(r,["children","$$slots","$$events","$$legacy"]);/** * @license lucide-svelte v1.0.1 - ISC * * ISC License @@ -469,7 +469,7 @@ import{b as Pr,a as d,f as E,c as Se,t as Oe,d as Ot}from"../chunks/C14P8jaG.js" * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. * - */const n=[["path",{d:"M12 15V3"}],["path",{d:"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"}],["path",{d:"m7 10 5 5 5-5"}]];Qe(t,Ye({name:"download"},()=>a,{get iconNode(){return n},children:(o,s)=>{var l=Se(),c=B(l);We(c,r,"default",{}),d(o,l)},$$slots:{default:!0}}))}function ml(t,r){const a=Ge(r,["children","$$slots","$$events","$$legacy"]);/** + */const n=[["path",{d:"M12 15V3"}],["path",{d:"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"}],["path",{d:"m7 10 5 5 5-5"}]];Qe(t,Ye({name:"download"},()=>a,{get iconNode(){return n},children:(o,s)=>{var i=Se(),c=B(i);We(c,r,"default",{}),d(o,i)},$$slots:{default:!0}}))}function pi(t,r){const a=Ge(r,["children","$$slots","$$events","$$legacy"]);/** * @license lucide-svelte v1.0.1 - ISC * * ISC License @@ -516,7 +516,7 @@ import{b as Pr,a as d,f as E,c as Se,t as Oe,d as Ot}from"../chunks/C14P8jaG.js" * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. * - */const n=[["circle",{cx:"12",cy:"12",r:"1"}],["circle",{cx:"19",cy:"12",r:"1"}],["circle",{cx:"5",cy:"12",r:"1"}]];Qe(t,Ye({name:"ellipsis"},()=>a,{get iconNode(){return n},children:(o,s)=>{var l=Se(),c=B(l);We(c,r,"default",{}),d(o,l)},$$slots:{default:!0}}))}function pl(t,r){const a=Ge(r,["children","$$slots","$$events","$$legacy"]);/** + */const n=[["circle",{cx:"12",cy:"12",r:"1"}],["circle",{cx:"19",cy:"12",r:"1"}],["circle",{cx:"5",cy:"12",r:"1"}]];Qe(t,Ye({name:"ellipsis"},()=>a,{get iconNode(){return n},children:(o,s)=>{var i=Se(),c=B(i);We(c,r,"default",{}),d(o,i)},$$slots:{default:!0}}))}function _i(t,r){const a=Ge(r,["children","$$slots","$$events","$$legacy"]);/** * @license lucide-svelte v1.0.1 - ISC * * ISC License @@ -563,7 +563,7 @@ import{b as Pr,a as d,f as E,c as Se,t as Oe,d as Ot}from"../chunks/C14P8jaG.js" * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. * - */const n=[["path",{d:"M15 3h6v6"}],["path",{d:"M10 14 21 3"}],["path",{d:"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"}]];Qe(t,Ye({name:"external-link"},()=>a,{get iconNode(){return n},children:(o,s)=>{var l=Se(),c=B(l);We(c,r,"default",{}),d(o,l)},$$slots:{default:!0}}))}function _l(t,r){const a=Ge(r,["children","$$slots","$$events","$$legacy"]);/** + */const n=[["path",{d:"M15 3h6v6"}],["path",{d:"M10 14 21 3"}],["path",{d:"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"}]];Qe(t,Ye({name:"external-link"},()=>a,{get iconNode(){return n},children:(o,s)=>{var i=Se(),c=B(i);We(c,r,"default",{}),d(o,i)},$$slots:{default:!0}}))}function bi(t,r){const a=Ge(r,["children","$$slots","$$events","$$legacy"]);/** * @license lucide-svelte v1.0.1 - ISC * * ISC License @@ -610,7 +610,7 @@ import{b as Pr,a as d,f as E,c as Se,t as Oe,d as Ot}from"../chunks/C14P8jaG.js" * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. * - */const n=[["rect",{x:"14",y:"3",width:"5",height:"18",rx:"1"}],["rect",{x:"5",y:"3",width:"5",height:"18",rx:"1"}]];Qe(t,Ye({name:"pause"},()=>a,{get iconNode(){return n},children:(o,s)=>{var l=Se(),c=B(l);We(c,r,"default",{}),d(o,l)},$$slots:{default:!0}}))}function bl(t,r){const a=Ge(r,["children","$$slots","$$events","$$legacy"]);/** + */const n=[["rect",{x:"14",y:"3",width:"5",height:"18",rx:"1"}],["rect",{x:"5",y:"3",width:"5",height:"18",rx:"1"}]];Qe(t,Ye({name:"pause"},()=>a,{get iconNode(){return n},children:(o,s)=>{var i=Se(),c=B(i);We(c,r,"default",{}),d(o,i)},$$slots:{default:!0}}))}function xi(t,r){const a=Ge(r,["children","$$slots","$$events","$$legacy"]);/** * @license lucide-svelte v1.0.1 - ISC * * ISC License @@ -657,7 +657,7 @@ import{b as Pr,a as d,f as E,c as Se,t as Oe,d as Ot}from"../chunks/C14P8jaG.js" * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. * - */const n=[["path",{d:"M13 21h8"}],["path",{d:"M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z"}]];Qe(t,Ye({name:"pen-line"},()=>a,{get iconNode(){return n},children:(o,s)=>{var l=Se(),c=B(l);We(c,r,"default",{}),d(o,l)},$$slots:{default:!0}}))}function xl(t,r){const a=Ge(r,["children","$$slots","$$events","$$legacy"]);/** + */const n=[["path",{d:"M13 21h8"}],["path",{d:"M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z"}]];Qe(t,Ye({name:"pen-line"},()=>a,{get iconNode(){return n},children:(o,s)=>{var i=Se(),c=B(i);We(c,r,"default",{}),d(o,i)},$$slots:{default:!0}}))}function yi(t,r){const a=Ge(r,["children","$$slots","$$events","$$legacy"]);/** * @license lucide-svelte v1.0.1 - ISC * * ISC License @@ -704,7 +704,7 @@ import{b as Pr,a as d,f as E,c as Se,t as Oe,d as Ot}from"../chunks/C14P8jaG.js" * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. * - */const n=[["path",{d:"M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z"}],["path",{d:"m15 5 4 4"}]];Qe(t,Ye({name:"pencil"},()=>a,{get iconNode(){return n},children:(o,s)=>{var l=Se(),c=B(l);We(c,r,"default",{}),d(o,l)},$$slots:{default:!0}}))}function Ra(t,r){const a=Ge(r,["children","$$slots","$$events","$$legacy"]);/** + */const n=[["path",{d:"M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z"}],["path",{d:"m15 5 4 4"}]];Qe(t,Ye({name:"pencil"},()=>a,{get iconNode(){return n},children:(o,s)=>{var i=Se(),c=B(i);We(c,r,"default",{}),d(o,i)},$$slots:{default:!0}}))}function Ea(t,r){const a=Ge(r,["children","$$slots","$$events","$$legacy"]);/** * @license lucide-svelte v1.0.1 - ISC * * ISC License @@ -751,7 +751,7 @@ import{b as Pr,a as d,f as E,c as Se,t as Oe,d as Ot}from"../chunks/C14P8jaG.js" * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. * - */const n=[["path",{d:"M5 5a2 2 0 0 1 3.008-1.728l11.997 6.998a2 2 0 0 1 .003 3.458l-12 7A2 2 0 0 1 5 19z"}]];Qe(t,Ye({name:"play"},()=>a,{get iconNode(){return n},children:(o,s)=>{var l=Se(),c=B(l);We(c,r,"default",{}),d(o,l)},$$slots:{default:!0}}))}function yl(t,r){const a=Ge(r,["children","$$slots","$$events","$$legacy"]);/** + */const n=[["path",{d:"M5 5a2 2 0 0 1 3.008-1.728l11.997 6.998a2 2 0 0 1 .003 3.458l-12 7A2 2 0 0 1 5 19z"}]];Qe(t,Ye({name:"play"},()=>a,{get iconNode(){return n},children:(o,s)=>{var i=Se(),c=B(i);We(c,r,"default",{}),d(o,i)},$$slots:{default:!0}}))}function wi(t,r){const a=Ge(r,["children","$$slots","$$events","$$legacy"]);/** * @license lucide-svelte v1.0.1 - ISC * * ISC License @@ -798,7 +798,7 @@ import{b as Pr,a as d,f as E,c as Se,t as Oe,d as Ot}from"../chunks/C14P8jaG.js" * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. * - */const n=[["path",{d:"M5 12h14"}],["path",{d:"M12 5v14"}]];Qe(t,Ye({name:"plus"},()=>a,{get iconNode(){return n},children:(o,s)=>{var l=Se(),c=B(l);We(c,r,"default",{}),d(o,l)},$$slots:{default:!0}}))}function Jt(t,r){const a=Ge(r,["children","$$slots","$$events","$$legacy"]);/** + */const n=[["path",{d:"M5 12h14"}],["path",{d:"M12 5v14"}]];Qe(t,Ye({name:"plus"},()=>a,{get iconNode(){return n},children:(o,s)=>{var i=Se(),c=B(i);We(c,r,"default",{}),d(o,i)},$$slots:{default:!0}}))}function Jt(t,r){const a=Ge(r,["children","$$slots","$$events","$$legacy"]);/** * @license lucide-svelte v1.0.1 - ISC * * ISC License @@ -845,7 +845,7 @@ import{b as Pr,a as d,f as E,c as Se,t as Oe,d as Ot}from"../chunks/C14P8jaG.js" * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. * - */const n=[["path",{d:"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8"}],["path",{d:"M21 3v5h-5"}],["path",{d:"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16"}],["path",{d:"M8 16H3v5"}]];Qe(t,Ye({name:"refresh-cw"},()=>a,{get iconNode(){return n},children:(o,s)=>{var l=Se(),c=B(l);We(c,r,"default",{}),d(o,l)},$$slots:{default:!0}}))}function wl(t,r){const a=Ge(r,["children","$$slots","$$events","$$legacy"]);/** + */const n=[["path",{d:"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8"}],["path",{d:"M21 3v5h-5"}],["path",{d:"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16"}],["path",{d:"M8 16H3v5"}]];Qe(t,Ye({name:"refresh-cw"},()=>a,{get iconNode(){return n},children:(o,s)=>{var i=Se(),c=B(i);We(c,r,"default",{}),d(o,i)},$$slots:{default:!0}}))}function ki(t,r){const a=Ge(r,["children","$$slots","$$events","$$legacy"]);/** * @license lucide-svelte v1.0.1 - ISC * * ISC License @@ -892,7 +892,7 @@ import{b as Pr,a as d,f as E,c as Se,t as Oe,d as Ot}from"../chunks/C14P8jaG.js" * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. * - */const n=[["path",{d:"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8"}],["path",{d:"M3 3v5h5"}]];Qe(t,Ye({name:"rotate-ccw"},()=>a,{get iconNode(){return n},children:(o,s)=>{var l=Se(),c=B(l);We(c,r,"default",{}),d(o,l)},$$slots:{default:!0}}))}function kl(t,r){const a=Ge(r,["children","$$slots","$$events","$$legacy"]);/** + */const n=[["path",{d:"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8"}],["path",{d:"M3 3v5h5"}]];Qe(t,Ye({name:"rotate-ccw"},()=>a,{get iconNode(){return n},children:(o,s)=>{var i=Se(),c=B(i);We(c,r,"default",{}),d(o,i)},$$slots:{default:!0}}))}function Ci(t,r){const a=Ge(r,["children","$$slots","$$events","$$legacy"]);/** * @license lucide-svelte v1.0.1 - ISC * * ISC License @@ -939,7 +939,7 @@ import{b as Pr,a as d,f as E,c as Se,t as Oe,d as Ot}from"../chunks/C14P8jaG.js" * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. * - */const n=[["path",{d:"M9.671 4.136a2.34 2.34 0 0 1 4.659 0 2.34 2.34 0 0 0 3.319 1.915 2.34 2.34 0 0 1 2.33 4.033 2.34 2.34 0 0 0 0 3.831 2.34 2.34 0 0 1-2.33 4.033 2.34 2.34 0 0 0-3.319 1.915 2.34 2.34 0 0 1-4.659 0 2.34 2.34 0 0 0-3.32-1.915 2.34 2.34 0 0 1-2.33-4.033 2.34 2.34 0 0 0 0-3.831A2.34 2.34 0 0 1 6.35 6.051a2.34 2.34 0 0 0 3.319-1.915"}],["circle",{cx:"12",cy:"12",r:"3"}]];Qe(t,Ye({name:"settings"},()=>a,{get iconNode(){return n},children:(o,s)=>{var l=Se(),c=B(l);We(c,r,"default",{}),d(o,l)},$$slots:{default:!0}}))}function Cl(t,r){const a=Ge(r,["children","$$slots","$$events","$$legacy"]);/** + */const n=[["path",{d:"M9.671 4.136a2.34 2.34 0 0 1 4.659 0 2.34 2.34 0 0 0 3.319 1.915 2.34 2.34 0 0 1 2.33 4.033 2.34 2.34 0 0 0 0 3.831 2.34 2.34 0 0 1-2.33 4.033 2.34 2.34 0 0 0-3.319 1.915 2.34 2.34 0 0 1-4.659 0 2.34 2.34 0 0 0-3.32-1.915 2.34 2.34 0 0 1-2.33-4.033 2.34 2.34 0 0 0 0-3.831A2.34 2.34 0 0 1 6.35 6.051a2.34 2.34 0 0 0 3.319-1.915"}],["circle",{cx:"12",cy:"12",r:"3"}]];Qe(t,Ye({name:"settings"},()=>a,{get iconNode(){return n},children:(o,s)=>{var i=Se(),c=B(i);We(c,r,"default",{}),d(o,i)},$$slots:{default:!0}}))}function Si(t,r){const a=Ge(r,["children","$$slots","$$events","$$legacy"]);/** * @license lucide-svelte v1.0.1 - ISC * * ISC License @@ -986,16 +986,16 @@ import{b as Pr,a as d,f as E,c as Se,t as Oe,d as Ot}from"../chunks/C14P8jaG.js" * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. * - */const n=[["path",{d:"M10 11v6"}],["path",{d:"M14 11v6"}],["path",{d:"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6"}],["path",{d:"M3 6h18"}],["path",{d:"M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2"}]];Qe(t,Ye({name:"trash-2"},()=>a,{get iconNode(){return n},children:(o,s)=>{var l=Se(),c=B(l);We(c,r,"default",{}),d(o,l)},$$slots:{default:!0}}))}var Sl=E('
      • '),Pl=E('
          '),$l=E('
          ',1);function lt(t,r){Me(r,!0);let a=he(r,"value",3,""),n=he(r,"placeholder",3,"Select..."),o=he(r,"class",3,""),s=he(r,"buttonClass",3,""),l=D(!1),c=D(void 0),u=D(void 0),y=D(""),p=O(()=>{var L;return((L=r.options.find(H=>H.value===a()))==null?void 0:L.label)??n()});function T(L){var H;v(l,!1),(H=r.onchange)==null||H.call(r,L)}function w(){if(!e(c)||!e(u))return;const L=e(c).getBoundingClientRect(),H=e(u).offsetHeight,z=4,V=window.innerHeight-L.bottom-z,G=VV?L.top-z-H:L.bottom+z,j=Math.min(L.left,window.innerWidth-L.width);v(y,`position:fixed; top:${G}px; left:${j}px; width:${L.width}px; z-index:9999;`)}async function N(){v(l,!e(l)),e(l)&&(await Pt(),w())}function A(L){L.key==="Escape"&&v(l,!1)}function b(L){e(l)&&e(c)&&!e(c).contains(L.target)&&e(u)&&!e(u).contains(L.target)&&v(l,!1)}var f=$l();et("mousedown",st,b),et("keydown",st,A),et("scroll",st,()=>{e(l)&&v(l,!1)});var _=B(f),P=C(_),x=C(P),S=C(x,!0);h(x);var R=M(x,2),m=C(R);Fe(m,{get icon(){return wn},size:14}),h(R),h(P),rt(P,L=>v(c,L),()=>e(c)),h(_);var $=M(_,2);{var F=L=>{Qt(L,{children:(H,z)=>{var V=Pl();Ue(V,21,()=>r.options,I=>I.value,(I,G)=>{var j=Sl();ye(j,"tabindex",0);var q=C(j,!0);h(j),Q(()=>{ye(j,"aria-selected",e(G).value===a()),ke(j,1,`px-2.5 py-1.5 text-[13px] cursor-pointer transition-colors duration-100 - ${e(G).value===a()?"text-edf-bleu-fonce font-bold bg-[rgba(16,87,200,0.06)]":"text-ink hover:bg-edf-gris-clair"}`),re(q,e(G).label)}),le("mousedown",j,g=>{g.stopPropagation(),T(e(G).value)}),d(I,j)}),h(V),rt(V,I=>v(u,I),()=>e(u)),Q(()=>Xe(V,e(y))),d(H,V)}})};X($,L=>{e(l)&&L(F)})}Q(()=>{ke(_,1,`relative inline-flex ${o()??""}`),ke(P,1,dt(s()||"flex items-center justify-between gap-1.5 w-full h-[30px] cursor-pointer bg-white border border-border rounded-md text-[13px] text-ink font-normal pl-2.5 pr-2 transition-colors duration-150 hover:bg-edf-gris-clair focus:outline-none focus:border-edf-bleu-moyen")),ye(P,"aria-expanded",e(l)),re(S,e(p)),ke(R,1,`text-muted shrink-0 transition-transform duration-150 ${e(l)?"rotate-180":""}`)}),le("mousedown",P,L=>{L.stopPropagation(),N()}),d(t,f),Te()}qe(["mousedown"]);var Rl=Ot(''),El=E('
          '),Nl=E('
          '),Ml=E('
          ',1);function Kt(t,r){Me(r,!0);let a=he(r,"selected",19,()=>[]),n=he(r,"placeholder",3,"Select..."),o=he(r,"class",3,""),s=D(!1),l=D(void 0),c=D(void 0),u=D(""),y=O(()=>new Set(a())),p=O(()=>a().length===0?n():a().length===r.options.length?`All (${r.options.length})`:a().length<=2?a().map(z=>{var V;return((V=r.options.find(I=>I.value===z))==null?void 0:V.label)??z}).join(", "):`${a().length} selected`);function T(z){var I;const V=new Set(e(y));V.has(z)?V.delete(z):V.add(z),(I=r.onchange)==null||I.call(r,[...V])}function w(){var z;(z=r.onchange)==null||z.call(r,r.options.map(V=>V.value))}function N(){var z;(z=r.onchange)==null||z.call(r,[])}function A(){if(!e(l)||!e(c))return;const z=e(l).getBoundingClientRect(),V=e(c).offsetHeight,I=4,G=window.innerHeight-z.bottom-I,q=GG?z.top-I-V:z.bottom+I,g=Math.min(z.left,window.innerWidth-z.width);v(u,`position:fixed; top:${q}px; left:${g}px; min-width:${z.width}px; z-index:9999;`)}async function b(){v(s,!e(s)),e(s)&&(await Pt(),A())}function f(z){e(s)&&e(l)&&!e(l).contains(z.target)&&e(c)&&!e(c).contains(z.target)&&v(s,!1)}function _(z){z.key==="Escape"&&v(s,!1)}var P=Ml();et("mousedown",st,f),et("keydown",st,_),et("scroll",st,()=>{e(s)&&v(s,!1)});var x=B(P),S=C(x),R=C(S),m=C(R,!0);h(R);var $=M(R,2),F=C($);Fe(F,{get icon(){return wn},size:14}),h($),h(S),rt(S,z=>v(l,z),()=>e(l)),h(x);var L=M(x,2);{var H=z=>{Qt(z,{children:(V,I)=>{var G=Nl(),j=C(G),q=C(j),g=M(q,2);h(j);var i=M(j,2);Ue(i,17,()=>r.options,k=>k.value,(k,U)=>{var W=El(),ee=C(W),ne=C(ee);{var pe=ie=>{var we=Rl();d(ie,we)},K=O(()=>e(y).has(e(U).value));X(ne,ie=>{e(K)&&ie(pe)})}h(ee);var Y=M(ee,2),ce=C(Y,!0);h(Y),h(W),Q(ie=>{ke(ee,1,`inline-flex items-center justify-center shrink-0 w-[14px] h-[14px] rounded border-2 transition-colors duration-100 - ${ie??""}`),re(ce,e(U).label)},[()=>e(y).has(e(U).value)?"bg-edf-bleu-moyen border-edf-bleu-moyen text-white":"bg-white border-edf-gris-moyen"]),le("mousedown",W,ie=>{ie.stopPropagation(),T(e(U).value)}),d(k,W)}),h(G),rt(G,k=>v(c,k),()=>e(c)),Q(()=>Xe(G,e(u))),le("mousedown",q,k=>{k.stopPropagation(),w()}),le("mousedown",g,k=>{k.stopPropagation(),N()}),d(V,G)}})};X(L,z=>{e(s)&&z(H)})}Q(()=>{ke(x,1,`relative inline-flex ${o()??""}`),ye(S,"aria-expanded",e(s)),re(m,e(p)),ke($,1,`text-muted shrink-0 transition-transform duration-150 ${e(s)?"rotate-180":""}`)}),le("mousedown",S,z=>{z.stopPropagation(),b()}),d(t,P),Te()}qe(["mousedown"]);var Tl=E(" ",1),Al=E(''),Ll=E('Loading...'),Fl=E('No folders found'),Dl=E('
          '),Il=E('
          ',1);function zl(t,r){Me(r,!0);const a=xs();let n=D("keep_latest"),o=D(se(a.keepLast)),s=D(se([])),l=D(se([])),c=D(!0),u=O(()=>e(n)==="keep_folder"||e(n)==="delete_folder");const y=[{value:"keep_latest",label:"Keep latest N"},{value:"delete_all",label:"Delete all runs"},{value:"keep_folder",label:"Keep specific folders"},{value:"delete_folder",label:"Delete specific folders"}];let p=O(()=>e(s).map(w=>({value:w,label:w})));fn(async()=>{try{v(s,await Sa(r.cases),!0)}catch{v(s,[],!0)}v(c,!1)});async function T(){if(e(u)&&e(l).length===0){await tt("Please select at least one run folder.","Missing selection");return}const w={action:e(n)};e(n)==="keep_latest"?(w.keepLast=e(o),ys({keepLast:e(o)})):e(n)==="delete_all"?w.keepLast=0:e(n)==="keep_folder"?w.keepResu=e(l):e(n)==="delete_folder"&&(w.deleteResu=e(l)),ot(w)}{const w=b=>{var f=Tl(),_=B(f);Re(_,{variant:"secondary",onclick:()=>ot(null),children:(x,S)=>{Ce();var R=Oe("Cancel");d(x,R)},$$slots:{default:!0}});var P=M(_,2);Re(P,{variant:"primary",onclick:T,children:(x,S)=>{Ce();var R=Oe("Clean");d(x,R)},$$slots:{default:!0}}),d(b,f)};let N=O(()=>r.cases.length),A=O(()=>r.cases.length>1?"s":"");hr(t,{title:"Cleanup Cases",titleId:"clean-dialog-title",get subtitle(){return`${e(N)??""} case${e(A)??""} selected`},footer:w,children:(b,f)=>{var _=Il(),P=B(_),x=C(P);Ne(x,{text:"Action",children:(F,L)=>{lt(F,{class:"w-[200px]",get options(){return y},get value(){return e(n)},onchange:H=>v(n,H,!0)})}});var S=M(x,2);{var R=F=>{Ne(F,{text:"Keep last",children:(L,H)=>{var z=Al();Ke(z),Ze(z,()=>e(o),V=>v(o,V)),d(L,z)}})};X(S,F=>{e(n)==="keep_latest"&&F(R)})}h(P);var m=M(P,2);{var $=F=>{var L=Dl(),H=C(L);Ne(H,{text:"Run folders",children:(z,V)=>{var I=Se(),G=B(I);{var j=i=>{var k=Ll();d(i,k)},q=i=>{var k=Fl();d(i,k)},g=i=>{Kt(i,{class:"w-full",get options(){return e(p)},get selected(){return e(l)},onchange:k=>v(l,k,!0),placeholder:"Select folders..."})};X(G,i=>{e(c)?i(j):e(s).length===0?i(q,1):i(g,-1)})}d(z,I)}}),h(L),d(F,L)};X(m,F=>{e(u)&&F($)})}d(b,_)},$$slots:{footer:!0,default:!0}})}Te()}function Ol(t,r){Me(r,!0);let a=O(es);var n=Se(),o=B(n);{var s=y=>{$s(y,{get cases(){return e(a).props.cases}})},l=y=>{ll(y,{get cases(){return e(a).props.cases}})},c=y=>{zl(y,{get cases(){return e(a).props.cases}})},u=y=>{vs(y,{get mode(){return e(a).type},get title(){return e(a).props.title},get message(){return e(a).props.message},get confirmLabel(){return e(a).props.confirmLabel},get confirmVariant(){return e(a).props.confirmVariant},get value(){return e(a).props.value},get placeholder(){return e(a).props.placeholder},get multiline(){return e(a).props.multiline}})};X(o,y=>{e(a).type==="run"?y(s):e(a).type==="restart"?y(l,1):e(a).type==="clean"?y(c,2):(e(a).type==="alert"||e(a).type==="confirm"||e(a).type==="prompt")&&y(u,3)})}d(t,n),Te()}let fr=D(se([])),Hl=0;function jl(){return e(fr)}function Ul(t,r="success",a=3500){const n=++Hl;v(fr,[...e(fr),{id:n,message:t,variant:r}],!0),setTimeout(()=>Ea(n),a)}function Ea(t){v(fr,e(fr).filter(r=>r.id!==t),!0)}var Vl=E('
          '),Bl=E('
          ');function ql(t,r){Me(r,!0);let a=O(jl);Qt(t,{children:(n,o)=>{var s=Bl();Ue(s,21,()=>e(a),l=>l.id,(l,c)=>{var u=Vl(),y=C(u,!0);h(u),Q(()=>{ke(u,1,`pointer-events-auto max-w-[320px] px-4 py-2.5 rounded-md shadow-lg text-sm font-semibold text-white cursor-pointer ${e(c).variant==="success"?"bg-edf-vert-fonce":"bg-edf-orange-fonce"}`),re(y,e(c).message)}),le("click",u,()=>Ea(e(c).id)),d(l,u)}),h(s),d(n,s)}}),Te()}qe(["click"]);var Kl=Ot(''),Gl=Ot(''),Wl=E(''),Xl=E(" ",1),Yl=E(" ",1),Ql=E('');function zt(t,r){Me(r,!0);const a=b=>{var f=Wl(),_=C(f);{var P=S=>{var R=Kl();Q(()=>Xe(R,`width: ${l()-4}px; height: ${l()-4}px;`)),d(S,R)},x=S=>{var R=Gl();Q(()=>Xe(R,`width: ${l()-4}px; height: ${l()-4}px;`)),d(S,R)};X(_,S=>{n()&&!o()?S(P):o()&&S(x,1)})}h(f),Q(()=>{ke(f,1,`inline-flex items-center justify-center rounded border-2 cursor-pointer transition-colors duration-100 shrink-0 + */const n=[["path",{d:"M10 11v6"}],["path",{d:"M14 11v6"}],["path",{d:"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6"}],["path",{d:"M3 6h18"}],["path",{d:"M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2"}]];Qe(t,Ye({name:"trash-2"},()=>a,{get iconNode(){return n},children:(o,s)=>{var i=Se(),c=B(i);We(c,r,"default",{}),d(o,i)},$$slots:{default:!0}}))}var Pi=E('
        • '),$i=E('
            '),Ri=E('
            ',1);function it(t,r){Me(r,!0);let a=he(r,"value",3,""),n=he(r,"placeholder",3,"Select..."),o=he(r,"class",3,""),s=he(r,"buttonClass",3,""),i=D(!1),c=D(void 0),u=D(void 0),w=D(""),p=O(()=>{var L;return((L=r.options.find(j=>j.value===a()))==null?void 0:L.label)??n()});function T(L){var j;v(i,!1),(j=r.onchange)==null||j.call(r,L)}function y(){if(!e(c)||!e(u))return;const L=e(c).getBoundingClientRect(),j=e(u).offsetHeight,z=4,V=window.innerHeight-L.bottom-z,G=VV?L.top-z-j:L.bottom+z,U=Math.min(L.left,window.innerWidth-L.width);v(w,`position:fixed; top:${G}px; left:${U}px; width:${L.width}px; z-index:9999;`)}async function N(){v(i,!e(i)),e(i)&&(await Pt(),y())}function A(L){L.key==="Escape"&&v(i,!1)}function b(L){e(i)&&e(c)&&!e(c).contains(L.target)&&e(u)&&!e(u).contains(L.target)&&v(i,!1)}var f=Ri();et("mousedown",st,b),et("keydown",st,A),et("scroll",st,()=>{e(i)&&v(i,!1)});var _=B(f),P=k(_),x=k(P),S=k(x,!0);h(x);var R=M(x,2),m=k(R);Fe(m,{get icon(){return wn},size:14}),h(R),h(P),rt(P,L=>v(c,L),()=>e(c)),h(_);var $=M(_,2);{var F=L=>{Qt(L,{children:(j,z)=>{var V=$i();Ue(V,21,()=>r.options,I=>I.value,(I,G)=>{var U=Pi();ye(U,"tabindex",0);var q=k(U,!0);h(U),Q(()=>{ye(U,"aria-selected",e(G).value===a()),ke(U,1,`px-2.5 py-1.5 text-[13px] cursor-pointer transition-colors duration-100 + ${e(G).value===a()?"text-edf-bleu-fonce font-bold bg-[rgba(16,87,200,0.06)]":"text-ink hover:bg-edf-gris-clair"}`),re(q,e(G).label)}),ie("mousedown",U,g=>{g.stopPropagation(),T(e(G).value)}),d(I,U)}),h(V),rt(V,I=>v(u,I),()=>e(u)),Q(()=>Xe(V,e(w))),d(j,V)}})};X($,L=>{e(i)&&L(F)})}Q(()=>{ke(_,1,`relative inline-flex ${o()??""}`),ke(P,1,dt(s()||"flex items-center justify-between gap-1.5 w-full h-[30px] cursor-pointer bg-white border border-border rounded-md text-[13px] text-ink font-normal pl-2.5 pr-2 transition-colors duration-150 hover:bg-edf-gris-clair focus:outline-none focus:border-edf-bleu-moyen")),ye(P,"aria-expanded",e(i)),re(S,e(p)),ke(R,1,`text-muted shrink-0 transition-transform duration-150 ${e(i)?"rotate-180":""}`)}),ie("mousedown",P,L=>{L.stopPropagation(),N()}),d(t,f),Te()}qe(["mousedown"]);var Ei=Ot(''),Ni=E('
            '),Mi=E('
            '),Ti=E('
            ',1);function Kt(t,r){Me(r,!0);let a=he(r,"selected",19,()=>[]),n=he(r,"placeholder",3,"Select..."),o=he(r,"class",3,""),s=D(!1),i=D(void 0),c=D(void 0),u=D(""),w=O(()=>new Set(a())),p=O(()=>a().length===0?n():a().length===r.options.length?`All (${r.options.length})`:a().length<=2?a().map(z=>{var V;return((V=r.options.find(I=>I.value===z))==null?void 0:V.label)??z}).join(", "):`${a().length} selected`);function T(z){var I;const V=new Set(e(w));V.has(z)?V.delete(z):V.add(z),(I=r.onchange)==null||I.call(r,[...V])}function y(){var z;(z=r.onchange)==null||z.call(r,r.options.map(V=>V.value))}function N(){var z;(z=r.onchange)==null||z.call(r,[])}function A(){if(!e(i)||!e(c))return;const z=e(i).getBoundingClientRect(),V=e(c).offsetHeight,I=4,G=window.innerHeight-z.bottom-I,q=GG?z.top-I-V:z.bottom+I,g=Math.min(z.left,window.innerWidth-z.width);v(u,`position:fixed; top:${q}px; left:${g}px; min-width:${z.width}px; z-index:9999;`)}async function b(){v(s,!e(s)),e(s)&&(await Pt(),A())}function f(z){e(s)&&e(i)&&!e(i).contains(z.target)&&e(c)&&!e(c).contains(z.target)&&v(s,!1)}function _(z){z.key==="Escape"&&v(s,!1)}var P=Ti();et("mousedown",st,f),et("keydown",st,_),et("scroll",st,()=>{e(s)&&v(s,!1)});var x=B(P),S=k(x),R=k(S),m=k(R,!0);h(R);var $=M(R,2),F=k($);Fe(F,{get icon(){return wn},size:14}),h($),h(S),rt(S,z=>v(i,z),()=>e(i)),h(x);var L=M(x,2);{var j=z=>{Qt(z,{children:(V,I)=>{var G=Mi(),U=k(G),q=k(U),g=M(q,2);h(U);var l=M(U,2);Ue(l,17,()=>r.options,C=>C.value,(C,H)=>{var W=Ni(),ee=k(W),ne=k(ee);{var pe=le=>{var we=Ei();d(le,we)},K=O(()=>e(w).has(e(H).value));X(ne,le=>{e(K)&&le(pe)})}h(ee);var Y=M(ee,2),ce=k(Y,!0);h(Y),h(W),Q(le=>{ke(ee,1,`inline-flex items-center justify-center shrink-0 w-[14px] h-[14px] rounded border-2 transition-colors duration-100 + ${le??""}`),re(ce,e(H).label)},[()=>e(w).has(e(H).value)?"bg-edf-bleu-moyen border-edf-bleu-moyen text-white":"bg-white border-edf-gris-moyen"]),ie("mousedown",W,le=>{le.stopPropagation(),T(e(H).value)}),d(C,W)}),h(G),rt(G,C=>v(c,C),()=>e(c)),Q(()=>Xe(G,e(u))),ie("mousedown",q,C=>{C.stopPropagation(),y()}),ie("mousedown",g,C=>{C.stopPropagation(),N()}),d(V,G)}})};X(L,z=>{e(s)&&z(j)})}Q(()=>{ke(x,1,`relative inline-flex ${o()??""}`),ye(S,"aria-expanded",e(s)),re(m,e(p)),ke($,1,`text-muted shrink-0 transition-transform duration-150 ${e(s)?"rotate-180":""}`)}),ie("mousedown",S,z=>{z.stopPropagation(),b()}),d(t,P),Te()}qe(["mousedown"]);var Ai=E(" ",1),Li=E(''),Fi=E('Loading...'),Di=E('No folders found'),Ii=E('
            '),zi=E('
            ',1);function Oi(t,r){Me(r,!0);const a=ys();let n=D("keep_latest"),o=D(se(a.keepLast)),s=D(se([])),i=D(se([])),c=D(!0),u=O(()=>e(n)==="keep_folder"||e(n)==="delete_folder"),w=O(()=>[{value:"keep_latest",label:"Keep latest N"},{value:"delete_all",label:"Delete all runs"},...r.cases.length===1?[{value:"keep_folder",label:"Keep specific folders"},{value:"delete_folder",label:"Delete specific folders"}]:[]]),p=O(()=>e(s).map(y=>({value:y,label:y})));fn(async()=>{if(r.cases.length===1){try{v(s,await Pa(r.cases),!0)}catch{v(s,[],!0)}v(c,!1)}});async function T(){if(e(u)&&e(i).length===0){await tt("Please select at least one run folder.","Missing selection");return}const y={action:e(n)};e(n)==="keep_latest"?(y.keepLast=e(o),ws({keepLast:e(o)})):e(n)==="delete_all"?y.keepLast=0:e(n)==="keep_folder"?y.keepResu=e(i):e(n)==="delete_folder"&&(y.deleteResu=e(i)),ot(y)}{const y=b=>{var f=Ai(),_=B(f);Re(_,{variant:"secondary",onclick:()=>ot(null),children:(x,S)=>{Ce();var R=Oe("Cancel");d(x,R)},$$slots:{default:!0}});var P=M(_,2);Re(P,{variant:"primary",onclick:T,children:(x,S)=>{Ce();var R=Oe("Clean");d(x,R)},$$slots:{default:!0}}),d(b,f)};let N=O(()=>r.cases.length),A=O(()=>r.cases.length>1?"s":"");hr(t,{title:"Cleanup Cases",titleId:"clean-dialog-title",get subtitle(){return`${e(N)??""} case${e(A)??""} selected`},footer:y,children:(b,f)=>{var _=zi(),P=B(_),x=k(P);Ne(x,{text:"Action",children:(F,L)=>{it(F,{class:"w-[200px]",get options(){return e(w)},get value(){return e(n)},onchange:j=>v(n,j,!0)})}});var S=M(x,2);{var R=F=>{Ne(F,{text:"Keep last",children:(L,j)=>{var z=Li();Ke(z),Ze(z,()=>e(o),V=>v(o,V)),d(L,z)}})};X(S,F=>{e(n)==="keep_latest"&&F(R)})}h(P);var m=M(P,2);{var $=F=>{var L=Ii(),j=k(L);Ne(j,{text:"Run folders",children:(z,V)=>{var I=Se(),G=B(I);{var U=l=>{var C=Fi();d(l,C)},q=l=>{var C=Di();d(l,C)},g=l=>{Kt(l,{class:"w-full",get options(){return e(p)},get selected(){return e(i)},onchange:C=>v(i,C,!0),placeholder:"Select folders..."})};X(G,l=>{e(c)?l(U):e(s).length===0?l(q,1):l(g,-1)})}d(z,I)}}),h(L),d(F,L)};X(m,F=>{e(u)&&F($)})}d(b,_)},$$slots:{footer:!0,default:!0}})}Te()}function Hi(t,r){Me(r,!0);let a=O(ts);var n=Se(),o=B(n);{var s=w=>{Rs(w,{get cases(){return e(a).props.cases}})},i=w=>{li(w,{get cases(){return e(a).props.cases}})},c=w=>{Oi(w,{get cases(){return e(a).props.cases}})},u=w=>{gs(w,{get mode(){return e(a).type},get title(){return e(a).props.title},get message(){return e(a).props.message},get confirmLabel(){return e(a).props.confirmLabel},get confirmVariant(){return e(a).props.confirmVariant},get value(){return e(a).props.value},get placeholder(){return e(a).props.placeholder},get multiline(){return e(a).props.multiline}})};X(o,w=>{e(a).type==="run"?w(s):e(a).type==="restart"?w(i,1):e(a).type==="clean"?w(c,2):(e(a).type==="alert"||e(a).type==="confirm"||e(a).type==="prompt")&&w(u,3)})}d(t,n),Te()}let fr=D(se([])),ji=0;function Ui(){return e(fr)}function qn(t,r="success",a=3500){const n=++ji;v(fr,[...e(fr),{id:n,message:t,variant:r}],!0),setTimeout(()=>Na(n),a)}function Na(t){v(fr,e(fr).filter(r=>r.id!==t),!0)}var Vi=E('
            '),Bi=E('
            ');function qi(t,r){Me(r,!0);let a=O(Ui);Qt(t,{children:(n,o)=>{var s=Bi();Ue(s,21,()=>e(a),i=>i.id,(i,c)=>{var u=Vi(),w=k(u,!0);h(u),Q(()=>{ke(u,1,`pointer-events-auto max-w-[320px] px-4 py-2.5 rounded-md shadow-lg text-sm font-semibold text-white cursor-pointer ${e(c).variant==="success"?"bg-edf-vert-fonce":"bg-edf-orange-fonce"}`),re(w,e(c).message)}),ie("click",u,()=>Na(e(c).id)),d(i,u)}),h(s),d(n,s)}}),Te()}qe(["click"]);var Ki=Ot(''),Gi=Ot(''),Wi=E(''),Xi=E(" ",1),Yi=E(" ",1),Qi=E('');function zt(t,r){Me(r,!0);const a=b=>{var f=Wi(),_=k(f);{var P=S=>{var R=Ki();Q(()=>Xe(R,`width: ${i()-4}px; height: ${i()-4}px;`)),d(S,R)},x=S=>{var R=Gi();Q(()=>Xe(R,`width: ${i()-4}px; height: ${i()-4}px;`)),d(S,R)};X(_,S=>{n()&&!o()?S(P):o()&&S(x,1)})}h(f),Q(()=>{ke(f,1,`inline-flex items-center justify-center rounded border-2 cursor-pointer transition-colors duration-100 shrink-0 ${s()?"opacity-40 cursor-not-allowed":""} - ${n()||o()?"bg-edf-bleu-moyen border-edf-bleu-moyen text-white":"bg-white border-edf-gris-moyen hover:border-edf-bleu-clair"}`),Xe(f,`width: ${l()??""}px; height: ${l()??""}px;`),ye(f,"aria-checked",o()?"mixed":n()),ye(f,"aria-disabled",s()),ye(f,"tabindex",s()?-1:0)}),le("click",f,y),le("keydown",f,p),d(b,f)};let n=he(r,"checked",3,!1),o=he(r,"indeterminate",3,!1),s=he(r,"disabled",3,!1),l=he(r,"size",3,16),c=he(r,"label",3,""),u=he(r,"labelFirst",3,!1);function y(b){var _;if(b.stopPropagation(),s())return;const f=o()?!0:!n();(_=r.onchange)==null||_.call(r,f)}function p(b){(b.key===" "||b.key==="Enter")&&(b.preventDefault(),b.stopPropagation(),y(b))}var T=Se(),w=B(T);{var N=b=>{var f=Ql(),_=C(f);{var P=S=>{var R=Xl(),m=B(R),$=C(m,!0);h(m);var F=M(m);a(F),Q(()=>re($,c())),d(S,R)},x=S=>{var R=Yl(),m=B(R);a(m);var $=M(m),F=C($,!0);h($),Q(()=>re(F,c())),d(S,R)};X(_,S=>{u()?S(P):S(x,-1)})}h(f),le("click",f,y),le("keydown",f,p),d(b,f)},A=b=>{a(b)};X(w,b=>{c()?b(N):b(A,-1)})}d(t,T),Te()}qe(["click","keydown"]);function kn(t,r){try{const a=localStorage.getItem(t);return a===null?r:JSON.parse(a)}catch{return r}}function Ir(t,r){localStorage.setItem(t,JSON.stringify(r))}const tn=new Map;function pr(t,r,a){vt(t),tn.set(t,setInterval(r,a))}function vt(t){const r=tn.get(t);r!==void 0&&(clearInterval(r),tn.delete(t))}const Ft={status:1e3,tail:1e3,plot:3e3,probe:3e3,errors:5e3},Jl=["status","plot","probe","tail","errors"],Wr={status:{label:"Status table",min:500},plot:{label:"Residual plots",min:1e3},probe:{label:"Probe plots",min:1e3},tail:{label:"Log tail",min:500},errors:{label:"Recent errors",min:2e3}},sr=kn("csauto_refresh_rates",{});let _t=D(se({status:sr.status??Ft.status,tail:sr.tail??Ft.tail,plot:sr.plot??Ft.plot,probe:sr.probe??Ft.probe,errors:sr.errors??Ft.errors}));function Zl(){return e(_t)}function ei(t,r){v(_t,{...e(_t),[t]:r},!0),Ir("csauto_refresh_rates",e(_t))}function ti(){return e(_t).status}function qn(){return e(_t).tail}function Kn(){return e(_t).plot}function ri(){return e(_t).probe}function Gn(){return e(_t).errors}const rn=new Set;function _r(t){return rn.add(t),()=>rn.delete(t)}function ni(){rn.forEach(t=>t())}const nn=kn("csauto_autorefresh_enabled",{});function Zt(t){return nn[t]??!0}function er(t,r){nn[t]=r,Ir("csauto_autorefresh_enabled",nn)}var ai=E(" ",1),oi=E('
            ms
            '),si=E('
            Telemetry
            '),li=E('
            API token
            Auto-refresh intervals
            ',1);function ii(t,r){Me(r,!0);let a=D(se(_n())),n=D(se({...Zl()})),o=D(!0),s=D(!1);Ee(()=>{Gs().then(y=>{v(o,y.enabled,!0),v(s,!0)}).catch(()=>{v(s,!1)})});function l(y){const{min:p}=Wr[y];let T=e(n)[y];(typeof T!="number"||isNaN(T))&&(T=Ft[y]),v(n,{...e(n),[y]:Math.max(p,Math.round(T))},!0)}function c(y,p){const T=p.target,w=T.value.replace(/[^0-9]/g,""),N=parseInt(w,10);isNaN(N)?w===""&&v(n,{...e(n),[y]:Wr[y].min},!0):v(n,{...e(n),[y]:N},!0),T.value=String(e(n)[y])}function u(){ka(e(a));for(const y of Object.keys(e(n)))l(y),ei(y,e(n)[y]);e(s)&&Ws(e(o)).catch(()=>{}),r.onClose()}hr(t,{title:"Settings",titleId:"settings-dialog-title",get onCancel(){return r.onClose},onConfirm:u,maxWidth:"400px",portal:!0,footer:p=>{var T=ai(),w=B(T);Re(w,{variant:"secondary",get onclick(){return r.onClose},children:(A,b)=>{Ce();var f=Oe("Cancel");d(A,f)},$$slots:{default:!0}});var N=M(w,2);Re(N,{variant:"primary",onclick:u,children:(A,b)=>{Ce();var f=Oe("Save");d(A,f)},$$slots:{default:!0}}),d(p,T)},children:(p,T)=>{var w=li(),N=B(w),A=M(C(N),2);Ke(A),h(N);var b=M(N,2),f=C(b),_=M(C(f),2);h(f);var P=M(f,2);Ue(P,20,()=>Jl,R=>R,(R,m)=>{const $=O(()=>Wr[m]);var F=oi(),L=C(F),H=C(L),z=C(H,!0);h(H);var V=M(H,2),I=C(V);h(V),h(L);var G=M(L,2),j=C(G);Ke(j),Ce(2),h(G),h(F),Q(()=>{re(z,e($).label),re(I,`min ${e($).min??""}ms`),hn(j,e(n)[m])}),le("input",j,q=>c(m,q)),et("blur",j,()=>l(m)),d(R,F)}),h(P),h(b);var x=M(b,2);{var S=R=>{var m=si(),$=M(C(m),2);zt($,{get checked(){return e(o)},onchange:F=>v(o,F,!0),label:"Send anonymous usage statistics"}),h(m),d(R,m)};X(x,R=>{e(s)&&R(S)})}Ze(A,()=>e(a),R=>v(a,R)),le("click",_,()=>v(n,{...Ft},!0)),d(p,w)},$$slots:{footer:!0,default:!0}}),Te()}qe(["click","input"]);var ci=E(''),ui=E(' '),di=E('
            ',1);function fi(t,r){Me(r,!0);let a=O(()=>r.shownCases!==r.totalCases),n=O($t),o=D(!1);var s=di(),l=B(s),c=C(l),u=C(c);{var y=i=>{var k=ci();Q(U=>{ye(k,"src",U),ye(k,"alt",e(n).solver)},[()=>Ns(e(n).solver)]),d(i,k)},p=i=>{var k=ui(),U=C(k,!0);h(k),Q(()=>re(U,e(n).solver)),d(i,k)};X(u,i=>{var k;(k=e(n))!=null&&k.logo?i(y):e(n)&&i(p,1)})}h(c);var T=M(c,2),w=C(T),N=C(w),A=C(N);{var b=i=>{var k=Oe();Q(()=>re(k,`${r.shownCases??""}/`)),d(i,k)};X(A,i=>{e(a)&&i(b)})}var f=M(A,1,!0);h(N);var _=M(N,2),P=C(_,!0);h(_),h(w);var x=M(w,2),S=C(x),R=C(S);{var m=i=>{var k=Oe();Q(()=>re(k,`${r.shownRunning??""}/`)),d(i,k)};X(R,i=>{e(a)&&i(m)})}var $=M(R,1,!0);h(S),Ce(2),h(x);var F=M(x,2),L=C(F),H=C(L);{var z=i=>{var k=Oe();Q(()=>re(k,`${r.shownConverged??""}/`)),d(i,k)};X(H,i=>{e(a)&&i(z)})}var V=M(H,1,!0);h(L),Ce(2),h(F),h(T);var I=M(T,2),G=C(I),j=C(G);Fe(j,{get icon(){return kl},size:18}),h(G),h(I),h(l);var q=M(l,2);{var g=i=>{ii(i,{onClose:()=>v(o,!1)})};X(q,i=>{e(o)&&i(g)})}Q(()=>{re(f,r.totalCases),re(P,r.totalCases===1?"case":"cases"),re($,r.totalRunning),re(V,r.totalConverged)}),le("click",G,()=>v(o,!0)),d(t,s),Te()}qe(["click"]);const vi=""+new URL("../assets/simvia-logo.kLDq7Uoj.svg",import.meta.url).href;var gi=E('
            '),hi=E('

            '),mi=E("
            "),pi=E('
            '),_i=E('
            '),bi=E('
            ');function Ht(t,r){let a=he(r,"eyebrow",3,""),n=he(r,"title",3,""),o=he(r,"wide",3,!1);var s=bi(),l=M(C(s),2);{var c=y=>{var p=_i(),T=C(p);{var w=f=>{var _=Se(),P=B(_);ft(P,()=>r.titleSlot),d(f,_)},N=f=>{var _=mi(),P=C(_);{var x=m=>{var $=gi(),F=C($,!0);h($),Q(()=>re(F,a())),d(m,$)};X(P,m=>{a()&&m(x)})}var S=M(P,2);{var R=m=>{var $=hi(),F=C($,!0);h($),Q(()=>re(F,n())),d(m,$)};X(S,m=>{n()&&m(R)})}h(_),d(f,_)};X(T,f=>{r.titleSlot?f(w):f(N,-1)})}var A=M(T,2);{var b=f=>{var _=pi(),P=C(_);ft(P,()=>r.actions),h(_),d(f,_)};X(A,f=>{r.actions&&f(b)})}h(p),d(y,p)};X(l,y=>{(a()||n()||r.titleSlot||r.actions)&&y(c)})}var u=M(l,2);ft(u,()=>r.children),h(s),Q(()=>{ke(s,1,`${o()?"col-span-12":"col-span-6"} bg-card border border-border rounded-[10px] p-[16px_18px_18px] relative overflow-clip animate-rise`),ye(s,"id",r.id)}),d(t,s)}function tr(t,r){Me(r,!0);let a=he(r,"checked",15,!0);Ee(()=>{a()?pr(r.name,r.onRefresh,r.intervalMs):vt(r.name)}),vr(()=>vt(r.name)),zt(t,{get checked(){return a()},onchange:n=>a(n),size:14,label:"Auto-refresh",labelFirst:!0}),Te()}var xi=E(" ",1),yi=E('
          • '),wi=E(''),ki=E(' ',1);function Ci(t,r){Me(r,!0);let a=he(r,"label",3,"More"),n=D(!1),o=D(void 0),s=D(void 0),l=D("");function c(){if(!e(o)||!e(s))return;const P=e(o).getBoundingClientRect(),x=e(s).offsetHeight,S=4,R=window.innerHeight-P.bottom-S,$=RR?P.top-S-x:P.bottom+S,F=Math.min(P.left,window.innerWidth-180);v(l,`position:fixed; top:${$}px; left:${F}px; min-width:170px; z-index:9999;`)}async function u(){var P,x;v(n,!e(n)),e(n)&&(await Pt(),c(),(x=(P=e(s))==null?void 0:P.querySelector("button:not(:disabled)"))==null||x.focus({preventScroll:!0}))}function y(){var P,x;v(n,!1),(x=(P=e(o))==null?void 0:P.querySelector("button"))==null||x.focus()}function p(P){P.disabled||(y(),P.onClick())}function T(P){var m,$;if(P.key!=="ArrowDown"&&P.key!=="ArrowUp")return;P.preventDefault();const x=Array.from(((m=e(s))==null?void 0:m.querySelectorAll("button:not(:disabled)"))??[]),S=x.indexOf(document.activeElement),R=P.key==="ArrowDown"?1:x.length-1;($=x[(S+R)%x.length])==null||$.focus()}function w(P){e(n)&&e(o)&&!e(o).contains(P.target)&&e(s)&&!e(s).contains(P.target)&&v(n,!1)}var N=ki();et("mousedown",st,w),et("keydown",st,P=>{P.key==="Escape"&&e(n)&&y()}),et("scroll",st,()=>{e(n)&&v(n,!1)});var A=B(N),b=C(A);Re(b,{variant:"secondary",size:"sm",onclick:u,children:(P,x)=>{var S=xi(),R=B(S);Fe(R,{get icon(){return ml}});var m=M(R);Q(()=>re(m,` ${a()??""}`)),d(P,S)},$$slots:{default:!0}}),h(A),rt(A,P=>v(o,P),()=>e(o));var f=M(A,2);{var _=P=>{Qt(P,{children:(x,S)=>{var R=wi();Ue(R,21,()=>r.items,m=>m.label,(m,$)=>{var F=yi(),L=C(F),H=C(L,!0);h(L),h(F),Q(()=>{L.disabled=e($).disabled,ye(L,"aria-disabled",e($).disabled),ke(L,1,`w-full flex items-center gap-2 text-left py-[7px] px-[10px] bg-transparent border border-transparent rounded-md text-[12.5px] text-ink transition-[background] duration-[120ms] ease-in-out disabled:opacity-40 disabled:pointer-events-none ${e($).disabled?"":"cursor-pointer hover:bg-edf-gris-clair hover:border-border"}`),re(H,e($).label)}),le("click",L,()=>p(e($))),d(m,F)}),h(R),rt(R,m=>v(s,m),()=>e(s)),Q(()=>Xe(R,e(l))),le("keydown",R,T),d(x,R)}})};X(f,P=>{e(n)&&P(_)})}d(t,N),Te()}qe(["keydown","click"]);const Dt=[{key:"note",label:"Note"},{key:"nprocs",label:"MPI Ranks"},{key:"nt",label:"Thread Count"},{key:"last_iter",label:"Last Iter"},{key:"duration",label:"Duration"},{key:"last_mod",label:"Last Modified"},{key:"resu_size_mb",label:"Results (MB)"}];let Gt=D(se([])),Mr=D(se([])),ht=D(se(new Set)),br=D(""),Cn=D(""),Rt=D(se([])),at=D(se([])),Wt=D(""),Na=D(!0),Si=D(!0),Bt=D(se(kn("csauto_status_views",{}))),Sn=D(se(localStorage.getItem("csauto_status_view_selected")??""));function zr(){return e(Gt)}function Pn(){return e(Mr)}function Ut(){return e(ht)}function Wn(){return e(br)}function an(){return e(Cn)}function Pi(){return e(Rt)}function $i(){return e(Rt).filter(t=>e(Mr).includes(t))}function Ri(){return e(Rt).filter(t=>Dt.some(r=>r.key===t))}function Ei(){return e(at)}function Ni(){return e(Wt)}function Mi(){return e(Na)}function Xn(){return e(Bt)}function Ti(){return e(Sn)}function Ai(t){v(Gt,t,!0)}function Li(t){const r=e(Mr).length===0&&t.length>0;v(Mr,t,!0),r&&e(Rt).length===0&&v(Rt,[...t,...Dt.map(a=>a.key)],!0)}function Fi(t){v(br,t,!0)}function Yn(t){v(Rt,t,!0)}function Di(t){v(Wt,t,!0)}function Ii(t){v(Na,t,!0)}function zi(t){v(Si,t,!0)}function $n(t){v(Sn,t,!0),localStorage.setItem("csauto_status_view_selected",t)}function on(t){const r=new Set(e(ht));r.has(t)?r.delete(t):r.add(t),v(ht,r,!0),v(br,t,!0),v(Cn,t,!0)}function Ma(t){v(ht,new Set([t]),!0),v(br,t,!0),v(Cn,t,!0)}function sn(t,r,a){const n=a.indexOf(t),o=a.indexOf(r);if(n<0||o<0)return;const[s,l]=n{const a=Oi(r);return t.every(n=>a.includes(n))})}function Hi(t){if(t==null||t==="")return"";const r=Number(t);return Number.isFinite(r)?r:String(t).toLowerCase()}function Zn(t,r){var n;if(r==="case_id")return t.case_id;if(r==="status")return t.status??"";if(r==="note")return t.note??"";if(r==="nprocs")return t.nprocs??0;if(r==="nt")return t.nt??0;if(r==="last_iter")return t.last_iter??0;if(r==="duration")return t.duration_s??0;if(r==="last_mod")return t.last_mod??"";if(r==="resu_size_mb")return t.resu_size_mb??0;const a=(n=t.doe)==null?void 0:n[r];return a!==void 0?Hi(a):""}function ji(t,r){return t===""&&r===""?0:t===""?1:r===""?-1:typeof t=="number"&&typeof r=="number"?t-r:String(t).localeCompare(String(r))}function Aa(){const t=Ta();return e(at).length===0?t:[...t].sort((r,a)=>{for(const n of e(at)){const o=Zn(r,n.key),s=Zn(a,n.key),l=ji(o,s);if(l!==0)return n.dir==="asc"?l:-l}return 0})}function Rr(){return Aa().map(t=>t.case_id)}function Ui(t,r){const a=e(at).findIndex(n=>n.key===t);if(r)if(a>=0){const n=[...e(at)];n[a]={key:t,dir:n[a].dir==="asc"?"desc":"asc"},v(at,n,!0)}else v(at,[...e(at),{key:t,dir:"asc"}],!0);else a>=0&&e(at).length===1?v(at,[{key:t,dir:e(at)[0].dir==="asc"?"desc":"asc"}],!0):v(at,[{key:t,dir:"asc"}],!0)}function Vi(){return{visibleColumns:[...e(Rt)],search:e(Wt),sorts:e(at).map(t=>({...t}))}}function Bi(t){v(Rt,[...t.visibleColumns],!0),v(Wt,t.search,!0),v(at,t.sorts.map(r=>({...r})),!0)}function qi(t){v(Bt,{...e(Bt),[t]:Vi()},!0),Ir("csauto_status_views",e(Bt)),$n(t)}function Ki(t){const r={...e(Bt)};delete r[t],v(Bt,r,!0),Ir("csauto_status_views",r),e(Sn)===t&&$n("")}function Cr(){const t=new Set;for(const r of e(Gt))e(ht).has(r.case_id)&&t.add((r.status??"").toUpperCase());return t}function ea(){for(const t of e(Gt))if(e(ht).has(t.case_id)&&t.resu_size_mb!=null&&t.resu_size_mb>0)return!0;return!1}function Gi(t,r){const a=r.length,n=t.length,o=r.filter(u=>u.status==="RUNNING").length,s=t.filter(u=>u.status==="RUNNING").length,l=r.filter(u=>u.convergence==="converged").length,c=t.filter(u=>u.convergence==="converged").length;return{totalCases:a,shownCases:n,totalRunning:o,shownRunning:s,totalConverged:l,shownConverged:c}}var Wi=E('
            DOE columns
            '),Xi=E('
            ');function Yi(t,r){Me(r,!0);let a=he(r,"initialName",3,""),n=O(Pn),o=D(se(a())),s=D(se(new Set(r.initialColumns??[...e(n),...Dt.map(I=>I.key)])));function l(I){const G=new Set(e(s));G.has(I)?G.delete(I):G.add(I),v(s,G,!0)}function c(I,G){const j=new Set(e(s));I.forEach(q=>G?j.add(q):j.delete(q)),v(s,j,!0)}function u(){const I=e(o).trim();I&&r.onSave(I,[...e(s)])}function y(I){I.key==="Escape"&&r.onCancel()}function p(I){I.target.dataset.backdrop!==void 0&&r.onCancel()}let T=D(void 0);Ee(()=>{var I,G;(I=e(T))==null||I.focus(),(G=e(T))==null||G.select()});var w=Xi(),N=C(w),A=C(N),b=C(A,!0);h(A);var f=M(A,2),_=M(C(f),2);Ke(_),rt(_,I=>v(T,I),()=>e(T)),h(f);var P=M(f,2);{var x=I=>{var G=Wi(),j=C(G),q=M(C(j),2),g=C(q),i=M(g,2);h(q),h(j);var k=M(j,2);Ue(k,20,()=>e(n),U=>U,(U,W)=>{{let ee=O(()=>e(s).has(W));zt(U,{get checked(){return e(ee)},onchange:()=>l(W),size:14,get label(){return W}})}}),h(k),h(G),le("click",g,()=>c(e(n),!0)),le("click",i,()=>c(e(n),!1)),d(I,G)};X(P,I=>{e(n).length>0&&I(x)})}var S=M(P,2),R=C(S),m=M(C(R),2),$=C(m),F=M($,2);h(m),h(R);var L=M(R,2);Ue(L,21,()=>Dt,I=>I.key,(I,G)=>{{let j=O(()=>e(s).has(e(G).key));zt(I,{get checked(){return e(j)},onchange:()=>l(e(G).key),size:14,get label(){return e(G).label}})}}),h(L),h(S);var H=M(S,2),z=C(H);Re(z,{variant:"secondary",get onclick(){return r.onCancel},children:(I,G)=>{Ce();var j=Oe("Cancel");d(I,j)},$$slots:{default:!0}});var V=M(z,2);{let I=O(()=>!e(o).trim());Re(V,{variant:"primary",onclick:u,get disabled(){return e(I)},children:(G,j)=>{Ce();var q=Oe("Save");d(G,q)},$$slots:{default:!0}})}h(H),h(N),h(w),Q(()=>re(b,r.mode==="create"?"New view":"Edit view")),le("keydown",w,y),le("click",w,p),Ze(_,()=>e(o),I=>v(o,I)),le("click",$,()=>c(Dt.map(I=>I.key),!0)),le("click",F,()=>c(Dt.map(I=>I.key),!1)),d(t,w),Te()}qe(["keydown","click"]);var Qi=E('
            ',1);function Ji(t,r){Me(r,!0);let a=O(()=>Object.keys(Xn())),n=D(se(Ti())),o=D(!1),s=D("create"),l=O(()=>[{value:"",label:"All columns"},...e(a).map(R=>({value:R,label:R}))]);function c(R){if(v(n,R,!0),$n(R),R==="")Yn([...Pn(),...Dt.map(m=>m.key)]);else{const m=Xn();m[R]&&Bi(m[R])}}function u(){v(s,"edit"),v(o,!0)}function y(){v(s,"create"),v(o,!0)}function p(R,m){Yn(m),e(s)==="edit"&&e(n)&&R!==e(n)&&Ki(e(n)),qi(R),v(n,R,!0),v(o,!1)}function T(){v(o,!1)}var w=Qi(),N=B(w),A=C(N);lt(A,{class:"w-[140px]",get options(){return e(l)},get value(){return e(n)},onchange:c});var b=M(A,2),f=C(b);Fe(f,{get icon(){return xl},size:14}),h(b);var _=M(b,2),P=C(_);Fe(P,{get icon(){return yl},size:14}),h(_),h(N);var x=M(N,2);{var S=R=>{Qt(R,{children:(m,$)=>{{let F=O(()=>e(s)==="edit"?e(n):""),L=O(Pi);Yi(m,{get mode(){return e(s)},get initialName(){return e(F)},get initialColumns(){return e(L)},onSave:p,onCancel:T})}}})};X(x,R=>{e(o)&&R(S)})}le("click",b,u),le("click",_,y),d(t,w),Te()}qe(["click"]);var Zi=E('
            '),ec=E(""),tc=E(' '),rc=E(' '),nc=E('
            '),ac=E(" "),oc=E(''),sc=E(''),lc=E(" Open GUI",1),ic=E(""),cc=E(" "),uc=E(""),dc=E('
            ');function fc(t,r){Me(r,!0);let a=O(()=>r.rows.length>0&&r.rows.every(g=>e(y).has(g.case_id))),n=O(()=>r.rows.some(g=>e(y).has(g.case_id))),o=O(()=>e(n)&&!e(a)),s=O($i),l=O(()=>new Set(Ri())),c=O(Ei),u=O(Mi),y=O(Ut),p=O(()=>{const g=[{key:"_select",label:"",kind:"meta",sticky:"left"},{key:"case_id",label:"Case",kind:"meta",sticky:"left"},{key:"status",label:"Status",kind:"meta",sticky:"left"},...e(l).has("note")?[{key:"note",label:"Note",kind:"meta"}]:[]],i=e(s).map(ee=>({key:ee,label:ee,kind:"doe"})),U=[{key:"nprocs",label:"MPI Ranks",kind:"calc"},{key:"nt",label:"Thread Count",kind:"calc"},{key:"last_iter",label:"Last Iter",kind:"calc"},{key:"duration",label:"Duration",kind:"calc"},{key:"last_mod",label:"Last Modified",kind:"calc"},{key:"resu_size_mb",label:"Results (MB)",kind:"calc"}].filter(ee=>e(l).has(ee.key)),W=en("gui")?[{key:"_actions",label:"",kind:"meta",sticky:"right"}]:[];return[...g,...i,...U,...W]});function T(g){const i=e(c).findIndex(U=>U.key===g);if(i<0)return"";const k=e(c)[i].dir==="asc"?"▲":"▼";return e(c).length>1?`${k}${i+1}`:k}function w(g,i){g!=="_actions"&&Ui(g,i.ctrlKey||i.metaKey)}function N(g,i){i.shiftKey?sn(an()||g,g,Rr()):i.ctrlKey||i.metaKey?on(g):Ma(g)}function A(g,i){var U;const k=((U=g.status)==null?void 0:U.toUpperCase())??"";k!=="DONE"&&k!=="FAILED"||(i.preventDefault(),r.onContextMenu(g.case_id,i.clientX,i.clientY,g.convergence??""))}async function b(g){const i=g.note??"",k=await pn("Case note:",i,`Note: ${g.case_id}`,"",!0);if(k!==null)try{await Bs(g.case_id,k)}catch(U){await tt(`Failed to set note: ${U instanceof Error?U.message:U}`,"Error")}}async function f(g){try{await Ks(g)}catch(i){await tt(`Failed to open GUI: ${i instanceof Error?i.message:i}`,"Error")}}function _(g,i){const k=(g==null?void 0:g.toUpperCase())??"";return(k==="DONE"||k==="FAILED")&&i==="converged"?"CONVERGED":(k==="DONE"||k==="FAILED")&&i==="not_converged"?"NOT CONVERGED":k}function P(g,i){const k=(g==null?void 0:g.toUpperCase())??"";return(k==="DONE"||k==="FAILED")&&i==="converged"?"status-converged":(k==="DONE"||k==="FAILED")&&i==="not_converged"?"status-not-converged":k==="RUNNING"?"status-running":k==="DONE"?"status-done":k==="FAILED"?"status-failed":k==="PREPARED"?"status-prepared":"status-unknown"}function x(g){return e(y).has(g.case_id)?"row-selected":""}function S(g,i){var k;return i.key==="case_id"?g.case_id:i.key==="nprocs"?g.nprocs!=null?String(g.nprocs):"":i.key==="nt"?g.nt!=null?String(g.nt):"":i.key==="last_iter"?g.last_iter!=null?String(g.last_iter):"":i.key==="duration"?g.duration??"":i.key==="last_mod"?R(g.last_mod):i.key==="resu_size_mb"?g.resu_size_mb!=null?String(g.resu_size_mb):"":i.kind==="doe"?((k=g.doe)==null?void 0:k[i.key])!=null&&String(g.doe[i.key])!==""?String(g.doe[i.key]):"-":""}function R(g){if(!g)return"";try{const i=new Date(g),k=new Date,U=i.toDateString()===k.toDateString(),W=new Date(k);W.setDate(W.getDate()-1);const ee=i.toDateString()===W.toDateString(),ne=i.toLocaleTimeString([],{hour:"2-digit",minute:"2-digit"});return U?`Today ${ne}`:ee?`Yesterday ${ne}`:i.toLocaleDateString([],{month:"short",day:"numeric"})+` ${ne}`}catch{return g}}let m=D(se({})),$=D(void 0);Ee(()=>{e(u),e(p),r.rows,!(!e($)||!e(u))&&Pt().then(()=>{if(!e($))return;const g=Array.from(e($).querySelectorAll("thead th.sticky-left")),i={};let k=0;g.forEach(U=>{const W=U.dataset.colKey??"";i[W]=k,k+=U.getBoundingClientRect().width}),v(m,i,!0)})});function F(g,i,k){const U=k&&g.key!=="_select"&&g.key!=="_actions"?["status-sortable"]:[];if(!k&&g.key==="case_id"&&U.push("case-id"),g.kind==="doe"&&U.push("status-col-doe"),!k&&g.key==="note"&&U.push("max-w-[140px] whitespace-nowrap overflow-hidden text-ellipsis cursor-pointer hover:underline hover:decoration-dotted hover:underline-offset-2"),e(u)&&g.sticky==="left"&&U.push("sticky-left"),e(u)&&g.sticky==="right"&&U.push("sticky-right"),e(u)&&g.sticky==="left"){const W=e(p)[i+1];(!W||W.sticky!=="left")&&U.push("sticky-divider")}if(e(u)&&g.sticky==="right"){const W=e(p)[i-1];(!W||W.sticky!=="right")&&U.push("sticky-divider")}return U.join(" ")}function L(g,i){return F(g,i,!0)}function H(g,i){return F(g,i,!1)}function z(g){return!e(u)||!g.sticky?"":g.sticky==="right"?"position:sticky;right:0;":g.sticky==="left"&&g.key in e(m)?`position:sticky;left:${e(m)[g.key]}px;`:""}var V=dc(),I=C(V),G=C(I),j=C(G);Ue(j,23,()=>e(p),g=>g.key,(g,i,k)=>{var U=Se(),W=B(U);{var ee=K=>{var Y=Zi(),ce=C(Y),ie=C(ce);zt(ie,{get checked(){return e(a)},get indeterminate(){return e(o)},get onchange(){return r.onToggleAll},size:14}),h(ce),h(Y),Q((we,ge)=>{ke(Y,1,`${we??""} !px-2.5 !py-0 w-9`),ye(Y,"data-col-key",e(i).key),Xe(Y,ge)},[()=>L(e(i),e(k)),()=>z(e(i))]),d(K,Y)},ne=K=>{var Y=ec();Q((ce,ie)=>{ke(Y,1,ce),ye(Y,"data-col-key",e(i).key),Xe(Y,ie)},[()=>dt(L(e(i),e(k))),()=>z(e(i))]),d(K,Y)},pe=K=>{var Y=rc(),ce=C(Y),ie=M(ce);{var we=Z=>{var _e=tc(),Pe=C(_e,!0);h(_e),Q($e=>re(Pe,$e),[()=>T(e(i).key)]),d(Z,_e)},ge=O(()=>T(e(i).key));X(ie,Z=>{e(ge)&&Z(we)})}h(Y),Q((Z,_e)=>{ke(Y,1,Z),ye(Y,"data-col-key",e(i).key),Xe(Y,_e),re(ce,`${e(i).label??""} `)},[()=>dt(L(e(i),e(k))),()=>z(e(i))]),le("click",Y,Z=>w(e(i).key,Z)),le("keydown",Y,Z=>{(Z.key==="Enter"||Z.key===" ")&&(Z.preventDefault(),w(e(i).key,Z))}),d(K,Y)};X(W,K=>{e(i).key==="_select"?K(ee):e(i).key==="_actions"?K(ne,1):K(pe,-1)})}d(g,U)}),h(j),h(G);var q=M(G);Ue(q,21,()=>r.rows,g=>g.case_id,(g,i)=>{var k=uc();Ue(k,23,()=>e(p),U=>U.key,(U,W,ee)=>{var ne=Se(),pe=B(ne);{var K=ge=>{var Z=nc(),_e=C(Z),Pe=C(_e);{let $e=O(()=>e(y).has(e(i).case_id));zt(Pe,{get checked(){return e($e)},onchange:()=>r.onToggleRow(e(i).case_id),size:14})}h(_e),h(Z),Q(($e,ve)=>{ke(Z,1,`${$e??""} !px-2.5 !py-0 w-9`),ye(Z,"data-col-key",e(W).key),Xe(Z,ve)},[()=>H(e(W),e(ee)),()=>z(e(W))]),d(ge,Z)},Y=ge=>{var Z=ac(),_e=C(Z),Pe=C(_e,!0);h(_e),h(Z),Q(($e,ve,De,be)=>{ke(Z,1,$e),ye(Z,"data-col-key",e(W).key),Xe(Z,ve),ke(_e,1,`status-pill ${De??""}`),re(Pe,be)},[()=>dt(H(e(W),e(ee))),()=>z(e(W)),()=>P(e(i).status,e(i).convergence),()=>_(e(i).status,e(i).convergence)]),d(ge,Z)},ce=ge=>{var Z=sc(),_e=C(Z);{var Pe=ve=>{var De=Oe();Q(()=>re(De,e(i).note)),d(ve,De)},$e=ve=>{var De=oc(),be=C(De);Fe(be,{get icon(){return bl},size:12}),h(De),d(ve,De)};X(_e,ve=>{e(i).note?ve(Pe):ve($e,-1)})}h(Z),Q((ve,De)=>{ke(Z,1,ve),ye(Z,"data-col-key",e(W).key),Xe(Z,De),ye(Z,"title",e(i).note||"Add note")},[()=>dt(H(e(W),e(ee))),()=>z(e(W))]),le("click",Z,ve=>{ve.stopPropagation(),b(e(i))}),le("keydown",Z,ve=>{(ve.key==="Enter"||ve.key===" ")&&(ve.preventDefault(),ve.stopPropagation(),b(e(i)))}),d(ge,Z)},ie=ge=>{var Z=ic(),_e=C(Z);Re(_e,{variant:"primary",size:"sm",onclick:Pe=>{Pe.stopPropagation(),f(e(i).case_id)},children:(Pe,$e)=>{var ve=lc(),De=B(ve);Fe(De,{get icon(){return pl},size:12}),Ce(),d(Pe,ve)},$$slots:{default:!0}}),h(Z),Q((Pe,$e)=>{ke(Z,1,Pe),ye(Z,"data-col-key",e(W).key),Xe(Z,$e)},[()=>dt(H(e(W),e(ee))),()=>z(e(W))]),d(ge,Z)},we=ge=>{var Z=cc(),_e=C(Z,!0);h(Z),Q((Pe,$e,ve)=>{ke(Z,1,Pe),ye(Z,"data-col-key",e(W).key),Xe(Z,$e),re(_e,ve)},[()=>dt(H(e(W),e(ee))),()=>z(e(W)),()=>S(e(i),e(W))]),d(ge,Z)};X(pe,ge=>{e(W).key==="_select"?ge(K):e(W).key==="status"?ge(Y,1):e(W).key==="note"?ge(ce,2):e(W).key==="_actions"?ge(ie,3):ge(we,-1)})}d(U,ne)}),h(k),Q(U=>ke(k,1,U),[()=>dt(x(e(i)))]),le("click",k,U=>N(e(i).case_id,U)),le("contextmenu",k,U=>A(e(i),U)),d(g,k)}),h(q),h(I),rt(I,g=>v($,g),()=>e($)),h(V),Q(()=>ke(V,1,`table-wrap ${e(u)?"sticky-enabled":""}`)),d(t,V),Te()}qe(["click","keydown","contextmenu"]);var vc=E('
            ');function gc(t,r){Me(r,!0);let a=O(()=>{const w=Math.min(r.x,window.innerWidth-180),N=Math.min(r.y,window.innerHeight-120);return`left: ${w}px; top: ${N}px;`});async function n(w){try{for(const N of r.cases)await qs(N,w)}catch(N){console.error("Failed to set convergence:",N)}r.onClose()}const o=r.cases.length>1?` (${r.cases.length})`:"";var s=vc();et("keydown",st,w=>{w.key==="Escape"&&r.onClose()});var l=C(s),c=C(l);h(l);var u=M(l,2),y=C(u);h(u);var p=M(u,2),T=C(p);h(p),h(s),Q(()=>{Xe(s,e(a)),ke(l,1,`w-full text-left py-[7px] px-[10px] bg-transparent border border-transparent rounded-md text-[12.5px] cursor-pointer transition-[background] duration-[120ms] ease-in-out hover:bg-edf-gris-clair hover:border-border ${r.currentValue==="converged"?"is-active":""}`),re(c,`Mark Converged${o}`),ke(u,1,`w-full text-left py-[7px] px-[10px] bg-transparent border border-transparent rounded-md text-[12.5px] cursor-pointer transition-[background] duration-[120ms] ease-in-out hover:bg-edf-gris-clair hover:border-border ${r.currentValue==="not_converged"?"is-active":""}`),re(y,`Mark Not Converged${o}`),ke(p,1,`w-full text-left py-[7px] px-[10px] bg-transparent border border-transparent rounded-md text-[12.5px] cursor-pointer transition-[background] duration-[120ms] ease-in-out hover:bg-edf-gris-clair hover:border-border ${r.currentValue===""?"is-active":""}`),re(T,`Clear Mark${o}`)}),le("click",l,()=>n("converged")),le("click",u,()=>n("not_converged")),le("click",p,()=>n("")),d(t,s),Te()}qe(["click"]);var hc=E(" Refresh",1),mc=E(" ",1),pc=E(" Run",1),_c=E(" Restart",1),bc=E(" Kill",1),xc=E(" Clean",1),yc=E('
            ',1),wc=E('
            ',1);function kc(t,r){Me(r,!0);function a(){return[...Ut()]}async function n(){const g=a();if(!g.length)return;const i=await ts(g);if(i)try{await Un({cases:g,n:i.n,nt:i.nt,maxParallel:i.maxParallel}),r.onRefresh()}catch(k){await tt(`Run failed: ${k instanceof Error?k.message:k}`,"Error")}}async function o(){const g=a();if(!g.length)return;const i=await rs(g);if(i)try{await Un({cases:g,...i,restart:!0}),r.onRefresh()}catch(k){await tt(`Restart failed: ${k instanceof Error?k.message:k}`,"Error")}}async function s(){const g=a();if(!(!g.length||!await Hn(`Kill ${g.length} case${g.length>1?"s":""}?`,"Confirm Kill","Kill","danger")))try{await js(g),r.onRefresh()}catch(k){await tt(`Kill failed: ${k instanceof Error?k.message:k}`,"Error")}}async function l(g){const i=new Set(zr().filter(ee=>{var ne;return((ne=ee.status)==null?void 0:ne.toUpperCase())==="RUNNING"}).map(ee=>ee.case_id)),k=a().filter(ee=>i.has(ee));if(!k.length)return;const U=`${k.length} case${k.length>1?"s":""}`;let W=null;if(g.value_label){const ee=await pn(`${g.value_label} for ${U}:`,"",g.label);if(ee===null)return;W=Number(ee.trim().replace(",","."));const ne=$a(g,W);if(ne){await tt(ne,"Invalid value");return}}else if(!await Hn(`${g.label} for ${U}?`,g.label,g.label,"warning"))return;try{await Us({cases:k,action:g.name,value:W}),r.onRefresh(),Ul(`${g.label} requested for ${U}`)}catch(ee){await tt(`${g.label} failed: ${ee instanceof Error?ee.message:ee}`,"Error")}}async function c(){const g=a();if(!g.length)return;const i=await ns(g);if(i)try{await Vs({cases:g,keepLast:i.keepLast,keepResu:i.keepResu,deleteResu:i.deleteResu,pruneResu:!0}),r.onRefresh(),ni()}catch(k){await tt(`Cleanup failed: ${k instanceof Error?k.message:k}`,"Error")}}function u(){const g=Rr();g.length>0&&g.every(k=>Ut().has(k))?Jn():Qn(g)}function y(g){on(g)}let p=D(se(Zt("status")));Ee(()=>{er("status",e(p))}),Ii(!0);let T=O(()=>{const g=Cr();return g.size>0&&[...g].some(i=>i==="PREPARED"||i==="DONE"||i==="FAILED")}),w=O(()=>{if(!en("restart"))return!1;const g=Cr();return g.size>0&&[...g].some(i=>i==="DONE"||i==="FAILED")&&ea()}),N=O(()=>{const g=Cr();return g.size>0&&g.has("RUNNING")}),A=O(()=>Cr().has("RUNNING")),b=O(()=>{var g;return(((g=$t())==null?void 0:g.control_actions)??[]).map(i=>({label:i.label,onClick:()=>l(i),disabled:!e(A)}))}),f=O(ea),_=D(se(Ni())),P=null;function x(){P&&clearTimeout(P),P=setTimeout(()=>{Di(e(_))},200)}Ee(()=>zi(e(p)));let S=D(!1),R=D(0),m=D(0),$=D(se([])),F=D("");function L(g,i,k,U){v($,Ut().has(g)?[...Ut()]:[g],!0),v(F,U,!0),v(R,i,!0),v(m,k,!0),v(S,!0)}function H(){v(S,!1)}function z(g){const i=Rr();if(i.length){if(g.key==="Escape"){Jn(),H();return}if((g.ctrlKey||g.metaKey)&&g.key==="a"){g.preventDefault(),Qn(i);return}if(g.key==="ArrowDown"||g.key==="ArrowUp"){g.preventDefault();const k=g.key==="ArrowDown"?1:-1,U=Wn(),W=i.indexOf(U),ee=Math.max(0,Math.min(i.length-1,W+k)),ne=i[ee];g.shiftKey?sn(an()||i[0],ne,i):Ma(ne),Fi(ne);return}if(g.key===" "){g.preventDefault();const k=Wn();k&&(g.shiftKey?sn(an()||k,k,Rr()):on(k))}}}var V=wc();et("click",st,H),et("scroll",st,H);var I=B(V),G=C(I);Ht(G,{eyebrow:"Overview",title:"Status",wide:!0,id:"status-card-shell",actions:i=>{var k=mc(),U=B(k);{let ne=O(ti);tr(U,{name:"status",get intervalMs(){return e(ne)},get onRefresh(){return r.onRefresh},get checked(){return e(p)},set checked(pe){v(p,pe,!0)}})}var W=M(U,2);{var ee=ne=>{Re(ne,{variant:"primary",onclick:()=>r.onRefresh(),children:(pe,K)=>{var Y=hc(),ce=B(Y);Fe(ce,{get icon(){return Jt}}),Ce(),d(pe,Y)},$$slots:{default:!0}})};X(W,ne=>{e(p)||ne(ee)})}d(i,k)},children:(i,k)=>{var U=yc(),W=B(U),ee=C(W),ne=C(ee);Ke(ne);var pe=M(ne,2);Ji(pe,{}),h(ee);var K=M(ee,2),Y=C(K),ce=C(Y);h(Y);var ie=M(Y,2);{let be=O(()=>!e(T));Re(ie,{variant:"run",size:"sm",onclick:n,get disabled(){return e(be)},children:(He,Ie)=>{var oe=pc(),ue=B(oe);Fe(ue,{get icon(){return Ra}}),Ce(),d(He,oe)},$$slots:{default:!0}})}var we=M(ie,2);{var ge=be=>{{let He=O(()=>!e(w));Re(be,{variant:"warning",size:"sm",onclick:o,get disabled(){return e(He)},children:(Ie,oe)=>{var ue=_c(),je=B(ue);Fe(je,{get icon(){return wl}}),Ce(),d(Ie,ue)},$$slots:{default:!0}})}},Z=O(()=>en("restart"));X(we,be=>{e(Z)&&be(ge)})}var _e=M(we,2);{var Pe=be=>{Ci(be,{label:"Control",get items(){return e(b)}})};X(_e,be=>{e(b).length>0&&be(Pe)})}var $e=M(_e,2);{let be=O(()=>!e(N));Re($e,{variant:"danger",size:"sm",onclick:s,get disabled(){return e(be)},children:(He,Ie)=>{var oe=bc(),ue=B(oe);Fe(ue,{get icon(){return hl}}),Ce(),d(He,oe)},$$slots:{default:!0}})}var ve=M($e,2);{let be=O(()=>!e(f));Re(ve,{variant:"secondary",size:"sm",onclick:c,get disabled(){return e(be)},children:(He,Ie)=>{var oe=xc(),ue=B(oe);Fe(ue,{get icon(){return Cl}}),Ce(),d(He,oe)},$$slots:{default:!0}})}h(K),h(W);var De=M(W,2);{let be=O(Aa);fc(De,{get rows(){return e(be)},onContextMenu:L,onToggleAll:u,onToggleRow:y})}Q(be=>re(ce,`${be??""} selected`),[()=>Ut().size]),le("input",ne,x),Ze(ne,()=>e(_),be=>v(_,be)),d(i,U)},$$slots:{actions:!0,default:!0}}),h(I);var j=M(I,2);{var q=g=>{gc(g,{get cases(){return e($)},get x(){return e(R)},get y(){return e(m)},get currentValue(){return e(F)},onClose:H})};X(j,g=>{e(S)&&g(q)})}le("keydown",I,z),d(t,V),Te()}qe(["keydown","input"]);var Cc=E('
            ');function Xt(t,r){var a=Cc(),n=C(a);ft(n,()=>r.children),h(a),d(t,a)}var Sc=E(''),Pc=E(" ",1);function Rn(t,r){Me(r,!0);let a=he(r,"columnLabel",3,"Columns"),n=he(r,"xMinLabel",3,"Iter min"),o=O(()=>yn(r.allCases)),s=O(()=>r.columns.map(u=>({value:u,label:u}))),l=[{value:"zero",label:"Zero"},{value:"restart",label:"Restart start"},{value:"custom",label:"Custom"}];function c(u){r.onXMinChange(Number(u.target.value)||0)}Xt(t,{children:(u,y)=>{var p=Pc(),T=B(p);Ne(T,{text:"Cases",children:(S,R)=>{Kt(S,{class:"w-[160px]",get options(){return e(o)},get selected(){return r.selectedCases},get onchange(){return r.onCasesChange},placeholder:"Select cases..."})}});var w=M(T,2);{var N=S=>{var R=Se(),m=B(R);ft(m,()=>r.middleSlot),d(S,R)};X(w,S=>{r.middleSlot&&S(N)})}var A=M(w,2);Ne(A,{get text(){return a()},children:(S,R)=>{Kt(S,{class:"w-[160px]",get options(){return e(s)},get selected(){return r.selectedColumns},get onchange(){return r.onColumnsChange},placeholder:"Select..."})}});var b=M(A,2);Ne(b,{text:"Start from",children:(S,R)=>{lt(S,{class:"w-[140px]",get options(){return l},get value(){return r.startFrom},onchange:m=>r.onStartFromChange(m)})}});var f=M(b,2);{var _=S=>{Ne(S,{get text(){return n()},children:(R,m)=>{var $=Sc();Ke($),Q(()=>hn($,r.xMin)),le("input",$,c),d(R,$)}})};X(f,S=>{r.startFrom==="custom"&&S(_)})}var P=M(f,2);{var x=S=>{var R=Se(),m=B(R);ft(m,()=>r.extraSlot),d(S,R)};X(P,S=>{r.extraSlot&&S(x)})}d(u,p)}}),Te()}qe(["input"]);var $c=E('
            '),Rc=E('
            ');function Yt(t,r){let a=he(r,"emptyMessage",3,"");var n=Rc(),o=C(n);{var s=c=>{var u=Se(),y=B(u);Fr(y,()=>r.svgHtml),d(c,u)},l=c=>{var u=$c(),y=C(u),p=C(y,!0);h(y),h(u),Q(()=>re(p,a()||"No data to display.")),d(c,u)};X(o,c=>{r.svgHtml?c(s):c(l,-1)})}h(n),Q(()=>ye(n,"id",r.id)),d(t,n)}async function En(t,r="plot.png"){const a=document.getElementById(t),n=a==null?void 0:a.querySelector("svg");if(!n)return;const{width:o,height:s}=Ec(n),l=window.devicePixelRatio||1,c=document.createElement("canvas");c.width=o*l,c.height=s*l;const u=c.getContext("2d");if(!u)return;u.scale(l,l);const y=new XMLSerializer().serializeToString(n),p=new Blob([y],{type:"image/svg+xml;charset=utf-8"}),T=URL.createObjectURL(p),w=new Image;w.width=o,w.height=s,await new Promise((A,b)=>{w.onload=()=>{u.drawImage(w,0,0,o,s),URL.revokeObjectURL(T),A()},w.onerror=b,w.src=T});const N=await new Promise(A=>c.toBlob(A,"image/png"));N&&await Fa(N,Nc(r))}function xr(t,r,a="png"){const n=r.length<=3?r.join("_"):`${r.length}_cases`,o=new Date().toISOString().replace(/[:.]/g,"-").slice(0,19);return Mc(`${t}_${n}_${o}.${a}`)}async function La(t,r){const a=new Blob([t],{type:"text/csv;charset=utf-8"});await Fa(a,r)}function Ec(t){const r=t.getAttribute("viewBox");if(r){const a=r.split(/[\s,]+/).map(Number);if(a.length===4)return{width:a[2],height:a[3]}}return{width:t.width.baseVal.value||900,height:t.height.baseVal.value||500}}async function Fa(t,r){if("showSaveFilePicker"in window)try{const s=await(await window.showSaveFilePicker({suggestedName:r,types:[{description:t.type.startsWith("image/")?"Image":"File",accept:{[t.type]:[`.${r.split(".").pop()}`]}}]})).createWritable();await s.write(t),await s.close();return}catch(o){if((o==null?void 0:o.name)==="AbortError")return}const a=URL.createObjectURL(t),n=document.createElement("a");n.href=a,n.download=r,document.body.appendChild(n),n.click(),document.body.removeChild(n),URL.revokeObjectURL(a)}function Nc(t){return t.endsWith(".png")?t:`${t}.png`}function Mc(t){return t.replace(/[^a-zA-Z0-9._-]/g,"_")}let Da=D(se([])),Ia=D(se([])),za=D(se([])),Oa=D("zero"),Ha=D(0),ja=D(""),Tc=D(!0);function Ac(){return{selectedCases:e(Da),columns:e(Ia),selectedColumns:e(za),startFrom:e(Oa),iterMin:e(Ha),svgHtml:e(ja),autoRefresh:e(Tc)}}function ta(t){v(Da,t,!0)}function Lc(t){v(Ia,t,!0)}function Xr(t){v(za,t,!0)}function Fc(t){v(Oa,t,!0)}function Dc(t){v(Ha,t,!0)}function Sr(t){v(ja,t,!0)}var Ic=E(" Refresh",1),zc=E(" ",1),Oc=E(" Download as PNG",1),Hc=E('
            '),jc=E('
            ',1),Uc=E('
            '),Vc=E('

            '),Bc=E(" ",1);function qc(t,r){Me(r,!0);let a=O(Ac),n=D("");async function o(){var N;if(e(a).selectedCases.length)try{const A=(await Ts(e(a).selectedCases)).filter(b=>b!=="iteration");if(v(n,""),Lc(A),A.length===0){Xr([]),Sr("");return}if(e(a).selectedColumns.length===0){const b=(((N=$t())==null?void 0:N.default_residual_columns)??[]).filter(f=>A.includes(f));Xr(b.length>0?b:A.slice(0,2))}}catch(A){v(n,"Failed to load residual columns"),console.error("Failed to load residual columns:",A)}}async function s(){if(e(a).selectedCases.length&&!((e(a).columns.length===0||e(a).selectedColumns.length===0)&&(await o(),!e(a).selectedColumns.length)))try{let N=0,A=!0;if(e(a).startFrom==="restart"){const f=await Ca(e(a).selectedCases),_=Object.values(f.origins).map(P=>P.iteration).filter(P=>P!==void 0&&Number.isFinite(P));N=_.length>0?Math.min(..._):0}else e(a).startFrom==="custom"&&(N=e(a).iterMin);const b=await As(e(a).selectedCases,e(a).selectedColumns,{xMin:N,includeHistory:A});v(n,""),b&&Sr(b)}catch(N){v(n,"Failed to load residual plot"),console.error("Failed to load residual plot:",N)}}function l(N){if(ta(N),N.length===0){Sr("");return}o(),s()}function c(N){if(Xr(N),N.length===0){Sr("");return}s()}function u(N){Fc(N),s()}function y(N){Dc(N),s()}let p=D(se(Zt("plot")));Ee(()=>{er("plot",e(p))}),Ee(()=>{e(p)?pr("residualPlot",s,Kn()):vt("residualPlot")});let T=!1;Ee(()=>{r.allCases.length>0&&!T&&(T=!0,ta([...r.allCases]),o().then(()=>s()))});const w=_r(()=>{T&&o().then(()=>s())});vr(()=>{vt("residualPlot"),w()}),Ht(t,{eyebrow:"Diagnostics",title:"Residuals Plot",wide:!0,actions:A=>{var b=zc(),f=B(b);{let x=O(Kn);tr(f,{name:"residualPlot",get intervalMs(){return e(x)},onRefresh:s,get checked(){return e(p)},set checked(S){v(p,S,!0)}})}var _=M(f,2);{var P=x=>{Re(x,{variant:"primary",onclick:s,children:(S,R)=>{var m=Ic(),$=B(m);Fe($,{get icon(){return Jt}}),Ce(),d(S,m)},$$slots:{default:!0}})};X(_,x=>{e(p)||x(P)})}d(A,b)},children:(A,b)=>{var f=Bc(),_=B(f);{var P=m=>{const $=V=>{var I=Hc(),G=C(I);{let j=O(()=>!e(a).svgHtml);Re(G,{variant:"secondary",size:"sm",onclick:()=>En("plot-holder",xr("residuals",e(a).selectedCases)),get disabled(){return e(j)},children:(q,g)=>{var i=Oc(),k=B(i);Fe(k,{get icon(){return mr}}),Ce(),d(q,i)},$$slots:{default:!0}})}h(I),d(V,I)};var F=jc(),L=B(F);Rn(L,{prefix:"plot",get allCases(){return r.allCases},get selectedCases(){return e(a).selectedCases},onCasesChange:l,columnLabel:"Variables",get columns(){return e(a).columns},get selectedColumns(){return e(a).selectedColumns},onColumnsChange:c,get startFrom(){return e(a).startFrom},onStartFromChange:u,xMinLabel:"Iter min",get xMin(){return e(a).iterMin},onXMinChange:y,get extraSlot(){return $}});var H=M(L,2),z=C(H);{let V=O(()=>e(a).selectedCases.length===0?"Please select at least one case.":e(a).selectedColumns.length===0?"Please select at least one variable.":"No data to display.");Yt(z,{id:"plot-holder",get svgHtml(){return e(a).svgHtml},get emptyMessage(){return e(V)}})}h(H),d(m,F)},x=m=>{var $=Uc(),F=C($);Yt(F,{id:"plot-holder",svgHtml:"",emptyMessage:"No data available. Please run a simulation first."}),h($),d(m,$)};X(_,m=>{e(a).columns.length>0?m(P):m(x,-1)})}var S=M(_,2);{var R=m=>{var $=Vc(),F=C($,!0);h($),Q(()=>re(F,e(n))),d(m,$)};X(S,m=>{e(n)&&m(R)})}d(A,f)},$$slots:{actions:!0,default:!0}}),Te()}function Ua(t){const{scope:r,getState:a,setState:n,setHasData:o,getAxis:s}=t;async function l(){const w=a();if(w.selectedCases.length)try{let N=await Zr(w.selectedCases,r);if(t.filterFiles&&(N=t.filterFiles(N)),n({files:N}),o(N.length>0),N.length===0){n({file:"",columns:[],selectedColumns:[],positionText:"",svgHtml:""});return}(!w.file||!N.includes(w.file))&&(n({file:N[0]}),await c())}catch(N){console.error(`Failed to load ${r} files:`,N)}}async function c(){const w=a();if(!(!w.selectedCases.length||!w.file))try{const N=await Is(w.selectedCases,[w.file]),A=t.filterColumns?t.filterColumns(N):N;t.onColumnsLoaded?t.onColumnsLoaded(N):n({columns:A});const b=a();if(b.columns.length===0){n({selectedColumns:[],positionText:"",svgHtml:""});return}b.selectedColumns.length===0&&n({selectedColumns:[b.columns[0]]})}catch(N){console.error(`Failed to load ${r} columns:`,N)}}async function u(){let w=a();if(w.selectedCases.length){if(await l(),w=a(),!w.file){n({positionText:"",svgHtml:""});return}if((w.columns.length===0||w.selectedColumns.length===0)&&(await c(),w=a(),!w.selectedColumns.length)){n({positionText:"",svgHtml:""});return}try{let N;const A=a();if(A.startFrom==="restart"){const f=await Ca(A.selectedCases),_=s().toLowerCase(),P=_==="t"||_==="time"?"time":"iteration",x=Object.values(f.origins).map(S=>S[P]).filter(S=>S!==void 0&&Number.isFinite(S));N=x.length>0?Math.min(...x):void 0}else A.startFrom==="custom"&&(N=A.xMin);const b=await Os({cases:A.selectedCases,probes:[A.file],columns:A.selectedColumns,axis:s(),timeMin:typeof N=="number"?N:void 0,xMin:N,includeHistory:!0});b&&n({svgHtml:b})}catch(N){console.error(`Failed to load ${r} plot:`,N)}}}async function y(w){if(n({selectedCases:w}),w.length===0){n({svgHtml:""});return}await l(),r==="probes"&&await u()}function p(w){if(n({selectedColumns:w}),w.length===0){n({svgHtml:""});return}u()}async function T(w){n({file:w}),await c(),await u()}return{loadFiles:l,loadColumns:c,loadPlot:u,handleCasesChange:y,handleColumnsChange:p,handleFileChange:T}}function Va(){return{selectedCases:[],file:"",files:[],columns:[],selectedColumns:[],axis:"time",startFrom:"zero",xMin:0,positionText:"",svgHtml:"",autoRefresh:!0}}let Vt=D("time"),ln=D(se(Va())),cn=D(se({...Va(),axis:""})),Kc=D(!0),Tr=D(!1),Ar=D(!1);function Gc(){return e(Vt)}function Wc(t){v(Vt,t,!0)}function Xc(){return e(Tr)}function un(t){v(Tr,t,!0)}function Yc(){return e(Ar)}function dn(t){v(Ar,t,!0)}function Qc(){e(Vt)==="time"&&!e(Tr)&&e(Ar)?v(Vt,"profile"):e(Vt)==="profile"&&!e(Ar)&&e(Tr)&&v(Vt,"time")}function ra(){return e(ln)}function Yr(){return e(cn)}function wt(t){v(ln,{...e(ln),...t},!0)}function At(t){v(cn,{...e(cn),...t},!0)}function Jc(){return e(Kc)}var Zc=E(" Download as PNG",1),eu=E('
            '),tu=E("
            "),ru=E('
            '),nu=E('
            ',1),au=E('
            ');function ou(t,r){Me(r,!0);let a=he(r,"onRefresh",15),n=O(ra);const o=new Set(["time","t","iteration","iter"]),s=Ua({scope:"probes",getState:ra,setState:wt,setHasData:un,filterFiles:b=>b.filter(f=>{const _=f.replace(/\.csv$/i,"").toLowerCase();return _!=="coords"&&!_.includes("coordinates")}),filterColumns:b=>b.filter(f=>!o.has(f.toLowerCase())),onColumnsLoaded:b=>{const f=b.filter(_=>!o.has(_.toLowerCase()));wt({columns:f}),l()},getAxis:()=>"time"});async function l(){if(!(!e(n).selectedCases.length||!e(n).file||!e(n).selectedColumns.length))try{const b=[];for(const R of e(n).selectedColumns){const m=await zs(e(n).selectedCases[0],e(n).file,[R]);m.found&&b.push({col:R,x:m.x,y:m.y,z:m.z})}if(!b.length){wt({positionText:""});return}const f=R=>{let m=0;for(const $ of R){if($===void 0)continue;const F=String($),L=F.indexOf(".");L>=0&&(m=Math.max(m,F.length-L-1))}return m},_=f(b.map(R=>R.x)),P=f(b.map(R=>R.y)),x=f(b.map(R=>R.z)),S=b.map(R=>{const m=[];return R.x!==void 0&&m.push(`x=${R.x.toFixed(_)}`),R.y!==void 0&&m.push(`y=${R.y.toFixed(P)}`),R.z!==void 0&&m.push(`z=${R.z.toFixed(x)}`),`Probe position [${R.col}] : ${m.join(" · ")}`});wt({positionText:S.join(` -`)})}catch{wt({positionText:""})}}function c(b){s.handleColumnsChange(b),b.length>0&&l()}let u=O(()=>e(n).files.map(b=>({value:b,label:b.replace(/\.csv$/i,"").replace(/^probes?_/i,"")}))),y=!1;Ee(()=>{r.allCases.length>0&&!y&&(y=!0,wt({selectedCases:[...r.allCases]}),s.loadFiles().then(()=>s.loadPlot()))}),Ee(()=>{a(s.loadPlot)});let p=O(()=>e(n).selectedCases.length===0?"Please select at least one case.":e(n).selectedColumns.length===0?"Please select at least one probe.":"No data to display.");var T=Se(),w=B(T);{var N=b=>{const f=F=>{Ne(F,{text:"Quantity",children:(L,H)=>{lt(L,{class:"w-[160px]",get options(){return e(u)},get value(){return e(n).file},get onchange(){return s.handleFileChange}})}})},_=F=>{var L=eu(),H=C(L);{let z=O(()=>!e(n).svgHtml);Re(H,{variant:"secondary",size:"sm",onclick:()=>En("probe-plot-holder",xr("probe",e(n).selectedCases)),get disabled(){return e(z)},children:(V,I)=>{var G=Zc(),j=B(G);Fe(j,{get icon(){return mr}}),Ce(),d(V,G)},$$slots:{default:!0}})}h(L),d(F,L)};var P=nu(),x=B(P);Rn(x,{prefix:"probe",get allCases(){return r.allCases},get selectedCases(){return e(n).selectedCases},get onCasesChange(){return s.handleCasesChange},get middleSlot(){return f},columnLabel:"Probes",get columns(){return e(n).columns},get selectedColumns(){return e(n).selectedColumns},onColumnsChange:c,get startFrom(){return e(n).startFrom},onStartFromChange:F=>{wt({startFrom:F}),s.loadPlot()},xMinLabel:"Time min",get xMin(){return e(n).xMin},onXMinChange:F=>{wt({xMin:F}),s.loadPlot()},get extraSlot(){return _}});var S=M(x,2);{var R=F=>{var L=ru();Ue(L,21,()=>e(n).positionText.split(` -`).sort(),gn,(H,z)=>{var V=tu(),I=C(V,!0);h(V),Q(()=>re(I,e(z))),d(H,V)}),h(L),d(F,L)};X(S,F=>{e(n).positionText&&F(R)})}var m=M(S,2),$=C(m);Yt($,{id:"probe-plot-holder",get svgHtml(){return e(n).svgHtml},get emptyMessage(){return e(p)}}),h(m),d(b,P)},A=b=>{var f=au(),_=C(f);Yt(_,{id:"probe-plot-holder",svgHtml:"",emptyMessage:"No probe data available. Please run a simulation first."}),h(f),d(b,f)};X(w,b=>{e(n).files.length>0?b(N):b(A,-1)})}d(t,T),Te()}var su=E(" ",1),lu=E(" Download as PNG",1),iu=E('
            '),cu=E('
            ',1),uu=E('
            ');function du(t,r){Me(r,!0);let a=he(r,"onRefresh",15),n=O(Yr);const o=["s","x","abscissa","distance","arclength","arc_length","curvilinear","length","r","y","z","coord","position"];function s(f){const _=f.map(P=>P.toLowerCase());for(const P of o){const x=_.indexOf(P);if(x>=0)return f[x]}return f[0]??""}const l=Ua({scope:"profiles",getState:Yr,setState:At,setHasData:dn,onColumnsLoaded:f=>{const _=e(n).axis||s(f),P=f.filter(x=>x!==_).toSorted((x,S)=>x.localeCompare(S));At({columns:P,axis:_,selectedColumns:e(n).selectedColumns.length?e(n).selectedColumns:P.length?[P[0]]:[]})},getAxis:()=>Yr().axis});function c(f){const _=e(n).axis;At({axis:f});const x=[...e(n).columns,..._?[_]:[]].filter(S=>S!==f).toSorted((S,R)=>S.localeCompare(R));At({columns:x}),l.loadPlot()}let u=O(()=>e(n).files.map(f=>({value:f,label:f.replace(/^.*\//,"").replace(/\.csv$/i,"").replace(/_/g," ")}))),y=O(()=>[...e(n).axis?[e(n).axis]:[],...e(n).columns].toSorted((f,_)=>f.localeCompare(_)).map(f=>({value:f,label:f}))),p=!1;Ee(()=>{r.allCases.length>0&&!p&&(p=!0,At({selectedCases:[...r.allCases]}),l.loadFiles().then(()=>l.loadPlot()))}),Ee(()=>{a(l.loadPlot)});let T=O(()=>e(n).selectedCases.length===0?"Please select at least one case.":e(n).selectedColumns.length===0?"Please select at least one value.":"No data to display.");var w=Se(),N=B(w);{var A=f=>{const _=$=>{var F=su(),L=B(F);Ne(L,{text:"Profile",children:(z,V)=>{lt(z,{class:"w-[160px]",get options(){return e(u)},get value(){return e(n).file},get onchange(){return l.handleFileChange}})}});var H=M(L,2);Ne(H,{text:"X axis",children:(z,V)=>{lt(z,{class:"w-[140px]",get options(){return e(y)},get value(){return e(n).axis},onchange:c})}}),d($,F)},P=$=>{var F=iu(),L=C(F);{let H=O(()=>!e(n).svgHtml);Re(L,{variant:"secondary",size:"sm",onclick:()=>En("profile-plot-holder",xr("profile",e(n).selectedCases)),get disabled(){return e(H)},children:(z,V)=>{var I=lu(),G=B(I);Fe(G,{get icon(){return mr}}),Ce(),d(z,I)},$$slots:{default:!0}})}h(F),d($,F)};var x=cu(),S=B(x);Rn(S,{prefix:"profile",get allCases(){return r.allCases},get selectedCases(){return e(n).selectedCases},get onCasesChange(){return l.handleCasesChange},get middleSlot(){return _},columnLabel:"Values",get columns(){return e(n).columns},get selectedColumns(){return e(n).selectedColumns},get onColumnsChange(){return l.handleColumnsChange},get startFrom(){return e(n).startFrom},onStartFromChange:$=>{At({startFrom:$}),l.loadPlot()},xMinLabel:"X min",get xMin(){return e(n).xMin},onXMinChange:$=>{At({xMin:$}),l.loadPlot()},get extraSlot(){return P}});var R=M(S,2),m=C(R);Yt(m,{id:"profile-plot-holder",get svgHtml(){return e(n).svgHtml},get emptyMessage(){return e(T)}}),h(R),d(f,x)},b=f=>{var _=uu(),P=C(_);Yt(P,{id:"profile-plot-holder",svgHtml:"",emptyMessage:"No profile data available. Please run a simulation first."}),h(_),d(f,_)};X(N,f=>{e(n).files.length>0?f(A):f(b,-1)})}d(t,w),Te()}var fu=E('
            Diagnostics
            '),vu=E(" Refresh",1),gu=E(" ",1);function hu(t,r){Me(r,!0);let a=O(Gc),n=O(Jc),o=O(Xc),s=O(Yc),l=D(se(Zt("probe")));Ee(()=>{er("probe",e(l))});let c=D(void 0);function u(){var A;(A=e(c))==null||A()}async function y(){if(r.allCases.length){try{const b=(await Zr(r.allCases,"probes")).filter(f=>{const _=f.replace(/\.csv$/i,"").toLowerCase();return _!=="coords"&&!_.includes("coordinates")});un(b.length>0)}catch{un(!1)}try{const A=await Zr(r.allCases,"profiles");dn(A.length>0)}catch{dn(!1)}}}Ee(()=>{r.allCases.length>0&&y()}),_r(()=>{y(),u()}),Ee(()=>{e(o),e(s),Qc()});function p(A){A==="time"&&!e(o)||A==="profile"&&!e(s)||Wc(A)}var T=Se(),w=B(T);{var N=A=>{{const b=_=>{var P=fu(),x=M(C(P),2),S=C(x),R=M(S,2);h(x),h(P),Q(()=>{ke(S,1,`bg-transparent border-none p-0 m-0 text-lg font-bold tracking-tight transition-colors duration-150 + ${n()||o()?"bg-edf-bleu-moyen border-edf-bleu-moyen text-white":"bg-white border-edf-gris-moyen hover:border-edf-bleu-clair"}`),Xe(f,`width: ${i()??""}px; height: ${i()??""}px;`),ye(f,"aria-checked",o()?"mixed":n()),ye(f,"aria-disabled",s()),ye(f,"tabindex",s()?-1:0)}),ie("click",f,w),ie("keydown",f,p),d(b,f)};let n=he(r,"checked",3,!1),o=he(r,"indeterminate",3,!1),s=he(r,"disabled",3,!1),i=he(r,"size",3,16),c=he(r,"label",3,""),u=he(r,"labelFirst",3,!1);function w(b){var _;if(b.stopPropagation(),s())return;const f=o()?!0:!n();(_=r.onchange)==null||_.call(r,f)}function p(b){(b.key===" "||b.key==="Enter")&&(b.preventDefault(),b.stopPropagation(),w(b))}var T=Se(),y=B(T);{var N=b=>{var f=Qi(),_=k(f);{var P=S=>{var R=Xi(),m=B(R),$=k(m,!0);h(m);var F=M(m);a(F),Q(()=>re($,c())),d(S,R)},x=S=>{var R=Yi(),m=B(R);a(m);var $=M(m),F=k($,!0);h($),Q(()=>re(F,c())),d(S,R)};X(_,S=>{u()?S(P):S(x,-1)})}h(f),ie("click",f,w),ie("keydown",f,p),d(b,f)},A=b=>{a(b)};X(y,b=>{c()?b(N):b(A,-1)})}d(t,T),Te()}qe(["click","keydown"]);function kn(t,r){try{const a=localStorage.getItem(t);return a===null?r:JSON.parse(a)}catch{return r}}function Ir(t,r){localStorage.setItem(t,JSON.stringify(r))}const tn=new Map;function pr(t,r,a){vt(t),tn.set(t,setInterval(r,a))}function vt(t){const r=tn.get(t);r!==void 0&&(clearInterval(r),tn.delete(t))}const Ft={status:1e3,tail:1e3,plot:3e3,probe:3e3,errors:5e3},Ji=["status","plot","probe","tail","errors"],Wr={status:{label:"Status table",min:500},plot:{label:"Residual plots",min:1e3},probe:{label:"Probe plots",min:1e3},tail:{label:"Log tail",min:500},errors:{label:"Recent errors",min:2e3}},sr=kn("csauto_refresh_rates",{});let _t=D(se({status:sr.status??Ft.status,tail:sr.tail??Ft.tail,plot:sr.plot??Ft.plot,probe:sr.probe??Ft.probe,errors:sr.errors??Ft.errors}));function Zi(){return e(_t)}function el(t,r){v(_t,{...e(_t),[t]:r},!0),Ir("csauto_refresh_rates",e(_t))}function tl(){return e(_t).status}function Kn(){return e(_t).tail}function Gn(){return e(_t).plot}function rl(){return e(_t).probe}function Wn(){return e(_t).errors}const rn=new Set;function _r(t){return rn.add(t),()=>rn.delete(t)}function nl(){rn.forEach(t=>t())}const nn=kn("csauto_autorefresh_enabled",{});function Zt(t){return nn[t]??!0}function er(t,r){nn[t]=r,Ir("csauto_autorefresh_enabled",nn)}var al=E(" ",1),ol=E('
            ms
            '),sl=E('
            Telemetry
            '),il=E('
            API token
            Auto-refresh intervals
            ',1);function ll(t,r){Me(r,!0);let a=D(se(_n())),n=D(se({...Zi()})),o=D(!0),s=D(!1);Ee(()=>{Ws().then(w=>{v(o,w.enabled,!0),v(s,!0)}).catch(()=>{v(s,!1)})});function i(w){const{min:p}=Wr[w];let T=e(n)[w];(typeof T!="number"||isNaN(T))&&(T=Ft[w]),v(n,{...e(n),[w]:Math.max(p,Math.round(T))},!0)}function c(w,p){const T=p.target,y=T.value.replace(/[^0-9]/g,""),N=parseInt(y,10);isNaN(N)?y===""&&v(n,{...e(n),[w]:Wr[w].min},!0):v(n,{...e(n),[w]:N},!0),T.value=String(e(n)[w])}function u(){Ca(e(a));for(const w of Object.keys(e(n)))i(w),el(w,e(n)[w]);e(s)&&Xs(e(o)).catch(()=>{}),r.onClose()}hr(t,{title:"Settings",titleId:"settings-dialog-title",get onCancel(){return r.onClose},onConfirm:u,maxWidth:"400px",portal:!0,footer:p=>{var T=al(),y=B(T);Re(y,{variant:"secondary",get onclick(){return r.onClose},children:(A,b)=>{Ce();var f=Oe("Cancel");d(A,f)},$$slots:{default:!0}});var N=M(y,2);Re(N,{variant:"primary",onclick:u,children:(A,b)=>{Ce();var f=Oe("Save");d(A,f)},$$slots:{default:!0}}),d(p,T)},children:(p,T)=>{var y=il(),N=B(y),A=M(k(N),2);Ke(A),h(N);var b=M(N,2),f=k(b),_=M(k(f),2);h(f);var P=M(f,2);Ue(P,20,()=>Ji,R=>R,(R,m)=>{const $=O(()=>Wr[m]);var F=ol(),L=k(F),j=k(L),z=k(j,!0);h(j);var V=M(j,2),I=k(V);h(V),h(L);var G=M(L,2),U=k(G);Ke(U),Ce(2),h(G),h(F),Q(()=>{re(z,e($).label),re(I,`min ${e($).min??""}ms`),hn(U,e(n)[m])}),ie("input",U,q=>c(m,q)),et("blur",U,()=>i(m)),d(R,F)}),h(P),h(b);var x=M(b,2);{var S=R=>{var m=sl(),$=M(k(m),2);zt($,{get checked(){return e(o)},onchange:F=>v(o,F,!0),label:"Send anonymous usage statistics"}),h(m),d(R,m)};X(x,R=>{e(s)&&R(S)})}Ze(A,()=>e(a),R=>v(a,R)),ie("click",_,()=>v(n,{...Ft},!0)),d(p,y)},$$slots:{footer:!0,default:!0}}),Te()}qe(["click","input"]);var cl=E(''),ul=E(' '),dl=E('
            ',1);function fl(t,r){Me(r,!0);let a=O(()=>r.shownCases!==r.totalCases),n=O($t),o=D(!1);var s=dl(),i=B(s),c=k(i),u=k(c);{var w=l=>{var C=cl();Q(H=>{ye(C,"src",H),ye(C,"alt",e(n).solver)},[()=>Ms(e(n).solver)]),d(l,C)},p=l=>{var C=ul(),H=k(C,!0);h(C),Q(()=>re(H,e(n).solver)),d(l,C)};X(u,l=>{var C;(C=e(n))!=null&&C.logo?l(w):e(n)&&l(p,1)})}h(c);var T=M(c,2),y=k(T),N=k(y),A=k(N);{var b=l=>{var C=Oe();Q(()=>re(C,`${r.shownCases??""}/`)),d(l,C)};X(A,l=>{e(a)&&l(b)})}var f=M(A,1,!0);h(N);var _=M(N,2),P=k(_,!0);h(_),h(y);var x=M(y,2),S=k(x),R=k(S);{var m=l=>{var C=Oe();Q(()=>re(C,`${r.shownRunning??""}/`)),d(l,C)};X(R,l=>{e(a)&&l(m)})}var $=M(R,1,!0);h(S),Ce(2),h(x);var F=M(x,2),L=k(F),j=k(L);{var z=l=>{var C=Oe();Q(()=>re(C,`${r.shownConverged??""}/`)),d(l,C)};X(j,l=>{e(a)&&l(z)})}var V=M(j,1,!0);h(L),Ce(2),h(F),h(T);var I=M(T,2),G=k(I),U=k(G);Fe(U,{get icon(){return Ci},size:18}),h(G),h(I),h(i);var q=M(i,2);{var g=l=>{ll(l,{onClose:()=>v(o,!1)})};X(q,l=>{e(o)&&l(g)})}Q(()=>{re(f,r.totalCases),re(P,r.totalCases===1?"case":"cases"),re($,r.totalRunning),re(V,r.totalConverged)}),ie("click",G,()=>v(o,!0)),d(t,s),Te()}qe(["click"]);const vl=""+new URL("../assets/simvia-logo.kLDq7Uoj.svg",import.meta.url).href;var gl=E('
            '),hl=E('

            '),ml=E("
            "),pl=E('
            '),_l=E('
            '),bl=E('
            ');function Ht(t,r){let a=he(r,"eyebrow",3,""),n=he(r,"title",3,""),o=he(r,"wide",3,!1);var s=bl(),i=M(k(s),2);{var c=w=>{var p=_l(),T=k(p);{var y=f=>{var _=Se(),P=B(_);ft(P,()=>r.titleSlot),d(f,_)},N=f=>{var _=ml(),P=k(_);{var x=m=>{var $=gl(),F=k($,!0);h($),Q(()=>re(F,a())),d(m,$)};X(P,m=>{a()&&m(x)})}var S=M(P,2);{var R=m=>{var $=hl(),F=k($,!0);h($),Q(()=>re(F,n())),d(m,$)};X(S,m=>{n()&&m(R)})}h(_),d(f,_)};X(T,f=>{r.titleSlot?f(y):f(N,-1)})}var A=M(T,2);{var b=f=>{var _=pl(),P=k(_);ft(P,()=>r.actions),h(_),d(f,_)};X(A,f=>{r.actions&&f(b)})}h(p),d(w,p)};X(i,w=>{(a()||n()||r.titleSlot||r.actions)&&w(c)})}var u=M(i,2);ft(u,()=>r.children),h(s),Q(()=>{ke(s,1,`${o()?"col-span-12":"col-span-6"} bg-card border border-border rounded-[10px] p-[16px_18px_18px] relative overflow-clip animate-rise`),ye(s,"id",r.id)}),d(t,s)}function tr(t,r){Me(r,!0);let a=he(r,"checked",15,!0);Ee(()=>{a()?pr(r.name,r.onRefresh,r.intervalMs):vt(r.name)}),vr(()=>vt(r.name)),zt(t,{get checked(){return a()},onchange:n=>a(n),size:14,label:"Auto-refresh",labelFirst:!0}),Te()}var xl=E(" ",1),yl=E('
          • '),wl=E(''),kl=E(' ',1);function Cl(t,r){Me(r,!0);let a=he(r,"label",3,"More"),n=D(!1),o=D(void 0),s=D(void 0),i=D("");function c(){if(!e(o)||!e(s))return;const P=e(o).getBoundingClientRect(),x=e(s).offsetHeight,S=4,R=window.innerHeight-P.bottom-S,$=RR?P.top-S-x:P.bottom+S,F=Math.min(P.left,window.innerWidth-180);v(i,`position:fixed; top:${$}px; left:${F}px; min-width:170px; z-index:9999;`)}async function u(){var P,x;v(n,!e(n)),e(n)&&(await Pt(),c(),(x=(P=e(s))==null?void 0:P.querySelector("button:not(:disabled)"))==null||x.focus({preventScroll:!0}))}function w(){var P,x;v(n,!1),(x=(P=e(o))==null?void 0:P.querySelector("button"))==null||x.focus()}function p(P){P.disabled||(w(),P.onClick())}function T(P){var m,$;if(P.key!=="ArrowDown"&&P.key!=="ArrowUp")return;P.preventDefault();const x=Array.from(((m=e(s))==null?void 0:m.querySelectorAll("button:not(:disabled)"))??[]),S=x.indexOf(document.activeElement),R=P.key==="ArrowDown"?1:x.length-1;($=x[(S+R)%x.length])==null||$.focus()}function y(P){e(n)&&e(o)&&!e(o).contains(P.target)&&e(s)&&!e(s).contains(P.target)&&v(n,!1)}var N=kl();et("mousedown",st,y),et("keydown",st,P=>{P.key==="Escape"&&e(n)&&w()}),et("scroll",st,()=>{e(n)&&v(n,!1)});var A=B(N),b=k(A);Re(b,{variant:"secondary",size:"sm",onclick:u,children:(P,x)=>{var S=xl(),R=B(S);Fe(R,{get icon(){return pi}});var m=M(R);Q(()=>re(m,` ${a()??""}`)),d(P,S)},$$slots:{default:!0}}),h(A),rt(A,P=>v(o,P),()=>e(o));var f=M(A,2);{var _=P=>{Qt(P,{children:(x,S)=>{var R=wl();Ue(R,21,()=>r.items,m=>m.label,(m,$)=>{var F=yl(),L=k(F),j=k(L,!0);h(L),h(F),Q(()=>{L.disabled=e($).disabled,ye(L,"aria-disabled",e($).disabled),ke(L,1,`w-full flex items-center gap-2 text-left py-[7px] px-[10px] bg-transparent border border-transparent rounded-md text-[12.5px] text-ink transition-[background] duration-[120ms] ease-in-out disabled:opacity-40 disabled:pointer-events-none ${e($).disabled?"":"cursor-pointer hover:bg-edf-gris-clair hover:border-border"}`),re(j,e($).label)}),ie("click",L,()=>p(e($))),d(m,F)}),h(R),rt(R,m=>v(s,m),()=>e(s)),Q(()=>Xe(R,e(i))),ie("keydown",R,T),d(x,R)}})};X(f,P=>{e(n)&&P(_)})}d(t,N),Te()}qe(["keydown","click"]);const Dt=[{key:"note",label:"Note"},{key:"nprocs",label:"MPI Ranks"},{key:"nt",label:"Thread Count"},{key:"last_iter",label:"Last Iter"},{key:"duration",label:"Duration"},{key:"last_mod",label:"Last Modified"},{key:"resu_size_mb",label:"Results (MB)"}];let Gt=D(se([])),Mr=D(se([])),ht=D(se(new Set)),br=D(""),Cn=D(""),Rt=D(se([])),at=D(se([])),Wt=D(""),Ma=D(!0),Sl=D(!0),Bt=D(se(kn("csauto_status_views",{}))),Sn=D(se(localStorage.getItem("csauto_status_view_selected")??""));function zr(){return e(Gt)}function Pn(){return e(Mr)}function Ut(){return e(ht)}function Xn(){return e(br)}function an(){return e(Cn)}function Pl(){return e(Rt)}function $l(){return e(Rt).filter(t=>e(Mr).includes(t))}function Rl(){return e(Rt).filter(t=>Dt.some(r=>r.key===t))}function El(){return e(at)}function Nl(){return e(Wt)}function Ml(){return e(Ma)}function Yn(){return e(Bt)}function Tl(){return e(Sn)}function Al(t){v(Gt,t,!0)}function Ll(t){const r=e(Mr).length===0&&t.length>0;v(Mr,t,!0),r&&e(Rt).length===0&&v(Rt,[...t,...Dt.map(a=>a.key)],!0)}function Fl(t){v(br,t,!0)}function Qn(t){v(Rt,t,!0)}function Dl(t){v(Wt,t,!0)}function Il(t){v(Ma,t,!0)}function zl(t){v(Sl,t,!0)}function $n(t){v(Sn,t,!0),localStorage.setItem("csauto_status_view_selected",t)}function on(t){const r=new Set(e(ht));r.has(t)?r.delete(t):r.add(t),v(ht,r,!0),v(br,t,!0),v(Cn,t,!0)}function Ta(t){v(ht,new Set([t]),!0),v(br,t,!0),v(Cn,t,!0)}function sn(t,r,a){const n=a.indexOf(t),o=a.indexOf(r);if(n<0||o<0)return;const[s,i]=n{const a=Ol(r);return t.every(n=>a.includes(n))})}function Hl(t){if(t==null||t==="")return"";const r=Number(t);return Number.isFinite(r)?r:String(t).toLowerCase()}function ea(t,r){var n;if(r==="case_id")return t.case_id;if(r==="status")return t.status??"";if(r==="note")return t.note??"";if(r==="nprocs")return t.nprocs??0;if(r==="nt")return t.nt??0;if(r==="last_iter")return t.last_iter??0;if(r==="duration")return t.duration_s??0;if(r==="last_mod")return t.last_mod??"";if(r==="resu_size_mb")return t.resu_size_mb??0;const a=(n=t.doe)==null?void 0:n[r];return a!==void 0?Hl(a):""}function jl(t,r){return t===""&&r===""?0:t===""?1:r===""?-1:typeof t=="number"&&typeof r=="number"?t-r:String(t).localeCompare(String(r))}function La(){const t=Aa();return e(at).length===0?t:[...t].sort((r,a)=>{for(const n of e(at)){const o=ea(r,n.key),s=ea(a,n.key),i=jl(o,s);if(i!==0)return n.dir==="asc"?i:-i}return 0})}function Rr(){return La().map(t=>t.case_id)}function Ul(t,r){const a=e(at).findIndex(n=>n.key===t);if(r)if(a>=0){const n=[...e(at)];n[a]={key:t,dir:n[a].dir==="asc"?"desc":"asc"},v(at,n,!0)}else v(at,[...e(at),{key:t,dir:"asc"}],!0);else a>=0&&e(at).length===1?v(at,[{key:t,dir:e(at)[0].dir==="asc"?"desc":"asc"}],!0):v(at,[{key:t,dir:"asc"}],!0)}function Vl(){return{visibleColumns:[...e(Rt)],search:e(Wt),sorts:e(at).map(t=>({...t}))}}function Bl(t){v(Rt,[...t.visibleColumns],!0),v(Wt,t.search,!0),v(at,t.sorts.map(r=>({...r})),!0)}function ql(t){v(Bt,{...e(Bt),[t]:Vl()},!0),Ir("csauto_status_views",e(Bt)),$n(t)}function Kl(t){const r={...e(Bt)};delete r[t],v(Bt,r,!0),Ir("csauto_status_views",r),e(Sn)===t&&$n("")}function Cr(){const t=new Set;for(const r of e(Gt))e(ht).has(r.case_id)&&t.add((r.status??"").toUpperCase());return t}function ta(){for(const t of e(Gt))if(e(ht).has(t.case_id)&&t.resu_size_mb!=null&&t.resu_size_mb>0)return!0;return!1}function Gl(t,r){const a=r.length,n=t.length,o=r.filter(u=>u.status==="RUNNING").length,s=t.filter(u=>u.status==="RUNNING").length,i=r.filter(u=>u.convergence==="converged").length,c=t.filter(u=>u.convergence==="converged").length;return{totalCases:a,shownCases:n,totalRunning:o,shownRunning:s,totalConverged:i,shownConverged:c}}var Wl=E('
            DOE columns
            '),Xl=E('
            ');function Yl(t,r){Me(r,!0);let a=he(r,"initialName",3,""),n=O(Pn),o=D(se(a())),s=D(se(new Set(r.initialColumns??[...e(n),...Dt.map(I=>I.key)])));function i(I){const G=new Set(e(s));G.has(I)?G.delete(I):G.add(I),v(s,G,!0)}function c(I,G){const U=new Set(e(s));I.forEach(q=>G?U.add(q):U.delete(q)),v(s,U,!0)}function u(){const I=e(o).trim();I&&r.onSave(I,[...e(s)])}function w(I){I.key==="Escape"&&r.onCancel()}function p(I){I.target.dataset.backdrop!==void 0&&r.onCancel()}let T=D(void 0);Ee(()=>{var I,G;(I=e(T))==null||I.focus(),(G=e(T))==null||G.select()});var y=Xl(),N=k(y),A=k(N),b=k(A,!0);h(A);var f=M(A,2),_=M(k(f),2);Ke(_),rt(_,I=>v(T,I),()=>e(T)),h(f);var P=M(f,2);{var x=I=>{var G=Wl(),U=k(G),q=M(k(U),2),g=k(q),l=M(g,2);h(q),h(U);var C=M(U,2);Ue(C,20,()=>e(n),H=>H,(H,W)=>{{let ee=O(()=>e(s).has(W));zt(H,{get checked(){return e(ee)},onchange:()=>i(W),size:14,get label(){return W}})}}),h(C),h(G),ie("click",g,()=>c(e(n),!0)),ie("click",l,()=>c(e(n),!1)),d(I,G)};X(P,I=>{e(n).length>0&&I(x)})}var S=M(P,2),R=k(S),m=M(k(R),2),$=k(m),F=M($,2);h(m),h(R);var L=M(R,2);Ue(L,21,()=>Dt,I=>I.key,(I,G)=>{{let U=O(()=>e(s).has(e(G).key));zt(I,{get checked(){return e(U)},onchange:()=>i(e(G).key),size:14,get label(){return e(G).label}})}}),h(L),h(S);var j=M(S,2),z=k(j);Re(z,{variant:"secondary",get onclick(){return r.onCancel},children:(I,G)=>{Ce();var U=Oe("Cancel");d(I,U)},$$slots:{default:!0}});var V=M(z,2);{let I=O(()=>!e(o).trim());Re(V,{variant:"primary",onclick:u,get disabled(){return e(I)},children:(G,U)=>{Ce();var q=Oe("Save");d(G,q)},$$slots:{default:!0}})}h(j),h(N),h(y),Q(()=>re(b,r.mode==="create"?"New view":"Edit view")),ie("keydown",y,w),ie("click",y,p),Ze(_,()=>e(o),I=>v(o,I)),ie("click",$,()=>c(Dt.map(I=>I.key),!0)),ie("click",F,()=>c(Dt.map(I=>I.key),!1)),d(t,y),Te()}qe(["keydown","click"]);var Ql=E('
            ',1);function Jl(t,r){Me(r,!0);let a=O(()=>Object.keys(Yn())),n=D(se(Tl())),o=D(!1),s=D("create"),i=O(()=>[{value:"",label:"All columns"},...e(a).map(R=>({value:R,label:R}))]);function c(R){if(v(n,R,!0),$n(R),R==="")Qn([...Pn(),...Dt.map(m=>m.key)]);else{const m=Yn();m[R]&&Bl(m[R])}}function u(){v(s,"edit"),v(o,!0)}function w(){v(s,"create"),v(o,!0)}function p(R,m){Qn(m),e(s)==="edit"&&e(n)&&R!==e(n)&&Kl(e(n)),ql(R),v(n,R,!0),v(o,!1)}function T(){v(o,!1)}var y=Ql(),N=B(y),A=k(N);it(A,{class:"w-[140px]",get options(){return e(i)},get value(){return e(n)},onchange:c});var b=M(A,2),f=k(b);Fe(f,{get icon(){return yi},size:14}),h(b);var _=M(b,2),P=k(_);Fe(P,{get icon(){return wi},size:14}),h(_),h(N);var x=M(N,2);{var S=R=>{Qt(R,{children:(m,$)=>{{let F=O(()=>e(s)==="edit"?e(n):""),L=O(Pl);Yl(m,{get mode(){return e(s)},get initialName(){return e(F)},get initialColumns(){return e(L)},onSave:p,onCancel:T})}}})};X(x,R=>{e(o)&&R(S)})}ie("click",b,u),ie("click",_,w),d(t,y),Te()}qe(["click"]);var Zl=E('
            '),ec=E(""),tc=E(' '),rc=E(' '),nc=E('
            '),ac=E(" "),oc=E(''),sc=E(''),ic=E(" Open GUI",1),lc=E(""),cc=E(" "),uc=E(""),dc=E('
            ');function fc(t,r){Me(r,!0);let a=O(()=>r.rows.length>0&&r.rows.every(g=>e(w).has(g.case_id))),n=O(()=>r.rows.some(g=>e(w).has(g.case_id))),o=O(()=>e(n)&&!e(a)),s=O($l),i=O(()=>new Set(Rl())),c=O(El),u=O(Ml),w=O(Ut),p=O(()=>{const g=[{key:"_select",label:"",kind:"meta",sticky:"left"},{key:"case_id",label:"Case",kind:"meta",sticky:"left"},{key:"status",label:"Status",kind:"meta",sticky:"left"},...e(i).has("note")?[{key:"note",label:"Note",kind:"meta"}]:[]],l=e(s).map(ee=>({key:ee,label:ee,kind:"doe"})),H=[{key:"nprocs",label:"MPI Ranks",kind:"calc"},{key:"nt",label:"Thread Count",kind:"calc"},{key:"last_iter",label:"Last Iter",kind:"calc"},{key:"duration",label:"Duration",kind:"calc"},{key:"last_mod",label:"Last Modified",kind:"calc"},{key:"resu_size_mb",label:"Results (MB)",kind:"calc"}].filter(ee=>e(i).has(ee.key)),W=en("gui")?[{key:"_actions",label:"",kind:"meta",sticky:"right"}]:[];return[...g,...l,...H,...W]});function T(g){const l=e(c).findIndex(H=>H.key===g);if(l<0)return"";const C=e(c)[l].dir==="asc"?"▲":"▼";return e(c).length>1?`${C}${l+1}`:C}function y(g,l){g!=="_actions"&&Ul(g,l.ctrlKey||l.metaKey)}function N(g,l){l.shiftKey?sn(an()||g,g,Rr()):l.ctrlKey||l.metaKey?on(g):Ta(g)}function A(g,l){var H;const C=((H=g.status)==null?void 0:H.toUpperCase())??"";C!=="DONE"&&C!=="FAILED"||(l.preventDefault(),r.onContextMenu(g.case_id,l.clientX,l.clientY,g.convergence??""))}async function b(g){const l=g.note??"",C=await pn("Case note:",l,`Note: ${g.case_id}`,"",!0);if(C!==null)try{await qs(g.case_id,C)}catch(H){await tt(`Failed to set note: ${H instanceof Error?H.message:H}`,"Error")}}async function f(g){try{await Gs(g)}catch(l){await tt(`Failed to open GUI: ${l instanceof Error?l.message:l}`,"Error")}}function _(g,l){const C=(g==null?void 0:g.toUpperCase())??"";return(C==="DONE"||C==="FAILED")&&l==="converged"?"CONVERGED":(C==="DONE"||C==="FAILED")&&l==="not_converged"?"NOT CONVERGED":C}function P(g,l){const C=(g==null?void 0:g.toUpperCase())??"";return(C==="DONE"||C==="FAILED")&&l==="converged"?"status-converged":(C==="DONE"||C==="FAILED")&&l==="not_converged"?"status-not-converged":C==="RUNNING"?"status-running":C==="DONE"?"status-done":C==="FAILED"?"status-failed":C==="PREPARED"?"status-prepared":"status-unknown"}function x(g){return e(w).has(g.case_id)?"row-selected":""}function S(g,l){var C;return l.key==="case_id"?g.case_id:l.key==="nprocs"?g.nprocs!=null?String(g.nprocs):"":l.key==="nt"?g.nt!=null?String(g.nt):"":l.key==="last_iter"?g.last_iter!=null?String(g.last_iter):"":l.key==="duration"?g.duration??"":l.key==="last_mod"?R(g.last_mod):l.key==="resu_size_mb"?g.resu_size_mb!=null?String(g.resu_size_mb):"":l.kind==="doe"?((C=g.doe)==null?void 0:C[l.key])!=null&&String(g.doe[l.key])!==""?String(g.doe[l.key]):"-":""}function R(g){if(!g)return"";try{const l=new Date(g),C=new Date,H=l.toDateString()===C.toDateString(),W=new Date(C);W.setDate(W.getDate()-1);const ee=l.toDateString()===W.toDateString(),ne=l.toLocaleTimeString([],{hour:"2-digit",minute:"2-digit"});return H?`Today ${ne}`:ee?`Yesterday ${ne}`:l.toLocaleDateString([],{month:"short",day:"numeric"})+` ${ne}`}catch{return g}}let m=D(se({})),$=D(void 0);Ee(()=>{e(u),e(p),r.rows,!(!e($)||!e(u))&&Pt().then(()=>{if(!e($))return;const g=Array.from(e($).querySelectorAll("thead th.sticky-left")),l={};let C=0;g.forEach(H=>{const W=H.dataset.colKey??"";l[W]=C,C+=H.getBoundingClientRect().width}),v(m,l,!0)})});function F(g,l,C){const H=C&&g.key!=="_select"&&g.key!=="_actions"?["status-sortable"]:[];if(!C&&g.key==="case_id"&&H.push("case-id"),g.kind==="doe"&&H.push("status-col-doe"),!C&&g.key==="note"&&H.push("max-w-[140px] whitespace-nowrap overflow-hidden text-ellipsis cursor-pointer hover:underline hover:decoration-dotted hover:underline-offset-2"),e(u)&&g.sticky==="left"&&H.push("sticky-left"),e(u)&&g.sticky==="right"&&H.push("sticky-right"),e(u)&&g.sticky==="left"){const W=e(p)[l+1];(!W||W.sticky!=="left")&&H.push("sticky-divider")}if(e(u)&&g.sticky==="right"){const W=e(p)[l-1];(!W||W.sticky!=="right")&&H.push("sticky-divider")}return H.join(" ")}function L(g,l){return F(g,l,!0)}function j(g,l){return F(g,l,!1)}function z(g){return!e(u)||!g.sticky?"":g.sticky==="right"?"position:sticky;right:0;":g.sticky==="left"&&g.key in e(m)?`position:sticky;left:${e(m)[g.key]}px;`:""}var V=dc(),I=k(V),G=k(I),U=k(G);Ue(U,23,()=>e(p),g=>g.key,(g,l,C)=>{var H=Se(),W=B(H);{var ee=K=>{var Y=Zl(),ce=k(Y),le=k(ce);zt(le,{get checked(){return e(a)},get indeterminate(){return e(o)},get onchange(){return r.onToggleAll},size:14}),h(ce),h(Y),Q((we,ge)=>{ke(Y,1,`${we??""} !px-2.5 !py-0 w-9`),ye(Y,"data-col-key",e(l).key),Xe(Y,ge)},[()=>L(e(l),e(C)),()=>z(e(l))]),d(K,Y)},ne=K=>{var Y=ec();Q((ce,le)=>{ke(Y,1,ce),ye(Y,"data-col-key",e(l).key),Xe(Y,le)},[()=>dt(L(e(l),e(C))),()=>z(e(l))]),d(K,Y)},pe=K=>{var Y=rc(),ce=k(Y),le=M(ce);{var we=Z=>{var _e=tc(),Pe=k(_e,!0);h(_e),Q($e=>re(Pe,$e),[()=>T(e(l).key)]),d(Z,_e)},ge=O(()=>T(e(l).key));X(le,Z=>{e(ge)&&Z(we)})}h(Y),Q((Z,_e)=>{ke(Y,1,Z),ye(Y,"data-col-key",e(l).key),Xe(Y,_e),re(ce,`${e(l).label??""} `)},[()=>dt(L(e(l),e(C))),()=>z(e(l))]),ie("click",Y,Z=>y(e(l).key,Z)),ie("keydown",Y,Z=>{(Z.key==="Enter"||Z.key===" ")&&(Z.preventDefault(),y(e(l).key,Z))}),d(K,Y)};X(W,K=>{e(l).key==="_select"?K(ee):e(l).key==="_actions"?K(ne,1):K(pe,-1)})}d(g,H)}),h(U),h(G);var q=M(G);Ue(q,21,()=>r.rows,g=>g.case_id,(g,l)=>{var C=uc();Ue(C,23,()=>e(p),H=>H.key,(H,W,ee)=>{var ne=Se(),pe=B(ne);{var K=ge=>{var Z=nc(),_e=k(Z),Pe=k(_e);{let $e=O(()=>e(w).has(e(l).case_id));zt(Pe,{get checked(){return e($e)},onchange:()=>r.onToggleRow(e(l).case_id),size:14})}h(_e),h(Z),Q(($e,ve)=>{ke(Z,1,`${$e??""} !px-2.5 !py-0 w-9`),ye(Z,"data-col-key",e(W).key),Xe(Z,ve)},[()=>j(e(W),e(ee)),()=>z(e(W))]),d(ge,Z)},Y=ge=>{var Z=ac(),_e=k(Z),Pe=k(_e,!0);h(_e),h(Z),Q(($e,ve,De,be)=>{ke(Z,1,$e),ye(Z,"data-col-key",e(W).key),Xe(Z,ve),ke(_e,1,`status-pill ${De??""}`),re(Pe,be)},[()=>dt(j(e(W),e(ee))),()=>z(e(W)),()=>P(e(l).status,e(l).convergence),()=>_(e(l).status,e(l).convergence)]),d(ge,Z)},ce=ge=>{var Z=sc(),_e=k(Z);{var Pe=ve=>{var De=Oe();Q(()=>re(De,e(l).note)),d(ve,De)},$e=ve=>{var De=oc(),be=k(De);Fe(be,{get icon(){return xi},size:12}),h(De),d(ve,De)};X(_e,ve=>{e(l).note?ve(Pe):ve($e,-1)})}h(Z),Q((ve,De)=>{ke(Z,1,ve),ye(Z,"data-col-key",e(W).key),Xe(Z,De),ye(Z,"title",e(l).note||"Add note")},[()=>dt(j(e(W),e(ee))),()=>z(e(W))]),ie("click",Z,ve=>{ve.stopPropagation(),b(e(l))}),ie("keydown",Z,ve=>{(ve.key==="Enter"||ve.key===" ")&&(ve.preventDefault(),ve.stopPropagation(),b(e(l)))}),d(ge,Z)},le=ge=>{var Z=lc(),_e=k(Z);Re(_e,{variant:"primary",size:"sm",onclick:Pe=>{Pe.stopPropagation(),f(e(l).case_id)},children:(Pe,$e)=>{var ve=ic(),De=B(ve);Fe(De,{get icon(){return _i},size:12}),Ce(),d(Pe,ve)},$$slots:{default:!0}}),h(Z),Q((Pe,$e)=>{ke(Z,1,Pe),ye(Z,"data-col-key",e(W).key),Xe(Z,$e)},[()=>dt(j(e(W),e(ee))),()=>z(e(W))]),d(ge,Z)},we=ge=>{var Z=cc(),_e=k(Z,!0);h(Z),Q((Pe,$e,ve)=>{ke(Z,1,Pe),ye(Z,"data-col-key",e(W).key),Xe(Z,$e),re(_e,ve)},[()=>dt(j(e(W),e(ee))),()=>z(e(W)),()=>S(e(l),e(W))]),d(ge,Z)};X(pe,ge=>{e(W).key==="_select"?ge(K):e(W).key==="status"?ge(Y,1):e(W).key==="note"?ge(ce,2):e(W).key==="_actions"?ge(le,3):ge(we,-1)})}d(H,ne)}),h(C),Q(H=>ke(C,1,H),[()=>dt(x(e(l)))]),ie("click",C,H=>N(e(l).case_id,H)),ie("contextmenu",C,H=>A(e(l),H)),d(g,C)}),h(q),h(I),rt(I,g=>v($,g),()=>e($)),h(V),Q(()=>ke(V,1,`table-wrap ${e(u)?"sticky-enabled":""}`)),d(t,V),Te()}qe(["click","keydown","contextmenu"]);var vc=E('
            ');function gc(t,r){Me(r,!0);let a=O(()=>{const y=Math.min(r.x,window.innerWidth-180),N=Math.min(r.y,window.innerHeight-120);return`left: ${y}px; top: ${N}px;`});async function n(y){try{for(const N of r.cases)await Ks(N,y)}catch(N){console.error("Failed to set convergence:",N)}r.onClose()}const o=r.cases.length>1?` (${r.cases.length})`:"";var s=vc();et("keydown",st,y=>{y.key==="Escape"&&r.onClose()});var i=k(s),c=k(i);h(i);var u=M(i,2),w=k(u);h(u);var p=M(u,2),T=k(p);h(p),h(s),Q(()=>{Xe(s,e(a)),ke(i,1,`w-full text-left py-[7px] px-[10px] bg-transparent border border-transparent rounded-md text-[12.5px] cursor-pointer transition-[background] duration-[120ms] ease-in-out hover:bg-edf-gris-clair hover:border-border ${r.currentValue==="converged"?"is-active":""}`),re(c,`Mark Converged${o}`),ke(u,1,`w-full text-left py-[7px] px-[10px] bg-transparent border border-transparent rounded-md text-[12.5px] cursor-pointer transition-[background] duration-[120ms] ease-in-out hover:bg-edf-gris-clair hover:border-border ${r.currentValue==="not_converged"?"is-active":""}`),re(w,`Mark Not Converged${o}`),ke(p,1,`w-full text-left py-[7px] px-[10px] bg-transparent border border-transparent rounded-md text-[12.5px] cursor-pointer transition-[background] duration-[120ms] ease-in-out hover:bg-edf-gris-clair hover:border-border ${r.currentValue===""?"is-active":""}`),re(T,`Clear Mark${o}`)}),ie("click",i,()=>n("converged")),ie("click",u,()=>n("not_converged")),ie("click",p,()=>n("")),d(t,s),Te()}qe(["click"]);var hc=E(" Refresh",1),mc=E(" ",1),pc=E(" Run",1),_c=E(" Restart",1),bc=E(" Kill",1),xc=E(" Clean",1),yc=E('
            ',1),wc=E('
            ',1);function kc(t,r){Me(r,!0);function a(){return[...Ut()]}async function n(){const g=a();if(!g.length)return;const l=await rs(g);if(l)try{await Un({cases:g,n:l.n,nt:l.nt,maxParallel:l.maxParallel}),r.onRefresh()}catch(C){await tt(`Run failed: ${C instanceof Error?C.message:C}`,"Error")}}async function o(){const g=a();if(!g.length)return;const l=await ns(g);if(l)try{await Un({cases:g,...l,restart:!0}),r.onRefresh()}catch(C){await tt(`Restart failed: ${C instanceof Error?C.message:C}`,"Error")}}async function s(){const g=a();if(!(!g.length||!await Hn(`Kill ${g.length} case${g.length>1?"s":""}?`,"Confirm Kill","Kill","danger")))try{await Us(g),r.onRefresh()}catch(C){await tt(`Kill failed: ${C instanceof Error?C.message:C}`,"Error")}}async function i(g){const l=new Set(zr().filter(ee=>{var ne;return((ne=ee.status)==null?void 0:ne.toUpperCase())==="RUNNING"}).map(ee=>ee.case_id)),C=a().filter(ee=>l.has(ee));if(!C.length)return;const H=`${C.length} case${C.length>1?"s":""}`;let W=null;if(g.value_label){const ee=await pn(`${g.value_label} for ${H}:`,"",g.label);if(ee===null)return;W=Number(ee.trim().replace(",","."));const ne=Ra(g,W);if(ne){await tt(ne,"Invalid value");return}}else if(!await Hn(`${g.label} for ${H}?`,g.label,g.label,"warning"))return;try{await Vs({cases:C,action:g.name,value:W}),r.onRefresh(),qn(`${g.label} requested for ${H}`)}catch(ee){await tt(`${g.label} failed: ${ee instanceof Error?ee.message:ee}`,"Error")}}async function c(){var C;const g=a();if(!g.length)return;const l=await as(g);if(l)try{const H=await Bs({cases:g,keepLast:l.keepLast,keepResu:l.keepResu,deleteResu:l.deleteResu,pruneResu:!0});(C=H.skipped_active)!=null&&C.length&&qn(`Skipped running cases: ${H.skipped_active.join(", ")}`),r.onRefresh(),nl()}catch(H){await tt(`Cleanup failed: ${H instanceof Error?H.message:H}`,"Error")}}function u(){const g=Rr();g.length>0&&g.every(C=>Ut().has(C))?Zn():Jn(g)}function w(g){on(g)}let p=D(se(Zt("status")));Ee(()=>{er("status",e(p))}),Il(!0);let T=O(()=>{const g=Cr();return g.size>0&&[...g].some(l=>l==="PREPARED"||l==="DONE"||l==="FAILED")}),y=O(()=>{if(!en("restart"))return!1;const g=Cr();return g.size>0&&[...g].some(l=>l==="DONE"||l==="FAILED")&&ta()}),N=O(()=>{const g=Cr();return g.size>0&&g.has("RUNNING")}),A=O(()=>Cr().has("RUNNING")),b=O(()=>{var g;return(((g=$t())==null?void 0:g.control_actions)??[]).map(l=>({label:l.label,onClick:()=>i(l),disabled:!e(A)}))}),f=O(ta),_=D(se(Nl())),P=null;function x(){P&&clearTimeout(P),P=setTimeout(()=>{Dl(e(_))},200)}Ee(()=>zl(e(p)));let S=D(!1),R=D(0),m=D(0),$=D(se([])),F=D("");function L(g,l,C,H){v($,Ut().has(g)?[...Ut()]:[g],!0),v(F,H,!0),v(R,l,!0),v(m,C,!0),v(S,!0)}function j(){v(S,!1)}function z(g){const l=Rr();if(l.length){if(g.key==="Escape"){Zn(),j();return}if((g.ctrlKey||g.metaKey)&&g.key==="a"){g.preventDefault(),Jn(l);return}if(g.key==="ArrowDown"||g.key==="ArrowUp"){g.preventDefault();const C=g.key==="ArrowDown"?1:-1,H=Xn(),W=l.indexOf(H),ee=Math.max(0,Math.min(l.length-1,W+C)),ne=l[ee];g.shiftKey?sn(an()||l[0],ne,l):Ta(ne),Fl(ne);return}if(g.key===" "){g.preventDefault();const C=Xn();C&&(g.shiftKey?sn(an()||C,C,Rr()):on(C))}}}var V=wc();et("click",st,j),et("scroll",st,j);var I=B(V),G=k(I);Ht(G,{eyebrow:"Overview",title:"Status",wide:!0,id:"status-card-shell",actions:l=>{var C=mc(),H=B(C);{let ne=O(tl);tr(H,{name:"status",get intervalMs(){return e(ne)},get onRefresh(){return r.onRefresh},get checked(){return e(p)},set checked(pe){v(p,pe,!0)}})}var W=M(H,2);{var ee=ne=>{Re(ne,{variant:"primary",onclick:()=>r.onRefresh(),children:(pe,K)=>{var Y=hc(),ce=B(Y);Fe(ce,{get icon(){return Jt}}),Ce(),d(pe,Y)},$$slots:{default:!0}})};X(W,ne=>{e(p)||ne(ee)})}d(l,C)},children:(l,C)=>{var H=yc(),W=B(H),ee=k(W),ne=k(ee);Ke(ne);var pe=M(ne,2);Jl(pe,{}),h(ee);var K=M(ee,2),Y=k(K),ce=k(Y);h(Y);var le=M(Y,2);{let be=O(()=>!e(T));Re(le,{variant:"run",size:"sm",onclick:n,get disabled(){return e(be)},children:(He,Ie)=>{var oe=pc(),ue=B(oe);Fe(ue,{get icon(){return Ea}}),Ce(),d(He,oe)},$$slots:{default:!0}})}var we=M(le,2);{var ge=be=>{{let He=O(()=>!e(y));Re(be,{variant:"warning",size:"sm",onclick:o,get disabled(){return e(He)},children:(Ie,oe)=>{var ue=_c(),je=B(ue);Fe(je,{get icon(){return ki}}),Ce(),d(Ie,ue)},$$slots:{default:!0}})}},Z=O(()=>en("restart"));X(we,be=>{e(Z)&&be(ge)})}var _e=M(we,2);{var Pe=be=>{Cl(be,{label:"Control",get items(){return e(b)}})};X(_e,be=>{e(b).length>0&&be(Pe)})}var $e=M(_e,2);{let be=O(()=>!e(N));Re($e,{variant:"danger",size:"sm",onclick:s,get disabled(){return e(be)},children:(He,Ie)=>{var oe=bc(),ue=B(oe);Fe(ue,{get icon(){return mi}}),Ce(),d(He,oe)},$$slots:{default:!0}})}var ve=M($e,2);{let be=O(()=>!e(f));Re(ve,{variant:"secondary",size:"sm",onclick:c,get disabled(){return e(be)},children:(He,Ie)=>{var oe=xc(),ue=B(oe);Fe(ue,{get icon(){return Si}}),Ce(),d(He,oe)},$$slots:{default:!0}})}h(K),h(W);var De=M(W,2);{let be=O(La);fc(De,{get rows(){return e(be)},onContextMenu:L,onToggleAll:u,onToggleRow:w})}Q(be=>re(ce,`${be??""} selected`),[()=>Ut().size]),ie("input",ne,x),Ze(ne,()=>e(_),be=>v(_,be)),d(l,H)},$$slots:{actions:!0,default:!0}}),h(I);var U=M(I,2);{var q=g=>{gc(g,{get cases(){return e($)},get x(){return e(R)},get y(){return e(m)},get currentValue(){return e(F)},onClose:j})};X(U,g=>{e(S)&&g(q)})}ie("keydown",I,z),d(t,V),Te()}qe(["keydown","input"]);var Cc=E('
            ');function Xt(t,r){var a=Cc(),n=k(a);ft(n,()=>r.children),h(a),d(t,a)}var Sc=E(''),Pc=E(" ",1);function Rn(t,r){Me(r,!0);let a=he(r,"columnLabel",3,"Columns"),n=he(r,"xMinLabel",3,"Iter min"),o=O(()=>yn(r.allCases)),s=O(()=>r.columns.map(u=>({value:u,label:u}))),i=[{value:"zero",label:"Zero"},{value:"restart",label:"Restart start"},{value:"custom",label:"Custom"}];function c(u){r.onXMinChange(Number(u.target.value)||0)}Xt(t,{children:(u,w)=>{var p=Pc(),T=B(p);Ne(T,{text:"Cases",children:(S,R)=>{Kt(S,{class:"w-[160px]",get options(){return e(o)},get selected(){return r.selectedCases},get onchange(){return r.onCasesChange},placeholder:"Select cases..."})}});var y=M(T,2);{var N=S=>{var R=Se(),m=B(R);ft(m,()=>r.middleSlot),d(S,R)};X(y,S=>{r.middleSlot&&S(N)})}var A=M(y,2);Ne(A,{get text(){return a()},children:(S,R)=>{Kt(S,{class:"w-[160px]",get options(){return e(s)},get selected(){return r.selectedColumns},get onchange(){return r.onColumnsChange},placeholder:"Select..."})}});var b=M(A,2);Ne(b,{text:"Start from",children:(S,R)=>{it(S,{class:"w-[140px]",get options(){return i},get value(){return r.startFrom},onchange:m=>r.onStartFromChange(m)})}});var f=M(b,2);{var _=S=>{Ne(S,{get text(){return n()},children:(R,m)=>{var $=Sc();Ke($),Q(()=>hn($,r.xMin)),ie("input",$,c),d(R,$)}})};X(f,S=>{r.startFrom==="custom"&&S(_)})}var P=M(f,2);{var x=S=>{var R=Se(),m=B(R);ft(m,()=>r.extraSlot),d(S,R)};X(P,S=>{r.extraSlot&&S(x)})}d(u,p)}}),Te()}qe(["input"]);var $c=E('
            '),Rc=E('
            ');function Yt(t,r){let a=he(r,"emptyMessage",3,"");var n=Rc(),o=k(n);{var s=c=>{var u=Se(),w=B(u);Fr(w,()=>r.svgHtml),d(c,u)},i=c=>{var u=$c(),w=k(u),p=k(w,!0);h(w),h(u),Q(()=>re(p,a()||"No data to display.")),d(c,u)};X(o,c=>{r.svgHtml?c(s):c(i,-1)})}h(n),Q(()=>ye(n,"id",r.id)),d(t,n)}async function En(t,r="plot.png"){const a=document.getElementById(t),n=a==null?void 0:a.querySelector("svg");if(!n)return;const{width:o,height:s}=Ec(n),i=window.devicePixelRatio||1,c=document.createElement("canvas");c.width=o*i,c.height=s*i;const u=c.getContext("2d");if(!u)return;u.scale(i,i);const w=new XMLSerializer().serializeToString(n),p=new Blob([w],{type:"image/svg+xml;charset=utf-8"}),T=URL.createObjectURL(p),y=new Image;y.width=o,y.height=s,await new Promise((A,b)=>{y.onload=()=>{u.drawImage(y,0,0,o,s),URL.revokeObjectURL(T),A()},y.onerror=b,y.src=T});const N=await new Promise(A=>c.toBlob(A,"image/png"));N&&await Da(N,Nc(r))}function xr(t,r,a="png"){const n=r.length<=3?r.join("_"):`${r.length}_cases`,o=new Date().toISOString().replace(/[:.]/g,"-").slice(0,19);return Mc(`${t}_${n}_${o}.${a}`)}async function Fa(t,r){const a=new Blob([t],{type:"text/csv;charset=utf-8"});await Da(a,r)}function Ec(t){const r=t.getAttribute("viewBox");if(r){const a=r.split(/[\s,]+/).map(Number);if(a.length===4)return{width:a[2],height:a[3]}}return{width:t.width.baseVal.value||900,height:t.height.baseVal.value||500}}async function Da(t,r){if("showSaveFilePicker"in window)try{const s=await(await window.showSaveFilePicker({suggestedName:r,types:[{description:t.type.startsWith("image/")?"Image":"File",accept:{[t.type]:[`.${r.split(".").pop()}`]}}]})).createWritable();await s.write(t),await s.close();return}catch(o){if((o==null?void 0:o.name)==="AbortError")return}const a=URL.createObjectURL(t),n=document.createElement("a");n.href=a,n.download=r,document.body.appendChild(n),n.click(),document.body.removeChild(n),URL.revokeObjectURL(a)}function Nc(t){return t.endsWith(".png")?t:`${t}.png`}function Mc(t){return t.replace(/[^a-zA-Z0-9._-]/g,"_")}let Ia=D(se([])),za=D(se([])),Oa=D(se([])),Ha=D("zero"),ja=D(0),Ua=D(""),Tc=D(!0);function Ac(){return{selectedCases:e(Ia),columns:e(za),selectedColumns:e(Oa),startFrom:e(Ha),iterMin:e(ja),svgHtml:e(Ua),autoRefresh:e(Tc)}}function ra(t){v(Ia,t,!0)}function Lc(t){v(za,t,!0)}function Xr(t){v(Oa,t,!0)}function Fc(t){v(Ha,t,!0)}function Dc(t){v(ja,t,!0)}function Sr(t){v(Ua,t,!0)}var Ic=E(" Refresh",1),zc=E(" ",1),Oc=E(" Download as PNG",1),Hc=E('
            '),jc=E('
            ',1),Uc=E('
            '),Vc=E('

            '),Bc=E(" ",1);function qc(t,r){Me(r,!0);let a=O(Ac),n=D("");async function o(){var N;if(e(a).selectedCases.length)try{const A=(await As(e(a).selectedCases)).filter(b=>b!=="iteration");if(v(n,""),Lc(A),A.length===0){Xr([]),Sr("");return}if(e(a).selectedColumns.length===0){const b=(((N=$t())==null?void 0:N.default_residual_columns)??[]).filter(f=>A.includes(f));Xr(b.length>0?b:A.slice(0,2))}}catch(A){v(n,"Failed to load residual columns"),console.error("Failed to load residual columns:",A)}}async function s(){if(e(a).selectedCases.length&&!((e(a).columns.length===0||e(a).selectedColumns.length===0)&&(await o(),!e(a).selectedColumns.length)))try{let N=0,A=!0;if(e(a).startFrom==="restart"){const f=await Sa(e(a).selectedCases),_=Object.values(f.origins).map(P=>P.iteration).filter(P=>P!==void 0&&Number.isFinite(P));N=_.length>0?Math.min(..._):0}else e(a).startFrom==="custom"&&(N=e(a).iterMin);const b=await Ls(e(a).selectedCases,e(a).selectedColumns,{xMin:N,includeHistory:A});v(n,""),b&&Sr(b)}catch(N){v(n,"Failed to load residual plot"),console.error("Failed to load residual plot:",N)}}function i(N){if(ra(N),N.length===0){Sr("");return}o(),s()}function c(N){if(Xr(N),N.length===0){Sr("");return}s()}function u(N){Fc(N),s()}function w(N){Dc(N),s()}let p=D(se(Zt("plot")));Ee(()=>{er("plot",e(p))}),Ee(()=>{e(p)?pr("residualPlot",s,Gn()):vt("residualPlot")});let T=!1;Ee(()=>{r.allCases.length>0&&!T&&(T=!0,ra([...r.allCases]),o().then(()=>s()))});const y=_r(()=>{T&&o().then(()=>s())});vr(()=>{vt("residualPlot"),y()}),Ht(t,{eyebrow:"Diagnostics",title:"Residuals Plot",wide:!0,actions:A=>{var b=zc(),f=B(b);{let x=O(Gn);tr(f,{name:"residualPlot",get intervalMs(){return e(x)},onRefresh:s,get checked(){return e(p)},set checked(S){v(p,S,!0)}})}var _=M(f,2);{var P=x=>{Re(x,{variant:"primary",onclick:s,children:(S,R)=>{var m=Ic(),$=B(m);Fe($,{get icon(){return Jt}}),Ce(),d(S,m)},$$slots:{default:!0}})};X(_,x=>{e(p)||x(P)})}d(A,b)},children:(A,b)=>{var f=Bc(),_=B(f);{var P=m=>{const $=V=>{var I=Hc(),G=k(I);{let U=O(()=>!e(a).svgHtml);Re(G,{variant:"secondary",size:"sm",onclick:()=>En("plot-holder",xr("residuals",e(a).selectedCases)),get disabled(){return e(U)},children:(q,g)=>{var l=Oc(),C=B(l);Fe(C,{get icon(){return mr}}),Ce(),d(q,l)},$$slots:{default:!0}})}h(I),d(V,I)};var F=jc(),L=B(F);Rn(L,{prefix:"plot",get allCases(){return r.allCases},get selectedCases(){return e(a).selectedCases},onCasesChange:i,columnLabel:"Variables",get columns(){return e(a).columns},get selectedColumns(){return e(a).selectedColumns},onColumnsChange:c,get startFrom(){return e(a).startFrom},onStartFromChange:u,xMinLabel:"Iter min",get xMin(){return e(a).iterMin},onXMinChange:w,get extraSlot(){return $}});var j=M(L,2),z=k(j);{let V=O(()=>e(a).selectedCases.length===0?"Please select at least one case.":e(a).selectedColumns.length===0?"Please select at least one variable.":"No data to display.");Yt(z,{id:"plot-holder",get svgHtml(){return e(a).svgHtml},get emptyMessage(){return e(V)}})}h(j),d(m,F)},x=m=>{var $=Uc(),F=k($);Yt(F,{id:"plot-holder",svgHtml:"",emptyMessage:"No data available. Please run a simulation first."}),h($),d(m,$)};X(_,m=>{e(a).columns.length>0?m(P):m(x,-1)})}var S=M(_,2);{var R=m=>{var $=Vc(),F=k($,!0);h($),Q(()=>re(F,e(n))),d(m,$)};X(S,m=>{e(n)&&m(R)})}d(A,f)},$$slots:{actions:!0,default:!0}}),Te()}function Va(t){const{scope:r,getState:a,setState:n,setHasData:o,getAxis:s}=t;async function i(){const y=a();if(y.selectedCases.length)try{let N=await Zr(y.selectedCases,r);if(t.filterFiles&&(N=t.filterFiles(N)),n({files:N}),o(N.length>0),N.length===0){n({file:"",columns:[],selectedColumns:[],positionText:"",svgHtml:""});return}(!y.file||!N.includes(y.file))&&(n({file:N[0]}),await c())}catch(N){console.error(`Failed to load ${r} files:`,N)}}async function c(){const y=a();if(!(!y.selectedCases.length||!y.file))try{const N=await zs(y.selectedCases,[y.file]),A=t.filterColumns?t.filterColumns(N):N;t.onColumnsLoaded?t.onColumnsLoaded(N):n({columns:A});const b=a();if(b.columns.length===0){n({selectedColumns:[],positionText:"",svgHtml:""});return}b.selectedColumns.length===0&&n({selectedColumns:[b.columns[0]]})}catch(N){console.error(`Failed to load ${r} columns:`,N)}}async function u(){let y=a();if(y.selectedCases.length){if(await i(),y=a(),!y.file){n({positionText:"",svgHtml:""});return}if((y.columns.length===0||y.selectedColumns.length===0)&&(await c(),y=a(),!y.selectedColumns.length)){n({positionText:"",svgHtml:""});return}try{let N;const A=a();if(A.startFrom==="restart"){const f=await Sa(A.selectedCases),_=s().toLowerCase(),P=_==="t"||_==="time"?"time":"iteration",x=Object.values(f.origins).map(S=>S[P]).filter(S=>S!==void 0&&Number.isFinite(S));N=x.length>0?Math.min(...x):void 0}else A.startFrom==="custom"&&(N=A.xMin);const b=await Hs({cases:A.selectedCases,probes:[A.file],columns:A.selectedColumns,axis:s(),timeMin:typeof N=="number"?N:void 0,xMin:N,includeHistory:!0});b&&n({svgHtml:b})}catch(N){console.error(`Failed to load ${r} plot:`,N)}}}async function w(y){if(n({selectedCases:y}),y.length===0){n({svgHtml:""});return}await i(),r==="probes"&&await u()}function p(y){if(n({selectedColumns:y}),y.length===0){n({svgHtml:""});return}u()}async function T(y){n({file:y}),await c(),await u()}return{loadFiles:i,loadColumns:c,loadPlot:u,handleCasesChange:w,handleColumnsChange:p,handleFileChange:T}}function Ba(){return{selectedCases:[],file:"",files:[],columns:[],selectedColumns:[],axis:"time",startFrom:"zero",xMin:0,positionText:"",svgHtml:"",autoRefresh:!0}}let Vt=D("time"),ln=D(se(Ba())),cn=D(se({...Ba(),axis:""})),Kc=D(!0),Tr=D(!1),Ar=D(!1);function Gc(){return e(Vt)}function Wc(t){v(Vt,t,!0)}function Xc(){return e(Tr)}function un(t){v(Tr,t,!0)}function Yc(){return e(Ar)}function dn(t){v(Ar,t,!0)}function Qc(){e(Vt)==="time"&&!e(Tr)&&e(Ar)?v(Vt,"profile"):e(Vt)==="profile"&&!e(Ar)&&e(Tr)&&v(Vt,"time")}function na(){return e(ln)}function Yr(){return e(cn)}function wt(t){v(ln,{...e(ln),...t},!0)}function At(t){v(cn,{...e(cn),...t},!0)}function Jc(){return e(Kc)}var Zc=E(" Download as PNG",1),eu=E('
            '),tu=E("
            "),ru=E('
            '),nu=E('
            ',1),au=E('
            ');function ou(t,r){Me(r,!0);let a=he(r,"onRefresh",15),n=O(na);const o=new Set(["time","t","iteration","iter"]),s=Va({scope:"probes",getState:na,setState:wt,setHasData:un,filterFiles:b=>b.filter(f=>{const _=f.replace(/\.csv$/i,"").toLowerCase();return _!=="coords"&&!_.includes("coordinates")}),filterColumns:b=>b.filter(f=>!o.has(f.toLowerCase())),onColumnsLoaded:b=>{const f=b.filter(_=>!o.has(_.toLowerCase()));wt({columns:f}),i()},getAxis:()=>"time"});async function i(){if(!(!e(n).selectedCases.length||!e(n).file||!e(n).selectedColumns.length))try{const b=[];for(const R of e(n).selectedColumns){const m=await Os(e(n).selectedCases[0],e(n).file,[R]);m.found&&b.push({col:R,x:m.x,y:m.y,z:m.z})}if(!b.length){wt({positionText:""});return}const f=R=>{let m=0;for(const $ of R){if($===void 0)continue;const F=String($),L=F.indexOf(".");L>=0&&(m=Math.max(m,F.length-L-1))}return m},_=f(b.map(R=>R.x)),P=f(b.map(R=>R.y)),x=f(b.map(R=>R.z)),S=b.map(R=>{const m=[];return R.x!==void 0&&m.push(`x=${R.x.toFixed(_)}`),R.y!==void 0&&m.push(`y=${R.y.toFixed(P)}`),R.z!==void 0&&m.push(`z=${R.z.toFixed(x)}`),`Probe position [${R.col}] : ${m.join(" · ")}`});wt({positionText:S.join(` +`)})}catch{wt({positionText:""})}}function c(b){s.handleColumnsChange(b),b.length>0&&i()}let u=O(()=>e(n).files.map(b=>({value:b,label:b.replace(/\.csv$/i,"").replace(/^probes?_/i,"")}))),w=!1;Ee(()=>{r.allCases.length>0&&!w&&(w=!0,wt({selectedCases:[...r.allCases]}),s.loadFiles().then(()=>s.loadPlot()))}),Ee(()=>{a(s.loadPlot)});let p=O(()=>e(n).selectedCases.length===0?"Please select at least one case.":e(n).selectedColumns.length===0?"Please select at least one probe.":"No data to display.");var T=Se(),y=B(T);{var N=b=>{const f=F=>{Ne(F,{text:"Quantity",children:(L,j)=>{it(L,{class:"w-[160px]",get options(){return e(u)},get value(){return e(n).file},get onchange(){return s.handleFileChange}})}})},_=F=>{var L=eu(),j=k(L);{let z=O(()=>!e(n).svgHtml);Re(j,{variant:"secondary",size:"sm",onclick:()=>En("probe-plot-holder",xr("probe",e(n).selectedCases)),get disabled(){return e(z)},children:(V,I)=>{var G=Zc(),U=B(G);Fe(U,{get icon(){return mr}}),Ce(),d(V,G)},$$slots:{default:!0}})}h(L),d(F,L)};var P=nu(),x=B(P);Rn(x,{prefix:"probe",get allCases(){return r.allCases},get selectedCases(){return e(n).selectedCases},get onCasesChange(){return s.handleCasesChange},get middleSlot(){return f},columnLabel:"Probes",get columns(){return e(n).columns},get selectedColumns(){return e(n).selectedColumns},onColumnsChange:c,get startFrom(){return e(n).startFrom},onStartFromChange:F=>{wt({startFrom:F}),s.loadPlot()},xMinLabel:"Time min",get xMin(){return e(n).xMin},onXMinChange:F=>{wt({xMin:F}),s.loadPlot()},get extraSlot(){return _}});var S=M(x,2);{var R=F=>{var L=ru();Ue(L,21,()=>e(n).positionText.split(` +`).sort(),gn,(j,z)=>{var V=tu(),I=k(V,!0);h(V),Q(()=>re(I,e(z))),d(j,V)}),h(L),d(F,L)};X(S,F=>{e(n).positionText&&F(R)})}var m=M(S,2),$=k(m);Yt($,{id:"probe-plot-holder",get svgHtml(){return e(n).svgHtml},get emptyMessage(){return e(p)}}),h(m),d(b,P)},A=b=>{var f=au(),_=k(f);Yt(_,{id:"probe-plot-holder",svgHtml:"",emptyMessage:"No probe data available. Please run a simulation first."}),h(f),d(b,f)};X(y,b=>{e(n).files.length>0?b(N):b(A,-1)})}d(t,T),Te()}var su=E(" ",1),iu=E(" Download as PNG",1),lu=E('
            '),cu=E('
            ',1),uu=E('
            ');function du(t,r){Me(r,!0);let a=he(r,"onRefresh",15),n=O(Yr);const o=["s","x","abscissa","distance","arclength","arc_length","curvilinear","length","r","y","z","coord","position"];function s(f){const _=f.map(P=>P.toLowerCase());for(const P of o){const x=_.indexOf(P);if(x>=0)return f[x]}return f[0]??""}const i=Va({scope:"profiles",getState:Yr,setState:At,setHasData:dn,onColumnsLoaded:f=>{const _=e(n).axis||s(f),P=f.filter(x=>x!==_).toSorted((x,S)=>x.localeCompare(S));At({columns:P,axis:_,selectedColumns:e(n).selectedColumns.length?e(n).selectedColumns:P.length?[P[0]]:[]})},getAxis:()=>Yr().axis});function c(f){const _=e(n).axis;At({axis:f});const x=[...e(n).columns,..._?[_]:[]].filter(S=>S!==f).toSorted((S,R)=>S.localeCompare(R));At({columns:x}),i.loadPlot()}let u=O(()=>e(n).files.map(f=>({value:f,label:f.replace(/^.*\//,"").replace(/\.csv$/i,"").replace(/_/g," ")}))),w=O(()=>[...e(n).axis?[e(n).axis]:[],...e(n).columns].toSorted((f,_)=>f.localeCompare(_)).map(f=>({value:f,label:f}))),p=!1;Ee(()=>{r.allCases.length>0&&!p&&(p=!0,At({selectedCases:[...r.allCases]}),i.loadFiles().then(()=>i.loadPlot()))}),Ee(()=>{a(i.loadPlot)});let T=O(()=>e(n).selectedCases.length===0?"Please select at least one case.":e(n).selectedColumns.length===0?"Please select at least one value.":"No data to display.");var y=Se(),N=B(y);{var A=f=>{const _=$=>{var F=su(),L=B(F);Ne(L,{text:"Profile",children:(z,V)=>{it(z,{class:"w-[160px]",get options(){return e(u)},get value(){return e(n).file},get onchange(){return i.handleFileChange}})}});var j=M(L,2);Ne(j,{text:"X axis",children:(z,V)=>{it(z,{class:"w-[140px]",get options(){return e(w)},get value(){return e(n).axis},onchange:c})}}),d($,F)},P=$=>{var F=lu(),L=k(F);{let j=O(()=>!e(n).svgHtml);Re(L,{variant:"secondary",size:"sm",onclick:()=>En("profile-plot-holder",xr("profile",e(n).selectedCases)),get disabled(){return e(j)},children:(z,V)=>{var I=iu(),G=B(I);Fe(G,{get icon(){return mr}}),Ce(),d(z,I)},$$slots:{default:!0}})}h(F),d($,F)};var x=cu(),S=B(x);Rn(S,{prefix:"profile",get allCases(){return r.allCases},get selectedCases(){return e(n).selectedCases},get onCasesChange(){return i.handleCasesChange},get middleSlot(){return _},columnLabel:"Values",get columns(){return e(n).columns},get selectedColumns(){return e(n).selectedColumns},get onColumnsChange(){return i.handleColumnsChange},get startFrom(){return e(n).startFrom},onStartFromChange:$=>{At({startFrom:$}),i.loadPlot()},xMinLabel:"X min",get xMin(){return e(n).xMin},onXMinChange:$=>{At({xMin:$}),i.loadPlot()},get extraSlot(){return P}});var R=M(S,2),m=k(R);Yt(m,{id:"profile-plot-holder",get svgHtml(){return e(n).svgHtml},get emptyMessage(){return e(T)}}),h(R),d(f,x)},b=f=>{var _=uu(),P=k(_);Yt(P,{id:"profile-plot-holder",svgHtml:"",emptyMessage:"No profile data available. Please run a simulation first."}),h(_),d(f,_)};X(N,f=>{e(n).files.length>0?f(A):f(b,-1)})}d(t,y),Te()}var fu=E('
            Diagnostics
            '),vu=E(" Refresh",1),gu=E(" ",1);function hu(t,r){Me(r,!0);let a=O(Gc),n=O(Jc),o=O(Xc),s=O(Yc),i=D(se(Zt("probe")));Ee(()=>{er("probe",e(i))});let c=D(void 0);function u(){var A;(A=e(c))==null||A()}async function w(){if(r.allCases.length){try{const b=(await Zr(r.allCases,"probes")).filter(f=>{const _=f.replace(/\.csv$/i,"").toLowerCase();return _!=="coords"&&!_.includes("coordinates")});un(b.length>0)}catch{un(!1)}try{const A=await Zr(r.allCases,"profiles");dn(A.length>0)}catch{dn(!1)}}}Ee(()=>{r.allCases.length>0&&w()}),_r(()=>{w(),u()}),Ee(()=>{e(o),e(s),Qc()});function p(A){A==="time"&&!e(o)||A==="profile"&&!e(s)||Wc(A)}var T=Se(),y=B(T);{var N=A=>{{const b=_=>{var P=fu(),x=M(k(P),2),S=k(x),R=M(S,2);h(x),h(P),Q(()=>{ke(S,1,`bg-transparent border-none p-0 m-0 text-lg font-bold tracking-tight transition-colors duration-150 ${e(o)?e(a)==="time"?"text-edf-bleu-fonce cursor-pointer":"text-edf-gris-moyen cursor-pointer hover:text-muted":"text-edf-gris-moyen cursor-not-allowed opacity-50"}`),S.disabled=!e(o),ye(S,"title",e(o)?"":"No probe data available. Run a simulation first."),ke(R,1,`bg-transparent border-none p-0 m-0 text-lg font-bold tracking-tight transition-colors duration-150 - ${e(s)?e(a)==="profile"?"text-edf-bleu-fonce cursor-pointer":"text-edf-gris-moyen cursor-pointer hover:text-muted":"text-edf-gris-moyen cursor-not-allowed opacity-50"}`),R.disabled=!e(s),ye(R,"title",e(s)?"":"No profile data available. Run a simulation first.")}),le("click",S,()=>p("time")),le("click",R,()=>p("profile")),d(_,P)};Ht(A,{wide:!0,titleSlot:b,tabs:b,actions:_=>{var P=gu(),x=B(P);{let m=O(()=>e(a)==="time"?"probePlot":"profilePlot"),$=O(ri);tr(x,{get name(){return e(m)},get intervalMs(){return e($)},onRefresh:u,get checked(){return e(l)},set checked(F){v(l,F,!0)}})}var S=M(x,2);{var R=m=>{Re(m,{variant:"primary",onclick:u,children:($,F)=>{var L=vu(),H=B(L);Fe(H,{get icon(){return Jt}}),Ce(),d($,L)},$$slots:{default:!0}})};X(S,m=>{e(l)||m(R)})}d(_,P)},children:(_,P)=>{var x=Se(),S=B(x);{var R=$=>{ou($,{get allCases(){return r.allCases},get onRefresh(){return e(c)},set onRefresh(F){v(c,F,!0)}})},m=$=>{du($,{get allCases(){return r.allCases},get onRefresh(){return e(c)},set onRefresh(F){v(c,F,!0)}})};X(S,$=>{e(a)==="time"?$(R):$(m,-1)})}d(_,x)},$$slots:{tabs:!0,actions:!0,default:!0}})}};X(w,A=>{e(n)&&A(N)})}d(t,T),Te()}qe(["click"]);var mu=E(" Refresh",1),pu=E(" ",1),_u=E(" Download as CSV",1),bu=E('
            ',1),xu=E(" "),yu=E(' '),wu=E(' '),ku=E('
            Case
            '),Cu=E('

            '),Su=E(" ",1);function Pu(t,r){Me(r,!0);let a=D(se([])),n=D(se([])),o=D(!1),s=D(!1),l=D(se(Zt("perf")));Ee(()=>{er("perf",e(l))});const c=5e3;let u=D(se([])),y=O(()=>r.allCases.map(_=>({value:_,label:_}))),p=O(()=>e(u).length>0&&e(n).length>0);async function T(){if(e(a).length){v(s,!0);try{const _=await jn(e(a));v(u,_.columns,!0),v(n,_.records,!0),e(p)&&v(o,!0)}catch(_){console.error("Failed to load perf:",_)}v(s,!1)}}function w(_){if(v(a,_,!0),_.length===0){v(n,[],!0);return}T()}function N(_,P){if(P==null||P==="")return"-";if(_==="text")return String(P);const x=Number(P);return Number.isFinite(x)?_==="int"?String(Math.round(x)):x.toFixed(3):String(P)}async function A(){if(!e(n).length)return;const _=["case_id",...e(u).map(R=>R.key)],P=e(n).map(R=>[R.case_id,...e(u).map(m=>R[m.key]??"")].join(",")),x=[_.join(","),...P].join(` -`),S=xr("timing_snapshot",e(a),"csv");await La(x,S)}let b=!1;Ee(()=>{r.allCases.length>0&&!b&&(b=!0,v(a,[...r.allCases],!0),jn(r.allCases).then(_=>{v(u,_.columns,!0),v(n,_.records,!0),v(o,e(p),!0)}).catch(()=>{}))}),Ee(()=>{e(l)?pr("perf",T,c):vt("perf")});const f=_r(()=>{b&&T()});vr(()=>{vt("perf"),f()}),Ht(t,{eyebrow:"Performance",title:"Timing Snapshot",wide:!0,actions:P=>{var x=pu(),S=B(x);tr(S,{name:"perf",intervalMs:c,onRefresh:T,get checked(){return e(l)},set checked($){v(l,$,!0)}});var R=M(S,2);{var m=$=>{Re($,{variant:"primary",onclick:T,children:(F,L)=>{var H=mu(),z=B(H);Fe(z,{get icon(){return Jt}}),Ce(),d(F,H)},$$slots:{default:!0}})};X(R,$=>{e(l)||$(m)})}d(P,x)},children:(P,x)=>{var S=Su(),R=B(S);{var m=H=>{Xt(H,{children:(z,V)=>{var I=bu(),G=B(I);Ne(G,{text:"Cases",children:(g,i)=>{Kt(g,{class:"w-[160px]",get options(){return e(y)},get selected(){return e(a)},onchange:w,placeholder:"Select cases..."})}});var j=M(G,2),q=C(j);{let g=O(()=>!e(p));Re(q,{variant:"secondary",size:"sm",onclick:A,get disabled(){return e(g)},children:(i,k)=>{var U=_u(),W=B(U);Fe(W,{get icon(){return mr}}),Ce(),d(i,U)},$$slots:{default:!0}})}h(j),d(z,I)}})};X(R,H=>{e(o)&&H(m)})}var $=M(R,2);{var F=H=>{var z=ku(),V=C(z),I=C(V),G=C(I),j=M(C(G));Ue(j,17,()=>e(u),g=>g.key,(g,i)=>{var k=xu(),U=C(k,!0);h(k),Q(()=>re(U,e(i).label)),d(g,k)}),h(G),h(I);var q=M(I);Ue(q,21,()=>e(n),g=>g.case_id,(g,i)=>{var k=wu(),U=C(k),W=C(U,!0);h(U);var ee=M(U);Ue(ee,17,()=>e(u),ne=>ne.key,(ne,pe)=>{var K=yu(),Y=C(K,!0);h(K),Q(ce=>re(Y,ce),[()=>N(e(pe).kind,e(i)[e(pe).key])]),d(ne,K)}),h(k),Q(()=>re(W,e(i).case_id)),d(g,k)}),h(q),h(V),h(z),d(H,z)},L=H=>{var z=Cu(),V=C(z);{var I=j=>{var q=Oe("Select cases above to view timing information.");d(j,q)},G=j=>{var q=Oe("No performance data available. Please run a simulation first.");d(j,q)};X(V,j=>{e(o)?j(I):j(G,-1)})}h(z),d(H,z)};X($,H=>{e(p)?H(F):H(L,-1)})}d(P,S)},$$slots:{actions:!0,default:!0}}),Te()}const $u={"&":"&","<":"<",">":">",'"':""","'":"'"};function Ba(t){return t.replace(/[&<>"']/g,r=>$u[r]??r)}var Ru=E("
            "),Eu=E('
            ');function Nu(t,r){Me(r,!0);let a=D(void 0);function n(y){const p=Ba(y);if(!r.searchQuery.trim())return p;try{const T=new RegExp(`(${r.searchQuery})`,"gi");return p.replace(T,'$1')}catch{return p}}function o(y){return y==="error"?"tail-sev-error":y==="warn"?"tail-sev-warn":y==="info"?"tail-sev-info":""}function s(){return e(a)?e(a).scrollHeight-e(a).scrollTop-e(a).clientHeight<=24:!0}let l=D(!0);function c(){v(l,s(),!0)}Ee(()=>{r.autoScroll&&r.lines.length>0&&e(a)&&e(l)&&Pt().then(()=>{e(a)&&(e(a).scrollTop=e(a).scrollHeight)})});var u=Eu();Ue(u,21,()=>r.lines,y=>y.index,(y,p)=>{var T=Ru();Fr(T,()=>n(e(p).text),!0),h(T),Q(w=>ke(T,1,`tail-line ${w??""} ${e(p).isNew?"tail-new":""}`),[()=>o(e(p).severity)]),d(y,T)}),h(u),rt(u,y=>v(a,y),()=>e(a)),et("scroll",u,c),d(t,u),Te()}var Mu=E(" Refresh",1),Tu=E(" ",1),Au=E(''),Lu=E(''),Fu=E("   ",1),Du=E(" ",1),Iu=Ot(''),zu=Ot(''),Ou=Ot(''),Hu=E(" Resume",1),ju=E(" Pause",1),Uu=E('Case not running'),Vu=E(' 
            ',1),Bu=E('

            '),qu=E('

            '),Ku=E(" ",1);function Gu(t,r){Me(r,!0);const a=80;let n=D(""),o=D(""),s=D(!1),l=D(se([])),c=D(a),u=D(se([])),y=D(se(new Set)),p=D(!1),T=D(se(Zt("tail")));Ee(()=>{er("tail",e(T))});let w=D(!0),N=D("all"),A=D(""),b=D(""),f=D(void 0),_=O(()=>yn(r.allCases)),P=O(()=>e(l).map(j=>{const q=j.split("/").pop()??j;return{value:j,label:q}})),x=[{value:"all",label:"All"},{value:"error",label:"Error"},{value:"warn",label:"Warn"},{value:"info",label:"Info"}],S=O(()=>e(l).length>0),R=O(()=>zr().some(j=>{var q;return j.case_id===e(n)&&((q=j.status)==null?void 0:q.toUpperCase())==="RUNNING"}));async function m(){if(e(n)){try{v(l,await Fs(e(n)),!0)}catch(j){console.error("Failed to load tail files:",j),v(l,[],!0);return}(!e(s)||!e(l).includes(e(o)))&&(v(o,e(l)[0]??"",!0),v(s,!1)),e(o)||v(u,[],!0)}}async function $(j=!1){if(e(n)&&!(e(p)&&!j)&&(await m(),!!e(o)))try{const q=(await Ds(e(n),e(o),e(c))).lines;if(v(b,""),e(u).length>0){const g=F(e(u),q),i=new Set;for(let k=g;k{let j=e(u).map((q,g)=>({...q,index:g,isNew:e(y).has(g)}));if(e(N)!=="all"&&(j=j.filter(q=>q.severity===e(N))),e(A).trim())try{const q=new RegExp(e(A),"i");j=j.filter(g=>q.test(g.text))}catch{}return j});function H(j){v(n,j,!0),v(o,""),v(s,!1),v(u,[],!0),m().then(()=>$(!0))}function z(j){v(o,j,!0),v(s,!0),v(u,[],!0),$(!0)}function V(){v(p,!e(p)),e(p)||$(!0)}function I(j){(j.ctrlKey||j.metaKey)&&j.key==="f"&&e(f)&&(j.preventDefault(),e(f).focus())}Ee(()=>{r.allCases.length>0&&!e(n)&&(v(n,r.allCases[0],!0),m().then(()=>$(!0)))}),Ee(()=>{e(T)&&!e(p)&&e(n)?pr("tail",()=>$(!1),qn()):vt("tail")});const G=_r(()=>{e(n)&&m().then(()=>$(!0))});vr(()=>{vt("tail"),G()}),et("keydown",st,I),Ht(t,{eyebrow:"Live",title:"Log Tail",wide:!0,actions:q=>{var g=Tu(),i=B(g);{let W=O(qn);tr(i,{name:"tail",get intervalMs(){return e(W)},onRefresh:()=>$(!1),get checked(){return e(T)},set checked(ee){v(T,ee,!0)}})}var k=M(i,2);{var U=W=>{Re(W,{variant:"primary",onclick:()=>$(!0),children:(ee,ne)=>{var pe=Mu(),K=B(pe);Fe(K,{get icon(){return Jt}}),Ce(),d(ee,pe)},$$slots:{default:!0}})};X(k,W=>{e(T)||W(U)})}d(q,g)},children:(q,g)=>{var i=Ku(),k=B(i);Xt(k,{children:(K,Y)=>{var ce=Du(),ie=B(ce);Ne(ie,{text:"Case",children:(Z,_e)=>{lt(Z,{class:"w-[130px]",get options(){return e(_)},get value(){return e(n)},onchange:H})}});var we=M(ie,2);{var ge=Z=>{var _e=Fu(),Pe=B(_e);Ne(Pe,{text:"File",children:(be,He)=>{lt(be,{class:"w-[150px]",get options(){return e(P)},get value(){return e(o)},onchange:z})}});var $e=M(Pe,2);Ne($e,{text:"Lines",children:(be,He)=>{var Ie=Au();Ke(Ie),le("change",Ie,()=>$(!0)),Ze(Ie,()=>e(c),oe=>v(c,oe)),d(be,Ie)}});var ve=M($e,2);Ne(ve,{text:"Filter",children:(be,He)=>{var Ie=Lu();Ke(Ie),rt(Ie,oe=>v(f,oe),()=>e(f)),Ze(Ie,()=>e(A),oe=>v(A,oe)),d(be,Ie)}});var De=M(ve,2);Ne(De,{text:"Severity",children:(be,He)=>{lt(be,{class:"w-[90px]",get options(){return x},get value(){return e(N)},onchange:Ie=>v(N,Ie,!0)})}}),d(Z,_e)};X(we,Z=>{e(S)&&Z(ge)})}d(K,ce)}});var U=M(k,2);{var W=K=>{var Y=Vu(),ce=B(Y);Nu(ce,{get lines(){return e(L)},get searchQuery(){return e(A)},get autoScroll(){return e(w)}});var ie=M(ce,2),we=C(ie),ge=C(we);{var Z=oe=>{var ue=Iu();d(oe,ue)},_e=oe=>{var ue=zu();d(oe,ue)},Pe=oe=>{var ue=Ou();d(oe,ue)};X(ge,oe=>{e(p)?oe(Z):e(R)?oe(_e,1):oe(Pe,-1)})}var $e=M(ge);h(we);var ve=M(we,2);{var De=oe=>{Re(oe,{variant:"secondary",size:"sm",onclick:V,children:(ue,je)=>{var te=Se(),J=B(te);{var ae=xe=>{var Ae=Hu(),me=B(Ae);Fe(me,{get icon(){return Ra}}),Ce(),d(xe,Ae)},de=xe=>{var Ae=ju(),me=B(Ae);Fe(me,{get icon(){return _l}}),Ce(),d(xe,Ae)};X(J,xe=>{e(p)?xe(ae):xe(de,-1)})}d(ue,te)},$$slots:{default:!0}})},be=oe=>{var ue=Uu();d(oe,ue)};X(ve,oe=>{e(R)?oe(De):oe(be,-1)})}var He=M(ve,2),Ie=C(He);zt(Ie,{get checked(){return e(w)},onchange:oe=>v(w,oe,!0),size:14,label:"Auto-scroll",labelFirst:!0}),h(He),h(ie),Q(()=>re($e,` ${e(L).length??""} / ${e(u).length??""}`)),d(K,Y)},ee=K=>{var Y=Bu(),ce=C(Y);{var ie=ge=>{var Z=Oe("No log file yet for this case.");d(ge,Z)},we=ge=>{var Z=Oe("No log data available. Please run a simulation first.");d(ge,Z)};X(ce,ge=>{e(n)&&!e(S)?ge(ie):ge(we,-1)})}h(Y),d(K,Y)};X(U,K=>{e(u).length>0?K(W):K(ee,-1)})}var ne=M(U,2);{var pe=K=>{var Y=qu(),ce=C(Y,!0);h(Y),Q(()=>re(ce,e(b))),d(K,Y)};X(ne,K=>{e(b)&&K(pe)})}d(q,i)},$$slots:{actions:!0,default:!0}}),Te()}qe(["change"]);function Wu(t,r=3){var N,A;const a=t.split(` -`),n=[];let o=0,s=0,l=!1;for(const b of a){if(b.startsWith("===")||b.startsWith("---")||b.startsWith("+++"))continue;const f=b.match(/^@@ -(\d+),?\d* \+(\d+),?\d* @@/);if(f){o=parseInt(f[1],10)-1,s=parseInt(f[2],10)-1,l=!0;continue}if(l)if(b.startsWith("-"))o++,n.push({type:"del",leftNum:o,rightNum:null,leftContent:b.slice(1),rightContent:""});else if(b.startsWith("+"))s++,n.push({type:"add",leftNum:null,rightNum:s,leftContent:"",rightContent:b.slice(1)});else{o++,s++;const _=b.startsWith(" ")?b.slice(1):b;n.push({type:"equal",leftNum:o,rightNum:s,leftContent:_,rightContent:_})}}const c=[];let u=0;for(;u=0&&b-T>1&&p.push({kind:"separator",skipped:b-T-1});const f=c[b].type!=="equal",_=f&&!w;p.push({kind:"line",row:c[b],hunkStart:_}),w=f,T=b}if(T=0&&p.push({kind:"separator",skipped:c.length-1-T}),p.length>0&&p[0].kind==="line"){const b=((N=p[0].row)==null?void 0:N.leftNum)??0,f=((A=p[0].row)==null?void 0:A.rightNum)??0,_=Math.max(b,f)-1;_>0&&p.unshift({kind:"separator",skipped:_})}return p}var Xu=E('
            '),Yu=E('
            '),Qu=E(' ',1),Ju=E('No matches'),Zu=E('
            '),ed=E('

            Files are identical.

            '),td=E('
            Loading...
            '),rd=E('
            ');function nd(t,r){Me(r,!0);let a=he(r,"loading",3,!1),n=D(void 0),o=O(()=>Wu(r.diffText)),s=O(()=>{const te=[];return e(o).forEach((J,ae)=>{J.hunkStart&&te.push(ae)}),te}),l=O(()=>e(s).length>0),c=O(()=>{var J;const te=new Array(e(o).length).fill(-1);for(let ae=0;ae{r.diffText!==y&&(y=r.diffText,v(u,-1))});let p=O(()=>{if(!r.search.trim())return[];try{const te=new RegExp(r.search,"i"),J=[];return e(o).forEach((ae,de)=>{ae.kind==="line"&&ae.row&&(te.test(ae.row.leftContent)||te.test(ae.row.rightContent))&&J.push(de)}),J}catch{return[]}}),T=D(-1),w="";Ee(()=>{r.search!==w&&(w=r.search,v(T,e(p).length>0?0:-1,!0))});async function N(te){var de;v(T,te,!0),await Pt();const J=e(p)[te],ae=(de=e(x))==null?void 0:de.querySelector(`[data-item-idx="${J}"]`);if(ae&&e(x)&&e(S)){const xe=e(x).getBoundingClientRect(),me=ae.getBoundingClientRect().top-xe.top+e(x).scrollTop-e(x).clientHeight/3;m=!0,e(x).scrollTop=me,e(S).scrollTop=me,requestAnimationFrame(()=>{m=!1})}}function A(){e(T)>0&&N(e(T)-1)}function b(){e(T)<0&&e(p).length>0?N(0):e(T)$1`)}catch{return ae}}function _(te,J){return te==="equal"?"":te==="del"&&J==="left"?"bg-[rgba(214,67,10,0.08)] text-edf-orange-fonce":te==="del"&&J==="right"?"bg-[rgba(48,122,16,0.08)] text-edf-vert-fonce":te==="add"&&J==="left"?"bg-edf-gris-clair":te==="add"&&J==="right"?"bg-[rgba(48,122,16,0.08)] text-edf-vert-fonce":""}function P(te,J){return te==="del"&&J==="left"?"rgb(251,237,233)":te==="del"&&J==="right"?"rgb(238,247,236)":te==="add"&&J==="left"?"var(--color-edf-gris-clair)":te==="add"&&J==="right"?"rgb(238,247,236)":"white"}let x=D(void 0),S=D(void 0),R=!1,m=!1;function $(te){R||m||!e(x)||!e(S)||(R=!0,te==="left"?(e(S).scrollTop=e(x).scrollTop,e(S).scrollLeft=e(x).scrollLeft):(e(x).scrollTop=e(S).scrollTop,e(x).scrollLeft=e(S).scrollLeft),requestAnimationFrame(()=>{R=!1}))}async function F(te){var ae;v(u,te,!0),await Pt();const J=(ae=e(x))==null?void 0:ae.querySelector(`[data-hunk-start="${te}"]`);if(J&&e(x)&&e(S)){m=!0;const de=e(x).getBoundingClientRect(),Ae=J.getBoundingClientRect().top-de.top+e(x).scrollTop-e(x).clientHeight/3;e(x).scrollTop=Ae,e(S).scrollTop=Ae,requestAnimationFrame(()=>{m=!1})}}function L(){e(u)>0&&F(e(u)-1)}function H(){e(u)<0?F(0):e(u)=0&&v(u,J,!0)}function V(te){te.target instanceof HTMLInputElement||(te.key==="n"&&!te.shiftKey?(te.preventDefault(),H()):te.key==="N"||te.key==="n"&&te.shiftKey?(te.preventDefault(),L()):te.key==="j"?(te.preventDefault(),b()):(te.key==="J"||te.key==="j"&&te.shiftKey)&&(te.preventDefault(),A()))}var I=rd();{const te=(J,ae=Eo)=>{var de=Se(),xe=B(de);Ue(xe,17,()=>e(o),gn,(Ae,me,fe)=>{const Ve=O(()=>e(s).indexOf(fe)),ze=O(()=>e(c)[fe]>=0&&e(c)[fe]===e(u)),nt=O(()=>{var ct,Be;return ae()==="left"?(ct=e(me).row)==null?void 0:ct.leftNum:(Be=e(me).row)==null?void 0:Be.rightNum}),rr=O(()=>{var ct,Be;return ae()==="left"?((ct=e(me).row)==null?void 0:ct.leftContent)??"":((Be=e(me).row)==null?void 0:Be.rightContent)??""});var yr=Se(),Je=B(yr);{var ut=ct=>{var Be=Xu(),Nt=M(C(Be),2),Hr=C(Nt);h(Nt),h(Be),Q(()=>re(Hr,`... ${e(me).skipped??""} lines hidden ...`)),d(ct,Be)},Or=ct=>{var Be=Yu(),Nt=C(Be),Hr=C(Nt,!0);h(Nt);var Nn=M(Nt,2);Fr(Nn,()=>f(e(rr),e(T)>=0&&e(p)[e(T)]===fe),!0),h(Nn),h(Be),Q((xt,Mt,wr,qa,Ka)=>{ke(Be,1,`flex w-full ${xt??""} ${Mt??""}`),Xe(Be,e(ze)?"background-color: rgba(16,87,200,0.12); color: rgb(16,87,200);":""),ye(Be,"role",wr),ye(Be,"tabindex",qa),ye(Be,"data-hunk-start",ae()==="left"&&e(Ve)>=0?e(Ve):void 0),ye(Be,"data-item-idx",ae()==="left"?fe:void 0),Xe(Nt,`background: ${Ka??""}; color: ${e(ze)?"white":"var(--color-muted)"};`),re(Hr,e(nt)??"")},[()=>_(e(me).row.type,ae()),()=>e(me).row.type!=="equal"||e(p).includes(fe)?"cursor-pointer":"",()=>e(me).row.type!=="equal"||e(p).includes(fe)?"button":void 0,()=>e(me).row.type!=="equal"||e(p).includes(fe)?0:void 0,()=>e(ze)?"rgb(16,87,200)":P(e(me).row.type,ae())]),le("click",Be,()=>{var Mt;((Mt=e(me).row)==null?void 0:Mt.type)!=="equal"&&z(fe);const xt=e(p).indexOf(fe);xt>=0&&v(T,xt,!0)}),le("keydown",Be,xt=>{var Mt;if(xt.key==="Enter"||xt.key===" "){xt.preventDefault(),((Mt=e(me).row)==null?void 0:Mt.type)!=="equal"&&z(fe);const wr=e(p).indexOf(fe);wr>=0&&v(T,wr,!0)}}),d(ct,Be)};X(Je,ct=>{e(me).kind==="separator"?ct(ut):e(me).row&&ct(Or,1)})}d(Ae,yr)}),d(J,de)};var G=C(I),j=C(G),q=C(j),g=C(q,!0);h(q);var i=M(q,2),k=C(i,!0);h(i),h(j);var U=M(j,2),W=C(U),ee=C(W,!0);h(W);var ne=M(W,2),pe=C(ne,!0);h(ne),h(U),h(G);var K=M(G,2),Y=C(K),ce=C(Y);Ke(ce);var ie=M(ce,2);{var we=J=>{var ae=Qu(),de=B(ae);{let fe=O(()=>e(T)<=0);Re(de,{variant:"secondary",size:"sm",onclick:A,get disabled(){return e(fe)},children:(Ve,ze)=>{Ce();var nt=Oe("Prev");d(Ve,nt)},$$slots:{default:!0}})}var xe=M(de,2),Ae=C(xe);h(xe);var me=M(xe,2);{let fe=O(()=>e(T)>=e(p).length-1);Re(me,{variant:"secondary",size:"sm",onclick:b,get disabled(){return e(fe)},children:(Ve,ze)=>{Ce();var nt=Oe("Next");d(Ve,nt)},$$slots:{default:!0}})}Q(()=>re(Ae,`${e(T)>=0?e(T)+1:"–"} / ${e(p).length??""} occurrence${e(p).length!==1?"s":""}`)),d(J,ae)},ge=O(()=>r.search.trim()&&e(p).length>0),Z=J=>{var ae=Ju();d(J,ae)},_e=O(()=>r.search.trim());X(ie,J=>{e(ge)?J(we):e(_e)&&J(Z,1)})}h(Y);var Pe=M(Y,2),$e=C(Pe);{let J=O(()=>e(s).length===0||e(u)<=0);Re($e,{variant:"secondary",size:"sm",onclick:L,get disabled(){return e(J)},children:(ae,de)=>{Ce();var xe=Oe("Prev");d(ae,xe)},$$slots:{default:!0}})}var ve=M($e,2),De=C(ve);h(ve);var be=M(ve,2);{let J=O(()=>e(s).length===0||e(u)>=e(s).length-1);Re(be,{variant:"secondary",size:"sm",onclick:H,get disabled(){return e(J)},children:(ae,de)=>{Ce();var xe=Oe("Next");d(ae,xe)},$$slots:{default:!0}})}h(Pe),h(K);var He=M(K,2);{var Ie=J=>{var ae=Zu(),de=C(ae),xe=C(de),Ae=C(xe);te(Ae,()=>"left"),h(xe),h(de),rt(de,ze=>v(x,ze),()=>e(x));var me=M(de,2),fe=C(me),Ve=C(fe);te(Ve,()=>"right"),h(fe),h(me),rt(me,ze=>v(S,ze),()=>e(S)),h(ae),et("scroll",de,()=>$("left")),et("scroll",me,()=>$("right")),d(J,ae)},oe=J=>{var ae=ed();d(J,ae)};X(He,J=>{e(l)?J(Ie):J(oe,-1)})}var ue=M(He,2);{var je=J=>{var ae=td();d(J,ae)};X(ue,J=>{a()&&J(je)})}h(I),rt(I,J=>v(n,J),()=>e(n)),Q(()=>{re(g,r.leftLabel),re(k,r.kind),re(ee,r.rightLabel),re(pe,r.kind),hn(ce,r.search),re(De,`${e(u)>=0?e(u)+1:"–"} / ${e(s).length??""} diff${e(s).length!==1?"s":""}`)}),le("input",ce,J=>r.onSearchChange(J.target.value)),le("keydown",ce,J=>{J.key==="Enter"&&(J.preventDefault(),b())})}le("keydown",I,V),d(t,I),Te()}qe(["keydown","click","input"]);var ad=E(" ",1),od=E('

            Please select two different cases to compare.

            '),sd=E('

            Select two cases to compare.

            '),ld=E(' '),id=E('
            Parameter
            '),cd=E('

            All parameters are identical.

            '),ud=E('
            ',1),dd=E('

            '),fd=E('

            Loading...

            '),vd=E(" ",1),gd=E(" ",1);function hd(t,r){Me(r,!0);let a=D(""),n=D(""),o=D(""),s=D(""),l=D(""),c=D(!1),u=D(!1),y=D(""),p=O(()=>r.allCases.map(m=>({value:m,label:m})));const T=[{value:"doe_row.csv",label:"doe_row.csv"}];let w=O(()=>{var m;return((m=$t())==null?void 0:m.compare_kinds)??T});Ee(()=>{var m;e(w).some($=>$.value===e(o))||v(o,((m=e(w)[0])==null?void 0:m.value)??"",!0)});let N=D(!1),A=O(()=>e(a)&&e(n)&&e(a)!==e(n));function b(){const m=e(a);v(a,e(n),!0),v(n,m,!0)}async function f(){if(e(A)){v(c,!0),v(y,"");try{const m=await Hs({cases:[e(a),e(n)],base:e(a),kind:e(o)});v(l,m,!0),v(u,!0)}catch(m){console.error("Failed to load diff:",m),v(l,""),v(u,!1);const $=m instanceof Error?m.message:String(m);v(y,$.includes("404")?`File "${e(o)}" not found for one of the selected cases. It may not have been run yet.`:"Failed to load comparison.",!0)}v(c,!1)}}Ee(()=>{e(a)&&e(n)&&e(a)!==e(n)&&e(o)?f():e(a)&&e(n)&&e(a)===e(n)&&(v(l,""),v(u,!0))});let _=!1;Ee(()=>{r.allCases.length>=2&&!_?(_=!0,v(a,r.allCases[0],!0),v(n,r.allCases[1],!0)):r.allCases.length===1&&!_&&(_=!0,v(a,r.allCases[0],!0))});let P=O(Pn),x=O(()=>{if(!e(a)||!e(n)||e(a)===e(n)||e(P).length===0)return[];const m=zr(),$=m.find(L=>L.case_id===e(a)),F=m.find(L=>L.case_id===e(n));return!$&&!F?[]:e(P).map(L=>{var V,I;const H=((V=$==null?void 0:$.doe)==null?void 0:V[L])!=null&&String($.doe[L])!==""?String($.doe[L]):"—",z=((I=F==null?void 0:F.doe)==null?void 0:I[L])!=null&&String(F.doe[L])!==""?String(F.doe[L]):"—";return{param:L,left:H,right:z,differs:H!==z}})}),S=O(()=>e(N)?e(x):e(x).filter(m=>m.differs)),R=O(()=>e(x).filter(m=>m.differs).length);Ht(t,{eyebrow:"Compare",title:"Side-by-Side Comparison",wide:!0,children:(m,$)=>{var F=gd(),L=B(F);Xt(L,{children:(G,j)=>{var q=ad(),g=B(q);Ne(g,{text:"First case",children:(U,W)=>{lt(U,{class:"w-32.5",get options(){return e(p)},get value(){return e(a)},onchange:ee=>v(a,ee,!0),placeholder:"Select..."})}});var i=M(g,2);{let U=O(()=>!e(a)&&!e(n));Re(i,{variant:"secondary",size:"sm",onclick:b,get disabled(){return e(U)},children:(W,ee)=>{Fe(W,{get icon(){return fl}})},$$slots:{default:!0}})}var k=M(i,2);Ne(k,{text:"Second case",children:(U,W)=>{lt(U,{class:"w-32.5",get options(){return e(p)},get value(){return e(n)},onchange:ee=>v(n,ee,!0),placeholder:"Select..."})}}),d(G,q)}});var H=M(L,2);{var z=G=>{var j=od();d(G,j)},V=G=>{var j=sd();d(G,j)},I=G=>{var j=vd(),q=B(j);{var g=ne=>{var pe=ud(),K=B(pe),Y=C(K),ce=C(Y);h(Y);var ie=M(Y,2),we=C(ie,!0);h(ie),h(K);var ge=M(K,2);{var Z=Pe=>{var $e=id(),ve=C($e),De=C(ve),be=C(De),He=C(be),Ie=C(He,!0);h(He);var oe=M(He,2),ue=C(oe,!0);h(oe),h(be),h(De);var je=M(De);Ue(je,21,()=>e(S),te=>te.param,(te,J)=>{var ae=ld(),de=C(ae),xe=C(de,!0);h(de);var Ae=M(de),me=C(Ae,!0);h(Ae);var fe=M(Ae),Ve=C(fe,!0);h(fe),h(ae),Q(()=>{ke(de,1,dt(e(J).differs?"text-edf-orange-fonce bg-[rgba(214,67,10,0.04)]":"")),re(xe,e(J).left),re(me,e(J).param),ke(fe,1,dt(e(J).differs?"text-edf-vert-fonce bg-[rgba(48,122,16,0.04)]":"")),re(Ve,e(J).right)}),d(te,ae)}),h(je),h(ve),h($e),Q(()=>{re(Ie,e(a)),re(ue,e(n))}),d(Pe,$e)},_e=Pe=>{var $e=cd();d(Pe,$e)};X(ge,Pe=>{e(S).length>0?Pe(Z):Pe(_e,-1)})}Q(()=>{re(ce,`${e(R)??""} difference${e(R)!==1?"s":""} out of ${e(x).length??""} - parameters`),re(we,e(N)?"Show differences only":"Show all parameters")}),le("click",ie,()=>v(N,!e(N))),d(ne,pe)};X(q,ne=>{e(x).length>0&&ne(g)})}var i=M(q,2);Xt(i,{children:(ne,pe)=>{Ne(ne,{text:"File",children:(K,Y)=>{lt(K,{class:"w-37.5",get options(){return e(w)},get value(){return e(o)},onchange:ce=>v(o,ce,!0)})}})}});var k=M(i,2);{var U=ne=>{var pe=dd(),K=C(pe,!0);h(pe),Q(()=>re(K,e(y))),d(ne,pe)},W=ne=>{nd(ne,{get diffText(){return e(l)},get leftLabel(){return e(a)},get rightLabel(){return e(n)},get kind(){return e(o)},get search(){return e(s)},get loading(){return e(c)},onSearchChange:pe=>v(s,pe,!0)})},ee=ne=>{var pe=fd();d(ne,pe)};X(k,ne=>{e(y)?ne(U):e(u)?ne(W,1):e(c)&&ne(ee,2)})}d(G,j)};X(H,G=>{e(a)&&e(n)&&e(a)===e(n)?G(z):!e(a)||!e(n)?G(V,1):G(I,-1)})}d(m,F)},$$slots:{default:!0}}),Te()}qe(["click"]);var md=E(" Refresh",1),pd=E(" ",1),_d=E(''),bd=E(''),xd=E(" Download as CSV",1),yd=E('
            ',1),wd=E(" ",1),kd=E(""),Cd=E('
            Sort by:
            '),Sd=E('

            No errors found. Select cases and adjust filters above.

            '),Pd=E(' '),$d=E('NEW'),Rd=E('
            '),Ed=E('
            '),Nd=E(' '),Md=E('
            '),Td=E('

            '),Ad=E("
            ",1);function Ld(t,r){Me(r,!0);const a=6,n=["csauto.stderr","csauto.stdout"];let o=D(se([])),s=D(se([...n])),l=!1;Ee(()=>{var Y;const K=(Y=$t())==null?void 0:Y.error_files;K!=null&&K.length&&!l&&v(s,[...K],!0)});let c=D("all"),u=D(""),y=D(a),p=D(!1),T=D(""),w=D(se(Zt("errors")));Ee(()=>{er("errors",e(w))});let N=D(se([])),A=D(se(new Set));function b(K){return K.toLowerCase().replace(/[0-9]+/g,"#").replace(/0x[0-9a-f]+/gi,"#").replace(/\s+/g," ").trim()}function f(K){const Y=K.line_html.replace(/<[^>]*>/g,"").slice(0,120);return`${K.case_id}|${K.file}|${K.severity}|${b(Y)}`}function _(K){const Y=new Map;for(const ce of K){const ie=f(ce),we=Y.get(ie);we?we.count++:Y.set(ie,{...ce,count:1,fingerprint:ie,isNew:!e(A).has(ie)})}return Array.from(Y.values())}async function P(){if(!(!e(o).length||!e(s).length)){v(p,!0);try{const K=await Ls({cases:e(o),files:e(s),context:e(y),sev:e(c)==="all"?"":e(c),q:e(u)});v(T,"");const Y=_(K.items);v(N,K.items,!0);const ce=new Set(Y.map(ie=>ie.fingerprint));v(A,ce,!0),v(x,Y,!0)}catch(K){v(T,"Failed to load errors"),console.error("Failed to load errors:",K)}finally{v(p,!1)}}}let x=D(se([])),S=null;function R(){S&&clearTimeout(S),S=setTimeout(P,250)}function m(K){return K==="error"?"error-sev-error":K==="warn"?"error-sev-warn":"error-sev-info"}let $=O(()=>yn(r.allCases)),F=O(()=>{var K;return(((K=$t())==null?void 0:K.error_files)??n).map(Y=>({value:Y,label:Y}))}),L=[{value:"all",label:"All"},{value:"error",label:"Error"},{value:"warn",label:"Warn"},{value:"info",label:"Info"}];function H(K){if(v(o,K,!0),K.length===0){v(x,[],!0),v(N,[],!0);return}P()}function z(K){if(l=!0,v(s,K,!0),K.length===0){v(x,[],!0),v(N,[],!0);return}P()}function V(K){v(c,K,!0),P()}function I(){P()}let G=!1;Ee(()=>{r.allCases.length>0&&!G&&(G=!0,v(o,[...r.allCases],!0),P())}),Ee(()=>{e(w)?pr("errors",P,Gn()):vt("errors")});const j=_r(()=>{G&&P()});vr(()=>{vt("errors"),j()});let q=D(se(new Set));function g(K){const Y=new Set(e(q));Y.has(K)?Y.delete(K):Y.add(K),v(q,Y,!0)}let i=D("severity"),k=D("desc");const U={info:0,warn:1,error:2};let W=O(()=>{const K=[...e(x)];return K.sort((Y,ce)=>{let ie=0;return e(i)==="severity"?ie=(U[Y.severity]??9)-(U[ce.severity]??9):e(i)==="count"?ie=Y.count-ce.count:ie=Y[e(i)].localeCompare(ce[e(i)]),e(k)==="asc"?ie:-ie}),K});const ee={severity:"desc",count:"desc",case_id:"asc",file:"asc"};function ne(K){e(i)===K?v(k,e(k)==="asc"?"desc":"asc",!0):(v(i,K,!0),v(k,ee[K],!0))}function pe(){if(!e(x).length)return;const K=["case_id","file","severity","count","is_new","line_text"],Y=e(W).map(we=>[we.case_id,we.file,we.severity,we.count,we.isNew?"yes":"no",`"${we.line_html.replace(/<[^>]*>/g,"").replace(/"/g,'""')}"`].join(",")),ce=[K.join(","),...Y].join(` -`),ie=xr("errors",e(o),"csv");La(ce,ie)}Ht(t,{eyebrow:"Diagnostics",title:"Recent Errors",wide:!0,actions:Y=>{var ce=pd(),ie=B(ce);{let Z=O(Gn);tr(ie,{name:"errors",get intervalMs(){return e(Z)},onRefresh:P,get checked(){return e(w)},set checked(_e){v(w,_e,!0)}})}var we=M(ie,2);{var ge=Z=>{Re(Z,{variant:"primary",onclick:P,children:(_e,Pe)=>{var $e=md(),ve=B($e);Fe(ve,{get icon(){return Jt}}),Ce(),d(_e,$e)},$$slots:{default:!0}})};X(we,Z=>{e(w)||Z(ge)})}d(Y,ce)},children:(Y,ce)=>{var ie=Ad(),we=B(ie);Xt(we,{children:(oe,ue)=>{var je=yd(),te=B(je);Ne(te,{text:"Cases",children:(fe,Ve)=>{Kt(fe,{class:"w-[160px]",get options(){return e($)},get selected(){return e(o)},onchange:H,placeholder:"Select cases..."})}});var J=M(te,2);Ne(J,{text:"Files",children:(fe,Ve)=>{Kt(fe,{class:"w-[160px]",get options(){return e(F)},get selected(){return e(s)},onchange:z,placeholder:"Select files..."})}});var ae=M(J,2);Ne(ae,{text:"Severity",children:(fe,Ve)=>{lt(fe,{class:"w-[90px]",get options(){return L},get value(){return e(c)},onchange:V})}});var de=M(ae,2);Ne(de,{text:"Search",children:(fe,Ve)=>{var ze=_d();Ke(ze),le("input",ze,R),Ze(ze,()=>e(u),nt=>v(u,nt)),d(fe,ze)}});var xe=M(de,2);Ne(xe,{text:"Context",children:(fe,Ve)=>{var ze=bd();Ke(ze),le("change",ze,I),Ze(ze,()=>e(y),nt=>v(y,nt)),d(fe,ze)}});var Ae=M(xe,2),me=C(Ae);{let fe=O(()=>e(x).length===0);Re(me,{variant:"secondary",size:"sm",onclick:pe,get disabled(){return e(fe)},children:(Ve,ze)=>{var nt=xd(),rr=B(nt);Fe(rr,{get icon(){return mr}}),Ce(),d(Ve,nt)},$$slots:{default:!0}})}h(Ae),d(oe,je)}});var ge=M(we,2);{var Z=oe=>{var ue=Cd(),je=M(C(ue),2);Ue(je,16,()=>[{key:"severity",label:"Severity"},{key:"count",label:"Count"},{key:"case_id",label:"Case"},{key:"file",label:"File"}],te=>te.key,(te,J)=>{var ae=kd(),de=C(ae,!0),xe=M(de);{var Ae=me=>{var fe=wd(),Ve=M(B(fe));{let ze=O(()=>e(k)==="asc"?vl:dl);Fe(Ve,{get icon(){return e(ze)},size:12})}d(me,fe)};X(xe,me=>{e(i)===J.key&&me(Ae)})}h(ae),Q(()=>{ke(ae,1,`cursor-pointer bg-transparent border-none text-xs hover:underline ${e(i)===J.key?"text-edf-bleu-fonce font-bold":"text-muted"}`),re(de,J.label)}),le("click",ae,()=>ne(J.key)),d(te,ae)}),h(ue),d(oe,ue)};X(ge,oe=>{e(W).length>0&&oe(Z)})}var _e=M(ge,2),Pe=C(_e);{var $e=oe=>{var ue=Sd();d(oe,ue)};X(Pe,oe=>{e(W).length===0&&oe($e)})}var ve=M(Pe,2);Ue(ve,17,()=>e(W),oe=>oe.fingerprint,(oe,ue)=>{var je=Ed(),te=C(je),J=C(te),ae=C(J);{let Je=O(()=>e(q).has(e(ue).fingerprint)?wn:gl);Fe(ae,{get icon(){return e(Je)},size:14})}h(J);var de=M(J,2),xe=C(de);h(de);var Ae=M(de,2),me=C(Ae);{var fe=Je=>{var ut=Pd(),Or=C(ut);h(ut),Q(()=>re(Or,`${e(ue).count??""}x`)),d(Je,ut)};X(me,Je=>{e(ue).count>1&&Je(fe)})}var Ve=M(me,2);{var ze=Je=>{var ut=$d();d(Je,ut)};X(Ve,Je=>{e(ue).isNew&&Je(ze)})}h(Ae),h(te);var nt=M(te,2);{var rr=Je=>{var ut=Rd();Fr(ut,()=>e(ue).line_html,!0),h(ut),d(Je,ut)},yr=O(()=>e(q).has(e(ue).fingerprint));X(nt,Je=>{e(yr)&&Je(rr)})}h(je),Q(Je=>{ke(je,1,`error-item ${Je??""}`),re(xe,`${e(ue).case_id??""} / ${e(ue).file??""} : ${e(ue).severity??""}`)},[()=>m(e(ue).severity)]),le("click",te,()=>g(e(ue).fingerprint)),d(oe,je)}),h(_e);var De=M(_e,2);{var be=oe=>{var ue=Md(),je=C(ue),te=C(je);h(je);var J=M(je,2);{var ae=xe=>{var Ae=Nd(),me=C(Ae);h(Ae),Q(fe=>re(me,`${fe??""} new`),[()=>e(x).filter(fe=>fe.isNew).length]),d(xe,Ae)},de=O(()=>e(x).some(xe=>xe.isNew));X(J,xe=>{e(de)&&xe(ae)})}h(ue),Q(()=>re(te,`${e(x).length??""} unique / ${e(N).length??""} total`)),d(oe,ue)};X(De,oe=>{e(W).length>0&&oe(be)})}var He=M(De,2);{var Ie=oe=>{var ue=Td(),je=C(ue,!0);h(ue),Q(()=>re(je,e(T))),d(oe,ue)};X(He,oe=>{e(T)&&oe(Ie)})}Q(()=>ke(_e,1,`error-list ${e(p)?"opacity-50 pointer-events-none":""}`)),d(Y,ie)},$$slots:{actions:!0,default:!0}}),Te()}qe(["input","change","click"]);var Fd=E('
            ',1);function Bd(t,r){Me(r,!0);let a=D(se({totalCases:0,shownCases:0,totalRunning:0,shownRunning:0,totalConverged:0,shownConverged:0})),n=D(se([]));Ee(()=>{_n(),ur(()=>void Pa())}),Ee(()=>{const i=$t(),k=document.querySelector('link[rel="icon"]');k&&(i!=null&&i.icon)&&(k.href=Ms(i.solver))});async function o(){try{const i=await Rs();Ai(i.rows),Li(i.doe_columns),v(n,i.rows.map(k=>k.case_id),!0),v(a,Gi(Ta(),zr()),!0)}catch(i){console.error("Failed to load status:",i)}}fn(()=>{o()});var s=Fd(),l=B(s);Ol(l,{});var c=M(l,2);ql(c,{});var u=M(c,2);fi(u,{get totalCases(){return e(a).totalCases},get shownCases(){return e(a).shownCases},get totalRunning(){return e(a).totalRunning},get shownRunning(){return e(a).shownRunning},get totalConverged(){return e(a).totalConverged},get shownConverged(){return e(a).shownConverged}});var y=M(u,2),p=C(y);{var T=i=>{kc(i,{onRefresh:o})},w=O(()=>Tt("status"));X(p,i=>{e(w)&&i(T)})}var N=M(p,2);{var A=i=>{qc(i,{get allCases(){return e(n)}})},b=O(()=>Tt("residuals"));X(N,i=>{e(b)&&i(A)})}var f=M(N,2);{var _=i=>{hu(i,{get allCases(){return e(n)}})},P=O(()=>Tt("probes"));X(f,i=>{e(P)&&i(_)})}var x=M(f,2);{var S=i=>{Pu(i,{get allCases(){return e(n)}})},R=O(()=>Tt("performance"));X(x,i=>{e(R)&&i(S)})}var m=M(x,2);{var $=i=>{hd(i,{get allCases(){return e(n)}})},F=O(()=>Tt("compare"));X(m,i=>{e(F)&&i($)})}var L=M(m,2);{var H=i=>{Gu(i,{get allCases(){return e(n)}})},z=O(()=>Tt("tail"));X(L,i=>{e(z)&&i(H)})}var V=M(L,2);{var I=i=>{Ld(i,{get allCases(){return e(n)}})},G=O(()=>Tt("errors"));X(V,i=>{e(G)&&i(I)})}h(y);var j=M(y,2),q=M(C(j),2),g=C(q);h(q),h(j),Q(()=>ye(g,"src",vi)),d(t,s),Te()}export{Bd as component}; + ${e(s)?e(a)==="profile"?"text-edf-bleu-fonce cursor-pointer":"text-edf-gris-moyen cursor-pointer hover:text-muted":"text-edf-gris-moyen cursor-not-allowed opacity-50"}`),R.disabled=!e(s),ye(R,"title",e(s)?"":"No profile data available. Run a simulation first.")}),ie("click",S,()=>p("time")),ie("click",R,()=>p("profile")),d(_,P)};Ht(A,{wide:!0,titleSlot:b,tabs:b,actions:_=>{var P=gu(),x=B(P);{let m=O(()=>e(a)==="time"?"probePlot":"profilePlot"),$=O(rl);tr(x,{get name(){return e(m)},get intervalMs(){return e($)},onRefresh:u,get checked(){return e(i)},set checked(F){v(i,F,!0)}})}var S=M(x,2);{var R=m=>{Re(m,{variant:"primary",onclick:u,children:($,F)=>{var L=vu(),j=B(L);Fe(j,{get icon(){return Jt}}),Ce(),d($,L)},$$slots:{default:!0}})};X(S,m=>{e(i)||m(R)})}d(_,P)},children:(_,P)=>{var x=Se(),S=B(x);{var R=$=>{ou($,{get allCases(){return r.allCases},get onRefresh(){return e(c)},set onRefresh(F){v(c,F,!0)}})},m=$=>{du($,{get allCases(){return r.allCases},get onRefresh(){return e(c)},set onRefresh(F){v(c,F,!0)}})};X(S,$=>{e(a)==="time"?$(R):$(m,-1)})}d(_,x)},$$slots:{tabs:!0,actions:!0,default:!0}})}};X(y,A=>{e(n)&&A(N)})}d(t,T),Te()}qe(["click"]);var mu=E(" Refresh",1),pu=E(" ",1),_u=E(" Download as CSV",1),bu=E('
            ',1),xu=E(" "),yu=E(' '),wu=E(' '),ku=E('
            Case
            '),Cu=E('

            '),Su=E(" ",1);function Pu(t,r){Me(r,!0);let a=D(se([])),n=D(se([])),o=D(!1),s=D(!1),i=D(se(Zt("perf")));Ee(()=>{er("perf",e(i))});const c=5e3;let u=D(se([])),w=O(()=>r.allCases.map(_=>({value:_,label:_}))),p=O(()=>e(u).length>0&&e(n).length>0);async function T(){if(e(a).length){v(s,!0);try{const _=await jn(e(a));v(u,_.columns,!0),v(n,_.records,!0),e(p)&&v(o,!0)}catch(_){console.error("Failed to load perf:",_)}v(s,!1)}}function y(_){if(v(a,_,!0),_.length===0){v(n,[],!0);return}T()}function N(_,P){if(P==null||P==="")return"-";if(_==="text")return String(P);const x=Number(P);return Number.isFinite(x)?_==="int"?String(Math.round(x)):x.toFixed(3):String(P)}async function A(){if(!e(n).length)return;const _=["case_id",...e(u).map(R=>R.key)],P=e(n).map(R=>[R.case_id,...e(u).map(m=>R[m.key]??"")].join(",")),x=[_.join(","),...P].join(` +`),S=xr("timing_snapshot",e(a),"csv");await Fa(x,S)}let b=!1;Ee(()=>{r.allCases.length>0&&!b&&(b=!0,v(a,[...r.allCases],!0),jn(r.allCases).then(_=>{v(u,_.columns,!0),v(n,_.records,!0),v(o,e(p),!0)}).catch(()=>{}))}),Ee(()=>{e(i)?pr("perf",T,c):vt("perf")});const f=_r(()=>{b&&T()});vr(()=>{vt("perf"),f()}),Ht(t,{eyebrow:"Performance",title:"Timing Snapshot",wide:!0,actions:P=>{var x=pu(),S=B(x);tr(S,{name:"perf",intervalMs:c,onRefresh:T,get checked(){return e(i)},set checked($){v(i,$,!0)}});var R=M(S,2);{var m=$=>{Re($,{variant:"primary",onclick:T,children:(F,L)=>{var j=mu(),z=B(j);Fe(z,{get icon(){return Jt}}),Ce(),d(F,j)},$$slots:{default:!0}})};X(R,$=>{e(i)||$(m)})}d(P,x)},children:(P,x)=>{var S=Su(),R=B(S);{var m=j=>{Xt(j,{children:(z,V)=>{var I=bu(),G=B(I);Ne(G,{text:"Cases",children:(g,l)=>{Kt(g,{class:"w-[160px]",get options(){return e(w)},get selected(){return e(a)},onchange:y,placeholder:"Select cases..."})}});var U=M(G,2),q=k(U);{let g=O(()=>!e(p));Re(q,{variant:"secondary",size:"sm",onclick:A,get disabled(){return e(g)},children:(l,C)=>{var H=_u(),W=B(H);Fe(W,{get icon(){return mr}}),Ce(),d(l,H)},$$slots:{default:!0}})}h(U),d(z,I)}})};X(R,j=>{e(o)&&j(m)})}var $=M(R,2);{var F=j=>{var z=ku(),V=k(z),I=k(V),G=k(I),U=M(k(G));Ue(U,17,()=>e(u),g=>g.key,(g,l)=>{var C=xu(),H=k(C,!0);h(C),Q(()=>re(H,e(l).label)),d(g,C)}),h(G),h(I);var q=M(I);Ue(q,21,()=>e(n),g=>g.case_id,(g,l)=>{var C=wu(),H=k(C),W=k(H,!0);h(H);var ee=M(H);Ue(ee,17,()=>e(u),ne=>ne.key,(ne,pe)=>{var K=yu(),Y=k(K,!0);h(K),Q(ce=>re(Y,ce),[()=>N(e(pe).kind,e(l)[e(pe).key])]),d(ne,K)}),h(C),Q(()=>re(W,e(l).case_id)),d(g,C)}),h(q),h(V),h(z),d(j,z)},L=j=>{var z=Cu(),V=k(z);{var I=U=>{var q=Oe("Select cases above to view timing information.");d(U,q)},G=U=>{var q=Oe("No performance data available. Please run a simulation first.");d(U,q)};X(V,U=>{e(o)?U(I):U(G,-1)})}h(z),d(j,z)};X($,j=>{e(p)?j(F):j(L,-1)})}d(P,S)},$$slots:{actions:!0,default:!0}}),Te()}const $u={"&":"&","<":"<",">":">",'"':""","'":"'"};function qa(t){return t.replace(/[&<>"']/g,r=>$u[r]??r)}var Ru=E("
            "),Eu=E('
            ');function Nu(t,r){Me(r,!0);let a=D(void 0);function n(w){const p=qa(w);if(!r.searchQuery.trim())return p;try{const T=new RegExp(`(${r.searchQuery})`,"gi");return p.replace(T,'$1')}catch{return p}}function o(w){return w==="error"?"tail-sev-error":w==="warn"?"tail-sev-warn":""}function s(){return e(a)?e(a).scrollHeight-e(a).scrollTop-e(a).clientHeight<=24:!0}let i=D(!0);function c(){v(i,s(),!0)}Ee(()=>{r.autoScroll&&r.lines.length>0&&e(a)&&e(i)&&Pt().then(()=>{e(a)&&(e(a).scrollTop=e(a).scrollHeight)})});var u=Eu();Ue(u,21,()=>r.lines,w=>w.index,(w,p)=>{var T=Ru();Fr(T,()=>n(e(p).text),!0),h(T),Q(y=>ke(T,1,`tail-line ${y??""} ${e(p).isNew?"tail-new":""}`),[()=>o(e(p).severity)]),d(w,T)}),h(u),rt(u,w=>v(a,w),()=>e(a)),et("scroll",u,c),d(t,u),Te()}var Mu=E(" Refresh",1),Tu=E(" ",1),Au=E(''),Lu=E(''),Fu=E("   ",1),Du=E(" ",1),Iu=Ot(''),zu=Ot(''),Ou=Ot(''),Hu=E(" Resume",1),ju=E(" Pause",1),Uu=E('Case not running'),Vu=E(' 
            ',1),Bu=E('

            '),qu=E('

            '),Ku=E(" ",1);function Gu(t,r){Me(r,!0);const a=80;let n=D(""),o=D(""),s=D(!1),i=D(se([])),c=D(a),u=D(se([])),w=D(se(new Set)),p=D(!1),T=D(se(Zt("tail")));Ee(()=>{er("tail",e(T))});let y=D(!0),N=D("all"),A=D(""),b=D(""),f=D(void 0),_=O(()=>yn(r.allCases)),P=O(()=>e(i).map(U=>{const q=U.split("/").pop()??U;return{value:U,label:q}})),x=[{value:"all",label:"All"},{value:"error",label:"Error"},{value:"warn",label:"Warn"}],S=O(()=>e(i).length>0),R=O(()=>zr().some(U=>{var q;return U.case_id===e(n)&&((q=U.status)==null?void 0:q.toUpperCase())==="RUNNING"}));async function m(){if(e(n)){try{v(i,await Ds(e(n)),!0)}catch(U){console.error("Failed to load tail files:",U),v(i,[],!0);return}(!e(s)||!e(i).includes(e(o)))&&(v(o,e(i)[0]??"",!0),v(s,!1)),e(o)||v(u,[],!0)}}async function $(U=!1){if(e(n)&&!(e(p)&&!U)&&(await m(),!!e(o)))try{const q=(await Is(e(n),e(o),e(c))).lines;if(v(b,""),e(u).length>0){const g=F(e(u),q),l=new Set;for(let C=g;C{let U=e(u).map((q,g)=>({...q,index:g,isNew:e(w).has(g)}));if(e(N)!=="all"&&(U=U.filter(q=>q.severity===e(N))),e(A).trim())try{const q=new RegExp(e(A),"i");U=U.filter(g=>q.test(g.text))}catch{}return U});function j(U){v(n,U,!0),v(o,""),v(s,!1),v(u,[],!0),m().then(()=>$(!0))}function z(U){v(o,U,!0),v(s,!0),v(u,[],!0),$(!0)}function V(){v(p,!e(p)),e(p)||$(!0)}function I(U){(U.ctrlKey||U.metaKey)&&U.key==="f"&&e(f)&&(U.preventDefault(),e(f).focus())}Ee(()=>{r.allCases.length>0&&!e(n)&&(v(n,r.allCases[0],!0),m().then(()=>$(!0)))}),Ee(()=>{e(T)&&!e(p)&&e(n)?pr("tail",()=>$(!1),Kn()):vt("tail")});const G=_r(()=>{e(n)&&m().then(()=>$(!0))});vr(()=>{vt("tail"),G()}),et("keydown",st,I),Ht(t,{eyebrow:"Live",title:"Log Tail",wide:!0,actions:q=>{var g=Tu(),l=B(g);{let W=O(Kn);tr(l,{name:"tail",get intervalMs(){return e(W)},onRefresh:()=>$(!1),get checked(){return e(T)},set checked(ee){v(T,ee,!0)}})}var C=M(l,2);{var H=W=>{Re(W,{variant:"primary",onclick:()=>$(!0),children:(ee,ne)=>{var pe=Mu(),K=B(pe);Fe(K,{get icon(){return Jt}}),Ce(),d(ee,pe)},$$slots:{default:!0}})};X(C,W=>{e(T)||W(H)})}d(q,g)},children:(q,g)=>{var l=Ku(),C=B(l);Xt(C,{children:(K,Y)=>{var ce=Du(),le=B(ce);Ne(le,{text:"Case",children:(Z,_e)=>{it(Z,{class:"w-[130px]",get options(){return e(_)},get value(){return e(n)},onchange:j})}});var we=M(le,2);{var ge=Z=>{var _e=Fu(),Pe=B(_e);Ne(Pe,{text:"File",children:(be,He)=>{it(be,{class:"w-[150px]",get options(){return e(P)},get value(){return e(o)},onchange:z})}});var $e=M(Pe,2);Ne($e,{text:"Lines",children:(be,He)=>{var Ie=Au();Ke(Ie),ie("change",Ie,()=>$(!0)),Ze(Ie,()=>e(c),oe=>v(c,oe)),d(be,Ie)}});var ve=M($e,2);Ne(ve,{text:"Filter",children:(be,He)=>{var Ie=Lu();Ke(Ie),rt(Ie,oe=>v(f,oe),()=>e(f)),Ze(Ie,()=>e(A),oe=>v(A,oe)),d(be,Ie)}});var De=M(ve,2);Ne(De,{text:"Severity",children:(be,He)=>{it(be,{class:"w-[90px]",get options(){return x},get value(){return e(N)},onchange:Ie=>v(N,Ie,!0)})}}),d(Z,_e)};X(we,Z=>{e(S)&&Z(ge)})}d(K,ce)}});var H=M(C,2);{var W=K=>{var Y=Vu(),ce=B(Y);Nu(ce,{get lines(){return e(L)},get searchQuery(){return e(A)},get autoScroll(){return e(y)}});var le=M(ce,2),we=k(le),ge=k(we);{var Z=oe=>{var ue=Iu();d(oe,ue)},_e=oe=>{var ue=zu();d(oe,ue)},Pe=oe=>{var ue=Ou();d(oe,ue)};X(ge,oe=>{e(p)?oe(Z):e(R)?oe(_e,1):oe(Pe,-1)})}var $e=M(ge);h(we);var ve=M(we,2);{var De=oe=>{Re(oe,{variant:"secondary",size:"sm",onclick:V,children:(ue,je)=>{var te=Se(),J=B(te);{var ae=xe=>{var Ae=Hu(),me=B(Ae);Fe(me,{get icon(){return Ea}}),Ce(),d(xe,Ae)},de=xe=>{var Ae=ju(),me=B(Ae);Fe(me,{get icon(){return bi}}),Ce(),d(xe,Ae)};X(J,xe=>{e(p)?xe(ae):xe(de,-1)})}d(ue,te)},$$slots:{default:!0}})},be=oe=>{var ue=Uu();d(oe,ue)};X(ve,oe=>{e(R)?oe(De):oe(be,-1)})}var He=M(ve,2),Ie=k(He);zt(Ie,{get checked(){return e(y)},onchange:oe=>v(y,oe,!0),size:14,label:"Auto-scroll",labelFirst:!0}),h(He),h(le),Q(()=>re($e,` ${e(L).length??""} / ${e(u).length??""}`)),d(K,Y)},ee=K=>{var Y=Bu(),ce=k(Y);{var le=ge=>{var Z=Oe("No log file yet for this case.");d(ge,Z)},we=ge=>{var Z=Oe("No log data available. Please run a simulation first.");d(ge,Z)};X(ce,ge=>{e(n)&&!e(S)?ge(le):ge(we,-1)})}h(Y),d(K,Y)};X(H,K=>{e(u).length>0?K(W):K(ee,-1)})}var ne=M(H,2);{var pe=K=>{var Y=qu(),ce=k(Y,!0);h(Y),Q(()=>re(ce,e(b))),d(K,Y)};X(ne,K=>{e(b)&&K(pe)})}d(q,l)},$$slots:{actions:!0,default:!0}}),Te()}qe(["change"]);function Wu(t,r=3){var N,A;const a=t.split(` +`),n=[];let o=0,s=0,i=!1;for(const b of a){if(b.startsWith("===")||b.startsWith("---")||b.startsWith("+++"))continue;const f=b.match(/^@@ -(\d+),?\d* \+(\d+),?\d* @@/);if(f){o=parseInt(f[1],10)-1,s=parseInt(f[2],10)-1,i=!0;continue}if(i)if(b.startsWith("-"))o++,n.push({type:"del",leftNum:o,rightNum:null,leftContent:b.slice(1),rightContent:""});else if(b.startsWith("+"))s++,n.push({type:"add",leftNum:null,rightNum:s,leftContent:"",rightContent:b.slice(1)});else{o++,s++;const _=b.startsWith(" ")?b.slice(1):b;n.push({type:"equal",leftNum:o,rightNum:s,leftContent:_,rightContent:_})}}const c=[];let u=0;for(;u=0&&b-T>1&&p.push({kind:"separator",skipped:b-T-1});const f=c[b].type!=="equal",_=f&&!y;p.push({kind:"line",row:c[b],hunkStart:_}),y=f,T=b}if(T=0&&p.push({kind:"separator",skipped:c.length-1-T}),p.length>0&&p[0].kind==="line"){const b=((N=p[0].row)==null?void 0:N.leftNum)??0,f=((A=p[0].row)==null?void 0:A.rightNum)??0,_=Math.max(b,f)-1;_>0&&p.unshift({kind:"separator",skipped:_})}return p}var Xu=E('
            '),Yu=E('
            '),Qu=E(' ',1),Ju=E('No matches'),Zu=E('
            '),ed=E('

            Files are identical.

            '),td=E('
            Loading...
            '),rd=E('
            ');function nd(t,r){Me(r,!0);let a=he(r,"loading",3,!1),n=D(void 0),o=O(()=>Wu(r.diffText)),s=O(()=>{const te=[];return e(o).forEach((J,ae)=>{J.hunkStart&&te.push(ae)}),te}),i=O(()=>e(s).length>0),c=O(()=>{var J;const te=new Array(e(o).length).fill(-1);for(let ae=0;ae{r.diffText!==w&&(w=r.diffText,v(u,-1))});let p=O(()=>{if(!r.search.trim())return[];try{const te=new RegExp(r.search,"i"),J=[];return e(o).forEach((ae,de)=>{ae.kind==="line"&&ae.row&&(te.test(ae.row.leftContent)||te.test(ae.row.rightContent))&&J.push(de)}),J}catch{return[]}}),T=D(-1),y="";Ee(()=>{r.search!==y&&(y=r.search,v(T,e(p).length>0?0:-1,!0))});async function N(te){var de;v(T,te,!0),await Pt();const J=e(p)[te],ae=(de=e(x))==null?void 0:de.querySelector(`[data-item-idx="${J}"]`);if(ae&&e(x)&&e(S)){const xe=e(x).getBoundingClientRect(),me=ae.getBoundingClientRect().top-xe.top+e(x).scrollTop-e(x).clientHeight/3;m=!0,e(x).scrollTop=me,e(S).scrollTop=me,requestAnimationFrame(()=>{m=!1})}}function A(){e(T)>0&&N(e(T)-1)}function b(){e(T)<0&&e(p).length>0?N(0):e(T)$1`)}catch{return ae}}function _(te,J){return te==="equal"?"":te==="del"&&J==="left"?"bg-[rgba(214,67,10,0.08)] text-edf-orange-fonce":te==="del"&&J==="right"?"bg-[rgba(48,122,16,0.08)] text-edf-vert-fonce":te==="add"&&J==="left"?"bg-edf-gris-clair":te==="add"&&J==="right"?"bg-[rgba(48,122,16,0.08)] text-edf-vert-fonce":""}function P(te,J){return te==="del"&&J==="left"?"rgb(251,237,233)":te==="del"&&J==="right"?"rgb(238,247,236)":te==="add"&&J==="left"?"var(--color-edf-gris-clair)":te==="add"&&J==="right"?"rgb(238,247,236)":"white"}let x=D(void 0),S=D(void 0),R=!1,m=!1;function $(te){R||m||!e(x)||!e(S)||(R=!0,te==="left"?(e(S).scrollTop=e(x).scrollTop,e(S).scrollLeft=e(x).scrollLeft):(e(x).scrollTop=e(S).scrollTop,e(x).scrollLeft=e(S).scrollLeft),requestAnimationFrame(()=>{R=!1}))}async function F(te){var ae;v(u,te,!0),await Pt();const J=(ae=e(x))==null?void 0:ae.querySelector(`[data-hunk-start="${te}"]`);if(J&&e(x)&&e(S)){m=!0;const de=e(x).getBoundingClientRect(),Ae=J.getBoundingClientRect().top-de.top+e(x).scrollTop-e(x).clientHeight/3;e(x).scrollTop=Ae,e(S).scrollTop=Ae,requestAnimationFrame(()=>{m=!1})}}function L(){e(u)>0&&F(e(u)-1)}function j(){e(u)<0?F(0):e(u)=0&&v(u,J,!0)}function V(te){te.target instanceof HTMLInputElement||(te.key==="n"&&!te.shiftKey?(te.preventDefault(),j()):te.key==="N"||te.key==="n"&&te.shiftKey?(te.preventDefault(),L()):te.key==="j"?(te.preventDefault(),b()):(te.key==="J"||te.key==="j"&&te.shiftKey)&&(te.preventDefault(),A()))}var I=rd();{const te=(J,ae=No)=>{var de=Se(),xe=B(de);Ue(xe,17,()=>e(o),gn,(Ae,me,fe)=>{const Ve=O(()=>e(s).indexOf(fe)),ze=O(()=>e(c)[fe]>=0&&e(c)[fe]===e(u)),nt=O(()=>{var ct,Be;return ae()==="left"?(ct=e(me).row)==null?void 0:ct.leftNum:(Be=e(me).row)==null?void 0:Be.rightNum}),rr=O(()=>{var ct,Be;return ae()==="left"?((ct=e(me).row)==null?void 0:ct.leftContent)??"":((Be=e(me).row)==null?void 0:Be.rightContent)??""});var yr=Se(),Je=B(yr);{var ut=ct=>{var Be=Xu(),Nt=M(k(Be),2),Hr=k(Nt);h(Nt),h(Be),Q(()=>re(Hr,`... ${e(me).skipped??""} lines hidden ...`)),d(ct,Be)},Or=ct=>{var Be=Yu(),Nt=k(Be),Hr=k(Nt,!0);h(Nt);var Nn=M(Nt,2);Fr(Nn,()=>f(e(rr),e(T)>=0&&e(p)[e(T)]===fe),!0),h(Nn),h(Be),Q((xt,Mt,wr,Ka,Ga)=>{ke(Be,1,`flex w-full ${xt??""} ${Mt??""}`),Xe(Be,e(ze)?"background-color: rgba(16,87,200,0.12); color: rgb(16,87,200);":""),ye(Be,"role",wr),ye(Be,"tabindex",Ka),ye(Be,"data-hunk-start",ae()==="left"&&e(Ve)>=0?e(Ve):void 0),ye(Be,"data-item-idx",ae()==="left"?fe:void 0),Xe(Nt,`background: ${Ga??""}; color: ${e(ze)?"white":"var(--color-muted)"};`),re(Hr,e(nt)??"")},[()=>_(e(me).row.type,ae()),()=>e(me).row.type!=="equal"||e(p).includes(fe)?"cursor-pointer":"",()=>e(me).row.type!=="equal"||e(p).includes(fe)?"button":void 0,()=>e(me).row.type!=="equal"||e(p).includes(fe)?0:void 0,()=>e(ze)?"rgb(16,87,200)":P(e(me).row.type,ae())]),ie("click",Be,()=>{var Mt;((Mt=e(me).row)==null?void 0:Mt.type)!=="equal"&&z(fe);const xt=e(p).indexOf(fe);xt>=0&&v(T,xt,!0)}),ie("keydown",Be,xt=>{var Mt;if(xt.key==="Enter"||xt.key===" "){xt.preventDefault(),((Mt=e(me).row)==null?void 0:Mt.type)!=="equal"&&z(fe);const wr=e(p).indexOf(fe);wr>=0&&v(T,wr,!0)}}),d(ct,Be)};X(Je,ct=>{e(me).kind==="separator"?ct(ut):e(me).row&&ct(Or,1)})}d(Ae,yr)}),d(J,de)};var G=k(I),U=k(G),q=k(U),g=k(q,!0);h(q);var l=M(q,2),C=k(l,!0);h(l),h(U);var H=M(U,2),W=k(H),ee=k(W,!0);h(W);var ne=M(W,2),pe=k(ne,!0);h(ne),h(H),h(G);var K=M(G,2),Y=k(K),ce=k(Y);Ke(ce);var le=M(ce,2);{var we=J=>{var ae=Qu(),de=B(ae);{let fe=O(()=>e(T)<=0);Re(de,{variant:"secondary",size:"sm",onclick:A,get disabled(){return e(fe)},children:(Ve,ze)=>{Ce();var nt=Oe("Prev");d(Ve,nt)},$$slots:{default:!0}})}var xe=M(de,2),Ae=k(xe);h(xe);var me=M(xe,2);{let fe=O(()=>e(T)>=e(p).length-1);Re(me,{variant:"secondary",size:"sm",onclick:b,get disabled(){return e(fe)},children:(Ve,ze)=>{Ce();var nt=Oe("Next");d(Ve,nt)},$$slots:{default:!0}})}Q(()=>re(Ae,`${e(T)>=0?e(T)+1:"–"} / ${e(p).length??""} occurrence${e(p).length!==1?"s":""}`)),d(J,ae)},ge=O(()=>r.search.trim()&&e(p).length>0),Z=J=>{var ae=Ju();d(J,ae)},_e=O(()=>r.search.trim());X(le,J=>{e(ge)?J(we):e(_e)&&J(Z,1)})}h(Y);var Pe=M(Y,2),$e=k(Pe);{let J=O(()=>e(s).length===0||e(u)<=0);Re($e,{variant:"secondary",size:"sm",onclick:L,get disabled(){return e(J)},children:(ae,de)=>{Ce();var xe=Oe("Prev");d(ae,xe)},$$slots:{default:!0}})}var ve=M($e,2),De=k(ve);h(ve);var be=M(ve,2);{let J=O(()=>e(s).length===0||e(u)>=e(s).length-1);Re(be,{variant:"secondary",size:"sm",onclick:j,get disabled(){return e(J)},children:(ae,de)=>{Ce();var xe=Oe("Next");d(ae,xe)},$$slots:{default:!0}})}h(Pe),h(K);var He=M(K,2);{var Ie=J=>{var ae=Zu(),de=k(ae),xe=k(de),Ae=k(xe);te(Ae,()=>"left"),h(xe),h(de),rt(de,ze=>v(x,ze),()=>e(x));var me=M(de,2),fe=k(me),Ve=k(fe);te(Ve,()=>"right"),h(fe),h(me),rt(me,ze=>v(S,ze),()=>e(S)),h(ae),et("scroll",de,()=>$("left")),et("scroll",me,()=>$("right")),d(J,ae)},oe=J=>{var ae=ed();d(J,ae)};X(He,J=>{e(i)?J(Ie):J(oe,-1)})}var ue=M(He,2);{var je=J=>{var ae=td();d(J,ae)};X(ue,J=>{a()&&J(je)})}h(I),rt(I,J=>v(n,J),()=>e(n)),Q(()=>{re(g,r.leftLabel),re(C,r.kind),re(ee,r.rightLabel),re(pe,r.kind),hn(ce,r.search),re(De,`${e(u)>=0?e(u)+1:"–"} / ${e(s).length??""} diff${e(s).length!==1?"s":""}`)}),ie("input",ce,J=>r.onSearchChange(J.target.value)),ie("keydown",ce,J=>{J.key==="Enter"&&(J.preventDefault(),b())})}ie("keydown",I,V),d(t,I),Te()}qe(["keydown","click","input"]);var ad=E(" ",1),od=E('

            Please select two different cases to compare.

            '),sd=E('

            Select two cases to compare.

            '),id=E(' '),ld=E('
            Parameter
            '),cd=E('

            All parameters are identical.

            '),ud=E('
            ',1),dd=E('

            '),fd=E('

            Loading...

            '),vd=E(" ",1),gd=E(" ",1);function hd(t,r){Me(r,!0);let a=D(""),n=D(""),o=D(""),s=D(""),i=D(""),c=D(!1),u=D(!1),w=D(""),p=O(()=>r.allCases.map(m=>({value:m,label:m})));const T=[{value:"doe_row.csv",label:"doe_row.csv"}];let y=O(()=>{var m;return((m=$t())==null?void 0:m.compare_kinds)??T});Ee(()=>{var m;e(y).some($=>$.value===e(o))||v(o,((m=e(y)[0])==null?void 0:m.value)??"",!0)});let N=D(!1),A=O(()=>e(a)&&e(n)&&e(a)!==e(n));function b(){const m=e(a);v(a,e(n),!0),v(n,m,!0)}async function f(){if(e(A)){v(c,!0),v(w,"");try{const m=await js({cases:[e(a),e(n)],base:e(a),kind:e(o)});v(i,m,!0),v(u,!0)}catch(m){console.error("Failed to load diff:",m),v(i,""),v(u,!1);const $=m instanceof Error?m.message:String(m);v(w,$.includes("404")?`File "${e(o)}" not found for one of the selected cases. It may not have been run yet.`:"Failed to load comparison.",!0)}v(c,!1)}}Ee(()=>{e(a)&&e(n)&&e(a)!==e(n)&&e(o)?f():e(a)&&e(n)&&e(a)===e(n)&&(v(i,""),v(u,!0))});let _=!1;Ee(()=>{r.allCases.length>=2&&!_?(_=!0,v(a,r.allCases[0],!0),v(n,r.allCases[1],!0)):r.allCases.length===1&&!_&&(_=!0,v(a,r.allCases[0],!0))});let P=O(Pn),x=O(()=>{if(!e(a)||!e(n)||e(a)===e(n)||e(P).length===0)return[];const m=zr(),$=m.find(L=>L.case_id===e(a)),F=m.find(L=>L.case_id===e(n));return!$&&!F?[]:e(P).map(L=>{var V,I;const j=((V=$==null?void 0:$.doe)==null?void 0:V[L])!=null&&String($.doe[L])!==""?String($.doe[L]):"—",z=((I=F==null?void 0:F.doe)==null?void 0:I[L])!=null&&String(F.doe[L])!==""?String(F.doe[L]):"—";return{param:L,left:j,right:z,differs:j!==z}})}),S=O(()=>e(N)?e(x):e(x).filter(m=>m.differs)),R=O(()=>e(x).filter(m=>m.differs).length);Ht(t,{eyebrow:"Compare",title:"Side-by-Side Comparison",wide:!0,children:(m,$)=>{var F=gd(),L=B(F);Xt(L,{children:(G,U)=>{var q=ad(),g=B(q);Ne(g,{text:"First case",children:(H,W)=>{it(H,{class:"w-32.5",get options(){return e(p)},get value(){return e(a)},onchange:ee=>v(a,ee,!0),placeholder:"Select..."})}});var l=M(g,2);{let H=O(()=>!e(a)&&!e(n));Re(l,{variant:"secondary",size:"sm",onclick:b,get disabled(){return e(H)},children:(W,ee)=>{Fe(W,{get icon(){return vi}})},$$slots:{default:!0}})}var C=M(l,2);Ne(C,{text:"Second case",children:(H,W)=>{it(H,{class:"w-32.5",get options(){return e(p)},get value(){return e(n)},onchange:ee=>v(n,ee,!0),placeholder:"Select..."})}}),d(G,q)}});var j=M(L,2);{var z=G=>{var U=od();d(G,U)},V=G=>{var U=sd();d(G,U)},I=G=>{var U=vd(),q=B(U);{var g=ne=>{var pe=ud(),K=B(pe),Y=k(K),ce=k(Y);h(Y);var le=M(Y,2),we=k(le,!0);h(le),h(K);var ge=M(K,2);{var Z=Pe=>{var $e=ld(),ve=k($e),De=k(ve),be=k(De),He=k(be),Ie=k(He,!0);h(He);var oe=M(He,2),ue=k(oe,!0);h(oe),h(be),h(De);var je=M(De);Ue(je,21,()=>e(S),te=>te.param,(te,J)=>{var ae=id(),de=k(ae),xe=k(de,!0);h(de);var Ae=M(de),me=k(Ae,!0);h(Ae);var fe=M(Ae),Ve=k(fe,!0);h(fe),h(ae),Q(()=>{ke(de,1,dt(e(J).differs?"text-edf-orange-fonce bg-[rgba(214,67,10,0.04)]":"")),re(xe,e(J).left),re(me,e(J).param),ke(fe,1,dt(e(J).differs?"text-edf-vert-fonce bg-[rgba(48,122,16,0.04)]":"")),re(Ve,e(J).right)}),d(te,ae)}),h(je),h(ve),h($e),Q(()=>{re(Ie,e(a)),re(ue,e(n))}),d(Pe,$e)},_e=Pe=>{var $e=cd();d(Pe,$e)};X(ge,Pe=>{e(S).length>0?Pe(Z):Pe(_e,-1)})}Q(()=>{re(ce,`${e(R)??""} difference${e(R)!==1?"s":""} out of ${e(x).length??""} + parameters`),re(we,e(N)?"Show differences only":"Show all parameters")}),ie("click",le,()=>v(N,!e(N))),d(ne,pe)};X(q,ne=>{e(x).length>0&&ne(g)})}var l=M(q,2);Xt(l,{children:(ne,pe)=>{Ne(ne,{text:"File",children:(K,Y)=>{it(K,{class:"w-37.5",get options(){return e(y)},get value(){return e(o)},onchange:ce=>v(o,ce,!0)})}})}});var C=M(l,2);{var H=ne=>{var pe=dd(),K=k(pe,!0);h(pe),Q(()=>re(K,e(w))),d(ne,pe)},W=ne=>{nd(ne,{get diffText(){return e(i)},get leftLabel(){return e(a)},get rightLabel(){return e(n)},get kind(){return e(o)},get search(){return e(s)},get loading(){return e(c)},onSearchChange:pe=>v(s,pe,!0)})},ee=ne=>{var pe=fd();d(ne,pe)};X(C,ne=>{e(w)?ne(H):e(u)?ne(W,1):e(c)&&ne(ee,2)})}d(G,U)};X(j,G=>{e(a)&&e(n)&&e(a)===e(n)?G(z):!e(a)||!e(n)?G(V,1):G(I,-1)})}d(m,F)},$$slots:{default:!0}}),Te()}qe(["click"]);var md=E(" Refresh",1),pd=E(" ",1),_d=E(''),bd=E(''),xd=E(" Download as CSV",1),yd=E('
            ',1),wd=E(" ",1),kd=E(""),Cd=E('
            Sort by:
            '),Sd=E('

            No errors found. Select cases and adjust filters above.

            '),Pd=E(' '),$d=E('NEW'),Rd=E('
            '),Ed=E('
            '),Nd=E(' '),Md=E('
            '),Td=E('

            '),Ad=E("
            ",1);function Ld(t,r){Me(r,!0);const a=6,n=["csauto.stderr","csauto.stdout"];let o=D(se([])),s=D(se([...n])),i=!1;Ee(()=>{var Y;const K=(Y=$t())==null?void 0:Y.error_files;K!=null&&K.length&&!i&&v(s,[...K],!0)});let c=D("all"),u=D(""),w=D(a),p=D(!1),T=D(""),y=D(se(Zt("errors")));Ee(()=>{er("errors",e(y))});let N=D(se([])),A=D(se(new Set));function b(K){return K.toLowerCase().replace(/[0-9]+/g,"#").replace(/0x[0-9a-f]+/gi,"#").replace(/\s+/g," ").trim()}function f(K){const Y=K.line_html.replace(/<[^>]*>/g,"").slice(0,120);return`${K.case_id}|${K.file}|${K.severity}|${b(Y)}`}function _(K){const Y=new Map;for(const ce of K){const le=f(ce),we=Y.get(le);we?we.count++:Y.set(le,{...ce,count:1,fingerprint:le,isNew:!e(A).has(le)})}return Array.from(Y.values())}async function P(){if(!(!e(o).length||!e(s).length)){v(p,!0);try{const K=await Fs({cases:e(o),files:e(s),context:e(w),sev:e(c)==="all"?"":e(c),q:e(u)});v(T,"");const Y=_(K.items);v(N,K.items,!0);const ce=new Set(Y.map(le=>le.fingerprint));v(A,ce,!0),v(x,Y,!0)}catch(K){v(T,"Failed to load errors"),console.error("Failed to load errors:",K)}finally{v(p,!1)}}}let x=D(se([])),S=null;function R(){S&&clearTimeout(S),S=setTimeout(P,250)}function m(K){return K==="error"?"error-sev-error":K==="warn"?"error-sev-warn":"error-sev-info"}let $=O(()=>yn(r.allCases)),F=O(()=>{var K;return(((K=$t())==null?void 0:K.error_files)??n).map(Y=>({value:Y,label:Y}))}),L=[{value:"all",label:"All"},{value:"error",label:"Error"},{value:"warn",label:"Warn"}];function j(K){if(v(o,K,!0),K.length===0){v(x,[],!0),v(N,[],!0);return}P()}function z(K){if(i=!0,v(s,K,!0),K.length===0){v(x,[],!0),v(N,[],!0);return}P()}function V(K){v(c,K,!0),P()}function I(){P()}let G=!1;Ee(()=>{r.allCases.length>0&&!G&&(G=!0,v(o,[...r.allCases],!0),P())}),Ee(()=>{e(y)?pr("errors",P,Wn()):vt("errors")});const U=_r(()=>{G&&P()});vr(()=>{vt("errors"),U()});let q=D(se(new Set));function g(K){const Y=new Set(e(q));Y.has(K)?Y.delete(K):Y.add(K),v(q,Y,!0)}let l=D("severity"),C=D("desc");const H={info:0,warn:1,error:2};let W=O(()=>{const K=[...e(x)];return K.sort((Y,ce)=>{let le=0;return e(l)==="severity"?le=(H[Y.severity]??9)-(H[ce.severity]??9):e(l)==="count"?le=Y.count-ce.count:le=Y[e(l)].localeCompare(ce[e(l)]),e(C)==="asc"?le:-le}),K});const ee={severity:"desc",count:"desc",case_id:"asc",file:"asc"};function ne(K){e(l)===K?v(C,e(C)==="asc"?"desc":"asc",!0):(v(l,K,!0),v(C,ee[K],!0))}function pe(){if(!e(x).length)return;const K=["case_id","file","severity","count","is_new","line_text"],Y=e(W).map(we=>[we.case_id,we.file,we.severity,we.count,we.isNew?"yes":"no",`"${we.line_html.replace(/<[^>]*>/g,"").replace(/"/g,'""')}"`].join(",")),ce=[K.join(","),...Y].join(` +`),le=xr("errors",e(o),"csv");Fa(ce,le)}Ht(t,{eyebrow:"Diagnostics",title:"Recent Errors",wide:!0,actions:Y=>{var ce=pd(),le=B(ce);{let Z=O(Wn);tr(le,{name:"errors",get intervalMs(){return e(Z)},onRefresh:P,get checked(){return e(y)},set checked(_e){v(y,_e,!0)}})}var we=M(le,2);{var ge=Z=>{Re(Z,{variant:"primary",onclick:P,children:(_e,Pe)=>{var $e=md(),ve=B($e);Fe(ve,{get icon(){return Jt}}),Ce(),d(_e,$e)},$$slots:{default:!0}})};X(we,Z=>{e(y)||Z(ge)})}d(Y,ce)},children:(Y,ce)=>{var le=Ad(),we=B(le);Xt(we,{children:(oe,ue)=>{var je=yd(),te=B(je);Ne(te,{text:"Cases",children:(fe,Ve)=>{Kt(fe,{class:"w-[160px]",get options(){return e($)},get selected(){return e(o)},onchange:j,placeholder:"Select cases..."})}});var J=M(te,2);Ne(J,{text:"Files",children:(fe,Ve)=>{Kt(fe,{class:"w-[160px]",get options(){return e(F)},get selected(){return e(s)},onchange:z,placeholder:"Select files..."})}});var ae=M(J,2);Ne(ae,{text:"Severity",children:(fe,Ve)=>{it(fe,{class:"w-[90px]",get options(){return L},get value(){return e(c)},onchange:V})}});var de=M(ae,2);Ne(de,{text:"Search",children:(fe,Ve)=>{var ze=_d();Ke(ze),ie("input",ze,R),Ze(ze,()=>e(u),nt=>v(u,nt)),d(fe,ze)}});var xe=M(de,2);Ne(xe,{text:"Context",children:(fe,Ve)=>{var ze=bd();Ke(ze),ie("change",ze,I),Ze(ze,()=>e(w),nt=>v(w,nt)),d(fe,ze)}});var Ae=M(xe,2),me=k(Ae);{let fe=O(()=>e(x).length===0);Re(me,{variant:"secondary",size:"sm",onclick:pe,get disabled(){return e(fe)},children:(Ve,ze)=>{var nt=xd(),rr=B(nt);Fe(rr,{get icon(){return mr}}),Ce(),d(Ve,nt)},$$slots:{default:!0}})}h(Ae),d(oe,je)}});var ge=M(we,2);{var Z=oe=>{var ue=Cd(),je=M(k(ue),2);Ue(je,16,()=>[{key:"severity",label:"Severity"},{key:"count",label:"Count"},{key:"case_id",label:"Case"},{key:"file",label:"File"}],te=>te.key,(te,J)=>{var ae=kd(),de=k(ae,!0),xe=M(de);{var Ae=me=>{var fe=wd(),Ve=M(B(fe));{let ze=O(()=>e(C)==="asc"?gi:fi);Fe(Ve,{get icon(){return e(ze)},size:12})}d(me,fe)};X(xe,me=>{e(l)===J.key&&me(Ae)})}h(ae),Q(()=>{ke(ae,1,`cursor-pointer bg-transparent border-none text-xs hover:underline ${e(l)===J.key?"text-edf-bleu-fonce font-bold":"text-muted"}`),re(de,J.label)}),ie("click",ae,()=>ne(J.key)),d(te,ae)}),h(ue),d(oe,ue)};X(ge,oe=>{e(W).length>0&&oe(Z)})}var _e=M(ge,2),Pe=k(_e);{var $e=oe=>{var ue=Sd();d(oe,ue)};X(Pe,oe=>{e(W).length===0&&oe($e)})}var ve=M(Pe,2);Ue(ve,17,()=>e(W),oe=>oe.fingerprint,(oe,ue)=>{var je=Ed(),te=k(je),J=k(te),ae=k(J);{let Je=O(()=>e(q).has(e(ue).fingerprint)?wn:hi);Fe(ae,{get icon(){return e(Je)},size:14})}h(J);var de=M(J,2),xe=k(de);h(de);var Ae=M(de,2),me=k(Ae);{var fe=Je=>{var ut=Pd(),Or=k(ut);h(ut),Q(()=>re(Or,`${e(ue).count??""}x`)),d(Je,ut)};X(me,Je=>{e(ue).count>1&&Je(fe)})}var Ve=M(me,2);{var ze=Je=>{var ut=$d();d(Je,ut)};X(Ve,Je=>{e(ue).isNew&&Je(ze)})}h(Ae),h(te);var nt=M(te,2);{var rr=Je=>{var ut=Rd();Fr(ut,()=>e(ue).line_html,!0),h(ut),d(Je,ut)},yr=O(()=>e(q).has(e(ue).fingerprint));X(nt,Je=>{e(yr)&&Je(rr)})}h(je),Q(Je=>{ke(je,1,`error-item ${Je??""}`),re(xe,`${e(ue).case_id??""} / ${e(ue).file??""} : ${e(ue).severity??""}`)},[()=>m(e(ue).severity)]),ie("click",te,()=>g(e(ue).fingerprint)),d(oe,je)}),h(_e);var De=M(_e,2);{var be=oe=>{var ue=Md(),je=k(ue),te=k(je);h(je);var J=M(je,2);{var ae=xe=>{var Ae=Nd(),me=k(Ae);h(Ae),Q(fe=>re(me,`${fe??""} new`),[()=>e(x).filter(fe=>fe.isNew).length]),d(xe,Ae)},de=O(()=>e(x).some(xe=>xe.isNew));X(J,xe=>{e(de)&&xe(ae)})}h(ue),Q(()=>re(te,`${e(x).length??""} unique / ${e(N).length??""} total`)),d(oe,ue)};X(De,oe=>{e(W).length>0&&oe(be)})}var He=M(De,2);{var Ie=oe=>{var ue=Td(),je=k(ue,!0);h(ue),Q(()=>re(je,e(T))),d(oe,ue)};X(He,oe=>{e(T)&&oe(Ie)})}Q(()=>ke(_e,1,`error-list ${e(p)?"opacity-50 pointer-events-none":""}`)),d(Y,le)},$$slots:{actions:!0,default:!0}}),Te()}qe(["input","change","click"]);var Fd=E('
            Developed by Simvia
            ',1);function Bd(t,r){Me(r,!0);let a=D(se({totalCases:0,shownCases:0,totalRunning:0,shownRunning:0,totalConverged:0,shownConverged:0})),n=D(se([]));Ee(()=>{_n(),ur(()=>void $a())}),Ee(()=>{const l=$t(),C=document.querySelector('link[rel="icon"]');C&&(l!=null&&l.icon)&&(C.href=Ts(l.solver))});async function o(){try{const l=await Es();Al(l.rows),Ll(l.doe_columns),v(n,l.rows.map(C=>C.case_id),!0),v(a,Gl(Aa(),zr()),!0)}catch(l){console.error("Failed to load status:",l)}}fn(()=>{o()});var s=Fd(),i=B(s);Hi(i,{});var c=M(i,2);qi(c,{});var u=M(c,2);fl(u,{get totalCases(){return e(a).totalCases},get shownCases(){return e(a).shownCases},get totalRunning(){return e(a).totalRunning},get shownRunning(){return e(a).shownRunning},get totalConverged(){return e(a).totalConverged},get shownConverged(){return e(a).shownConverged}});var w=M(u,2),p=k(w);{var T=l=>{kc(l,{onRefresh:o})},y=O(()=>Tt("status"));X(p,l=>{e(y)&&l(T)})}var N=M(p,2);{var A=l=>{qc(l,{get allCases(){return e(n)}})},b=O(()=>Tt("residuals"));X(N,l=>{e(b)&&l(A)})}var f=M(N,2);{var _=l=>{hu(l,{get allCases(){return e(n)}})},P=O(()=>Tt("probes"));X(f,l=>{e(P)&&l(_)})}var x=M(f,2);{var S=l=>{Pu(l,{get allCases(){return e(n)}})},R=O(()=>Tt("performance"));X(x,l=>{e(R)&&l(S)})}var m=M(x,2);{var $=l=>{hd(l,{get allCases(){return e(n)}})},F=O(()=>Tt("compare"));X(m,l=>{e(F)&&l($)})}var L=M(m,2);{var j=l=>{Gu(l,{get allCases(){return e(n)}})},z=O(()=>Tt("tail"));X(L,l=>{e(z)&&l(j)})}var V=M(L,2);{var I=l=>{Ld(l,{get allCases(){return e(n)}})},G=O(()=>Tt("errors"));X(V,l=>{e(G)&&l(I)})}h(w);var U=M(w,2),q=M(k(U),2),g=k(q);h(q),h(U),Q(()=>ye(g,"src",vl)),d(t,s),Te()}export{Bd as component}; diff --git a/frontend/dist/_app/version.json b/frontend/dist/_app/version.json index bfac1cc..fafb841 100644 --- a/frontend/dist/_app/version.json +++ b/frontend/dist/_app/version.json @@ -1 +1 @@ -{"version":"1791385109868"} \ No newline at end of file +{"version":"1791387960077"} \ No newline at end of file diff --git a/frontend/dist/index.html b/frontend/dist/index.html index 38a87f0..817198c 100644 --- a/frontend/dist/index.html +++ b/frontend/dist/index.html @@ -5,11 +5,11 @@ csauto by Simvia - - + + - + @@ -20,15 +20,15 @@ -{#if state.files.length > 0} + +{#if allCases.length > 0} files.filter((f) => { const stem = f.replace(/\.csv$/i, "").toLowerCase(); @@ -132,13 +127,18 @@ let emptyMessage = $derived( state.selectedCases.length === 0 ? "Please select at least one case." - : state.selectedColumns.length === 0 - ? "Please select at least one probe." - : "No data to display.", + : state.files.length === 0 + ? "No probe data for the selected cases yet." + : state.selectedColumns.length === 0 + ? "Please select at least one probe." + : "No data to display.", ); -{#if state.files.length > 0} + +{#if allCases.length > 0} Date: Thu, 8 Oct 2026 15:27:29 +0200 Subject: [PATCH 21/21] fix: clear the dashboard's svelte-check errors and make the check gate CI Switch to @lucide/svelte, whose icons are Svelte 5 components, rename the residual plot's local state so it no longer reads as the $state rune, declare the probes tab snippet outside CardShell so it is not also passed as a prop, and remove the unused DoeColumnSelector, which imported a setter that no longer exists. --- .github/workflows/pr.yml | 1 - CHANGELOG.md | 2 + .../dist/_app/immutable/chunks/B-WYSyZB.js | 1 + .../dist/_app/immutable/chunks/BXYPVkmX.js | 1 - .../dist/_app/immutable/chunks/BeON-0X8.js | 2 - .../dist/_app/immutable/chunks/C1tKzvKE.js | 1 + .../dist/_app/immutable/chunks/C4rlClDa.js | 2 + .../dist/_app/immutable/chunks/CiUbu-1F.js | 1 - .../dist/_app/immutable/chunks/Cz6m6K8p.js | 1 - .../dist/_app/immutable/chunks/D2EIOFXK.js | 1 + .../dist/_app/immutable/chunks/D3-3j-uT.js | 1 + .../dist/_app/immutable/chunks/DmjnTBOd.js | 1 - .../dist/_app/immutable/chunks/Dy37i2LO.js | 1 + .../chunks/{C14P8jaG.js => IT17IssP.js} | 2 +- .../dist/_app/immutable/chunks/VJhVTb1A.js | 1 - .../chunks/{U5yjBaoU.js => lwvwhigX.js} | 2 +- .../dist/_app/immutable/chunks/zf4GFcxs.js | 1 - .../dist/_app/immutable/entry/app.CLLGSh1d.js | 2 + .../dist/_app/immutable/entry/app.NhX3oHgD.js | 2 - .../_app/immutable/entry/start.CX0ijzGM.js | 1 + .../_app/immutable/entry/start.IoRlyKBR.js | 1 - .../nodes/{0.DecrOZwe.js => 0.BKQJkT-6.js} | 2 +- .../dist/_app/immutable/nodes/1.DViJQCF5.js | 1 + .../dist/_app/immutable/nodes/1.Dgk6ayWt.js | 1 - .../dist/_app/immutable/nodes/2.BBO8YVsu.js | 1001 ----------------- .../dist/_app/immutable/nodes/2.D9x-OSY6.js | 44 + frontend/dist/_app/version.json | 2 +- frontend/dist/index.html | 24 +- frontend/package.json | 6 +- frontend/pnpm-lock.yaml | 30 +- .../lib/components/compare/CompareCard.svelte | 2 +- .../components/errors/RecentErrorsCard.svelte | 2 +- .../src/lib/components/hero/HeroBanner.svelte | 2 +- .../performance/PerformanceCard.svelte | 2 +- .../components/plots/ResidualPlotCard.svelte | 57 +- .../lib/components/probes/ProbesCard.svelte | 73 +- .../probes/ProfileProbePanel.svelte | 2 +- .../components/probes/TimeProbePanel.svelte | 2 +- .../components/shared/ActionMenuButton.svelte | 2 +- .../src/lib/components/shared/Dropdown.svelte | 2 +- .../src/lib/components/shared/Icon.svelte | 6 +- .../components/shared/MultiDropdown.svelte | 2 +- .../src/lib/components/shared/Select.svelte | 2 +- .../status/DoeColumnSelector.svelte | 78 -- .../lib/components/status/StatusCard.svelte | 2 +- .../lib/components/status/StatusTable.svelte | 2 +- .../lib/components/status/ViewManager.svelte | 2 +- .../lib/components/tail/LogTailCard.svelte | 2 +- 48 files changed, 174 insertions(+), 1207 deletions(-) create mode 100644 frontend/dist/_app/immutable/chunks/B-WYSyZB.js delete mode 100644 frontend/dist/_app/immutable/chunks/BXYPVkmX.js delete mode 100644 frontend/dist/_app/immutable/chunks/BeON-0X8.js create mode 100644 frontend/dist/_app/immutable/chunks/C1tKzvKE.js create mode 100644 frontend/dist/_app/immutable/chunks/C4rlClDa.js delete mode 100644 frontend/dist/_app/immutable/chunks/CiUbu-1F.js delete mode 100644 frontend/dist/_app/immutable/chunks/Cz6m6K8p.js create mode 100644 frontend/dist/_app/immutable/chunks/D2EIOFXK.js create mode 100644 frontend/dist/_app/immutable/chunks/D3-3j-uT.js delete mode 100644 frontend/dist/_app/immutable/chunks/DmjnTBOd.js create mode 100644 frontend/dist/_app/immutable/chunks/Dy37i2LO.js rename frontend/dist/_app/immutable/chunks/{C14P8jaG.js => IT17IssP.js} (61%) delete mode 100644 frontend/dist/_app/immutable/chunks/VJhVTb1A.js rename frontend/dist/_app/immutable/chunks/{U5yjBaoU.js => lwvwhigX.js} (94%) delete mode 100644 frontend/dist/_app/immutable/chunks/zf4GFcxs.js create mode 100644 frontend/dist/_app/immutable/entry/app.CLLGSh1d.js delete mode 100644 frontend/dist/_app/immutable/entry/app.NhX3oHgD.js create mode 100644 frontend/dist/_app/immutable/entry/start.CX0ijzGM.js delete mode 100644 frontend/dist/_app/immutable/entry/start.IoRlyKBR.js rename frontend/dist/_app/immutable/nodes/{0.DecrOZwe.js => 0.BKQJkT-6.js} (63%) create mode 100644 frontend/dist/_app/immutable/nodes/1.DViJQCF5.js delete mode 100644 frontend/dist/_app/immutable/nodes/1.Dgk6ayWt.js delete mode 100644 frontend/dist/_app/immutable/nodes/2.BBO8YVsu.js create mode 100644 frontend/dist/_app/immutable/nodes/2.D9x-OSY6.js delete mode 100644 frontend/src/lib/components/status/DoeColumnSelector.svelte diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index 8b9a08f..cd092ba 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -67,7 +67,6 @@ jobs: - name: Svelte check working-directory: frontend run: pnpm check - continue-on-error: true - name: Prettier check working-directory: frontend diff --git a/CHANGELOG.md b/CHANGELOG.md index a86751e..08adce7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -38,6 +38,8 @@ Make csauto ready for solvers other than code_saturne: one adapter class describ - The solver boundary test now scans every module outside `csauto/solvers/` for a wider set of code_saturne conventions (`listing`, `monitoring`, `run_solver.log`, `performance.log`, ...), with the deliberate residue listed in one named allowlist. The leaks it found are gone: the read-only `MESH` mount is the new adapter attribute `readonly_shared_dir_names`, and `csauto tail` defaults to the solver's main log instead of `listing` - Dashboard tabs are now declared by each solver adapter in `dashboard_panels`, and by nothing else: an adapter may leave out a tab it could feed, and Status, Log Tail and Recent Errors are ordinary entries rather than imposed. A test fails when an adapter declares a tab it cannot feed or an unknown tab name. `capabilities` stays derived. No visible change for any shipped solver +- The dashboard uses `@lucide/svelte`, the Svelte 5 build of its icon set, instead of `lucide-svelte`. `pnpm check` now reports no errors and gates CI again + ### Fixed - On macOS, a run launched by `csauto serve` no longer stays RUNNING after it ends: the server reaps its own finished processes, since there is no /proc to spot them - Clean resetting a code_aster case to PREPARED no longer flips back to DONE or FAILED at the next refresh (the reset now clears the start time, so the kept `csauto.stdout` is not read as a verdict) diff --git a/frontend/dist/_app/immutable/chunks/B-WYSyZB.js b/frontend/dist/_app/immutable/chunks/B-WYSyZB.js new file mode 100644 index 0000000..4542e85 --- /dev/null +++ b/frontend/dist/_app/immutable/chunks/B-WYSyZB.js @@ -0,0 +1 @@ +var te=t=>{throw TypeError(t)};var je=(t,e,n)=>e.has(t)||te("Cannot "+n);var v=(t,e,n)=>(je(t,e,"read from private field"),n?n.call(t):e.get(t)),U=(t,e,n)=>e.has(t)?te("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(t):e.set(t,n);import{be as Ut,bi as Ne,aK as T,D as I,a0 as O,aJ as mt,bj as De}from"./D2EIOFXK.js";import{o as ee}from"./C1tKzvKE.js";const B=[];function qt(t,e=Ut){let n=null;const a=new Set;function r(o){if(Ne(t,o)&&(t=o,n)){const l=!B.length;for(const c of a)c[1](),B.push(c,t);if(l){for(let c=0;c{a.delete(c),a.size===0&&n&&(n(),n=null)}}return{set:r,update:i,subscribe:s}}class Vt{constructor(e,n){this.status=e,typeof n=="string"?this.body={message:n}:n?this.body=n:this.body={message:`Error: ${e}`}}toString(){return JSON.stringify(this.body)}}class Kt{constructor(e,n){this.status=e,this.location=n}}class Bt extends Error{constructor(e,n,a){super(a),this.status=e,this.text=n}}new URL("sveltekit-internal://");function qe(t,e){return t==="/"||e==="ignore"?t:e==="never"?t.endsWith("/")?t.slice(0,-1):t:e==="always"&&!t.endsWith("/")?t+"/":t}function Ve(t){return t.split("%25").map(decodeURI).join("%25")}function Ke(t){for(const e in t)t[e]=decodeURIComponent(t[e]);return t}function Tt({href:t}){return t.split("#")[0]}function Be(...t){let e=5381;for(const n of t)if(typeof n=="string"){let a=n.length;for(;a;)e=e*33^n.charCodeAt(--a)}else if(ArrayBuffer.isView(n)){const a=new Uint8Array(n.buffer,n.byteOffset,n.byteLength);let r=a.length;for(;r;)e=e*33^a[--r]}else throw new TypeError("value must be a string or TypedArray");return(e>>>0).toString(36)}new TextEncoder;new TextDecoder;function Me(t){const e=atob(t),n=new Uint8Array(e.length);for(let a=0;a((t instanceof Request?t.method:(e==null?void 0:e.method)||"GET")!=="GET"&&H.delete(Mt(t)),ze(t,e));const H=new Map;function Fe(t,e){const n=Mt(t,e),a=document.querySelector(n);if(a!=null&&a.textContent){a.remove();let{body:r,...i}=JSON.parse(a.textContent);const s=a.getAttribute("data-ttl");return s&&H.set(n,{body:r,init:i,ttl:1e3*Number(s)}),a.getAttribute("data-b64")!==null&&(r=Me(r)),Promise.resolve(new Response(r,i))}return window.fetch(t,e)}function Ge(t,e,n){if(H.size>0){const a=Mt(t,n),r=H.get(a);if(r){if(performance.now(){const r=/^\[\.\.\.(\w+)(?:=(\w+))?\]$/.exec(a);if(r)return e.push({name:r[1],matcher:r[2],optional:!1,rest:!0,chained:!0}),"(?:/([^]*))?";const i=/^\[\[(\w+)(?:=(\w+))?\]\]$/.exec(a);if(i)return e.push({name:i[1],matcher:i[2],optional:!0,rest:!1,chained:!0}),"(?:/([^/]+))?";if(!a)return;const s=a.split(/\[(.+?)\](?!\])/);return"/"+s.map((l,c)=>{if(c%2){if(l.startsWith("x+"))return It(String.fromCharCode(parseInt(l.slice(2),16)));if(l.startsWith("u+"))return It(String.fromCharCode(...l.slice(2).split("-").map(m=>parseInt(m,16))));const d=We.exec(l),[,u,w,p,f]=d;return e.push({name:p,matcher:f,optional:!!u,rest:!!w,chained:w?c===1&&s[0]==="":!1}),w?"([^]*?)":u?"([^/]*)?":"([^/]+?)"}return It(l)}).join("")}).join("")}/?$`),params:e}}function Ye(t){return t!==""&&!/^\([^)]+\)$/.test(t)}function He(t){return t.slice(1).split("/").filter(Ye)}function Xe(t,e,n){const a={},r=t.slice(1),i=r.filter(o=>o!==void 0);let s=0;for(let o=0;od).join("/"),s=0),c===void 0)if(l.rest)c="";else continue;if(!l.matcher||n[l.matcher](c)){a[l.name]=c;const d=e[o+1],u=r[o+1];d&&!d.rest&&d.optional&&u&&l.chained&&(s=0),!d&&!u&&Object.keys(a).length===i.length&&(s=0);continue}if(l.optional&&l.chained){s++;continue}return}if(!s)return a}function It(t){return t.normalize().replace(/[[\]]/g,"\\$&").replace(/%/g,"%25").replace(/\//g,"%2[Ff]").replace(/\?/g,"%3[Ff]").replace(/#/g,"%23").replace(/[.*+?^${}()|\\]/g,"\\$&")}function Qe({nodes:t,server_loads:e,dictionary:n,matchers:a}){const r=new Set(e);return Object.entries(n).map(([o,[l,c,d]])=>{const{pattern:u,params:w}=Je(o),p={id:o,exec:f=>{const m=u.exec(f);if(m)return Xe(m,w,a)},errors:[1,...d||[]].map(f=>t[f]),layouts:[0,...c||[]].map(s),leaf:i(l)};return p.errors.length=p.layouts.length=Math.max(p.errors.length,p.layouts.length),p});function i(o){const l=o<0;return l&&(o=~o),[l,t[o]]}function s(o){return o===void 0?o:[r.has(o),t[o]]}}function ge(t,e=JSON.parse){try{return e(sessionStorage[t])}catch{}}function ne(t,e,n=JSON.stringify){const a=n(e);try{sessionStorage[t]=a}catch{}}var fe;const A=((fe=globalThis.__sveltekit_8dgavl)==null?void 0:fe.base)??"";var ue;const Ze=((ue=globalThis.__sveltekit_8dgavl)==null?void 0:ue.assets)??A??"",tn="1791465900433",me="sveltekit:snapshot",_e="sveltekit:scroll",we="sveltekit:states",en="sveltekit:pageurl",z="sveltekit:history",Q="sveltekit:navigation",D={tap:1,hover:2,viewport:3,eager:4,off:-1,false:-1},zt=location.origin;function ve(t){if(t instanceof URL)return t;let e=document.baseURI;if(!e){const n=document.getElementsByTagName("base");e=n.length?n[0].href:document.URL}return new URL(t,e)}function V(){return{x:pageXOffset,y:pageYOffset}}function M(t,e){return t.getAttribute(`data-sveltekit-${e}`)}const re={...D,"":D.hover};function ye(t){let e=t.assignedSlot??t.parentNode;return(e==null?void 0:e.nodeType)===11&&(e=e.host),e}function be(t,e){for(;t&&t!==e;){if(t.nodeName.toUpperCase()==="A"&&t.hasAttribute("href"))return t;t=ye(t)}}function $t(t,e,n){let a;try{if(a=new URL(t instanceof SVGAElement?t.href.baseVal:t.href,document.baseURI),n&&a.hash.match(/^#[^/]/)){const o=location.hash.split("#")[1]||"/";a.hash=`#${o}${a.hash}`}}catch{}const r=t instanceof SVGAElement?t.target.baseVal:t.target,i=!a||!!r||Rt(a,e,n)||(t.getAttribute("rel")||"").split(/\s+/).includes("external"),s=(a==null?void 0:a.origin)===zt&&t.hasAttribute("download");return{url:a,external:i,target:r,download:s}}function _t(t){let e=null,n=null,a=null,r=null,i=null,s=null,o=t;for(;o&&o!==document.documentElement;)a===null&&(a=M(o,"preload-code")),r===null&&(r=M(o,"preload-data")),e===null&&(e=M(o,"keepfocus")),n===null&&(n=M(o,"noscroll")),i===null&&(i=M(o,"reload")),s===null&&(s=M(o,"replacestate")),o=ye(o);function l(c){switch(c){case"":case"true":return!0;case"off":case"false":return!1;default:return}}return{preload_code:re[a??"off"],preload_data:re[r??"off"],keepfocus:l(e),noscroll:l(n),reload:l(i),replace_state:l(s)}}function ae(t){const e=qt(t);let n=!0;function a(){n=!0,e.update(s=>s)}function r(s){n=!1,e.set(s)}function i(s){let o;return e.subscribe(l=>{(o===void 0||n&&l!==o)&&s(o=l)})}return{notify:a,set:r,subscribe:i}}const ke={v:()=>{}};function nn(){const{set:t,subscribe:e}=qt(!1);let n;async function a(){clearTimeout(n);try{const r=await fetch(`${Ze}/_app/version.json`,{headers:{pragma:"no-cache","cache-control":"no-cache"}});if(!r.ok)return!1;const s=(await r.json()).version!==tn;return s&&(t(!0),ke.v(),clearTimeout(n)),s}catch{return!1}}return{subscribe:e,check:a}}function Rt(t,e,n){return t.origin!==zt||!t.pathname.startsWith(e)?!0:n?t.pathname!==location.pathname:!1}function On(t){}const Se=new Set(["load","prerender","csr","ssr","trailingSlash","config"]);[...Se];const rn=new Set([...Se]);[...rn];function an(t){return t.filter(e=>e!=null)}function Ft(t){return t instanceof Vt||t instanceof Bt?t.status:500}function on(t){return t instanceof Bt?t.text:"Internal Error"}let R,Z,Ot;const sn=ee.toString().includes("$$")||/function \w+\(\) \{\}/.test(ee.toString()),oe="a:";var at,ot,st,it,lt,ct,ft,ut,de,dt,he,ht,pe;sn?(R={data:{},form:null,error:null,params:{},route:{id:null},state:{},status:-1,url:new URL(oe)},Z={current:null},Ot={current:!1}):(R=new(de=class{constructor(){U(this,at,T({}));U(this,ot,T(null));U(this,st,T(null));U(this,it,T({}));U(this,lt,T({id:null}));U(this,ct,T({}));U(this,ft,T(-1));U(this,ut,T(new URL(oe)))}get data(){return I(v(this,at))}set data(e){O(v(this,at),e)}get form(){return I(v(this,ot))}set form(e){O(v(this,ot),e)}get error(){return I(v(this,st))}set error(e){O(v(this,st),e)}get params(){return I(v(this,it))}set params(e){O(v(this,it),e)}get route(){return I(v(this,lt))}set route(e){O(v(this,lt),e)}get state(){return I(v(this,ct))}set state(e){O(v(this,ct),e)}get status(){return I(v(this,ft))}set status(e){O(v(this,ft),e)}get url(){return I(v(this,ut))}set url(e){O(v(this,ut),e)}},at=new WeakMap,ot=new WeakMap,st=new WeakMap,it=new WeakMap,lt=new WeakMap,ct=new WeakMap,ft=new WeakMap,ut=new WeakMap,de),Z=new(he=class{constructor(){U(this,dt,T(null))}get current(){return I(v(this,dt))}set current(e){O(v(this,dt),e)}},dt=new WeakMap,he),Ot=new(pe=class{constructor(){U(this,ht,T(!1))}get current(){return I(v(this,ht))}set current(e){O(v(this,ht),e)}},ht=new WeakMap,pe),ke.v=()=>Ot.current=!0);function ln(t){Object.assign(R,t)}const cn=new Set(["icon","shortcut icon","apple-touch-icon"]);let J=null;const j=ge(_e)??{},tt=ge(me)??{},C={url:ae({}),page:ae({}),navigating:qt(null),updated:nn()};function Gt(t){j[t]=V()}function fn(t,e){let n=t+1;for(;j[n];)delete j[n],n+=1;for(n=e+1;tt[n];)delete tt[n],n+=1}function et(t,e=!1){return e?location.replace(t.href):location.href=t.href,new Promise(()=>{})}async function Ee(){if("serviceWorker"in navigator){const t=await navigator.serviceWorker.getRegistration(A||"/");t&&await t.update()}}function se(){}let Wt,Ct,wt,P,jt,S;const vt=[],yt=[];let y=null;function Nt(){var t;(t=y==null?void 0:y.fork)==null||t.then(e=>e==null?void 0:e.discard()),y=null}const gt=new Map,Re=new Set,un=new Set,X=new Set;let _={branch:[],error:null,url:null},xe=!1,bt=!1,ie=!0,nt=!1,Y=!1,Le=!1,Jt=!1,Ae,k,L,q;const kt=new Set,le=new Map;async function jn(t,e,n){var i,s,o,l,c;(i=globalThis.__sveltekit_8dgavl)!=null&&i.data&&globalThis.__sveltekit_8dgavl.data,document.URL!==location.href&&(location.href=location.href),S=t,await((o=(s=t.hooks).init)==null?void 0:o.call(s)),Wt=Qe(t),P=document.documentElement,jt=e,Ct=t.nodes[0],wt=t.nodes[1],Ct(),wt(),k=(l=history.state)==null?void 0:l[z],L=(c=history.state)==null?void 0:c[Q],k||(k=L=Date.now(),history.replaceState({...history.state,[z]:k,[Q]:L},""));const a=j[k];function r(){a&&(history.scrollRestoration="manual",scrollTo(a.x,a.y))}n?(r(),await Rn(jt,n)):(await F({type:"enter",url:ve(S.hash?An(new URL(location.href)):location.href),replace_state:!0}),r()),En()}function dn(){vt.length=0,Jt=!1}function Ue(t){yt.some(e=>e==null?void 0:e.snapshot)&&(tt[t]=yt.map(e=>{var n;return(n=e==null?void 0:e.snapshot)==null?void 0:n.capture()}))}function Te(t){var e;(e=tt[t])==null||e.forEach((n,a)=>{var r,i;(i=(r=yt[a])==null?void 0:r.snapshot)==null||i.restore(n)})}function ce(){Gt(k),ne(_e,j),Ue(L),ne(me,tt)}async function hn(t,e,n,a){let r;e.invalidateAll&&Nt(),await F({type:"goto",url:ve(t),keepfocus:e.keepFocus,noscroll:e.noScroll,replace_state:e.replaceState,state:e.state,redirect_count:n,nav_token:a,accept:()=>{e.invalidateAll&&(Jt=!0,r=[...le.keys()]),e.invalidate&&e.invalidate.forEach(Sn)}}),e.invalidateAll&&mt().then(mt).then(()=>{le.forEach(({resource:i},s)=>{var o;r!=null&&r.includes(s)&&((o=i.refresh)==null||o.call(i))})})}async function pn(t){if(t.id!==(y==null?void 0:y.id)){Nt();const e={};kt.add(e),y={id:t.id,token:e,promise:Oe({...t,preload:e}).then(n=>(kt.delete(e),n.type==="loaded"&&n.state.error&&Nt(),n)),fork:null}}return y.promise}async function Pt(t){var n;const e=(n=await xt(t,!1))==null?void 0:n.route;e&&await Promise.all([...e.layouts,e.leaf].filter(Boolean).map(a=>a[1]()))}async function Ie(t,e,n){var i;const a={params:_.params,route:{id:((i=_.route)==null?void 0:i.id)??null},url:new URL(location.href)};_={...t.state,nav:a};const r=document.querySelector("style[data-sveltekit]");if(r&&r.remove(),Object.assign(R,t.props.page),Ae=new S.root({target:e,props:{...t.props,stores:C,components:yt},hydrate:n,sync:!1,transformError:void 0}),await Promise.resolve(),Te(L),n){const s={from:null,to:{...a,scroll:j[k]??V()},willUnload:!1,type:"enter",complete:Promise.resolve()};X.forEach(o=>o(s))}bt=!0}async function St({url:t,params:e,branch:n,errors:a,status:r,error:i,route:s,form:o}){let l="never";if(A&&(t.pathname===A||t.pathname===A+"/"))l="always";else for(const f of n)(f==null?void 0:f.slash)!==void 0&&(l=f.slash);t.pathname=qe(t.pathname,l),t.search=t.search;const c={type:"loaded",state:{url:t,params:e,branch:n,error:i,route:s},props:{constructors:an(n).map(f=>f.node.component),page:Zt(R)}};o!==void 0&&(c.props.form=o);let d={},u=!R,w=0;for(let f=0;fo(new URL(s))))return!0;return!1}function Ht(t,e){return(t==null?void 0:t.type)==="data"?t:(t==null?void 0:t.type)==="skip"?e??null:null}function _n(t,e){if(!t)return new Set(e.searchParams.keys());const n=new Set([...t.searchParams.keys(),...e.searchParams.keys()]);for(const a of n){const r=t.searchParams.getAll(a),i=e.searchParams.getAll(a);r.every(s=>i.includes(s))&&i.every(s=>r.includes(s))&&n.delete(a)}return n}function wn({error:t,url:e,route:n,params:a}){return{type:"loaded",state:{error:t,url:e,route:n,params:a,branch:[]},props:{page:Zt(R),constructors:[]}}}async function Oe({id:t,invalidating:e,url:n,params:a,route:r,preload:i}){if((y==null?void 0:y.id)===t)return kt.delete(y.token),y.promise;const{errors:s,layouts:o,leaf:l}=r,c=[...o,l];s.forEach(h=>h==null?void 0:h().catch(()=>{})),c.forEach(h=>h==null?void 0:h[1]().catch(()=>{}));const d=_.url?t!==Et(_.url):!1,u=_.route?r.id!==_.route.id:!1,w=_n(_.url,n);let p=!1;const f=c.map(async(h,g)=>{var $;if(!h)return;const b=_.branch[g];return h[1]===(b==null?void 0:b.loader)&&!mn(p,u,d,w,($=b.universal)==null?void 0:$.uses,a)?b:(p=!0,Yt({loader:h[1],url:n,params:a,route:r,parent:async()=>{var pt;const N={};for(let K=0;K{});const m=[];for(let h=0;hPromise.resolve({}),server_data_node:Ht(i)}),o={node:await wt(),loader:wt,universal:null,server:null,data:null};return St({url:n,params:r,branch:[s,o],status:t,error:e,errors:[],route:null})}catch(s){if(s instanceof Kt)return hn(new URL(s.location,location.href),{},0);throw s}}async function yn(t){const e=t.href;if(gt.has(e))return gt.get(e);let n;try{const a=(async()=>{let r=await S.hooks.reroute({url:new URL(t),fetch:async(i,s)=>gn(i,s,t).promise})??t;if(typeof r=="string"){const i=new URL(t);S.hash?i.hash=r:i.pathname=r,r=i}return r})();gt.set(e,a),n=await a}catch{gt.delete(e);return}return n}async function xt(t,e){if(t&&!Rt(t,A,S.hash)){const n=await yn(t);if(!n)return;const a=bn(n);for(const r of Wt){const i=r.exec(a);if(i)return{id:Et(t),invalidating:e,route:r,params:Ke(i),url:t}}}}function bn(t){return Ve(S.hash?t.hash.replace(/^#/,"").replace(/[?#].+/,""):t.pathname.slice(A.length))||"/"}function Et(t){return(S.hash?t.hash.replace(/^#/,""):t.pathname)+t.search}function Pe({url:t,type:e,intent:n,delta:a,event:r,scroll:i}){let s=!1;const o=Qt(_,n,t,e,i??null);a!==void 0&&(o.navigation.delta=a),r!==void 0&&(o.navigation.event=r);const l={...o.navigation,cancel:()=>{s=!0,o.reject(new Error("navigation cancelled"))}};return nt||Re.forEach(c=>c(l)),s?null:o}async function F({type:t,url:e,popped:n,keepfocus:a,noscroll:r,replace_state:i,state:s={},redirect_count:o=0,nav_token:l={},accept:c=se,block:d=se,event:u}){var K;const w=q;q=l;const p=await xt(e,!1),f=t==="enter"?Qt(_,p,e,t):Pe({url:e,type:t,delta:n==null?void 0:n.delta,intent:p,scroll:n==null?void 0:n.scroll,event:u});if(!f){d(),q===l&&(q=w);return}const m=k,h=L;c(),nt=!0,bt&&f.navigation.type!=="enter"&&C.navigating.set(Z.current=f.navigation);let g=p&&await Oe(p);if(!g){if(Rt(e,A,S.hash))return await et(e,i);g=await $e(e,{id:null},await rt(new Bt(404,"Not Found",`Not found: ${e.pathname}`),{url:e,params:{},route:{id:null}}),404,i)}if(e=(p==null?void 0:p.url)||e,q!==l)return f.reject(new Error("navigation aborted")),!1;if(g.type==="redirect"){if(o<20){await F({type:t,url:new URL(g.location,e),popped:n,keepfocus:a,noscroll:r,replace_state:i,state:s,redirect_count:o+1,nav_token:l}),f.fulfil(void 0);return}g=await Xt({status:500,error:await rt(new Error("Redirect loop"),{url:e,params:{},route:{id:null}}),url:e,route:{id:null}})}else g.props.page.status>=400&&await C.updated.check()&&(await Ee(),await et(e,i));if(dn(),Gt(m),Ue(h),g.props.page.url.pathname!==e.pathname&&(e.pathname=g.props.page.url.pathname),s=n?n.state:s,!n){const E=i?0:1,G={[z]:k+=E,[Q]:L+=E,[we]:s};(i?history.replaceState:history.pushState).call(history,G,"",e),i||fn(k,L)}const b=p&&(y==null?void 0:y.id)===p.id?y.fork:null;y=null,g.props.page.state=s;let x;if(bt){const E=(await Promise.all(Array.from(un,W=>W(f.navigation)))).filter(W=>typeof W=="function");if(E.length>0){let W=function(){E.forEach(At=>{X.delete(At)})};E.push(W),E.forEach(At=>{X.add(At)})}const G=f.navigation.to;_={...g.state,nav:{params:G.params,route:G.route,url:G.url}},g.props.page&&(g.props.page.url=e);const Lt=b&&await b;Lt?x=Lt.commit():(J=null,Ae.$set(g.props),J&&Object.assign(g.props.page,J),ln(g.props.page),x=(K=De)==null?void 0:K()),Le=!0}else await Ie(g,jt,!1);const{activeElement:$}=document;await x,await mt(),await mt();let N=null;if(ie){const E=n?n.scroll:r?V():null;E?scrollTo(E.x,E.y):(N=e.hash&&document.getElementById(Ce(e)))?N.scrollIntoView():scrollTo(0,0)}const pt=document.activeElement!==$&&document.activeElement!==document.body;!a&&!pt&&Ln(e,!N),ie=!0,g.props.page&&(J&&Object.assign(g.props.page,J),Object.assign(R,g.props.page)),nt=!1,t==="popstate"&&Te(L),f.fulfil(void 0),f.navigation.to&&(f.navigation.to.scroll=V()),X.forEach(E=>E(f.navigation)),C.navigating.set(Z.current=null)}async function $e(t,e,n,a,r){return t.origin===zt&&t.pathname===location.pathname&&!xe?await Xt({status:a,error:n,url:t,route:e}):await et(t,r)}function kn(){let t,e={element:void 0,href:void 0},n;P.addEventListener("mousemove",o=>{const l=o.target;clearTimeout(t),t=setTimeout(()=>{i(l,D.hover)},20)});function a(o){o.defaultPrevented||i(o.composedPath()[0],D.tap)}P.addEventListener("mousedown",a),P.addEventListener("touchstart",a,{passive:!0});const r=new IntersectionObserver(o=>{for(const l of o)l.isIntersecting&&(Pt(new URL(l.target.href)),r.unobserve(l.target))},{threshold:0});async function i(o,l){const c=be(o,P),d=c===e.element&&(c==null?void 0:c.href)===e.href&&l>=n;if(!c||d)return;const{url:u,external:w,download:p}=$t(c,A,S.hash);if(w||p)return;const f=_t(c),m=u&&Et(_.url)===Et(u);if(!(f.reload||m))if(l<=f.preload_data){e={element:c,href:c.href},n=D.tap;const h=await xt(u,!1);if(!h)return;pn(h)}else l<=f.preload_code&&(e={element:c,href:c.href},n=l,Pt(u))}function s(){r.disconnect();for(const o of P.querySelectorAll("a")){const{url:l,external:c,download:d}=$t(o,A,S.hash);if(c||d)continue;const u=_t(o);u.reload||(u.preload_code===D.viewport&&r.observe(o),u.preload_code===D.eager&&Pt(l))}}X.add(s),s()}function rt(t,e){if(t instanceof Vt)return t.body;const n=Ft(t),a=on(t);return S.hooks.handleError({error:t,event:e,status:n,message:a})??{message:a}}function Sn(t){if(typeof t=="function")vt.push(t);else{const{href:e}=new URL(t,location.href);vt.push(n=>n.href===e)}}function En(){var e;history.scrollRestoration="manual",addEventListener("beforeunload",n=>{let a=!1;if(ce(),!nt){const r=Qt(_,void 0,null,"leave"),i={...r.navigation,cancel:()=>{a=!0,r.reject(new Error("navigation cancelled"))}};Re.forEach(s=>s(i))}a?(n.preventDefault(),n.returnValue=""):history.scrollRestoration="auto"}),addEventListener("visibilitychange",()=>{document.visibilityState==="hidden"&&ce()}),(e=navigator.connection)!=null&&e.saveData||kn(),P.addEventListener("click",async n=>{if(n.button||n.which!==1||n.metaKey||n.ctrlKey||n.shiftKey||n.altKey||n.defaultPrevented)return;const a=be(n.composedPath()[0],P);if(!a)return;const{url:r,external:i,target:s,download:o}=$t(a,A,S.hash);if(!r)return;if(s==="_parent"||s==="_top"){if(window.parent!==window)return}else if(s&&s!=="_self")return;const l=_t(a);if(!(a instanceof SVGAElement)&&r.protocol!==location.protocol&&!(r.protocol==="https:"||r.protocol==="http:")||o)return;const[d,u]=(S.hash?r.hash.replace(/^#/,""):r.href).split("#"),w=d===Tt(location);if(i||l.reload&&(!w||!u)){Pe({url:r,type:"link",event:n})?nt=!0:n.preventDefault();return}if(u!==void 0&&w){const[,p]=_.url.href.split("#");if(p===u){if(n.preventDefault(),u===""||u==="top"&&a.ownerDocument.getElementById("top")===null)scrollTo({top:0});else{const f=a.ownerDocument.getElementById(decodeURIComponent(u));f&&(f.scrollIntoView(),f.focus())}return}if(Y=!0,Gt(k),t(r),!l.replace_state)return;Y=!1}n.preventDefault(),await new Promise(p=>{requestAnimationFrame(()=>{setTimeout(p,0)}),setTimeout(p,100)}),await F({type:"link",url:r,keepfocus:l.keepfocus,noscroll:l.noscroll,replace_state:l.replace_state??r.href===location.href,event:n})}),P.addEventListener("submit",n=>{if(n.defaultPrevented)return;const a=HTMLFormElement.prototype.cloneNode.call(n.target),r=n.submitter;if(((r==null?void 0:r.formTarget)||a.target)==="_blank"||((r==null?void 0:r.formMethod)||a.method)!=="get")return;const o=new URL((r==null?void 0:r.hasAttribute("formaction"))&&(r==null?void 0:r.formAction)||a.action);if(Rt(o,A,!1))return;const l=n.target,c=_t(l);if(c.reload)return;n.preventDefault(),n.stopPropagation();const d=new FormData(l,r);o.search=new URLSearchParams(d).toString(),F({type:"form",url:o,keepfocus:c.keepfocus,noscroll:c.noscroll,replace_state:c.replace_state??o.href===location.href,event:n})}),addEventListener("popstate",async n=>{var a;if(!Dt){if((a=n.state)!=null&&a[z]){const r=n.state[z];if(q={},r===k)return;const i=j[r],s=n.state[we]??{},o=new URL(n.state[en]??location.href),l=n.state[Q],c=_.url?Tt(location)===Tt(_.url):!1;if(l===L&&(Le||c)){s!==R.state&&(R.state=s),t(o),j[k]=V(),i&&scrollTo(i.x,i.y),k=r;return}const u=r-k;await F({type:"popstate",url:o,popped:{state:s,scroll:i,delta:u},accept:()=>{k=r,L=l},block:()=>{history.go(-u)},nav_token:q,event:n})}else if(!Y){const r=new URL(location.href);t(r),S.hash&&location.reload()}}}),addEventListener("hashchange",()=>{Y&&(Y=!1,history.replaceState({...history.state,[z]:++k,[Q]:L},"",location.href))});for(const n of document.querySelectorAll("link"))cn.has(n.rel)&&(n.href=n.href);addEventListener("pageshow",n=>{n.persisted&&C.navigating.set(Z.current=null)});function t(n){_.url=R.url=n,C.page.set(Zt(R)),C.page.notify()}}async function Rn(t,{status:e=200,error:n,node_ids:a,params:r,route:i,server_route:s,data:o,form:l}){xe=!0;const c=new URL(location.href);let d;({params:r={},route:i={id:null}}=await xt(c,!1)||{}),d=Wt.find(({id:p})=>p===i.id);let u,w=!0;try{const p=a.map(async(m,h)=>{const g=o[h];return g!=null&&g.uses&&(g.uses=xn(g.uses)),Yt({loader:S.nodes[m],url:c,params:r,route:i,parent:async()=>{const b={};for(let x=0;x{const o=history.state;Dt=!0,location.replace(new URL(`#${a}`,location.href)),history.replaceState(o,"",t),e&&scrollTo(i,s),Dt=!1})}else{const i=document.body,s=i.getAttribute("tabindex");i.tabIndex=-1,i.focus({preventScroll:!0,focusVisible:!1}),s!==null?i.setAttribute("tabindex",s):i.removeAttribute("tabindex")}const r=getSelection();if(r&&r.type!=="None"){const i=[];for(let s=0;s{if(r.rangeCount===i.length){for(let s=0;s{i=u,s=w});return o.catch(()=>{}),{navigation:{from:{params:t.params,route:{id:((c=t.route)==null?void 0:c.id)??null},url:t.url,scroll:V()},to:n&&{params:(e==null?void 0:e.params)??null,route:{id:((d=e==null?void 0:e.route)==null?void 0:d.id)??null},url:n,scroll:r},willUnload:!e,type:a,complete:o},fulfil:i,reject:s}}function Zt(t){return{data:t.data,error:t.error,form:t.form,params:t.params,route:t.route,state:t.state,status:t.status,url:t.url}}function An(t){const e=new URL(t);return e.hash=decodeURIComponent(t.hash),e}function Ce(t){let e;if(S.hash){const[,,n]=t.hash.split("#",3);e=n??""}else e=t.hash.slice(1);return decodeURIComponent(e)}export{jn as a,On as l,R as p,C as s}; diff --git a/frontend/dist/_app/immutable/chunks/BXYPVkmX.js b/frontend/dist/_app/immutable/chunks/BXYPVkmX.js deleted file mode 100644 index 21a51d5..0000000 --- a/frontend/dist/_app/immutable/chunks/BXYPVkmX.js +++ /dev/null @@ -1 +0,0 @@ -var te=t=>{throw TypeError(t)};var je=(t,e,n)=>e.has(t)||te("Cannot "+n);var v=(t,e,n)=>(je(t,e,"read from private field"),n?n.call(t):e.get(t)),U=(t,e,n)=>e.has(t)?te("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(t):e.set(t,n);import{bf as Ut,bg as Ne,aK as T,o as I,$ as O,aJ as mt,bh as qe}from"./VJhVTb1A.js";import{o as ee}from"./Cz6m6K8p.js";const B=[];function Dt(t,e=Ut){let n=null;const a=new Set;function r(o){if(Ne(t,o)&&(t=o,n)){const l=!B.length;for(const c of a)c[1](),B.push(c,t);if(l){for(let c=0;c{a.delete(c),a.size===0&&n&&(n(),n=null)}}return{set:r,update:i,subscribe:s}}class Vt{constructor(e,n){this.status=e,typeof n=="string"?this.body={message:n}:n?this.body=n:this.body={message:`Error: ${e}`}}toString(){return JSON.stringify(this.body)}}class Kt{constructor(e,n){this.status=e,this.location=n}}class Bt extends Error{constructor(e,n,a){super(a),this.status=e,this.text=n}}new URL("sveltekit-internal://");function De(t,e){return t==="/"||e==="ignore"?t:e==="never"?t.endsWith("/")?t.slice(0,-1):t:e==="always"&&!t.endsWith("/")?t+"/":t}function Ve(t){return t.split("%25").map(decodeURI).join("%25")}function Ke(t){for(const e in t)t[e]=decodeURIComponent(t[e]);return t}function Tt({href:t}){return t.split("#")[0]}function Be(...t){let e=5381;for(const n of t)if(typeof n=="string"){let a=n.length;for(;a;)e=e*33^n.charCodeAt(--a)}else if(ArrayBuffer.isView(n)){const a=new Uint8Array(n.buffer,n.byteOffset,n.byteLength);let r=a.length;for(;r;)e=e*33^a[--r]}else throw new TypeError("value must be a string or TypedArray");return(e>>>0).toString(36)}new TextEncoder;new TextDecoder;function Me(t){const e=atob(t),n=new Uint8Array(e.length);for(let a=0;a((t instanceof Request?t.method:(e==null?void 0:e.method)||"GET")!=="GET"&&H.delete(Mt(t)),ze(t,e));const H=new Map;function Fe(t,e){const n=Mt(t,e),a=document.querySelector(n);if(a!=null&&a.textContent){a.remove();let{body:r,...i}=JSON.parse(a.textContent);const s=a.getAttribute("data-ttl");return s&&H.set(n,{body:r,init:i,ttl:1e3*Number(s)}),a.getAttribute("data-b64")!==null&&(r=Me(r)),Promise.resolve(new Response(r,i))}return window.fetch(t,e)}function Ge(t,e,n){if(H.size>0){const a=Mt(t,n),r=H.get(a);if(r){if(performance.now(){const r=/^\[\.\.\.(\w+)(?:=(\w+))?\]$/.exec(a);if(r)return e.push({name:r[1],matcher:r[2],optional:!1,rest:!0,chained:!0}),"(?:/([^]*))?";const i=/^\[\[(\w+)(?:=(\w+))?\]\]$/.exec(a);if(i)return e.push({name:i[1],matcher:i[2],optional:!0,rest:!1,chained:!0}),"(?:/([^/]+))?";if(!a)return;const s=a.split(/\[(.+?)\](?!\])/);return"/"+s.map((l,c)=>{if(c%2){if(l.startsWith("x+"))return It(String.fromCharCode(parseInt(l.slice(2),16)));if(l.startsWith("u+"))return It(String.fromCharCode(...l.slice(2).split("-").map(m=>parseInt(m,16))));const d=We.exec(l),[,u,w,p,f]=d;return e.push({name:p,matcher:f,optional:!!u,rest:!!w,chained:w?c===1&&s[0]==="":!1}),w?"([^]*?)":u?"([^/]*)?":"([^/]+?)"}return It(l)}).join("")}).join("")}/?$`),params:e}}function Ye(t){return t!==""&&!/^\([^)]+\)$/.test(t)}function He(t){return t.slice(1).split("/").filter(Ye)}function Xe(t,e,n){const a={},r=t.slice(1),i=r.filter(o=>o!==void 0);let s=0;for(let o=0;od).join("/"),s=0),c===void 0)if(l.rest)c="";else continue;if(!l.matcher||n[l.matcher](c)){a[l.name]=c;const d=e[o+1],u=r[o+1];d&&!d.rest&&d.optional&&u&&l.chained&&(s=0),!d&&!u&&Object.keys(a).length===i.length&&(s=0);continue}if(l.optional&&l.chained){s++;continue}return}if(!s)return a}function It(t){return t.normalize().replace(/[[\]]/g,"\\$&").replace(/%/g,"%25").replace(/\//g,"%2[Ff]").replace(/\?/g,"%3[Ff]").replace(/#/g,"%23").replace(/[.*+?^${}()|\\]/g,"\\$&")}function Qe({nodes:t,server_loads:e,dictionary:n,matchers:a}){const r=new Set(e);return Object.entries(n).map(([o,[l,c,d]])=>{const{pattern:u,params:w}=Je(o),p={id:o,exec:f=>{const m=u.exec(f);if(m)return Xe(m,w,a)},errors:[1,...d||[]].map(f=>t[f]),layouts:[0,...c||[]].map(s),leaf:i(l)};return p.errors.length=p.layouts.length=Math.max(p.errors.length,p.layouts.length),p});function i(o){const l=o<0;return l&&(o=~o),[l,t[o]]}function s(o){return o===void 0?o:[r.has(o),t[o]]}}function ge(t,e=JSON.parse){try{return e(sessionStorage[t])}catch{}}function ne(t,e,n=JSON.stringify){const a=n(e);try{sessionStorage[t]=a}catch{}}var fe;const A=((fe=globalThis.__sveltekit_tesrq2)==null?void 0:fe.base)??"";var ue;const Ze=((ue=globalThis.__sveltekit_tesrq2)==null?void 0:ue.assets)??A??"",tn="1791465414043",me="sveltekit:snapshot",_e="sveltekit:scroll",we="sveltekit:states",en="sveltekit:pageurl",z="sveltekit:history",Q="sveltekit:navigation",q={tap:1,hover:2,viewport:3,eager:4,off:-1,false:-1},zt=location.origin;function ve(t){if(t instanceof URL)return t;let e=document.baseURI;if(!e){const n=document.getElementsByTagName("base");e=n.length?n[0].href:document.URL}return new URL(t,e)}function V(){return{x:pageXOffset,y:pageYOffset}}function M(t,e){return t.getAttribute(`data-sveltekit-${e}`)}const re={...q,"":q.hover};function ye(t){let e=t.assignedSlot??t.parentNode;return(e==null?void 0:e.nodeType)===11&&(e=e.host),e}function be(t,e){for(;t&&t!==e;){if(t.nodeName.toUpperCase()==="A"&&t.hasAttribute("href"))return t;t=ye(t)}}function $t(t,e,n){let a;try{if(a=new URL(t instanceof SVGAElement?t.href.baseVal:t.href,document.baseURI),n&&a.hash.match(/^#[^/]/)){const o=location.hash.split("#")[1]||"/";a.hash=`#${o}${a.hash}`}}catch{}const r=t instanceof SVGAElement?t.target.baseVal:t.target,i=!a||!!r||Rt(a,e,n)||(t.getAttribute("rel")||"").split(/\s+/).includes("external"),s=(a==null?void 0:a.origin)===zt&&t.hasAttribute("download");return{url:a,external:i,target:r,download:s}}function _t(t){let e=null,n=null,a=null,r=null,i=null,s=null,o=t;for(;o&&o!==document.documentElement;)a===null&&(a=M(o,"preload-code")),r===null&&(r=M(o,"preload-data")),e===null&&(e=M(o,"keepfocus")),n===null&&(n=M(o,"noscroll")),i===null&&(i=M(o,"reload")),s===null&&(s=M(o,"replacestate")),o=ye(o);function l(c){switch(c){case"":case"true":return!0;case"off":case"false":return!1;default:return}}return{preload_code:re[a??"off"],preload_data:re[r??"off"],keepfocus:l(e),noscroll:l(n),reload:l(i),replace_state:l(s)}}function ae(t){const e=Dt(t);let n=!0;function a(){n=!0,e.update(s=>s)}function r(s){n=!1,e.set(s)}function i(s){let o;return e.subscribe(l=>{(o===void 0||n&&l!==o)&&s(o=l)})}return{notify:a,set:r,subscribe:i}}const ke={v:()=>{}};function nn(){const{set:t,subscribe:e}=Dt(!1);let n;async function a(){clearTimeout(n);try{const r=await fetch(`${Ze}/_app/version.json`,{headers:{pragma:"no-cache","cache-control":"no-cache"}});if(!r.ok)return!1;const s=(await r.json()).version!==tn;return s&&(t(!0),ke.v(),clearTimeout(n)),s}catch{return!1}}return{subscribe:e,check:a}}function Rt(t,e,n){return t.origin!==zt||!t.pathname.startsWith(e)?!0:n?t.pathname!==location.pathname:!1}function On(t){}const Se=new Set(["load","prerender","csr","ssr","trailingSlash","config"]);[...Se];const rn=new Set([...Se]);[...rn];function an(t){return t.filter(e=>e!=null)}function Ft(t){return t instanceof Vt||t instanceof Bt?t.status:500}function on(t){return t instanceof Bt?t.text:"Internal Error"}let R,Z,Ot;const sn=ee.toString().includes("$$")||/function \w+\(\) \{\}/.test(ee.toString()),oe="a:";var at,ot,st,it,lt,ct,ft,ut,de,dt,he,ht,pe;sn?(R={data:{},form:null,error:null,params:{},route:{id:null},state:{},status:-1,url:new URL(oe)},Z={current:null},Ot={current:!1}):(R=new(de=class{constructor(){U(this,at,T({}));U(this,ot,T(null));U(this,st,T(null));U(this,it,T({}));U(this,lt,T({id:null}));U(this,ct,T({}));U(this,ft,T(-1));U(this,ut,T(new URL(oe)))}get data(){return I(v(this,at))}set data(e){O(v(this,at),e)}get form(){return I(v(this,ot))}set form(e){O(v(this,ot),e)}get error(){return I(v(this,st))}set error(e){O(v(this,st),e)}get params(){return I(v(this,it))}set params(e){O(v(this,it),e)}get route(){return I(v(this,lt))}set route(e){O(v(this,lt),e)}get state(){return I(v(this,ct))}set state(e){O(v(this,ct),e)}get status(){return I(v(this,ft))}set status(e){O(v(this,ft),e)}get url(){return I(v(this,ut))}set url(e){O(v(this,ut),e)}},at=new WeakMap,ot=new WeakMap,st=new WeakMap,it=new WeakMap,lt=new WeakMap,ct=new WeakMap,ft=new WeakMap,ut=new WeakMap,de),Z=new(he=class{constructor(){U(this,dt,T(null))}get current(){return I(v(this,dt))}set current(e){O(v(this,dt),e)}},dt=new WeakMap,he),Ot=new(pe=class{constructor(){U(this,ht,T(!1))}get current(){return I(v(this,ht))}set current(e){O(v(this,ht),e)}},ht=new WeakMap,pe),ke.v=()=>Ot.current=!0);function ln(t){Object.assign(R,t)}const cn=new Set(["icon","shortcut icon","apple-touch-icon"]);let J=null;const j=ge(_e)??{},tt=ge(me)??{},C={url:ae({}),page:ae({}),navigating:Dt(null),updated:nn()};function Gt(t){j[t]=V()}function fn(t,e){let n=t+1;for(;j[n];)delete j[n],n+=1;for(n=e+1;tt[n];)delete tt[n],n+=1}function et(t,e=!1){return e?location.replace(t.href):location.href=t.href,new Promise(()=>{})}async function Ee(){if("serviceWorker"in navigator){const t=await navigator.serviceWorker.getRegistration(A||"/");t&&await t.update()}}function se(){}let Wt,Ct,wt,P,jt,S;const vt=[],yt=[];let y=null;function Nt(){var t;(t=y==null?void 0:y.fork)==null||t.then(e=>e==null?void 0:e.discard()),y=null}const gt=new Map,Re=new Set,un=new Set,X=new Set;let _={branch:[],error:null,url:null},xe=!1,bt=!1,ie=!0,nt=!1,Y=!1,Le=!1,Jt=!1,Ae,k,L,D;const kt=new Set,le=new Map;async function jn(t,e,n){var i,s,o,l,c;(i=globalThis.__sveltekit_tesrq2)!=null&&i.data&&globalThis.__sveltekit_tesrq2.data,document.URL!==location.href&&(location.href=location.href),S=t,await((o=(s=t.hooks).init)==null?void 0:o.call(s)),Wt=Qe(t),P=document.documentElement,jt=e,Ct=t.nodes[0],wt=t.nodes[1],Ct(),wt(),k=(l=history.state)==null?void 0:l[z],L=(c=history.state)==null?void 0:c[Q],k||(k=L=Date.now(),history.replaceState({...history.state,[z]:k,[Q]:L},""));const a=j[k];function r(){a&&(history.scrollRestoration="manual",scrollTo(a.x,a.y))}n?(r(),await Rn(jt,n)):(await F({type:"enter",url:ve(S.hash?An(new URL(location.href)):location.href),replace_state:!0}),r()),En()}function dn(){vt.length=0,Jt=!1}function Ue(t){yt.some(e=>e==null?void 0:e.snapshot)&&(tt[t]=yt.map(e=>{var n;return(n=e==null?void 0:e.snapshot)==null?void 0:n.capture()}))}function Te(t){var e;(e=tt[t])==null||e.forEach((n,a)=>{var r,i;(i=(r=yt[a])==null?void 0:r.snapshot)==null||i.restore(n)})}function ce(){Gt(k),ne(_e,j),Ue(L),ne(me,tt)}async function hn(t,e,n,a){let r;e.invalidateAll&&Nt(),await F({type:"goto",url:ve(t),keepfocus:e.keepFocus,noscroll:e.noScroll,replace_state:e.replaceState,state:e.state,redirect_count:n,nav_token:a,accept:()=>{e.invalidateAll&&(Jt=!0,r=[...le.keys()]),e.invalidate&&e.invalidate.forEach(Sn)}}),e.invalidateAll&&mt().then(mt).then(()=>{le.forEach(({resource:i},s)=>{var o;r!=null&&r.includes(s)&&((o=i.refresh)==null||o.call(i))})})}async function pn(t){if(t.id!==(y==null?void 0:y.id)){Nt();const e={};kt.add(e),y={id:t.id,token:e,promise:Oe({...t,preload:e}).then(n=>(kt.delete(e),n.type==="loaded"&&n.state.error&&Nt(),n)),fork:null}}return y.promise}async function Pt(t){var n;const e=(n=await xt(t,!1))==null?void 0:n.route;e&&await Promise.all([...e.layouts,e.leaf].filter(Boolean).map(a=>a[1]()))}async function Ie(t,e,n){var i;const a={params:_.params,route:{id:((i=_.route)==null?void 0:i.id)??null},url:new URL(location.href)};_={...t.state,nav:a};const r=document.querySelector("style[data-sveltekit]");if(r&&r.remove(),Object.assign(R,t.props.page),Ae=new S.root({target:e,props:{...t.props,stores:C,components:yt},hydrate:n,sync:!1,transformError:void 0}),await Promise.resolve(),Te(L),n){const s={from:null,to:{...a,scroll:j[k]??V()},willUnload:!1,type:"enter",complete:Promise.resolve()};X.forEach(o=>o(s))}bt=!0}async function St({url:t,params:e,branch:n,errors:a,status:r,error:i,route:s,form:o}){let l="never";if(A&&(t.pathname===A||t.pathname===A+"/"))l="always";else for(const f of n)(f==null?void 0:f.slash)!==void 0&&(l=f.slash);t.pathname=De(t.pathname,l),t.search=t.search;const c={type:"loaded",state:{url:t,params:e,branch:n,error:i,route:s},props:{constructors:an(n).map(f=>f.node.component),page:Zt(R)}};o!==void 0&&(c.props.form=o);let d={},u=!R,w=0;for(let f=0;fo(new URL(s))))return!0;return!1}function Ht(t,e){return(t==null?void 0:t.type)==="data"?t:(t==null?void 0:t.type)==="skip"?e??null:null}function _n(t,e){if(!t)return new Set(e.searchParams.keys());const n=new Set([...t.searchParams.keys(),...e.searchParams.keys()]);for(const a of n){const r=t.searchParams.getAll(a),i=e.searchParams.getAll(a);r.every(s=>i.includes(s))&&i.every(s=>r.includes(s))&&n.delete(a)}return n}function wn({error:t,url:e,route:n,params:a}){return{type:"loaded",state:{error:t,url:e,route:n,params:a,branch:[]},props:{page:Zt(R),constructors:[]}}}async function Oe({id:t,invalidating:e,url:n,params:a,route:r,preload:i}){if((y==null?void 0:y.id)===t)return kt.delete(y.token),y.promise;const{errors:s,layouts:o,leaf:l}=r,c=[...o,l];s.forEach(h=>h==null?void 0:h().catch(()=>{})),c.forEach(h=>h==null?void 0:h[1]().catch(()=>{}));const d=_.url?t!==Et(_.url):!1,u=_.route?r.id!==_.route.id:!1,w=_n(_.url,n);let p=!1;const f=c.map(async(h,g)=>{var $;if(!h)return;const b=_.branch[g];return h[1]===(b==null?void 0:b.loader)&&!mn(p,u,d,w,($=b.universal)==null?void 0:$.uses,a)?b:(p=!0,Yt({loader:h[1],url:n,params:a,route:r,parent:async()=>{var pt;const N={};for(let K=0;K{});const m=[];for(let h=0;hPromise.resolve({}),server_data_node:Ht(i)}),o={node:await wt(),loader:wt,universal:null,server:null,data:null};return St({url:n,params:r,branch:[s,o],status:t,error:e,errors:[],route:null})}catch(s){if(s instanceof Kt)return hn(new URL(s.location,location.href),{},0);throw s}}async function yn(t){const e=t.href;if(gt.has(e))return gt.get(e);let n;try{const a=(async()=>{let r=await S.hooks.reroute({url:new URL(t),fetch:async(i,s)=>gn(i,s,t).promise})??t;if(typeof r=="string"){const i=new URL(t);S.hash?i.hash=r:i.pathname=r,r=i}return r})();gt.set(e,a),n=await a}catch{gt.delete(e);return}return n}async function xt(t,e){if(t&&!Rt(t,A,S.hash)){const n=await yn(t);if(!n)return;const a=bn(n);for(const r of Wt){const i=r.exec(a);if(i)return{id:Et(t),invalidating:e,route:r,params:Ke(i),url:t}}}}function bn(t){return Ve(S.hash?t.hash.replace(/^#/,"").replace(/[?#].+/,""):t.pathname.slice(A.length))||"/"}function Et(t){return(S.hash?t.hash.replace(/^#/,""):t.pathname)+t.search}function Pe({url:t,type:e,intent:n,delta:a,event:r,scroll:i}){let s=!1;const o=Qt(_,n,t,e,i??null);a!==void 0&&(o.navigation.delta=a),r!==void 0&&(o.navigation.event=r);const l={...o.navigation,cancel:()=>{s=!0,o.reject(new Error("navigation cancelled"))}};return nt||Re.forEach(c=>c(l)),s?null:o}async function F({type:t,url:e,popped:n,keepfocus:a,noscroll:r,replace_state:i,state:s={},redirect_count:o=0,nav_token:l={},accept:c=se,block:d=se,event:u}){var K;const w=D;D=l;const p=await xt(e,!1),f=t==="enter"?Qt(_,p,e,t):Pe({url:e,type:t,delta:n==null?void 0:n.delta,intent:p,scroll:n==null?void 0:n.scroll,event:u});if(!f){d(),D===l&&(D=w);return}const m=k,h=L;c(),nt=!0,bt&&f.navigation.type!=="enter"&&C.navigating.set(Z.current=f.navigation);let g=p&&await Oe(p);if(!g){if(Rt(e,A,S.hash))return await et(e,i);g=await $e(e,{id:null},await rt(new Bt(404,"Not Found",`Not found: ${e.pathname}`),{url:e,params:{},route:{id:null}}),404,i)}if(e=(p==null?void 0:p.url)||e,D!==l)return f.reject(new Error("navigation aborted")),!1;if(g.type==="redirect"){if(o<20){await F({type:t,url:new URL(g.location,e),popped:n,keepfocus:a,noscroll:r,replace_state:i,state:s,redirect_count:o+1,nav_token:l}),f.fulfil(void 0);return}g=await Xt({status:500,error:await rt(new Error("Redirect loop"),{url:e,params:{},route:{id:null}}),url:e,route:{id:null}})}else g.props.page.status>=400&&await C.updated.check()&&(await Ee(),await et(e,i));if(dn(),Gt(m),Ue(h),g.props.page.url.pathname!==e.pathname&&(e.pathname=g.props.page.url.pathname),s=n?n.state:s,!n){const E=i?0:1,G={[z]:k+=E,[Q]:L+=E,[we]:s};(i?history.replaceState:history.pushState).call(history,G,"",e),i||fn(k,L)}const b=p&&(y==null?void 0:y.id)===p.id?y.fork:null;y=null,g.props.page.state=s;let x;if(bt){const E=(await Promise.all(Array.from(un,W=>W(f.navigation)))).filter(W=>typeof W=="function");if(E.length>0){let W=function(){E.forEach(At=>{X.delete(At)})};E.push(W),E.forEach(At=>{X.add(At)})}const G=f.navigation.to;_={...g.state,nav:{params:G.params,route:G.route,url:G.url}},g.props.page&&(g.props.page.url=e);const Lt=b&&await b;Lt?x=Lt.commit():(J=null,Ae.$set(g.props),J&&Object.assign(g.props.page,J),ln(g.props.page),x=(K=qe)==null?void 0:K()),Le=!0}else await Ie(g,jt,!1);const{activeElement:$}=document;await x,await mt(),await mt();let N=null;if(ie){const E=n?n.scroll:r?V():null;E?scrollTo(E.x,E.y):(N=e.hash&&document.getElementById(Ce(e)))?N.scrollIntoView():scrollTo(0,0)}const pt=document.activeElement!==$&&document.activeElement!==document.body;!a&&!pt&&Ln(e,!N),ie=!0,g.props.page&&(J&&Object.assign(g.props.page,J),Object.assign(R,g.props.page)),nt=!1,t==="popstate"&&Te(L),f.fulfil(void 0),f.navigation.to&&(f.navigation.to.scroll=V()),X.forEach(E=>E(f.navigation)),C.navigating.set(Z.current=null)}async function $e(t,e,n,a,r){return t.origin===zt&&t.pathname===location.pathname&&!xe?await Xt({status:a,error:n,url:t,route:e}):await et(t,r)}function kn(){let t,e={element:void 0,href:void 0},n;P.addEventListener("mousemove",o=>{const l=o.target;clearTimeout(t),t=setTimeout(()=>{i(l,q.hover)},20)});function a(o){o.defaultPrevented||i(o.composedPath()[0],q.tap)}P.addEventListener("mousedown",a),P.addEventListener("touchstart",a,{passive:!0});const r=new IntersectionObserver(o=>{for(const l of o)l.isIntersecting&&(Pt(new URL(l.target.href)),r.unobserve(l.target))},{threshold:0});async function i(o,l){const c=be(o,P),d=c===e.element&&(c==null?void 0:c.href)===e.href&&l>=n;if(!c||d)return;const{url:u,external:w,download:p}=$t(c,A,S.hash);if(w||p)return;const f=_t(c),m=u&&Et(_.url)===Et(u);if(!(f.reload||m))if(l<=f.preload_data){e={element:c,href:c.href},n=q.tap;const h=await xt(u,!1);if(!h)return;pn(h)}else l<=f.preload_code&&(e={element:c,href:c.href},n=l,Pt(u))}function s(){r.disconnect();for(const o of P.querySelectorAll("a")){const{url:l,external:c,download:d}=$t(o,A,S.hash);if(c||d)continue;const u=_t(o);u.reload||(u.preload_code===q.viewport&&r.observe(o),u.preload_code===q.eager&&Pt(l))}}X.add(s),s()}function rt(t,e){if(t instanceof Vt)return t.body;const n=Ft(t),a=on(t);return S.hooks.handleError({error:t,event:e,status:n,message:a})??{message:a}}function Sn(t){if(typeof t=="function")vt.push(t);else{const{href:e}=new URL(t,location.href);vt.push(n=>n.href===e)}}function En(){var e;history.scrollRestoration="manual",addEventListener("beforeunload",n=>{let a=!1;if(ce(),!nt){const r=Qt(_,void 0,null,"leave"),i={...r.navigation,cancel:()=>{a=!0,r.reject(new Error("navigation cancelled"))}};Re.forEach(s=>s(i))}a?(n.preventDefault(),n.returnValue=""):history.scrollRestoration="auto"}),addEventListener("visibilitychange",()=>{document.visibilityState==="hidden"&&ce()}),(e=navigator.connection)!=null&&e.saveData||kn(),P.addEventListener("click",async n=>{if(n.button||n.which!==1||n.metaKey||n.ctrlKey||n.shiftKey||n.altKey||n.defaultPrevented)return;const a=be(n.composedPath()[0],P);if(!a)return;const{url:r,external:i,target:s,download:o}=$t(a,A,S.hash);if(!r)return;if(s==="_parent"||s==="_top"){if(window.parent!==window)return}else if(s&&s!=="_self")return;const l=_t(a);if(!(a instanceof SVGAElement)&&r.protocol!==location.protocol&&!(r.protocol==="https:"||r.protocol==="http:")||o)return;const[d,u]=(S.hash?r.hash.replace(/^#/,""):r.href).split("#"),w=d===Tt(location);if(i||l.reload&&(!w||!u)){Pe({url:r,type:"link",event:n})?nt=!0:n.preventDefault();return}if(u!==void 0&&w){const[,p]=_.url.href.split("#");if(p===u){if(n.preventDefault(),u===""||u==="top"&&a.ownerDocument.getElementById("top")===null)scrollTo({top:0});else{const f=a.ownerDocument.getElementById(decodeURIComponent(u));f&&(f.scrollIntoView(),f.focus())}return}if(Y=!0,Gt(k),t(r),!l.replace_state)return;Y=!1}n.preventDefault(),await new Promise(p=>{requestAnimationFrame(()=>{setTimeout(p,0)}),setTimeout(p,100)}),await F({type:"link",url:r,keepfocus:l.keepfocus,noscroll:l.noscroll,replace_state:l.replace_state??r.href===location.href,event:n})}),P.addEventListener("submit",n=>{if(n.defaultPrevented)return;const a=HTMLFormElement.prototype.cloneNode.call(n.target),r=n.submitter;if(((r==null?void 0:r.formTarget)||a.target)==="_blank"||((r==null?void 0:r.formMethod)||a.method)!=="get")return;const o=new URL((r==null?void 0:r.hasAttribute("formaction"))&&(r==null?void 0:r.formAction)||a.action);if(Rt(o,A,!1))return;const l=n.target,c=_t(l);if(c.reload)return;n.preventDefault(),n.stopPropagation();const d=new FormData(l,r);o.search=new URLSearchParams(d).toString(),F({type:"form",url:o,keepfocus:c.keepfocus,noscroll:c.noscroll,replace_state:c.replace_state??o.href===location.href,event:n})}),addEventListener("popstate",async n=>{var a;if(!qt){if((a=n.state)!=null&&a[z]){const r=n.state[z];if(D={},r===k)return;const i=j[r],s=n.state[we]??{},o=new URL(n.state[en]??location.href),l=n.state[Q],c=_.url?Tt(location)===Tt(_.url):!1;if(l===L&&(Le||c)){s!==R.state&&(R.state=s),t(o),j[k]=V(),i&&scrollTo(i.x,i.y),k=r;return}const u=r-k;await F({type:"popstate",url:o,popped:{state:s,scroll:i,delta:u},accept:()=>{k=r,L=l},block:()=>{history.go(-u)},nav_token:D,event:n})}else if(!Y){const r=new URL(location.href);t(r),S.hash&&location.reload()}}}),addEventListener("hashchange",()=>{Y&&(Y=!1,history.replaceState({...history.state,[z]:++k,[Q]:L},"",location.href))});for(const n of document.querySelectorAll("link"))cn.has(n.rel)&&(n.href=n.href);addEventListener("pageshow",n=>{n.persisted&&C.navigating.set(Z.current=null)});function t(n){_.url=R.url=n,C.page.set(Zt(R)),C.page.notify()}}async function Rn(t,{status:e=200,error:n,node_ids:a,params:r,route:i,server_route:s,data:o,form:l}){xe=!0;const c=new URL(location.href);let d;({params:r={},route:i={id:null}}=await xt(c,!1)||{}),d=Wt.find(({id:p})=>p===i.id);let u,w=!0;try{const p=a.map(async(m,h)=>{const g=o[h];return g!=null&&g.uses&&(g.uses=xn(g.uses)),Yt({loader:S.nodes[m],url:c,params:r,route:i,parent:async()=>{const b={};for(let x=0;x{const o=history.state;qt=!0,location.replace(new URL(`#${a}`,location.href)),history.replaceState(o,"",t),e&&scrollTo(i,s),qt=!1})}else{const i=document.body,s=i.getAttribute("tabindex");i.tabIndex=-1,i.focus({preventScroll:!0,focusVisible:!1}),s!==null?i.setAttribute("tabindex",s):i.removeAttribute("tabindex")}const r=getSelection();if(r&&r.type!=="None"){const i=[];for(let s=0;s{if(r.rangeCount===i.length){for(let s=0;s{i=u,s=w});return o.catch(()=>{}),{navigation:{from:{params:t.params,route:{id:((c=t.route)==null?void 0:c.id)??null},url:t.url,scroll:V()},to:n&&{params:(e==null?void 0:e.params)??null,route:{id:((d=e==null?void 0:e.route)==null?void 0:d.id)??null},url:n,scroll:r},willUnload:!e,type:a,complete:o},fulfil:i,reject:s}}function Zt(t){return{data:t.data,error:t.error,form:t.form,params:t.params,route:t.route,state:t.state,status:t.status,url:t.url}}function An(t){const e=new URL(t);return e.hash=decodeURIComponent(t.hash),e}function Ce(t){let e;if(S.hash){const[,,n]=t.hash.split("#",3);e=n??""}else e=t.hash.slice(1);return decodeURIComponent(e)}export{jn as a,On as l,R as p,C as s}; diff --git a/frontend/dist/_app/immutable/chunks/BeON-0X8.js b/frontend/dist/_app/immutable/chunks/BeON-0X8.js deleted file mode 100644 index 3c59a0f..0000000 --- a/frontend/dist/_app/immutable/chunks/BeON-0X8.js +++ /dev/null @@ -1,2 +0,0 @@ -var Oe=Object.defineProperty;var he=t=>{throw TypeError(t)};var Fe=(t,e,r)=>e in t?Oe(t,e,{enumerable:!0,configurable:!0,writable:!0,value:r}):t[e]=r;var q=(t,e,r)=>Fe(t,typeof e!="symbol"?e+"":e,r),re=(t,e,r)=>e.has(t)||he("Cannot "+r);var s=(t,e,r)=>(re(t,e,"read from private field"),r?r.call(t):e.get(t)),u=(t,e,r)=>e.has(t)?he("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(t):e.set(t,r),n=(t,e,r,a)=>(re(t,e,"write to private field"),a?a.call(t,r):e.set(t,r),r),p=(t,e,r)=>(re(t,e,"access private method"),r);import{ac as Le,o as be,U as Ie,a7 as Ee,k as Me,ad as de,ae as H,f as L,h as I,F as V,af as _e,b as xe,J as Ce,ag as Pe,ah as pe,a as F,c as me,p as se,e as ge,m as Ve,ai as Be,a9 as X,aj as K,ak as ve,al as We,am as He,an as we,i as Te,ao as Ye,d as ie,L as Z,ap as je,O as ze,aq as $,E as qe,ar as $e,as as Ge,at as Ue,au as Je,av as Qe,aw as Xe,ax as ae,G as Ke,ay as Se,Q as Ze,az as et,aA as ne,P as G,aB as tt,aC as rt,aD as st,aE as it,x as at,aF as nt,aG as ot,z as ft}from"./VJhVTb1A.js";import{b as lt}from"./C14P8jaG.js";function ct(t){let e=0,r=Ee(0),a;return()=>{Le()&&(be(r),Ie(()=>(e===0&&(a=Me(()=>t(()=>de(r)))),e+=1,()=>{H(()=>{e-=1,e===0&&(a==null||a(),a=void 0,de(r))})})))}}var ut=qe|$e;function ht(t,e,r,a){new dt(t,e,r,a)}var E,Y,T,x,g,S,m,w,k,C,N,B,j,z,A,ee,l,ke,Ae,Re,oe,J,Q,fe;class dt{constructor(e,r,a,f){u(this,l);q(this,"parent");q(this,"is_pending",!1);q(this,"transform_error");u(this,E);u(this,Y,I?L:null);u(this,T);u(this,x);u(this,g);u(this,S,null);u(this,m,null);u(this,w,null);u(this,k,null);u(this,C,0);u(this,N,0);u(this,B,!1);u(this,j,new Set);u(this,z,new Set);u(this,A,null);u(this,ee,ct(()=>(n(this,A,Ee(s(this,C))),()=>{n(this,A,null)})));var i;n(this,E,e),n(this,T,r),n(this,x,o=>{var d=V;d.b=this,d.f|=_e,a(o)}),this.parent=V.b,this.transform_error=f??((i=this.parent)==null?void 0:i.transform_error)??(o=>o),n(this,g,xe(()=>{if(I){const o=s(this,Y);Ce();const d=o.data===Pe;if(o.data.startsWith(pe)){const h=JSON.parse(o.data.slice(pe.length));p(this,l,Ae).call(this,h)}else d?p(this,l,Re).call(this):p(this,l,ke).call(this)}else p(this,l,oe).call(this)},ut)),I&&n(this,E,L)}defer_effect(e){Be(e,s(this,j),s(this,z))}is_rendered(){return!this.is_pending&&(!this.parent||this.parent.is_rendered())}has_pending_snippet(){return!!s(this,T).pending}update_pending_count(e,r){p(this,l,fe).call(this,e,r),n(this,C,s(this,C)+e),!(!s(this,A)||s(this,B))&&(n(this,B,!0),H(()=>{n(this,B,!1),s(this,A)&&Ye(s(this,A),s(this,C))}))}get_effect_pending(){return s(this,ee).call(this),be(s(this,A))}error(e){var r=s(this,T).onerror;let a=s(this,T).failed;if(!r&&!a)throw e;s(this,S)&&(ie(s(this,S)),n(this,S,null)),s(this,m)&&(ie(s(this,m)),n(this,m,null)),s(this,w)&&(ie(s(this,w)),n(this,w,null)),I&&(Z(s(this,Y)),je(),Z(ze()));var f=!1,i=!1;const o=()=>{if(f){Ue();return}f=!0,i&&Ge(),s(this,w)!==null&&se(s(this,w),()=>{n(this,w,null)}),p(this,l,Q).call(this,()=>{p(this,l,oe).call(this)})},d=c=>{try{i=!0,r==null||r(c,o),i=!1}catch(h){$(h,s(this,g)&&s(this,g).parent)}a&&n(this,w,p(this,l,Q).call(this,()=>{try{return F(()=>{var h=V;h.b=this,h.f|=_e,a(s(this,E),()=>c,()=>o)})}catch(h){return $(h,s(this,g).parent),null}}))};H(()=>{var c;try{c=this.transform_error(e)}catch(h){$(h,s(this,g)&&s(this,g).parent);return}c!==null&&typeof c=="object"&&typeof c.then=="function"?c.then(d,h=>$(h,s(this,g)&&s(this,g).parent)):d(c)})}}E=new WeakMap,Y=new WeakMap,T=new WeakMap,x=new WeakMap,g=new WeakMap,S=new WeakMap,m=new WeakMap,w=new WeakMap,k=new WeakMap,C=new WeakMap,N=new WeakMap,B=new WeakMap,j=new WeakMap,z=new WeakMap,A=new WeakMap,ee=new WeakMap,l=new WeakSet,ke=function(){try{n(this,S,F(()=>s(this,x).call(this,s(this,E))))}catch(e){this.error(e)}},Ae=function(e){const r=s(this,T).failed;r&&n(this,w,F(()=>{r(s(this,E),()=>e,()=>()=>{})}))},Re=function(){const e=s(this,T).pending;e&&(this.is_pending=!0,n(this,m,F(()=>e(s(this,E)))),H(()=>{var r=n(this,k,document.createDocumentFragment()),a=me();r.append(a),n(this,S,p(this,l,Q).call(this,()=>F(()=>s(this,x).call(this,a)))),s(this,N)===0&&(s(this,E).before(r),n(this,k,null),se(s(this,m),()=>{n(this,m,null)}),p(this,l,J).call(this,ge))}))},oe=function(){try{if(this.is_pending=this.has_pending_snippet(),n(this,N,0),n(this,C,0),n(this,S,F(()=>{s(this,x).call(this,s(this,E))})),s(this,N)>0){var e=n(this,k,document.createDocumentFragment());Ve(s(this,S),e);const r=s(this,T).pending;n(this,m,F(()=>r(s(this,E))))}else p(this,l,J).call(this,ge)}catch(r){this.error(r)}},J=function(e){this.is_pending=!1,e.transfer_effects(s(this,j),s(this,z))},Q=function(e){var r=V,a=we,f=Te;X(s(this,g)),K(s(this,g)),ve(s(this,g).ctx);try{return We.ensure(),e()}catch(i){return He(i),null}finally{X(r),K(a),ve(f)}},fe=function(e,r){var a;if(!this.has_pending_snippet()){this.parent&&p(a=this.parent,l,fe).call(a,e,r);return}n(this,N,s(this,N)+e),s(this,N)===0&&(p(this,l,J).call(this,r),s(this,m)&&se(s(this,m),()=>{n(this,m,null)}),s(this,k)&&(s(this,E).before(s(this,k)),n(this,k,null)))};function St(t){return t.endsWith("capture")&&t!=="gotpointercapture"&&t!=="lostpointercapture"}const _t=["beforeinput","click","change","dblclick","contextmenu","focusin","focusout","input","keydown","keyup","mousedown","mousemove","mouseout","mouseover","mouseup","pointerdown","pointermove","pointerout","pointerover","pointerup","touchend","touchmove","touchstart"];function kt(t){return _t.includes(t)}const pt={formnovalidate:"formNoValidate",ismap:"isMap",nomodule:"noModule",playsinline:"playsInline",readonly:"readOnly",defaultvalue:"defaultValue",defaultchecked:"defaultChecked",srcobject:"srcObject",novalidate:"noValidate",allowfullscreen:"allowFullscreen",disablepictureinpicture:"disablePictureInPicture",disableremoteplayback:"disableRemotePlayback"};function At(t){return t=t.toLowerCase(),pt[t]??t}const gt=["touchstart","touchmove"];function vt(t){return gt.includes(t)}const yt=["textarea","script","style","title"];function Rt(t){return yt.includes(t)}const M=Symbol("events"),Ne=new Set,le=new Set;function bt(t,e,r,a={}){function f(i){if(a.capture||ce.call(e,i),!i.cancelBubble)return Qe(()=>r==null?void 0:r.call(this,i))}return t.startsWith("pointer")||t.startsWith("touch")||t==="wheel"?H(()=>{e.addEventListener(t,f,a)}):e.addEventListener(t,f,a),f}function Nt(t,e,r,a,f){var i={capture:a,passive:f},o=bt(t,e,r,i);(e===document.body||e===window||e===document||e instanceof HTMLMediaElement)&&Xe(()=>{e.removeEventListener(t,o,i)})}function Dt(t,e,r){(e[M]??(e[M]={}))[t]=r}function Ot(t){for(var e=0;e{throw O});throw R}}finally{t[M]=e,delete t.currentTarget,K(P),X(W)}}}function Ft(t,e){var r=e==null?"":typeof e=="object"?`${e}`:e;r!==(t.__t??(t.__t=t.nodeValue))&&(t.__t=r,t.nodeValue=`${r}`)}function Et(t,e){return De(t,e)}function Lt(t,e){ae(),e.intro=e.intro??!1;const r=e.target,a=I,f=L;try{for(var i=Ke(r);i&&(i.nodeType!==Se||i.data!==Ze);)i=et(i);if(!i)throw ne;G(!0),Z(i);const o=De(t,{...e,anchor:i});return G(!1),o}catch(o){if(o instanceof Error&&o.message.split(` -`).some(d=>d.startsWith("https://svelte.dev/e/")))throw o;return o!==ne&&console.warn("Failed to hydrate: ",o),e.recover===!1&&tt(),ae(),rt(r),G(!1),Et(t,e)}finally{G(a),Z(f)}}const U=new Map;function De(t,{target:e,anchor:r,props:a={},events:f,context:i,intro:o=!0,transformError:d}){ae();var c=void 0,h=st(()=>{var P=r??e.appendChild(me());ht(P,{pending:()=>{}},v=>{at({});var _=Te;if(i&&(_.c=i),f&&(a.$$events=f),I&<(v,null),c=t(v,a)||{},I&&(V.nodes.end=L,L===null||L.nodeType!==Se||L.data!==nt))throw ot(),ne;ft()},d);var W=new Set,R=v=>{for(var _=0;_{var D;for(var v of W)for(const b of[e,document]){var _=U.get(b),y=_.get(v);--y==0?(b.removeEventListener(v,ce),_.delete(v),_.size===0&&U.delete(b)):_.set(v,y)}le.delete(R),P!==r&&((D=P.parentNode)==null||D.removeChild(P))}});return ue.set(c,h),c}let ue=new WeakMap;function It(t,e){const r=ue.get(t);return r?(ue.delete(t),r(e)):Promise.resolve()}export{St as a,Ot as b,bt as c,Dt as d,kt as e,Nt as f,Lt as h,Rt as i,Et as m,At as n,Ft as s,It as u}; diff --git a/frontend/dist/_app/immutable/chunks/C1tKzvKE.js b/frontend/dist/_app/immutable/chunks/C1tKzvKE.js new file mode 100644 index 0000000..f80d80f --- /dev/null +++ b/frontend/dist/_app/immutable/chunks/C1tKzvKE.js @@ -0,0 +1 @@ +import{l as e,u as a,g as t,i as c,j as u}from"./D2EIOFXK.js";function l(n){t===null&&e(),c&&t.l!==null?i(t).m.push(n):a(()=>{const o=u(n);if(typeof o=="function")return o})}function f(n){t===null&&e(),l(()=>()=>u(n))}function i(n){var o=n.l;return o.u??(o.u={a:[],b:[],m:[]})}export{f as a,l as o}; diff --git a/frontend/dist/_app/immutable/chunks/C4rlClDa.js b/frontend/dist/_app/immutable/chunks/C4rlClDa.js new file mode 100644 index 0000000..90d1090 --- /dev/null +++ b/frontend/dist/_app/immutable/chunks/C4rlClDa.js @@ -0,0 +1,2 @@ +var Oe=Object.defineProperty;var he=t=>{throw TypeError(t)};var Fe=(t,e,r)=>e in t?Oe(t,e,{enumerable:!0,configurable:!0,writable:!0,value:r}):t[e]=r;var z=(t,e,r)=>Fe(t,typeof e!="symbol"?e+"":e,r),re=(t,e,r)=>e.has(t)||he("Cannot "+r);var s=(t,e,r)=>(re(t,e,"read from private field"),r?r.call(t):e.get(t)),u=(t,e,r)=>e.has(t)?he("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(t):e.set(t,r),n=(t,e,r,a)=>(re(t,e,"write to private field"),a?a.call(t,r):e.set(t,r),r),p=(t,e,r)=>(re(t,e,"access private method"),r);import{aa as Ie,D as be,V as Le,ab as Ee,j as Me,ac as de,ad as j,f as I,h as L,o as P,ae as _e,b as Ve,w as xe,af as Ce,ag as pe,a as F,c as me,p as se,e as ge,m as Pe,ah as Be,ai as Q,aj as X,ak as ve,al as We,am as je,an as we,g as Te,ao as He,d as ie,y as Z,ap as Ye,P as qe,aq as $,E as ze,ar as $e,as as Ge,at as Ue,au as Je,av as Ke,aw as Qe,ax as ae,q as Xe,ay as Se,S as Ze,az as et,aA as ne,Q as G,aB as tt,aC as rt,aD as st,aE as it,I as at,aF as nt,aG as ot,K as ft}from"./D2EIOFXK.js";import{b as lt}from"./IT17IssP.js";function ct(t){let e=0,r=Ee(0),a;return()=>{Ie()&&(be(r),Le(()=>(e===0&&(a=Me(()=>t(()=>de(r)))),e+=1,()=>{j(()=>{e-=1,e===0&&(a==null||a(),a=void 0,de(r))})})))}}var ut=ze|$e;function ht(t,e,r,a){new dt(t,e,r,a)}var E,H,T,V,g,S,m,w,A,x,N,B,Y,q,R,ee,l,Ae,Re,ke,oe,J,K,fe;class dt{constructor(e,r,a,f){u(this,l);z(this,"parent");z(this,"is_pending",!1);z(this,"transform_error");u(this,E);u(this,H,L?I:null);u(this,T);u(this,V);u(this,g);u(this,S,null);u(this,m,null);u(this,w,null);u(this,A,null);u(this,x,0);u(this,N,0);u(this,B,!1);u(this,Y,new Set);u(this,q,new Set);u(this,R,null);u(this,ee,ct(()=>(n(this,R,Ee(s(this,x))),()=>{n(this,R,null)})));var i;n(this,E,e),n(this,T,r),n(this,V,o=>{var d=P;d.b=this,d.f|=_e,a(o)}),this.parent=P.b,this.transform_error=f??((i=this.parent)==null?void 0:i.transform_error)??(o=>o),n(this,g,Ve(()=>{if(L){const o=s(this,H);xe();const d=o.data===Ce;if(o.data.startsWith(pe)){const h=JSON.parse(o.data.slice(pe.length));p(this,l,Re).call(this,h)}else d?p(this,l,ke).call(this):p(this,l,Ae).call(this)}else p(this,l,oe).call(this)},ut)),L&&n(this,E,I)}defer_effect(e){Be(e,s(this,Y),s(this,q))}is_rendered(){return!this.is_pending&&(!this.parent||this.parent.is_rendered())}has_pending_snippet(){return!!s(this,T).pending}update_pending_count(e,r){p(this,l,fe).call(this,e,r),n(this,x,s(this,x)+e),!(!s(this,R)||s(this,B))&&(n(this,B,!0),j(()=>{n(this,B,!1),s(this,R)&&He(s(this,R),s(this,x))}))}get_effect_pending(){return s(this,ee).call(this),be(s(this,R))}error(e){var r=s(this,T).onerror;let a=s(this,T).failed;if(!r&&!a)throw e;s(this,S)&&(ie(s(this,S)),n(this,S,null)),s(this,m)&&(ie(s(this,m)),n(this,m,null)),s(this,w)&&(ie(s(this,w)),n(this,w,null)),L&&(Z(s(this,H)),Ye(),Z(qe()));var f=!1,i=!1;const o=()=>{if(f){Ue();return}f=!0,i&&Ge(),s(this,w)!==null&&se(s(this,w),()=>{n(this,w,null)}),p(this,l,K).call(this,()=>{p(this,l,oe).call(this)})},d=c=>{try{i=!0,r==null||r(c,o),i=!1}catch(h){$(h,s(this,g)&&s(this,g).parent)}a&&n(this,w,p(this,l,K).call(this,()=>{try{return F(()=>{var h=P;h.b=this,h.f|=_e,a(s(this,E),()=>c,()=>o)})}catch(h){return $(h,s(this,g).parent),null}}))};j(()=>{var c;try{c=this.transform_error(e)}catch(h){$(h,s(this,g)&&s(this,g).parent);return}c!==null&&typeof c=="object"&&typeof c.then=="function"?c.then(d,h=>$(h,s(this,g)&&s(this,g).parent)):d(c)})}}E=new WeakMap,H=new WeakMap,T=new WeakMap,V=new WeakMap,g=new WeakMap,S=new WeakMap,m=new WeakMap,w=new WeakMap,A=new WeakMap,x=new WeakMap,N=new WeakMap,B=new WeakMap,Y=new WeakMap,q=new WeakMap,R=new WeakMap,ee=new WeakMap,l=new WeakSet,Ae=function(){try{n(this,S,F(()=>s(this,V).call(this,s(this,E))))}catch(e){this.error(e)}},Re=function(e){const r=s(this,T).failed;r&&n(this,w,F(()=>{r(s(this,E),()=>e,()=>()=>{})}))},ke=function(){const e=s(this,T).pending;e&&(this.is_pending=!0,n(this,m,F(()=>e(s(this,E)))),j(()=>{var r=n(this,A,document.createDocumentFragment()),a=me();r.append(a),n(this,S,p(this,l,K).call(this,()=>F(()=>s(this,V).call(this,a)))),s(this,N)===0&&(s(this,E).before(r),n(this,A,null),se(s(this,m),()=>{n(this,m,null)}),p(this,l,J).call(this,ge))}))},oe=function(){try{if(this.is_pending=this.has_pending_snippet(),n(this,N,0),n(this,x,0),n(this,S,F(()=>{s(this,V).call(this,s(this,E))})),s(this,N)>0){var e=n(this,A,document.createDocumentFragment());Pe(s(this,S),e);const r=s(this,T).pending;n(this,m,F(()=>r(s(this,E))))}else p(this,l,J).call(this,ge)}catch(r){this.error(r)}},J=function(e){this.is_pending=!1,e.transfer_effects(s(this,Y),s(this,q))},K=function(e){var r=P,a=we,f=Te;Q(s(this,g)),X(s(this,g)),ve(s(this,g).ctx);try{return We.ensure(),e()}catch(i){return je(i),null}finally{Q(r),X(a),ve(f)}},fe=function(e,r){var a;if(!this.has_pending_snippet()){this.parent&&p(a=this.parent,l,fe).call(a,e,r);return}n(this,N,s(this,N)+e),s(this,N)===0&&(p(this,l,J).call(this,r),s(this,m)&&se(s(this,m),()=>{n(this,m,null)}),s(this,A)&&(s(this,E).before(s(this,A)),n(this,A,null)))};function St(t){return t.endsWith("capture")&&t!=="gotpointercapture"&&t!=="lostpointercapture"}const _t=["beforeinput","click","change","dblclick","contextmenu","focusin","focusout","input","keydown","keyup","mousedown","mousemove","mouseout","mouseover","mouseup","pointerdown","pointermove","pointerout","pointerover","pointerup","touchend","touchmove","touchstart"];function At(t){return _t.includes(t)}const pt={formnovalidate:"formNoValidate",ismap:"isMap",nomodule:"noModule",playsinline:"playsInline",readonly:"readOnly",defaultvalue:"defaultValue",defaultchecked:"defaultChecked",srcobject:"srcObject",novalidate:"noValidate",allowfullscreen:"allowFullscreen",disablepictureinpicture:"disablePictureInPicture",disableremoteplayback:"disableRemotePlayback"};function Rt(t){return t=t.toLowerCase(),pt[t]??t}const gt=["touchstart","touchmove"];function vt(t){return gt.includes(t)}const yt=["textarea","script","style","title"];function kt(t){return yt.includes(t)}const M=Symbol("events"),Ne=new Set,le=new Set;function bt(t,e,r,a={}){function f(i){if(a.capture||ce.call(e,i),!i.cancelBubble)return Ke(()=>r==null?void 0:r.call(this,i))}return t.startsWith("pointer")||t.startsWith("touch")||t==="wheel"?j(()=>{e.addEventListener(t,f,a)}):e.addEventListener(t,f,a),f}function Nt(t,e,r,a,f){var i={capture:a,passive:f},o=bt(t,e,r,i);(e===document.body||e===window||e===document||e instanceof HTMLMediaElement)&&Qe(()=>{e.removeEventListener(t,o,i)})}function Dt(t,e,r){(e[M]??(e[M]={}))[t]=r}function Ot(t){for(var e=0;e{throw O});throw k}}finally{t[M]=e,delete t.currentTarget,X(C),Q(W)}}}function Ft(t,e){var r=e==null?"":typeof e=="object"?`${e}`:e;r!==(t.__t??(t.__t=t.nodeValue))&&(t.__t=r,t.nodeValue=`${r}`)}function Et(t,e){return De(t,e)}function It(t,e){ae(),e.intro=e.intro??!1;const r=e.target,a=L,f=I;try{for(var i=Xe(r);i&&(i.nodeType!==Se||i.data!==Ze);)i=et(i);if(!i)throw ne;G(!0),Z(i);const o=De(t,{...e,anchor:i});return G(!1),o}catch(o){if(o instanceof Error&&o.message.split(` +`).some(d=>d.startsWith("https://svelte.dev/e/")))throw o;return o!==ne&&console.warn("Failed to hydrate: ",o),e.recover===!1&&tt(),ae(),rt(r),G(!1),Et(t,e)}finally{G(a),Z(f)}}const U=new Map;function De(t,{target:e,anchor:r,props:a={},events:f,context:i,intro:o=!0,transformError:d}){ae();var c=void 0,h=st(()=>{var C=r??e.appendChild(me());ht(C,{pending:()=>{}},v=>{at({});var _=Te;if(i&&(_.c=i),f&&(a.$$events=f),L&<(v,null),c=t(v,a)||{},L&&(P.nodes.end=I,I===null||I.nodeType!==Se||I.data!==nt))throw ot(),ne;ft()},d);var W=new Set,k=v=>{for(var _=0;_{var D;for(var v of W)for(const b of[e,document]){var _=U.get(b),y=_.get(v);--y==0?(b.removeEventListener(v,ce),_.delete(v),_.size===0&&U.delete(b)):_.set(v,y)}le.delete(k),C!==r&&((D=C.parentNode)==null||D.removeChild(C))}});return ue.set(c,h),c}let ue=new WeakMap;function Lt(t,e){const r=ue.get(t);return r?(ue.delete(t),r(e)):Promise.resolve()}export{St as a,Ot as b,bt as c,Dt as d,At as e,Nt as f,It as h,kt as i,Et as m,Rt as n,Ft as s,Lt as u}; diff --git a/frontend/dist/_app/immutable/chunks/CiUbu-1F.js b/frontend/dist/_app/immutable/chunks/CiUbu-1F.js deleted file mode 100644 index fb6b69a..0000000 --- a/frontend/dist/_app/immutable/chunks/CiUbu-1F.js +++ /dev/null @@ -1 +0,0 @@ -import{b as p,E as t}from"./VJhVTb1A.js";import{B as c}from"./U5yjBaoU.js";function E(r,s,...a){var e=new c(r);p(()=>{const n=s()??null;e.ensure(n,n&&(o=>n(o,...a)))},t)}export{E as s}; diff --git a/frontend/dist/_app/immutable/chunks/Cz6m6K8p.js b/frontend/dist/_app/immutable/chunks/Cz6m6K8p.js deleted file mode 100644 index e41051c..0000000 --- a/frontend/dist/_app/immutable/chunks/Cz6m6K8p.js +++ /dev/null @@ -1 +0,0 @@ -import{j as u,i as t,w as l,k as o}from"./VJhVTb1A.js";function c(e){throw new Error("https://svelte.dev/e/lifecycle_outside_component")}function a(e){t===null&&c(),l&&t.l!==null?i(t).m.push(e):u(()=>{const n=o(e);if(typeof n=="function")return n})}function f(e){t===null&&c(),a(()=>()=>o(e))}function i(e){var n=e.l;return n.u??(n.u={a:[],b:[],m:[]})}export{f as a,a as o}; diff --git a/frontend/dist/_app/immutable/chunks/D2EIOFXK.js b/frontend/dist/_app/immutable/chunks/D2EIOFXK.js new file mode 100644 index 0000000..31edb79 --- /dev/null +++ b/frontend/dist/_app/immutable/chunks/D2EIOFXK.js @@ -0,0 +1 @@ +var yn=Object.defineProperty;var Rt=e=>{throw TypeError(e)};var En=(e,t,n)=>t in e?yn(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n;var ie=(e,t,n)=>En(e,typeof t!="symbol"?t+"":t,n),tt=(e,t,n)=>t.has(e)||Rt("Cannot "+n);var u=(e,t,n)=>(tt(e,t,"read from private field"),n?n.call(e):t.get(e)),k=(e,t,n)=>t.has(e)?Rt("Cannot add the same private member more than once"):t instanceof WeakSet?t.add(e):t.set(e,n),ye=(e,t,n,r)=>(tt(e,t,"write to private field"),r?r.call(e,n):t.set(e,n),n),I=(e,t,n)=>(tt(e,t,"access private method"),n);var gn=Array.isArray,mn=Array.prototype.indexOf,Te=Array.prototype.includes,yr=Array.from,Er=Object.defineProperty,Ie=Object.getOwnPropertyDescriptor,bn=Object.getOwnPropertyDescriptors,Tn=Object.prototype,An=Array.prototype,Lt=Object.getPrototypeOf,Nt=Object.isExtensible;function gr(e){return typeof e=="function"}const Sn=()=>{};function mr(e){return e()}function Rn(e){for(var t=0;t{e=r,t=s});return{promise:n,resolve:e,reject:t}}function br(e,t,n=!1){return e===void 0?n?t():t:e}function Tr(e,t){if(Array.isArray(e))return e;if(t===void 0||!(Symbol.iterator in e))return Array.from(e);const n=[];for(const r of e)if(n.push(r),n.length===t)break;return n}const A=2,Ae=4,Le=8,vt=1<<24,Z=16,G=32,_e=64,Nn=128,F=512,b=1024,x=2048,z=4096,H=8192,q=16384,we=32768,xt=1<<25,Ge=65536,st=1<<17,xn=1<<18,je=1<<19,Yt=1<<20,Ar=1<<25,ve=65536,it=1<<21,Je=1<<22,ee=1<<23,ue=Symbol("$state"),Sr=Symbol("legacy props"),Rr=Symbol(""),K=new class extends Error{constructor(){super(...arguments);ie(this,"name","StaleReactionError");ie(this,"message","The reaction that called `getAbortSignal()` was re-run or destroyed")}};var Ft;const xr=!!((Ft=globalThis.document)!=null&&Ft.contentType)&&globalThis.document.contentType.includes("xml"),Or=1,Qe=3,Ht=8;function On(e){throw new Error("https://svelte.dev/e/lifecycle_outside_component")}function kn(){throw new Error("https://svelte.dev/e/async_derived_orphan")}function kr(e,t,n){throw new Error("https://svelte.dev/e/each_key_duplicate")}function Dn(e){throw new Error("https://svelte.dev/e/effect_in_teardown")}function In(){throw new Error("https://svelte.dev/e/effect_in_unowned_derived")}function Mn(e){throw new Error("https://svelte.dev/e/effect_orphan")}function Cn(){throw new Error("https://svelte.dev/e/effect_update_depth_exceeded")}function Dr(){throw new Error("https://svelte.dev/e/hydration_failed")}function Ir(e){throw new Error("https://svelte.dev/e/props_invalid_value")}function Pn(){throw new Error("https://svelte.dev/e/state_descriptors_fixed")}function Fn(){throw new Error("https://svelte.dev/e/state_prototype_fixed")}function Ln(){throw new Error("https://svelte.dev/e/state_unsafe_mutation")}function Mr(){throw new Error("https://svelte.dev/e/svelte_boundary_reset_onerror")}const Cr=1,Pr=2,Fr=4,Lr=8,jr=16,Yr=1,Hr=2,qr=4,Ur=8,Vr=16,Br=1,Gr=2,jn="[",Yn="[!",zr="[?",Hn="]",dt={},S=Symbol(),qn="http://www.w3.org/1999/xhtml",Kr="http://www.w3.org/2000/svg",Xr="http://www.w3.org/1998/Math/MathML",$r="@attach";function ht(e){console.warn("https://svelte.dev/e/hydration_mismatch")}function Zr(){console.warn("https://svelte.dev/e/select_multiple_invalid_value")}function Wr(){console.warn("https://svelte.dev/e/svelte_boundary_reset_noop")}let ne=!1;function Jr(e){ne=e}let T;function Se(e){if(e===null)throw ht(),dt;return T=e}function Qr(){return Se(se(T))}function es(e){if(ne){if(se(T)!==null)throw ht(),dt;T=e}}function ts(e=1){if(ne){for(var t=e,n=T;t--;)n=se(n);T=n}}function ns(e=!0){for(var t=0,n=T;;){if(n.nodeType===Ht){var r=n.data;if(r===Hn){if(t===0)return n;t-=1}else(r===jn||r===Yn||r[0]==="["&&!isNaN(Number(r.slice(1))))&&(t+=1)}var s=se(n);e&&n.remove(),n=s}}function rs(e){if(!e||e.nodeType!==Ht)throw ht(),dt;return e.data}function qt(e){return e===this.v}function Un(e,t){return e!=e?t==t:e!==t||e!==null&&typeof e=="object"||typeof e=="function"}function Ut(e){return!Un(e,this.v)}let et=!1;function ss(){et=!0}let g=null;function ze(e){g=e}function is(e){return Vn().get(e)}function ls(e,t=!1,n){g={p:g,i:!1,c:null,e:null,s:e,x:null,r:y,l:et&&!t?{s:null,u:null,$:[]}:null}}function fs(e){var t=g,n=t.e;if(n!==null){t.e=null;for(var r of n)ln(r)}return t.i=!0,g=t.p,{}}function Ye(){return!et||g!==null&&g.l===null}function Vn(e){return g===null&&On(),g.c??(g.c=new Map(Bn(g)||void 0))}function Bn(e){let t=e.p;for(;t!==null;){const n=t.c;if(n!==null)return n;t=t.p}return null}let fe=[];function Vt(){var e=fe;fe=[],Rn(e)}function lt(e){if(fe.length===0&&!Me){var t=fe;queueMicrotask(()=>{t===fe&&Vt()})}fe.push(e)}function Gn(){for(;fe.length>0;)Vt()}function zn(e){var t=y;if(t===null)return p.f|=ee,e;if((t.f&we)===0&&(t.f&Ae)===0)throw e;Ke(e,t)}function Ke(e,t){for(;t!==null;){if((t.f&Nn)!==0){if((t.f&we)===0)throw e;try{t.b.error(e);return}catch(n){e=n}}t=t.parent}throw e}const Kn=-7169;function E(e,t){e.f=e.f&Kn|t}function pt(e){(e.f&F)!==0||e.deps===null?E(e,b):E(e,z)}function Bt(e){if(e!==null)for(const t of e)(t.f&A)===0||(t.f&ve)===0||(t.f^=ve,Bt(t.deps))}function Xn(e,t,n){(e.f&x)!==0?t.add(e):(e.f&z)!==0&&n.add(e),Bt(e.deps),E(e,b)}const W=new Set;let w=null,R=null,ft=null,Me=!1,nt=!1,Ee=null,qe=null;var Ot=0;let $n=1;var ge,me,X,V,Pe,C,Fe,Q,$,B,be,oe,m,Ue,Gt,Ve,at,ot,zt;const We=class We{constructor(){k(this,m);ie(this,"id",$n++);ie(this,"current",new Map);ie(this,"previous",new Map);k(this,ge,new Set);k(this,me,new Set);k(this,X,new Map);k(this,V,new Map);k(this,Pe,null);k(this,C,[]);k(this,Fe,[]);k(this,Q,new Set);k(this,$,new Set);k(this,B,new Map);ie(this,"is_fork",!1);k(this,be,!1);k(this,oe,new Set)}skip_effect(t){u(this,B).has(t)||u(this,B).set(t,{d:[],m:[]})}unskip_effect(t){var n=u(this,B).get(t);if(n){u(this,B).delete(t);for(var r of n.d)E(r,x),this.schedule(r);for(r of n.m)E(r,z),this.schedule(r)}}capture(t,n,r=!1){n!==S&&!this.previous.has(t)&&this.previous.set(t,n),(t.f&ee)===0&&(this.current.set(t,[t.v,r]),R==null||R.set(t,t.v))}activate(){w=this}deactivate(){w=null,R=null}flush(){try{nt=!0,w=this,I(this,m,Ve).call(this)}finally{Ot=0,ft=null,Ee=null,qe=null,nt=!1,w=null,R=null,te.clear()}}discard(){for(const t of u(this,me))t(this);u(this,me).clear(),W.delete(this)}register_created_effect(t){u(this,Fe).push(t)}increment(t,n){let r=u(this,X).get(n)??0;if(u(this,X).set(n,r+1),t){let s=u(this,V).get(n)??0;u(this,V).set(n,s+1)}}decrement(t,n,r){let s=u(this,X).get(n)??0;if(s===1?u(this,X).delete(n):u(this,X).set(n,s-1),t){let i=u(this,V).get(n)??0;i===1?u(this,V).delete(n):u(this,V).set(n,i-1)}u(this,be)||r||(ye(this,be,!0),lt(()=>{ye(this,be,!1),this.flush()}))}transfer_effects(t,n){for(const r of t)u(this,Q).add(r);for(const r of n)u(this,$).add(r);t.clear(),n.clear()}oncommit(t){u(this,ge).add(t)}ondiscard(t){u(this,me).add(t)}settled(){return(u(this,Pe)??ye(this,Pe,jt())).promise}static ensure(){if(w===null){const t=w=new We;nt||(W.add(w),Me||lt(()=>{w===t&&t.flush()}))}return w}apply(){{R=null;return}}schedule(t){var s;if(ft=t,(s=t.b)!=null&&s.is_pending&&(t.f&(Ae|Le|vt))!==0&&(t.f&we)===0){t.b.defer_effect(t);return}for(var n=t;n.parent!==null;){n=n.parent;var r=n.f;if(Ee!==null&&n===y&&(p===null||(p.f&A)===0))return;if((r&(_e|G))!==0){if((r&b)===0)return;n.f^=b}}u(this,C).push(n)}};ge=new WeakMap,me=new WeakMap,X=new WeakMap,V=new WeakMap,Pe=new WeakMap,C=new WeakMap,Fe=new WeakMap,Q=new WeakMap,$=new WeakMap,B=new WeakMap,be=new WeakMap,oe=new WeakMap,m=new WeakSet,Ue=function(){return this.is_fork||u(this,V).size>0},Gt=function(){for(const r of u(this,oe))for(const s of u(r,V).keys()){for(var t=!1,n=s;n.parent!==null;){if(u(this,B).has(n)){t=!0;break}n=n.parent}if(!t)return!0}return!1},Ve=function(){var a,f;if(Ot++>1e3&&(W.delete(this),Wn()),!I(this,m,Ue).call(this)){for(const l of u(this,Q))u(this,$).delete(l),E(l,x),this.schedule(l);for(const l of u(this,$))E(l,z),this.schedule(l)}const t=u(this,C);ye(this,C,[]),this.apply();var n=Ee=[],r=[],s=qe=[];for(const l of t)try{I(this,m,at).call(this,l,n,r)}catch(c){throw $t(l),c}if(w=null,s.length>0){var i=We.ensure();for(const l of s)i.schedule(l)}if(Ee=null,qe=null,I(this,m,Ue).call(this)||I(this,m,Gt).call(this)){I(this,m,ot).call(this,r),I(this,m,ot).call(this,n);for(const[l,c]of u(this,B))Xt(l,c)}else{u(this,X).size===0&&W.delete(this),u(this,Q).clear(),u(this,$).clear();for(const l of u(this,ge))l(this);u(this,ge).clear(),kt(r),kt(n),(a=u(this,Pe))==null||a.resolve()}var o=w;if(u(this,C).length>0){const l=o??(o=this);u(l,C).push(...u(this,C).filter(c=>!u(l,C).includes(c)))}o!==null&&(W.add(o),I(f=o,m,Ve).call(f)),W.has(this)||I(this,m,zt).call(this)},at=function(t,n,r){t.f^=b;for(var s=t.first;s!==null;){var i=s.f,o=(i&(G|_e))!==0,a=o&&(i&b)!==0,f=a||(i&H)!==0||u(this,B).has(s);if(!f&&s.fn!==null){o?s.f^=b:(i&Ae)!==0?n.push(s):He(s)&&((i&Z)!==0&&u(this,$).add(s),Ne(s));var l=s.first;if(l!==null){s=l;continue}}for(;s!==null;){var c=s.next;if(c!==null){s=c;break}s=s.parent}}},ot=function(t){for(var n=0;n!this.current.has(_));if(s.length===0)t&&d.discard();else if(n.length>0){d.activate();var i=new Set,o=new Map;for(var a of n)Kt(a,s,i,o);o=new Map;var f=[...d.current.keys()].filter(_=>this.current.has(_)?this.current.get(_)[0]!==_:!0);for(const _ of u(this,Fe))(_.f&(q|H|st))===0&&wt(_,f,o)&&((_.f&(Je|Z))!==0?(E(_,x),d.schedule(_)):u(d,Q).add(_));if(u(d,C).length>0){d.apply();for(var l of u(d,C))I(c=d,m,at).call(c,l,[],[]);ye(d,C,[])}d.deactivate()}}for(const d of W)u(d,oe).has(this)&&(u(d,oe).delete(this),u(d,oe).size===0&&!I(h=d,m,Ue).call(h)&&(d.activate(),I(v=d,m,Ve).call(v)))};let de=We;function Zn(e){var t=Me;Me=!0;try{for(var n;;){if(Gn(),w===null)return n;w.flush()}}finally{Me=t}}function Wn(){try{Cn()}catch(e){Ke(e,ft)}}let j=null;function kt(e){var t=e.length;if(t!==0){for(var n=0;n0)){te.clear();for(const s of j){if((s.f&(q|H))!==0)continue;const i=[s];let o=s.parent;for(;o!==null;)j.has(o)&&(j.delete(o),i.push(o)),o=o.parent;for(let a=i.length-1;a>=0;a--){const f=i[a];(f.f&(q|H))===0&&Ne(f)}}j.clear()}}j=null}}function Kt(e,t,n,r){if(!n.has(e)&&(n.add(e),e.reactions!==null))for(const s of e.reactions){const i=s.f;(i&A)!==0?Kt(s,t,n,r):(i&(Je|Z))!==0&&(i&x)===0&&wt(s,t,r)&&(E(s,x),yt(s))}}function wt(e,t,n){const r=n.get(e);if(r!==void 0)return r;if(e.deps!==null)for(const s of e.deps){if(Te.call(t,s))return!0;if((s.f&A)!==0&&wt(s,t,n))return n.set(s,!0),!0}return n.set(e,!1),!1}function yt(e){w.schedule(e)}function Xt(e,t){if(!((e.f&G)!==0&&(e.f&b)!==0)){(e.f&x)!==0?t.d.push(e):(e.f&z)!==0&&t.m.push(e),E(e,b);for(var n=e.first;n!==null;)Xt(n,t),n=n.next}}function $t(e){E(e,b);for(var t=e.first;t!==null;)$t(t),t=t.next}function Jn(e,t,n,r){const s=Ye()?Et:tr;var i=e.filter(v=>!v.settled);if(n.length===0&&i.length===0){r(t.map(s));return}var o=y,a=Qn(),f=i.length===1?i[0].promise:i.length>1?Promise.all(i.map(v=>v.promise)):null;function l(v){a();try{r(v)}catch(d){(o.f&q)===0&&Ke(d,o)}Xe()}if(n.length===0){f.then(()=>l(t.map(s)));return}var c=Zt();function h(){Promise.all(n.map(v=>er(v))).then(v=>l([...t.map(s),...v])).catch(v=>Ke(v,o)).finally(()=>c())}f?f.then(()=>{a(),h(),Xe()}):h()}function Qn(){var e=y,t=p,n=g,r=w;return function(i=!0){Re(e),re(t),ze(n),i&&(e.f&q)===0&&(r==null||r.activate(),r==null||r.apply())}}function Xe(e=!0){Re(null),re(null),ze(null),e&&(w==null||w.deactivate())}function Zt(){var e=y,t=e.b,n=w,r=t.is_rendered();return t.update_pending_count(1,n),n.increment(r,e),(s=!1)=>{t.update_pending_count(-1,n),n.decrement(r,e,s)}}function Et(e){var t=A|x,n=p!==null&&(p.f&A)!==0?p:null;return y!==null&&(y.f|=je),{ctx:g,deps:null,effects:null,equals:qt,f:t,fn:e,reactions:null,rv:0,v:S,wv:0,parent:n??y,ac:null}}function er(e,t,n){let r=y;r===null&&kn();var s=void 0,i=mt(S),o=!p,a=new Map;return cr(()=>{var d;var f=y,l=jt();s=l.promise;try{Promise.resolve(e()).then(l.resolve,l.reject).finally(Xe)}catch(_){l.reject(_),Xe()}var c=w;if(o){if((f.f&we)!==0)var h=Zt();if(r.b.is_rendered())(d=a.get(c))==null||d.reject(K),a.delete(c);else{for(const _ of a.values())_.reject(K);a.clear()}a.set(c,l)}const v=(_,O=void 0)=>{if(h){var N=O===K;h(N)}if(!(O===K||(f.f&q)!==0)){if(c.activate(),O)i.f|=ee,ct(i,O);else{(i.f&ee)!==0&&(i.f^=ee),ct(i,_);for(const[xe,Oe]of a){if(a.delete(xe),xe===c)break;Oe.reject(K)}}c.deactivate()}};l.promise.then(v,_=>v(null,_||"unknown"))}),ur(()=>{for(const f of a.values())f.reject(K)}),new Promise(f=>{function l(c){function h(){c===s?f(i):l(s)}c.then(h,h)}l(s)})}function as(e){const t=Et(e);return cn(t),t}function tr(e){const t=Et(e);return t.equals=Ut,t}function nr(e){var t=e.effects;if(t!==null){e.effects=null;for(var n=0;n0&&!Qt&&ir()}return t}function ir(){Qt=!1;for(const e of ut)(e.f&b)!==0&&E(e,z),He(e)&&Ne(e);ut.clear()}function rt(e){le(e,e.v+1)}function en(e,t,n){var r=e.reactions;if(r!==null)for(var s=Ye(),i=r.length,o=0;o{if(ce===i)return a();var f=p,l=ce;re(null),Pt(i);var c=a();return re(f),Pt(l),c};return r&&n.set("length",J(e.length)),new Proxy(e,{defineProperty(a,f,l){(!("value"in l)||l.configurable===!1||l.enumerable===!1||l.writable===!1)&&Pn();var c=n.get(f);return c===void 0?o(()=>{var h=J(l.value);return n.set(f,h),h}):le(c,l.value,!0),!0},deleteProperty(a,f){var l=n.get(f);if(l===void 0){if(f in a){const c=o(()=>J(S));n.set(f,c),rt(s)}}else le(l,S),rt(s);return!0},get(a,f,l){var d;if(f===ue)return e;var c=n.get(f),h=f in a;if(c===void 0&&(!h||(d=Ie(a,f))!=null&&d.writable)&&(c=o(()=>{var _=ke(h?a[f]:S),O=J(_);return O}),n.set(f,c)),c!==void 0){var v=De(c);return v===S?void 0:v}return Reflect.get(a,f,l)},getOwnPropertyDescriptor(a,f){var l=Reflect.getOwnPropertyDescriptor(a,f);if(l&&"value"in l){var c=n.get(f);c&&(l.value=De(c))}else if(l===void 0){var h=n.get(f),v=h==null?void 0:h.v;if(h!==void 0&&v!==S)return{enumerable:!0,configurable:!0,value:v,writable:!0}}return l},has(a,f){var v;if(f===ue)return!0;var l=n.get(f),c=l!==void 0&&l.v!==S||Reflect.has(a,f);if(l!==void 0||y!==null&&(!c||(v=Ie(a,f))!=null&&v.writable)){l===void 0&&(l=o(()=>{var d=c?ke(a[f]):S,_=J(d);return _}),n.set(f,l));var h=De(l);if(h===S)return!1}return c},set(a,f,l,c){var St;var h=n.get(f),v=f in a;if(r&&f==="length")for(var d=l;dJ(S)),n.set(d+"",_))}if(h===void 0)(!v||(St=Ie(a,f))!=null&&St.writable)&&(h=o(()=>J(void 0)),le(h,ke(l)),n.set(f,h));else{v=h.v!==S;var O=o(()=>ke(l));le(h,O)}var N=Reflect.getOwnPropertyDescriptor(a,f);if(N!=null&&N.set&&N.set.call(c,l),!v){if(r&&typeof f=="string"){var xe=n.get("length"),Oe=Number(f);Number.isInteger(Oe)&&Oe>=xe.v&&le(xe,Oe+1)}rt(s)}return!0},ownKeys(a){De(s);var f=Reflect.ownKeys(a).filter(h=>{var v=n.get(h);return v===void 0||v.v!==S});for(var[l,c]of n)c.v!==S&&!(l in a)&&f.push(l);return f},setPrototypeOf(){Fn()}})}function Dt(e){try{if(e!==null&&typeof e=="object"&&ue in e)return e[ue]}catch{}return e}function us(e,t){return Object.is(Dt(e),Dt(t))}var It,lr,tn,nn;function cs(){if(It===void 0){It=window,lr=/Firefox/.test(navigator.userAgent);var e=Element.prototype,t=Node.prototype,n=Text.prototype;tn=Ie(t,"firstChild").get,nn=Ie(t,"nextSibling").get,Nt(e)&&(e.__click=void 0,e.__className=void 0,e.__attributes=null,e.__style=void 0,e.__e=void 0),Nt(n)&&(n.__t=void 0)}}function $e(e=""){return document.createTextNode(e)}function Ze(e){return tn.call(e)}function se(e){return nn.call(e)}function _s(e,t){if(!ne)return Ze(e);var n=Ze(T);if(n===null)n=T.appendChild($e());else if(t&&n.nodeType!==Qe){var r=$e();return n==null||n.before(r),Se(r),r}return t&&bt(n),Se(n),n}function vs(e,t=!1){if(!ne){var n=Ze(e);return n instanceof Comment&&n.data===""?se(n):n}if(t){if((T==null?void 0:T.nodeType)!==Qe){var r=$e();return T==null||T.before(r),Se(r),r}bt(T)}return T}function ds(e,t=1,n=!1){let r=ne?T:e;for(var s;t--;)s=r,r=se(r);if(!ne)return r;if(n){if((r==null?void 0:r.nodeType)!==Qe){var i=$e();return r===null?s==null||s.after(i):r.before(i),Se(i),i}bt(r)}return Se(r),r}function fr(e){e.textContent=""}function hs(){return!1}function ps(e,t,n){return document.createElementNS(t??qn,e,void 0)}function bt(e){if(e.nodeValue.length<65536)return;let t=e.nextSibling;for(;t!==null&&t.nodeType===Qe;)t.remove(),e.nodeValue+=t.nodeValue,t=e.nextSibling}function ws(e,t){if(t){const n=document.body;e.autofocus=!0,lt(()=>{document.activeElement===n&&e.focus()})}}function ys(e){ne&&Ze(e)!==null&&fr(e)}let Mt=!1;function ar(){Mt||(Mt=!0,document.addEventListener("reset",e=>{Promise.resolve().then(()=>{var t;if(!e.defaultPrevented)for(const n of e.target.elements)(t=n.__on_r)==null||t.call(n)})},{capture:!0}))}function Tt(e){var t=p,n=y;re(null),Re(null);try{return e()}finally{re(t),Re(n)}}function Es(e,t,n,r=n){e.addEventListener(t,()=>Tt(n));const s=e.__on_r;s?e.__on_r=()=>{s(),r(!0)}:e.__on_r=()=>r(!0),ar()}function rn(e){y===null&&(p===null&&Mn(),In()),pe&&Dn()}function or(e,t){var n=t.last;n===null?t.last=t.first=e:(n.next=e,e.prev=n,t.last=e)}function U(e,t){var n=y;n!==null&&(n.f&H)!==0&&(e|=H);var r={ctx:g,deps:null,nodes:null,f:e|x|F,first:null,fn:t,last:null,next:null,parent:n,b:n&&n.b,prev:null,teardown:null,wv:0,ac:null};w==null||w.register_created_effect(r);var s=r;if((e&Ae)!==0)Ee!==null?Ee.push(r):de.ensure().schedule(r);else if(t!==null){try{Ne(r)}catch(o){throw he(r),o}s.deps===null&&s.teardown===null&&s.nodes===null&&s.first===s.last&&(s.f&je)===0&&(s=s.first,(e&Z)!==0&&(e&Ge)!==0&&s!==null&&(s.f|=Ge))}if(s!==null&&(s.parent=n,n!==null&&or(s,n),p!==null&&(p.f&A)!==0&&(e&_e)===0)){var i=p;(i.effects??(i.effects=[])).push(s)}return r}function sn(){return p!==null&&!Y}function ur(e){const t=U(Le,null);return E(t,b),t.teardown=e,t}function gs(e){rn();var t=y.f,n=!p&&(t&G)!==0&&(t&we)===0;if(n){var r=g;(r.e??(r.e=[])).push(e)}else return ln(e)}function ln(e){return U(Ae|Yt,e)}function ms(e){return rn(),U(Le|Yt,e)}function bs(e){de.ensure();const t=U(_e|je,e);return(n={})=>new Promise(r=>{n.outro?dr(t,()=>{he(t),r(void 0)}):(he(t),r(void 0))})}function Ts(e){return U(Ae,e)}function cr(e){return U(Je|je,e)}function As(e,t=0){return U(Le|t,e)}function Ss(e,t=[],n=[],r=[]){Jn(r,t,n,s=>{U(Le,()=>e(...s.map(De)))})}function Rs(e,t=0){var n=U(Z|t,e);return n}function Ns(e,t=0){var n=U(vt|t,e);return n}function xs(e){return U(G|je,e)}function fn(e){var t=e.teardown;if(t!==null){const n=pe,r=p;Ct(!0),re(null);try{t.call(null)}finally{Ct(n),re(r)}}}function At(e,t=!1){var n=e.first;for(e.first=e.last=null;n!==null;){const s=n.ac;s!==null&&Tt(()=>{s.abort(K)});var r=n.next;(n.f&_e)!==0?n.parent=null:he(n,t),n=r}}function _r(e){for(var t=e.first;t!==null;){var n=t.next;(t.f&G)===0&&he(t),t=n}}function he(e,t=!0){var n=!1;(t||(e.f&xn)!==0)&&e.nodes!==null&&e.nodes.end!==null&&(vr(e.nodes.start,e.nodes.end),n=!0),E(e,xt),At(e,t&&!n),Ce(e,0);var r=e.nodes&&e.nodes.t;if(r!==null)for(const i of r)i.stop();fn(e),e.f^=xt,e.f|=q;var s=e.parent;s!==null&&s.first!==null&&an(e),e.next=e.prev=e.teardown=e.ctx=e.deps=e.fn=e.nodes=e.ac=e.b=null}function vr(e,t){for(;e!==null;){var n=e===t?null:se(e);e.remove(),e=n}}function an(e){var t=e.parent,n=e.prev,r=e.next;n!==null&&(n.next=r),r!==null&&(r.prev=n),t!==null&&(t.first===e&&(t.first=r),t.last===e&&(t.last=n))}function dr(e,t,n=!0){var r=[];on(e,r,!0);var s=()=>{n&&he(e),t&&t()},i=r.length;if(i>0){var o=()=>--i||s();for(var a of r)a.out(o)}else s()}function on(e,t,n){if((e.f&H)===0){e.f^=H;var r=e.nodes&&e.nodes.t;if(r!==null)for(const a of r)(a.is_global||n)&&t.push(a);for(var s=e.first;s!==null;){var i=s.next,o=(s.f&Ge)!==0||(s.f&G)!==0&&(e.f&Z)!==0;on(s,t,o?n:!1),s=i}}}function Os(e){un(e,!0)}function un(e,t){if((e.f&H)!==0){e.f^=H,(e.f&b)===0&&(E(e,x),de.ensure().schedule(e));for(var n=e.first;n!==null;){var r=n.next,s=(n.f&Ge)!==0||(n.f&G)!==0;un(n,s?t:!1),n=r}var i=e.nodes&&e.nodes.t;if(i!==null)for(const o of i)(o.is_global||t)&&o.in()}}function ks(e,t){if(e.nodes)for(var n=e.nodes.start,r=e.nodes.end;n!==null;){var s=n===r?null:se(n);t.append(n),n=s}}let Be=!1,pe=!1;function Ct(e){pe=e}let p=null,Y=!1;function re(e){p=e}let y=null;function Re(e){y=e}let L=null;function cn(e){p!==null&&(L===null?L=[e]:L.push(e))}let D=null,M=0,P=null;function hr(e){P=e}let _n=1,ae=0,ce=ae;function Pt(e){ce=e}function vn(){return++_n}function He(e){var t=e.f;if((t&x)!==0)return!0;if(t&A&&(e.f&=~ve),(t&z)!==0){for(var n=e.deps,r=n.length,s=0;se.wv)return!0}(t&F)!==0&&R===null&&E(e,b)}return!1}function dn(e,t,n=!0){var r=e.reactions;if(r!==null&&!(L!==null&&Te.call(L,e)))for(var s=0;s{e.ac.abort(K)}),e.ac=null);try{e.f|=it;var c=e.fn,h=c();e.f|=we;var v=e.deps,d=w==null?void 0:w.is_fork;if(D!==null){var _;if(d||Ce(e,M),v!==null&&M>0)for(v.length=M+D.length,_=0;_{const n=s()??null;e.ensure(n,n&&(o=>n(o,...a)))},t)}export{E as s}; diff --git a/frontend/dist/_app/immutable/chunks/DmjnTBOd.js b/frontend/dist/_app/immutable/chunks/DmjnTBOd.js deleted file mode 100644 index e7c9d0c..0000000 --- a/frontend/dist/_app/immutable/chunks/DmjnTBOd.js +++ /dev/null @@ -1 +0,0 @@ -import{i as d,u as g,j as c,k as m,l as i,n as b,o as p,q as v,t as k,v as h}from"./VJhVTb1A.js";function x(n=!1){const s=d,e=s.l.u;if(!e)return;let f=()=>v(s.s);if(n){let o=0,t={};const _=k(()=>{let l=!1;const r=s.s;for(const a in r)r[a]!==t[a]&&(t[a]=r[a],l=!0);return l&&o++,o});f=()=>p(_)}e.b.length&&g(()=>{u(s,f),i(e.b)}),c(()=>{const o=m(()=>e.m.map(b));return()=>{for(const t of o)typeof t=="function"&&t()}}),e.a.length&&c(()=>{u(s,f),i(e.a)})}function u(n,s){if(n.l.s)for(const e of n.l.s)p(e);s()}h();export{x as i}; diff --git a/frontend/dist/_app/immutable/chunks/Dy37i2LO.js b/frontend/dist/_app/immutable/chunks/Dy37i2LO.js new file mode 100644 index 0000000..23cf7a2 --- /dev/null +++ b/frontend/dist/_app/immutable/chunks/Dy37i2LO.js @@ -0,0 +1 @@ +import{b as A,h as P,w as x,E as D,O as N,P as Y,y as B,Q as S,f as L,S as C,g as F,U as Z,V as q,j,o as m,W as z,X as O,Y as y,Z as H,_ as Q,D as w,$ as V,a0 as W,a1 as X,a2 as J,a3 as k,i as rr,a4 as er,a5 as nr,G as tr,a6 as sr,a7 as ar,a8 as v,a9 as M}from"./D2EIOFXK.js";import{B as U}from"./lwvwhigX.js";let b=!1;function ir(r){var e=b;try{return b=!1,[r(),b]}finally{b=e}}function cr(r,e,n=!1){var t;P&&(t=L,x());var s=new U(r),i=n?D:0;function o(a,f){if(P){var c=N(t);if(a!==parseInt(c.substring(1))){var u=Y();B(u),s.anchor=u,S(!1),s.ensure(a,f),S(!0);return}}s.ensure(a,f)}A(()=>{var a=!1;e((f,c=0)=>{a=!0,o(c,f)}),a||o(-1,null)},i)}function dr(r,e,n){var t;P&&(t=L,x());var s=new U(r);A(()=>{var i=e()??null;if(P){var o=N(t),a=o===C,f=i!==null;if(a!==f){var c=Y();B(c),s.anchor=c,S(!1),s.ensure(i,i&&(u=>n(u,i))),S(!0);return}}s.ensure(i,i&&(u=>n(u,i)))},D)}function T(r,e){return r===e||(r==null?void 0:r[O])===e}function pr(r={},e,n,t){var s=F.r,i=m;return Z(()=>{var o,a;return q(()=>{o=a,a=[],j(()=>{r!==n(...a)&&(e(r,...a),o&&T(n(...o),r)&&e(null,...o))})}),()=>{let f=i;for(;f!==s&&f.parent!==null&&f.parent.f&z;)f=f.parent;const c=()=>{a&&T(n(...a),r)&&e(null,...a)},u=f.teardown;f.teardown=()=>{c(),u==null||u()}}}),r}const fr={get(r,e){if(!r.exclude.includes(e))return r.props[e]},set(r,e){return!1},getOwnPropertyDescriptor(r,e){if(!r.exclude.includes(e)&&e in r.props)return{enumerable:!0,configurable:!0,value:r.props[e]}},has(r,e){return r.exclude.includes(e)?!1:e in r.props},ownKeys(r){return Reflect.ownKeys(r.props).filter(e=>!r.exclude.includes(e))}};function _r(r,e,n){return new Proxy({props:r,exclude:e},fr)}const ur={get(r,e){let n=r.props.length;for(;n--;){let t=r.props[n];if(v(t)&&(t=t()),typeof t=="object"&&t!==null&&e in t)return t[e]}},set(r,e,n){let t=r.props.length;for(;t--;){let s=r.props[t];v(s)&&(s=s());const i=y(s,e);if(i&&i.set)return i.set(n),!0}return!1},getOwnPropertyDescriptor(r,e){let n=r.props.length;for(;n--;){let t=r.props[n];if(v(t)&&(t=t()),typeof t=="object"&&t!==null&&e in t){const s=y(t,e);return s&&!s.configurable&&(s.configurable=!0),s}}},has(r,e){if(e===O||e===M)return!1;for(let n of r.props)if(v(n)&&(n=n()),n!=null&&e in n)return!0;return!1},ownKeys(r){const e=[];for(let n of r.props)if(v(n)&&(n=n()),!!n){for(const t in n)e.includes(t)||e.push(t);for(const t of Object.getOwnPropertySymbols(n))e.includes(t)||e.push(t)}return e}};function vr(...r){return new Proxy({props:r},ur)}function hr(r,e,n,t){var E;var s=!rr||(n&er)!==0,i=(n&k)!==0,o=(n&ar)!==0,a=t,f=!0,c=()=>(f&&(f=!1,a=o?j(t):t),a);let u;if(i){var G=O in r||M in r;u=((E=y(r,e))==null?void 0:E.set)??(G&&e in r?l=>r[e]=l:void 0)}var p,R=!1;i?[p,R]=ir(()=>r[e]):p=r[e],p===void 0&&t!==void 0&&(p=c(),u&&(s&&H(),u(p)));var d;if(s?d=()=>{var l=r[e];return l===void 0?c():(f=!0,l)}:d=()=>{var l=r[e];return l!==void 0&&(a=void 0),l===void 0?a:l},s&&(n&Q)===0)return d;if(u){var K=r.$$legacy;return(function(l,h){return arguments.length>0?((!s||!h||K||R)&&u(h?d():l),l):d()})}var g=!1,_=((n&nr)!==0?tr:sr)(()=>(g=!1,d()));i&&w(_);var $=m;return(function(l,h){if(arguments.length>0){const I=h?w(_):s&&i?V(l):l;return W(_,I),g=!0,a!==void 0&&(a=I),l}return X&&g||($.f&J)!==0?_.v:w(_)})}export{pr as b,dr as c,cr as i,hr as p,_r as r,vr as s}; diff --git a/frontend/dist/_app/immutable/chunks/C14P8jaG.js b/frontend/dist/_app/immutable/chunks/IT17IssP.js similarity index 61% rename from frontend/dist/_app/immutable/chunks/C14P8jaG.js rename to frontend/dist/_app/immutable/chunks/IT17IssP.js index 04daf39..8b7225b 100644 --- a/frontend/dist/_app/immutable/chunks/C14P8jaG.js +++ b/frontend/dist/_app/immutable/chunks/IT17IssP.js @@ -1 +1 @@ -import{D as g,c as v,F as h,G as f,H as E,T as w,I as N,h as d,f as s,R as y,J as M,K as L,L as x,M as A}from"./VJhVTb1A.js";var m;const c=((m=globalThis==null?void 0:globalThis.window)==null?void 0:m.trustedTypes)&&globalThis.window.trustedTypes.createPolicy("svelte-trusted-html",{createHTML:e=>e});function R(e){return(c==null?void 0:c.createHTML(e))??e}function p(e){var t=g("template");return t.innerHTML=R(e.replaceAll("","")),t.content}function n(e,t){var r=h;r.nodes===null&&(r.nodes={start:e,end:t,a:null,t:null})}function P(e,t){var r=(t&w)!==0,l=(t&N)!==0,a,u=!e.startsWith("");return()=>{if(d)return n(s,null),s;a===void 0&&(a=p(u?e:""+e),r||(a=f(a)));var o=l||E?document.importNode(a,!0):a.cloneNode(!0);if(r){var _=f(o),i=o.lastChild;n(_,i)}else n(o,o);return o}}function b(e,t,r="svg"){var l=!e.startsWith(""),a=`<${r}>${l?e:""+e}`,u;return()=>{if(d)return n(s,null),s;if(!u){var o=p(a),_=f(o);u=f(_)}var i=u.cloneNode(!0);return n(i,i),i}}function C(e,t){return b(e,t,"svg")}function D(e=""){if(!d){var t=v(e+"");return n(t,t),t}var r=s;return r.nodeType!==L?(r.before(r=v()),x(r)):A(r),n(r,r),r}function H(){if(d)return n(s,null),s;var e=document.createDocumentFragment(),t=document.createComment(""),r=v();return e.append(t,r),n(t,r),e}function F(e,t){if(d){var r=h;((r.f&y)===0||r.nodes.end===null)&&(r.nodes.end=s),M();return}e!==null&&e.before(t)}const I="5";var T;typeof window<"u"&&((T=window.__svelte??(window.__svelte={})).v??(T.v=new Set)).add(I);export{F as a,n as b,H as c,C as d,P as f,D as t}; +import{n as g,c as v,o as h,q as f,t as w,T as E,v as y,h as d,f as s,R as N,w as x,x as M,y as A,z as L}from"./D2EIOFXK.js";var m;const c=((m=globalThis==null?void 0:globalThis.window)==null?void 0:m.trustedTypes)&&globalThis.window.trustedTypes.createPolicy("svelte-trusted-html",{createHTML:e=>e});function R(e){return(c==null?void 0:c.createHTML(e))??e}function p(e){var t=g("template");return t.innerHTML=R(e.replaceAll("","")),t.content}function n(e,t){var r=h;r.nodes===null&&(r.nodes={start:e,end:t,a:null,t:null})}function C(e,t){var r=(t&E)!==0,l=(t&y)!==0,a,u=!e.startsWith("");return()=>{if(d)return n(s,null),s;a===void 0&&(a=p(u?e:""+e),r||(a=f(a)));var o=l||w?document.importNode(a,!0):a.cloneNode(!0);if(r){var _=f(o),i=o.lastChild;n(_,i)}else n(o,o);return o}}function b(e,t,r="svg"){var l=!e.startsWith(""),a=`<${r}>${l?e:""+e}`,u;return()=>{if(d)return n(s,null),s;if(!u){var o=p(a),_=f(o);u=f(_)}var i=u.cloneNode(!0);return n(i,i),i}}function I(e,t){return b(e,t,"svg")}function D(e=""){if(!d){var t=v(e+"");return n(t,t),t}var r=s;return r.nodeType!==M?(r.before(r=v()),A(r)):L(r),n(r,r),r}function H(){if(d)return n(s,null),s;var e=document.createDocumentFragment(),t=document.createComment(""),r=v();return e.append(t,r),n(t,r),e}function S(e,t){if(d){var r=h;((r.f&N)===0||r.nodes.end===null)&&(r.nodes.end=s),x();return}e!==null&&e.before(t)}const O="5";var T;typeof window<"u"&&((T=window.__svelte??(window.__svelte={})).v??(T.v=new Set)).add(O);export{S as a,n as b,H as c,I as d,C as f,D as t}; diff --git a/frontend/dist/_app/immutable/chunks/VJhVTb1A.js b/frontend/dist/_app/immutable/chunks/VJhVTb1A.js deleted file mode 100644 index 7639c39..0000000 --- a/frontend/dist/_app/immutable/chunks/VJhVTb1A.js +++ /dev/null @@ -1 +0,0 @@ -var yn=Object.defineProperty;var Rt=e=>{throw TypeError(e)};var En=(e,t,n)=>t in e?yn(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n;var le=(e,t,n)=>En(e,typeof t!="symbol"?t+"":t,n),tt=(e,t,n)=>t.has(e)||Rt("Cannot "+n);var u=(e,t,n)=>(tt(e,t,"read from private field"),n?n.call(e):t.get(e)),k=(e,t,n)=>t.has(e)?Rt("Cannot add the same private member more than once"):t instanceof WeakSet?t.add(e):t.set(e,n),ye=(e,t,n,r)=>(tt(e,t,"write to private field"),r?r.call(e,n):t.set(e,n),n),I=(e,t,n)=>(tt(e,t,"access private method"),n);var gn=Array.isArray,mn=Array.prototype.indexOf,Ae=Array.prototype.includes,hr=Array.from,pr=Object.defineProperty,Ie=Object.getOwnPropertyDescriptor,bn=Object.getOwnPropertyDescriptors,Tn=Object.prototype,An=Array.prototype,Lt=Object.getPrototypeOf,Nt=Object.isExtensible;function wr(e){return typeof e=="function"}const Sn=()=>{};function yr(e){return e()}function Rn(e){for(var t=0;t{e=r,t=s});return{promise:n,resolve:e,reject:t}}function Er(e,t){if(Array.isArray(e))return e;if(!(Symbol.iterator in e))return Array.from(e);const n=[];for(const r of e)if(n.push(r),n.length===t)break;return n}const T=2,Se=4,Le=8,vt=1<<24,Z=16,G=32,_e=64,Nn=128,F=512,m=1024,N=2048,z=4096,H=8192,q=16384,we=32768,Ot=1<<25,Ge=65536,st=1<<17,On=1<<18,je=1<<19,Yt=1<<20,gr=1<<25,ve=65536,it=1<<21,Je=1<<22,te=1<<23,ue=Symbol("$state"),mr=Symbol("legacy props"),br=Symbol(""),K=new class extends Error{constructor(){super(...arguments);le(this,"name","StaleReactionError");le(this,"message","The reaction that called `getAbortSignal()` was re-run or destroyed")}};var Ft;const Ar=!!((Ft=globalThis.document)!=null&&Ft.contentType)&&globalThis.document.contentType.includes("xml"),Sr=1,Qe=3,Ht=8;function xn(){throw new Error("https://svelte.dev/e/async_derived_orphan")}function Rr(e,t,n){throw new Error("https://svelte.dev/e/each_key_duplicate")}function kn(e){throw new Error("https://svelte.dev/e/effect_in_teardown")}function Dn(){throw new Error("https://svelte.dev/e/effect_in_unowned_derived")}function In(e){throw new Error("https://svelte.dev/e/effect_orphan")}function Mn(){throw new Error("https://svelte.dev/e/effect_update_depth_exceeded")}function Nr(){throw new Error("https://svelte.dev/e/hydration_failed")}function Or(e){throw new Error("https://svelte.dev/e/props_invalid_value")}function Pn(){throw new Error("https://svelte.dev/e/state_descriptors_fixed")}function Cn(){throw new Error("https://svelte.dev/e/state_prototype_fixed")}function Fn(){throw new Error("https://svelte.dev/e/state_unsafe_mutation")}function xr(){throw new Error("https://svelte.dev/e/svelte_boundary_reset_onerror")}const kr=1,Dr=2,Ir=4,Mr=8,Pr=16,Cr=1,Fr=2,Lr=4,jr=8,Yr=16,Hr=1,qr=2,Ln="[",jn="[!",Ur="[?",Yn="]",dt={},A=Symbol(),Hn="http://www.w3.org/1999/xhtml",Vr="http://www.w3.org/2000/svg",Br="http://www.w3.org/1998/Math/MathML",Gr="@attach";function ht(e){console.warn("https://svelte.dev/e/hydration_mismatch")}function zr(){console.warn("https://svelte.dev/e/select_multiple_invalid_value")}function Kr(){console.warn("https://svelte.dev/e/svelte_boundary_reset_noop")}let re=!1;function Xr(e){re=e}let b;function Re(e){if(e===null)throw ht(),dt;return b=e}function $r(){return Re(ie(b))}function Zr(e){if(re){if(ie(b)!==null)throw ht(),dt;b=e}}function Wr(e=1){if(re){for(var t=e,n=b;t--;)n=ie(n);b=n}}function Jr(e=!0){for(var t=0,n=b;;){if(n.nodeType===Ht){var r=n.data;if(r===Yn){if(t===0)return n;t-=1}else(r===Ln||r===jn||r[0]==="["&&!isNaN(Number(r.slice(1))))&&(t+=1)}var s=ie(n);e&&n.remove(),n=s}}function Qr(e){if(!e||e.nodeType!==Ht)throw ht(),dt;return e.data}function qt(e){return e===this.v}function qn(e,t){return e!=e?t==t:e!==t||e!==null&&typeof e=="object"||typeof e=="function"}function Ut(e){return!qn(e,this.v)}let et=!1;function es(){et=!0}let O=null;function ze(e){O=e}function ts(e,t=!1,n){O={p:O,i:!1,c:null,e:null,s:e,x:null,r:y,l:et&&!t?{s:null,u:null,$:[]}:null}}function ns(e){var t=O,n=t.e;if(n!==null){t.e=null;for(var r of n)ln(r)}return t.i=!0,O=t.p,{}}function Ye(){return!et||O!==null&&O.l===null}let fe=[];function Vt(){var e=fe;fe=[],Rn(e)}function lt(e){if(fe.length===0&&!Me){var t=fe;queueMicrotask(()=>{t===fe&&Vt()})}fe.push(e)}function Un(){for(;fe.length>0;)Vt()}function Vn(e){var t=y;if(t===null)return p.f|=te,e;if((t.f&we)===0&&(t.f&Se)===0)throw e;Ke(e,t)}function Ke(e,t){for(;t!==null;){if((t.f&Nn)!==0){if((t.f&we)===0)throw e;try{t.b.error(e);return}catch(n){e=n}}t=t.parent}throw e}const Bn=-7169;function E(e,t){e.f=e.f&Bn|t}function pt(e){(e.f&F)!==0||e.deps===null?E(e,m):E(e,z)}function Bt(e){if(e!==null)for(const t of e)(t.f&T)===0||(t.f&ve)===0||(t.f^=ve,Bt(t.deps))}function Gn(e,t,n){(e.f&N)!==0?t.add(e):(e.f&z)!==0&&n.add(e),Bt(e.deps),E(e,m)}const W=new Set;let w=null,S=null,ft=null,Me=!1,nt=!1,Ee=null,qe=null;var xt=0;let zn=1;var me,be,X,V,Ce,P,Fe,ee,$,B,Te,oe,g,Ue,Gt,Ve,at,ot,zt;const We=class We{constructor(){k(this,g);le(this,"id",zn++);le(this,"current",new Map);le(this,"previous",new Map);k(this,me,new Set);k(this,be,new Set);k(this,X,new Map);k(this,V,new Map);k(this,Ce,null);k(this,P,[]);k(this,Fe,[]);k(this,ee,new Set);k(this,$,new Set);k(this,B,new Map);le(this,"is_fork",!1);k(this,Te,!1);k(this,oe,new Set)}skip_effect(t){u(this,B).has(t)||u(this,B).set(t,{d:[],m:[]})}unskip_effect(t){var n=u(this,B).get(t);if(n){u(this,B).delete(t);for(var r of n.d)E(r,N),this.schedule(r);for(r of n.m)E(r,z),this.schedule(r)}}capture(t,n,r=!1){n!==A&&!this.previous.has(t)&&this.previous.set(t,n),(t.f&te)===0&&(this.current.set(t,[t.v,r]),S==null||S.set(t,t.v))}activate(){w=this}deactivate(){w=null,S=null}flush(){try{nt=!0,w=this,I(this,g,Ve).call(this)}finally{xt=0,ft=null,Ee=null,qe=null,nt=!1,w=null,S=null,ne.clear()}}discard(){for(const t of u(this,be))t(this);u(this,be).clear(),W.delete(this)}register_created_effect(t){u(this,Fe).push(t)}increment(t,n){let r=u(this,X).get(n)??0;if(u(this,X).set(n,r+1),t){let s=u(this,V).get(n)??0;u(this,V).set(n,s+1)}}decrement(t,n,r){let s=u(this,X).get(n)??0;if(s===1?u(this,X).delete(n):u(this,X).set(n,s-1),t){let i=u(this,V).get(n)??0;i===1?u(this,V).delete(n):u(this,V).set(n,i-1)}u(this,Te)||r||(ye(this,Te,!0),lt(()=>{ye(this,Te,!1),this.flush()}))}transfer_effects(t,n){for(const r of t)u(this,ee).add(r);for(const r of n)u(this,$).add(r);t.clear(),n.clear()}oncommit(t){u(this,me).add(t)}ondiscard(t){u(this,be).add(t)}settled(){return(u(this,Ce)??ye(this,Ce,jt())).promise}static ensure(){if(w===null){const t=w=new We;nt||(W.add(w),Me||lt(()=>{w===t&&t.flush()}))}return w}apply(){{S=null;return}}schedule(t){var s;if(ft=t,(s=t.b)!=null&&s.is_pending&&(t.f&(Se|Le|vt))!==0&&(t.f&we)===0){t.b.defer_effect(t);return}for(var n=t;n.parent!==null;){n=n.parent;var r=n.f;if(Ee!==null&&n===y&&(p===null||(p.f&T)===0))return;if((r&(_e|G))!==0){if((r&m)===0)return;n.f^=m}}u(this,P).push(n)}};me=new WeakMap,be=new WeakMap,X=new WeakMap,V=new WeakMap,Ce=new WeakMap,P=new WeakMap,Fe=new WeakMap,ee=new WeakMap,$=new WeakMap,B=new WeakMap,Te=new WeakMap,oe=new WeakMap,g=new WeakSet,Ue=function(){return this.is_fork||u(this,V).size>0},Gt=function(){for(const r of u(this,oe))for(const s of u(r,V).keys()){for(var t=!1,n=s;n.parent!==null;){if(u(this,B).has(n)){t=!0;break}n=n.parent}if(!t)return!0}return!1},Ve=function(){var a,f;if(xt++>1e3&&(W.delete(this),Xn()),!I(this,g,Ue).call(this)){for(const l of u(this,ee))u(this,$).delete(l),E(l,N),this.schedule(l);for(const l of u(this,$))E(l,z),this.schedule(l)}const t=u(this,P);ye(this,P,[]),this.apply();var n=Ee=[],r=[],s=qe=[];for(const l of t)try{I(this,g,at).call(this,l,n,r)}catch(c){throw $t(l),c}if(w=null,s.length>0){var i=We.ensure();for(const l of s)i.schedule(l)}if(Ee=null,qe=null,I(this,g,Ue).call(this)||I(this,g,Gt).call(this)){I(this,g,ot).call(this,r),I(this,g,ot).call(this,n);for(const[l,c]of u(this,B))Xt(l,c)}else{u(this,X).size===0&&W.delete(this),u(this,ee).clear(),u(this,$).clear();for(const l of u(this,me))l(this);u(this,me).clear(),kt(r),kt(n),(a=u(this,Ce))==null||a.resolve()}var o=w;if(u(this,P).length>0){const l=o??(o=this);u(l,P).push(...u(this,P).filter(c=>!u(l,P).includes(c)))}o!==null&&(W.add(o),I(f=o,g,Ve).call(f)),W.has(this)||I(this,g,zt).call(this)},at=function(t,n,r){t.f^=m;for(var s=t.first;s!==null;){var i=s.f,o=(i&(G|_e))!==0,a=o&&(i&m)!==0,f=a||(i&H)!==0||u(this,B).has(s);if(!f&&s.fn!==null){o?s.f^=m:(i&Se)!==0?n.push(s):He(s)&&((i&Z)!==0&&u(this,$).add(s),Oe(s));var l=s.first;if(l!==null){s=l;continue}}for(;s!==null;){var c=s.next;if(c!==null){s=c;break}s=s.parent}}},ot=function(t){for(var n=0;n!this.current.has(_));if(s.length===0)t&&d.discard();else if(n.length>0){d.activate();var i=new Set,o=new Map;for(var a of n)Kt(a,s,i,o);o=new Map;var f=[...d.current.keys()].filter(_=>this.current.has(_)?this.current.get(_)[0]!==_:!0);for(const _ of u(this,Fe))(_.f&(q|H|st))===0&&wt(_,f,o)&&((_.f&(Je|Z))!==0?(E(_,N),d.schedule(_)):u(d,ee).add(_));if(u(d,P).length>0){d.apply();for(var l of u(d,P))I(c=d,g,at).call(c,l,[],[]);ye(d,P,[])}d.deactivate()}}for(const d of W)u(d,oe).has(this)&&(u(d,oe).delete(this),u(d,oe).size===0&&!I(h=d,g,Ue).call(h)&&(d.activate(),I(v=d,g,Ve).call(v)))};let de=We;function Kn(e){var t=Me;Me=!0;try{for(var n;;){if(Un(),w===null)return n;w.flush()}}finally{Me=t}}function Xn(){try{Mn()}catch(e){Ke(e,ft)}}let j=null;function kt(e){var t=e.length;if(t!==0){for(var n=0;n0)){ne.clear();for(const s of j){if((s.f&(q|H))!==0)continue;const i=[s];let o=s.parent;for(;o!==null;)j.has(o)&&(j.delete(o),i.push(o)),o=o.parent;for(let a=i.length-1;a>=0;a--){const f=i[a];(f.f&(q|H))===0&&Oe(f)}}j.clear()}}j=null}}function Kt(e,t,n,r){if(!n.has(e)&&(n.add(e),e.reactions!==null))for(const s of e.reactions){const i=s.f;(i&T)!==0?Kt(s,t,n,r):(i&(Je|Z))!==0&&(i&N)===0&&wt(s,t,r)&&(E(s,N),yt(s))}}function wt(e,t,n){const r=n.get(e);if(r!==void 0)return r;if(e.deps!==null)for(const s of e.deps){if(Ae.call(t,s))return!0;if((s.f&T)!==0&&wt(s,t,n))return n.set(s,!0),!0}return n.set(e,!1),!1}function yt(e){w.schedule(e)}function Xt(e,t){if(!((e.f&G)!==0&&(e.f&m)!==0)){(e.f&N)!==0?t.d.push(e):(e.f&z)!==0&&t.m.push(e),E(e,m);for(var n=e.first;n!==null;)Xt(n,t),n=n.next}}function $t(e){E(e,m);for(var t=e.first;t!==null;)$t(t),t=t.next}function $n(e,t,n,r){const s=Ye()?Et:Jn;var i=e.filter(v=>!v.settled);if(n.length===0&&i.length===0){r(t.map(s));return}var o=y,a=Zn(),f=i.length===1?i[0].promise:i.length>1?Promise.all(i.map(v=>v.promise)):null;function l(v){a();try{r(v)}catch(d){(o.f&q)===0&&Ke(d,o)}Xe()}if(n.length===0){f.then(()=>l(t.map(s)));return}var c=Zt();function h(){Promise.all(n.map(v=>Wn(v))).then(v=>l([...t.map(s),...v])).catch(v=>Ke(v,o)).finally(()=>c())}f?f.then(()=>{a(),h(),Xe()}):h()}function Zn(){var e=y,t=p,n=O,r=w;return function(i=!0){Ne(e),se(t),ze(n),i&&(e.f&q)===0&&(r==null||r.activate(),r==null||r.apply())}}function Xe(e=!0){Ne(null),se(null),ze(null),e&&(w==null||w.deactivate())}function Zt(){var e=y,t=e.b,n=w,r=t.is_rendered();return t.update_pending_count(1,n),n.increment(r,e),(s=!1)=>{t.update_pending_count(-1,n),n.decrement(r,e,s)}}function Et(e){var t=T|N,n=p!==null&&(p.f&T)!==0?p:null;return y!==null&&(y.f|=je),{ctx:O,deps:null,effects:null,equals:qt,f:t,fn:e,reactions:null,rv:0,v:A,wv:0,parent:n??y,ac:null}}function Wn(e,t,n){let r=y;r===null&&xn();var s=void 0,i=mt(A),o=!p,a=new Map;return ar(()=>{var d;var f=y,l=jt();s=l.promise;try{Promise.resolve(e()).then(l.resolve,l.reject).finally(Xe)}catch(_){l.reject(_),Xe()}var c=w;if(o){if((f.f&we)!==0)var h=Zt();if(r.b.is_rendered())(d=a.get(c))==null||d.reject(K),a.delete(c);else{for(const _ of a.values())_.reject(K);a.clear()}a.set(c,l)}const v=(_,x=void 0)=>{if(h){var R=x===K;h(R)}if(!(x===K||(f.f&q)!==0)){if(c.activate(),x)i.f|=te,ct(i,x);else{(i.f&te)!==0&&(i.f^=te),ct(i,_);for(const[xe,ke]of a){if(a.delete(xe),xe===c)break;ke.reject(K)}}c.deactivate()}};l.promise.then(v,_=>v(null,_||"unknown"))}),fr(()=>{for(const f of a.values())f.reject(K)}),new Promise(f=>{function l(c){function h(){c===s?f(i):l(s)}c.then(h,h)}l(s)})}function rs(e){const t=Et(e);return cn(t),t}function Jn(e){const t=Et(e);return t.equals=Ut,t}function Qn(e){var t=e.effects;if(t!==null){e.effects=null;for(var n=0;n0&&!Qt&&nr()}return t}function nr(){Qt=!1;for(const e of ut)(e.f&m)!==0&&E(e,z),He(e)&&Oe(e);ut.clear()}function is(e,t=1){var n=ge(e),r=t===1?n++:n--;return Q(e,n),r}function rt(e){Q(e,e.v+1)}function en(e,t,n){var r=e.reactions;if(r!==null)for(var s=Ye(),i=r.length,o=0;o{if(ce===i)return a();var f=p,l=ce;se(null),Ct(i);var c=a();return se(f),Ct(l),c};return r&&n.set("length",J(e.length)),new Proxy(e,{defineProperty(a,f,l){(!("value"in l)||l.configurable===!1||l.enumerable===!1||l.writable===!1)&&Pn();var c=n.get(f);return c===void 0?o(()=>{var h=J(l.value);return n.set(f,h),h}):Q(c,l.value,!0),!0},deleteProperty(a,f){var l=n.get(f);if(l===void 0){if(f in a){const c=o(()=>J(A));n.set(f,c),rt(s)}}else Q(l,A),rt(s);return!0},get(a,f,l){var d;if(f===ue)return e;var c=n.get(f),h=f in a;if(c===void 0&&(!h||(d=Ie(a,f))!=null&&d.writable)&&(c=o(()=>{var _=De(h?a[f]:A),x=J(_);return x}),n.set(f,c)),c!==void 0){var v=ge(c);return v===A?void 0:v}return Reflect.get(a,f,l)},getOwnPropertyDescriptor(a,f){var l=Reflect.getOwnPropertyDescriptor(a,f);if(l&&"value"in l){var c=n.get(f);c&&(l.value=ge(c))}else if(l===void 0){var h=n.get(f),v=h==null?void 0:h.v;if(h!==void 0&&v!==A)return{enumerable:!0,configurable:!0,value:v,writable:!0}}return l},has(a,f){var v;if(f===ue)return!0;var l=n.get(f),c=l!==void 0&&l.v!==A||Reflect.has(a,f);if(l!==void 0||y!==null&&(!c||(v=Ie(a,f))!=null&&v.writable)){l===void 0&&(l=o(()=>{var d=c?De(a[f]):A,_=J(d);return _}),n.set(f,l));var h=ge(l);if(h===A)return!1}return c},set(a,f,l,c){var St;var h=n.get(f),v=f in a;if(r&&f==="length")for(var d=l;dJ(A)),n.set(d+"",_))}if(h===void 0)(!v||(St=Ie(a,f))!=null&&St.writable)&&(h=o(()=>J(void 0)),Q(h,De(l)),n.set(f,h));else{v=h.v!==A;var x=o(()=>De(l));Q(h,x)}var R=Reflect.getOwnPropertyDescriptor(a,f);if(R!=null&&R.set&&R.set.call(c,l),!v){if(r&&typeof f=="string"){var xe=n.get("length"),ke=Number(f);Number.isInteger(ke)&&ke>=xe.v&&Q(xe,ke+1)}rt(s)}return!0},ownKeys(a){ge(s);var f=Reflect.ownKeys(a).filter(h=>{var v=n.get(h);return v===void 0||v.v!==A});for(var[l,c]of n)c.v!==A&&!(l in a)&&f.push(l);return f},setPrototypeOf(){Cn()}})}function Dt(e){try{if(e!==null&&typeof e=="object"&&ue in e)return e[ue]}catch{}return e}function ls(e,t){return Object.is(Dt(e),Dt(t))}var It,rr,tn,nn;function fs(){if(It===void 0){It=window,rr=/Firefox/.test(navigator.userAgent);var e=Element.prototype,t=Node.prototype,n=Text.prototype;tn=Ie(t,"firstChild").get,nn=Ie(t,"nextSibling").get,Nt(e)&&(e.__click=void 0,e.__className=void 0,e.__attributes=null,e.__style=void 0,e.__e=void 0),Nt(n)&&(n.__t=void 0)}}function $e(e=""){return document.createTextNode(e)}function Ze(e){return tn.call(e)}function ie(e){return nn.call(e)}function as(e,t){if(!re)return Ze(e);var n=Ze(b);if(n===null)n=b.appendChild($e());else if(t&&n.nodeType!==Qe){var r=$e();return n==null||n.before(r),Re(r),r}return t&&bt(n),Re(n),n}function os(e,t=!1){if(!re){var n=Ze(e);return n instanceof Comment&&n.data===""?ie(n):n}if(t){if((b==null?void 0:b.nodeType)!==Qe){var r=$e();return b==null||b.before(r),Re(r),r}bt(b)}return b}function us(e,t=1,n=!1){let r=re?b:e;for(var s;t--;)s=r,r=ie(r);if(!re)return r;if(n){if((r==null?void 0:r.nodeType)!==Qe){var i=$e();return r===null?s==null||s.after(i):r.before(i),Re(i),i}bt(r)}return Re(r),r}function sr(e){e.textContent=""}function cs(){return!1}function _s(e,t,n){return document.createElementNS(t??Hn,e,void 0)}function bt(e){if(e.nodeValue.length<65536)return;let t=e.nextSibling;for(;t!==null&&t.nodeType===Qe;)t.remove(),e.nodeValue+=t.nodeValue,t=e.nextSibling}function vs(e,t){if(t){const n=document.body;e.autofocus=!0,lt(()=>{document.activeElement===n&&e.focus()})}}function ds(e){re&&Ze(e)!==null&&sr(e)}let Mt=!1;function ir(){Mt||(Mt=!0,document.addEventListener("reset",e=>{Promise.resolve().then(()=>{var t;if(!e.defaultPrevented)for(const n of e.target.elements)(t=n.__on_r)==null||t.call(n)})},{capture:!0}))}function Tt(e){var t=p,n=y;se(null),Ne(null);try{return e()}finally{se(t),Ne(n)}}function hs(e,t,n,r=n){e.addEventListener(t,()=>Tt(n));const s=e.__on_r;s?e.__on_r=()=>{s(),r(!0)}:e.__on_r=()=>r(!0),ir()}function rn(e){y===null&&(p===null&&In(),Dn()),pe&&kn()}function lr(e,t){var n=t.last;n===null?t.last=t.first=e:(n.next=e,e.prev=n,t.last=e)}function U(e,t){var n=y;n!==null&&(n.f&H)!==0&&(e|=H);var r={ctx:O,deps:null,nodes:null,f:e|N|F,first:null,fn:t,last:null,next:null,parent:n,b:n&&n.b,prev:null,teardown:null,wv:0,ac:null};w==null||w.register_created_effect(r);var s=r;if((e&Se)!==0)Ee!==null?Ee.push(r):de.ensure().schedule(r);else if(t!==null){try{Oe(r)}catch(o){throw he(r),o}s.deps===null&&s.teardown===null&&s.nodes===null&&s.first===s.last&&(s.f&je)===0&&(s=s.first,(e&Z)!==0&&(e&Ge)!==0&&s!==null&&(s.f|=Ge))}if(s!==null&&(s.parent=n,n!==null&&lr(s,n),p!==null&&(p.f&T)!==0&&(e&_e)===0)){var i=p;(i.effects??(i.effects=[])).push(s)}return r}function sn(){return p!==null&&!Y}function fr(e){const t=U(Le,null);return E(t,m),t.teardown=e,t}function ps(e){rn();var t=y.f,n=!p&&(t&G)!==0&&(t&we)===0;if(n){var r=O;(r.e??(r.e=[])).push(e)}else return ln(e)}function ln(e){return U(Se|Yt,e)}function ws(e){return rn(),U(Le|Yt,e)}function ys(e){de.ensure();const t=U(_e|je,e);return(n={})=>new Promise(r=>{n.outro?cr(t,()=>{he(t),r(void 0)}):(he(t),r(void 0))})}function Es(e){return U(Se,e)}function ar(e){return U(Je|je,e)}function gs(e,t=0){return U(Le|t,e)}function ms(e,t=[],n=[],r=[]){$n(r,t,n,s=>{U(Le,()=>e(...s.map(ge)))})}function bs(e,t=0){var n=U(Z|t,e);return n}function Ts(e,t=0){var n=U(vt|t,e);return n}function As(e){return U(G|je,e)}function fn(e){var t=e.teardown;if(t!==null){const n=pe,r=p;Pt(!0),se(null);try{t.call(null)}finally{Pt(n),se(r)}}}function At(e,t=!1){var n=e.first;for(e.first=e.last=null;n!==null;){const s=n.ac;s!==null&&Tt(()=>{s.abort(K)});var r=n.next;(n.f&_e)!==0?n.parent=null:he(n,t),n=r}}function or(e){for(var t=e.first;t!==null;){var n=t.next;(t.f&G)===0&&he(t),t=n}}function he(e,t=!0){var n=!1;(t||(e.f&On)!==0)&&e.nodes!==null&&e.nodes.end!==null&&(ur(e.nodes.start,e.nodes.end),n=!0),E(e,Ot),At(e,t&&!n),Pe(e,0);var r=e.nodes&&e.nodes.t;if(r!==null)for(const i of r)i.stop();fn(e),e.f^=Ot,e.f|=q;var s=e.parent;s!==null&&s.first!==null&&an(e),e.next=e.prev=e.teardown=e.ctx=e.deps=e.fn=e.nodes=e.ac=e.b=null}function ur(e,t){for(;e!==null;){var n=e===t?null:ie(e);e.remove(),e=n}}function an(e){var t=e.parent,n=e.prev,r=e.next;n!==null&&(n.next=r),r!==null&&(r.prev=n),t!==null&&(t.first===e&&(t.first=r),t.last===e&&(t.last=n))}function cr(e,t,n=!0){var r=[];on(e,r,!0);var s=()=>{n&&he(e),t&&t()},i=r.length;if(i>0){var o=()=>--i||s();for(var a of r)a.out(o)}else s()}function on(e,t,n){if((e.f&H)===0){e.f^=H;var r=e.nodes&&e.nodes.t;if(r!==null)for(const a of r)(a.is_global||n)&&t.push(a);for(var s=e.first;s!==null;){var i=s.next,o=(s.f&Ge)!==0||(s.f&G)!==0&&(e.f&Z)!==0;on(s,t,o?n:!1),s=i}}}function Ss(e){un(e,!0)}function un(e,t){if((e.f&H)!==0){e.f^=H,(e.f&m)===0&&(E(e,N),de.ensure().schedule(e));for(var n=e.first;n!==null;){var r=n.next,s=(n.f&Ge)!==0||(n.f&G)!==0;un(n,s?t:!1),n=r}var i=e.nodes&&e.nodes.t;if(i!==null)for(const o of i)(o.is_global||t)&&o.in()}}function Rs(e,t){if(e.nodes)for(var n=e.nodes.start,r=e.nodes.end;n!==null;){var s=n===r?null:ie(n);t.append(n),n=s}}let Be=!1,pe=!1;function Pt(e){pe=e}let p=null,Y=!1;function se(e){p=e}let y=null;function Ne(e){y=e}let L=null;function cn(e){p!==null&&(L===null?L=[e]:L.push(e))}let D=null,M=0,C=null;function _r(e){C=e}let _n=1,ae=0,ce=ae;function Ct(e){ce=e}function vn(){return++_n}function He(e){var t=e.f;if((t&N)!==0)return!0;if(t&T&&(e.f&=~ve),(t&z)!==0){for(var n=e.deps,r=n.length,s=0;se.wv)return!0}(t&F)!==0&&S===null&&E(e,m)}return!1}function dn(e,t,n=!0){var r=e.reactions;if(r!==null&&!(L!==null&&Ae.call(L,e)))for(var s=0;s{e.ac.abort(K)}),e.ac=null);try{e.f|=it;var c=e.fn,h=c();e.f|=we;var v=e.deps,d=w==null?void 0:w.is_fork;if(D!==null){var _;if(d||Pe(e,M),v!==null&&M>0)for(v.length=M+D.length,_=0;_{throw TypeError(i)};var D=(i,e,s)=>e in i?B(i,e,{enumerable:!0,configurable:!0,writable:!0,value:s}):i[e]=s;var w=(i,e,s)=>D(i,typeof e!="symbol"?e+"":e,s),y=(i,e,s)=>e.has(i)||g("Cannot "+s);var t=(i,e,s)=>(y(i,e,"read from private field"),s?s.call(i):e.get(i)),l=(i,e,s)=>e.has(i)?g("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(i):e.set(i,s),M=(i,e,s,a)=>(y(i,e,"write to private field"),a?a.call(i,s):e.set(i,s),s);import{r as F,d as b,p as C,c as x,a as A,e as S,h as j,f as q,m as z,s as E}from"./VJhVTb1A.js";var h,n,r,u,p,_,v;class I{constructor(e,s=!0){w(this,"anchor");l(this,h,new Map);l(this,n,new Map);l(this,r,new Map);l(this,u,new Set);l(this,p,!0);l(this,_,e=>{if(t(this,h).has(e)){var s=t(this,h).get(e),a=t(this,n).get(s);if(a)F(a),t(this,u).delete(s);else{var c=t(this,r).get(s);c&&(t(this,n).set(s,c.effect),t(this,r).delete(s),c.fragment.lastChild.remove(),this.anchor.before(c.fragment),a=c.effect)}for(const[f,o]of t(this,h)){if(t(this,h).delete(f),f===e)break;const d=t(this,r).get(o);d&&(b(d.effect),t(this,r).delete(o))}for(const[f,o]of t(this,n)){if(f===s||t(this,u).has(f))continue;const d=()=>{if(Array.from(t(this,h).values()).includes(f)){var k=document.createDocumentFragment();z(o,k),k.append(x()),t(this,r).set(f,{effect:o,fragment:k})}else b(o);t(this,u).delete(f),t(this,n).delete(f)};t(this,p)||!a?(t(this,u).add(f),C(o,d,!1)):d()}}});l(this,v,e=>{t(this,h).delete(e);const s=Array.from(t(this,h).values());for(const[a,c]of t(this,r))s.includes(a)||(b(c.effect),t(this,r).delete(a))});this.anchor=e,M(this,p,s)}ensure(e,s){var a=S,c=E();if(s&&!t(this,n).has(e)&&!t(this,r).has(e))if(c){var f=document.createDocumentFragment(),o=x();f.append(o),t(this,r).set(e,{effect:A(()=>s(o)),fragment:f})}else t(this,n).set(e,A(()=>s(this.anchor)));if(t(this,h).set(a,e),c){for(const[d,m]of t(this,n))d===e?a.unskip_effect(m):a.skip_effect(m);for(const[d,m]of t(this,r))d===e?a.unskip_effect(m.effect):a.skip_effect(m.effect);a.oncommit(t(this,_)),a.ondiscard(t(this,v))}else j&&(this.anchor=q),t(this,_).call(this,a)}}h=new WeakMap,n=new WeakMap,r=new WeakMap,u=new WeakMap,p=new WeakMap,_=new WeakMap,v=new WeakMap;export{I as B}; +var B=Object.defineProperty;var g=i=>{throw TypeError(i)};var D=(i,e,s)=>e in i?B(i,e,{enumerable:!0,configurable:!0,writable:!0,value:s}):i[e]=s;var w=(i,e,s)=>D(i,typeof e!="symbol"?e+"":e,s),y=(i,e,s)=>e.has(i)||g("Cannot "+s);var t=(i,e,s)=>(y(i,e,"read from private field"),s?s.call(i):e.get(i)),l=(i,e,s)=>e.has(i)?g("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(i):e.set(i,s),M=(i,e,s,a)=>(y(i,e,"write to private field"),a?a.call(i,s):e.set(i,s),s);import{r as F,d as b,p as C,c as x,a as A,e as S,h as j,f as q,m as z,s as E}from"./D2EIOFXK.js";var h,n,r,u,p,_,v;class I{constructor(e,s=!0){w(this,"anchor");l(this,h,new Map);l(this,n,new Map);l(this,r,new Map);l(this,u,new Set);l(this,p,!0);l(this,_,e=>{if(t(this,h).has(e)){var s=t(this,h).get(e),a=t(this,n).get(s);if(a)F(a),t(this,u).delete(s);else{var c=t(this,r).get(s);c&&(t(this,n).set(s,c.effect),t(this,r).delete(s),c.fragment.lastChild.remove(),this.anchor.before(c.fragment),a=c.effect)}for(const[f,o]of t(this,h)){if(t(this,h).delete(f),f===e)break;const d=t(this,r).get(o);d&&(b(d.effect),t(this,r).delete(o))}for(const[f,o]of t(this,n)){if(f===s||t(this,u).has(f))continue;const d=()=>{if(Array.from(t(this,h).values()).includes(f)){var k=document.createDocumentFragment();z(o,k),k.append(x()),t(this,r).set(f,{effect:o,fragment:k})}else b(o);t(this,u).delete(f),t(this,n).delete(f)};t(this,p)||!a?(t(this,u).add(f),C(o,d,!1)):d()}}});l(this,v,e=>{t(this,h).delete(e);const s=Array.from(t(this,h).values());for(const[a,c]of t(this,r))s.includes(a)||(b(c.effect),t(this,r).delete(a))});this.anchor=e,M(this,p,s)}ensure(e,s){var a=S,c=E();if(s&&!t(this,n).has(e)&&!t(this,r).has(e))if(c){var f=document.createDocumentFragment(),o=x();f.append(o),t(this,r).set(e,{effect:A(()=>s(o)),fragment:f})}else t(this,n).set(e,A(()=>s(this.anchor)));if(t(this,h).set(a,e),c){for(const[d,m]of t(this,n))d===e?a.unskip_effect(m):a.skip_effect(m);for(const[d,m]of t(this,r))d===e?a.unskip_effect(m.effect):a.skip_effect(m.effect);a.oncommit(t(this,_)),a.ondiscard(t(this,v))}else j&&(this.anchor=q),t(this,_).call(this,a)}}h=new WeakMap,n=new WeakMap,r=new WeakMap,u=new WeakMap,p=new WeakMap,_=new WeakMap,v=new WeakMap;export{I as B}; diff --git a/frontend/dist/_app/immutable/chunks/zf4GFcxs.js b/frontend/dist/_app/immutable/chunks/zf4GFcxs.js deleted file mode 100644 index b37d108..0000000 --- a/frontend/dist/_app/immutable/chunks/zf4GFcxs.js +++ /dev/null @@ -1 +0,0 @@ -import{b as N,h as S,J as L,E as Y,N as B,O as M,L as U,P as w,f as j,Q as q,i as z,S as H,U as J,k as m,F as O,V as Q,W as I,X as E,Y as V,Z as F,o as P,_ as W,$ as X,a0 as k,a1 as ee,a2 as re,w as ne,a3 as se,a4 as ie,t as ae,a5 as te,a6 as fe,a7 as ue,a8 as g,a9 as y,aa as v,ab as K}from"./VJhVTb1A.js";import{B as $}from"./U5yjBaoU.js";let b=!1;function le(e){var r=b;try{return b=!1,[e(),b]}finally{b=r}}function ve(e,r,s=!1){var n;S&&(n=j,L());var i=new $(e),t=s?Y:0;function o(a,f){if(S){var c=B(n);if(a!==parseInt(c.substring(1))){var u=M();U(u),i.anchor=u,w(!1),i.ensure(a,f),w(!0);return}}i.ensure(a,f)}N(()=>{var a=!1;r((f,c=0)=>{a=!0,o(c,f)}),a||o(-1,null)},t)}function he(e,r,s){var n;S&&(n=j,L());var i=new $(e);N(()=>{var t=r()??null;if(S){var o=B(n),a=o===q,f=t!==null;if(a!==f){var c=M();U(c),i.anchor=c,w(!1),i.ensure(t,t&&(u=>s(u,t))),w(!0);return}}i.ensure(t,t&&(u=>s(u,t)))},Y)}function D(e,r){return e===r||(e==null?void 0:e[I])===r}function be(e={},r,s,n){var i=z.r,t=O;return H(()=>{var o,a;return J(()=>{o=a,a=[],m(()=>{e!==s(...a)&&(r(e,...a),o&&D(s(...o),e)&&r(null,...o))})}),()=>{let f=t;for(;f!==i&&f.parent!==null&&f.parent.f&Q;)f=f.parent;const c=()=>{a&&D(s(...a),e)&&r(null,...a)},u=f.teardown;f.teardown=()=>{c(),u==null||u()}}}),e}const oe={get(e,r){if(!e.exclude.includes(r))return P(e.version),r in e.special?e.special[r]():e.props[r]},set(e,r,s){if(!(r in e.special)){var n=O;try{y(e.parent_effect),e.special[r]=pe({get[r](){return e.props[r]}},r,F)}finally{y(n)}}return e.special[r](s),g(e.version),!0},getOwnPropertyDescriptor(e,r){if(!e.exclude.includes(r)&&r in e.props)return{enumerable:!0,configurable:!0,value:e.props[r]}},deleteProperty(e,r){return e.exclude.includes(r)||(e.exclude.push(r),g(e.version)),!0},has(e,r){return e.exclude.includes(r)?!1:r in e.props},ownKeys(e){return Reflect.ownKeys(e.props).filter(r=>!e.exclude.includes(r))}};function Pe(e,r){return new Proxy({props:e,exclude:r,special:{},version:ue(0),parent_effect:O},oe)}const ce={get(e,r){let s=e.props.length;for(;s--;){let n=e.props[s];if(v(n)&&(n=n()),typeof n=="object"&&n!==null&&r in n)return n[r]}},set(e,r,s){let n=e.props.length;for(;n--;){let i=e.props[n];v(i)&&(i=i());const t=E(i,r);if(t&&t.set)return t.set(s),!0}return!1},getOwnPropertyDescriptor(e,r){let s=e.props.length;for(;s--;){let n=e.props[s];if(v(n)&&(n=n()),typeof n=="object"&&n!==null&&r in n){const i=E(n,r);return i&&!i.configurable&&(i.configurable=!0),i}}},has(e,r){if(r===I||r===K)return!1;for(let s of e.props)if(v(s)&&(s=s()),s!=null&&r in s)return!0;return!1},ownKeys(e){const r=[];for(let s of e.props)if(v(s)&&(s=s()),!!s){for(const n in s)r.includes(n)||r.push(n);for(const n of Object.getOwnPropertySymbols(s))r.includes(n)||r.push(n)}return r}};function Se(...e){return new Proxy({props:e},ce)}function pe(e,r,s,n){var x;var i=!ne||(s&se)!==0,t=(s&re)!==0,o=(s&fe)!==0,a=n,f=!0,c=()=>(f&&(f=!1,a=o?m(n):n),a);let u;if(t){var C=I in e||K in e;u=((x=E(e,r))==null?void 0:x.set)??(C&&r in e?l=>e[r]=l:void 0)}var d,T=!1;t?[d,T]=le(()=>e[r]):d=e[r],d===void 0&&n!==void 0&&(d=c(),u&&(i&&V(),u(d)));var p;if(i?p=()=>{var l=e[r];return l===void 0?c():(f=!0,l)}:p=()=>{var l=e[r];return l!==void 0&&(a=void 0),l===void 0?a:l},i&&(s&F)===0)return p;if(u){var G=e.$$legacy;return(function(l,h){return arguments.length>0?((!i||!h||G||T)&&u(h?p():l),l):p()})}var R=!1,_=((s&ie)!==0?ae:te)(()=>(R=!1,p()));t&&P(_);var Z=O;return(function(l,h){if(arguments.length>0){const A=h?P(_):i&&t?W(l):l;return X(_,A),R=!0,a!==void 0&&(a=A),l}return k&&R||(Z.f&ee)!==0?_.v:P(_)})}export{be as b,he as c,ve as i,Pe as l,pe as p,Se as s}; diff --git a/frontend/dist/_app/immutable/entry/app.CLLGSh1d.js b/frontend/dist/_app/immutable/entry/app.CLLGSh1d.js new file mode 100644 index 0000000..6a39d06 --- /dev/null +++ b/frontend/dist/_app/immutable/entry/app.CLLGSh1d.js @@ -0,0 +1,2 @@ +const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["../nodes/0.BKQJkT-6.js","../chunks/IT17IssP.js","../chunks/D2EIOFXK.js","../chunks/D3-3j-uT.js","../chunks/lwvwhigX.js","../nodes/1.DViJQCF5.js","../chunks/C4rlClDa.js","../chunks/B-WYSyZB.js","../chunks/C1tKzvKE.js","../nodes/2.D9x-OSY6.js","../chunks/Dy37i2LO.js","../assets/2.Bl1bTUX7.css"])))=>i.map(i=>d[i]); +var G=t=>{throw TypeError(t)};var H=(t,e,s)=>e.has(t)||G("Cannot "+s);var l=(t,e,s)=>(H(t,e,"read from private field"),s?s.call(t):e.get(t)),j=(t,e,s)=>e.has(t)?G("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(t):e.set(t,s),A=(t,e,s,o)=>(H(t,e,"write to private field"),o?o.call(t,s):e.set(t,s),s);import{a0 as S,a9 as N,D as g,aH as Q,au as X,aI as Z,I as $,A as ee,u as te,aJ as re,k as L,N as se,K as ae,aK as C,L as ne,M as oe,aL as I,J as ce}from"../chunks/D2EIOFXK.js";import{h as ie,m as le,u as ue,s as fe}from"../chunks/C4rlClDa.js";import{a as w,c as D,f as Y,t as me}from"../chunks/IT17IssP.js";import{o as de}from"../chunks/C1tKzvKE.js";import{p as T,i as B,c as V,b as q}from"../chunks/Dy37i2LO.js";function he(t){return class extends _e{constructor(e){super({component:t,...e})}}}var y,m;class _e{constructor(e){j(this,y);j(this,m);var _;var s=new Map,o=(a,r)=>{var c=Z(r,!1,!1);return s.set(a,c),c};const u=new Proxy({...e.props||{},$$events:{}},{get(a,r){return g(s.get(r)??o(r,Reflect.get(a,r)))},has(a,r){return r===N?!0:(g(s.get(r)??o(r,Reflect.get(a,r))),Reflect.has(a,r))},set(a,r,c){return S(s.get(r)??o(r,c),c),Reflect.set(a,r,c)}});A(this,m,(e.hydrate?ie:le)(e.component,{target:e.target,anchor:e.anchor,props:u,context:e.context,intro:e.intro??!1,recover:e.recover,transformError:e.transformError})),(!((_=e==null?void 0:e.props)!=null&&_.$$host)||e.sync===!1)&&Q(),A(this,y,u.$$events);for(const a of Object.keys(l(this,m)))a==="$set"||a==="$destroy"||a==="$on"||X(this,a,{get(){return l(this,m)[a]},set(r){l(this,m)[a]=r},enumerable:!0});l(this,m).$set=a=>{Object.assign(u,a)},l(this,m).$destroy=()=>{ue(l(this,m))}}$set(e){l(this,m).$set(e)}$on(e,s){l(this,y)[e]=l(this,y)[e]||[];const o=(...u)=>s.call(this,...u);return l(this,y)[e].push(o),()=>{l(this,y)[e]=l(this,y)[e].filter(u=>u!==o)}}$destroy(){l(this,m).$destroy()}}y=new WeakMap,m=new WeakMap;const ve="modulepreload",ge=function(t,e){return new URL(t,e).href},W={},J=function(e,s,o){let u=Promise.resolve();if(s&&s.length>0){let a=function(i){return Promise.all(i.map(v=>Promise.resolve(v).then(b=>({status:"fulfilled",value:b}),b=>({status:"rejected",reason:b}))))};const r=document.getElementsByTagName("link"),c=document.querySelector("meta[property=csp-nonce]"),k=(c==null?void 0:c.nonce)||(c==null?void 0:c.getAttribute("nonce"));u=a(s.map(i=>{if(i=ge(i,o),i in W)return;W[i]=!0;const v=i.endsWith(".css"),b=v?'[rel="stylesheet"]':"";if(!!o)for(let n=r.length-1;n>=0;n--){const f=r[n];if(f.href===i&&(!v||f.rel==="stylesheet"))return}else if(document.querySelector(`link[href="${i}"]${b}`))return;const h=document.createElement("link");if(h.rel=v?"stylesheet":ve,v||(h.as="script"),h.crossOrigin="",h.href=i,k&&h.setAttribute("nonce",k),document.head.appendChild(h),v)return new Promise((n,f)=>{h.addEventListener("load",n),h.addEventListener("error",()=>f(new Error(`Unable to preload CSS for ${i}`)))})}))}function _(a){const r=new Event("vite:preloadError",{cancelable:!0});if(r.payload=a,window.dispatchEvent(r),!r.defaultPrevented)throw a}return u.then(a=>{for(const r of a||[])r.status==="rejected"&&_(r.reason);return e().catch(_)})},je={};var ye=Y('
            '),be=Y(" ",1);function Ee(t,e){$(e,!0);let s=T(e,"components",23,()=>[]),o=T(e,"data_0",3,null),u=T(e,"data_1",3,null);ee(()=>e.stores.page.set(e.page)),te(()=>{e.stores,e.page,e.constructors,s(),e.form,o(),u(),e.stores.page.notify()});let _=C(!1),a=C(!1),r=C(null);de(()=>{const n=e.stores.page.subscribe(()=>{g(_)&&(S(a,!0),re().then(()=>{S(r,document.title||"untitled page",!0)}))});return S(_,!0),n});const c=I(()=>e.constructors[1]);var k=be(),i=L(k);{var v=n=>{const f=I(()=>e.constructors[0]);var E=D(),O=L(E);V(O,()=>g(f),(P,R)=>{q(R(P,{get data(){return o()},get form(){return e.form},get params(){return e.page.params},children:(d,Re)=>{var U=D(),z=L(U);V(z,()=>g(c),(F,M)=>{q(M(F,{get data(){return u()},get form(){return e.form},get params(){return e.page.params}}),x=>s()[1]=x,()=>{var x;return(x=s())==null?void 0:x[1]})}),w(d,U)},$$slots:{default:!0}}),d=>s()[0]=d,()=>{var d;return(d=s())==null?void 0:d[0]})}),w(n,E)},b=n=>{const f=I(()=>e.constructors[0]);var E=D(),O=L(E);V(O,()=>g(f),(P,R)=>{q(R(P,{get data(){return o()},get form(){return e.form},get params(){return e.page.params}}),d=>s()[0]=d,()=>{var d;return(d=s())==null?void 0:d[0]})}),w(n,E)};B(i,n=>{e.constructors[1]?n(v):n(b,-1)})}var K=se(i,2);{var h=n=>{var f=ye(),E=ne(f);{var O=P=>{var R=me();ce(()=>fe(R,g(r))),w(P,R)};B(E,P=>{g(a)&&P(O)})}oe(f),w(n,f)};B(K,n=>{g(_)&&n(h)})}w(t,k),ae()}const Ae=he(Ee),Ce=[()=>J(()=>import("../nodes/0.BKQJkT-6.js"),__vite__mapDeps([0,1,2,3,4]),import.meta.url),()=>J(()=>import("../nodes/1.DViJQCF5.js"),__vite__mapDeps([5,1,2,6,7,8]),import.meta.url),()=>J(()=>import("../nodes/2.D9x-OSY6.js"),__vite__mapDeps([9,1,2,8,10,4,6,3,11]),import.meta.url)],Ie=[],De={"/":[2]},p={handleError:(({error:t})=>{console.error(t)}),reroute:(()=>{}),transport:{}},Pe=Object.fromEntries(Object.entries(p.transport).map(([t,e])=>[t,e.decode])),Te=Object.fromEntries(Object.entries(p.transport).map(([t,e])=>[t,e.encode])),Be=!1,Ve=(t,e)=>Pe[t](e);export{Ve as decode,Pe as decoders,De as dictionary,Te as encoders,Be as hash,p as hooks,je as matchers,Ce as nodes,Ae as root,Ie as server_loads}; diff --git a/frontend/dist/_app/immutable/entry/app.NhX3oHgD.js b/frontend/dist/_app/immutable/entry/app.NhX3oHgD.js deleted file mode 100644 index 8239097..0000000 --- a/frontend/dist/_app/immutable/entry/app.NhX3oHgD.js +++ /dev/null @@ -1,2 +0,0 @@ -const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["../nodes/0.DecrOZwe.js","../chunks/C14P8jaG.js","../chunks/VJhVTb1A.js","../chunks/CiUbu-1F.js","../chunks/U5yjBaoU.js","../nodes/1.Dgk6ayWt.js","../chunks/DmjnTBOd.js","../chunks/BeON-0X8.js","../chunks/BXYPVkmX.js","../chunks/Cz6m6K8p.js","../nodes/2.BBO8YVsu.js","../chunks/zf4GFcxs.js","../assets/2.Bl1bTUX7.css"])))=>i.map(i=>d[i]); -var H=t=>{throw TypeError(t)};var J=(t,e,s)=>e.has(t)||H("Cannot "+s);var l=(t,e,s)=>(J(t,e,"read from private field"),s?s.call(t):e.get(t)),S=(t,e,s)=>e.has(t)?H("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(t):e.set(t,s),C=(t,e,s,o)=>(J(t,e,"write to private field"),o?o.call(t,s):e.set(t,s),s);import{$ as L,ab as X,o as g,aH as Z,au as M,aI as N,x as $,u as ee,j as te,aJ as re,g as j,C as se,z as ae,aK as A,A as ne,B as oe,aL as B,y as ce}from"../chunks/VJhVTb1A.js";import{h as ie,m as le,u as ue,s as fe}from"../chunks/BeON-0X8.js";import{a as w,c as I,f as W,t as me}from"../chunks/C14P8jaG.js";import{o as de}from"../chunks/Cz6m6K8p.js";import{p as T,i as D,c as V,b as q}from"../chunks/zf4GFcxs.js";function he(t){return class extends _e{constructor(e){super({component:t,...e})}}}var y,m;class _e{constructor(e){S(this,y);S(this,m);var _;var s=new Map,o=(a,r)=>{var c=N(r,!1,!1);return s.set(a,c),c};const u=new Proxy({...e.props||{},$$events:{}},{get(a,r){return g(s.get(r)??o(r,Reflect.get(a,r)))},has(a,r){return r===X?!0:(g(s.get(r)??o(r,Reflect.get(a,r))),Reflect.has(a,r))},set(a,r,c){return L(s.get(r)??o(r,c),c),Reflect.set(a,r,c)}});C(this,m,(e.hydrate?ie:le)(e.component,{target:e.target,anchor:e.anchor,props:u,context:e.context,intro:e.intro??!1,recover:e.recover,transformError:e.transformError})),(!((_=e==null?void 0:e.props)!=null&&_.$$host)||e.sync===!1)&&Z(),C(this,y,u.$$events);for(const a of Object.keys(l(this,m)))a==="$set"||a==="$destroy"||a==="$on"||M(this,a,{get(){return l(this,m)[a]},set(r){l(this,m)[a]=r},enumerable:!0});l(this,m).$set=a=>{Object.assign(u,a)},l(this,m).$destroy=()=>{ue(l(this,m))}}$set(e){l(this,m).$set(e)}$on(e,s){l(this,y)[e]=l(this,y)[e]||[];const o=(...u)=>s.call(this,...u);return l(this,y)[e].push(o),()=>{l(this,y)[e]=l(this,y)[e].filter(u=>u!==o)}}$destroy(){l(this,m).$destroy()}}y=new WeakMap,m=new WeakMap;const ve="modulepreload",ge=function(t,e){return new URL(t,e).href},K={},U=function(e,s,o){let u=Promise.resolve();if(s&&s.length>0){let a=function(i){return Promise.all(i.map(v=>Promise.resolve(v).then(b=>({status:"fulfilled",value:b}),b=>({status:"rejected",reason:b}))))};const r=document.getElementsByTagName("link"),c=document.querySelector("meta[property=csp-nonce]"),k=(c==null?void 0:c.nonce)||(c==null?void 0:c.getAttribute("nonce"));u=a(s.map(i=>{if(i=ge(i,o),i in K)return;K[i]=!0;const v=i.endsWith(".css"),b=v?'[rel="stylesheet"]':"";if(!!o)for(let n=r.length-1;n>=0;n--){const f=r[n];if(f.href===i&&(!v||f.rel==="stylesheet"))return}else if(document.querySelector(`link[href="${i}"]${b}`))return;const h=document.createElement("link");if(h.rel=v?"stylesheet":ve,v||(h.as="script"),h.crossOrigin="",h.href=i,k&&h.setAttribute("nonce",k),document.head.appendChild(h),v)return new Promise((n,f)=>{h.addEventListener("load",n),h.addEventListener("error",()=>f(new Error(`Unable to preload CSS for ${i}`)))})}))}function _(a){const r=new Event("vite:preloadError",{cancelable:!0});if(r.payload=a,window.dispatchEvent(r),!r.defaultPrevented)throw a}return u.then(a=>{for(const r of a||[])r.status==="rejected"&&_(r.reason);return e().catch(_)})},Se={};var ye=W('
            '),be=W(" ",1);function Ee(t,e){$(e,!0);let s=T(e,"components",23,()=>[]),o=T(e,"data_0",3,null),u=T(e,"data_1",3,null);ee(()=>e.stores.page.set(e.page)),te(()=>{e.stores,e.page,e.constructors,s(),e.form,o(),u(),e.stores.page.notify()});let _=A(!1),a=A(!1),r=A(null);de(()=>{const n=e.stores.page.subscribe(()=>{g(_)&&(L(a,!0),re().then(()=>{L(r,document.title||"untitled page",!0)}))});return L(_,!0),n});const c=B(()=>e.constructors[1]);var k=be(),i=j(k);{var v=n=>{const f=B(()=>e.constructors[0]);var E=I(),x=j(E);V(x,()=>g(f),(P,R)=>{q(R(P,{get data(){return o()},get form(){return e.form},get params(){return e.page.params},children:(d,Re)=>{var G=I(),p=j(G);V(p,()=>g(c),(F,Q)=>{q(Q(F,{get data(){return u()},get form(){return e.form},get params(){return e.page.params}}),O=>s()[1]=O,()=>{var O;return(O=s())==null?void 0:O[1]})}),w(d,G)},$$slots:{default:!0}}),d=>s()[0]=d,()=>{var d;return(d=s())==null?void 0:d[0]})}),w(n,E)},b=n=>{const f=B(()=>e.constructors[0]);var E=I(),x=j(E);V(x,()=>g(f),(P,R)=>{q(R(P,{get data(){return o()},get form(){return e.form},get params(){return e.page.params}}),d=>s()[0]=d,()=>{var d;return(d=s())==null?void 0:d[0]})}),w(n,E)};D(i,n=>{e.constructors[1]?n(v):n(b,-1)})}var z=se(i,2);{var h=n=>{var f=ye(),E=ne(f);{var x=P=>{var R=me();ce(()=>fe(R,g(r))),w(P,R)};D(E,P=>{g(a)&&P(x)})}oe(f),w(n,f)};D(z,n=>{g(_)&&n(h)})}w(t,k),ae()}const Ce=he(Ee),Ae=[()=>U(()=>import("../nodes/0.DecrOZwe.js"),__vite__mapDeps([0,1,2,3,4]),import.meta.url),()=>U(()=>import("../nodes/1.Dgk6ayWt.js"),__vite__mapDeps([5,1,2,6,7,8,9]),import.meta.url),()=>U(()=>import("../nodes/2.BBO8YVsu.js"),__vite__mapDeps([10,1,2,9,11,4,7,3,6,12]),import.meta.url)],Be=[],Ie={"/":[2]},Y={handleError:(({error:t})=>{console.error(t)}),reroute:(()=>{}),transport:{}},Pe=Object.fromEntries(Object.entries(Y.transport).map(([t,e])=>[t,e.decode])),Te=Object.fromEntries(Object.entries(Y.transport).map(([t,e])=>[t,e.encode])),De=!1,Ve=(t,e)=>Pe[t](e);export{Ve as decode,Pe as decoders,Ie as dictionary,Te as encoders,De as hash,Y as hooks,Se as matchers,Ae as nodes,Ce as root,Be as server_loads}; diff --git a/frontend/dist/_app/immutable/entry/start.CX0ijzGM.js b/frontend/dist/_app/immutable/entry/start.CX0ijzGM.js new file mode 100644 index 0000000..dc07076 --- /dev/null +++ b/frontend/dist/_app/immutable/entry/start.CX0ijzGM.js @@ -0,0 +1 @@ +import{l as o,a as r}from"../chunks/B-WYSyZB.js";export{o as load_css,r as start}; diff --git a/frontend/dist/_app/immutable/entry/start.IoRlyKBR.js b/frontend/dist/_app/immutable/entry/start.IoRlyKBR.js deleted file mode 100644 index df3df80..0000000 --- a/frontend/dist/_app/immutable/entry/start.IoRlyKBR.js +++ /dev/null @@ -1 +0,0 @@ -import{l as o,a as r}from"../chunks/BXYPVkmX.js";export{o as load_css,r as start}; diff --git a/frontend/dist/_app/immutable/nodes/0.DecrOZwe.js b/frontend/dist/_app/immutable/nodes/0.BKQJkT-6.js similarity index 63% rename from frontend/dist/_app/immutable/nodes/0.DecrOZwe.js rename to frontend/dist/_app/immutable/nodes/0.BKQJkT-6.js index 76ed193..5493acd 100644 --- a/frontend/dist/_app/immutable/nodes/0.DecrOZwe.js +++ b/frontend/dist/_app/immutable/nodes/0.BKQJkT-6.js @@ -1 +1 @@ -import{c as n,a}from"../chunks/C14P8jaG.js";import{g as s}from"../chunks/VJhVTb1A.js";import{s as p}from"../chunks/CiUbu-1F.js";const c=!1,i=!0,u=Object.freeze(Object.defineProperty({__proto__:null,prerender:i,ssr:c},Symbol.toStringTag,{value:"Module"}));function d(o,r){var e=n(),t=s(e);p(t,()=>r.children),a(o,e)}export{d as component,u as universal}; +import{c as n,a}from"../chunks/IT17IssP.js";import{k as s}from"../chunks/D2EIOFXK.js";import{s as p}from"../chunks/D3-3j-uT.js";const c=!1,i=!0,u=Object.freeze(Object.defineProperty({__proto__:null,prerender:i,ssr:c},Symbol.toStringTag,{value:"Module"}));function d(o,r){var e=n(),t=s(e);p(t,()=>r.children),a(o,e)}export{d as component,u as universal}; diff --git a/frontend/dist/_app/immutable/nodes/1.DViJQCF5.js b/frontend/dist/_app/immutable/nodes/1.DViJQCF5.js new file mode 100644 index 0000000..913fd08 --- /dev/null +++ b/frontend/dist/_app/immutable/nodes/1.DViJQCF5.js @@ -0,0 +1 @@ +import{a as b,f as k}from"../chunks/IT17IssP.js";import{g as x,A as y,u as i,j as $,B as l,C as j,D as v,F as A,G as B,H as C,I as D,k as E,J as F,K as G,L as u,M as m,N as H}from"../chunks/D2EIOFXK.js";import{s as g}from"../chunks/C4rlClDa.js";import{s as I,p as _}from"../chunks/B-WYSyZB.js";function J(a=!1){const t=x,e=t.l.u;if(!e)return;let r=()=>A(t.s);if(a){let o=0,s={};const c=B(()=>{let n=!1;const p=t.s;for(const f in p)p[f]!==s[f]&&(s[f]=p[f],n=!0);return n&&o++,o});r=()=>v(c)}e.b.length&&y(()=>{d(t,r),l(e.b)}),i(()=>{const o=$(()=>e.m.map(j));return()=>{for(const s of o)typeof s=="function"&&s()}}),e.a.length&&i(()=>{d(t,r),l(e.a)})}function d(a,t){if(a.l.s)for(const e of a.l.s)v(e);t()}C();const K={get error(){return _.error},get status(){return _.status}};I.updated.check;const h=K;var L=k("

            ",1);function z(a,t){D(t,!1),J();var e=L(),r=E(e),o=u(r,!0);m(r);var s=H(r,2),c=u(s,!0);m(s),F(()=>{var n;g(o,h.status),g(c,(n=h.error)==null?void 0:n.message)}),b(a,e),G()}export{z as component}; diff --git a/frontend/dist/_app/immutable/nodes/1.Dgk6ayWt.js b/frontend/dist/_app/immutable/nodes/1.Dgk6ayWt.js deleted file mode 100644 index bfc378e..0000000 --- a/frontend/dist/_app/immutable/nodes/1.Dgk6ayWt.js +++ /dev/null @@ -1 +0,0 @@ -import{a as g,f as h}from"../chunks/C14P8jaG.js";import{i as l}from"../chunks/DmjnTBOd.js";import{x as v,g as d,y as x,z as _,A as e,B as o,C as $}from"../chunks/VJhVTb1A.js";import{s as p}from"../chunks/BeON-0X8.js";import{s as k,p as m}from"../chunks/BXYPVkmX.js";const b={get error(){return m.error},get status(){return m.status}};k.updated.check;const i=b;var y=h("

            ",1);function j(f,n){v(n,!1),l();var t=y(),r=d(t),c=e(r,!0);o(r);var s=$(r,2),u=e(s,!0);o(s),x(()=>{var a;p(c,i.status),p(u,(a=i.error)==null?void 0:a.message)}),g(f,t),_()}export{j as component}; diff --git a/frontend/dist/_app/immutable/nodes/2.BBO8YVsu.js b/frontend/dist/_app/immutable/nodes/2.BBO8YVsu.js deleted file mode 100644 index 4992031..0000000 --- a/frontend/dist/_app/immutable/nodes/2.BBO8YVsu.js +++ /dev/null @@ -1,1001 +0,0 @@ -import{b as Pr,a as u,f as N,c as Se,t as Oe,d as Ot}from"../chunks/C14P8jaG.js";import{o as un,a as vr}from"../chunks/Cz6m6K8p.js";import{h as Le,L as St,G as Lt,c as $r,J as qt,b as aa,o as e,N as Wa,ag as Xa,O as En,P as It,f as pt,ay as oa,aF as Ya,ao as Nn,e as mt,a as cr,aM as Qa,s as Ja,a5 as Za,aN as sa,aE as dn,aO as eo,a7 as Mn,aP as to,aQ as ro,aI as no,aR as gt,aS as la,a1 as ao,r as ia,p as ca,aT as jr,ae as ua,aU as oo,aV as so,aC as lo,m as io,d as Er,az as da,y as Q,F as fa,aW as co,aG as uo,aA as fo,D as va,aX as ga,aY as vo,aZ as go,E as ho,aw as ha,S as Lr,k as ur,a_ as ma,a$ as mo,b0 as po,b1 as pa,b2 as _o,b3 as bo,b4 as gr,b5 as xo,b6 as yo,b7 as wo,b8 as ko,b9 as Co,ba as So,bb as Po,aJ as Pt,U as $o,aK as D,_ as se,$ as v,A as w,B as h,x as Me,g as B,z as Te,C as M,j as Ee,ap as Ce,aL as O,bc as Ro,q as jt,bd as Eo,be as st,bf as No}from"../chunks/VJhVTb1A.js";import{p as he,i as X,b as rt,c as Mo,l as Ge,s as Ye}from"../chunks/zf4GFcxs.js";import{i as To,a as Ao,d as le,b as qe,c as Lo,n as Fo,e as Do,s as re,f as et}from"../chunks/BeON-0X8.js";import{s as ft}from"../chunks/CiUbu-1F.js";import{i as Io}from"../chunks/DmjnTBOd.js";import{B as zo}from"../chunks/U5yjBaoU.js";function fn(t,r){return r}function Oo(t,r,a){for(var n=[],o=r.length,s,l=r.length,c=0;c{if(s){if(s.pending.delete(S),s.done.add(S),s.pending.size===0){var k=t.outrogroups;Qr(t,dn(s.done)),k.delete(s),k.size===0&&(t.outrogroups=null)}}else l-=1},!1)}if(l===0){var d=n.length===0&&a!==null;if(d){var y=a,p=y.parentNode;lo(p),p.append(y),t.items.clear()}Qr(t,r,!d)}else s={pending:new Set(r),done:new Set},(t.outrogroups??(t.outrogroups=new Set)).add(s)}function Qr(t,r,a=!0){var n;if(t.pending.size>0){n=new Set;for(const l of t.pending.values())for(const c of l)n.add(t.items.get(c).e)}for(var o=0;o{var b=a();return sa(b)?b:b==null?[]:dn(b)}),k,A=new Map,T=!0;function x(b){(P.effect.f&ao)===0&&(P.pending.delete(b),P.fallback=p,Ho(P,k,l,r,n),p!==null&&(k.length===0?(p.f>)===0?ia(p):(p.f^=gt,lr(p,null,l)):ca(p,()=>{p=null})))}function f(b){P.pending.delete(b)}var _=aa(()=>{k=e(S);var b=k.length;let $=!1;if(Le){var E=Wa(l)===Xa;E!==(b===0)&&(l=En(),St(l),It(!1),$=!0)}for(var m=new Set,R=mt,F=Ja(),L=0;Ls(l)):(p=cr(()=>s(Tn??(Tn=$r()))),p.f|=gt)),b>m.size&&Qa(),Le&&b>0&&St(En()),!T)if(A.set(R,m),F){for(const[I,G]of c)m.has(I)||R.skip_effect(G.e);R.oncommit(x),R.ondiscard(f)}else x(R);$&&It(!0),e(S)}),P={effect:_,items:c,pending:A,outrogroups:null,fallback:p};T=!1,Le&&(l=pt)}function nr(t){for(;t!==null&&(t.f&oo)===0;)t=t.next;return t}function Ho(t,r,a,n,o){var j,z,V,I,G,U,q,g,i;var s=(n&so)!==0,l=r.length,c=t.items,d=nr(t.effect.first),y,p=null,S,k=[],A=[],T,x,f,_;if(s)for(_=0;_0){var L=(n&la)!==0&&l===0?a:null;if(s){for(_=0;_{var C,H;if(S!==void 0)for(f of S)(H=(C=f.nodes)==null?void 0:C.a)==null||H.apply()})}function jo(t,r,a,n,o,s,l,c){var d=(l&to)!==0?(l&ro)===0?no(a,!1,!1):Mn(a):null,y=(l&eo)!==0?Mn(o):null;return{v:d,i:y,e:cr(()=>(s(r,d??a,y??o,c),()=>{t.delete(n)}))}}function lr(t,r,a){if(t.nodes)for(var n=t.nodes.start,o=t.nodes.end,s=r&&(r.f>)===0?r.nodes.start:a;n!==null;){var l=da(n);if(s.before(n),n===o)return;n=l}}function yt(t,r,a){r===null?t.effect.first=a:r.next=a,a===null?t.effect.last=r:a.prev=r}function Fr(t,r,a=!1,n=!1,o=!1,s=!1){var l=t,c="";if(a){var d=t;Le&&(l=St(Lt(d)))}Q(()=>{var y=fa;if(c===(c=r()??"")){Le&&qt();return}if(a&&!Le){y.nodes=null,d.innerHTML=c,c!==""&&Pr(Lt(d),d.lastChild);return}if(y.nodes!==null&&(co(y.nodes.start,y.nodes.end),y.nodes=null),c!==""){if(Le){pt.data;for(var p=qt(),S=p;p!==null&&(p.nodeType!==oa||p.data!=="");)S=p,p=da(p);if(p===null)throw uo(),fo;Pr(pt,S),l=St(p);return}var k=n?ga:o?vo:void 0,A=va(n?"svg":o?"math":"template",k);A.innerHTML=c;var T=n||o?A:A.content;if(Pr(Lt(T),T.lastChild),n||o)for(;Lt(T);)l.before(Lt(T));else l.before(T)}})}function We(t,r,a,n,o){var c;Le&&qt();var s=(c=r.$$slots)==null?void 0:c[a],l=!1;s===!0&&(s=r.children,l=!0),s===void 0||s(t,l?()=>n:n)}function Uo(t,r,a,n,o,s){let l=Le;Le&&qt();var c=null;Le&&pt.nodeType===go&&(c=pt,qt());var d=Le?pt:t,y=new zo(d,!1);aa(()=>{const p=r()||null;var S=ga;if(p===null){y.ensure(null,null);return}return y.ensure(p,k=>{if(p){if(c=Le?c:va(p,S),Pr(c,c),n){Le&&To(p)&&c.append(document.createComment(""));var A=Le?Lt(c):c.appendChild($r());Le&&(A===null?It(!1):St(A)),n(c,A)}fa.nodes.end=c,k.before(c)}Le&&St(k)}),()=>{}},ho),ha(()=>{}),l&&(It(!0),St(d))}function Vo(t,r,a){Lr(()=>{var n=ur(()=>r(t,a==null?void 0:a())||{});if(n!=null&&n.destroy)return()=>n.destroy()})}function Bo(t,r){var a=void 0,n;ma(()=>{a!==(a=r())&&(n&&(Er(n),n=null),a&&(n=cr(()=>{Lr(()=>a(t))})))})}function _a(t){var r,a,n="";if(typeof t=="string"||typeof t=="number")n+=t;else if(typeof t=="object")if(Array.isArray(t)){var o=t.length;for(r=0;r=0;){var c=l+s;(l===0||An.includes(n[l-1]))&&(c===n.length||An.includes(n[c]))?n=(l===0?"":n.substring(0,l))+n.substring(c+1):l=c}}return n===""?null:n}function Ln(t,r=!1){var a=r?" !important;":";",n="";for(var o of Object.keys(t)){var s=t[o];s!=null&&s!==""&&(n+=" "+o+": "+s+a)}return n}function Ur(t){return t[0]!=="-"||t[1]!=="-"?t.toLowerCase():t}function Go(t,r){if(r){var a="",n,o;if(Array.isArray(r)?(n=r[0],o=r[1]):n=r,t){t=String(t).replaceAll(/\s*\/\*.*?\*\/\s*/g,"").trim();var s=!1,l=0,c=!1,d=[];n&&d.push(...Object.keys(n).map(Ur)),o&&d.push(...Object.keys(o).map(Ur));var y=0,p=-1;const x=t.length;for(var S=0;S{Nr(t,t.__value)});r.observe(t,{childList:!0,subtree:!0,attributes:!0,attributeFilter:["value"]}),ha(()=>{r.disconnect()})}function Fn(t,r,a=r){var n=new WeakSet,o=!0;pa(t,"change",s=>{var l=s?"[selected]":":checked",c;if(t.multiple)c=[].map.call(t.querySelectorAll(l),ir);else{var d=t.querySelector(l)??t.querySelector("option:not([disabled])");c=d&&ir(d)}a(c),t.__value=c,mt!==null&&n.add(mt)}),Lr(()=>{var s=r();if(t===document.activeElement){var l=mt;if(n.has(l))return}if(Nr(t,s,o),o&&s===void 0){var c=t.querySelector(":checked");c!==null&&(s=ir(c),a(s))}t.__value=s,o=!1}),ba(t)}function ir(t){return"__value"in t?t.__value:t.value}const ar=Symbol("class"),or=Symbol("style"),xa=Symbol("is custom element"),ya=Symbol("is html"),Wo=gr?"link":"LINK",Xo=gr?"input":"INPUT",Yo=gr?"option":"OPTION",Qo=gr?"select":"SELECT",Jo=gr?"progress":"PROGRESS";function Ke(t){if(Le){var r=!1,a=()=>{if(!r){if(r=!0,t.hasAttribute("value")){var n=t.value;ye(t,"value",null),t.value=n}if(t.hasAttribute("checked")){var o=t.checked;ye(t,"checked",null),t.checked=o}}};t.__on_r=a,ua(a),wo()}}function vn(t,r){var a=gn(t);a.value===(a.value=r??void 0)||t.value===r&&(r!==0||t.nodeName!==Jo)||(t.value=r??"")}function Zo(t,r){r?t.hasAttribute("selected")||t.setAttribute("selected",""):t.removeAttribute("selected")}function ye(t,r,a,n){var o=gn(t);Le&&(o[r]=t.getAttribute(r),r==="src"||r==="srcset"||r==="href"&&t.nodeName===Wo)||o[r]!==(o[r]=a)&&(r==="loading"&&(t[So]=a),a==null?t.removeAttribute(r):typeof a!="string"&&wa(t).includes(r)?t[r]=a:t.setAttribute(r,a))}function es(t,r,a,n,o=!1,s=!1){if(Le&&o&&t.nodeName===Xo){var l=t,c=l.type==="checkbox"?"defaultChecked":"defaultValue";c in a||Ke(l)}var d=gn(t),y=d[xa],p=!d[ya];let S=Le&&y;S&&It(!1);var k=r||{},A=t.nodeName===Yo;for(var T in r)T in a||(a[T]=null);a.class?a.class=dt(a.class):a[ar]&&(a.class=null),a[or]&&(a.style??(a.style=null));var x=wa(t);for(const m in a){let R=a[m];if(A&&m==="value"&&R==null){t.value=t.__value="",k[m]=R;continue}if(m==="class"){var f=t.namespaceURI==="http://www.w3.org/1999/xhtml";ke(t,f,R,n,r==null?void 0:r[ar],a[ar]),k[m]=R,k[ar]=a[ar];continue}if(m==="style"){Xe(t,R,r==null?void 0:r[or],a[or]),k[m]=R,k[or]=a[or];continue}var _=k[m];if(!(R===_&&!(R===void 0&&t.hasAttribute(m)))){k[m]=R;var P=m[0]+m[1];if(P!=="$$")if(P==="on"){const F={},L="$$"+m;let j=m.slice(2);var b=Do(j);if(Ao(j)&&(j=j.slice(0,-7),F.capture=!0),!b&&_){if(R!=null)continue;t.removeEventListener(j,k[L],F),k[L]=null}if(b)le(j,t,R),qe([j]);else if(R!=null){let z=function(V){k[m].call(this,V)};k[L]=Lo(j,t,z,F)}}else if(m==="style")ye(t,m,R);else if(m==="autofocus")xo(t,!!R);else if(!y&&(m==="__value"||m==="value"&&R!=null))t.value=t.__value=R;else if(m==="selected"&&A)Zo(t,R);else{var $=m;p||($=Fo($));var E=$==="defaultValue"||$==="defaultChecked";if(R==null&&!y&&!E)if(d[m]=null,$==="value"||$==="checked"){let F=t;const L=r===void 0;if($==="value"){let j=F.defaultValue;F.removeAttribute($),F.defaultValue=j,F.value=F.__value=L?j:null}else{let j=F.defaultChecked;F.removeAttribute($),F.defaultChecked=j,F.checked=L?j:!1}}else t.removeAttribute(m);else E||x.includes($)&&(y||typeof R!="string")?(t[$]=R,$ in d&&(d[$]=yo)):typeof R!="function"&&ye(t,$,R)}}}return S&&It(!0),k}function Dn(t,r,a=[],n=[],o=[],s,l=!1,c=!1){_o(o,a,n,d=>{var y=void 0,p={},S=t.nodeName===Qo,k=!1;if(ma(()=>{var T=r(...d.map(e)),x=es(t,y,T,s,l,c);k&&S&&"value"in T&&Nr(t,T.value);for(let _ of Object.getOwnPropertySymbols(p))T[_]||Er(p[_]);for(let _ of Object.getOwnPropertySymbols(T)){var f=T[_];_.description===bo&&(!y||f!==y[_])&&(p[_]&&Er(p[_]),p[_]=cr(()=>Bo(t,()=>f))),x[_]=f}y=x}),S){var A=t;Lr(()=>{Nr(A,y.value,!0),ba(A)})}k=!0})}function gn(t){return t.__attributes??(t.__attributes={[xa]:t.nodeName.includes("-"),[ya]:t.namespaceURI===ko})}var In=new Map;function wa(t){var r=t.getAttribute("is")||t.nodeName,a=In.get(r);if(a)return a;In.set(r,a=[]);for(var n,o=t,s=Element.prototype;s!==o;){n=Po(o);for(var l in n)n[l].set&&a.push(l);o=Co(o)}return a}function Ze(t,r,a=r){var n=new WeakSet;pa(t,"input",async o=>{var s=o?t.defaultValue:t.value;if(s=Br(t)?qr(s):s,a(s),mt!==null&&n.add(mt),await Pt(),s!==(s=r())){var l=t.selectionStart,c=t.selectionEnd,d=t.value.length;if(t.value=s??"",c!==null){var y=t.value.length;l===c&&c===d&&y>d?(t.selectionStart=y,t.selectionEnd=y):(t.selectionStart=l,t.selectionEnd=Math.min(c,y))}}}),(Le&&t.defaultValue!==t.value||ur(r)==null&&t.value)&&(a(Br(t)?qr(t.value):t.value),mt!==null&&n.add(mt)),$o(()=>{var o=r();if(t===document.activeElement){var s=mt;if(n.has(s))return}Br(t)&&o===qr(t.value)||t.type==="date"&&!o&&!t.value||o!==t.value&&(t.value=o??"")})}function Br(t){var r=t.type;return r==="number"||r==="range"}function qr(t){return t===""?null:+t}let bt=D(se({type:"none",props:{},resolve:null}));function ts(){return e(bt)}function ot(t=void 0){const{resolve:r}=e(bt);v(bt,{type:"none",props:{},resolve:null},!0),r==null||r(t)}function rs(t){return new Promise(r=>{v(bt,{type:"run",props:{cases:t},resolve:r},!0)})}function ns(t){return new Promise(r=>{v(bt,{type:"restart",props:{cases:t},resolve:r},!0)})}function as(t){return new Promise(r=>{v(bt,{type:"clean",props:{cases:t},resolve:r},!0)})}function tt(t,r="Alert"){return new Promise(a=>{v(bt,{type:"alert",props:{title:r,message:t},resolve:()=>a()},!0)})}function zn(t,r="Confirm",a="OK",n="primary"){return new Promise(o=>{v(bt,{type:"confirm",props:{title:r,message:t,confirmLabel:a,confirmVariant:n},resolve:o},!0)})}function hn(t,r="",a="Input",n="",o=!1){return new Promise(s=>{v(bt,{type:"prompt",props:{title:a,message:t,value:r,placeholder:n,multiline:o},resolve:s},!0)})}var os=N('
            ');function Qt(t,r){function a(s){return document.body.appendChild(s),{destroy(){s.remove()}}}var n=os(),o=w(n);ft(o,()=>r.children),h(n),Vo(n,s=>a==null?void 0:a(s)),u(t,n)}var ss=N('
            '),ls=N('
            ');function hr(t,r){Me(r,!0);const a=T=>{var x=ls(),f=w(x),_=w(f),P=w(_),b=w(P,!0);h(P);var $=M(P,2);{var E=L=>{var j=ss(),z=w(j,!0);h(j),Q(()=>re(z,r.subtitle)),u(L,j)};X($,L=>{r.subtitle&&L(E)})}h(_);var m=M(_,2);ft(m,()=>r.children);var R=M(m,2),F=w(R);ft(F,()=>r.footer),h(R),h(f),h(x),Q(()=>{ke(f,1,`w-[min(${n()??""},96vw)] bg-white border border-border rounded-[10px] p-4.5`),ye(f,"aria-labelledby",r.titleId),ye(P,"id",r.titleId),re(b,r.title)}),le("keydown",x,l),le("mousedown",x,d),le("click",x,y),u(T,x)};let n=he(r,"maxWidth",3,"520px"),o=he(r,"portal",3,!1);function s(){r.onCancel?r.onCancel():ot(null)}function l(T){T.key==="Escape"?s():T.key==="Enter"&&r.onConfirm&&r.onConfirm()}let c=!1;function d(T){c=T.target.dataset.backdrop!==void 0}function y(T){const x=T.target.dataset.backdrop!==void 0;c&&x&&s(),c=!1}var p=Se(),S=B(p);{var k=T=>{Qt(T,{children:(x,f)=>{a(x)}})},A=T=>{a(T)};X(S,T=>{o()?T(k):T(A,-1)})}u(t,p),Te()}qe(["keydown","mousedown","click"]);var is=N("");function Re(t,r){let a=he(r,"variant",3,"primary"),n=he(r,"size",3,"default"),o=he(r,"disabled",3,!1);const s={default:"h-[34px] rounded-md px-3.5 leading-none text-[13px] tracking-wide",sm:"h-[30px] rounded-md px-2.5 leading-none text-xs"},l={primary:"bg-edf-bleu-moyen text-white border-none hover:bg-[rgb(12,72,170)]",secondary:"bg-white text-ink border border-border hover:bg-edf-gris-clair",run:"bg-edf-vert-fonce text-white border-none hover:bg-[rgb(38,98,12)]",warning:"bg-edf-orange-moyen text-white border-none hover:bg-[rgb(230,118,20)]",danger:"bg-edf-orange-fonce text-white border-none hover:bg-[rgb(180,56,8)]"};var c=is(),d=w(c);ft(d,()=>r.children),h(c),Q(()=>{ke(c,1,`inline-flex items-center justify-center gap-1.5 font-bold cursor-pointer transition-colors duration-150 disabled:opacity-40 disabled:pointer-events-none ${s[n()]??""} ${l[a()]??""}`),c.disabled=o()}),le("click",c,function(...y){var p;(p=r.onclick)==null||p.apply(this,y)}),u(t,c)}qe(["click"]);var cs=N(" ",1),us=N(''),ds=N(''),fs=N('
            '),vs=N('

            ',1);function gs(t,r){Me(r,!0);let a=he(r,"confirmLabel",3,"OK"),n=he(r,"confirmVariant",3,"primary"),o=he(r,"value",3,""),s=he(r,"placeholder",3,""),l=he(r,"multiline",3,!1);const c=o();let d=D(se(c)),y=D(void 0),p=D(void 0);Ee(()=>{var A;r.mode==="prompt"&&e(y)?(e(y).focus(),"select"in e(y)&&e(y).select()):e(p)&&((A=e(p).querySelector("button"))==null||A.focus())});function S(){r.mode==="prompt"?ot(e(d)):r.mode==="confirm"?ot(!0):ot()}function k(){r.mode==="confirm"?ot(!1):r.mode==="prompt"?ot(null):ot()}{const A=x=>{var f=cs(),_=B(f);{var P=E=>{Re(E,{variant:"secondary",onclick:k,children:(m,R)=>{Ce();var F=Oe("Cancel");u(m,F)},$$slots:{default:!0}})};X(_,E=>{r.mode!=="alert"&&E(P)})}var b=M(_,2),$=w(b);Re($,{get variant(){return n()},onclick:S,children:(E,m)=>{Ce();var R=Oe();Q(()=>re(R,a())),u(E,R)},$$slots:{default:!0}}),h(b),rt(b,E=>v(p,E),()=>e(p)),u(x,f)};let T=O(()=>l()?void 0:S);hr(t,{get title(){return r.title},titleId:"app-dialog-title",get onConfirm(){return e(T)},onCancel:k,footer:A,children:(x,f)=>{var _=vs(),P=B(_),b=w(P,!0);h(P);var $=M(P,2);{var E=m=>{var R=fs(),F=w(R);{var L=z=>{var V=us();Ro(V),rt(V,I=>v(y,I),()=>e(y)),Q(()=>ye(V,"placeholder",s())),Ze(V,()=>e(d),I=>v(d,I)),u(z,V)},j=z=>{var V=ds();Ke(V),rt(V,I=>v(y,I),()=>e(y)),Q(()=>ye(V,"placeholder",s())),Ze(V,()=>e(d),I=>v(d,I)),u(z,V)};X(F,z=>{l()?z(L):z(j,-1)})}h(R),u(m,R)};X($,m=>{r.mode==="prompt"&&m(E)})}Q(()=>re(b,r.message)),u(x,_)},$$slots:{footer:!0,default:!0}})}Te()}var hs=N('');function Ne(t,r){var a=hs(),n=w(a),o=M(n);ft(o,()=>r.children),h(a),Q(()=>re(n,`${r.text??""} `)),u(t,a)}function kt(t,r){const a=localStorage.getItem(t);if(a===null)return r;const n=Number(a);return Number.isFinite(n)?n:r}function Ct(t,r){Number.isFinite(r)&&localStorage.setItem(t,String(r))}function ms(t,r){return localStorage.getItem(t)??r}function ps(){return{n:kt("csauto_run_n",1),nt:kt("csauto_run_nt",1),maxParallel:kt("csauto_run_max_parallel",0)||null}}function _s(t){Ct("csauto_run_n",t.n),Ct("csauto_run_nt",t.nt),t.maxParallel&&Ct("csauto_run_max_parallel",t.maxParallel)}function bs(){return{n:kt("csauto_restart_n",1),nt:kt("csauto_restart_nt",1),maxParallel:kt("csauto_restart_max_parallel",0)||null,mode:ms("csauto_restart_mode",""),value:kt("csauto_restart_value",100)}}function xs(t){Ct("csauto_restart_n",t.n),Ct("csauto_restart_nt",t.nt),t.maxParallel&&Ct("csauto_restart_max_parallel",t.maxParallel),localStorage.setItem("csauto_restart_mode",t.mode),Ct("csauto_restart_value",t.value)}function ys(){return{keepLast:kt("csauto_clean_keep_last",1)}}function ws(t){Ct("csauto_clean_keep_last",t.keepLast)}var ks=N(" ",1),Cs=N(''),Ss=N(''),Ps=N(''),$s=N('
            ');function Rs(t,r){Me(r,!0);const a=ps(),n=a.maxParallel??(r.cases.length>1?r.cases.length:0);let o=D(se(a.n)),s=D(se(a.nt)),l=D(se(n));async function c(){if(!Number.isFinite(e(o))||e(o)<=0){await tt("MPI ranks must be an integer > 0.","Invalid value");return}if(!Number.isFinite(e(s))||e(s)<=0){await tt("Threads must be an integer > 0.","Invalid value");return}if(e(l)&&(!Number.isFinite(e(l))||e(l)<=0)){await tt("Max parallel must be empty or > 0.","Invalid value");return}const d={n:e(o),nt:e(s),maxParallel:e(l)||null};_s(d),ot(d)}{const d=S=>{var k=ks(),A=B(k);Re(A,{variant:"secondary",onclick:()=>ot(null),children:(x,f)=>{Ce();var _=Oe("Cancel");u(x,_)},$$slots:{default:!0}});var T=M(A,2);Re(T,{variant:"run",onclick:c,children:(x,f)=>{Ce();var _=Oe("Run");u(x,_)},$$slots:{default:!0}}),u(S,k)};let y=O(()=>r.cases.length),p=O(()=>r.cases.length>1?"s":"");hr(t,{title:"Run Cases",titleId:"run-dialog-title",get subtitle(){return`${e(y)??""} case${e(p)??""} selected`},onConfirm:c,footer:d,children:(S,k)=>{var A=$s(),T=w(A);Ne(T,{text:"MPI Ranks (n)",children:(_,P)=>{var b=Cs();Ke(b),Ze(b,()=>e(o),$=>v(o,$)),u(_,b)}});var x=M(T,2);Ne(x,{text:"OMP Threads (nt)",children:(_,P)=>{var b=Ss();Ke(b),Ze(b,()=>e(s),$=>v(s,$)),u(_,b)}});var f=M(x,2);Ne(f,{text:"Max Parallel",children:(_,P)=>{var b=Ps();Ke(b),Ze(b,()=>e(l),$=>v(l,$)),u(_,b)}}),h(A),u(S,A)},$$slots:{footer:!0,default:!0}})}Te()}const Jr="csauto_token";let ka=D(se(localStorage.getItem(Jr)??""));function mn(){return e(ka)}function Ca(t){v(ka,t,!0),t?localStorage.setItem(Jr,t):localStorage.removeItem(Jr)}let kr=null;async function pn(t,r={}){const a=new Headers(r.headers),n=mn();n&&a.set("X-CSAUTO-TOKEN",n);const o=await fetch(t,{...r,headers:a});if(o.status===401){kr||(kr=hn("API token required:",n,"Authentication"));const s=await kr;return kr=null,s===null?o:(Ca(s),a.set("X-CSAUTO-TOKEN",s),fetch(t,{...r,headers:a}))}return o}async function it(t){const r=await pn(t);if(!r.ok)throw new Error(`GET ${t} failed: ${r.status}`);return r.json()}async function _n(t){const r=await pn(t);if(!r.ok)throw new Error(`GET ${t} failed: ${r.status}`);return r.text()}async function Et(t,r){const a=await pn(t,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(r)});if(!a.ok){const n=await a.text().catch(()=>a.statusText);throw new Error(`POST ${t} failed (${a.status}): ${n}`)}return a.json()}function Dr(t){return t.map(r=>`case=${encodeURIComponent(r)}`).join("&")}function Es(t=!1){return it(`/api/status${t?"?log=1":""}`)}function On(t){return it(`/api/perf?${Dr(t)}`)}function Ns(){return it("/api/app_config")}function Ms(t){return`/api/solver_logo?solver=${encodeURIComponent(t)}`}function Ts(t){return`/api/solver_icon?solver=${encodeURIComponent(t)}`}function As(t){return it(`/api/residual_columns?${Dr(t)}`).then(r=>r.columns??[])}function Ls(t,r,a={}){const n=new URLSearchParams;return t.forEach(o=>n.append("case",o)),n.set("columns",r.join(",")),a.width&&n.set("width",String(a.width)),a.height&&n.set("height",String(a.height)),a.xMin!==void 0&&n.set("x_min",String(a.xMin)),a.includeHistory&&n.set("include_history","true"),_n(`/api/residuals_svg?${n}`)}function Sa(t){return it(`/api/restart_origin?${Dr(t)}`)}function Fs(t){var a;const r=new URLSearchParams;return t.cases.forEach(n=>r.append("case",n)),(a=t.files)!=null&&a.length&&r.set("files",t.files.join(",")),t.maxHits&&r.set("max_hits",String(t.maxHits)),t.context!==void 0&&r.set("context",String(t.context)),t.sev&&r.set("sev",t.sev),t.q&&r.set("q",t.q),it(`/api/recent_errors?${r}`)}function Ds(t){return it(`/api/tail_files?case=${encodeURIComponent(t)}`).then(r=>r.files??[])}function Is(t,r,a){const n=new URLSearchParams({case:t,file:r,n:String(a)});return it(`/api/tail_lines?${n}`)}function Pa(t){return it(`/api/resu_dirs?${Dr(t)}`).then(r=>r.dirs??[])}function Zr(t,r){const a=new URLSearchParams({scope:r});return t.forEach(n=>a.append("case",n)),it(`/api/probes?${a}`).then(n=>n.files??[])}function zs(t,r){const a=new URLSearchParams;return t.forEach(n=>a.append("case",n)),r.forEach(n=>a.append("probe",n)),it(`/api/probe_columns?${a}`).then(n=>n.columns??[])}function Os(t,r,a){const n=new URLSearchParams({case:t,probe:r});return a.forEach(o=>n.append("column",o)),it(`/api/probe_position?${n}`)}function Hs(t){const r=new URLSearchParams;return t.cases.forEach(a=>r.append("case",a)),t.probes.forEach(a=>r.append("probe",a)),r.set("columns",t.columns.join(",")),t.axis&&r.set("axis",t.axis),t.xMin!==void 0&&r.set("x_min",String(t.xMin)),t.timeMin!==void 0&&r.set("time_min",String(t.timeMin)),r.set("include_history","true"),t.width&&r.set("width",String(t.width)),t.height&&r.set("height",String(t.height)),_n(`/api/probe_svg?${r}`)}function js(t){const r=new URLSearchParams;return t.cases.forEach(a=>r.append("case",a)),t.base&&r.set("base",t.base),t.kind&&r.set("kind",t.kind),t.filter&&r.set("filter",t.filter),_n(`/api/compare_runs?${r}`)}function Hn(t){return Et("/api/run_case",{cases:t.cases,n:t.n,nt:t.nt,max_parallel:t.maxParallel??void 0,restart:t.restart??!1,restart_mode:t.restartMode??"",restart_value:t.restartValue??void 0,restart_path:t.restartPath||void 0}).then(()=>{})}function Us(t){return Et("/api/kill_case",{cases:t}).then(()=>{})}function Vs(t){return Et("/api/control_case",{cases:t.cases,action:t.action,value:t.value??null}).then(()=>{})}function Bs(t){return Et("/api/cleanup_cases",{cases:t.cases,keep_last:t.keepLast??1,prune_resu:t.pruneResu??!0,keep_resu:t.keepResu??[],delete_resu:t.deleteResu??[],max_log_mb:t.maxLogMb??50,clear_cid:!0,clear_pyc:!1})}function qs(t,r){return Et("/api/case_note",{case:t,note:r}).then(()=>{})}function Ks(t,r){return Et("/api/case_convergence",{case:t,convergence:r}).then(()=>{})}function Gs(t){return Et("/api/open_gui",{case:t}).then(()=>{})}function Ws(){return it("/api/settings/telemetry")}function Xs(t){return Et("/api/settings/telemetry",{enabled:t})}const Ys=["status","tail","errors"],Qs=3e4;let dr=D(null),Kr=!1,Gr=1e3,jn;function $t(){return e(dr)}async function $a(){if(!(e(dr)||Kr)){clearTimeout(jn),Kr=!0;try{v(dr,await Ns(),!0)}catch{jn=setTimeout($a,Gr),Gr=Math.min(Gr*2,Qs)}finally{Kr=!1}}}function Tt(t){var r;return(((r=e(dr))==null?void 0:r.panels)??Ys).includes(t)}function en(t){var r;return((r=e(dr))==null?void 0:r.capabilities.includes(t))??!1}function bn(t){return t.map(r=>({value:r,label:r}))}function Ra(t,r){return Number.isFinite(r)?r<=0?`${t.value_label} must be greater than 0.`:t.value_kind==="int"&&!Number.isInteger(r)?`${t.value_label} must be a whole number.`:"":`${t.value_label} must be a number.`}var Js=N(" ",1),Zs=N(''),el=N(''),tl=N(''),rl=N(""),nl=N(""),al=N(''),ol=N(""),sl=N(""),ll=N('
            ',1);function il(t,r){var T,x;Me(r,!0);const a=((T=$t())==null?void 0:T.restart_modes)??[],n=bs(),o=n.maxParallel??(r.cases.length>1?r.cases.length:0);let s=D(se(n.n)),l=D(se(n.nt)),c=D(se(o)),d=D(se(a.some(f=>f.name===n.mode)?n.mode:((x=a[0])==null?void 0:x.name)??"")),y=D(se(n.value)),p=D(""),S=D(se([])),k=O(()=>a.find(f=>f.name===e(d)));un(async()=>{if(r.cases.length===1)try{v(S,await Pa(r.cases),!0)}catch{v(S,[],!0)}});async function A(){var P,b;if(!Number.isFinite(e(s))||e(s)<=0){await tt("MPI ranks must be an integer > 0.","Invalid value");return}if(!Number.isFinite(e(l))||e(l)<=0){await tt("Threads must be an integer > 0.","Invalid value");return}if(e(c)&&(!Number.isFinite(e(c))||e(c)<=0)){await tt("Max parallel must be empty or > 0.","Invalid value");return}const f=(P=e(k))!=null&&P.value_label?Ra(e(k),e(y)):"";if(f){await tt(f,"Invalid value");return}const _={n:e(s),nt:e(l),maxParallel:e(c)||null,restartMode:e(d),restartValue:(b=e(k))!=null&&b.value_label?e(y):null,restartPath:e(p)||null};xs({n:e(s),nt:e(l),maxParallel:e(c)||null,mode:e(d),value:e(y)}),ot(_)}{const f=b=>{var $=Js(),E=B($);Re(E,{variant:"secondary",onclick:()=>ot(null),children:(R,F)=>{Ce();var L=Oe("Cancel");u(R,L)},$$slots:{default:!0}});var m=M(E,2);Re(m,{variant:"warning",onclick:A,children:(R,F)=>{Ce();var L=Oe("Restart");u(R,L)},$$slots:{default:!0}}),u(b,$)};let _=O(()=>r.cases.length),P=O(()=>r.cases.length>1?"s":"");hr(t,{title:"Restart Cases",titleId:"restart-dialog-title",get subtitle(){return`${e(_)??""} case${e(P)??""} selected`},onConfirm:A,footer:f,children:(b,$)=>{var E=ll(),m=B(E),R=w(m);Ne(R,{text:"MPI Ranks (n)",children:(q,g)=>{var i=Zs();Ke(i),Ze(i,()=>e(s),C=>v(s,C)),u(q,i)}});var F=M(R,2);Ne(F,{text:"OMP Threads (nt)",children:(q,g)=>{var i=el();Ke(i),Ze(i,()=>e(l),C=>v(l,C)),u(q,i)}});var L=M(F,2);Ne(L,{text:"Max Parallel",children:(q,g)=>{var i=tl();Ke(i),Ze(i,()=>e(c),C=>v(c,C)),u(q,i)}}),h(m);var j=M(m,2),z=w(j);{var V=q=>{Ne(q,{text:"Mode",children:(g,i)=>{var C=nl();Ue(C,21,()=>a,H=>H.name,(H,W)=>{var ee=rl(),ne=w(ee,!0);h(ee);var pe={};Q(()=>{re(ne,e(W).label),pe!==(pe=e(W).name)&&(ee.value=(ee.__value=e(W).name)??"")}),u(H,ee)}),h(C),Fn(C,()=>e(d),H=>v(d,H)),u(g,C)}})};X(z,q=>{a.length>0&&q(V)})}var I=M(z,2);{var G=q=>{Ne(q,{get text(){return e(k).value_label},children:(g,i)=>{var C=al();Ke(C),Q(()=>{ye(C,"min",e(k).value_kind==="int"?"1":"0"),ye(C,"step",e(k).value_kind==="int"?"1":"any")}),Ze(C,()=>e(y),H=>v(y,H)),u(g,C)}})};X(I,q=>{var g;(g=e(k))!=null&&g.value_label&&q(G)})}var U=M(I,2);Ne(U,{text:"Restart from",children:(q,g)=>{var i=sl(),C=w(i);C.value=C.__value="";var H=M(C);Ue(H,16,()=>e(S),W=>W,(W,ee)=>{var ne=ol(),pe=w(ne,!0);h(ne);var K={};Q(()=>{re(pe,ee),K!==(K=ee)&&(ne.value=(ne.__value=ee)??"")}),u(W,ne)}),h(i),Q(()=>{i.disabled=r.cases.length>1,ye(i,"title",r.cases.length>1?"Each case restarts from its own latest run":void 0)}),Fn(i,()=>e(p),W=>v(p,W)),u(q,i)}}),h(j),u(b,E)},$$slots:{footer:!0,default:!0}})}Te()}function Fe(t,r){let a=he(r,"size",3,14);var n=Se(),o=B(n);Mo(o,()=>r.icon,(s,l)=>{l(s,{get size(){return a()},class:"icon"})}),u(t,n)}/** - * @license lucide-svelte v1.0.1 - ISC - * - * ISC License - * - * Copyright (c) 2026 Lucide Icons and Contributors - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - * - * --- - * - * The following Lucide icons are derived from the Feather project: - * - * airplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out - * - * The MIT License (MIT) (for the icons listed above) - * - * Copyright (c) 2013-present Cole Bemis - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */const cl={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":2,"stroke-linecap":"round","stroke-linejoin":"round"};/** - * @license lucide-svelte v1.0.1 - ISC - * - * ISC License - * - * Copyright (c) 2026 Lucide Icons and Contributors - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - * - * --- - * - * The following Lucide icons are derived from the Feather project: - * - * airplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out - * - * The MIT License (MIT) (for the icons listed above) - * - * Copyright (c) 2013-present Cole Bemis - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */const ul=t=>{for(const r in t)if(r.startsWith("aria-")||r==="role"||r==="title")return!0;return!1};/** - * @license lucide-svelte v1.0.1 - ISC - * - * ISC License - * - * Copyright (c) 2026 Lucide Icons and Contributors - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - * - * --- - * - * The following Lucide icons are derived from the Feather project: - * - * airplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out - * - * The MIT License (MIT) (for the icons listed above) - * - * Copyright (c) 2013-present Cole Bemis - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */const Un=(...t)=>t.filter((r,a,n)=>!!r&&r.trim()!==""&&n.indexOf(r)===a).join(" ").trim();var dl=Ot("");function Qe(t,r){const a=Ge(r,["children","$$slots","$$events","$$legacy"]),n=Ge(a,["name","color","size","strokeWidth","absoluteStrokeWidth","iconNode"]);Me(r,!1);let o=he(r,"name",8,void 0),s=he(r,"color",8,"currentColor"),l=he(r,"size",8,24),c=he(r,"strokeWidth",8,2),d=he(r,"absoluteStrokeWidth",8,!1),y=he(r,"iconNode",24,()=>[]);Io();var p=dl();Dn(p,(A,T,x)=>({...cl,...A,...n,width:l(),height:l(),stroke:s(),"stroke-width":T,class:x}),[()=>ul(n)?void 0:{"aria-hidden":"true"},()=>(jt(d()),jt(c()),jt(l()),ur(()=>d()?Number(c())*24/Number(l()):c())),()=>(jt(Un),jt(o()),jt(a),ur(()=>Un("lucide-icon","lucide",o()?`lucide-${o()}`:"",a.class)))]);var S=w(p);Ue(S,1,y,fn,(A,T)=>{var x=O(()=>Eo(e(T),2));let f=()=>e(x)[0],_=()=>e(x)[1];var P=Se(),b=B(P);Uo(b,f,!0,($,E)=>{Dn($,()=>({..._()}))}),u(A,P)});var k=M(S);We(k,r,"default",{}),h(p),u(t,p),Te()}function fl(t,r){const a=Ge(r,["children","$$slots","$$events","$$legacy"]);/** - * @license lucide-svelte v1.0.1 - ISC - * - * ISC License - * - * Copyright (c) 2026 Lucide Icons and Contributors - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - * - * --- - * - * The following Lucide icons are derived from the Feather project: - * - * airplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out - * - * The MIT License (MIT) (for the icons listed above) - * - * Copyright (c) 2013-present Cole Bemis - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */const n=[["path",{d:"M12 5v14"}],["path",{d:"m19 12-7 7-7-7"}]];Qe(t,Ye({name:"arrow-down"},()=>a,{get iconNode(){return n},children:(o,s)=>{var l=Se(),c=B(l);We(c,r,"default",{}),u(o,l)},$$slots:{default:!0}}))}function vl(t,r){const a=Ge(r,["children","$$slots","$$events","$$legacy"]);/** - * @license lucide-svelte v1.0.1 - ISC - * - * ISC License - * - * Copyright (c) 2026 Lucide Icons and Contributors - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - * - * --- - * - * The following Lucide icons are derived from the Feather project: - * - * airplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out - * - * The MIT License (MIT) (for the icons listed above) - * - * Copyright (c) 2013-present Cole Bemis - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */const n=[["path",{d:"M8 3 4 7l4 4"}],["path",{d:"M4 7h16"}],["path",{d:"m16 21 4-4-4-4"}],["path",{d:"M20 17H4"}]];Qe(t,Ye({name:"arrow-left-right"},()=>a,{get iconNode(){return n},children:(o,s)=>{var l=Se(),c=B(l);We(c,r,"default",{}),u(o,l)},$$slots:{default:!0}}))}function gl(t,r){const a=Ge(r,["children","$$slots","$$events","$$legacy"]);/** - * @license lucide-svelte v1.0.1 - ISC - * - * ISC License - * - * Copyright (c) 2026 Lucide Icons and Contributors - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - * - * --- - * - * The following Lucide icons are derived from the Feather project: - * - * airplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out - * - * The MIT License (MIT) (for the icons listed above) - * - * Copyright (c) 2013-present Cole Bemis - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */const n=[["path",{d:"m5 12 7-7 7 7"}],["path",{d:"M12 19V5"}]];Qe(t,Ye({name:"arrow-up"},()=>a,{get iconNode(){return n},children:(o,s)=>{var l=Se(),c=B(l);We(c,r,"default",{}),u(o,l)},$$slots:{default:!0}}))}function xn(t,r){const a=Ge(r,["children","$$slots","$$events","$$legacy"]);/** - * @license lucide-svelte v1.0.1 - ISC - * - * ISC License - * - * Copyright (c) 2026 Lucide Icons and Contributors - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - * - * --- - * - * The following Lucide icons are derived from the Feather project: - * - * airplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out - * - * The MIT License (MIT) (for the icons listed above) - * - * Copyright (c) 2013-present Cole Bemis - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */const n=[["path",{d:"m6 9 6 6 6-6"}]];Qe(t,Ye({name:"chevron-down"},()=>a,{get iconNode(){return n},children:(o,s)=>{var l=Se(),c=B(l);We(c,r,"default",{}),u(o,l)},$$slots:{default:!0}}))}function hl(t,r){const a=Ge(r,["children","$$slots","$$events","$$legacy"]);/** - * @license lucide-svelte v1.0.1 - ISC - * - * ISC License - * - * Copyright (c) 2026 Lucide Icons and Contributors - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - * - * --- - * - * The following Lucide icons are derived from the Feather project: - * - * airplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out - * - * The MIT License (MIT) (for the icons listed above) - * - * Copyright (c) 2013-present Cole Bemis - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */const n=[["path",{d:"m9 18 6-6-6-6"}]];Qe(t,Ye({name:"chevron-right"},()=>a,{get iconNode(){return n},children:(o,s)=>{var l=Se(),c=B(l);We(c,r,"default",{}),u(o,l)},$$slots:{default:!0}}))}function ml(t,r){const a=Ge(r,["children","$$slots","$$events","$$legacy"]);/** - * @license lucide-svelte v1.0.1 - ISC - * - * ISC License - * - * Copyright (c) 2026 Lucide Icons and Contributors - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - * - * --- - * - * The following Lucide icons are derived from the Feather project: - * - * airplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out - * - * The MIT License (MIT) (for the icons listed above) - * - * Copyright (c) 2013-present Cole Bemis - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */const n=[["circle",{cx:"12",cy:"12",r:"10"}],["path",{d:"m15 9-6 6"}],["path",{d:"m9 9 6 6"}]];Qe(t,Ye({name:"circle-x"},()=>a,{get iconNode(){return n},children:(o,s)=>{var l=Se(),c=B(l);We(c,r,"default",{}),u(o,l)},$$slots:{default:!0}}))}function mr(t,r){const a=Ge(r,["children","$$slots","$$events","$$legacy"]);/** - * @license lucide-svelte v1.0.1 - ISC - * - * ISC License - * - * Copyright (c) 2026 Lucide Icons and Contributors - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - * - * --- - * - * The following Lucide icons are derived from the Feather project: - * - * airplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out - * - * The MIT License (MIT) (for the icons listed above) - * - * Copyright (c) 2013-present Cole Bemis - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */const n=[["path",{d:"M12 15V3"}],["path",{d:"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"}],["path",{d:"m7 10 5 5 5-5"}]];Qe(t,Ye({name:"download"},()=>a,{get iconNode(){return n},children:(o,s)=>{var l=Se(),c=B(l);We(c,r,"default",{}),u(o,l)},$$slots:{default:!0}}))}function pl(t,r){const a=Ge(r,["children","$$slots","$$events","$$legacy"]);/** - * @license lucide-svelte v1.0.1 - ISC - * - * ISC License - * - * Copyright (c) 2026 Lucide Icons and Contributors - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - * - * --- - * - * The following Lucide icons are derived from the Feather project: - * - * airplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out - * - * The MIT License (MIT) (for the icons listed above) - * - * Copyright (c) 2013-present Cole Bemis - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */const n=[["circle",{cx:"12",cy:"12",r:"1"}],["circle",{cx:"19",cy:"12",r:"1"}],["circle",{cx:"5",cy:"12",r:"1"}]];Qe(t,Ye({name:"ellipsis"},()=>a,{get iconNode(){return n},children:(o,s)=>{var l=Se(),c=B(l);We(c,r,"default",{}),u(o,l)},$$slots:{default:!0}}))}function _l(t,r){const a=Ge(r,["children","$$slots","$$events","$$legacy"]);/** - * @license lucide-svelte v1.0.1 - ISC - * - * ISC License - * - * Copyright (c) 2026 Lucide Icons and Contributors - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - * - * --- - * - * The following Lucide icons are derived from the Feather project: - * - * airplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out - * - * The MIT License (MIT) (for the icons listed above) - * - * Copyright (c) 2013-present Cole Bemis - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */const n=[["path",{d:"M15 3h6v6"}],["path",{d:"M10 14 21 3"}],["path",{d:"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"}]];Qe(t,Ye({name:"external-link"},()=>a,{get iconNode(){return n},children:(o,s)=>{var l=Se(),c=B(l);We(c,r,"default",{}),u(o,l)},$$slots:{default:!0}}))}function bl(t,r){const a=Ge(r,["children","$$slots","$$events","$$legacy"]);/** - * @license lucide-svelte v1.0.1 - ISC - * - * ISC License - * - * Copyright (c) 2026 Lucide Icons and Contributors - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - * - * --- - * - * The following Lucide icons are derived from the Feather project: - * - * airplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out - * - * The MIT License (MIT) (for the icons listed above) - * - * Copyright (c) 2013-present Cole Bemis - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */const n=[["rect",{x:"14",y:"3",width:"5",height:"18",rx:"1"}],["rect",{x:"5",y:"3",width:"5",height:"18",rx:"1"}]];Qe(t,Ye({name:"pause"},()=>a,{get iconNode(){return n},children:(o,s)=>{var l=Se(),c=B(l);We(c,r,"default",{}),u(o,l)},$$slots:{default:!0}}))}function xl(t,r){const a=Ge(r,["children","$$slots","$$events","$$legacy"]);/** - * @license lucide-svelte v1.0.1 - ISC - * - * ISC License - * - * Copyright (c) 2026 Lucide Icons and Contributors - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - * - * --- - * - * The following Lucide icons are derived from the Feather project: - * - * airplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out - * - * The MIT License (MIT) (for the icons listed above) - * - * Copyright (c) 2013-present Cole Bemis - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */const n=[["path",{d:"M13 21h8"}],["path",{d:"M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z"}]];Qe(t,Ye({name:"pen-line"},()=>a,{get iconNode(){return n},children:(o,s)=>{var l=Se(),c=B(l);We(c,r,"default",{}),u(o,l)},$$slots:{default:!0}}))}function yl(t,r){const a=Ge(r,["children","$$slots","$$events","$$legacy"]);/** - * @license lucide-svelte v1.0.1 - ISC - * - * ISC License - * - * Copyright (c) 2026 Lucide Icons and Contributors - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - * - * --- - * - * The following Lucide icons are derived from the Feather project: - * - * airplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out - * - * The MIT License (MIT) (for the icons listed above) - * - * Copyright (c) 2013-present Cole Bemis - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */const n=[["path",{d:"M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z"}],["path",{d:"m15 5 4 4"}]];Qe(t,Ye({name:"pencil"},()=>a,{get iconNode(){return n},children:(o,s)=>{var l=Se(),c=B(l);We(c,r,"default",{}),u(o,l)},$$slots:{default:!0}}))}function Ea(t,r){const a=Ge(r,["children","$$slots","$$events","$$legacy"]);/** - * @license lucide-svelte v1.0.1 - ISC - * - * ISC License - * - * Copyright (c) 2026 Lucide Icons and Contributors - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - * - * --- - * - * The following Lucide icons are derived from the Feather project: - * - * airplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out - * - * The MIT License (MIT) (for the icons listed above) - * - * Copyright (c) 2013-present Cole Bemis - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */const n=[["path",{d:"M5 5a2 2 0 0 1 3.008-1.728l11.997 6.998a2 2 0 0 1 .003 3.458l-12 7A2 2 0 0 1 5 19z"}]];Qe(t,Ye({name:"play"},()=>a,{get iconNode(){return n},children:(o,s)=>{var l=Se(),c=B(l);We(c,r,"default",{}),u(o,l)},$$slots:{default:!0}}))}function wl(t,r){const a=Ge(r,["children","$$slots","$$events","$$legacy"]);/** - * @license lucide-svelte v1.0.1 - ISC - * - * ISC License - * - * Copyright (c) 2026 Lucide Icons and Contributors - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - * - * --- - * - * The following Lucide icons are derived from the Feather project: - * - * airplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out - * - * The MIT License (MIT) (for the icons listed above) - * - * Copyright (c) 2013-present Cole Bemis - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */const n=[["path",{d:"M5 12h14"}],["path",{d:"M12 5v14"}]];Qe(t,Ye({name:"plus"},()=>a,{get iconNode(){return n},children:(o,s)=>{var l=Se(),c=B(l);We(c,r,"default",{}),u(o,l)},$$slots:{default:!0}}))}function Jt(t,r){const a=Ge(r,["children","$$slots","$$events","$$legacy"]);/** - * @license lucide-svelte v1.0.1 - ISC - * - * ISC License - * - * Copyright (c) 2026 Lucide Icons and Contributors - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - * - * --- - * - * The following Lucide icons are derived from the Feather project: - * - * airplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out - * - * The MIT License (MIT) (for the icons listed above) - * - * Copyright (c) 2013-present Cole Bemis - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */const n=[["path",{d:"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8"}],["path",{d:"M21 3v5h-5"}],["path",{d:"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16"}],["path",{d:"M8 16H3v5"}]];Qe(t,Ye({name:"refresh-cw"},()=>a,{get iconNode(){return n},children:(o,s)=>{var l=Se(),c=B(l);We(c,r,"default",{}),u(o,l)},$$slots:{default:!0}}))}function kl(t,r){const a=Ge(r,["children","$$slots","$$events","$$legacy"]);/** - * @license lucide-svelte v1.0.1 - ISC - * - * ISC License - * - * Copyright (c) 2026 Lucide Icons and Contributors - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - * - * --- - * - * The following Lucide icons are derived from the Feather project: - * - * airplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out - * - * The MIT License (MIT) (for the icons listed above) - * - * Copyright (c) 2013-present Cole Bemis - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */const n=[["path",{d:"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8"}],["path",{d:"M3 3v5h5"}]];Qe(t,Ye({name:"rotate-ccw"},()=>a,{get iconNode(){return n},children:(o,s)=>{var l=Se(),c=B(l);We(c,r,"default",{}),u(o,l)},$$slots:{default:!0}}))}function Cl(t,r){const a=Ge(r,["children","$$slots","$$events","$$legacy"]);/** - * @license lucide-svelte v1.0.1 - ISC - * - * ISC License - * - * Copyright (c) 2026 Lucide Icons and Contributors - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - * - * --- - * - * The following Lucide icons are derived from the Feather project: - * - * airplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out - * - * The MIT License (MIT) (for the icons listed above) - * - * Copyright (c) 2013-present Cole Bemis - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */const n=[["path",{d:"M9.671 4.136a2.34 2.34 0 0 1 4.659 0 2.34 2.34 0 0 0 3.319 1.915 2.34 2.34 0 0 1 2.33 4.033 2.34 2.34 0 0 0 0 3.831 2.34 2.34 0 0 1-2.33 4.033 2.34 2.34 0 0 0-3.319 1.915 2.34 2.34 0 0 1-4.659 0 2.34 2.34 0 0 0-3.32-1.915 2.34 2.34 0 0 1-2.33-4.033 2.34 2.34 0 0 0 0-3.831A2.34 2.34 0 0 1 6.35 6.051a2.34 2.34 0 0 0 3.319-1.915"}],["circle",{cx:"12",cy:"12",r:"3"}]];Qe(t,Ye({name:"settings"},()=>a,{get iconNode(){return n},children:(o,s)=>{var l=Se(),c=B(l);We(c,r,"default",{}),u(o,l)},$$slots:{default:!0}}))}function Sl(t,r){const a=Ge(r,["children","$$slots","$$events","$$legacy"]);/** - * @license lucide-svelte v1.0.1 - ISC - * - * ISC License - * - * Copyright (c) 2026 Lucide Icons and Contributors - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - * - * --- - * - * The following Lucide icons are derived from the Feather project: - * - * airplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out - * - * The MIT License (MIT) (for the icons listed above) - * - * Copyright (c) 2013-present Cole Bemis - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */const n=[["path",{d:"M10 11v6"}],["path",{d:"M14 11v6"}],["path",{d:"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6"}],["path",{d:"M3 6h18"}],["path",{d:"M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2"}]];Qe(t,Ye({name:"trash-2"},()=>a,{get iconNode(){return n},children:(o,s)=>{var l=Se(),c=B(l);We(c,r,"default",{}),u(o,l)},$$slots:{default:!0}}))}var Pl=N('
          • '),$l=N('
              '),Rl=N('
              ',1);function lt(t,r){Me(r,!0);let a=he(r,"value",3,""),n=he(r,"placeholder",3,"Select..."),o=he(r,"class",3,""),s=he(r,"buttonClass",3,""),l=D(!1),c=D(void 0),d=D(void 0),y=D(""),p=O(()=>{var L;return((L=r.options.find(j=>j.value===a()))==null?void 0:L.label)??n()});function S(L){var j;v(l,!1),(j=r.onchange)==null||j.call(r,L)}function k(){if(!e(c)||!e(d))return;const L=e(c).getBoundingClientRect(),j=e(d).offsetHeight,z=4,V=window.innerHeight-L.bottom-z,G=VV?L.top-z-j:L.bottom+z,U=Math.min(L.left,window.innerWidth-L.width);v(y,`position:fixed; top:${G}px; left:${U}px; width:${L.width}px; z-index:9999;`)}async function A(){v(l,!e(l)),e(l)&&(await Pt(),k())}function T(L){L.key==="Escape"&&v(l,!1)}function x(L){e(l)&&e(c)&&!e(c).contains(L.target)&&e(d)&&!e(d).contains(L.target)&&v(l,!1)}var f=Rl();et("mousedown",st,x),et("keydown",st,T),et("scroll",st,()=>{e(l)&&v(l,!1)});var _=B(f),P=w(_),b=w(P),$=w(b,!0);h(b);var E=M(b,2),m=w(E);Fe(m,{get icon(){return xn},size:14}),h(E),h(P),rt(P,L=>v(c,L),()=>e(c)),h(_);var R=M(_,2);{var F=L=>{Qt(L,{children:(j,z)=>{var V=$l();Ue(V,21,()=>r.options,I=>I.value,(I,G)=>{var U=Pl();ye(U,"tabindex",0);var q=w(U,!0);h(U),Q(()=>{ye(U,"aria-selected",e(G).value===a()),ke(U,1,`px-2.5 py-1.5 text-[13px] cursor-pointer transition-colors duration-100 - ${e(G).value===a()?"text-edf-bleu-fonce font-bold bg-[rgba(16,87,200,0.06)]":"text-ink hover:bg-edf-gris-clair"}`),re(q,e(G).label)}),le("mousedown",U,g=>{g.stopPropagation(),S(e(G).value)}),u(I,U)}),h(V),rt(V,I=>v(d,I),()=>e(d)),Q(()=>Xe(V,e(y))),u(j,V)}})};X(R,L=>{e(l)&&L(F)})}Q(()=>{ke(_,1,`relative inline-flex ${o()??""}`),ke(P,1,dt(s()||"flex items-center justify-between gap-1.5 w-full h-[30px] cursor-pointer bg-white border border-border rounded-md text-[13px] text-ink font-normal pl-2.5 pr-2 transition-colors duration-150 hover:bg-edf-gris-clair focus:outline-none focus:border-edf-bleu-moyen")),ye(P,"aria-expanded",e(l)),re($,e(p)),ke(E,1,`text-muted shrink-0 transition-transform duration-150 ${e(l)?"rotate-180":""}`)}),le("mousedown",P,L=>{L.stopPropagation(),A()}),u(t,f),Te()}qe(["mousedown"]);var El=Ot(''),Nl=N('
              '),Ml=N('
              '),Tl=N('
              ',1);function Kt(t,r){Me(r,!0);let a=he(r,"selected",19,()=>[]),n=he(r,"placeholder",3,"Select..."),o=he(r,"class",3,""),s=D(!1),l=D(void 0),c=D(void 0),d=D(""),y=O(()=>new Set(a())),p=O(()=>a().length===0?n():a().length===r.options.length?`All (${r.options.length})`:a().length<=2?a().map(z=>{var V;return((V=r.options.find(I=>I.value===z))==null?void 0:V.label)??z}).join(", "):`${a().length} selected`);function S(z){var I;const V=new Set(e(y));V.has(z)?V.delete(z):V.add(z),(I=r.onchange)==null||I.call(r,[...V])}function k(){var z;(z=r.onchange)==null||z.call(r,r.options.map(V=>V.value))}function A(){var z;(z=r.onchange)==null||z.call(r,[])}function T(){if(!e(l)||!e(c))return;const z=e(l).getBoundingClientRect(),V=e(c).offsetHeight,I=4,G=window.innerHeight-z.bottom-I,q=GG?z.top-I-V:z.bottom+I,g=Math.min(z.left,window.innerWidth-z.width);v(d,`position:fixed; top:${q}px; left:${g}px; min-width:${z.width}px; z-index:9999;`)}async function x(){v(s,!e(s)),e(s)&&(await Pt(),T())}function f(z){e(s)&&e(l)&&!e(l).contains(z.target)&&e(c)&&!e(c).contains(z.target)&&v(s,!1)}function _(z){z.key==="Escape"&&v(s,!1)}var P=Tl();et("mousedown",st,f),et("keydown",st,_),et("scroll",st,()=>{e(s)&&v(s,!1)});var b=B(P),$=w(b),E=w($),m=w(E,!0);h(E);var R=M(E,2),F=w(R);Fe(F,{get icon(){return xn},size:14}),h(R),h($),rt($,z=>v(l,z),()=>e(l)),h(b);var L=M(b,2);{var j=z=>{Qt(z,{children:(V,I)=>{var G=Ml(),U=w(G),q=w(U),g=M(q,2);h(U);var i=M(U,2);Ue(i,17,()=>r.options,C=>C.value,(C,H)=>{var W=Nl(),ee=w(W),ne=w(ee);{var pe=ie=>{var we=El();u(ie,we)},K=O(()=>e(y).has(e(H).value));X(ne,ie=>{e(K)&&ie(pe)})}h(ee);var Y=M(ee,2),ce=w(Y,!0);h(Y),h(W),Q(ie=>{ke(ee,1,`inline-flex items-center justify-center shrink-0 w-[14px] h-[14px] rounded border-2 transition-colors duration-100 - ${ie??""}`),re(ce,e(H).label)},[()=>e(y).has(e(H).value)?"bg-edf-bleu-moyen border-edf-bleu-moyen text-white":"bg-white border-edf-gris-moyen"]),le("mousedown",W,ie=>{ie.stopPropagation(),S(e(H).value)}),u(C,W)}),h(G),rt(G,C=>v(c,C),()=>e(c)),Q(()=>Xe(G,e(d))),le("mousedown",q,C=>{C.stopPropagation(),k()}),le("mousedown",g,C=>{C.stopPropagation(),A()}),u(V,G)}})};X(L,z=>{e(s)&&z(j)})}Q(()=>{ke(b,1,`relative inline-flex ${o()??""}`),ye($,"aria-expanded",e(s)),re(m,e(p)),ke(R,1,`text-muted shrink-0 transition-transform duration-150 ${e(s)?"rotate-180":""}`)}),le("mousedown",$,z=>{z.stopPropagation(),x()}),u(t,P),Te()}qe(["mousedown"]);var Al=N(" ",1),Ll=N(''),Fl=N('Loading...'),Dl=N('No folders found'),Il=N('
              '),zl=N('
              ',1);function Ol(t,r){Me(r,!0);const a=ys();let n=D("keep_latest"),o=D(se(a.keepLast)),s=D(se([])),l=D(se([])),c=D(!0),d=O(()=>e(n)==="keep_folder"||e(n)==="delete_folder"),y=O(()=>[{value:"keep_latest",label:"Keep latest N"},{value:"delete_all",label:"Delete all runs"},...r.cases.length===1?[{value:"keep_folder",label:"Keep specific folders"},{value:"delete_folder",label:"Delete specific folders"}]:[]]),p=O(()=>e(s).map(k=>({value:k,label:k})));un(async()=>{if(r.cases.length===1){try{v(s,await Pa(r.cases),!0)}catch{v(s,[],!0)}v(c,!1)}});async function S(){if(e(d)&&e(l).length===0){await tt("Please select at least one run folder.","Missing selection");return}const k={action:e(n)};e(n)==="keep_latest"?(k.keepLast=e(o),ws({keepLast:e(o)})):e(n)==="delete_all"?k.keepLast=0:e(n)==="keep_folder"?k.keepResu=e(l):e(n)==="delete_folder"&&(k.deleteResu=e(l)),ot(k)}{const k=x=>{var f=Al(),_=B(f);Re(_,{variant:"secondary",onclick:()=>ot(null),children:(b,$)=>{Ce();var E=Oe("Cancel");u(b,E)},$$slots:{default:!0}});var P=M(_,2);Re(P,{variant:"primary",onclick:S,children:(b,$)=>{Ce();var E=Oe("Clean");u(b,E)},$$slots:{default:!0}}),u(x,f)};let A=O(()=>r.cases.length),T=O(()=>r.cases.length>1?"s":"");hr(t,{title:"Cleanup Cases",titleId:"clean-dialog-title",get subtitle(){return`${e(A)??""} case${e(T)??""} selected`},footer:k,children:(x,f)=>{var _=zl(),P=B(_),b=w(P);Ne(b,{text:"Action",children:(F,L)=>{lt(F,{class:"w-[200px]",get options(){return e(y)},get value(){return e(n)},onchange:j=>v(n,j,!0)})}});var $=M(b,2);{var E=F=>{Ne(F,{text:"Keep last",children:(L,j)=>{var z=Ll();Ke(z),Ze(z,()=>e(o),V=>v(o,V)),u(L,z)}})};X($,F=>{e(n)==="keep_latest"&&F(E)})}h(P);var m=M(P,2);{var R=F=>{var L=Il(),j=w(L);Ne(j,{text:"Run folders",children:(z,V)=>{var I=Se(),G=B(I);{var U=i=>{var C=Fl();u(i,C)},q=i=>{var C=Dl();u(i,C)},g=i=>{Kt(i,{class:"w-full",get options(){return e(p)},get selected(){return e(l)},onchange:C=>v(l,C,!0),placeholder:"Select folders..."})};X(G,i=>{e(c)?i(U):e(s).length===0?i(q,1):i(g,-1)})}u(z,I)}}),h(L),u(F,L)};X(m,F=>{e(d)&&F(R)})}u(x,_)},$$slots:{footer:!0,default:!0}})}Te()}function Hl(t,r){Me(r,!0);let a=O(ts);var n=Se(),o=B(n);{var s=y=>{Rs(y,{get cases(){return e(a).props.cases}})},l=y=>{il(y,{get cases(){return e(a).props.cases}})},c=y=>{Ol(y,{get cases(){return e(a).props.cases}})},d=y=>{gs(y,{get mode(){return e(a).type},get title(){return e(a).props.title},get message(){return e(a).props.message},get confirmLabel(){return e(a).props.confirmLabel},get confirmVariant(){return e(a).props.confirmVariant},get value(){return e(a).props.value},get placeholder(){return e(a).props.placeholder},get multiline(){return e(a).props.multiline}})};X(o,y=>{e(a).type==="run"?y(s):e(a).type==="restart"?y(l,1):e(a).type==="clean"?y(c,2):(e(a).type==="alert"||e(a).type==="confirm"||e(a).type==="prompt")&&y(d,3)})}u(t,n),Te()}let fr=D(se([])),jl=0;function Ul(){return e(fr)}function Vn(t,r="success",a=3500){const n=++jl;v(fr,[...e(fr),{id:n,message:t,variant:r}],!0),setTimeout(()=>Na(n),a)}function Na(t){v(fr,e(fr).filter(r=>r.id!==t),!0)}var Vl=N('
              '),Bl=N('
              ');function ql(t,r){Me(r,!0);let a=O(Ul);Qt(t,{children:(n,o)=>{var s=Bl();Ue(s,21,()=>e(a),l=>l.id,(l,c)=>{var d=Vl(),y=w(d,!0);h(d),Q(()=>{ke(d,1,`pointer-events-auto max-w-[320px] px-4 py-2.5 rounded-md shadow-lg text-sm font-semibold text-white cursor-pointer ${e(c).variant==="success"?"bg-edf-vert-fonce":"bg-edf-orange-fonce"}`),re(y,e(c).message)}),le("click",d,()=>Na(e(c).id)),u(l,d)}),h(s),u(n,s)}}),Te()}qe(["click"]);var Kl=Ot(''),Gl=Ot(''),Wl=N(''),Xl=N(" ",1),Yl=N(" ",1),Ql=N('');function zt(t,r){Me(r,!0);const a=x=>{var f=Wl(),_=w(f);{var P=$=>{var E=Kl();Q(()=>Xe(E,`width: ${l()-4}px; height: ${l()-4}px;`)),u($,E)},b=$=>{var E=Gl();Q(()=>Xe(E,`width: ${l()-4}px; height: ${l()-4}px;`)),u($,E)};X(_,$=>{n()&&!o()?$(P):o()&&$(b,1)})}h(f),Q(()=>{ke(f,1,`inline-flex items-center justify-center rounded border-2 cursor-pointer transition-colors duration-100 shrink-0 - ${s()?"opacity-40 cursor-not-allowed":""} - ${n()||o()?"bg-edf-bleu-moyen border-edf-bleu-moyen text-white":"bg-white border-edf-gris-moyen hover:border-edf-bleu-clair"}`),Xe(f,`width: ${l()??""}px; height: ${l()??""}px;`),ye(f,"aria-checked",o()?"mixed":n()),ye(f,"aria-disabled",s()),ye(f,"tabindex",s()?-1:0)}),le("click",f,y),le("keydown",f,p),u(x,f)};let n=he(r,"checked",3,!1),o=he(r,"indeterminate",3,!1),s=he(r,"disabled",3,!1),l=he(r,"size",3,16),c=he(r,"label",3,""),d=he(r,"labelFirst",3,!1);function y(x){var _;if(x.stopPropagation(),s())return;const f=o()?!0:!n();(_=r.onchange)==null||_.call(r,f)}function p(x){(x.key===" "||x.key==="Enter")&&(x.preventDefault(),x.stopPropagation(),y(x))}var S=Se(),k=B(S);{var A=x=>{var f=Ql(),_=w(f);{var P=$=>{var E=Xl(),m=B(E),R=w(m,!0);h(m);var F=M(m);a(F),Q(()=>re(R,c())),u($,E)},b=$=>{var E=Yl(),m=B(E);a(m);var R=M(m),F=w(R,!0);h(R),Q(()=>re(F,c())),u($,E)};X(_,$=>{d()?$(P):$(b,-1)})}h(f),le("click",f,y),le("keydown",f,p),u(x,f)},T=x=>{a(x)};X(k,x=>{c()?x(A):x(T,-1)})}u(t,S),Te()}qe(["click","keydown"]);function yn(t,r){try{const a=localStorage.getItem(t);return a===null?r:JSON.parse(a)}catch{return r}}function Ir(t,r){localStorage.setItem(t,JSON.stringify(r))}const tn=new Map;function pr(t,r,a){vt(t),tn.set(t,setInterval(r,a))}function vt(t){const r=tn.get(t);r!==void 0&&(clearInterval(r),tn.delete(t))}const Ft={status:1e3,tail:1e3,plot:3e3,probe:3e3,errors:5e3},Jl=["status","plot","probe","tail","errors"],Wr={status:{label:"Status table",min:500},plot:{label:"Residual plots",min:1e3},probe:{label:"Probe plots",min:1e3},tail:{label:"Log tail",min:500},errors:{label:"Recent errors",min:2e3}},sr=yn("csauto_refresh_rates",{});let _t=D(se({status:sr.status??Ft.status,tail:sr.tail??Ft.tail,plot:sr.plot??Ft.plot,probe:sr.probe??Ft.probe,errors:sr.errors??Ft.errors}));function Zl(){return e(_t)}function ei(t,r){v(_t,{...e(_t),[t]:r},!0),Ir("csauto_refresh_rates",e(_t))}function ti(){return e(_t).status}function Bn(){return e(_t).tail}function qn(){return e(_t).plot}function ri(){return e(_t).probe}function Kn(){return e(_t).errors}const rn=new Set;function _r(t){return rn.add(t),()=>rn.delete(t)}function ni(){rn.forEach(t=>t())}const nn=yn("csauto_autorefresh_enabled",{});function Zt(t){return nn[t]??!0}function er(t,r){nn[t]=r,Ir("csauto_autorefresh_enabled",nn)}var ai=N(" ",1),oi=N('
              ms
              '),si=N('
              Telemetry
              '),li=N('
              API token
              Auto-refresh intervals
              ',1);function ii(t,r){Me(r,!0);let a=D(se(mn())),n=D(se({...Zl()})),o=D(!0),s=D(!1);Ee(()=>{Ws().then(y=>{v(o,y.enabled,!0),v(s,!0)}).catch(()=>{v(s,!1)})});function l(y){const{min:p}=Wr[y];let S=e(n)[y];(typeof S!="number"||isNaN(S))&&(S=Ft[y]),v(n,{...e(n),[y]:Math.max(p,Math.round(S))},!0)}function c(y,p){const S=p.target,k=S.value.replace(/[^0-9]/g,""),A=parseInt(k,10);isNaN(A)?k===""&&v(n,{...e(n),[y]:Wr[y].min},!0):v(n,{...e(n),[y]:A},!0),S.value=String(e(n)[y])}function d(){Ca(e(a));for(const y of Object.keys(e(n)))l(y),ei(y,e(n)[y]);e(s)&&Xs(e(o)).catch(()=>{}),r.onClose()}hr(t,{title:"Settings",titleId:"settings-dialog-title",get onCancel(){return r.onClose},onConfirm:d,maxWidth:"400px",portal:!0,footer:p=>{var S=ai(),k=B(S);Re(k,{variant:"secondary",get onclick(){return r.onClose},children:(T,x)=>{Ce();var f=Oe("Cancel");u(T,f)},$$slots:{default:!0}});var A=M(k,2);Re(A,{variant:"primary",onclick:d,children:(T,x)=>{Ce();var f=Oe("Save");u(T,f)},$$slots:{default:!0}}),u(p,S)},children:(p,S)=>{var k=li(),A=B(k),T=M(w(A),2);Ke(T),h(A);var x=M(A,2),f=w(x),_=M(w(f),2);h(f);var P=M(f,2);Ue(P,20,()=>Jl,E=>E,(E,m)=>{const R=O(()=>Wr[m]);var F=oi(),L=w(F),j=w(L),z=w(j,!0);h(j);var V=M(j,2),I=w(V);h(V),h(L);var G=M(L,2),U=w(G);Ke(U),Ce(2),h(G),h(F),Q(()=>{re(z,e(R).label),re(I,`min ${e(R).min??""}ms`),vn(U,e(n)[m])}),le("input",U,q=>c(m,q)),et("blur",U,()=>l(m)),u(E,F)}),h(P),h(x);var b=M(x,2);{var $=E=>{var m=si(),R=M(w(m),2);zt(R,{get checked(){return e(o)},onchange:F=>v(o,F,!0),label:"Send anonymous usage statistics"}),h(m),u(E,m)};X(b,E=>{e(s)&&E($)})}Ze(T,()=>e(a),E=>v(a,E)),le("click",_,()=>v(n,{...Ft},!0)),u(p,k)},$$slots:{footer:!0,default:!0}}),Te()}qe(["click","input"]);var ci=N(''),ui=N(' '),di=N('
              ',1);function fi(t,r){Me(r,!0);let a=O(()=>r.shownCases!==r.totalCases),n=O($t),o=D(!1);var s=di(),l=B(s),c=w(l),d=w(c);{var y=i=>{var C=ci();Q(H=>{ye(C,"src",H),ye(C,"alt",e(n).solver)},[()=>Ms(e(n).solver)]),u(i,C)},p=i=>{var C=ui(),H=w(C,!0);h(C),Q(()=>re(H,e(n).solver)),u(i,C)};X(d,i=>{var C;(C=e(n))!=null&&C.logo?i(y):e(n)&&i(p,1)})}h(c);var S=M(c,2),k=w(S),A=w(k),T=w(A);{var x=i=>{var C=Oe();Q(()=>re(C,`${r.shownCases??""}/`)),u(i,C)};X(T,i=>{e(a)&&i(x)})}var f=M(T,1,!0);h(A);var _=M(A,2),P=w(_,!0);h(_),h(k);var b=M(k,2),$=w(b),E=w($);{var m=i=>{var C=Oe();Q(()=>re(C,`${r.shownRunning??""}/`)),u(i,C)};X(E,i=>{e(a)&&i(m)})}var R=M(E,1,!0);h($),Ce(2),h(b);var F=M(b,2),L=w(F),j=w(L);{var z=i=>{var C=Oe();Q(()=>re(C,`${r.shownConverged??""}/`)),u(i,C)};X(j,i=>{e(a)&&i(z)})}var V=M(j,1,!0);h(L),Ce(2),h(F),h(S);var I=M(S,2),G=w(I),U=w(G);Fe(U,{get icon(){return Cl},size:18}),h(G),h(I),h(l);var q=M(l,2);{var g=i=>{ii(i,{onClose:()=>v(o,!1)})};X(q,i=>{e(o)&&i(g)})}Q(()=>{re(f,r.totalCases),re(P,r.totalCases===1?"case":"cases"),re(R,r.totalRunning),re(V,r.totalConverged)}),le("click",G,()=>v(o,!0)),u(t,s),Te()}qe(["click"]);const vi=""+new URL("../assets/simvia-logo.kLDq7Uoj.svg",import.meta.url).href;var gi=N('
              '),hi=N('

              '),mi=N("
              "),pi=N('
              '),_i=N('
              '),bi=N('
              ');function Ht(t,r){let a=he(r,"eyebrow",3,""),n=he(r,"title",3,""),o=he(r,"wide",3,!1);var s=bi(),l=M(w(s),2);{var c=y=>{var p=_i(),S=w(p);{var k=f=>{var _=Se(),P=B(_);ft(P,()=>r.titleSlot),u(f,_)},A=f=>{var _=mi(),P=w(_);{var b=m=>{var R=gi(),F=w(R,!0);h(R),Q(()=>re(F,a())),u(m,R)};X(P,m=>{a()&&m(b)})}var $=M(P,2);{var E=m=>{var R=hi(),F=w(R,!0);h(R),Q(()=>re(F,n())),u(m,R)};X($,m=>{n()&&m(E)})}h(_),u(f,_)};X(S,f=>{r.titleSlot?f(k):f(A,-1)})}var T=M(S,2);{var x=f=>{var _=pi(),P=w(_);ft(P,()=>r.actions),h(_),u(f,_)};X(T,f=>{r.actions&&f(x)})}h(p),u(y,p)};X(l,y=>{(a()||n()||r.titleSlot||r.actions)&&y(c)})}var d=M(l,2);ft(d,()=>r.children),h(s),Q(()=>{ke(s,1,`${o()?"col-span-12":"col-span-6"} bg-card border border-border rounded-[10px] p-[16px_18px_18px] relative overflow-clip animate-rise`),ye(s,"id",r.id)}),u(t,s)}function tr(t,r){Me(r,!0);let a=he(r,"checked",15,!0);Ee(()=>{a()?pr(r.name,r.onRefresh,r.intervalMs):vt(r.name)}),vr(()=>vt(r.name)),zt(t,{get checked(){return a()},onchange:n=>a(n),size:14,label:"Auto-refresh",labelFirst:!0}),Te()}var xi=N(" ",1),yi=N('
            • '),wi=N(''),ki=N(' ',1);function Ci(t,r){Me(r,!0);let a=he(r,"label",3,"More"),n=D(!1),o=D(void 0),s=D(void 0),l=D("");function c(){if(!e(o)||!e(s))return;const P=e(o).getBoundingClientRect(),b=e(s).offsetHeight,$=4,E=window.innerHeight-P.bottom-$,R=EE?P.top-$-b:P.bottom+$,F=Math.min(P.left,window.innerWidth-180);v(l,`position:fixed; top:${R}px; left:${F}px; min-width:170px; z-index:9999;`)}async function d(){var P,b;v(n,!e(n)),e(n)&&(await Pt(),c(),(b=(P=e(s))==null?void 0:P.querySelector("button:not(:disabled)"))==null||b.focus({preventScroll:!0}))}function y(){var P,b;v(n,!1),(b=(P=e(o))==null?void 0:P.querySelector("button"))==null||b.focus()}function p(P){P.disabled||(y(),P.onClick())}function S(P){var m,R;if(P.key!=="ArrowDown"&&P.key!=="ArrowUp")return;P.preventDefault();const b=Array.from(((m=e(s))==null?void 0:m.querySelectorAll("button:not(:disabled)"))??[]),$=b.indexOf(document.activeElement),E=P.key==="ArrowDown"?1:b.length-1;(R=b[($+E)%b.length])==null||R.focus()}function k(P){e(n)&&e(o)&&!e(o).contains(P.target)&&e(s)&&!e(s).contains(P.target)&&v(n,!1)}var A=ki();et("mousedown",st,k),et("keydown",st,P=>{P.key==="Escape"&&e(n)&&y()}),et("scroll",st,()=>{e(n)&&v(n,!1)});var T=B(A),x=w(T);Re(x,{variant:"secondary",size:"sm",onclick:d,children:(P,b)=>{var $=xi(),E=B($);Fe(E,{get icon(){return pl}});var m=M(E);Q(()=>re(m,` ${a()??""}`)),u(P,$)},$$slots:{default:!0}}),h(T),rt(T,P=>v(o,P),()=>e(o));var f=M(T,2);{var _=P=>{Qt(P,{children:(b,$)=>{var E=wi();Ue(E,21,()=>r.items,m=>m.label,(m,R)=>{var F=yi(),L=w(F),j=w(L,!0);h(L),h(F),Q(()=>{L.disabled=e(R).disabled,ye(L,"aria-disabled",e(R).disabled),ke(L,1,`w-full flex items-center gap-2 text-left py-[7px] px-[10px] bg-transparent border border-transparent rounded-md text-[12.5px] text-ink transition-[background] duration-[120ms] ease-in-out disabled:opacity-40 disabled:pointer-events-none ${e(R).disabled?"":"cursor-pointer hover:bg-edf-gris-clair hover:border-border"}`),re(j,e(R).label)}),le("click",L,()=>p(e(R))),u(m,F)}),h(E),rt(E,m=>v(s,m),()=>e(s)),Q(()=>Xe(E,e(l))),le("keydown",E,S),u(b,E)}})};X(f,P=>{e(n)&&P(_)})}u(t,A),Te()}qe(["keydown","click"]);const Dt=[{key:"note",label:"Note"},{key:"nprocs",label:"MPI Ranks"},{key:"nt",label:"Thread Count"},{key:"last_iter",label:"Last Iter"},{key:"duration",label:"Duration"},{key:"last_mod",label:"Last Modified"},{key:"resu_size_mb",label:"Results (MB)"}];let Gt=D(se([])),Mr=D(se([])),ht=D(se(new Set)),br=D(""),wn=D(""),Rt=D(se([])),at=D(se([])),Wt=D(""),Ma=D(!0),Si=D(!0),Bt=D(se(yn("csauto_status_views",{}))),kn=D(se(localStorage.getItem("csauto_status_view_selected")??""));function zr(){return e(Gt)}function Cn(){return e(Mr)}function Ut(){return e(ht)}function Gn(){return e(br)}function an(){return e(wn)}function Pi(){return e(Rt)}function $i(){return e(Rt).filter(t=>e(Mr).includes(t))}function Ri(){return e(Rt).filter(t=>Dt.some(r=>r.key===t))}function Ei(){return e(at)}function Ni(){return e(Wt)}function Mi(){return e(Ma)}function Wn(){return e(Bt)}function Ti(){return e(kn)}function Ai(t){v(Gt,t,!0)}function Li(t){const r=e(Mr).length===0&&t.length>0;v(Mr,t,!0),r&&e(Rt).length===0&&v(Rt,[...t,...Dt.map(a=>a.key)],!0)}function Fi(t){v(br,t,!0)}function Xn(t){v(Rt,t,!0)}function Di(t){v(Wt,t,!0)}function Ii(t){v(Ma,t,!0)}function zi(t){v(Si,t,!0)}function Sn(t){v(kn,t,!0),localStorage.setItem("csauto_status_view_selected",t)}function on(t){const r=new Set(e(ht));r.has(t)?r.delete(t):r.add(t),v(ht,r,!0),v(br,t,!0),v(wn,t,!0)}function Ta(t){v(ht,new Set([t]),!0),v(br,t,!0),v(wn,t,!0)}function sn(t,r,a){const n=a.indexOf(t),o=a.indexOf(r);if(n<0||o<0)return;const[s,l]=n{const a=Oi(r);return t.every(n=>a.includes(n))})}function Hi(t){if(t==null||t==="")return"";const r=Number(t);return Number.isFinite(r)?r:String(t).toLowerCase()}function Jn(t,r){var n;if(r==="case_id")return t.case_id;if(r==="status")return t.status??"";if(r==="note")return t.note??"";if(r==="nprocs")return t.nprocs??0;if(r==="nt")return t.nt??0;if(r==="last_iter")return t.last_iter??0;if(r==="duration")return t.duration_s??0;if(r==="last_mod")return t.last_mod??"";if(r==="resu_size_mb")return t.resu_size_mb??0;const a=(n=t.doe)==null?void 0:n[r];return a!==void 0?Hi(a):""}function ji(t,r){return t===""&&r===""?0:t===""?1:r===""?-1:typeof t=="number"&&typeof r=="number"?t-r:String(t).localeCompare(String(r))}function La(){const t=Aa();return e(at).length===0?t:[...t].sort((r,a)=>{for(const n of e(at)){const o=Jn(r,n.key),s=Jn(a,n.key),l=ji(o,s);if(l!==0)return n.dir==="asc"?l:-l}return 0})}function Rr(){return La().map(t=>t.case_id)}function Ui(t,r){const a=e(at).findIndex(n=>n.key===t);if(r)if(a>=0){const n=[...e(at)];n[a]={key:t,dir:n[a].dir==="asc"?"desc":"asc"},v(at,n,!0)}else v(at,[...e(at),{key:t,dir:"asc"}],!0);else a>=0&&e(at).length===1?v(at,[{key:t,dir:e(at)[0].dir==="asc"?"desc":"asc"}],!0):v(at,[{key:t,dir:"asc"}],!0)}function Vi(){return{visibleColumns:[...e(Rt)],search:e(Wt),sorts:e(at).map(t=>({...t}))}}function Bi(t){v(Rt,[...t.visibleColumns],!0),v(Wt,t.search,!0),v(at,t.sorts.map(r=>({...r})),!0)}function qi(t){v(Bt,{...e(Bt),[t]:Vi()},!0),Ir("csauto_status_views",e(Bt)),Sn(t)}function Ki(t){const r={...e(Bt)};delete r[t],v(Bt,r,!0),Ir("csauto_status_views",r),e(kn)===t&&Sn("")}function Cr(){const t=new Set;for(const r of e(Gt))e(ht).has(r.case_id)&&t.add((r.status??"").toUpperCase());return t}function Zn(){for(const t of e(Gt))if(e(ht).has(t.case_id)&&t.resu_size_mb!=null&&t.resu_size_mb>0)return!0;return!1}function Gi(t,r){const a=r.length,n=t.length,o=r.filter(d=>d.status==="RUNNING").length,s=t.filter(d=>d.status==="RUNNING").length,l=r.filter(d=>d.convergence==="converged").length,c=t.filter(d=>d.convergence==="converged").length;return{totalCases:a,shownCases:n,totalRunning:o,shownRunning:s,totalConverged:l,shownConverged:c}}var Wi=N('
              DOE columns
              '),Xi=N('
              ');function Yi(t,r){Me(r,!0);let a=he(r,"initialName",3,""),n=O(Cn),o=D(se(a())),s=D(se(new Set(r.initialColumns??[...e(n),...Dt.map(I=>I.key)])));function l(I){const G=new Set(e(s));G.has(I)?G.delete(I):G.add(I),v(s,G,!0)}function c(I,G){const U=new Set(e(s));I.forEach(q=>G?U.add(q):U.delete(q)),v(s,U,!0)}function d(){const I=e(o).trim();I&&r.onSave(I,[...e(s)])}function y(I){I.key==="Escape"&&r.onCancel()}function p(I){I.target.dataset.backdrop!==void 0&&r.onCancel()}let S=D(void 0);Ee(()=>{var I,G;(I=e(S))==null||I.focus(),(G=e(S))==null||G.select()});var k=Xi(),A=w(k),T=w(A),x=w(T,!0);h(T);var f=M(T,2),_=M(w(f),2);Ke(_),rt(_,I=>v(S,I),()=>e(S)),h(f);var P=M(f,2);{var b=I=>{var G=Wi(),U=w(G),q=M(w(U),2),g=w(q),i=M(g,2);h(q),h(U);var C=M(U,2);Ue(C,20,()=>e(n),H=>H,(H,W)=>{{let ee=O(()=>e(s).has(W));zt(H,{get checked(){return e(ee)},onchange:()=>l(W),size:14,get label(){return W}})}}),h(C),h(G),le("click",g,()=>c(e(n),!0)),le("click",i,()=>c(e(n),!1)),u(I,G)};X(P,I=>{e(n).length>0&&I(b)})}var $=M(P,2),E=w($),m=M(w(E),2),R=w(m),F=M(R,2);h(m),h(E);var L=M(E,2);Ue(L,21,()=>Dt,I=>I.key,(I,G)=>{{let U=O(()=>e(s).has(e(G).key));zt(I,{get checked(){return e(U)},onchange:()=>l(e(G).key),size:14,get label(){return e(G).label}})}}),h(L),h($);var j=M($,2),z=w(j);Re(z,{variant:"secondary",get onclick(){return r.onCancel},children:(I,G)=>{Ce();var U=Oe("Cancel");u(I,U)},$$slots:{default:!0}});var V=M(z,2);{let I=O(()=>!e(o).trim());Re(V,{variant:"primary",onclick:d,get disabled(){return e(I)},children:(G,U)=>{Ce();var q=Oe("Save");u(G,q)},$$slots:{default:!0}})}h(j),h(A),h(k),Q(()=>re(x,r.mode==="create"?"New view":"Edit view")),le("keydown",k,y),le("click",k,p),Ze(_,()=>e(o),I=>v(o,I)),le("click",R,()=>c(Dt.map(I=>I.key),!0)),le("click",F,()=>c(Dt.map(I=>I.key),!1)),u(t,k),Te()}qe(["keydown","click"]);var Qi=N('
              ',1);function Ji(t,r){Me(r,!0);let a=O(()=>Object.keys(Wn())),n=D(se(Ti())),o=D(!1),s=D("create"),l=O(()=>[{value:"",label:"All columns"},...e(a).map(E=>({value:E,label:E}))]);function c(E){if(v(n,E,!0),Sn(E),E==="")Xn([...Cn(),...Dt.map(m=>m.key)]);else{const m=Wn();m[E]&&Bi(m[E])}}function d(){v(s,"edit"),v(o,!0)}function y(){v(s,"create"),v(o,!0)}function p(E,m){Xn(m),e(s)==="edit"&&e(n)&&E!==e(n)&&Ki(e(n)),qi(E),v(n,E,!0),v(o,!1)}function S(){v(o,!1)}var k=Qi(),A=B(k),T=w(A);lt(T,{class:"w-[140px]",get options(){return e(l)},get value(){return e(n)},onchange:c});var x=M(T,2),f=w(x);Fe(f,{get icon(){return yl},size:14}),h(x);var _=M(x,2),P=w(_);Fe(P,{get icon(){return wl},size:14}),h(_),h(A);var b=M(A,2);{var $=E=>{Qt(E,{children:(m,R)=>{{let F=O(()=>e(s)==="edit"?e(n):""),L=O(Pi);Yi(m,{get mode(){return e(s)},get initialName(){return e(F)},get initialColumns(){return e(L)},onSave:p,onCancel:S})}}})};X(b,E=>{e(o)&&E($)})}le("click",x,d),le("click",_,y),u(t,k),Te()}qe(["click"]);var Zi=N('
              '),ec=N(""),tc=N(' '),rc=N(' '),nc=N('
              '),ac=N(" "),oc=N(''),sc=N(''),lc=N(" Open GUI",1),ic=N(""),cc=N(" "),uc=N(""),dc=N('
              ');function fc(t,r){Me(r,!0);let a=O(()=>r.rows.length>0&&r.rows.every(g=>e(y).has(g.case_id))),n=O(()=>r.rows.some(g=>e(y).has(g.case_id))),o=O(()=>e(n)&&!e(a)),s=O($i),l=O(()=>new Set(Ri())),c=O(Ei),d=O(Mi),y=O(Ut),p=O(()=>{const g=[{key:"_select",label:"",kind:"meta",sticky:"left"},{key:"case_id",label:"Case",kind:"meta",sticky:"left"},{key:"status",label:"Status",kind:"meta",sticky:"left"},...e(l).has("note")?[{key:"note",label:"Note",kind:"meta"}]:[]],i=e(s).map(ee=>({key:ee,label:ee,kind:"doe"})),H=[{key:"nprocs",label:"MPI Ranks",kind:"calc"},{key:"nt",label:"Thread Count",kind:"calc"},{key:"last_iter",label:"Last Iter",kind:"calc"},{key:"duration",label:"Duration",kind:"calc"},{key:"last_mod",label:"Last Modified",kind:"calc"},{key:"resu_size_mb",label:"Results (MB)",kind:"calc"}].filter(ee=>e(l).has(ee.key)),W=en("gui")?[{key:"_actions",label:"",kind:"meta",sticky:"right"}]:[];return[...g,...i,...H,...W]});function S(g){const i=e(c).findIndex(H=>H.key===g);if(i<0)return"";const C=e(c)[i].dir==="asc"?"▲":"▼";return e(c).length>1?`${C}${i+1}`:C}function k(g,i){g!=="_actions"&&Ui(g,i.ctrlKey||i.metaKey)}function A(g,i){i.shiftKey?sn(an()||g,g,Rr()):i.ctrlKey||i.metaKey?on(g):Ta(g)}function T(g,i){var H;const C=((H=g.status)==null?void 0:H.toUpperCase())??"";C!=="DONE"&&C!=="FAILED"||(i.preventDefault(),r.onContextMenu(g.case_id,i.clientX,i.clientY,g.convergence??""))}async function x(g){const i=g.note??"",C=await hn("Case note:",i,`Note: ${g.case_id}`,"",!0);if(C!==null)try{await qs(g.case_id,C)}catch(H){await tt(`Failed to set note: ${H instanceof Error?H.message:H}`,"Error")}}async function f(g){try{await Gs(g)}catch(i){await tt(`Failed to open GUI: ${i instanceof Error?i.message:i}`,"Error")}}function _(g,i){const C=(g==null?void 0:g.toUpperCase())??"";return(C==="DONE"||C==="FAILED")&&i==="converged"?"CONVERGED":(C==="DONE"||C==="FAILED")&&i==="not_converged"?"NOT CONVERGED":C}function P(g,i){const C=(g==null?void 0:g.toUpperCase())??"";return(C==="DONE"||C==="FAILED")&&i==="converged"?"status-converged":(C==="DONE"||C==="FAILED")&&i==="not_converged"?"status-not-converged":C==="RUNNING"?"status-running":C==="DONE"?"status-done":C==="FAILED"?"status-failed":C==="PREPARED"?"status-prepared":"status-unknown"}function b(g){return e(y).has(g.case_id)?"row-selected":""}function $(g,i){var C;return i.key==="case_id"?g.case_id:i.key==="nprocs"?g.nprocs!=null?String(g.nprocs):"":i.key==="nt"?g.nt!=null?String(g.nt):"":i.key==="last_iter"?g.last_iter!=null?String(g.last_iter):"":i.key==="duration"?g.duration??"":i.key==="last_mod"?E(g.last_mod):i.key==="resu_size_mb"?g.resu_size_mb!=null?String(g.resu_size_mb):"":i.kind==="doe"?((C=g.doe)==null?void 0:C[i.key])!=null&&String(g.doe[i.key])!==""?String(g.doe[i.key]):"-":""}function E(g){if(!g)return"";try{const i=new Date(g),C=new Date,H=i.toDateString()===C.toDateString(),W=new Date(C);W.setDate(W.getDate()-1);const ee=i.toDateString()===W.toDateString(),ne=i.toLocaleTimeString([],{hour:"2-digit",minute:"2-digit"});return H?`Today ${ne}`:ee?`Yesterday ${ne}`:i.toLocaleDateString([],{month:"short",day:"numeric"})+` ${ne}`}catch{return g}}let m=D(se({})),R=D(void 0);Ee(()=>{e(d),e(p),r.rows,!(!e(R)||!e(d))&&Pt().then(()=>{if(!e(R))return;const g=Array.from(e(R).querySelectorAll("thead th.sticky-left")),i={};let C=0;g.forEach(H=>{const W=H.dataset.colKey??"";i[W]=C,C+=H.getBoundingClientRect().width}),v(m,i,!0)})});function F(g,i,C){const H=C&&g.key!=="_select"&&g.key!=="_actions"?["status-sortable"]:[];if(!C&&g.key==="case_id"&&H.push("case-id"),g.kind==="doe"&&H.push("status-col-doe"),!C&&g.key==="note"&&H.push("max-w-[140px] whitespace-nowrap overflow-hidden text-ellipsis cursor-pointer hover:underline hover:decoration-dotted hover:underline-offset-2"),e(d)&&g.sticky==="left"&&H.push("sticky-left"),e(d)&&g.sticky==="right"&&H.push("sticky-right"),e(d)&&g.sticky==="left"){const W=e(p)[i+1];(!W||W.sticky!=="left")&&H.push("sticky-divider")}if(e(d)&&g.sticky==="right"){const W=e(p)[i-1];(!W||W.sticky!=="right")&&H.push("sticky-divider")}return H.join(" ")}function L(g,i){return F(g,i,!0)}function j(g,i){return F(g,i,!1)}function z(g){return!e(d)||!g.sticky?"":g.sticky==="right"?"position:sticky;right:0;":g.sticky==="left"&&g.key in e(m)?`position:sticky;left:${e(m)[g.key]}px;`:""}var V=dc(),I=w(V),G=w(I),U=w(G);Ue(U,23,()=>e(p),g=>g.key,(g,i,C)=>{var H=Se(),W=B(H);{var ee=K=>{var Y=Zi(),ce=w(Y),ie=w(ce);zt(ie,{get checked(){return e(a)},get indeterminate(){return e(o)},get onchange(){return r.onToggleAll},size:14}),h(ce),h(Y),Q((we,ge)=>{ke(Y,1,`${we??""} !px-2.5 !py-0 w-9`),ye(Y,"data-col-key",e(i).key),Xe(Y,ge)},[()=>L(e(i),e(C)),()=>z(e(i))]),u(K,Y)},ne=K=>{var Y=ec();Q((ce,ie)=>{ke(Y,1,ce),ye(Y,"data-col-key",e(i).key),Xe(Y,ie)},[()=>dt(L(e(i),e(C))),()=>z(e(i))]),u(K,Y)},pe=K=>{var Y=rc(),ce=w(Y),ie=M(ce);{var we=Z=>{var _e=tc(),Pe=w(_e,!0);h(_e),Q($e=>re(Pe,$e),[()=>S(e(i).key)]),u(Z,_e)},ge=O(()=>S(e(i).key));X(ie,Z=>{e(ge)&&Z(we)})}h(Y),Q((Z,_e)=>{ke(Y,1,Z),ye(Y,"data-col-key",e(i).key),Xe(Y,_e),re(ce,`${e(i).label??""} `)},[()=>dt(L(e(i),e(C))),()=>z(e(i))]),le("click",Y,Z=>k(e(i).key,Z)),le("keydown",Y,Z=>{(Z.key==="Enter"||Z.key===" ")&&(Z.preventDefault(),k(e(i).key,Z))}),u(K,Y)};X(W,K=>{e(i).key==="_select"?K(ee):e(i).key==="_actions"?K(ne,1):K(pe,-1)})}u(g,H)}),h(U),h(G);var q=M(G);Ue(q,21,()=>r.rows,g=>g.case_id,(g,i)=>{var C=uc();Ue(C,23,()=>e(p),H=>H.key,(H,W,ee)=>{var ne=Se(),pe=B(ne);{var K=ge=>{var Z=nc(),_e=w(Z),Pe=w(_e);{let $e=O(()=>e(y).has(e(i).case_id));zt(Pe,{get checked(){return e($e)},onchange:()=>r.onToggleRow(e(i).case_id),size:14})}h(_e),h(Z),Q(($e,ve)=>{ke(Z,1,`${$e??""} !px-2.5 !py-0 w-9`),ye(Z,"data-col-key",e(W).key),Xe(Z,ve)},[()=>j(e(W),e(ee)),()=>z(e(W))]),u(ge,Z)},Y=ge=>{var Z=ac(),_e=w(Z),Pe=w(_e,!0);h(_e),h(Z),Q(($e,ve,De,be)=>{ke(Z,1,$e),ye(Z,"data-col-key",e(W).key),Xe(Z,ve),ke(_e,1,`status-pill ${De??""}`),re(Pe,be)},[()=>dt(j(e(W),e(ee))),()=>z(e(W)),()=>P(e(i).status,e(i).convergence),()=>_(e(i).status,e(i).convergence)]),u(ge,Z)},ce=ge=>{var Z=sc(),_e=w(Z);{var Pe=ve=>{var De=Oe();Q(()=>re(De,e(i).note)),u(ve,De)},$e=ve=>{var De=oc(),be=w(De);Fe(be,{get icon(){return xl},size:12}),h(De),u(ve,De)};X(_e,ve=>{e(i).note?ve(Pe):ve($e,-1)})}h(Z),Q((ve,De)=>{ke(Z,1,ve),ye(Z,"data-col-key",e(W).key),Xe(Z,De),ye(Z,"title",e(i).note||"Add note")},[()=>dt(j(e(W),e(ee))),()=>z(e(W))]),le("click",Z,ve=>{ve.stopPropagation(),x(e(i))}),le("keydown",Z,ve=>{(ve.key==="Enter"||ve.key===" ")&&(ve.preventDefault(),ve.stopPropagation(),x(e(i)))}),u(ge,Z)},ie=ge=>{var Z=ic(),_e=w(Z);Re(_e,{variant:"primary",size:"sm",onclick:Pe=>{Pe.stopPropagation(),f(e(i).case_id)},children:(Pe,$e)=>{var ve=lc(),De=B(ve);Fe(De,{get icon(){return _l},size:12}),Ce(),u(Pe,ve)},$$slots:{default:!0}}),h(Z),Q((Pe,$e)=>{ke(Z,1,Pe),ye(Z,"data-col-key",e(W).key),Xe(Z,$e)},[()=>dt(j(e(W),e(ee))),()=>z(e(W))]),u(ge,Z)},we=ge=>{var Z=cc(),_e=w(Z,!0);h(Z),Q((Pe,$e,ve)=>{ke(Z,1,Pe),ye(Z,"data-col-key",e(W).key),Xe(Z,$e),re(_e,ve)},[()=>dt(j(e(W),e(ee))),()=>z(e(W)),()=>$(e(i),e(W))]),u(ge,Z)};X(pe,ge=>{e(W).key==="_select"?ge(K):e(W).key==="status"?ge(Y,1):e(W).key==="note"?ge(ce,2):e(W).key==="_actions"?ge(ie,3):ge(we,-1)})}u(H,ne)}),h(C),Q(H=>ke(C,1,H),[()=>dt(b(e(i)))]),le("click",C,H=>A(e(i).case_id,H)),le("contextmenu",C,H=>T(e(i),H)),u(g,C)}),h(q),h(I),rt(I,g=>v(R,g),()=>e(R)),h(V),Q(()=>ke(V,1,`table-wrap ${e(d)?"sticky-enabled":""}`)),u(t,V),Te()}qe(["click","keydown","contextmenu"]);var vc=N('
              ');function gc(t,r){Me(r,!0);let a=O(()=>{const k=Math.min(r.x,window.innerWidth-180),A=Math.min(r.y,window.innerHeight-120);return`left: ${k}px; top: ${A}px;`});async function n(k){try{for(const A of r.cases)await Ks(A,k)}catch(A){console.error("Failed to set convergence:",A)}r.onClose()}const o=r.cases.length>1?` (${r.cases.length})`:"";var s=vc();et("keydown",st,k=>{k.key==="Escape"&&r.onClose()});var l=w(s),c=w(l);h(l);var d=M(l,2),y=w(d);h(d);var p=M(d,2),S=w(p);h(p),h(s),Q(()=>{Xe(s,e(a)),ke(l,1,`w-full text-left py-[7px] px-[10px] bg-transparent border border-transparent rounded-md text-[12.5px] cursor-pointer transition-[background] duration-[120ms] ease-in-out hover:bg-edf-gris-clair hover:border-border ${r.currentValue==="converged"?"is-active":""}`),re(c,`Mark Converged${o}`),ke(d,1,`w-full text-left py-[7px] px-[10px] bg-transparent border border-transparent rounded-md text-[12.5px] cursor-pointer transition-[background] duration-[120ms] ease-in-out hover:bg-edf-gris-clair hover:border-border ${r.currentValue==="not_converged"?"is-active":""}`),re(y,`Mark Not Converged${o}`),ke(p,1,`w-full text-left py-[7px] px-[10px] bg-transparent border border-transparent rounded-md text-[12.5px] cursor-pointer transition-[background] duration-[120ms] ease-in-out hover:bg-edf-gris-clair hover:border-border ${r.currentValue===""?"is-active":""}`),re(S,`Clear Mark${o}`)}),le("click",l,()=>n("converged")),le("click",d,()=>n("not_converged")),le("click",p,()=>n("")),u(t,s),Te()}qe(["click"]);var hc=N(" Refresh",1),mc=N(" ",1),pc=N(" Run",1),_c=N(" Restart",1),bc=N(" Kill",1),xc=N(" Clean",1),yc=N('
              ',1),wc=N('
              ',1);function kc(t,r){Me(r,!0);function a(){return[...Ut()]}async function n(){const g=a();if(!g.length)return;const i=await rs(g);if(i)try{await Hn({cases:g,n:i.n,nt:i.nt,maxParallel:i.maxParallel}),r.onRefresh()}catch(C){await tt(`Run failed: ${C instanceof Error?C.message:C}`,"Error")}}async function o(){const g=a();if(!g.length)return;const i=await ns(g);if(i)try{await Hn({cases:g,...i,restart:!0}),r.onRefresh()}catch(C){await tt(`Restart failed: ${C instanceof Error?C.message:C}`,"Error")}}async function s(){const g=a();if(!(!g.length||!await zn(`Kill ${g.length} case${g.length>1?"s":""}?`,"Confirm Kill","Kill","danger")))try{await Us(g),r.onRefresh()}catch(C){await tt(`Kill failed: ${C instanceof Error?C.message:C}`,"Error")}}async function l(g){const i=new Set(zr().filter(ee=>{var ne;return((ne=ee.status)==null?void 0:ne.toUpperCase())==="RUNNING"}).map(ee=>ee.case_id)),C=a().filter(ee=>i.has(ee));if(!C.length)return;const H=`${C.length} case${C.length>1?"s":""}`;let W=null;if(g.value_label){const ee=await hn(`${g.value_label} for ${H}:`,"",g.label);if(ee===null)return;W=Number(ee.trim().replace(",","."));const ne=Ra(g,W);if(ne){await tt(ne,"Invalid value");return}}else if(!await zn(`${g.label} for ${H}?`,g.label,g.label,"warning"))return;try{await Vs({cases:C,action:g.name,value:W}),r.onRefresh(),Vn(`${g.label} requested for ${H}`)}catch(ee){await tt(`${g.label} failed: ${ee instanceof Error?ee.message:ee}`,"Error")}}async function c(){var C;const g=a();if(!g.length)return;const i=await as(g);if(i)try{const H=await Bs({cases:g,keepLast:i.keepLast,keepResu:i.keepResu,deleteResu:i.deleteResu,pruneResu:!0});(C=H.skipped_active)!=null&&C.length&&Vn(`Skipped running cases: ${H.skipped_active.join(", ")}`),r.onRefresh(),ni()}catch(H){await tt(`Cleanup failed: ${H instanceof Error?H.message:H}`,"Error")}}function d(){const g=Rr();g.length>0&&g.every(C=>Ut().has(C))?Qn():Yn(g)}function y(g){on(g)}let p=D(se(Zt("status")));Ee(()=>{er("status",e(p))}),Ii(!0);let S=O(()=>{const g=Cr();return g.size>0&&[...g].some(i=>i==="PREPARED"||i==="DONE"||i==="FAILED")}),k=O(()=>{if(!en("restart"))return!1;const g=Cr();return g.size>0&&[...g].some(i=>i==="DONE"||i==="FAILED")&&Zn()}),A=O(()=>{const g=Cr();return g.size>0&&g.has("RUNNING")}),T=O(()=>Cr().has("RUNNING")),x=O(()=>{var g;return(((g=$t())==null?void 0:g.control_actions)??[]).map(i=>({label:i.label,onClick:()=>l(i),disabled:!e(T)}))}),f=O(Zn),_=D(se(Ni())),P=null;function b(){P&&clearTimeout(P),P=setTimeout(()=>{Di(e(_))},200)}Ee(()=>zi(e(p)));let $=D(!1),E=D(0),m=D(0),R=D(se([])),F=D("");function L(g,i,C,H){v(R,Ut().has(g)?[...Ut()]:[g],!0),v(F,H,!0),v(E,i,!0),v(m,C,!0),v($,!0)}function j(){v($,!1)}function z(g){const i=Rr();if(i.length){if(g.key==="Escape"){Qn(),j();return}if((g.ctrlKey||g.metaKey)&&g.key==="a"){g.preventDefault(),Yn(i);return}if(g.key==="ArrowDown"||g.key==="ArrowUp"){g.preventDefault();const C=g.key==="ArrowDown"?1:-1,H=Gn(),W=i.indexOf(H),ee=Math.max(0,Math.min(i.length-1,W+C)),ne=i[ee];g.shiftKey?sn(an()||i[0],ne,i):Ta(ne),Fi(ne);return}if(g.key===" "){g.preventDefault();const C=Gn();C&&(g.shiftKey?sn(an()||C,C,Rr()):on(C))}}}var V=wc();et("click",st,j),et("scroll",st,j);var I=B(V),G=w(I);Ht(G,{eyebrow:"Overview",title:"Status",wide:!0,id:"status-card-shell",actions:i=>{var C=mc(),H=B(C);{let ne=O(ti);tr(H,{name:"status",get intervalMs(){return e(ne)},get onRefresh(){return r.onRefresh},get checked(){return e(p)},set checked(pe){v(p,pe,!0)}})}var W=M(H,2);{var ee=ne=>{Re(ne,{variant:"primary",onclick:()=>r.onRefresh(),children:(pe,K)=>{var Y=hc(),ce=B(Y);Fe(ce,{get icon(){return Jt}}),Ce(),u(pe,Y)},$$slots:{default:!0}})};X(W,ne=>{e(p)||ne(ee)})}u(i,C)},children:(i,C)=>{var H=yc(),W=B(H),ee=w(W),ne=w(ee);Ke(ne);var pe=M(ne,2);Ji(pe,{}),h(ee);var K=M(ee,2),Y=w(K),ce=w(Y);h(Y);var ie=M(Y,2);{let be=O(()=>!e(S));Re(ie,{variant:"run",size:"sm",onclick:n,get disabled(){return e(be)},children:(He,Ie)=>{var oe=pc(),ue=B(oe);Fe(ue,{get icon(){return Ea}}),Ce(),u(He,oe)},$$slots:{default:!0}})}var we=M(ie,2);{var ge=be=>{{let He=O(()=>!e(k));Re(be,{variant:"warning",size:"sm",onclick:o,get disabled(){return e(He)},children:(Ie,oe)=>{var ue=_c(),je=B(ue);Fe(je,{get icon(){return kl}}),Ce(),u(Ie,ue)},$$slots:{default:!0}})}},Z=O(()=>en("restart"));X(we,be=>{e(Z)&&be(ge)})}var _e=M(we,2);{var Pe=be=>{Ci(be,{label:"Control",get items(){return e(x)}})};X(_e,be=>{e(x).length>0&&be(Pe)})}var $e=M(_e,2);{let be=O(()=>!e(A));Re($e,{variant:"danger",size:"sm",onclick:s,get disabled(){return e(be)},children:(He,Ie)=>{var oe=bc(),ue=B(oe);Fe(ue,{get icon(){return ml}}),Ce(),u(He,oe)},$$slots:{default:!0}})}var ve=M($e,2);{let be=O(()=>!e(f));Re(ve,{variant:"secondary",size:"sm",onclick:c,get disabled(){return e(be)},children:(He,Ie)=>{var oe=xc(),ue=B(oe);Fe(ue,{get icon(){return Sl}}),Ce(),u(He,oe)},$$slots:{default:!0}})}h(K),h(W);var De=M(W,2);{let be=O(La);fc(De,{get rows(){return e(be)},onContextMenu:L,onToggleAll:d,onToggleRow:y})}Q(be=>re(ce,`${be??""} selected`),[()=>Ut().size]),le("input",ne,b),Ze(ne,()=>e(_),be=>v(_,be)),u(i,H)},$$slots:{actions:!0,default:!0}}),h(I);var U=M(I,2);{var q=g=>{gc(g,{get cases(){return e(R)},get x(){return e(E)},get y(){return e(m)},get currentValue(){return e(F)},onClose:j})};X(U,g=>{e($)&&g(q)})}le("keydown",I,z),u(t,V),Te()}qe(["keydown","input"]);var Cc=N('
              ');function Xt(t,r){var a=Cc(),n=w(a);ft(n,()=>r.children),h(a),u(t,a)}var Sc=N(''),Pc=N(" ",1);function Pn(t,r){Me(r,!0);let a=he(r,"columnLabel",3,"Columns"),n=he(r,"xMinLabel",3,"Iter min"),o=O(()=>bn(r.allCases)),s=O(()=>r.columns.map(d=>({value:d,label:d}))),l=[{value:"zero",label:"Zero"},{value:"restart",label:"Restart start"},{value:"custom",label:"Custom"}];function c(d){r.onXMinChange(Number(d.target.value)||0)}Xt(t,{children:(d,y)=>{var p=Pc(),S=B(p);Ne(S,{text:"Cases",children:($,E)=>{Kt($,{class:"w-[160px]",get options(){return e(o)},get selected(){return r.selectedCases},get onchange(){return r.onCasesChange},placeholder:"Select cases..."})}});var k=M(S,2);{var A=$=>{var E=Se(),m=B(E);ft(m,()=>r.middleSlot),u($,E)};X(k,$=>{r.middleSlot&&$(A)})}var T=M(k,2);Ne(T,{get text(){return a()},children:($,E)=>{Kt($,{class:"w-[160px]",get options(){return e(s)},get selected(){return r.selectedColumns},get onchange(){return r.onColumnsChange},placeholder:"Select..."})}});var x=M(T,2);Ne(x,{text:"Start from",children:($,E)=>{lt($,{class:"w-[140px]",get options(){return l},get value(){return r.startFrom},onchange:m=>r.onStartFromChange(m)})}});var f=M(x,2);{var _=$=>{Ne($,{get text(){return n()},children:(E,m)=>{var R=Sc();Ke(R),Q(()=>vn(R,r.xMin)),le("input",R,c),u(E,R)}})};X(f,$=>{r.startFrom==="custom"&&$(_)})}var P=M(f,2);{var b=$=>{var E=Se(),m=B(E);ft(m,()=>r.extraSlot),u($,E)};X(P,$=>{r.extraSlot&&$(b)})}u(d,p)}}),Te()}qe(["input"]);var $c=N('
              '),Rc=N('
              ');function Yt(t,r){let a=he(r,"emptyMessage",3,"");var n=Rc(),o=w(n);{var s=c=>{var d=Se(),y=B(d);Fr(y,()=>r.svgHtml),u(c,d)},l=c=>{var d=$c(),y=w(d),p=w(y,!0);h(y),h(d),Q(()=>re(p,a()||"No data to display.")),u(c,d)};X(o,c=>{r.svgHtml?c(s):c(l,-1)})}h(n),Q(()=>ye(n,"id",r.id)),u(t,n)}async function $n(t,r="plot.png"){const a=document.getElementById(t),n=a==null?void 0:a.querySelector("svg");if(!n)return;const{width:o,height:s}=Ec(n),l=window.devicePixelRatio||1,c=document.createElement("canvas");c.width=o*l,c.height=s*l;const d=c.getContext("2d");if(!d)return;d.scale(l,l);const y=new XMLSerializer().serializeToString(n),p=new Blob([y],{type:"image/svg+xml;charset=utf-8"}),S=URL.createObjectURL(p),k=new Image;k.width=o,k.height=s,await new Promise((T,x)=>{k.onload=()=>{d.drawImage(k,0,0,o,s),URL.revokeObjectURL(S),T()},k.onerror=x,k.src=S});const A=await new Promise(T=>c.toBlob(T,"image/png"));A&&await Da(A,Nc(r))}function xr(t,r,a="png"){const n=r.length<=3?r.join("_"):`${r.length}_cases`,o=new Date().toISOString().replace(/[:.]/g,"-").slice(0,19);return Mc(`${t}_${n}_${o}.${a}`)}async function Fa(t,r){const a=new Blob([t],{type:"text/csv;charset=utf-8"});await Da(a,r)}function Ec(t){const r=t.getAttribute("viewBox");if(r){const a=r.split(/[\s,]+/).map(Number);if(a.length===4)return{width:a[2],height:a[3]}}return{width:t.width.baseVal.value||900,height:t.height.baseVal.value||500}}async function Da(t,r){if("showSaveFilePicker"in window)try{const s=await(await window.showSaveFilePicker({suggestedName:r,types:[{description:t.type.startsWith("image/")?"Image":"File",accept:{[t.type]:[`.${r.split(".").pop()}`]}}]})).createWritable();await s.write(t),await s.close();return}catch(o){if((o==null?void 0:o.name)==="AbortError")return}const a=URL.createObjectURL(t),n=document.createElement("a");n.href=a,n.download=r,document.body.appendChild(n),n.click(),document.body.removeChild(n),URL.revokeObjectURL(a)}function Nc(t){return t.endsWith(".png")?t:`${t}.png`}function Mc(t){return t.replace(/[^a-zA-Z0-9._-]/g,"_")}let Ia=D(se([])),za=D(se([])),Oa=D(se([])),Ha=D("zero"),ja=D(0),Ua=D(""),Tc=D(!0);function Ac(){return{selectedCases:e(Ia),columns:e(za),selectedColumns:e(Oa),startFrom:e(Ha),iterMin:e(ja),svgHtml:e(Ua),autoRefresh:e(Tc)}}function ea(t){v(Ia,t,!0)}function Lc(t){v(za,t,!0)}function Xr(t){v(Oa,t,!0)}function Fc(t){v(Ha,t,!0)}function Dc(t){v(ja,t,!0)}function Sr(t){v(Ua,t,!0)}var Ic=N(" Refresh",1),zc=N(" ",1),Oc=N(" Download as PNG",1),Hc=N('
              '),jc=N('
              ',1),Uc=N('
              '),Vc=N('

              '),Bc=N(" ",1);function qc(t,r){Me(r,!0);let a=O(Ac),n=D("");async function o(){var A;if(e(a).selectedCases.length)try{const T=(await As(e(a).selectedCases)).filter(x=>x!=="iteration");if(v(n,""),Lc(T),T.length===0){Xr([]),Sr("");return}if(e(a).selectedColumns.length===0){const x=(((A=$t())==null?void 0:A.default_residual_columns)??[]).filter(f=>T.includes(f));Xr(x.length>0?x:T.slice(0,2))}}catch(T){v(n,"Failed to load residual columns"),console.error("Failed to load residual columns:",T)}}async function s(){if(e(a).selectedCases.length&&!((e(a).columns.length===0||e(a).selectedColumns.length===0)&&(await o(),!e(a).selectedColumns.length)))try{let A=0,T=!0;if(e(a).startFrom==="restart"){const f=await Sa(e(a).selectedCases),_=Object.values(f.origins).map(P=>P.iteration).filter(P=>P!==void 0&&Number.isFinite(P));A=_.length>0?Math.min(..._):0}else e(a).startFrom==="custom"&&(A=e(a).iterMin);const x=await Ls(e(a).selectedCases,e(a).selectedColumns,{xMin:A,includeHistory:T});v(n,""),x&&Sr(x)}catch(A){v(n,"Failed to load residual plot"),console.error("Failed to load residual plot:",A)}}function l(A){if(ea(A),A.length===0){Sr("");return}o(),s()}function c(A){if(Xr(A),A.length===0){Sr("");return}s()}function d(A){Fc(A),s()}function y(A){Dc(A),s()}let p=D(se(Zt("plot")));Ee(()=>{er("plot",e(p))}),Ee(()=>{e(p)?pr("residualPlot",s,qn()):vt("residualPlot")});let S=!1;Ee(()=>{r.allCases.length>0&&!S&&(S=!0,ea([...r.allCases]),o().then(()=>s()))});const k=_r(()=>{S&&o().then(()=>s())});vr(()=>{vt("residualPlot"),k()}),Ht(t,{eyebrow:"Diagnostics",title:"Residuals Plot",wide:!0,actions:T=>{var x=zc(),f=B(x);{let b=O(qn);tr(f,{name:"residualPlot",get intervalMs(){return e(b)},onRefresh:s,get checked(){return e(p)},set checked($){v(p,$,!0)}})}var _=M(f,2);{var P=b=>{Re(b,{variant:"primary",onclick:s,children:($,E)=>{var m=Ic(),R=B(m);Fe(R,{get icon(){return Jt}}),Ce(),u($,m)},$$slots:{default:!0}})};X(_,b=>{e(p)||b(P)})}u(T,x)},children:(T,x)=>{var f=Bc(),_=B(f);{var P=m=>{const R=V=>{var I=Hc(),G=w(I);{let U=O(()=>!e(a).svgHtml);Re(G,{variant:"secondary",size:"sm",onclick:()=>$n("plot-holder",xr("residuals",e(a).selectedCases)),get disabled(){return e(U)},children:(q,g)=>{var i=Oc(),C=B(i);Fe(C,{get icon(){return mr}}),Ce(),u(q,i)},$$slots:{default:!0}})}h(I),u(V,I)};var F=jc(),L=B(F);Pn(L,{prefix:"plot",get allCases(){return r.allCases},get selectedCases(){return e(a).selectedCases},onCasesChange:l,columnLabel:"Variables",get columns(){return e(a).columns},get selectedColumns(){return e(a).selectedColumns},onColumnsChange:c,get startFrom(){return e(a).startFrom},onStartFromChange:d,xMinLabel:"Iter min",get xMin(){return e(a).iterMin},onXMinChange:y,get extraSlot(){return R}});var j=M(L,2),z=w(j);{let V=O(()=>e(a).selectedCases.length===0?"Please select at least one case.":e(a).columns.length===0?"No residuals for the selected cases yet.":e(a).selectedColumns.length===0?"Please select at least one variable.":"No data to display.");Yt(z,{id:"plot-holder",get svgHtml(){return e(a).svgHtml},get emptyMessage(){return e(V)}})}h(j),u(m,F)},b=m=>{var R=Uc(),F=w(R);Yt(F,{id:"plot-holder",svgHtml:"",emptyMessage:"No data available. Please run a simulation first."}),h(R),u(m,R)};X(_,m=>{r.allCases.length>0?m(P):m(b,-1)})}var $=M(_,2);{var E=m=>{var R=Vc(),F=w(R,!0);h(R),Q(()=>re(F,e(n))),u(m,R)};X($,m=>{e(n)&&m(E)})}u(T,f)},$$slots:{actions:!0,default:!0}}),Te()}function Va(t){const{scope:r,getState:a,setState:n,getAxis:o}=t;async function s(){const S=a();if(S.selectedCases.length)try{let k=await Zr(S.selectedCases,r);if(t.filterFiles&&(k=t.filterFiles(k)),n({files:k}),k.length===0){n({file:"",columns:[],selectedColumns:[],positionText:"",svgHtml:""});return}(!S.file||!k.includes(S.file))&&(n({file:k[0]}),await l())}catch(k){console.error(`Failed to load ${r} files:`,k)}}async function l(){const S=a();if(!(!S.selectedCases.length||!S.file))try{const k=await zs(S.selectedCases,[S.file]),A=t.filterColumns?t.filterColumns(k):k;t.onColumnsLoaded?t.onColumnsLoaded(k):n({columns:A});const T=a();if(T.columns.length===0){n({selectedColumns:[],positionText:"",svgHtml:""});return}T.selectedColumns.length===0&&n({selectedColumns:[T.columns[0]]})}catch(k){console.error(`Failed to load ${r} columns:`,k)}}async function c(){let S=a();if(S.selectedCases.length){if(await s(),S=a(),!S.file){n({positionText:"",svgHtml:""});return}if((S.columns.length===0||S.selectedColumns.length===0)&&(await l(),S=a(),!S.selectedColumns.length)){n({positionText:"",svgHtml:""});return}try{let k;const A=a();if(A.startFrom==="restart"){const x=await Sa(A.selectedCases),f=o().toLowerCase(),_=f==="t"||f==="time"?"time":"iteration",P=Object.values(x.origins).map(b=>b[_]).filter(b=>b!==void 0&&Number.isFinite(b));k=P.length>0?Math.min(...P):void 0}else A.startFrom==="custom"&&(k=A.xMin);const T=await Hs({cases:A.selectedCases,probes:[A.file],columns:A.selectedColumns,axis:o(),timeMin:typeof k=="number"?k:void 0,xMin:k,includeHistory:!0});T&&n({svgHtml:T})}catch(k){console.error(`Failed to load ${r} plot:`,k)}}}async function d(S){if(n({selectedCases:S}),S.length===0){n({svgHtml:""});return}await s(),r==="probes"&&await c()}function y(S){if(n({selectedColumns:S}),S.length===0){n({svgHtml:""});return}c()}async function p(S){n({file:S}),await l(),await c()}return{loadFiles:s,loadColumns:l,loadPlot:c,handleCasesChange:d,handleColumnsChange:y,handleFileChange:p}}function Ba(){return{selectedCases:[],file:"",files:[],columns:[],selectedColumns:[],axis:"time",startFrom:"zero",xMin:0,positionText:"",svgHtml:"",autoRefresh:!0}}let Vt=D("time"),ln=D(se(Ba())),cn=D(se({...Ba(),axis:""})),Kc=D(!0),Tr=D(!1),Ar=D(!1);function Gc(){return e(Vt)}function Wc(t){v(Vt,t,!0)}function Xc(){return e(Tr)}function ta(t){v(Tr,t,!0)}function Yc(){return e(Ar)}function ra(t){v(Ar,t,!0)}function Qc(){e(Vt)==="time"&&!e(Tr)&&e(Ar)?v(Vt,"profile"):e(Vt)==="profile"&&!e(Ar)&&e(Tr)&&v(Vt,"time")}function na(){return e(ln)}function Yr(){return e(cn)}function wt(t){v(ln,{...e(ln),...t},!0)}function At(t){v(cn,{...e(cn),...t},!0)}function Jc(){return e(Kc)}var Zc=N(" Download as PNG",1),eu=N('
              '),tu=N("
              "),ru=N('
              '),nu=N('
              ',1),au=N('
              ');function ou(t,r){Me(r,!0);let a=he(r,"onRefresh",15),n=O(na);const o=new Set(["time","t","iteration","iter"]),s=Va({scope:"probes",getState:na,setState:wt,filterFiles:x=>x.filter(f=>{const _=f.replace(/\.csv$/i,"").toLowerCase();return _!=="coords"&&!_.includes("coordinates")}),filterColumns:x=>x.filter(f=>!o.has(f.toLowerCase())),onColumnsLoaded:x=>{const f=x.filter(_=>!o.has(_.toLowerCase()));wt({columns:f}),l()},getAxis:()=>"time"});async function l(){if(!(!e(n).selectedCases.length||!e(n).file||!e(n).selectedColumns.length))try{const x=[];for(const E of e(n).selectedColumns){const m=await Os(e(n).selectedCases[0],e(n).file,[E]);m.found&&x.push({col:E,x:m.x,y:m.y,z:m.z})}if(!x.length){wt({positionText:""});return}const f=E=>{let m=0;for(const R of E){if(R===void 0)continue;const F=String(R),L=F.indexOf(".");L>=0&&(m=Math.max(m,F.length-L-1))}return m},_=f(x.map(E=>E.x)),P=f(x.map(E=>E.y)),b=f(x.map(E=>E.z)),$=x.map(E=>{const m=[];return E.x!==void 0&&m.push(`x=${E.x.toFixed(_)}`),E.y!==void 0&&m.push(`y=${E.y.toFixed(P)}`),E.z!==void 0&&m.push(`z=${E.z.toFixed(b)}`),`Probe position [${E.col}] : ${m.join(" · ")}`});wt({positionText:$.join(` -`)})}catch{wt({positionText:""})}}function c(x){s.handleColumnsChange(x),x.length>0&&l()}let d=O(()=>e(n).files.map(x=>({value:x,label:x.replace(/\.csv$/i,"").replace(/^probes?_/i,"")}))),y=!1;Ee(()=>{r.allCases.length>0&&!y&&(y=!0,wt({selectedCases:[...r.allCases]}),s.loadFiles().then(()=>s.loadPlot()))}),Ee(()=>{a(s.loadPlot)});let p=O(()=>e(n).selectedCases.length===0?"Please select at least one case.":e(n).files.length===0?"No probe data for the selected cases yet.":e(n).selectedColumns.length===0?"Please select at least one probe.":"No data to display.");var S=Se(),k=B(S);{var A=x=>{const f=F=>{Ne(F,{text:"Quantity",children:(L,j)=>{lt(L,{class:"w-[160px]",get options(){return e(d)},get value(){return e(n).file},get onchange(){return s.handleFileChange}})}})},_=F=>{var L=eu(),j=w(L);{let z=O(()=>!e(n).svgHtml);Re(j,{variant:"secondary",size:"sm",onclick:()=>$n("probe-plot-holder",xr("probe",e(n).selectedCases)),get disabled(){return e(z)},children:(V,I)=>{var G=Zc(),U=B(G);Fe(U,{get icon(){return mr}}),Ce(),u(V,G)},$$slots:{default:!0}})}h(L),u(F,L)};var P=nu(),b=B(P);Pn(b,{prefix:"probe",get allCases(){return r.allCases},get selectedCases(){return e(n).selectedCases},get onCasesChange(){return s.handleCasesChange},get middleSlot(){return f},columnLabel:"Probes",get columns(){return e(n).columns},get selectedColumns(){return e(n).selectedColumns},onColumnsChange:c,get startFrom(){return e(n).startFrom},onStartFromChange:F=>{wt({startFrom:F}),s.loadPlot()},xMinLabel:"Time min",get xMin(){return e(n).xMin},onXMinChange:F=>{wt({xMin:F}),s.loadPlot()},get extraSlot(){return _}});var $=M(b,2);{var E=F=>{var L=ru();Ue(L,21,()=>e(n).positionText.split(` -`).sort(),fn,(j,z)=>{var V=tu(),I=w(V,!0);h(V),Q(()=>re(I,e(z))),u(j,V)}),h(L),u(F,L)};X($,F=>{e(n).positionText&&F(E)})}var m=M($,2),R=w(m);Yt(R,{id:"probe-plot-holder",get svgHtml(){return e(n).svgHtml},get emptyMessage(){return e(p)}}),h(m),u(x,P)},T=x=>{var f=au(),_=w(f);Yt(_,{id:"probe-plot-holder",svgHtml:"",emptyMessage:"No probe data available. Please run a simulation first."}),h(f),u(x,f)};X(k,x=>{r.allCases.length>0?x(A):x(T,-1)})}u(t,S),Te()}var su=N(" ",1),lu=N(" Download as PNG",1),iu=N('
              '),cu=N('
              ',1),uu=N('
              ');function du(t,r){Me(r,!0);let a=he(r,"onRefresh",15),n=O(Yr);const o=["s","x","abscissa","distance","arclength","arc_length","curvilinear","length","r","y","z","coord","position"];function s(f){const _=f.map(P=>P.toLowerCase());for(const P of o){const b=_.indexOf(P);if(b>=0)return f[b]}return f[0]??""}const l=Va({scope:"profiles",getState:Yr,setState:At,onColumnsLoaded:f=>{const _=e(n).axis||s(f),P=f.filter(b=>b!==_).toSorted((b,$)=>b.localeCompare($));At({columns:P,axis:_,selectedColumns:e(n).selectedColumns.length?e(n).selectedColumns:P.length?[P[0]]:[]})},getAxis:()=>Yr().axis});function c(f){const _=e(n).axis;At({axis:f});const b=[...e(n).columns,..._?[_]:[]].filter($=>$!==f).toSorted(($,E)=>$.localeCompare(E));At({columns:b}),l.loadPlot()}let d=O(()=>e(n).files.map(f=>({value:f,label:f.replace(/^.*\//,"").replace(/\.csv$/i,"").replace(/_/g," ")}))),y=O(()=>[...e(n).axis?[e(n).axis]:[],...e(n).columns].toSorted((f,_)=>f.localeCompare(_)).map(f=>({value:f,label:f}))),p=!1;Ee(()=>{r.allCases.length>0&&!p&&(p=!0,At({selectedCases:[...r.allCases]}),l.loadFiles().then(()=>l.loadPlot()))}),Ee(()=>{a(l.loadPlot)});let S=O(()=>e(n).selectedCases.length===0?"Please select at least one case.":e(n).files.length===0?"No profile data for the selected cases yet.":e(n).selectedColumns.length===0?"Please select at least one value.":"No data to display.");var k=Se(),A=B(k);{var T=f=>{const _=R=>{var F=su(),L=B(F);Ne(L,{text:"Profile",children:(z,V)=>{lt(z,{class:"w-[160px]",get options(){return e(d)},get value(){return e(n).file},get onchange(){return l.handleFileChange}})}});var j=M(L,2);Ne(j,{text:"X axis",children:(z,V)=>{lt(z,{class:"w-[140px]",get options(){return e(y)},get value(){return e(n).axis},onchange:c})}}),u(R,F)},P=R=>{var F=iu(),L=w(F);{let j=O(()=>!e(n).svgHtml);Re(L,{variant:"secondary",size:"sm",onclick:()=>$n("profile-plot-holder",xr("profile",e(n).selectedCases)),get disabled(){return e(j)},children:(z,V)=>{var I=lu(),G=B(I);Fe(G,{get icon(){return mr}}),Ce(),u(z,I)},$$slots:{default:!0}})}h(F),u(R,F)};var b=cu(),$=B(b);Pn($,{prefix:"profile",get allCases(){return r.allCases},get selectedCases(){return e(n).selectedCases},get onCasesChange(){return l.handleCasesChange},get middleSlot(){return _},columnLabel:"Values",get columns(){return e(n).columns},get selectedColumns(){return e(n).selectedColumns},get onColumnsChange(){return l.handleColumnsChange},get startFrom(){return e(n).startFrom},onStartFromChange:R=>{At({startFrom:R}),l.loadPlot()},xMinLabel:"X min",get xMin(){return e(n).xMin},onXMinChange:R=>{At({xMin:R}),l.loadPlot()},get extraSlot(){return P}});var E=M($,2),m=w(E);Yt(m,{id:"profile-plot-holder",get svgHtml(){return e(n).svgHtml},get emptyMessage(){return e(S)}}),h(E),u(f,b)},x=f=>{var _=uu(),P=w(_);Yt(P,{id:"profile-plot-holder",svgHtml:"",emptyMessage:"No profile data available. Please run a simulation first."}),h(_),u(f,_)};X(A,f=>{r.allCases.length>0?f(T):f(x,-1)})}u(t,k),Te()}var fu=N('
              Diagnostics
              '),vu=N(" Refresh",1),gu=N(" ",1);function hu(t,r){Me(r,!0);let a=O(Gc),n=O(Jc),o=O(Xc),s=O(Yc),l=D(se(Zt("probe")));Ee(()=>{er("probe",e(l))});let c=D(void 0);function d(){var T;(T=e(c))==null||T()}async function y(){if(r.allCases.length){try{const x=(await Zr(r.allCases,"probes")).filter(f=>{const _=f.replace(/\.csv$/i,"").toLowerCase();return _!=="coords"&&!_.includes("coordinates")});ta(x.length>0)}catch{ta(!1)}try{const T=await Zr(r.allCases,"profiles");ra(T.length>0)}catch{ra(!1)}}}Ee(()=>{r.allCases.length>0&&y()}),_r(()=>{y(),d()}),Ee(()=>{e(o),e(s),Qc()});function p(T){T==="time"&&!e(o)||T==="profile"&&!e(s)||Wc(T)}var S=Se(),k=B(S);{var A=T=>{{const x=_=>{var P=fu(),b=M(w(P),2),$=w(b),E=M($,2);h(b),h(P),Q(()=>{ke($,1,`bg-transparent border-none p-0 m-0 text-lg font-bold tracking-tight transition-colors duration-150 - ${e(o)?e(a)==="time"?"text-edf-bleu-fonce cursor-pointer":"text-edf-gris-moyen cursor-pointer hover:text-muted":"text-edf-gris-moyen cursor-not-allowed opacity-50"}`),$.disabled=!e(o),ye($,"title",e(o)?"":"No probe data available. Run a simulation first."),ke(E,1,`bg-transparent border-none p-0 m-0 text-lg font-bold tracking-tight transition-colors duration-150 - ${e(s)?e(a)==="profile"?"text-edf-bleu-fonce cursor-pointer":"text-edf-gris-moyen cursor-pointer hover:text-muted":"text-edf-gris-moyen cursor-not-allowed opacity-50"}`),E.disabled=!e(s),ye(E,"title",e(s)?"":"No profile data available. Run a simulation first.")}),le("click",$,()=>p("time")),le("click",E,()=>p("profile")),u(_,P)};Ht(T,{wide:!0,titleSlot:x,tabs:x,actions:_=>{var P=gu(),b=B(P);{let m=O(()=>e(a)==="time"?"probePlot":"profilePlot"),R=O(ri);tr(b,{get name(){return e(m)},get intervalMs(){return e(R)},onRefresh:d,get checked(){return e(l)},set checked(F){v(l,F,!0)}})}var $=M(b,2);{var E=m=>{Re(m,{variant:"primary",onclick:d,children:(R,F)=>{var L=vu(),j=B(L);Fe(j,{get icon(){return Jt}}),Ce(),u(R,L)},$$slots:{default:!0}})};X($,m=>{e(l)||m(E)})}u(_,P)},children:(_,P)=>{var b=Se(),$=B(b);{var E=R=>{ou(R,{get allCases(){return r.allCases},get onRefresh(){return e(c)},set onRefresh(F){v(c,F,!0)}})},m=R=>{du(R,{get allCases(){return r.allCases},get onRefresh(){return e(c)},set onRefresh(F){v(c,F,!0)}})};X($,R=>{e(a)==="time"?R(E):R(m,-1)})}u(_,b)},$$slots:{tabs:!0,actions:!0,default:!0}})}};X(k,T=>{e(n)&&T(A)})}u(t,S),Te()}qe(["click"]);var mu=N(" Refresh",1),pu=N(" ",1),_u=N(" Download as CSV",1),bu=N('
              ',1),xu=N(" "),yu=N(' '),wu=N(' '),ku=N('
              Case
              '),Cu=N('

              '),Su=N(" ",1);function Pu(t,r){Me(r,!0);let a=D(se([])),n=D(se([])),o=D(!1),s=D(!1),l=D(se(Zt("perf")));Ee(()=>{er("perf",e(l))});const c=5e3;let d=D(se([])),y=O(()=>r.allCases.map(_=>({value:_,label:_}))),p=O(()=>e(d).length>0&&e(n).length>0);async function S(){if(e(a).length){v(s,!0);try{const _=await On(e(a));v(d,_.columns,!0),v(n,_.records,!0),e(p)&&v(o,!0)}catch(_){console.error("Failed to load perf:",_)}v(s,!1)}}function k(_){if(v(a,_,!0),_.length===0){v(n,[],!0);return}S()}function A(_,P){if(P==null||P==="")return"-";if(_==="text")return String(P);const b=Number(P);return Number.isFinite(b)?_==="int"?String(Math.round(b)):b.toFixed(3):String(P)}async function T(){if(!e(n).length)return;const _=["case_id",...e(d).map(E=>E.key)],P=e(n).map(E=>[E.case_id,...e(d).map(m=>E[m.key]??"")].join(",")),b=[_.join(","),...P].join(` -`),$=xr("timing_snapshot",e(a),"csv");await Fa(b,$)}let x=!1;Ee(()=>{r.allCases.length>0&&!x&&(x=!0,v(a,[...r.allCases],!0),On(r.allCases).then(_=>{v(d,_.columns,!0),v(n,_.records,!0),v(o,e(p),!0)}).catch(()=>{}))}),Ee(()=>{e(l)?pr("perf",S,c):vt("perf")});const f=_r(()=>{x&&S()});vr(()=>{vt("perf"),f()}),Ht(t,{eyebrow:"Performance",title:"Timing Snapshot",wide:!0,actions:P=>{var b=pu(),$=B(b);tr($,{name:"perf",intervalMs:c,onRefresh:S,get checked(){return e(l)},set checked(R){v(l,R,!0)}});var E=M($,2);{var m=R=>{Re(R,{variant:"primary",onclick:S,children:(F,L)=>{var j=mu(),z=B(j);Fe(z,{get icon(){return Jt}}),Ce(),u(F,j)},$$slots:{default:!0}})};X(E,R=>{e(l)||R(m)})}u(P,b)},children:(P,b)=>{var $=Su(),E=B($);{var m=j=>{Xt(j,{children:(z,V)=>{var I=bu(),G=B(I);Ne(G,{text:"Cases",children:(g,i)=>{Kt(g,{class:"w-[160px]",get options(){return e(y)},get selected(){return e(a)},onchange:k,placeholder:"Select cases..."})}});var U=M(G,2),q=w(U);{let g=O(()=>!e(p));Re(q,{variant:"secondary",size:"sm",onclick:T,get disabled(){return e(g)},children:(i,C)=>{var H=_u(),W=B(H);Fe(W,{get icon(){return mr}}),Ce(),u(i,H)},$$slots:{default:!0}})}h(U),u(z,I)}})};X(E,j=>{e(o)&&j(m)})}var R=M(E,2);{var F=j=>{var z=ku(),V=w(z),I=w(V),G=w(I),U=M(w(G));Ue(U,17,()=>e(d),g=>g.key,(g,i)=>{var C=xu(),H=w(C,!0);h(C),Q(()=>re(H,e(i).label)),u(g,C)}),h(G),h(I);var q=M(I);Ue(q,21,()=>e(n),g=>g.case_id,(g,i)=>{var C=wu(),H=w(C),W=w(H,!0);h(H);var ee=M(H);Ue(ee,17,()=>e(d),ne=>ne.key,(ne,pe)=>{var K=yu(),Y=w(K,!0);h(K),Q(ce=>re(Y,ce),[()=>A(e(pe).kind,e(i)[e(pe).key])]),u(ne,K)}),h(C),Q(()=>re(W,e(i).case_id)),u(g,C)}),h(q),h(V),h(z),u(j,z)},L=j=>{var z=Cu(),V=w(z);{var I=U=>{var q=Oe("Select cases above to view timing information.");u(U,q)},G=U=>{var q=Oe("No performance data available. Please run a simulation first.");u(U,q)};X(V,U=>{e(o)?U(I):U(G,-1)})}h(z),u(j,z)};X(R,j=>{e(p)?j(F):j(L,-1)})}u(P,$)},$$slots:{actions:!0,default:!0}}),Te()}const $u={"&":"&","<":"<",">":">",'"':""","'":"'"};function qa(t){return t.replace(/[&<>"']/g,r=>$u[r]??r)}var Ru=N("
              "),Eu=N('
              ');function Nu(t,r){Me(r,!0);let a=D(void 0);function n(y){const p=qa(y);if(!r.searchQuery.trim())return p;try{const S=new RegExp(`(${r.searchQuery})`,"gi");return p.replace(S,'$1')}catch{return p}}function o(y){return y==="error"?"tail-sev-error":y==="warn"?"tail-sev-warn":""}function s(){return e(a)?e(a).scrollHeight-e(a).scrollTop-e(a).clientHeight<=24:!0}let l=D(!0);function c(){v(l,s(),!0)}Ee(()=>{r.autoScroll&&r.lines.length>0&&e(a)&&e(l)&&Pt().then(()=>{e(a)&&(e(a).scrollTop=e(a).scrollHeight)})});var d=Eu();Ue(d,21,()=>r.lines,y=>y.index,(y,p)=>{var S=Ru();Fr(S,()=>n(e(p).text),!0),h(S),Q(k=>ke(S,1,`tail-line ${k??""} ${e(p).isNew?"tail-new":""}`),[()=>o(e(p).severity)]),u(y,S)}),h(d),rt(d,y=>v(a,y),()=>e(a)),et("scroll",d,c),u(t,d),Te()}var Mu=N(" Refresh",1),Tu=N(" ",1),Au=N(''),Lu=N(''),Fu=N("   ",1),Du=N(" ",1),Iu=Ot(''),zu=Ot(''),Ou=Ot(''),Hu=N(" Resume",1),ju=N(" Pause",1),Uu=N('Case not running'),Vu=N(' 
              ',1),Bu=N('

              '),qu=N('

              '),Ku=N(" ",1);function Gu(t,r){Me(r,!0);const a=80;let n=D(""),o=D(""),s=D(!1),l=D(se([])),c=D(a),d=D(se([])),y=D(se(new Set)),p=D(!1),S=D(se(Zt("tail")));Ee(()=>{er("tail",e(S))});let k=D(!0),A=D("all"),T=D(""),x=D(""),f=D(void 0),_=O(()=>bn(r.allCases)),P=O(()=>e(l).map(U=>{const q=U.split("/").pop()??U;return{value:U,label:q}})),b=[{value:"all",label:"All"},{value:"error",label:"Error"},{value:"warn",label:"Warn"}],$=O(()=>e(l).length>0),E=O(()=>zr().some(U=>{var q;return U.case_id===e(n)&&((q=U.status)==null?void 0:q.toUpperCase())==="RUNNING"}));async function m(){if(e(n)){try{v(l,await Ds(e(n)),!0)}catch(U){console.error("Failed to load tail files:",U),v(l,[],!0);return}(!e(s)||!e(l).includes(e(o)))&&(v(o,e(l)[0]??"",!0),v(s,!1)),e(o)||v(d,[],!0)}}async function R(U=!1){if(e(n)&&!(e(p)&&!U)&&(await m(),!!e(o)))try{const q=(await Is(e(n),e(o),e(c))).lines;if(v(x,""),e(d).length>0){const g=F(e(d),q),i=new Set;for(let C=g;C{let U=e(d).map((q,g)=>({...q,index:g,isNew:e(y).has(g)}));if(e(A)!=="all"&&(U=U.filter(q=>q.severity===e(A))),e(T).trim())try{const q=new RegExp(e(T),"i");U=U.filter(g=>q.test(g.text))}catch{}return U});function j(U){v(n,U,!0),v(o,""),v(s,!1),v(d,[],!0),m().then(()=>R(!0))}function z(U){v(o,U,!0),v(s,!0),v(d,[],!0),R(!0)}function V(){v(p,!e(p)),e(p)||R(!0)}function I(U){(U.ctrlKey||U.metaKey)&&U.key==="f"&&e(f)&&(U.preventDefault(),e(f).focus())}Ee(()=>{r.allCases.length>0&&!e(n)&&(v(n,r.allCases[0],!0),m().then(()=>R(!0)))}),Ee(()=>{e(S)&&!e(p)&&e(n)?pr("tail",()=>R(!1),Bn()):vt("tail")});const G=_r(()=>{e(n)&&m().then(()=>R(!0))});vr(()=>{vt("tail"),G()}),et("keydown",st,I),Ht(t,{eyebrow:"Live",title:"Log Tail",wide:!0,actions:q=>{var g=Tu(),i=B(g);{let W=O(Bn);tr(i,{name:"tail",get intervalMs(){return e(W)},onRefresh:()=>R(!1),get checked(){return e(S)},set checked(ee){v(S,ee,!0)}})}var C=M(i,2);{var H=W=>{Re(W,{variant:"primary",onclick:()=>R(!0),children:(ee,ne)=>{var pe=Mu(),K=B(pe);Fe(K,{get icon(){return Jt}}),Ce(),u(ee,pe)},$$slots:{default:!0}})};X(C,W=>{e(S)||W(H)})}u(q,g)},children:(q,g)=>{var i=Ku(),C=B(i);Xt(C,{children:(K,Y)=>{var ce=Du(),ie=B(ce);Ne(ie,{text:"Case",children:(Z,_e)=>{lt(Z,{class:"w-[130px]",get options(){return e(_)},get value(){return e(n)},onchange:j})}});var we=M(ie,2);{var ge=Z=>{var _e=Fu(),Pe=B(_e);Ne(Pe,{text:"File",children:(be,He)=>{lt(be,{class:"w-[150px]",get options(){return e(P)},get value(){return e(o)},onchange:z})}});var $e=M(Pe,2);Ne($e,{text:"Lines",children:(be,He)=>{var Ie=Au();Ke(Ie),le("change",Ie,()=>R(!0)),Ze(Ie,()=>e(c),oe=>v(c,oe)),u(be,Ie)}});var ve=M($e,2);Ne(ve,{text:"Filter",children:(be,He)=>{var Ie=Lu();Ke(Ie),rt(Ie,oe=>v(f,oe),()=>e(f)),Ze(Ie,()=>e(T),oe=>v(T,oe)),u(be,Ie)}});var De=M(ve,2);Ne(De,{text:"Severity",children:(be,He)=>{lt(be,{class:"w-[90px]",get options(){return b},get value(){return e(A)},onchange:Ie=>v(A,Ie,!0)})}}),u(Z,_e)};X(we,Z=>{e($)&&Z(ge)})}u(K,ce)}});var H=M(C,2);{var W=K=>{var Y=Vu(),ce=B(Y);Nu(ce,{get lines(){return e(L)},get searchQuery(){return e(T)},get autoScroll(){return e(k)}});var ie=M(ce,2),we=w(ie),ge=w(we);{var Z=oe=>{var ue=Iu();u(oe,ue)},_e=oe=>{var ue=zu();u(oe,ue)},Pe=oe=>{var ue=Ou();u(oe,ue)};X(ge,oe=>{e(p)?oe(Z):e(E)?oe(_e,1):oe(Pe,-1)})}var $e=M(ge);h(we);var ve=M(we,2);{var De=oe=>{Re(oe,{variant:"secondary",size:"sm",onclick:V,children:(ue,je)=>{var te=Se(),J=B(te);{var ae=xe=>{var Ae=Hu(),me=B(Ae);Fe(me,{get icon(){return Ea}}),Ce(),u(xe,Ae)},de=xe=>{var Ae=ju(),me=B(Ae);Fe(me,{get icon(){return bl}}),Ce(),u(xe,Ae)};X(J,xe=>{e(p)?xe(ae):xe(de,-1)})}u(ue,te)},$$slots:{default:!0}})},be=oe=>{var ue=Uu();u(oe,ue)};X(ve,oe=>{e(E)?oe(De):oe(be,-1)})}var He=M(ve,2),Ie=w(He);zt(Ie,{get checked(){return e(k)},onchange:oe=>v(k,oe,!0),size:14,label:"Auto-scroll",labelFirst:!0}),h(He),h(ie),Q(()=>re($e,` ${e(L).length??""} / ${e(d).length??""}`)),u(K,Y)},ee=K=>{var Y=Bu(),ce=w(Y);{var ie=ge=>{var Z=Oe("No log file yet for this case.");u(ge,Z)},we=ge=>{var Z=Oe("No log data available. Please run a simulation first.");u(ge,Z)};X(ce,ge=>{e(n)&&!e($)?ge(ie):ge(we,-1)})}h(Y),u(K,Y)};X(H,K=>{e(d).length>0?K(W):K(ee,-1)})}var ne=M(H,2);{var pe=K=>{var Y=qu(),ce=w(Y,!0);h(Y),Q(()=>re(ce,e(x))),u(K,Y)};X(ne,K=>{e(x)&&K(pe)})}u(q,i)},$$slots:{actions:!0,default:!0}}),Te()}qe(["change"]);function Wu(t,r=3){var A,T;const a=t.split(` -`),n=[];let o=0,s=0,l=!1;for(const x of a){if(x.startsWith("===")||x.startsWith("---")||x.startsWith("+++"))continue;const f=x.match(/^@@ -(\d+),?\d* \+(\d+),?\d* @@/);if(f){o=parseInt(f[1],10)-1,s=parseInt(f[2],10)-1,l=!0;continue}if(l)if(x.startsWith("-"))o++,n.push({type:"del",leftNum:o,rightNum:null,leftContent:x.slice(1),rightContent:""});else if(x.startsWith("+"))s++,n.push({type:"add",leftNum:null,rightNum:s,leftContent:"",rightContent:x.slice(1)});else{o++,s++;const _=x.startsWith(" ")?x.slice(1):x;n.push({type:"equal",leftNum:o,rightNum:s,leftContent:_,rightContent:_})}}const c=[];let d=0;for(;d=0&&x-S>1&&p.push({kind:"separator",skipped:x-S-1});const f=c[x].type!=="equal",_=f&&!k;p.push({kind:"line",row:c[x],hunkStart:_}),k=f,S=x}if(S=0&&p.push({kind:"separator",skipped:c.length-1-S}),p.length>0&&p[0].kind==="line"){const x=((A=p[0].row)==null?void 0:A.leftNum)??0,f=((T=p[0].row)==null?void 0:T.rightNum)??0,_=Math.max(x,f)-1;_>0&&p.unshift({kind:"separator",skipped:_})}return p}var Xu=N('
              '),Yu=N('
              '),Qu=N(' ',1),Ju=N('No matches'),Zu=N('
              '),ed=N('

              Files are identical.

              '),td=N('
              Loading...
              '),rd=N('
              ');function nd(t,r){Me(r,!0);let a=he(r,"loading",3,!1),n=D(void 0),o=O(()=>Wu(r.diffText)),s=O(()=>{const te=[];return e(o).forEach((J,ae)=>{J.hunkStart&&te.push(ae)}),te}),l=O(()=>e(s).length>0),c=O(()=>{var J;const te=new Array(e(o).length).fill(-1);for(let ae=0;ae{r.diffText!==y&&(y=r.diffText,v(d,-1))});let p=O(()=>{if(!r.search.trim())return[];try{const te=new RegExp(r.search,"i"),J=[];return e(o).forEach((ae,de)=>{ae.kind==="line"&&ae.row&&(te.test(ae.row.leftContent)||te.test(ae.row.rightContent))&&J.push(de)}),J}catch{return[]}}),S=D(-1),k="";Ee(()=>{r.search!==k&&(k=r.search,v(S,e(p).length>0?0:-1,!0))});async function A(te){var de;v(S,te,!0),await Pt();const J=e(p)[te],ae=(de=e(b))==null?void 0:de.querySelector(`[data-item-idx="${J}"]`);if(ae&&e(b)&&e($)){const xe=e(b).getBoundingClientRect(),me=ae.getBoundingClientRect().top-xe.top+e(b).scrollTop-e(b).clientHeight/3;m=!0,e(b).scrollTop=me,e($).scrollTop=me,requestAnimationFrame(()=>{m=!1})}}function T(){e(S)>0&&A(e(S)-1)}function x(){e(S)<0&&e(p).length>0?A(0):e(S)$1`)}catch{return ae}}function _(te,J){return te==="equal"?"":te==="del"&&J==="left"?"bg-[rgba(214,67,10,0.08)] text-edf-orange-fonce":te==="del"&&J==="right"?"bg-[rgba(48,122,16,0.08)] text-edf-vert-fonce":te==="add"&&J==="left"?"bg-edf-gris-clair":te==="add"&&J==="right"?"bg-[rgba(48,122,16,0.08)] text-edf-vert-fonce":""}function P(te,J){return te==="del"&&J==="left"?"rgb(251,237,233)":te==="del"&&J==="right"?"rgb(238,247,236)":te==="add"&&J==="left"?"var(--color-edf-gris-clair)":te==="add"&&J==="right"?"rgb(238,247,236)":"white"}let b=D(void 0),$=D(void 0),E=!1,m=!1;function R(te){E||m||!e(b)||!e($)||(E=!0,te==="left"?(e($).scrollTop=e(b).scrollTop,e($).scrollLeft=e(b).scrollLeft):(e(b).scrollTop=e($).scrollTop,e(b).scrollLeft=e($).scrollLeft),requestAnimationFrame(()=>{E=!1}))}async function F(te){var ae;v(d,te,!0),await Pt();const J=(ae=e(b))==null?void 0:ae.querySelector(`[data-hunk-start="${te}"]`);if(J&&e(b)&&e($)){m=!0;const de=e(b).getBoundingClientRect(),Ae=J.getBoundingClientRect().top-de.top+e(b).scrollTop-e(b).clientHeight/3;e(b).scrollTop=Ae,e($).scrollTop=Ae,requestAnimationFrame(()=>{m=!1})}}function L(){e(d)>0&&F(e(d)-1)}function j(){e(d)<0?F(0):e(d)=0&&v(d,J,!0)}function V(te){te.target instanceof HTMLInputElement||(te.key==="n"&&!te.shiftKey?(te.preventDefault(),j()):te.key==="N"||te.key==="n"&&te.shiftKey?(te.preventDefault(),L()):te.key==="j"?(te.preventDefault(),x()):(te.key==="J"||te.key==="j"&&te.shiftKey)&&(te.preventDefault(),T()))}var I=rd();{const te=(J,ae=No)=>{var de=Se(),xe=B(de);Ue(xe,17,()=>e(o),fn,(Ae,me,fe)=>{const Ve=O(()=>e(s).indexOf(fe)),ze=O(()=>e(c)[fe]>=0&&e(c)[fe]===e(d)),nt=O(()=>{var ct,Be;return ae()==="left"?(ct=e(me).row)==null?void 0:ct.leftNum:(Be=e(me).row)==null?void 0:Be.rightNum}),rr=O(()=>{var ct,Be;return ae()==="left"?((ct=e(me).row)==null?void 0:ct.leftContent)??"":((Be=e(me).row)==null?void 0:Be.rightContent)??""});var yr=Se(),Je=B(yr);{var ut=ct=>{var Be=Xu(),Nt=M(w(Be),2),Hr=w(Nt);h(Nt),h(Be),Q(()=>re(Hr,`... ${e(me).skipped??""} lines hidden ...`)),u(ct,Be)},Or=ct=>{var Be=Yu(),Nt=w(Be),Hr=w(Nt,!0);h(Nt);var Rn=M(Nt,2);Fr(Rn,()=>f(e(rr),e(S)>=0&&e(p)[e(S)]===fe),!0),h(Rn),h(Be),Q((xt,Mt,wr,Ka,Ga)=>{ke(Be,1,`flex w-full ${xt??""} ${Mt??""}`),Xe(Be,e(ze)?"background-color: rgba(16,87,200,0.12); color: rgb(16,87,200);":""),ye(Be,"role",wr),ye(Be,"tabindex",Ka),ye(Be,"data-hunk-start",ae()==="left"&&e(Ve)>=0?e(Ve):void 0),ye(Be,"data-item-idx",ae()==="left"?fe:void 0),Xe(Nt,`background: ${Ga??""}; color: ${e(ze)?"white":"var(--color-muted)"};`),re(Hr,e(nt)??"")},[()=>_(e(me).row.type,ae()),()=>e(me).row.type!=="equal"||e(p).includes(fe)?"cursor-pointer":"",()=>e(me).row.type!=="equal"||e(p).includes(fe)?"button":void 0,()=>e(me).row.type!=="equal"||e(p).includes(fe)?0:void 0,()=>e(ze)?"rgb(16,87,200)":P(e(me).row.type,ae())]),le("click",Be,()=>{var Mt;((Mt=e(me).row)==null?void 0:Mt.type)!=="equal"&&z(fe);const xt=e(p).indexOf(fe);xt>=0&&v(S,xt,!0)}),le("keydown",Be,xt=>{var Mt;if(xt.key==="Enter"||xt.key===" "){xt.preventDefault(),((Mt=e(me).row)==null?void 0:Mt.type)!=="equal"&&z(fe);const wr=e(p).indexOf(fe);wr>=0&&v(S,wr,!0)}}),u(ct,Be)};X(Je,ct=>{e(me).kind==="separator"?ct(ut):e(me).row&&ct(Or,1)})}u(Ae,yr)}),u(J,de)};var G=w(I),U=w(G),q=w(U),g=w(q,!0);h(q);var i=M(q,2),C=w(i,!0);h(i),h(U);var H=M(U,2),W=w(H),ee=w(W,!0);h(W);var ne=M(W,2),pe=w(ne,!0);h(ne),h(H),h(G);var K=M(G,2),Y=w(K),ce=w(Y);Ke(ce);var ie=M(ce,2);{var we=J=>{var ae=Qu(),de=B(ae);{let fe=O(()=>e(S)<=0);Re(de,{variant:"secondary",size:"sm",onclick:T,get disabled(){return e(fe)},children:(Ve,ze)=>{Ce();var nt=Oe("Prev");u(Ve,nt)},$$slots:{default:!0}})}var xe=M(de,2),Ae=w(xe);h(xe);var me=M(xe,2);{let fe=O(()=>e(S)>=e(p).length-1);Re(me,{variant:"secondary",size:"sm",onclick:x,get disabled(){return e(fe)},children:(Ve,ze)=>{Ce();var nt=Oe("Next");u(Ve,nt)},$$slots:{default:!0}})}Q(()=>re(Ae,`${e(S)>=0?e(S)+1:"–"} / ${e(p).length??""} occurrence${e(p).length!==1?"s":""}`)),u(J,ae)},ge=O(()=>r.search.trim()&&e(p).length>0),Z=J=>{var ae=Ju();u(J,ae)},_e=O(()=>r.search.trim());X(ie,J=>{e(ge)?J(we):e(_e)&&J(Z,1)})}h(Y);var Pe=M(Y,2),$e=w(Pe);{let J=O(()=>e(s).length===0||e(d)<=0);Re($e,{variant:"secondary",size:"sm",onclick:L,get disabled(){return e(J)},children:(ae,de)=>{Ce();var xe=Oe("Prev");u(ae,xe)},$$slots:{default:!0}})}var ve=M($e,2),De=w(ve);h(ve);var be=M(ve,2);{let J=O(()=>e(s).length===0||e(d)>=e(s).length-1);Re(be,{variant:"secondary",size:"sm",onclick:j,get disabled(){return e(J)},children:(ae,de)=>{Ce();var xe=Oe("Next");u(ae,xe)},$$slots:{default:!0}})}h(Pe),h(K);var He=M(K,2);{var Ie=J=>{var ae=Zu(),de=w(ae),xe=w(de),Ae=w(xe);te(Ae,()=>"left"),h(xe),h(de),rt(de,ze=>v(b,ze),()=>e(b));var me=M(de,2),fe=w(me),Ve=w(fe);te(Ve,()=>"right"),h(fe),h(me),rt(me,ze=>v($,ze),()=>e($)),h(ae),et("scroll",de,()=>R("left")),et("scroll",me,()=>R("right")),u(J,ae)},oe=J=>{var ae=ed();u(J,ae)};X(He,J=>{e(l)?J(Ie):J(oe,-1)})}var ue=M(He,2);{var je=J=>{var ae=td();u(J,ae)};X(ue,J=>{a()&&J(je)})}h(I),rt(I,J=>v(n,J),()=>e(n)),Q(()=>{re(g,r.leftLabel),re(C,r.kind),re(ee,r.rightLabel),re(pe,r.kind),vn(ce,r.search),re(De,`${e(d)>=0?e(d)+1:"–"} / ${e(s).length??""} diff${e(s).length!==1?"s":""}`)}),le("input",ce,J=>r.onSearchChange(J.target.value)),le("keydown",ce,J=>{J.key==="Enter"&&(J.preventDefault(),x())})}le("keydown",I,V),u(t,I),Te()}qe(["keydown","click","input"]);var ad=N(" ",1),od=N('

              Please select two different cases to compare.

              '),sd=N('

              Select two cases to compare.

              '),ld=N(' '),id=N('
              Parameter
              '),cd=N('

              All parameters are identical.

              '),ud=N('
              ',1),dd=N('

              '),fd=N('

              Loading...

              '),vd=N(" ",1),gd=N(" ",1);function hd(t,r){Me(r,!0);let a=D(""),n=D(""),o=D(""),s=D(""),l=D(""),c=D(!1),d=D(!1),y=D(""),p=O(()=>r.allCases.map(m=>({value:m,label:m})));const S=[{value:"doe_row.csv",label:"doe_row.csv"}];let k=O(()=>{var m;return((m=$t())==null?void 0:m.compare_kinds)??S});Ee(()=>{var m;e(k).some(R=>R.value===e(o))||v(o,((m=e(k)[0])==null?void 0:m.value)??"",!0)});let A=D(!1),T=O(()=>e(a)&&e(n)&&e(a)!==e(n));function x(){const m=e(a);v(a,e(n),!0),v(n,m,!0)}async function f(){if(e(T)){v(c,!0),v(y,"");try{const m=await js({cases:[e(a),e(n)],base:e(a),kind:e(o)});v(l,m,!0),v(d,!0)}catch(m){console.error("Failed to load diff:",m),v(l,""),v(d,!1);const R=m instanceof Error?m.message:String(m);v(y,R.includes("404")?`File "${e(o)}" not found for one of the selected cases. It may not have been run yet.`:"Failed to load comparison.",!0)}v(c,!1)}}Ee(()=>{e(a)&&e(n)&&e(a)!==e(n)&&e(o)?f():e(a)&&e(n)&&e(a)===e(n)&&(v(l,""),v(d,!0))});let _=!1;Ee(()=>{r.allCases.length>=2&&!_?(_=!0,v(a,r.allCases[0],!0),v(n,r.allCases[1],!0)):r.allCases.length===1&&!_&&(_=!0,v(a,r.allCases[0],!0))});let P=O(Cn),b=O(()=>{if(!e(a)||!e(n)||e(a)===e(n)||e(P).length===0)return[];const m=zr(),R=m.find(L=>L.case_id===e(a)),F=m.find(L=>L.case_id===e(n));return!R&&!F?[]:e(P).map(L=>{var V,I;const j=((V=R==null?void 0:R.doe)==null?void 0:V[L])!=null&&String(R.doe[L])!==""?String(R.doe[L]):"—",z=((I=F==null?void 0:F.doe)==null?void 0:I[L])!=null&&String(F.doe[L])!==""?String(F.doe[L]):"—";return{param:L,left:j,right:z,differs:j!==z}})}),$=O(()=>e(A)?e(b):e(b).filter(m=>m.differs)),E=O(()=>e(b).filter(m=>m.differs).length);Ht(t,{eyebrow:"Compare",title:"Side-by-Side Comparison",wide:!0,children:(m,R)=>{var F=gd(),L=B(F);Xt(L,{children:(G,U)=>{var q=ad(),g=B(q);Ne(g,{text:"First case",children:(H,W)=>{lt(H,{class:"w-32.5",get options(){return e(p)},get value(){return e(a)},onchange:ee=>v(a,ee,!0),placeholder:"Select..."})}});var i=M(g,2);{let H=O(()=>!e(a)&&!e(n));Re(i,{variant:"secondary",size:"sm",onclick:x,get disabled(){return e(H)},children:(W,ee)=>{Fe(W,{get icon(){return vl}})},$$slots:{default:!0}})}var C=M(i,2);Ne(C,{text:"Second case",children:(H,W)=>{lt(H,{class:"w-32.5",get options(){return e(p)},get value(){return e(n)},onchange:ee=>v(n,ee,!0),placeholder:"Select..."})}}),u(G,q)}});var j=M(L,2);{var z=G=>{var U=od();u(G,U)},V=G=>{var U=sd();u(G,U)},I=G=>{var U=vd(),q=B(U);{var g=ne=>{var pe=ud(),K=B(pe),Y=w(K),ce=w(Y);h(Y);var ie=M(Y,2),we=w(ie,!0);h(ie),h(K);var ge=M(K,2);{var Z=Pe=>{var $e=id(),ve=w($e),De=w(ve),be=w(De),He=w(be),Ie=w(He,!0);h(He);var oe=M(He,2),ue=w(oe,!0);h(oe),h(be),h(De);var je=M(De);Ue(je,21,()=>e($),te=>te.param,(te,J)=>{var ae=ld(),de=w(ae),xe=w(de,!0);h(de);var Ae=M(de),me=w(Ae,!0);h(Ae);var fe=M(Ae),Ve=w(fe,!0);h(fe),h(ae),Q(()=>{ke(de,1,dt(e(J).differs?"text-edf-orange-fonce bg-[rgba(214,67,10,0.04)]":"")),re(xe,e(J).left),re(me,e(J).param),ke(fe,1,dt(e(J).differs?"text-edf-vert-fonce bg-[rgba(48,122,16,0.04)]":"")),re(Ve,e(J).right)}),u(te,ae)}),h(je),h(ve),h($e),Q(()=>{re(Ie,e(a)),re(ue,e(n))}),u(Pe,$e)},_e=Pe=>{var $e=cd();u(Pe,$e)};X(ge,Pe=>{e($).length>0?Pe(Z):Pe(_e,-1)})}Q(()=>{re(ce,`${e(E)??""} difference${e(E)!==1?"s":""} out of ${e(b).length??""} - parameters`),re(we,e(A)?"Show differences only":"Show all parameters")}),le("click",ie,()=>v(A,!e(A))),u(ne,pe)};X(q,ne=>{e(b).length>0&&ne(g)})}var i=M(q,2);Xt(i,{children:(ne,pe)=>{Ne(ne,{text:"File",children:(K,Y)=>{lt(K,{class:"w-37.5",get options(){return e(k)},get value(){return e(o)},onchange:ce=>v(o,ce,!0)})}})}});var C=M(i,2);{var H=ne=>{var pe=dd(),K=w(pe,!0);h(pe),Q(()=>re(K,e(y))),u(ne,pe)},W=ne=>{nd(ne,{get diffText(){return e(l)},get leftLabel(){return e(a)},get rightLabel(){return e(n)},get kind(){return e(o)},get search(){return e(s)},get loading(){return e(c)},onSearchChange:pe=>v(s,pe,!0)})},ee=ne=>{var pe=fd();u(ne,pe)};X(C,ne=>{e(y)?ne(H):e(d)?ne(W,1):e(c)&&ne(ee,2)})}u(G,U)};X(j,G=>{e(a)&&e(n)&&e(a)===e(n)?G(z):!e(a)||!e(n)?G(V,1):G(I,-1)})}u(m,F)},$$slots:{default:!0}}),Te()}qe(["click"]);var md=N(" Refresh",1),pd=N(" ",1),_d=N(''),bd=N(''),xd=N(" Download as CSV",1),yd=N('
              ',1),wd=N(" ",1),kd=N(""),Cd=N('
              Sort by:
              '),Sd=N('

              No errors found. Select cases and adjust filters above.

              '),Pd=N(' '),$d=N('NEW'),Rd=N('
              '),Ed=N('
              '),Nd=N(' '),Md=N('
              '),Td=N('

              '),Ad=N("
              ",1);function Ld(t,r){Me(r,!0);const a=6,n=["csauto.stderr","csauto.stdout"];let o=D(se([])),s=D(se([...n])),l=!1;Ee(()=>{var Y;const K=(Y=$t())==null?void 0:Y.error_files;K!=null&&K.length&&!l&&v(s,[...K],!0)});let c=D("all"),d=D(""),y=D(a),p=D(!1),S=D(""),k=D(se(Zt("errors")));Ee(()=>{er("errors",e(k))});let A=D(se([])),T=D(se(new Set));function x(K){return K.toLowerCase().replace(/[0-9]+/g,"#").replace(/0x[0-9a-f]+/gi,"#").replace(/\s+/g," ").trim()}function f(K){const Y=K.line_html.replace(/<[^>]*>/g,"").slice(0,120);return`${K.case_id}|${K.file}|${K.severity}|${x(Y)}`}function _(K){const Y=new Map;for(const ce of K){const ie=f(ce),we=Y.get(ie);we?we.count++:Y.set(ie,{...ce,count:1,fingerprint:ie,isNew:!e(T).has(ie)})}return Array.from(Y.values())}async function P(){if(!(!e(o).length||!e(s).length)){v(p,!0);try{const K=await Fs({cases:e(o),files:e(s),context:e(y),sev:e(c)==="all"?"":e(c),q:e(d)});v(S,"");const Y=_(K.items);v(A,K.items,!0);const ce=new Set(Y.map(ie=>ie.fingerprint));v(T,ce,!0),v(b,Y,!0)}catch(K){v(S,"Failed to load errors"),console.error("Failed to load errors:",K)}finally{v(p,!1)}}}let b=D(se([])),$=null;function E(){$&&clearTimeout($),$=setTimeout(P,250)}function m(K){return K==="error"?"error-sev-error":K==="warn"?"error-sev-warn":"error-sev-info"}let R=O(()=>bn(r.allCases)),F=O(()=>{var K;return(((K=$t())==null?void 0:K.error_files)??n).map(Y=>({value:Y,label:Y}))}),L=[{value:"all",label:"All"},{value:"error",label:"Error"},{value:"warn",label:"Warn"}];function j(K){if(v(o,K,!0),K.length===0){v(b,[],!0),v(A,[],!0);return}P()}function z(K){if(l=!0,v(s,K,!0),K.length===0){v(b,[],!0),v(A,[],!0);return}P()}function V(K){v(c,K,!0),P()}function I(){P()}let G=!1;Ee(()=>{r.allCases.length>0&&!G&&(G=!0,v(o,[...r.allCases],!0),P())}),Ee(()=>{e(k)?pr("errors",P,Kn()):vt("errors")});const U=_r(()=>{G&&P()});vr(()=>{vt("errors"),U()});let q=D(se(new Set));function g(K){const Y=new Set(e(q));Y.has(K)?Y.delete(K):Y.add(K),v(q,Y,!0)}let i=D("severity"),C=D("desc");const H={info:0,warn:1,error:2};let W=O(()=>{const K=[...e(b)];return K.sort((Y,ce)=>{let ie=0;return e(i)==="severity"?ie=(H[Y.severity]??9)-(H[ce.severity]??9):e(i)==="count"?ie=Y.count-ce.count:ie=Y[e(i)].localeCompare(ce[e(i)]),e(C)==="asc"?ie:-ie}),K});const ee={severity:"desc",count:"desc",case_id:"asc",file:"asc"};function ne(K){e(i)===K?v(C,e(C)==="asc"?"desc":"asc",!0):(v(i,K,!0),v(C,ee[K],!0))}function pe(){if(!e(b).length)return;const K=["case_id","file","severity","count","is_new","line_text"],Y=e(W).map(we=>[we.case_id,we.file,we.severity,we.count,we.isNew?"yes":"no",`"${we.line_html.replace(/<[^>]*>/g,"").replace(/"/g,'""')}"`].join(",")),ce=[K.join(","),...Y].join(` -`),ie=xr("errors",e(o),"csv");Fa(ce,ie)}Ht(t,{eyebrow:"Diagnostics",title:"Recent Errors",wide:!0,actions:Y=>{var ce=pd(),ie=B(ce);{let Z=O(Kn);tr(ie,{name:"errors",get intervalMs(){return e(Z)},onRefresh:P,get checked(){return e(k)},set checked(_e){v(k,_e,!0)}})}var we=M(ie,2);{var ge=Z=>{Re(Z,{variant:"primary",onclick:P,children:(_e,Pe)=>{var $e=md(),ve=B($e);Fe(ve,{get icon(){return Jt}}),Ce(),u(_e,$e)},$$slots:{default:!0}})};X(we,Z=>{e(k)||Z(ge)})}u(Y,ce)},children:(Y,ce)=>{var ie=Ad(),we=B(ie);Xt(we,{children:(oe,ue)=>{var je=yd(),te=B(je);Ne(te,{text:"Cases",children:(fe,Ve)=>{Kt(fe,{class:"w-[160px]",get options(){return e(R)},get selected(){return e(o)},onchange:j,placeholder:"Select cases..."})}});var J=M(te,2);Ne(J,{text:"Files",children:(fe,Ve)=>{Kt(fe,{class:"w-[160px]",get options(){return e(F)},get selected(){return e(s)},onchange:z,placeholder:"Select files..."})}});var ae=M(J,2);Ne(ae,{text:"Severity",children:(fe,Ve)=>{lt(fe,{class:"w-[90px]",get options(){return L},get value(){return e(c)},onchange:V})}});var de=M(ae,2);Ne(de,{text:"Search",children:(fe,Ve)=>{var ze=_d();Ke(ze),le("input",ze,E),Ze(ze,()=>e(d),nt=>v(d,nt)),u(fe,ze)}});var xe=M(de,2);Ne(xe,{text:"Context",children:(fe,Ve)=>{var ze=bd();Ke(ze),le("change",ze,I),Ze(ze,()=>e(y),nt=>v(y,nt)),u(fe,ze)}});var Ae=M(xe,2),me=w(Ae);{let fe=O(()=>e(b).length===0);Re(me,{variant:"secondary",size:"sm",onclick:pe,get disabled(){return e(fe)},children:(Ve,ze)=>{var nt=xd(),rr=B(nt);Fe(rr,{get icon(){return mr}}),Ce(),u(Ve,nt)},$$slots:{default:!0}})}h(Ae),u(oe,je)}});var ge=M(we,2);{var Z=oe=>{var ue=Cd(),je=M(w(ue),2);Ue(je,16,()=>[{key:"severity",label:"Severity"},{key:"count",label:"Count"},{key:"case_id",label:"Case"},{key:"file",label:"File"}],te=>te.key,(te,J)=>{var ae=kd(),de=w(ae,!0),xe=M(de);{var Ae=me=>{var fe=wd(),Ve=M(B(fe));{let ze=O(()=>e(C)==="asc"?gl:fl);Fe(Ve,{get icon(){return e(ze)},size:12})}u(me,fe)};X(xe,me=>{e(i)===J.key&&me(Ae)})}h(ae),Q(()=>{ke(ae,1,`cursor-pointer bg-transparent border-none text-xs hover:underline ${e(i)===J.key?"text-edf-bleu-fonce font-bold":"text-muted"}`),re(de,J.label)}),le("click",ae,()=>ne(J.key)),u(te,ae)}),h(ue),u(oe,ue)};X(ge,oe=>{e(W).length>0&&oe(Z)})}var _e=M(ge,2),Pe=w(_e);{var $e=oe=>{var ue=Sd();u(oe,ue)};X(Pe,oe=>{e(W).length===0&&oe($e)})}var ve=M(Pe,2);Ue(ve,17,()=>e(W),oe=>oe.fingerprint,(oe,ue)=>{var je=Ed(),te=w(je),J=w(te),ae=w(J);{let Je=O(()=>e(q).has(e(ue).fingerprint)?xn:hl);Fe(ae,{get icon(){return e(Je)},size:14})}h(J);var de=M(J,2),xe=w(de);h(de);var Ae=M(de,2),me=w(Ae);{var fe=Je=>{var ut=Pd(),Or=w(ut);h(ut),Q(()=>re(Or,`${e(ue).count??""}x`)),u(Je,ut)};X(me,Je=>{e(ue).count>1&&Je(fe)})}var Ve=M(me,2);{var ze=Je=>{var ut=$d();u(Je,ut)};X(Ve,Je=>{e(ue).isNew&&Je(ze)})}h(Ae),h(te);var nt=M(te,2);{var rr=Je=>{var ut=Rd();Fr(ut,()=>e(ue).line_html,!0),h(ut),u(Je,ut)},yr=O(()=>e(q).has(e(ue).fingerprint));X(nt,Je=>{e(yr)&&Je(rr)})}h(je),Q(Je=>{ke(je,1,`error-item ${Je??""}`),re(xe,`${e(ue).case_id??""} / ${e(ue).file??""} : ${e(ue).severity??""}`)},[()=>m(e(ue).severity)]),le("click",te,()=>g(e(ue).fingerprint)),u(oe,je)}),h(_e);var De=M(_e,2);{var be=oe=>{var ue=Md(),je=w(ue),te=w(je);h(je);var J=M(je,2);{var ae=xe=>{var Ae=Nd(),me=w(Ae);h(Ae),Q(fe=>re(me,`${fe??""} new`),[()=>e(b).filter(fe=>fe.isNew).length]),u(xe,Ae)},de=O(()=>e(b).some(xe=>xe.isNew));X(J,xe=>{e(de)&&xe(ae)})}h(ue),Q(()=>re(te,`${e(b).length??""} unique / ${e(A).length??""} total`)),u(oe,ue)};X(De,oe=>{e(W).length>0&&oe(be)})}var He=M(De,2);{var Ie=oe=>{var ue=Td(),je=w(ue,!0);h(ue),Q(()=>re(je,e(S))),u(oe,ue)};X(He,oe=>{e(S)&&oe(Ie)})}Q(()=>ke(_e,1,`error-list ${e(p)?"opacity-50 pointer-events-none":""}`)),u(Y,ie)},$$slots:{actions:!0,default:!0}}),Te()}qe(["input","change","click"]);var Fd=N('
              Developed by Simvia
              ',1);function Bd(t,r){Me(r,!0);let a=D(se({totalCases:0,shownCases:0,totalRunning:0,shownRunning:0,totalConverged:0,shownConverged:0})),n=D(se([]));Ee(()=>{mn(),ur(()=>void $a())}),Ee(()=>{const i=$t(),C=document.querySelector('link[rel="icon"]');C&&(i!=null&&i.icon)&&(C.href=Ts(i.solver))});async function o(){try{const i=await Es();Ai(i.rows),Li(i.doe_columns),v(n,i.rows.map(C=>C.case_id),!0),v(a,Gi(Aa(),zr()),!0)}catch(i){console.error("Failed to load status:",i)}}un(()=>{o()});var s=Fd(),l=B(s);Hl(l,{});var c=M(l,2);ql(c,{});var d=M(c,2);fi(d,{get totalCases(){return e(a).totalCases},get shownCases(){return e(a).shownCases},get totalRunning(){return e(a).totalRunning},get shownRunning(){return e(a).shownRunning},get totalConverged(){return e(a).totalConverged},get shownConverged(){return e(a).shownConverged}});var y=M(d,2),p=w(y);{var S=i=>{kc(i,{onRefresh:o})},k=O(()=>Tt("status"));X(p,i=>{e(k)&&i(S)})}var A=M(p,2);{var T=i=>{qc(i,{get allCases(){return e(n)}})},x=O(()=>Tt("residuals"));X(A,i=>{e(x)&&i(T)})}var f=M(A,2);{var _=i=>{hu(i,{get allCases(){return e(n)}})},P=O(()=>Tt("probes"));X(f,i=>{e(P)&&i(_)})}var b=M(f,2);{var $=i=>{Pu(i,{get allCases(){return e(n)}})},E=O(()=>Tt("performance"));X(b,i=>{e(E)&&i($)})}var m=M(b,2);{var R=i=>{hd(i,{get allCases(){return e(n)}})},F=O(()=>Tt("compare"));X(m,i=>{e(F)&&i(R)})}var L=M(m,2);{var j=i=>{Gu(i,{get allCases(){return e(n)}})},z=O(()=>Tt("tail"));X(L,i=>{e(z)&&i(j)})}var V=M(L,2);{var I=i=>{Ld(i,{get allCases(){return e(n)}})},G=O(()=>Tt("errors"));X(V,i=>{e(G)&&i(I)})}h(y);var U=M(y,2),q=M(w(U),2),g=w(q);h(q),h(U),Q(()=>ye(g,"src",vi)),u(t,s),Te()}export{Bd as component}; diff --git a/frontend/dist/_app/immutable/nodes/2.D9x-OSY6.js b/frontend/dist/_app/immutable/nodes/2.D9x-OSY6.js new file mode 100644 index 0000000..00fda76 --- /dev/null +++ b/frontend/dist/_app/immutable/nodes/2.D9x-OSY6.js @@ -0,0 +1,44 @@ +import{b as Cr,a as f,f as M,c as Ke,t as Ie,d as Ot}from"../chunks/IT17IssP.js";import{o as un,a as dr}from"../chunks/C1tKzvKE.js";import{h as Te,y as Ct,q as Lt,c as Sr,w as ir,b as oa,D as e,O as Ya,af as Qa,P as Mn,Q as zt,f as pt,ay as sa,aF as Ja,ao as Nn,e as ht,a as lr,aM as Za,s as eo,a6 as to,aN as ia,aE as dn,aO as ro,ab as An,aP as no,aQ as ao,aI as oo,aR as vt,aS as la,a2 as so,r as ca,p as ua,aT as Or,ad as da,aU as io,aV as lo,aC as co,m as uo,d as Rr,az as fa,J as Q,o as va,aW as fo,aG as vo,aA as go,n as ga,aX as ha,aY as ho,aZ as po,E as mo,aw as pa,U as Ar,j as fn,a_ as ma,a$ as _o,b0 as bo,b1 as _a,b2 as xo,b3 as yo,b4 as fr,b5 as wo,b6 as ko,b7 as Co,b8 as So,b9 as Po,ba as Ro,bb as Eo,aJ as St,V as $o,aK as F,$ as se,a0 as d,L as k,M as p,I as Me,k as Y,K as Ne,N as A,u as Ee,ap as Ce,aL as z,bc as Mo,bd as No,be as ba,bf as Ao,bg as Tn,bh as ot}from"../chunks/D2EIOFXK.js";import{p as fe,i as G,b as tt,c as To,r as We,s as Xe}from"../chunks/Dy37i2LO.js";import{i as Lo,a as Do,d as ie,b as Be,c as Fo,n as zo,e as Io,s as re,f as Ze}from"../chunks/C4rlClDa.js";import{s as ct}from"../chunks/D3-3j-uT.js";import{B as Oo}from"../chunks/lwvwhigX.js";function vn(t,r){return r}function Ho(t,r,a){for(var n=[],i=r.length,o,u=r.length,v=0;v{if(o){if(o.pending.delete(S),o.done.add(S),o.pending.size===0){var w=t.outrogroups;Yr(t,dn(o.done)),w.delete(o),w.size===0&&(t.outrogroups=null)}}else u-=1},!1)}if(u===0){var l=n.length===0&&a!==null;if(l){var y=a,b=y.parentNode;co(b),b.append(y),t.items.clear()}Yr(t,r,!l)}else o={pending:new Set(r),done:new Set},(t.outrogroups??(t.outrogroups=new Set)).add(o)}function Yr(t,r,a=!0){var n;if(t.pending.size>0){n=new Set;for(const u of t.pending.values())for(const v of u)n.add(t.items.get(v).e)}for(var i=0;i{var _=a();return ia(_)?_:_==null?[]:dn(_)}),w,T=new Map,N=!0;function x(_){(P.effect.f&so)===0&&(P.pending.delete(_),P.fallback=b,jo(P,w,u,r,n),b!==null&&(w.length===0?(b.f&vt)===0?ca(b):(b.f^=vt,or(b,null,u)):ua(b,()=>{b=null})))}function c(_){P.pending.delete(_)}var m=oa(()=>{w=e(S);var _=w.length;let R=!1;if(Te){var $=Ya(u)===Qa;$!==(_===0)&&(u=Mn(),Ct(u),zt(!1),R=!0)}for(var h=new Set,E=ht,D=eo(),L=0;L<_;L+=1){Te&&pt.nodeType===sa&&pt.data===Ja&&(u=pt,R=!0,zt(!1));var j=w[L],I=n(j,L),V=N?null:v.get(I);V?(V.v&&Nn(V.v,j),V.i&&Nn(V.i,L),D&&E.unskip_effect(V.e)):(V=Uo(v,N?u:Ln??(Ln=Sr()),j,I,L,i,r,a),N||(V.e.f|=vt),v.set(I,V)),h.add(I)}if(_===0&&o&&!b&&(N?b=lr(()=>o(u)):(b=lr(()=>o(Ln??(Ln=Sr()))),b.f|=vt)),_>h.size&&Za(),Te&&_>0&&Ct(Mn()),!N)if(T.set(E,h),D){for(const[O,B]of v)h.has(O)||E.skip_effect(B.e);E.oncommit(x),E.ondiscard(c)}else x(E);R&&zt(!0),e(S)}),P={effect:m,items:v,pending:T,outrogroups:null,fallback:b};N=!1,Te&&(u=pt)}function tr(t){for(;t!==null&&(t.f&io)===0;)t=t.next;return t}function jo(t,r,a,n,i){var j,I,V,O,B,U,q,g,s;var o=(n&lo)!==0,u=r.length,v=t.items,l=tr(t.effect.first),y,b=null,S,w=[],T=[],N,x,c,m;if(o)for(m=0;m0){var L=(n&la)!==0&&u===0?a:null;if(o){for(m=0;m{var C,H;if(S!==void 0)for(c of S)(H=(C=c.nodes)==null?void 0:C.a)==null||H.apply()})}function Uo(t,r,a,n,i,o,u,v){var l=(u&no)!==0?(u&ao)===0?oo(a,!1,!1):An(a):null,y=(u&ro)!==0?An(i):null;return{v:l,i:y,e:lr(()=>(o(r,l??a,y??i,v),()=>{t.delete(n)}))}}function or(t,r,a){if(t.nodes)for(var n=t.nodes.start,i=t.nodes.end,o=r&&(r.f&vt)===0?r.nodes.start:a;n!==null;){var u=fa(n);if(o.before(n),n===i)return;n=u}}function xt(t,r,a){r===null?t.effect.first=a:r.next=a,a===null?t.effect.last=r:a.prev=r}function Tr(t,r,a=!1,n=!1,i=!1,o=!1){var u=t,v="";if(a){var l=t;Te&&(u=Ct(Lt(l)))}Q(()=>{var y=va;if(v===(v=r()??"")){Te&&ir();return}if(a&&!Te){y.nodes=null,l.innerHTML=v,v!==""&&Cr(Lt(l),l.lastChild);return}if(y.nodes!==null&&(fo(y.nodes.start,y.nodes.end),y.nodes=null),v!==""){if(Te){pt.data;for(var b=ir(),S=b;b!==null&&(b.nodeType!==sa||b.data!=="");)S=b,b=fa(b);if(b===null)throw vo(),go;Cr(pt,S),u=Ct(b);return}var w=n?ha:i?ho:void 0,T=ga(n?"svg":i?"math":"template",w);T.innerHTML=v;var N=n||i?T:T.content;if(Cr(Lt(N),N.lastChild),n||i)for(;Lt(N);)u.before(Lt(N));else u.before(N)}})}function Vo(t,r,a,n,i,o){let u=Te;Te&&ir();var v=null;Te&&pt.nodeType===po&&(v=pt,ir());var l=Te?pt:t,y=new Oo(l,!1);oa(()=>{const b=r()||null;var S=ha;if(b===null){y.ensure(null,null);return}return y.ensure(b,w=>{if(b){if(v=Te?v:ga(b,S),Cr(v,v),n){Te&&Lo(b)&&v.append(document.createComment(""));var T=Te?Lt(v):v.appendChild(Sr());Te&&(T===null?zt(!1):Ct(T)),n(v,T)}va.nodes.end=v,w.before(v)}Te&&Ct(w)}),()=>{}},mo),pa(()=>{}),u&&(zt(!0),Ct(l))}function Bo(t,r,a){Ar(()=>{var n=fn(()=>r(t,a==null?void 0:a())||{});if(n!=null&&n.destroy)return()=>n.destroy()})}function qo(t,r){var a=void 0,n;ma(()=>{a!==(a=r())&&(n&&(Rr(n),n=null),a&&(n=lr(()=>{Ar(()=>a(t))})))})}function xa(t){var r,a,n="";if(typeof t=="string"||typeof t=="number")n+=t;else if(typeof t=="object")if(Array.isArray(t)){var i=t.length;for(r=0;r=0;){var v=u+o;(u===0||Dn.includes(n[u-1]))&&(v===n.length||Dn.includes(n[v]))?n=(u===0?"":n.substring(0,u))+n.substring(v+1):u=v}}return n===""?null:n}function Fn(t,r=!1){var a=r?" !important;":";",n="";for(var i of Object.keys(t)){var o=t[i];o!=null&&o!==""&&(n+=" "+i+": "+o+a)}return n}function Hr(t){return t[0]!=="-"||t[1]!=="-"?t.toLowerCase():t}function Go(t,r){if(r){var a="",n,i;if(Array.isArray(r)?(n=r[0],i=r[1]):n=r,t){t=String(t).replaceAll(/\s*\/\*.*?\*\/\s*/g,"").trim();var o=!1,u=0,v=!1,l=[];n&&l.push(...Object.keys(n).map(Hr)),i&&l.push(...Object.keys(i).map(Hr));var y=0,b=-1;const x=t.length;for(var S=0;S{Er(t,t.__value)});r.observe(t,{childList:!0,subtree:!0,attributes:!0,attributeFilter:["value"]}),pa(()=>{r.disconnect()})}function zn(t,r,a=r){var n=new WeakSet,i=!0;_a(t,"change",o=>{var u=o?"[selected]":":checked",v;if(t.multiple)v=[].map.call(t.querySelectorAll(u),sr);else{var l=t.querySelector(u)??t.querySelector("option:not([disabled])");v=l&&sr(l)}a(v),t.__value=v,ht!==null&&n.add(ht)}),Ar(()=>{var o=r();if(t===document.activeElement){var u=ht;if(n.has(u))return}if(Er(t,o,i),i&&o===void 0){var v=t.querySelector(":checked");v!==null&&(o=sr(v),a(o))}t.__value=o,i=!1}),ya(t)}function sr(t){return"__value"in t?t.__value:t.value}const rr=Symbol("class"),nr=Symbol("style"),wa=Symbol("is custom element"),ka=Symbol("is html"),Xo=fr?"link":"LINK",Yo=fr?"input":"INPUT",Qo=fr?"option":"OPTION",Jo=fr?"select":"SELECT",Zo=fr?"progress":"PROGRESS";function qe(t){if(Te){var r=!1,a=()=>{if(!r){if(r=!0,t.hasAttribute("value")){var n=t.value;ye(t,"value",null),t.value=n}if(t.hasAttribute("checked")){var i=t.checked;ye(t,"checked",null),t.checked=i}}};t.__on_r=a,da(a),Co()}}function gn(t,r){var a=hn(t);a.value===(a.value=r??void 0)||t.value===r&&(r!==0||t.nodeName!==Zo)||(t.value=r??"")}function es(t,r){r?t.hasAttribute("selected")||t.setAttribute("selected",""):t.removeAttribute("selected")}function ye(t,r,a,n){var i=hn(t);Te&&(i[r]=t.getAttribute(r),r==="src"||r==="srcset"||r==="href"&&t.nodeName===Xo)||i[r]!==(i[r]=a)&&(r==="loading"&&(t[Ro]=a),a==null?t.removeAttribute(r):typeof a!="string"&&Ca(t).includes(r)?t[r]=a:t.setAttribute(r,a))}function ts(t,r,a,n,i=!1,o=!1){if(Te&&i&&t.nodeName===Yo){var u=t,v=u.type==="checkbox"?"defaultChecked":"defaultValue";v in a||qe(u)}var l=hn(t),y=l[wa],b=!l[ka];let S=Te&&y;S&&zt(!1);var w=r||{},T=t.nodeName===Qo;for(var N in r)N in a||(a[N]=null);a.class?a.class=dt(a.class):a[rr]&&(a.class=null),a[nr]&&(a.style??(a.style=null));var x=Ca(t);for(const h in a){let E=a[h];if(T&&h==="value"&&E==null){t.value=t.__value="",w[h]=E;continue}if(h==="class"){var c=t.namespaceURI==="http://www.w3.org/1999/xhtml";ke(t,c,E,n,r==null?void 0:r[rr],a[rr]),w[h]=E,w[rr]=a[rr];continue}if(h==="style"){Ge(t,E,r==null?void 0:r[nr],a[nr]),w[h]=E,w[nr]=a[nr];continue}var m=w[h];if(!(E===m&&!(E===void 0&&t.hasAttribute(h)))){w[h]=E;var P=h[0]+h[1];if(P!=="$$")if(P==="on"){const D={},L="$$"+h;let j=h.slice(2);var _=Io(j);if(Do(j)&&(j=j.slice(0,-7),D.capture=!0),!_&&m){if(E!=null)continue;t.removeEventListener(j,w[L],D),w[L]=null}if(_)ie(j,t,E),Be([j]);else if(E!=null){let I=function(V){w[h].call(this,V)};w[L]=Fo(j,t,I,D)}}else if(h==="style")ye(t,h,E);else if(h==="autofocus")wo(t,!!E);else if(!y&&(h==="__value"||h==="value"&&E!=null))t.value=t.__value=E;else if(h==="selected"&&T)es(t,E);else{var R=h;b||(R=zo(R));var $=R==="defaultValue"||R==="defaultChecked";if(E==null&&!y&&!$)if(l[h]=null,R==="value"||R==="checked"){let D=t;const L=r===void 0;if(R==="value"){let j=D.defaultValue;D.removeAttribute(R),D.defaultValue=j,D.value=D.__value=L?j:null}else{let j=D.defaultChecked;D.removeAttribute(R),D.defaultChecked=j,D.checked=L?j:!1}}else t.removeAttribute(h);else $||x.includes(R)&&(y||typeof E!="string")?(t[R]=E,R in l&&(l[R]=ko)):typeof E!="function"&&ye(t,R,E)}}}return S&&zt(!0),w}function In(t,r,a=[],n=[],i=[],o,u=!1,v=!1){xo(i,a,n,l=>{var y=void 0,b={},S=t.nodeName===Jo,w=!1;if(ma(()=>{var N=r(...l.map(e)),x=ts(t,y,N,o,u,v);w&&S&&"value"in N&&Er(t,N.value);for(let m of Object.getOwnPropertySymbols(b))N[m]||Rr(b[m]);for(let m of Object.getOwnPropertySymbols(N)){var c=N[m];m.description===yo&&(!y||c!==y[m])&&(b[m]&&Rr(b[m]),b[m]=lr(()=>qo(t,()=>c))),x[m]=c}y=x}),S){var T=t;Ar(()=>{Er(T,y.value,!0),ya(T)})}w=!0})}function hn(t){return t.__attributes??(t.__attributes={[wa]:t.nodeName.includes("-"),[ka]:t.namespaceURI===So})}var On=new Map;function Ca(t){var r=t.getAttribute("is")||t.nodeName,a=On.get(r);if(a)return a;On.set(r,a=[]);for(var n,i=t,o=Element.prototype;o!==i;){n=Eo(i);for(var u in n)n[u].set&&a.push(u);i=Po(i)}return a}function Je(t,r,a=r){var n=new WeakSet;_a(t,"input",async i=>{var o=i?t.defaultValue:t.value;if(o=Ur(t)?Vr(o):o,a(o),ht!==null&&n.add(ht),await St(),o!==(o=r())){var u=t.selectionStart,v=t.selectionEnd,l=t.value.length;if(t.value=o??"",v!==null){var y=t.value.length;u===v&&v===l&&y>l?(t.selectionStart=y,t.selectionEnd=y):(t.selectionStart=u,t.selectionEnd=Math.min(v,y))}}}),(Te&&t.defaultValue!==t.value||fn(r)==null&&t.value)&&(a(Ur(t)?Vr(t.value):t.value),ht!==null&&n.add(ht)),$o(()=>{var i=r();if(t===document.activeElement){var o=ht;if(n.has(o))return}Ur(t)&&i===Vr(t.value)||t.type==="date"&&!i&&!t.value||i!==t.value&&(t.value=i??"")})}function Ur(t){var r=t.type;return r==="number"||r==="range"}function Vr(t){return t===""?null:+t}let _t=F(se({type:"none",props:{},resolve:null}));function rs(){return e(_t)}function at(t=void 0){const{resolve:r}=e(_t);d(_t,{type:"none",props:{},resolve:null},!0),r==null||r(t)}function ns(t){return new Promise(r=>{d(_t,{type:"run",props:{cases:t},resolve:r},!0)})}function as(t){return new Promise(r=>{d(_t,{type:"restart",props:{cases:t},resolve:r},!0)})}function os(t){return new Promise(r=>{d(_t,{type:"clean",props:{cases:t},resolve:r},!0)})}function et(t,r="Alert"){return new Promise(a=>{d(_t,{type:"alert",props:{title:r,message:t},resolve:()=>a()},!0)})}function Hn(t,r="Confirm",a="OK",n="primary"){return new Promise(i=>{d(_t,{type:"confirm",props:{title:r,message:t,confirmLabel:a,confirmVariant:n},resolve:i},!0)})}function pn(t,r="",a="Input",n="",i=!1){return new Promise(o=>{d(_t,{type:"prompt",props:{title:a,message:t,value:r,placeholder:n,multiline:i},resolve:o},!0)})}var ss=M('
              ');function Xt(t,r){function a(o){return document.body.appendChild(o),{destroy(){o.remove()}}}var n=ss(),i=k(n);ct(i,()=>r.children),p(n),Bo(n,o=>a==null?void 0:a(o)),f(t,n)}var is=M('
              '),ls=M('
              ');function vr(t,r){Me(r,!0);const a=N=>{var x=ls(),c=k(x),m=k(c),P=k(m),_=k(P,!0);p(P);var R=A(P,2);{var $=L=>{var j=is(),I=k(j,!0);p(j),Q(()=>re(I,r.subtitle)),f(L,j)};G(R,L=>{r.subtitle&&L($)})}p(m);var h=A(m,2);ct(h,()=>r.children);var E=A(h,2),D=k(E);ct(D,()=>r.footer),p(E),p(c),p(x),Q(()=>{ke(c,1,`w-[min(${n()??""},96vw)] bg-white border border-border rounded-[10px] p-4.5`),ye(c,"aria-labelledby",r.titleId),ye(P,"id",r.titleId),re(_,r.title)}),ie("keydown",x,u),ie("mousedown",x,l),ie("click",x,y),f(N,x)};let n=fe(r,"maxWidth",3,"520px"),i=fe(r,"portal",3,!1);function o(){r.onCancel?r.onCancel():at(null)}function u(N){N.key==="Escape"?o():N.key==="Enter"&&r.onConfirm&&r.onConfirm()}let v=!1;function l(N){v=N.target.dataset.backdrop!==void 0}function y(N){const x=N.target.dataset.backdrop!==void 0;v&&x&&o(),v=!1}var b=Ke(),S=Y(b);{var w=N=>{Xt(N,{children:(x,c)=>{a(x)}})},T=N=>{a(N)};G(S,N=>{i()?N(w):N(T,-1)})}f(t,b),Ne()}Be(["keydown","mousedown","click"]);var cs=M("");function Re(t,r){let a=fe(r,"variant",3,"primary"),n=fe(r,"size",3,"default"),i=fe(r,"disabled",3,!1);const o={default:"h-[34px] rounded-md px-3.5 leading-none text-[13px] tracking-wide",sm:"h-[30px] rounded-md px-2.5 leading-none text-xs"},u={primary:"bg-edf-bleu-moyen text-white border-none hover:bg-[rgb(12,72,170)]",secondary:"bg-white text-ink border border-border hover:bg-edf-gris-clair",run:"bg-edf-vert-fonce text-white border-none hover:bg-[rgb(38,98,12)]",warning:"bg-edf-orange-moyen text-white border-none hover:bg-[rgb(230,118,20)]",danger:"bg-edf-orange-fonce text-white border-none hover:bg-[rgb(180,56,8)]"};var v=cs(),l=k(v);ct(l,()=>r.children),p(v),Q(()=>{ke(v,1,`inline-flex items-center justify-center gap-1.5 font-bold cursor-pointer transition-colors duration-150 disabled:opacity-40 disabled:pointer-events-none ${o[n()]??""} ${u[a()]??""}`),v.disabled=i()}),ie("click",v,function(...y){var b;(b=r.onclick)==null||b.apply(this,y)}),f(t,v)}Be(["click"]);var us=M(" ",1),ds=M(''),fs=M(''),vs=M('
              '),gs=M('

              ',1);function hs(t,r){Me(r,!0);let a=fe(r,"confirmLabel",3,"OK"),n=fe(r,"confirmVariant",3,"primary"),i=fe(r,"value",3,""),o=fe(r,"placeholder",3,""),u=fe(r,"multiline",3,!1);const v=i();let l=F(se(v)),y=F(void 0),b=F(void 0);Ee(()=>{var T;r.mode==="prompt"&&e(y)?(e(y).focus(),"select"in e(y)&&e(y).select()):e(b)&&((T=e(b).querySelector("button"))==null||T.focus())});function S(){r.mode==="prompt"?at(e(l)):r.mode==="confirm"?at(!0):at()}function w(){r.mode==="confirm"?at(!1):r.mode==="prompt"?at(null):at()}{const T=x=>{var c=us(),m=Y(c);{var P=$=>{Re($,{variant:"secondary",onclick:w,children:(h,E)=>{Ce();var D=Ie("Cancel");f(h,D)},$$slots:{default:!0}})};G(m,$=>{r.mode!=="alert"&&$(P)})}var _=A(m,2),R=k(_);Re(R,{get variant(){return n()},onclick:S,children:($,h)=>{Ce();var E=Ie();Q(()=>re(E,a())),f($,E)},$$slots:{default:!0}}),p(_),tt(_,$=>d(b,$),()=>e(b)),f(x,c)};let N=z(()=>u()?void 0:S);vr(t,{get title(){return r.title},titleId:"app-dialog-title",get onConfirm(){return e(N)},onCancel:w,footer:T,children:(x,c)=>{var m=gs(),P=Y(m),_=k(P,!0);p(P);var R=A(P,2);{var $=h=>{var E=vs(),D=k(E);{var L=I=>{var V=ds();Mo(V),tt(V,O=>d(y,O),()=>e(y)),Q(()=>ye(V,"placeholder",o())),Je(V,()=>e(l),O=>d(l,O)),f(I,V)},j=I=>{var V=fs();qe(V),tt(V,O=>d(y,O),()=>e(y)),Q(()=>ye(V,"placeholder",o())),Je(V,()=>e(l),O=>d(l,O)),f(I,V)};G(D,I=>{u()?I(L):I(j,-1)})}p(E),f(h,E)};G(R,h=>{r.mode==="prompt"&&h($)})}Q(()=>re(_,r.message)),f(x,m)},$$slots:{footer:!0,default:!0}})}Ne()}var ps=M('');function $e(t,r){var a=ps(),n=k(a),i=A(n);ct(i,()=>r.children),p(a),Q(()=>re(n,`${r.text??""} `)),f(t,a)}function wt(t,r){const a=localStorage.getItem(t);if(a===null)return r;const n=Number(a);return Number.isFinite(n)?n:r}function kt(t,r){Number.isFinite(r)&&localStorage.setItem(t,String(r))}function ms(t,r){return localStorage.getItem(t)??r}function _s(){return{n:wt("csauto_run_n",1),nt:wt("csauto_run_nt",1),maxParallel:wt("csauto_run_max_parallel",0)||null}}function bs(t){kt("csauto_run_n",t.n),kt("csauto_run_nt",t.nt),t.maxParallel&&kt("csauto_run_max_parallel",t.maxParallel)}function xs(){return{n:wt("csauto_restart_n",1),nt:wt("csauto_restart_nt",1),maxParallel:wt("csauto_restart_max_parallel",0)||null,mode:ms("csauto_restart_mode",""),value:wt("csauto_restart_value",100)}}function ys(t){kt("csauto_restart_n",t.n),kt("csauto_restart_nt",t.nt),t.maxParallel&&kt("csauto_restart_max_parallel",t.maxParallel),localStorage.setItem("csauto_restart_mode",t.mode),kt("csauto_restart_value",t.value)}function ws(){return{keepLast:wt("csauto_clean_keep_last",1)}}function ks(t){kt("csauto_clean_keep_last",t.keepLast)}var Cs=M(" ",1),Ss=M(''),Ps=M(''),Rs=M(''),Es=M('
              ');function $s(t,r){Me(r,!0);const a=_s(),n=a.maxParallel??(r.cases.length>1?r.cases.length:0);let i=F(se(a.n)),o=F(se(a.nt)),u=F(se(n));async function v(){if(!Number.isFinite(e(i))||e(i)<=0){await et("MPI ranks must be an integer > 0.","Invalid value");return}if(!Number.isFinite(e(o))||e(o)<=0){await et("Threads must be an integer > 0.","Invalid value");return}if(e(u)&&(!Number.isFinite(e(u))||e(u)<=0)){await et("Max parallel must be empty or > 0.","Invalid value");return}const l={n:e(i),nt:e(o),maxParallel:e(u)||null};bs(l),at(l)}{const l=S=>{var w=Cs(),T=Y(w);Re(T,{variant:"secondary",onclick:()=>at(null),children:(x,c)=>{Ce();var m=Ie("Cancel");f(x,m)},$$slots:{default:!0}});var N=A(T,2);Re(N,{variant:"run",onclick:v,children:(x,c)=>{Ce();var m=Ie("Run");f(x,m)},$$slots:{default:!0}}),f(S,w)};let y=z(()=>r.cases.length),b=z(()=>r.cases.length>1?"s":"");vr(t,{title:"Run Cases",titleId:"run-dialog-title",get subtitle(){return`${e(y)??""} case${e(b)??""} selected`},onConfirm:v,footer:l,children:(S,w)=>{var T=Es(),N=k(T);$e(N,{text:"MPI Ranks (n)",children:(m,P)=>{var _=Ss();qe(_),Je(_,()=>e(i),R=>d(i,R)),f(m,_)}});var x=A(N,2);$e(x,{text:"OMP Threads (nt)",children:(m,P)=>{var _=Ps();qe(_),Je(_,()=>e(o),R=>d(o,R)),f(m,_)}});var c=A(x,2);$e(c,{text:"Max Parallel",children:(m,P)=>{var _=Rs();qe(_),Je(_,()=>e(u),R=>d(u,R)),f(m,_)}}),p(T),f(S,T)},$$slots:{footer:!0,default:!0}})}Ne()}const Qr="csauto_token";let Sa=F(se(localStorage.getItem(Qr)??""));function mn(){return e(Sa)}function Pa(t){d(Sa,t,!0),t?localStorage.setItem(Qr,t):localStorage.removeItem(Qr)}let yr=null;async function _n(t,r={}){const a=new Headers(r.headers),n=mn();n&&a.set("X-CSAUTO-TOKEN",n);const i=await fetch(t,{...r,headers:a});if(i.status===401){yr||(yr=pn("API token required:",n,"Authentication"));const o=await yr;return yr=null,o===null?i:(Pa(o),a.set("X-CSAUTO-TOKEN",o),fetch(t,{...r,headers:a}))}return i}async function it(t){const r=await _n(t);if(!r.ok)throw new Error(`GET ${t} failed: ${r.status}`);return r.json()}async function bn(t){const r=await _n(t);if(!r.ok)throw new Error(`GET ${t} failed: ${r.status}`);return r.text()}async function Et(t,r){const a=await _n(t,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(r)});if(!a.ok){const n=await a.text().catch(()=>a.statusText);throw new Error(`POST ${t} failed (${a.status}): ${n}`)}return a.json()}function Lr(t){return t.map(r=>`case=${encodeURIComponent(r)}`).join("&")}function Ms(t=!1){return it(`/api/status${t?"?log=1":""}`)}function jn(t){return it(`/api/perf?${Lr(t)}`)}function Ns(){return it("/api/app_config")}function As(t){return`/api/solver_logo?solver=${encodeURIComponent(t)}`}function Ts(t){return`/api/solver_icon?solver=${encodeURIComponent(t)}`}function Ls(t){return it(`/api/residual_columns?${Lr(t)}`).then(r=>r.columns??[])}function Ds(t,r,a={}){const n=new URLSearchParams;return t.forEach(i=>n.append("case",i)),n.set("columns",r.join(",")),a.width&&n.set("width",String(a.width)),a.height&&n.set("height",String(a.height)),a.xMin!==void 0&&n.set("x_min",String(a.xMin)),a.includeHistory&&n.set("include_history","true"),bn(`/api/residuals_svg?${n}`)}function Ra(t){return it(`/api/restart_origin?${Lr(t)}`)}function Fs(t){var a;const r=new URLSearchParams;return t.cases.forEach(n=>r.append("case",n)),(a=t.files)!=null&&a.length&&r.set("files",t.files.join(",")),t.maxHits&&r.set("max_hits",String(t.maxHits)),t.context!==void 0&&r.set("context",String(t.context)),t.sev&&r.set("sev",t.sev),t.q&&r.set("q",t.q),it(`/api/recent_errors?${r}`)}function zs(t){return it(`/api/tail_files?case=${encodeURIComponent(t)}`).then(r=>r.files??[])}function Is(t,r,a){const n=new URLSearchParams({case:t,file:r,n:String(a)});return it(`/api/tail_lines?${n}`)}function Ea(t){return it(`/api/resu_dirs?${Lr(t)}`).then(r=>r.dirs??[])}function Jr(t,r){const a=new URLSearchParams({scope:r});return t.forEach(n=>a.append("case",n)),it(`/api/probes?${a}`).then(n=>n.files??[])}function Os(t,r){const a=new URLSearchParams;return t.forEach(n=>a.append("case",n)),r.forEach(n=>a.append("probe",n)),it(`/api/probe_columns?${a}`).then(n=>n.columns??[])}function Hs(t,r,a){const n=new URLSearchParams({case:t,probe:r});return a.forEach(i=>n.append("column",i)),it(`/api/probe_position?${n}`)}function js(t){const r=new URLSearchParams;return t.cases.forEach(a=>r.append("case",a)),t.probes.forEach(a=>r.append("probe",a)),r.set("columns",t.columns.join(",")),t.axis&&r.set("axis",t.axis),t.xMin!==void 0&&r.set("x_min",String(t.xMin)),t.timeMin!==void 0&&r.set("time_min",String(t.timeMin)),r.set("include_history","true"),t.width&&r.set("width",String(t.width)),t.height&&r.set("height",String(t.height)),bn(`/api/probe_svg?${r}`)}function Us(t){const r=new URLSearchParams;return t.cases.forEach(a=>r.append("case",a)),t.base&&r.set("base",t.base),t.kind&&r.set("kind",t.kind),t.filter&&r.set("filter",t.filter),bn(`/api/compare_runs?${r}`)}function Un(t){return Et("/api/run_case",{cases:t.cases,n:t.n,nt:t.nt,max_parallel:t.maxParallel??void 0,restart:t.restart??!1,restart_mode:t.restartMode??"",restart_value:t.restartValue??void 0,restart_path:t.restartPath||void 0}).then(()=>{})}function Vs(t){return Et("/api/kill_case",{cases:t}).then(()=>{})}function Bs(t){return Et("/api/control_case",{cases:t.cases,action:t.action,value:t.value??null}).then(()=>{})}function qs(t){return Et("/api/cleanup_cases",{cases:t.cases,keep_last:t.keepLast??1,prune_resu:t.pruneResu??!0,keep_resu:t.keepResu??[],delete_resu:t.deleteResu??[],max_log_mb:t.maxLogMb??50,clear_cid:!0,clear_pyc:!1})}function Ks(t,r){return Et("/api/case_note",{case:t,note:r}).then(()=>{})}function Ws(t,r){return Et("/api/case_convergence",{case:t,convergence:r}).then(()=>{})}function Gs(t){return Et("/api/open_gui",{case:t}).then(()=>{})}function Xs(){return it("/api/settings/telemetry")}function Ys(t){return Et("/api/settings/telemetry",{enabled:t})}const Qs=["status","tail","errors"],Js=3e4;let cr=F(null),Br=!1,qr=1e3,Vn;function Pt(){return e(cr)}async function $a(){if(!(e(cr)||Br)){clearTimeout(Vn),Br=!0;try{d(cr,await Ns(),!0)}catch{Vn=setTimeout($a,qr),qr=Math.min(qr*2,Js)}finally{Br=!1}}}function Nt(t){var r;return(((r=e(cr))==null?void 0:r.panels)??Qs).includes(t)}function Zr(t){var r;return((r=e(cr))==null?void 0:r.capabilities.includes(t))??!1}function xn(t){return t.map(r=>({value:r,label:r}))}function Ma(t,r){return Number.isFinite(r)?r<=0?`${t.value_label} must be greater than 0.`:t.value_kind==="int"&&!Number.isInteger(r)?`${t.value_label} must be a whole number.`:"":`${t.value_label} must be a number.`}var Zs=M(" ",1),ei=M(''),ti=M(''),ri=M(''),ni=M(""),ai=M(""),oi=M(''),si=M(""),ii=M(""),li=M('
              ',1);function ci(t,r){var N,x;Me(r,!0);const a=((N=Pt())==null?void 0:N.restart_modes)??[],n=xs(),i=n.maxParallel??(r.cases.length>1?r.cases.length:0);let o=F(se(n.n)),u=F(se(n.nt)),v=F(se(i)),l=F(se(a.some(c=>c.name===n.mode)?n.mode:((x=a[0])==null?void 0:x.name)??"")),y=F(se(n.value)),b=F(""),S=F(se([])),w=z(()=>a.find(c=>c.name===e(l)));un(async()=>{if(r.cases.length===1)try{d(S,await Ea(r.cases),!0)}catch{d(S,[],!0)}});async function T(){var P,_;if(!Number.isFinite(e(o))||e(o)<=0){await et("MPI ranks must be an integer > 0.","Invalid value");return}if(!Number.isFinite(e(u))||e(u)<=0){await et("Threads must be an integer > 0.","Invalid value");return}if(e(v)&&(!Number.isFinite(e(v))||e(v)<=0)){await et("Max parallel must be empty or > 0.","Invalid value");return}const c=(P=e(w))!=null&&P.value_label?Ma(e(w),e(y)):"";if(c){await et(c,"Invalid value");return}const m={n:e(o),nt:e(u),maxParallel:e(v)||null,restartMode:e(l),restartValue:(_=e(w))!=null&&_.value_label?e(y):null,restartPath:e(b)||null};ys({n:e(o),nt:e(u),maxParallel:e(v)||null,mode:e(l),value:e(y)}),at(m)}{const c=_=>{var R=Zs(),$=Y(R);Re($,{variant:"secondary",onclick:()=>at(null),children:(E,D)=>{Ce();var L=Ie("Cancel");f(E,L)},$$slots:{default:!0}});var h=A($,2);Re(h,{variant:"warning",onclick:T,children:(E,D)=>{Ce();var L=Ie("Restart");f(E,L)},$$slots:{default:!0}}),f(_,R)};let m=z(()=>r.cases.length),P=z(()=>r.cases.length>1?"s":"");vr(t,{title:"Restart Cases",titleId:"restart-dialog-title",get subtitle(){return`${e(m)??""} case${e(P)??""} selected`},onConfirm:T,footer:c,children:(_,R)=>{var $=li(),h=Y($),E=k(h);$e(E,{text:"MPI Ranks (n)",children:(q,g)=>{var s=ei();qe(s),Je(s,()=>e(o),C=>d(o,C)),f(q,s)}});var D=A(E,2);$e(D,{text:"OMP Threads (nt)",children:(q,g)=>{var s=ti();qe(s),Je(s,()=>e(u),C=>d(u,C)),f(q,s)}});var L=A(D,2);$e(L,{text:"Max Parallel",children:(q,g)=>{var s=ri();qe(s),Je(s,()=>e(v),C=>d(v,C)),f(q,s)}}),p(h);var j=A(h,2),I=k(j);{var V=q=>{$e(q,{text:"Mode",children:(g,s)=>{var C=ai();je(C,21,()=>a,H=>H.name,(H,W)=>{var ee=ni(),ne=k(ee,!0);p(ee);var me={};Q(()=>{re(ne,e(W).label),me!==(me=e(W).name)&&(ee.value=(ee.__value=e(W).name)??"")}),f(H,ee)}),p(C),zn(C,()=>e(l),H=>d(l,H)),f(g,C)}})};G(I,q=>{a.length>0&&q(V)})}var O=A(I,2);{var B=q=>{$e(q,{get text(){return e(w).value_label},children:(g,s)=>{var C=oi();qe(C),Q(()=>{ye(C,"min",e(w).value_kind==="int"?"1":"0"),ye(C,"step",e(w).value_kind==="int"?"1":"any")}),Je(C,()=>e(y),H=>d(y,H)),f(g,C)}})};G(O,q=>{var g;(g=e(w))!=null&&g.value_label&&q(B)})}var U=A(O,2);$e(U,{text:"Restart from",children:(q,g)=>{var s=ii(),C=k(s);C.value=C.__value="";var H=A(C);je(H,16,()=>e(S),W=>W,(W,ee)=>{var ne=si(),me=k(ne,!0);p(ne);var K={};Q(()=>{re(me,ee),K!==(K=ee)&&(ne.value=(ne.__value=ee)??"")}),f(W,ne)}),p(s),Q(()=>{s.disabled=r.cases.length>1,ye(s,"title",r.cases.length>1?"Each case restarts from its own latest run":void 0)}),zn(s,()=>e(b),W=>d(b,W)),f(q,s)}}),p(j),f(_,$)},$$slots:{footer:!0,default:!0}})}Ne()}function Le(t,r){let a=fe(r,"size",3,14);var n=Ke(),i=Y(n);To(i,()=>r.icon,(o,u)=>{u(o,{get size(){return a()},class:"icon"})}),f(t,n)}/** + * @file + * @license @lucide/svelte v1.52.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const At={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":2,"stroke-linecap":"round","stroke-linejoin":"round"};/** + * @file + * @license @lucide/svelte v1.52.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const en=(...t)=>t.filter((r,a,n)=>!!r&&r.trim()!==""&&n.indexOf(r)===a).join(" ").trim();/** + * @file + * @license @lucide/svelte v1.52.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */function Kr(t){return t!=null}function ui(t,r={}){var w,T;const a=r.attributeNames??{},n=N=>a[N]??N,i=t.size??t.width??At.width,o=t.size??t.height??At.height,u=((w=t.aliases)==null?void 0:w.filter(N=>typeof N=="string"&&N.trim()!=="").map(N=>`lucide-${N}`))??[],v=[...t.name?[`lucide-${t.name}`]:[],...u],l=((T=r.className)==null?void 0:T.split(" ").filter(Boolean))??[],y=r.includeDefaultClasses===!1?en(...l):en("lucide",...v,...l),b=r.absoluteStrokeWidth?Number(r.strokeWidth??At["stroke-width"])*Number(t.size??t.width??At.width)/Number(r.size??r.width??At.width):r.strokeWidth??At["stroke-width"];return["svg",{...Object.entries(At).reduce((N,[x,c])=>(N[n(x)]=c,N),{}),..."color"in r&&r.color&&{[n("stroke")]:r.color},..."size"in r&&Kr(r.size)&&{[n("width")]:r.size,[n("height")]:r.size},..."width"in r&&Kr(r.width)&&{[n("width")]:r.width},..."height"in r&&Kr(r.height)&&{[n("height")]:r.height},[n("stroke-width")]:b,...y&&{[n("class")]:y},[n("viewBox")]:`0 0 ${i} ${o}`,...r.hasA11yProp===!1?{[n("aria-hidden")]:"true"}:{},..."attributes"in r&&r.attributes},t.node.map(N=>{const[x,c,m]=N,P=r.nonScalingStroke?{[n("vector-effect")]:"non-scaling-stroke",...c}:c;return m?[x,P,m]:[x,P]})]}/** + * @file + * @license @lucide/svelte v1.52.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const di=t=>{for(const r in t)if(r.startsWith("aria-")||r==="role"||r==="title")return!0;return!1};/** + * @file + * @license @lucide/svelte v1.52.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const fi=Symbol("lucide-context"),vi=()=>No(fi);var gi=Ot("");function Ye(t,r){Me(r,!0);const a=vi()??{},n=fe(r,"color",19,()=>a.color??"currentColor"),i=fe(r,"size",19,()=>a.size??24),o=fe(r,"width",19,i),u=fe(r,"height",19,i),v=fe(r,"strokeWidth",19,()=>a.strokeWidth??2),l=fe(r,"absoluteStrokeWidth",19,()=>a.absoluteStrokeWidth??!1),y=fe(r,"nonScalingStroke",19,()=>a.nonScalingStroke??!1),b=fe(r,"iconNode",19,()=>[]),S=fe(r,"icon",19,()=>({node:b(),aliases:[],size:24})),w=We(r,["$$slots","$$events","$$legacy","color","size","width","height","strokeWidth","absoluteStrokeWidth","nonScalingStroke","iconNode","icon","class","children"]),T=z(()=>!!r.children||di(w)),N=z(()=>ui(S(),{color:n(),width:o(),height:u(),strokeWidth:v(),absoluteStrokeWidth:l(),nonScalingStroke:y(),className:en("lucide-icon",a.class),hasA11yProp:e(T),attributes:w})),x=z(()=>Tn(e(N),3)),c=z(()=>e(x)[1]),m=z(()=>Ao(e(x)[2],()=>[],!0)),P=z(()=>({...e(c),class:[...e(c).class.split(" "),r.class]}));var _=gi();In(_,()=>({...e(P)}));var R=k(_);je(R,17,()=>e(m),vn,(h,E)=>{var D=z(()=>Tn(e(E),2));let L=()=>e(D)[0],j=()=>e(D)[1];var I=Ke(),V=Y(I);Vo(V,L,!0,(O,B)=>{In(O,()=>({...j()}))}),f(h,I)});var $=A(R);ct($,()=>r.children??ba),p(_),f(t,_),Ne()}function hi(t,r){let a=We(r,["$$slots","$$events","$$legacy"]);const n={name:"arrow-down",size:24,node:[["path",{d:"M12 5v14"}],["path",{d:"m19 12-7 7-7-7"}]]};Ye(t,Xe(()=>a,{get icon(){return n}}))}function pi(t,r){let a=We(r,["$$slots","$$events","$$legacy"]);const n={name:"arrow-left-right",size:24,node:[["path",{d:"M8 3 4 7l4 4"}],["path",{d:"M4 7h16"}],["path",{d:"m16 21 4-4-4-4"}],["path",{d:"M20 17H4"}]]};Ye(t,Xe(()=>a,{get icon(){return n}}))}function mi(t,r){let a=We(r,["$$slots","$$events","$$legacy"]);const n={name:"arrow-up",size:24,node:[["path",{d:"m5 12 7-7 7 7"}],["path",{d:"M12 19V5"}]]};Ye(t,Xe(()=>a,{get icon(){return n}}))}function yn(t,r){let a=We(r,["$$slots","$$events","$$legacy"]);const n={name:"chevron-down",size:24,node:[["path",{d:"m6 9 6 6 6-6"}]]};Ye(t,Xe(()=>a,{get icon(){return n}}))}function _i(t,r){let a=We(r,["$$slots","$$events","$$legacy"]);const n={name:"chevron-right",size:24,node:[["path",{d:"m9 18 6-6-6-6"}]]};Ye(t,Xe(()=>a,{get icon(){return n}}))}function bi(t,r){let a=We(r,["$$slots","$$events","$$legacy"]);const n={name:"circle-x",size:24,node:[["circle",{cx:"12",cy:"12",r:"10"}],["path",{d:"m15 9-6 6"}],["path",{d:"m9 9 6 6"}]],aliases:["x-circle"]};Ye(t,Xe(()=>a,{get icon(){return n}}))}function gr(t,r){let a=We(r,["$$slots","$$events","$$legacy"]);const n={name:"download",size:24,node:[["path",{d:"M12 15V3"}],["path",{d:"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"}],["path",{d:"m7 10 5 5 5-5"}]]};Ye(t,Xe(()=>a,{get icon(){return n}}))}function xi(t,r){let a=We(r,["$$slots","$$events","$$legacy"]);const n={name:"ellipsis",size:24,node:[["circle",{cx:"12",cy:"12",r:"1"}],["circle",{cx:"19",cy:"12",r:"1"}],["circle",{cx:"5",cy:"12",r:"1"}]],aliases:["more-horizontal"]};Ye(t,Xe(()=>a,{get icon(){return n}}))}function yi(t,r){let a=We(r,["$$slots","$$events","$$legacy"]);const n={name:"external-link",size:24,node:[["path",{d:"M15 3h6v6"}],["path",{d:"M10 14 21 3"}],["path",{d:"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"}]]};Ye(t,Xe(()=>a,{get icon(){return n}}))}function wi(t,r){let a=We(r,["$$slots","$$events","$$legacy"]);const n={name:"pause",size:24,node:[["rect",{x:"14",y:"3",width:"5",height:"18",rx:"1"}],["rect",{x:"5",y:"3",width:"5",height:"18",rx:"1"}]]};Ye(t,Xe(()=>a,{get icon(){return n}}))}function ki(t,r){let a=We(r,["$$slots","$$events","$$legacy"]);const n={name:"pen-line",size:24,node:[["path",{d:"M13 21h8"}],["path",{d:"M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z"}]],aliases:["edit-3"]};Ye(t,Xe(()=>a,{get icon(){return n}}))}function Ci(t,r){let a=We(r,["$$slots","$$events","$$legacy"]);const n={name:"pencil",size:24,node:[["path",{d:"M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z"}],["path",{d:"m15 5 4 4"}]]};Ye(t,Xe(()=>a,{get icon(){return n}}))}function Na(t,r){let a=We(r,["$$slots","$$events","$$legacy"]);const n={name:"play",size:24,node:[["path",{d:"M5 5a2 2 0 0 1 3.008-1.728l11.997 6.998a2 2 0 0 1 .003 3.458l-12 7A2 2 0 0 1 5 19z"}]]};Ye(t,Xe(()=>a,{get icon(){return n}}))}function Si(t,r){let a=We(r,["$$slots","$$events","$$legacy"]);const n={name:"plus",size:24,node:[["path",{d:"M5 12h14"}],["path",{d:"M12 5v14"}]]};Ye(t,Xe(()=>a,{get icon(){return n}}))}function Yt(t,r){let a=We(r,["$$slots","$$events","$$legacy"]);const n={name:"refresh-cw",size:24,node:[["path",{d:"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8"}],["path",{d:"M21 3v5h-5"}],["path",{d:"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16"}],["path",{d:"M8 16H3v5"}]]};Ye(t,Xe(()=>a,{get icon(){return n}}))}function Pi(t,r){let a=We(r,["$$slots","$$events","$$legacy"]);const n={name:"rotate-ccw",size:24,node:[["path",{d:"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8"}],["path",{d:"M3 3v5h5"}]]};Ye(t,Xe(()=>a,{get icon(){return n}}))}function Ri(t,r){let a=We(r,["$$slots","$$events","$$legacy"]);const n={name:"settings",size:24,node:[["path",{d:"M9.671 4.136a2.34 2.34 0 0 1 4.659 0 2.34 2.34 0 0 0 3.319 1.915 2.34 2.34 0 0 1 2.33 4.033 2.34 2.34 0 0 0 0 3.831 2.34 2.34 0 0 1-2.33 4.033 2.34 2.34 0 0 0-3.319 1.915 2.34 2.34 0 0 1-4.659 0 2.34 2.34 0 0 0-3.32-1.915 2.34 2.34 0 0 1-2.33-4.033 2.34 2.34 0 0 0 0-3.831A2.34 2.34 0 0 1 6.35 6.051a2.34 2.34 0 0 0 3.319-1.915"}],["circle",{cx:"12",cy:"12",r:"3"}]]};Ye(t,Xe(()=>a,{get icon(){return n}}))}function Ei(t,r){let a=We(r,["$$slots","$$events","$$legacy"]);const n={name:"trash",size:24,node:[["path",{d:"M10 11v6"}],["path",{d:"M14 11v6"}],["path",{d:"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6"}],["path",{d:"M3 6h18"}],["path",{d:"M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2"}]],aliases:["trash-2"]};Ye(t,Xe(()=>a,{get icon(){return n}}))}var $i=M('
            • '),Mi=M('
                '),Ni=M('
                ',1);function st(t,r){Me(r,!0);let a=fe(r,"value",3,""),n=fe(r,"placeholder",3,"Select..."),i=fe(r,"class",3,""),o=fe(r,"buttonClass",3,""),u=F(!1),v=F(void 0),l=F(void 0),y=F(""),b=z(()=>{var L;return((L=r.options.find(j=>j.value===a()))==null?void 0:L.label)??n()});function S(L){var j;d(u,!1),(j=r.onchange)==null||j.call(r,L)}function w(){if(!e(v)||!e(l))return;const L=e(v).getBoundingClientRect(),j=e(l).offsetHeight,I=4,V=window.innerHeight-L.bottom-I,B=VV?L.top-I-j:L.bottom+I,U=Math.min(L.left,window.innerWidth-L.width);d(y,`position:fixed; top:${B}px; left:${U}px; width:${L.width}px; z-index:9999;`)}async function T(){d(u,!e(u)),e(u)&&(await St(),w())}function N(L){L.key==="Escape"&&d(u,!1)}function x(L){e(u)&&e(v)&&!e(v).contains(L.target)&&e(l)&&!e(l).contains(L.target)&&d(u,!1)}var c=Ni();Ze("mousedown",ot,x),Ze("keydown",ot,N),Ze("scroll",ot,()=>{e(u)&&d(u,!1)});var m=Y(c),P=k(m),_=k(P),R=k(_,!0);p(_);var $=A(_,2),h=k($);Le(h,{get icon(){return yn},size:14}),p($),p(P),tt(P,L=>d(v,L),()=>e(v)),p(m);var E=A(m,2);{var D=L=>{Xt(L,{children:(j,I)=>{var V=Mi();je(V,21,()=>r.options,O=>O.value,(O,B)=>{var U=$i();ye(U,"tabindex",0);var q=k(U,!0);p(U),Q(()=>{ye(U,"aria-selected",e(B).value===a()),ke(U,1,`px-2.5 py-1.5 text-[13px] cursor-pointer transition-colors duration-100 + ${e(B).value===a()?"text-edf-bleu-fonce font-bold bg-[rgba(16,87,200,0.06)]":"text-ink hover:bg-edf-gris-clair"}`),re(q,e(B).label)}),ie("mousedown",U,g=>{g.stopPropagation(),S(e(B).value)}),f(O,U)}),p(V),tt(V,O=>d(l,O),()=>e(l)),Q(()=>Ge(V,e(y))),f(j,V)}})};G(E,L=>{e(u)&&L(D)})}Q(()=>{ke(m,1,`relative inline-flex ${i()??""}`),ke(P,1,dt(o()||"flex items-center justify-between gap-1.5 w-full h-[30px] cursor-pointer bg-white border border-border rounded-md text-[13px] text-ink font-normal pl-2.5 pr-2 transition-colors duration-150 hover:bg-edf-gris-clair focus:outline-none focus:border-edf-bleu-moyen")),ye(P,"aria-expanded",e(u)),re(R,e(b)),ke($,1,`text-muted shrink-0 transition-transform duration-150 ${e(u)?"rotate-180":""}`)}),ie("mousedown",P,L=>{L.stopPropagation(),T()}),f(t,c),Ne()}Be(["mousedown"]);var Ai=Ot(''),Ti=M('
                '),Li=M('
                '),Di=M('
                ',1);function Bt(t,r){Me(r,!0);let a=fe(r,"selected",19,()=>[]),n=fe(r,"placeholder",3,"Select..."),i=fe(r,"class",3,""),o=F(!1),u=F(void 0),v=F(void 0),l=F(""),y=z(()=>new Set(a())),b=z(()=>a().length===0?n():a().length===r.options.length?`All (${r.options.length})`:a().length<=2?a().map(I=>{var V;return((V=r.options.find(O=>O.value===I))==null?void 0:V.label)??I}).join(", "):`${a().length} selected`);function S(I){var O;const V=new Set(e(y));V.has(I)?V.delete(I):V.add(I),(O=r.onchange)==null||O.call(r,[...V])}function w(){var I;(I=r.onchange)==null||I.call(r,r.options.map(V=>V.value))}function T(){var I;(I=r.onchange)==null||I.call(r,[])}function N(){if(!e(u)||!e(v))return;const I=e(u).getBoundingClientRect(),V=e(v).offsetHeight,O=4,B=window.innerHeight-I.bottom-O,q=BB?I.top-O-V:I.bottom+O,g=Math.min(I.left,window.innerWidth-I.width);d(l,`position:fixed; top:${q}px; left:${g}px; min-width:${I.width}px; z-index:9999;`)}async function x(){d(o,!e(o)),e(o)&&(await St(),N())}function c(I){e(o)&&e(u)&&!e(u).contains(I.target)&&e(v)&&!e(v).contains(I.target)&&d(o,!1)}function m(I){I.key==="Escape"&&d(o,!1)}var P=Di();Ze("mousedown",ot,c),Ze("keydown",ot,m),Ze("scroll",ot,()=>{e(o)&&d(o,!1)});var _=Y(P),R=k(_),$=k(R),h=k($,!0);p($);var E=A($,2),D=k(E);Le(D,{get icon(){return yn},size:14}),p(E),p(R),tt(R,I=>d(u,I),()=>e(u)),p(_);var L=A(_,2);{var j=I=>{Xt(I,{children:(V,O)=>{var B=Li(),U=k(B),q=k(U),g=A(q,2);p(U);var s=A(U,2);je(s,17,()=>r.options,C=>C.value,(C,H)=>{var W=Ti(),ee=k(W),ne=k(ee);{var me=le=>{var we=Ai();f(le,we)},K=z(()=>e(y).has(e(H).value));G(ne,le=>{e(K)&&le(me)})}p(ee);var X=A(ee,2),ce=k(X,!0);p(X),p(W),Q(le=>{ke(ee,1,`inline-flex items-center justify-center shrink-0 w-[14px] h-[14px] rounded border-2 transition-colors duration-100 + ${le??""}`),re(ce,e(H).label)},[()=>e(y).has(e(H).value)?"bg-edf-bleu-moyen border-edf-bleu-moyen text-white":"bg-white border-edf-gris-moyen"]),ie("mousedown",W,le=>{le.stopPropagation(),S(e(H).value)}),f(C,W)}),p(B),tt(B,C=>d(v,C),()=>e(v)),Q(()=>Ge(B,e(l))),ie("mousedown",q,C=>{C.stopPropagation(),w()}),ie("mousedown",g,C=>{C.stopPropagation(),T()}),f(V,B)}})};G(L,I=>{e(o)&&I(j)})}Q(()=>{ke(_,1,`relative inline-flex ${i()??""}`),ye(R,"aria-expanded",e(o)),re(h,e(b)),ke(E,1,`text-muted shrink-0 transition-transform duration-150 ${e(o)?"rotate-180":""}`)}),ie("mousedown",R,I=>{I.stopPropagation(),x()}),f(t,P),Ne()}Be(["mousedown"]);var Fi=M(" ",1),zi=M(''),Ii=M('Loading...'),Oi=M('No folders found'),Hi=M('
                '),ji=M('
                ',1);function Ui(t,r){Me(r,!0);const a=ws();let n=F("keep_latest"),i=F(se(a.keepLast)),o=F(se([])),u=F(se([])),v=F(!0),l=z(()=>e(n)==="keep_folder"||e(n)==="delete_folder"),y=z(()=>[{value:"keep_latest",label:"Keep latest N"},{value:"delete_all",label:"Delete all runs"},...r.cases.length===1?[{value:"keep_folder",label:"Keep specific folders"},{value:"delete_folder",label:"Delete specific folders"}]:[]]),b=z(()=>e(o).map(w=>({value:w,label:w})));un(async()=>{if(r.cases.length===1){try{d(o,await Ea(r.cases),!0)}catch{d(o,[],!0)}d(v,!1)}});async function S(){if(e(l)&&e(u).length===0){await et("Please select at least one run folder.","Missing selection");return}const w={action:e(n)};e(n)==="keep_latest"?(w.keepLast=e(i),ks({keepLast:e(i)})):e(n)==="delete_all"?w.keepLast=0:e(n)==="keep_folder"?w.keepResu=e(u):e(n)==="delete_folder"&&(w.deleteResu=e(u)),at(w)}{const w=x=>{var c=Fi(),m=Y(c);Re(m,{variant:"secondary",onclick:()=>at(null),children:(_,R)=>{Ce();var $=Ie("Cancel");f(_,$)},$$slots:{default:!0}});var P=A(m,2);Re(P,{variant:"primary",onclick:S,children:(_,R)=>{Ce();var $=Ie("Clean");f(_,$)},$$slots:{default:!0}}),f(x,c)};let T=z(()=>r.cases.length),N=z(()=>r.cases.length>1?"s":"");vr(t,{title:"Cleanup Cases",titleId:"clean-dialog-title",get subtitle(){return`${e(T)??""} case${e(N)??""} selected`},footer:w,children:(x,c)=>{var m=ji(),P=Y(m),_=k(P);$e(_,{text:"Action",children:(D,L)=>{st(D,{class:"w-[200px]",get options(){return e(y)},get value(){return e(n)},onchange:j=>d(n,j,!0)})}});var R=A(_,2);{var $=D=>{$e(D,{text:"Keep last",children:(L,j)=>{var I=zi();qe(I),Je(I,()=>e(i),V=>d(i,V)),f(L,I)}})};G(R,D=>{e(n)==="keep_latest"&&D($)})}p(P);var h=A(P,2);{var E=D=>{var L=Hi(),j=k(L);$e(j,{text:"Run folders",children:(I,V)=>{var O=Ke(),B=Y(O);{var U=s=>{var C=Ii();f(s,C)},q=s=>{var C=Oi();f(s,C)},g=s=>{Bt(s,{class:"w-full",get options(){return e(b)},get selected(){return e(u)},onchange:C=>d(u,C,!0),placeholder:"Select folders..."})};G(B,s=>{e(v)?s(U):e(o).length===0?s(q,1):s(g,-1)})}f(I,O)}}),p(L),f(D,L)};G(h,D=>{e(l)&&D(E)})}f(x,m)},$$slots:{footer:!0,default:!0}})}Ne()}function Vi(t,r){Me(r,!0);let a=z(rs);var n=Ke(),i=Y(n);{var o=y=>{$s(y,{get cases(){return e(a).props.cases}})},u=y=>{ci(y,{get cases(){return e(a).props.cases}})},v=y=>{Ui(y,{get cases(){return e(a).props.cases}})},l=y=>{hs(y,{get mode(){return e(a).type},get title(){return e(a).props.title},get message(){return e(a).props.message},get confirmLabel(){return e(a).props.confirmLabel},get confirmVariant(){return e(a).props.confirmVariant},get value(){return e(a).props.value},get placeholder(){return e(a).props.placeholder},get multiline(){return e(a).props.multiline}})};G(i,y=>{e(a).type==="run"?y(o):e(a).type==="restart"?y(u,1):e(a).type==="clean"?y(v,2):(e(a).type==="alert"||e(a).type==="confirm"||e(a).type==="prompt")&&y(l,3)})}f(t,n),Ne()}let ur=F(se([])),Bi=0;function qi(){return e(ur)}function Bn(t,r="success",a=3500){const n=++Bi;d(ur,[...e(ur),{id:n,message:t,variant:r}],!0),setTimeout(()=>Aa(n),a)}function Aa(t){d(ur,e(ur).filter(r=>r.id!==t),!0)}var Ki=M('
                '),Wi=M('
                ');function Gi(t,r){Me(r,!0);let a=z(qi);Xt(t,{children:(n,i)=>{var o=Wi();je(o,21,()=>e(a),u=>u.id,(u,v)=>{var l=Ki(),y=k(l,!0);p(l),Q(()=>{ke(l,1,`pointer-events-auto max-w-[320px] px-4 py-2.5 rounded-md shadow-lg text-sm font-semibold text-white cursor-pointer ${e(v).variant==="success"?"bg-edf-vert-fonce":"bg-edf-orange-fonce"}`),re(y,e(v).message)}),ie("click",l,()=>Aa(e(v).id)),f(u,l)}),p(o),f(n,o)}}),Ne()}Be(["click"]);var Xi=Ot(''),Yi=Ot(''),Qi=M(''),Ji=M(" ",1),Zi=M(" ",1),el=M('');function It(t,r){Me(r,!0);const a=x=>{var c=Qi(),m=k(c);{var P=R=>{var $=Xi();Q(()=>Ge($,`width: ${u()-4}px; height: ${u()-4}px;`)),f(R,$)},_=R=>{var $=Yi();Q(()=>Ge($,`width: ${u()-4}px; height: ${u()-4}px;`)),f(R,$)};G(m,R=>{n()&&!i()?R(P):i()&&R(_,1)})}p(c),Q(()=>{ke(c,1,`inline-flex items-center justify-center rounded border-2 cursor-pointer transition-colors duration-100 shrink-0 + ${o()?"opacity-40 cursor-not-allowed":""} + ${n()||i()?"bg-edf-bleu-moyen border-edf-bleu-moyen text-white":"bg-white border-edf-gris-moyen hover:border-edf-bleu-clair"}`),Ge(c,`width: ${u()??""}px; height: ${u()??""}px;`),ye(c,"aria-checked",i()?"mixed":n()),ye(c,"aria-disabled",o()),ye(c,"tabindex",o()?-1:0)}),ie("click",c,y),ie("keydown",c,b),f(x,c)};let n=fe(r,"checked",3,!1),i=fe(r,"indeterminate",3,!1),o=fe(r,"disabled",3,!1),u=fe(r,"size",3,16),v=fe(r,"label",3,""),l=fe(r,"labelFirst",3,!1);function y(x){var m;if(x.stopPropagation(),o())return;const c=i()?!0:!n();(m=r.onchange)==null||m.call(r,c)}function b(x){(x.key===" "||x.key==="Enter")&&(x.preventDefault(),x.stopPropagation(),y(x))}var S=Ke(),w=Y(S);{var T=x=>{var c=el(),m=k(c);{var P=R=>{var $=Ji(),h=Y($),E=k(h,!0);p(h);var D=A(h);a(D),Q(()=>re(E,v())),f(R,$)},_=R=>{var $=Zi(),h=Y($);a(h);var E=A(h),D=k(E,!0);p(E),Q(()=>re(D,v())),f(R,$)};G(m,R=>{l()?R(P):R(_,-1)})}p(c),ie("click",c,y),ie("keydown",c,b),f(x,c)},N=x=>{a(x)};G(w,x=>{v()?x(T):x(N,-1)})}f(t,S),Ne()}Be(["click","keydown"]);function wn(t,r){try{const a=localStorage.getItem(t);return a===null?r:JSON.parse(a)}catch{return r}}function Dr(t,r){localStorage.setItem(t,JSON.stringify(r))}const tn=new Map;function hr(t,r,a){ft(t),tn.set(t,setInterval(r,a))}function ft(t){const r=tn.get(t);r!==void 0&&(clearInterval(r),tn.delete(t))}const Dt={status:1e3,tail:1e3,plot:3e3,probe:3e3,errors:5e3},tl=["status","plot","probe","tail","errors"],Wr={status:{label:"Status table",min:500},plot:{label:"Residual plots",min:1e3},probe:{label:"Probe plots",min:1e3},tail:{label:"Log tail",min:500},errors:{label:"Recent errors",min:2e3}},ar=wn("csauto_refresh_rates",{});let mt=F(se({status:ar.status??Dt.status,tail:ar.tail??Dt.tail,plot:ar.plot??Dt.plot,probe:ar.probe??Dt.probe,errors:ar.errors??Dt.errors}));function rl(){return e(mt)}function nl(t,r){d(mt,{...e(mt),[t]:r},!0),Dr("csauto_refresh_rates",e(mt))}function al(){return e(mt).status}function qn(){return e(mt).tail}function Kn(){return e(mt).plot}function ol(){return e(mt).probe}function Wn(){return e(mt).errors}const rn=new Set;function pr(t){return rn.add(t),()=>rn.delete(t)}function sl(){rn.forEach(t=>t())}const nn=wn("csauto_autorefresh_enabled",{});function Qt(t){return nn[t]??!0}function Jt(t,r){nn[t]=r,Dr("csauto_autorefresh_enabled",nn)}var il=M(" ",1),ll=M('
                ms
                '),cl=M('
                Telemetry
                '),ul=M('
                API token
                Auto-refresh intervals
                ',1);function dl(t,r){Me(r,!0);let a=F(se(mn())),n=F(se({...rl()})),i=F(!0),o=F(!1);Ee(()=>{Xs().then(y=>{d(i,y.enabled,!0),d(o,!0)}).catch(()=>{d(o,!1)})});function u(y){const{min:b}=Wr[y];let S=e(n)[y];(typeof S!="number"||isNaN(S))&&(S=Dt[y]),d(n,{...e(n),[y]:Math.max(b,Math.round(S))},!0)}function v(y,b){const S=b.target,w=S.value.replace(/[^0-9]/g,""),T=parseInt(w,10);isNaN(T)?w===""&&d(n,{...e(n),[y]:Wr[y].min},!0):d(n,{...e(n),[y]:T},!0),S.value=String(e(n)[y])}function l(){Pa(e(a));for(const y of Object.keys(e(n)))u(y),nl(y,e(n)[y]);e(o)&&Ys(e(i)).catch(()=>{}),r.onClose()}vr(t,{title:"Settings",titleId:"settings-dialog-title",get onCancel(){return r.onClose},onConfirm:l,maxWidth:"400px",portal:!0,footer:b=>{var S=il(),w=Y(S);Re(w,{variant:"secondary",get onclick(){return r.onClose},children:(N,x)=>{Ce();var c=Ie("Cancel");f(N,c)},$$slots:{default:!0}});var T=A(w,2);Re(T,{variant:"primary",onclick:l,children:(N,x)=>{Ce();var c=Ie("Save");f(N,c)},$$slots:{default:!0}}),f(b,S)},children:(b,S)=>{var w=ul(),T=Y(w),N=A(k(T),2);qe(N),p(T);var x=A(T,2),c=k(x),m=A(k(c),2);p(c);var P=A(c,2);je(P,20,()=>tl,$=>$,($,h)=>{const E=z(()=>Wr[h]);var D=ll(),L=k(D),j=k(L),I=k(j,!0);p(j);var V=A(j,2),O=k(V);p(V),p(L);var B=A(L,2),U=k(B);qe(U),Ce(2),p(B),p(D),Q(()=>{re(I,e(E).label),re(O,`min ${e(E).min??""}ms`),gn(U,e(n)[h])}),ie("input",U,q=>v(h,q)),Ze("blur",U,()=>u(h)),f($,D)}),p(P),p(x);var _=A(x,2);{var R=$=>{var h=cl(),E=A(k(h),2);It(E,{get checked(){return e(i)},onchange:D=>d(i,D,!0),label:"Send anonymous usage statistics"}),p(h),f($,h)};G(_,$=>{e(o)&&$(R)})}Je(N,()=>e(a),$=>d(a,$)),ie("click",m,()=>d(n,{...Dt},!0)),f(b,w)},$$slots:{footer:!0,default:!0}}),Ne()}Be(["click","input"]);var fl=M(''),vl=M(' '),gl=M('
                ',1);function hl(t,r){Me(r,!0);let a=z(()=>r.shownCases!==r.totalCases),n=z(Pt),i=F(!1);var o=gl(),u=Y(o),v=k(u),l=k(v);{var y=s=>{var C=fl();Q(H=>{ye(C,"src",H),ye(C,"alt",e(n).solver)},[()=>As(e(n).solver)]),f(s,C)},b=s=>{var C=vl(),H=k(C,!0);p(C),Q(()=>re(H,e(n).solver)),f(s,C)};G(l,s=>{var C;(C=e(n))!=null&&C.logo?s(y):e(n)&&s(b,1)})}p(v);var S=A(v,2),w=k(S),T=k(w),N=k(T);{var x=s=>{var C=Ie();Q(()=>re(C,`${r.shownCases??""}/`)),f(s,C)};G(N,s=>{e(a)&&s(x)})}var c=A(N,1,!0);p(T);var m=A(T,2),P=k(m,!0);p(m),p(w);var _=A(w,2),R=k(_),$=k(R);{var h=s=>{var C=Ie();Q(()=>re(C,`${r.shownRunning??""}/`)),f(s,C)};G($,s=>{e(a)&&s(h)})}var E=A($,1,!0);p(R),Ce(2),p(_);var D=A(_,2),L=k(D),j=k(L);{var I=s=>{var C=Ie();Q(()=>re(C,`${r.shownConverged??""}/`)),f(s,C)};G(j,s=>{e(a)&&s(I)})}var V=A(j,1,!0);p(L),Ce(2),p(D),p(S);var O=A(S,2),B=k(O),U=k(B);Le(U,{get icon(){return Ri},size:18}),p(B),p(O),p(u);var q=A(u,2);{var g=s=>{dl(s,{onClose:()=>d(i,!1)})};G(q,s=>{e(i)&&s(g)})}Q(()=>{re(c,r.totalCases),re(P,r.totalCases===1?"case":"cases"),re(E,r.totalRunning),re(V,r.totalConverged)}),ie("click",B,()=>d(i,!0)),f(t,o),Ne()}Be(["click"]);const pl=""+new URL("../assets/simvia-logo.kLDq7Uoj.svg",import.meta.url).href;var ml=M('
                '),_l=M('

                '),bl=M("
                "),xl=M('
                '),yl=M('
                '),wl=M('
                ');function Ht(t,r){let a=fe(r,"eyebrow",3,""),n=fe(r,"title",3,""),i=fe(r,"wide",3,!1);var o=wl(),u=A(k(o),2);{var v=y=>{var b=yl(),S=k(b);{var w=c=>{var m=Ke(),P=Y(m);ct(P,()=>r.titleSlot),f(c,m)},T=c=>{var m=bl(),P=k(m);{var _=h=>{var E=ml(),D=k(E,!0);p(E),Q(()=>re(D,a())),f(h,E)};G(P,h=>{a()&&h(_)})}var R=A(P,2);{var $=h=>{var E=_l(),D=k(E,!0);p(E),Q(()=>re(D,n())),f(h,E)};G(R,h=>{n()&&h($)})}p(m),f(c,m)};G(S,c=>{r.titleSlot?c(w):c(T,-1)})}var N=A(S,2);{var x=c=>{var m=xl(),P=k(m);ct(P,()=>r.actions),p(m),f(c,m)};G(N,c=>{r.actions&&c(x)})}p(b),f(y,b)};G(u,y=>{(a()||n()||r.titleSlot||r.actions)&&y(v)})}var l=A(u,2);ct(l,()=>r.children),p(o),Q(()=>{ke(o,1,`${i()?"col-span-12":"col-span-6"} bg-card border border-border rounded-[10px] p-[16px_18px_18px] relative overflow-clip animate-rise`),ye(o,"id",r.id)}),f(t,o)}function Zt(t,r){Me(r,!0);let a=fe(r,"checked",15,!0);Ee(()=>{a()?hr(r.name,r.onRefresh,r.intervalMs):ft(r.name)}),dr(()=>ft(r.name)),It(t,{get checked(){return a()},onchange:n=>a(n),size:14,label:"Auto-refresh",labelFirst:!0}),Ne()}var kl=M(" ",1),Cl=M('
              • '),Sl=M(''),Pl=M(' ',1);function Rl(t,r){Me(r,!0);let a=fe(r,"label",3,"More"),n=F(!1),i=F(void 0),o=F(void 0),u=F("");function v(){if(!e(i)||!e(o))return;const P=e(i).getBoundingClientRect(),_=e(o).offsetHeight,R=4,$=window.innerHeight-P.bottom-R,E=$<_&&P.top-R>$?P.top-R-_:P.bottom+R,D=Math.min(P.left,window.innerWidth-180);d(u,`position:fixed; top:${E}px; left:${D}px; min-width:170px; z-index:9999;`)}async function l(){var P,_;d(n,!e(n)),e(n)&&(await St(),v(),(_=(P=e(o))==null?void 0:P.querySelector("button:not(:disabled)"))==null||_.focus({preventScroll:!0}))}function y(){var P,_;d(n,!1),(_=(P=e(i))==null?void 0:P.querySelector("button"))==null||_.focus()}function b(P){P.disabled||(y(),P.onClick())}function S(P){var h,E;if(P.key!=="ArrowDown"&&P.key!=="ArrowUp")return;P.preventDefault();const _=Array.from(((h=e(o))==null?void 0:h.querySelectorAll("button:not(:disabled)"))??[]),R=_.indexOf(document.activeElement),$=P.key==="ArrowDown"?1:_.length-1;(E=_[(R+$)%_.length])==null||E.focus()}function w(P){e(n)&&e(i)&&!e(i).contains(P.target)&&e(o)&&!e(o).contains(P.target)&&d(n,!1)}var T=Pl();Ze("mousedown",ot,w),Ze("keydown",ot,P=>{P.key==="Escape"&&e(n)&&y()}),Ze("scroll",ot,()=>{e(n)&&d(n,!1)});var N=Y(T),x=k(N);Re(x,{variant:"secondary",size:"sm",onclick:l,children:(P,_)=>{var R=kl(),$=Y(R);Le($,{get icon(){return xi}});var h=A($);Q(()=>re(h,` ${a()??""}`)),f(P,R)},$$slots:{default:!0}}),p(N),tt(N,P=>d(i,P),()=>e(i));var c=A(N,2);{var m=P=>{Xt(P,{children:(_,R)=>{var $=Sl();je($,21,()=>r.items,h=>h.label,(h,E)=>{var D=Cl(),L=k(D),j=k(L,!0);p(L),p(D),Q(()=>{L.disabled=e(E).disabled,ye(L,"aria-disabled",e(E).disabled),ke(L,1,`w-full flex items-center gap-2 text-left py-[7px] px-[10px] bg-transparent border border-transparent rounded-md text-[12.5px] text-ink transition-[background] duration-[120ms] ease-in-out disabled:opacity-40 disabled:pointer-events-none ${e(E).disabled?"":"cursor-pointer hover:bg-edf-gris-clair hover:border-border"}`),re(j,e(E).label)}),ie("click",L,()=>b(e(E))),f(h,D)}),p($),tt($,h=>d(o,h),()=>e(o)),Q(()=>Ge($,e(u))),ie("keydown",$,S),f(_,$)}})};G(c,P=>{e(n)&&P(m)})}f(t,T),Ne()}Be(["keydown","click"]);const Ft=[{key:"note",label:"Note"},{key:"nprocs",label:"MPI Ranks"},{key:"nt",label:"Thread Count"},{key:"last_iter",label:"Last Iter"},{key:"duration",label:"Duration"},{key:"last_mod",label:"Last Modified"},{key:"resu_size_mb",label:"Results (MB)"}];let qt=F(se([])),$r=F(se([])),gt=F(se(new Set)),mr=F(""),kn=F(""),Rt=F(se([])),nt=F(se([])),Kt=F(""),Ta=F(!0),El=F(!0),Vt=F(se(wn("csauto_status_views",{}))),Cn=F(se(localStorage.getItem("csauto_status_view_selected")??""));function Fr(){return e(qt)}function Sn(){return e($r)}function jt(){return e(gt)}function Gn(){return e(mr)}function an(){return e(kn)}function $l(){return e(Rt)}function Ml(){return e(Rt).filter(t=>e($r).includes(t))}function Nl(){return e(Rt).filter(t=>Ft.some(r=>r.key===t))}function Al(){return e(nt)}function Tl(){return e(Kt)}function Ll(){return e(Ta)}function Xn(){return e(Vt)}function Dl(){return e(Cn)}function Fl(t){d(qt,t,!0)}function zl(t){const r=e($r).length===0&&t.length>0;d($r,t,!0),r&&e(Rt).length===0&&d(Rt,[...t,...Ft.map(a=>a.key)],!0)}function Il(t){d(mr,t,!0)}function Yn(t){d(Rt,t,!0)}function Ol(t){d(Kt,t,!0)}function Hl(t){d(Ta,t,!0)}function jl(t){d(El,t,!0)}function Pn(t){d(Cn,t,!0),localStorage.setItem("csauto_status_view_selected",t)}function on(t){const r=new Set(e(gt));r.has(t)?r.delete(t):r.add(t),d(gt,r,!0),d(mr,t,!0),d(kn,t,!0)}function La(t){d(gt,new Set([t]),!0),d(mr,t,!0),d(kn,t,!0)}function sn(t,r,a){const n=a.indexOf(t),i=a.indexOf(r);if(n<0||i<0)return;const[o,u]=n{const a=Ul(r);return t.every(n=>a.includes(n))})}function Vl(t){if(t==null||t==="")return"";const r=Number(t);return Number.isFinite(r)?r:String(t).toLowerCase()}function Zn(t,r){var n;if(r==="case_id")return t.case_id;if(r==="status")return t.status??"";if(r==="note")return t.note??"";if(r==="nprocs")return t.nprocs??0;if(r==="nt")return t.nt??0;if(r==="last_iter")return t.last_iter??0;if(r==="duration")return t.duration_s??0;if(r==="last_mod")return t.last_mod??"";if(r==="resu_size_mb")return t.resu_size_mb??0;const a=(n=t.doe)==null?void 0:n[r];return a!==void 0?Vl(a):""}function Bl(t,r){return t===""&&r===""?0:t===""?1:r===""?-1:typeof t=="number"&&typeof r=="number"?t-r:String(t).localeCompare(String(r))}function Fa(){const t=Da();return e(nt).length===0?t:[...t].sort((r,a)=>{for(const n of e(nt)){const i=Zn(r,n.key),o=Zn(a,n.key),u=Bl(i,o);if(u!==0)return n.dir==="asc"?u:-u}return 0})}function Pr(){return Fa().map(t=>t.case_id)}function ql(t,r){const a=e(nt).findIndex(n=>n.key===t);if(r)if(a>=0){const n=[...e(nt)];n[a]={key:t,dir:n[a].dir==="asc"?"desc":"asc"},d(nt,n,!0)}else d(nt,[...e(nt),{key:t,dir:"asc"}],!0);else a>=0&&e(nt).length===1?d(nt,[{key:t,dir:e(nt)[0].dir==="asc"?"desc":"asc"}],!0):d(nt,[{key:t,dir:"asc"}],!0)}function Kl(){return{visibleColumns:[...e(Rt)],search:e(Kt),sorts:e(nt).map(t=>({...t}))}}function Wl(t){d(Rt,[...t.visibleColumns],!0),d(Kt,t.search,!0),d(nt,t.sorts.map(r=>({...r})),!0)}function Gl(t){d(Vt,{...e(Vt),[t]:Kl()},!0),Dr("csauto_status_views",e(Vt)),Pn(t)}function Xl(t){const r={...e(Vt)};delete r[t],d(Vt,r,!0),Dr("csauto_status_views",r),e(Cn)===t&&Pn("")}function wr(){const t=new Set;for(const r of e(qt))e(gt).has(r.case_id)&&t.add((r.status??"").toUpperCase());return t}function ea(){for(const t of e(qt))if(e(gt).has(t.case_id)&&t.resu_size_mb!=null&&t.resu_size_mb>0)return!0;return!1}function Yl(t,r){const a=r.length,n=t.length,i=r.filter(l=>l.status==="RUNNING").length,o=t.filter(l=>l.status==="RUNNING").length,u=r.filter(l=>l.convergence==="converged").length,v=t.filter(l=>l.convergence==="converged").length;return{totalCases:a,shownCases:n,totalRunning:i,shownRunning:o,totalConverged:u,shownConverged:v}}var Ql=M('
                DOE columns
                '),Jl=M('
                ');function Zl(t,r){Me(r,!0);let a=fe(r,"initialName",3,""),n=z(Sn),i=F(se(a())),o=F(se(new Set(r.initialColumns??[...e(n),...Ft.map(O=>O.key)])));function u(O){const B=new Set(e(o));B.has(O)?B.delete(O):B.add(O),d(o,B,!0)}function v(O,B){const U=new Set(e(o));O.forEach(q=>B?U.add(q):U.delete(q)),d(o,U,!0)}function l(){const O=e(i).trim();O&&r.onSave(O,[...e(o)])}function y(O){O.key==="Escape"&&r.onCancel()}function b(O){O.target.dataset.backdrop!==void 0&&r.onCancel()}let S=F(void 0);Ee(()=>{var O,B;(O=e(S))==null||O.focus(),(B=e(S))==null||B.select()});var w=Jl(),T=k(w),N=k(T),x=k(N,!0);p(N);var c=A(N,2),m=A(k(c),2);qe(m),tt(m,O=>d(S,O),()=>e(S)),p(c);var P=A(c,2);{var _=O=>{var B=Ql(),U=k(B),q=A(k(U),2),g=k(q),s=A(g,2);p(q),p(U);var C=A(U,2);je(C,20,()=>e(n),H=>H,(H,W)=>{{let ee=z(()=>e(o).has(W));It(H,{get checked(){return e(ee)},onchange:()=>u(W),size:14,get label(){return W}})}}),p(C),p(B),ie("click",g,()=>v(e(n),!0)),ie("click",s,()=>v(e(n),!1)),f(O,B)};G(P,O=>{e(n).length>0&&O(_)})}var R=A(P,2),$=k(R),h=A(k($),2),E=k(h),D=A(E,2);p(h),p($);var L=A($,2);je(L,21,()=>Ft,O=>O.key,(O,B)=>{{let U=z(()=>e(o).has(e(B).key));It(O,{get checked(){return e(U)},onchange:()=>u(e(B).key),size:14,get label(){return e(B).label}})}}),p(L),p(R);var j=A(R,2),I=k(j);Re(I,{variant:"secondary",get onclick(){return r.onCancel},children:(O,B)=>{Ce();var U=Ie("Cancel");f(O,U)},$$slots:{default:!0}});var V=A(I,2);{let O=z(()=>!e(i).trim());Re(V,{variant:"primary",onclick:l,get disabled(){return e(O)},children:(B,U)=>{Ce();var q=Ie("Save");f(B,q)},$$slots:{default:!0}})}p(j),p(T),p(w),Q(()=>re(x,r.mode==="create"?"New view":"Edit view")),ie("keydown",w,y),ie("click",w,b),Je(m,()=>e(i),O=>d(i,O)),ie("click",E,()=>v(Ft.map(O=>O.key),!0)),ie("click",D,()=>v(Ft.map(O=>O.key),!1)),f(t,w),Ne()}Be(["keydown","click"]);var ec=M('
                ',1);function tc(t,r){Me(r,!0);let a=z(()=>Object.keys(Xn())),n=F(se(Dl())),i=F(!1),o=F("create"),u=z(()=>[{value:"",label:"All columns"},...e(a).map($=>({value:$,label:$}))]);function v($){if(d(n,$,!0),Pn($),$==="")Yn([...Sn(),...Ft.map(h=>h.key)]);else{const h=Xn();h[$]&&Wl(h[$])}}function l(){d(o,"edit"),d(i,!0)}function y(){d(o,"create"),d(i,!0)}function b($,h){Yn(h),e(o)==="edit"&&e(n)&&$!==e(n)&&Xl(e(n)),Gl($),d(n,$,!0),d(i,!1)}function S(){d(i,!1)}var w=ec(),T=Y(w),N=k(T);st(N,{class:"w-[140px]",get options(){return e(u)},get value(){return e(n)},onchange:v});var x=A(N,2),c=k(x);Le(c,{get icon(){return Ci},size:14}),p(x);var m=A(x,2),P=k(m);Le(P,{get icon(){return Si},size:14}),p(m),p(T);var _=A(T,2);{var R=$=>{Xt($,{children:(h,E)=>{{let D=z(()=>e(o)==="edit"?e(n):""),L=z($l);Zl(h,{get mode(){return e(o)},get initialName(){return e(D)},get initialColumns(){return e(L)},onSave:b,onCancel:S})}}})};G(_,$=>{e(i)&&$(R)})}ie("click",x,l),ie("click",m,y),f(t,w),Ne()}Be(["click"]);var rc=M('
                '),nc=M(""),ac=M(' '),oc=M(' '),sc=M('
                '),ic=M(" "),lc=M(''),cc=M(''),uc=M(" Open GUI",1),dc=M(""),fc=M(" "),vc=M(""),gc=M('
                ');function hc(t,r){Me(r,!0);let a=z(()=>r.rows.length>0&&r.rows.every(g=>e(y).has(g.case_id))),n=z(()=>r.rows.some(g=>e(y).has(g.case_id))),i=z(()=>e(n)&&!e(a)),o=z(Ml),u=z(()=>new Set(Nl())),v=z(Al),l=z(Ll),y=z(jt),b=z(()=>{const g=[{key:"_select",label:"",kind:"meta",sticky:"left"},{key:"case_id",label:"Case",kind:"meta",sticky:"left"},{key:"status",label:"Status",kind:"meta",sticky:"left"},...e(u).has("note")?[{key:"note",label:"Note",kind:"meta"}]:[]],s=e(o).map(ee=>({key:ee,label:ee,kind:"doe"})),H=[{key:"nprocs",label:"MPI Ranks",kind:"calc"},{key:"nt",label:"Thread Count",kind:"calc"},{key:"last_iter",label:"Last Iter",kind:"calc"},{key:"duration",label:"Duration",kind:"calc"},{key:"last_mod",label:"Last Modified",kind:"calc"},{key:"resu_size_mb",label:"Results (MB)",kind:"calc"}].filter(ee=>e(u).has(ee.key)),W=Zr("gui")?[{key:"_actions",label:"",kind:"meta",sticky:"right"}]:[];return[...g,...s,...H,...W]});function S(g){const s=e(v).findIndex(H=>H.key===g);if(s<0)return"";const C=e(v)[s].dir==="asc"?"▲":"▼";return e(v).length>1?`${C}${s+1}`:C}function w(g,s){g!=="_actions"&&ql(g,s.ctrlKey||s.metaKey)}function T(g,s){s.shiftKey?sn(an()||g,g,Pr()):s.ctrlKey||s.metaKey?on(g):La(g)}function N(g,s){var H;const C=((H=g.status)==null?void 0:H.toUpperCase())??"";C!=="DONE"&&C!=="FAILED"||(s.preventDefault(),r.onContextMenu(g.case_id,s.clientX,s.clientY,g.convergence??""))}async function x(g){const s=g.note??"",C=await pn("Case note:",s,`Note: ${g.case_id}`,"",!0);if(C!==null)try{await Ks(g.case_id,C)}catch(H){await et(`Failed to set note: ${H instanceof Error?H.message:H}`,"Error")}}async function c(g){try{await Gs(g)}catch(s){await et(`Failed to open GUI: ${s instanceof Error?s.message:s}`,"Error")}}function m(g,s){const C=(g==null?void 0:g.toUpperCase())??"";return(C==="DONE"||C==="FAILED")&&s==="converged"?"CONVERGED":(C==="DONE"||C==="FAILED")&&s==="not_converged"?"NOT CONVERGED":C}function P(g,s){const C=(g==null?void 0:g.toUpperCase())??"";return(C==="DONE"||C==="FAILED")&&s==="converged"?"status-converged":(C==="DONE"||C==="FAILED")&&s==="not_converged"?"status-not-converged":C==="RUNNING"?"status-running":C==="DONE"?"status-done":C==="FAILED"?"status-failed":C==="PREPARED"?"status-prepared":"status-unknown"}function _(g){return e(y).has(g.case_id)?"row-selected":""}function R(g,s){var C;return s.key==="case_id"?g.case_id:s.key==="nprocs"?g.nprocs!=null?String(g.nprocs):"":s.key==="nt"?g.nt!=null?String(g.nt):"":s.key==="last_iter"?g.last_iter!=null?String(g.last_iter):"":s.key==="duration"?g.duration??"":s.key==="last_mod"?$(g.last_mod):s.key==="resu_size_mb"?g.resu_size_mb!=null?String(g.resu_size_mb):"":s.kind==="doe"?((C=g.doe)==null?void 0:C[s.key])!=null&&String(g.doe[s.key])!==""?String(g.doe[s.key]):"-":""}function $(g){if(!g)return"";try{const s=new Date(g),C=new Date,H=s.toDateString()===C.toDateString(),W=new Date(C);W.setDate(W.getDate()-1);const ee=s.toDateString()===W.toDateString(),ne=s.toLocaleTimeString([],{hour:"2-digit",minute:"2-digit"});return H?`Today ${ne}`:ee?`Yesterday ${ne}`:s.toLocaleDateString([],{month:"short",day:"numeric"})+` ${ne}`}catch{return g}}let h=F(se({})),E=F(void 0);Ee(()=>{e(l),e(b),r.rows,!(!e(E)||!e(l))&&St().then(()=>{if(!e(E))return;const g=Array.from(e(E).querySelectorAll("thead th.sticky-left")),s={};let C=0;g.forEach(H=>{const W=H.dataset.colKey??"";s[W]=C,C+=H.getBoundingClientRect().width}),d(h,s,!0)})});function D(g,s,C){const H=C&&g.key!=="_select"&&g.key!=="_actions"?["status-sortable"]:[];if(!C&&g.key==="case_id"&&H.push("case-id"),g.kind==="doe"&&H.push("status-col-doe"),!C&&g.key==="note"&&H.push("max-w-[140px] whitespace-nowrap overflow-hidden text-ellipsis cursor-pointer hover:underline hover:decoration-dotted hover:underline-offset-2"),e(l)&&g.sticky==="left"&&H.push("sticky-left"),e(l)&&g.sticky==="right"&&H.push("sticky-right"),e(l)&&g.sticky==="left"){const W=e(b)[s+1];(!W||W.sticky!=="left")&&H.push("sticky-divider")}if(e(l)&&g.sticky==="right"){const W=e(b)[s-1];(!W||W.sticky!=="right")&&H.push("sticky-divider")}return H.join(" ")}function L(g,s){return D(g,s,!0)}function j(g,s){return D(g,s,!1)}function I(g){return!e(l)||!g.sticky?"":g.sticky==="right"?"position:sticky;right:0;":g.sticky==="left"&&g.key in e(h)?`position:sticky;left:${e(h)[g.key]}px;`:""}var V=gc(),O=k(V),B=k(O),U=k(B);je(U,23,()=>e(b),g=>g.key,(g,s,C)=>{var H=Ke(),W=Y(H);{var ee=K=>{var X=rc(),ce=k(X),le=k(ce);It(le,{get checked(){return e(a)},get indeterminate(){return e(i)},get onchange(){return r.onToggleAll},size:14}),p(ce),p(X),Q((we,he)=>{ke(X,1,`${we??""} !px-2.5 !py-0 w-9`),ye(X,"data-col-key",e(s).key),Ge(X,he)},[()=>L(e(s),e(C)),()=>I(e(s))]),f(K,X)},ne=K=>{var X=nc();Q((ce,le)=>{ke(X,1,ce),ye(X,"data-col-key",e(s).key),Ge(X,le)},[()=>dt(L(e(s),e(C))),()=>I(e(s))]),f(K,X)},me=K=>{var X=oc(),ce=k(X),le=A(ce);{var we=Z=>{var _e=ac(),Se=k(_e,!0);p(_e),Q(Pe=>re(Se,Pe),[()=>S(e(s).key)]),f(Z,_e)},he=z(()=>S(e(s).key));G(le,Z=>{e(he)&&Z(we)})}p(X),Q((Z,_e)=>{ke(X,1,Z),ye(X,"data-col-key",e(s).key),Ge(X,_e),re(ce,`${e(s).label??""} `)},[()=>dt(L(e(s),e(C))),()=>I(e(s))]),ie("click",X,Z=>w(e(s).key,Z)),ie("keydown",X,Z=>{(Z.key==="Enter"||Z.key===" ")&&(Z.preventDefault(),w(e(s).key,Z))}),f(K,X)};G(W,K=>{e(s).key==="_select"?K(ee):e(s).key==="_actions"?K(ne,1):K(me,-1)})}f(g,H)}),p(U),p(B);var q=A(B);je(q,21,()=>r.rows,g=>g.case_id,(g,s)=>{var C=vc();je(C,23,()=>e(b),H=>H.key,(H,W,ee)=>{var ne=Ke(),me=Y(ne);{var K=he=>{var Z=sc(),_e=k(Z),Se=k(_e);{let Pe=z(()=>e(y).has(e(s).case_id));It(Se,{get checked(){return e(Pe)},onchange:()=>r.onToggleRow(e(s).case_id),size:14})}p(_e),p(Z),Q((Pe,ge)=>{ke(Z,1,`${Pe??""} !px-2.5 !py-0 w-9`),ye(Z,"data-col-key",e(W).key),Ge(Z,ge)},[()=>j(e(W),e(ee)),()=>I(e(W))]),f(he,Z)},X=he=>{var Z=ic(),_e=k(Z),Se=k(_e,!0);p(_e),p(Z),Q((Pe,ge,De,be)=>{ke(Z,1,Pe),ye(Z,"data-col-key",e(W).key),Ge(Z,ge),ke(_e,1,`status-pill ${De??""}`),re(Se,be)},[()=>dt(j(e(W),e(ee))),()=>I(e(W)),()=>P(e(s).status,e(s).convergence),()=>m(e(s).status,e(s).convergence)]),f(he,Z)},ce=he=>{var Z=cc(),_e=k(Z);{var Se=ge=>{var De=Ie();Q(()=>re(De,e(s).note)),f(ge,De)},Pe=ge=>{var De=lc(),be=k(De);Le(be,{get icon(){return ki},size:12}),p(De),f(ge,De)};G(_e,ge=>{e(s).note?ge(Se):ge(Pe,-1)})}p(Z),Q((ge,De)=>{ke(Z,1,ge),ye(Z,"data-col-key",e(W).key),Ge(Z,De),ye(Z,"title",e(s).note||"Add note")},[()=>dt(j(e(W),e(ee))),()=>I(e(W))]),ie("click",Z,ge=>{ge.stopPropagation(),x(e(s))}),ie("keydown",Z,ge=>{(ge.key==="Enter"||ge.key===" ")&&(ge.preventDefault(),ge.stopPropagation(),x(e(s)))}),f(he,Z)},le=he=>{var Z=dc(),_e=k(Z);Re(_e,{variant:"primary",size:"sm",onclick:Se=>{Se.stopPropagation(),c(e(s).case_id)},children:(Se,Pe)=>{var ge=uc(),De=Y(ge);Le(De,{get icon(){return yi},size:12}),Ce(),f(Se,ge)},$$slots:{default:!0}}),p(Z),Q((Se,Pe)=>{ke(Z,1,Se),ye(Z,"data-col-key",e(W).key),Ge(Z,Pe)},[()=>dt(j(e(W),e(ee))),()=>I(e(W))]),f(he,Z)},we=he=>{var Z=fc(),_e=k(Z,!0);p(Z),Q((Se,Pe,ge)=>{ke(Z,1,Se),ye(Z,"data-col-key",e(W).key),Ge(Z,Pe),re(_e,ge)},[()=>dt(j(e(W),e(ee))),()=>I(e(W)),()=>R(e(s),e(W))]),f(he,Z)};G(me,he=>{e(W).key==="_select"?he(K):e(W).key==="status"?he(X,1):e(W).key==="note"?he(ce,2):e(W).key==="_actions"?he(le,3):he(we,-1)})}f(H,ne)}),p(C),Q(H=>ke(C,1,H),[()=>dt(_(e(s)))]),ie("click",C,H=>T(e(s).case_id,H)),ie("contextmenu",C,H=>N(e(s),H)),f(g,C)}),p(q),p(O),tt(O,g=>d(E,g),()=>e(E)),p(V),Q(()=>ke(V,1,`table-wrap ${e(l)?"sticky-enabled":""}`)),f(t,V),Ne()}Be(["click","keydown","contextmenu"]);var pc=M('
                ');function mc(t,r){Me(r,!0);let a=z(()=>{const w=Math.min(r.x,window.innerWidth-180),T=Math.min(r.y,window.innerHeight-120);return`left: ${w}px; top: ${T}px;`});async function n(w){try{for(const T of r.cases)await Ws(T,w)}catch(T){console.error("Failed to set convergence:",T)}r.onClose()}const i=r.cases.length>1?` (${r.cases.length})`:"";var o=pc();Ze("keydown",ot,w=>{w.key==="Escape"&&r.onClose()});var u=k(o),v=k(u);p(u);var l=A(u,2),y=k(l);p(l);var b=A(l,2),S=k(b);p(b),p(o),Q(()=>{Ge(o,e(a)),ke(u,1,`w-full text-left py-[7px] px-[10px] bg-transparent border border-transparent rounded-md text-[12.5px] cursor-pointer transition-[background] duration-[120ms] ease-in-out hover:bg-edf-gris-clair hover:border-border ${r.currentValue==="converged"?"is-active":""}`),re(v,`Mark Converged${i}`),ke(l,1,`w-full text-left py-[7px] px-[10px] bg-transparent border border-transparent rounded-md text-[12.5px] cursor-pointer transition-[background] duration-[120ms] ease-in-out hover:bg-edf-gris-clair hover:border-border ${r.currentValue==="not_converged"?"is-active":""}`),re(y,`Mark Not Converged${i}`),ke(b,1,`w-full text-left py-[7px] px-[10px] bg-transparent border border-transparent rounded-md text-[12.5px] cursor-pointer transition-[background] duration-[120ms] ease-in-out hover:bg-edf-gris-clair hover:border-border ${r.currentValue===""?"is-active":""}`),re(S,`Clear Mark${i}`)}),ie("click",u,()=>n("converged")),ie("click",l,()=>n("not_converged")),ie("click",b,()=>n("")),f(t,o),Ne()}Be(["click"]);var _c=M(" Refresh",1),bc=M(" ",1),xc=M(" Run",1),yc=M(" Restart",1),wc=M(" Kill",1),kc=M(" Clean",1),Cc=M('
                ',1),Sc=M('
                ',1);function Pc(t,r){Me(r,!0);function a(){return[...jt()]}async function n(){const g=a();if(!g.length)return;const s=await ns(g);if(s)try{await Un({cases:g,n:s.n,nt:s.nt,maxParallel:s.maxParallel}),r.onRefresh()}catch(C){await et(`Run failed: ${C instanceof Error?C.message:C}`,"Error")}}async function i(){const g=a();if(!g.length)return;const s=await as(g);if(s)try{await Un({cases:g,...s,restart:!0}),r.onRefresh()}catch(C){await et(`Restart failed: ${C instanceof Error?C.message:C}`,"Error")}}async function o(){const g=a();if(!(!g.length||!await Hn(`Kill ${g.length} case${g.length>1?"s":""}?`,"Confirm Kill","Kill","danger")))try{await Vs(g),r.onRefresh()}catch(C){await et(`Kill failed: ${C instanceof Error?C.message:C}`,"Error")}}async function u(g){const s=new Set(Fr().filter(ee=>{var ne;return((ne=ee.status)==null?void 0:ne.toUpperCase())==="RUNNING"}).map(ee=>ee.case_id)),C=a().filter(ee=>s.has(ee));if(!C.length)return;const H=`${C.length} case${C.length>1?"s":""}`;let W=null;if(g.value_label){const ee=await pn(`${g.value_label} for ${H}:`,"",g.label);if(ee===null)return;W=Number(ee.trim().replace(",","."));const ne=Ma(g,W);if(ne){await et(ne,"Invalid value");return}}else if(!await Hn(`${g.label} for ${H}?`,g.label,g.label,"warning"))return;try{await Bs({cases:C,action:g.name,value:W}),r.onRefresh(),Bn(`${g.label} requested for ${H}`)}catch(ee){await et(`${g.label} failed: ${ee instanceof Error?ee.message:ee}`,"Error")}}async function v(){var C;const g=a();if(!g.length)return;const s=await os(g);if(s)try{const H=await qs({cases:g,keepLast:s.keepLast,keepResu:s.keepResu,deleteResu:s.deleteResu,pruneResu:!0});(C=H.skipped_active)!=null&&C.length&&Bn(`Skipped running cases: ${H.skipped_active.join(", ")}`),r.onRefresh(),sl()}catch(H){await et(`Cleanup failed: ${H instanceof Error?H.message:H}`,"Error")}}function l(){const g=Pr();g.length>0&&g.every(C=>jt().has(C))?Jn():Qn(g)}function y(g){on(g)}let b=F(se(Qt("status")));Ee(()=>{Jt("status",e(b))}),Hl(!0);let S=z(()=>{const g=wr();return g.size>0&&[...g].some(s=>s==="PREPARED"||s==="DONE"||s==="FAILED")}),w=z(()=>{if(!Zr("restart"))return!1;const g=wr();return g.size>0&&[...g].some(s=>s==="DONE"||s==="FAILED")&&ea()}),T=z(()=>{const g=wr();return g.size>0&&g.has("RUNNING")}),N=z(()=>wr().has("RUNNING")),x=z(()=>{var g;return(((g=Pt())==null?void 0:g.control_actions)??[]).map(s=>({label:s.label,onClick:()=>u(s),disabled:!e(N)}))}),c=z(ea),m=F(se(Tl())),P=null;function _(){P&&clearTimeout(P),P=setTimeout(()=>{Ol(e(m))},200)}Ee(()=>jl(e(b)));let R=F(!1),$=F(0),h=F(0),E=F(se([])),D=F("");function L(g,s,C,H){d(E,jt().has(g)?[...jt()]:[g],!0),d(D,H,!0),d($,s,!0),d(h,C,!0),d(R,!0)}function j(){d(R,!1)}function I(g){const s=Pr();if(s.length){if(g.key==="Escape"){Jn(),j();return}if((g.ctrlKey||g.metaKey)&&g.key==="a"){g.preventDefault(),Qn(s);return}if(g.key==="ArrowDown"||g.key==="ArrowUp"){g.preventDefault();const C=g.key==="ArrowDown"?1:-1,H=Gn(),W=s.indexOf(H),ee=Math.max(0,Math.min(s.length-1,W+C)),ne=s[ee];g.shiftKey?sn(an()||s[0],ne,s):La(ne),Il(ne);return}if(g.key===" "){g.preventDefault();const C=Gn();C&&(g.shiftKey?sn(an()||C,C,Pr()):on(C))}}}var V=Sc();Ze("click",ot,j),Ze("scroll",ot,j);var O=Y(V),B=k(O);Ht(B,{eyebrow:"Overview",title:"Status",wide:!0,id:"status-card-shell",actions:s=>{var C=bc(),H=Y(C);{let ne=z(al);Zt(H,{name:"status",get intervalMs(){return e(ne)},get onRefresh(){return r.onRefresh},get checked(){return e(b)},set checked(me){d(b,me,!0)}})}var W=A(H,2);{var ee=ne=>{Re(ne,{variant:"primary",onclick:()=>r.onRefresh(),children:(me,K)=>{var X=_c(),ce=Y(X);Le(ce,{get icon(){return Yt}}),Ce(),f(me,X)},$$slots:{default:!0}})};G(W,ne=>{e(b)||ne(ee)})}f(s,C)},children:(s,C)=>{var H=Cc(),W=Y(H),ee=k(W),ne=k(ee);qe(ne);var me=A(ne,2);tc(me,{}),p(ee);var K=A(ee,2),X=k(K),ce=k(X);p(X);var le=A(X,2);{let be=z(()=>!e(S));Re(le,{variant:"run",size:"sm",onclick:n,get disabled(){return e(be)},children:(Oe,Fe)=>{var oe=xc(),ue=Y(oe);Le(ue,{get icon(){return Na}}),Ce(),f(Oe,oe)},$$slots:{default:!0}})}var we=A(le,2);{var he=be=>{{let Oe=z(()=>!e(w));Re(be,{variant:"warning",size:"sm",onclick:i,get disabled(){return e(Oe)},children:(Fe,oe)=>{var ue=yc(),He=Y(ue);Le(He,{get icon(){return Pi}}),Ce(),f(Fe,ue)},$$slots:{default:!0}})}},Z=z(()=>Zr("restart"));G(we,be=>{e(Z)&&be(he)})}var _e=A(we,2);{var Se=be=>{Rl(be,{label:"Control",get items(){return e(x)}})};G(_e,be=>{e(x).length>0&&be(Se)})}var Pe=A(_e,2);{let be=z(()=>!e(T));Re(Pe,{variant:"danger",size:"sm",onclick:o,get disabled(){return e(be)},children:(Oe,Fe)=>{var oe=wc(),ue=Y(oe);Le(ue,{get icon(){return bi}}),Ce(),f(Oe,oe)},$$slots:{default:!0}})}var ge=A(Pe,2);{let be=z(()=>!e(c));Re(ge,{variant:"secondary",size:"sm",onclick:v,get disabled(){return e(be)},children:(Oe,Fe)=>{var oe=kc(),ue=Y(oe);Le(ue,{get icon(){return Ei}}),Ce(),f(Oe,oe)},$$slots:{default:!0}})}p(K),p(W);var De=A(W,2);{let be=z(Fa);hc(De,{get rows(){return e(be)},onContextMenu:L,onToggleAll:l,onToggleRow:y})}Q(be=>re(ce,`${be??""} selected`),[()=>jt().size]),ie("input",ne,_),Je(ne,()=>e(m),be=>d(m,be)),f(s,H)},$$slots:{actions:!0,default:!0}}),p(O);var U=A(O,2);{var q=g=>{mc(g,{get cases(){return e(E)},get x(){return e($)},get y(){return e(h)},get currentValue(){return e(D)},onClose:j})};G(U,g=>{e(R)&&g(q)})}ie("keydown",O,I),f(t,V),Ne()}Be(["keydown","input"]);var Rc=M('
                ');function Wt(t,r){var a=Rc(),n=k(a);ct(n,()=>r.children),p(a),f(t,a)}var Ec=M(''),$c=M(" ",1);function Rn(t,r){Me(r,!0);let a=fe(r,"columnLabel",3,"Columns"),n=fe(r,"xMinLabel",3,"Iter min"),i=z(()=>xn(r.allCases)),o=z(()=>r.columns.map(l=>({value:l,label:l}))),u=[{value:"zero",label:"Zero"},{value:"restart",label:"Restart start"},{value:"custom",label:"Custom"}];function v(l){r.onXMinChange(Number(l.target.value)||0)}Wt(t,{children:(l,y)=>{var b=$c(),S=Y(b);$e(S,{text:"Cases",children:(R,$)=>{Bt(R,{class:"w-[160px]",get options(){return e(i)},get selected(){return r.selectedCases},get onchange(){return r.onCasesChange},placeholder:"Select cases..."})}});var w=A(S,2);{var T=R=>{var $=Ke(),h=Y($);ct(h,()=>r.middleSlot),f(R,$)};G(w,R=>{r.middleSlot&&R(T)})}var N=A(w,2);$e(N,{get text(){return a()},children:(R,$)=>{Bt(R,{class:"w-[160px]",get options(){return e(o)},get selected(){return r.selectedColumns},get onchange(){return r.onColumnsChange},placeholder:"Select..."})}});var x=A(N,2);$e(x,{text:"Start from",children:(R,$)=>{st(R,{class:"w-[140px]",get options(){return u},get value(){return r.startFrom},onchange:h=>r.onStartFromChange(h)})}});var c=A(x,2);{var m=R=>{$e(R,{get text(){return n()},children:($,h)=>{var E=Ec();qe(E),Q(()=>gn(E,r.xMin)),ie("input",E,v),f($,E)}})};G(c,R=>{r.startFrom==="custom"&&R(m)})}var P=A(c,2);{var _=R=>{var $=Ke(),h=Y($);ct(h,()=>r.extraSlot),f(R,$)};G(P,R=>{r.extraSlot&&R(_)})}f(l,b)}}),Ne()}Be(["input"]);var Mc=M('
                '),Nc=M('
                ');function Gt(t,r){let a=fe(r,"emptyMessage",3,"");var n=Nc(),i=k(n);{var o=v=>{var l=Ke(),y=Y(l);Tr(y,()=>r.svgHtml),f(v,l)},u=v=>{var l=Mc(),y=k(l),b=k(y,!0);p(y),p(l),Q(()=>re(b,a()||"No data to display.")),f(v,l)};G(i,v=>{r.svgHtml?v(o):v(u,-1)})}p(n),Q(()=>ye(n,"id",r.id)),f(t,n)}async function En(t,r="plot.png"){const a=document.getElementById(t),n=a==null?void 0:a.querySelector("svg");if(!n)return;const{width:i,height:o}=Ac(n),u=window.devicePixelRatio||1,v=document.createElement("canvas");v.width=i*u,v.height=o*u;const l=v.getContext("2d");if(!l)return;l.scale(u,u);const y=new XMLSerializer().serializeToString(n),b=new Blob([y],{type:"image/svg+xml;charset=utf-8"}),S=URL.createObjectURL(b),w=new Image;w.width=i,w.height=o,await new Promise((N,x)=>{w.onload=()=>{l.drawImage(w,0,0,i,o),URL.revokeObjectURL(S),N()},w.onerror=x,w.src=S});const T=await new Promise(N=>v.toBlob(N,"image/png"));T&&await Ia(T,Tc(r))}function _r(t,r,a="png"){const n=r.length<=3?r.join("_"):`${r.length}_cases`,i=new Date().toISOString().replace(/[:.]/g,"-").slice(0,19);return Lc(`${t}_${n}_${i}.${a}`)}async function za(t,r){const a=new Blob([t],{type:"text/csv;charset=utf-8"});await Ia(a,r)}function Ac(t){const r=t.getAttribute("viewBox");if(r){const a=r.split(/[\s,]+/).map(Number);if(a.length===4)return{width:a[2],height:a[3]}}return{width:t.width.baseVal.value||900,height:t.height.baseVal.value||500}}async function Ia(t,r){if("showSaveFilePicker"in window)try{const o=await(await window.showSaveFilePicker({suggestedName:r,types:[{description:t.type.startsWith("image/")?"Image":"File",accept:{[t.type]:[`.${r.split(".").pop()}`]}}]})).createWritable();await o.write(t),await o.close();return}catch(i){if((i==null?void 0:i.name)==="AbortError")return}const a=URL.createObjectURL(t),n=document.createElement("a");n.href=a,n.download=r,document.body.appendChild(n),n.click(),document.body.removeChild(n),URL.revokeObjectURL(a)}function Tc(t){return t.endsWith(".png")?t:`${t}.png`}function Lc(t){return t.replace(/[^a-zA-Z0-9._-]/g,"_")}let Oa=F(se([])),Ha=F(se([])),ja=F(se([])),Ua=F("zero"),Va=F(0),Ba=F(""),Dc=F(!0);function Fc(){return{selectedCases:e(Oa),columns:e(Ha),selectedColumns:e(ja),startFrom:e(Ua),iterMin:e(Va),svgHtml:e(Ba),autoRefresh:e(Dc)}}function ta(t){d(Oa,t,!0)}function zc(t){d(Ha,t,!0)}function Gr(t){d(ja,t,!0)}function Ic(t){d(Ua,t,!0)}function Oc(t){d(Va,t,!0)}function kr(t){d(Ba,t,!0)}var Hc=M(" Refresh",1),jc=M(" ",1),Uc=M(" Download as PNG",1),Vc=M('
                '),Bc=M('
                ',1),qc=M('
                '),Kc=M('

                '),Wc=M(" ",1);function Gc(t,r){Me(r,!0);let a=z(Fc),n=F("");async function i(){var T;if(e(a).selectedCases.length)try{const N=(await Ls(e(a).selectedCases)).filter(x=>x!=="iteration");if(d(n,""),zc(N),N.length===0){Gr([]),kr("");return}if(e(a).selectedColumns.length===0){const x=(((T=Pt())==null?void 0:T.default_residual_columns)??[]).filter(c=>N.includes(c));Gr(x.length>0?x:N.slice(0,2))}}catch(N){d(n,"Failed to load residual columns"),console.error("Failed to load residual columns:",N)}}async function o(){if(e(a).selectedCases.length&&!((e(a).columns.length===0||e(a).selectedColumns.length===0)&&(await i(),!e(a).selectedColumns.length)))try{let T=0,N=!0;if(e(a).startFrom==="restart"){const c=await Ra(e(a).selectedCases),m=Object.values(c.origins).map(P=>P.iteration).filter(P=>P!==void 0&&Number.isFinite(P));T=m.length>0?Math.min(...m):0}else e(a).startFrom==="custom"&&(T=e(a).iterMin);const x=await Ds(e(a).selectedCases,e(a).selectedColumns,{xMin:T,includeHistory:N});d(n,""),x&&kr(x)}catch(T){d(n,"Failed to load residual plot"),console.error("Failed to load residual plot:",T)}}function u(T){if(ta(T),T.length===0){kr("");return}i(),o()}function v(T){if(Gr(T),T.length===0){kr("");return}o()}function l(T){Ic(T),o()}function y(T){Oc(T),o()}let b=F(se(Qt("plot")));Ee(()=>{Jt("plot",e(b))}),Ee(()=>{e(b)?hr("residualPlot",o,Kn()):ft("residualPlot")});let S=!1;Ee(()=>{r.allCases.length>0&&!S&&(S=!0,ta([...r.allCases]),i().then(()=>o()))});const w=pr(()=>{S&&i().then(()=>o())});dr(()=>{ft("residualPlot"),w()}),Ht(t,{eyebrow:"Diagnostics",title:"Residuals Plot",wide:!0,actions:N=>{var x=jc(),c=Y(x);{let _=z(Kn);Zt(c,{name:"residualPlot",get intervalMs(){return e(_)},onRefresh:o,get checked(){return e(b)},set checked(R){d(b,R,!0)}})}var m=A(c,2);{var P=_=>{Re(_,{variant:"primary",onclick:o,children:(R,$)=>{var h=Hc(),E=Y(h);Le(E,{get icon(){return Yt}}),Ce(),f(R,h)},$$slots:{default:!0}})};G(m,_=>{e(b)||_(P)})}f(N,x)},children:(N,x)=>{var c=Wc(),m=Y(c);{var P=h=>{const E=V=>{var O=Vc(),B=k(O);{let U=z(()=>!e(a).svgHtml);Re(B,{variant:"secondary",size:"sm",onclick:()=>En("plot-holder",_r("residuals",e(a).selectedCases)),get disabled(){return e(U)},children:(q,g)=>{var s=Uc(),C=Y(s);Le(C,{get icon(){return gr}}),Ce(),f(q,s)},$$slots:{default:!0}})}p(O),f(V,O)};var D=Bc(),L=Y(D);Rn(L,{prefix:"plot",get allCases(){return r.allCases},get selectedCases(){return e(a).selectedCases},onCasesChange:u,columnLabel:"Variables",get columns(){return e(a).columns},get selectedColumns(){return e(a).selectedColumns},onColumnsChange:v,get startFrom(){return e(a).startFrom},onStartFromChange:l,xMinLabel:"Iter min",get xMin(){return e(a).iterMin},onXMinChange:y,get extraSlot(){return E}});var j=A(L,2),I=k(j);{let V=z(()=>e(a).selectedCases.length===0?"Please select at least one case.":e(a).columns.length===0?"No residuals for the selected cases yet.":e(a).selectedColumns.length===0?"Please select at least one variable.":"No data to display.");Gt(I,{id:"plot-holder",get svgHtml(){return e(a).svgHtml},get emptyMessage(){return e(V)}})}p(j),f(h,D)},_=h=>{var E=qc(),D=k(E);Gt(D,{id:"plot-holder",svgHtml:"",emptyMessage:"No data available. Please run a simulation first."}),p(E),f(h,E)};G(m,h=>{r.allCases.length>0?h(P):h(_,-1)})}var R=A(m,2);{var $=h=>{var E=Kc(),D=k(E,!0);p(E),Q(()=>re(D,e(n))),f(h,E)};G(R,h=>{e(n)&&h($)})}f(N,c)},$$slots:{actions:!0,default:!0}}),Ne()}function qa(t){const{scope:r,getState:a,setState:n,getAxis:i}=t;async function o(){const S=a();if(S.selectedCases.length)try{let w=await Jr(S.selectedCases,r);if(t.filterFiles&&(w=t.filterFiles(w)),n({files:w}),w.length===0){n({file:"",columns:[],selectedColumns:[],positionText:"",svgHtml:""});return}(!S.file||!w.includes(S.file))&&(n({file:w[0]}),await u())}catch(w){console.error(`Failed to load ${r} files:`,w)}}async function u(){const S=a();if(!(!S.selectedCases.length||!S.file))try{const w=await Os(S.selectedCases,[S.file]),T=t.filterColumns?t.filterColumns(w):w;t.onColumnsLoaded?t.onColumnsLoaded(w):n({columns:T});const N=a();if(N.columns.length===0){n({selectedColumns:[],positionText:"",svgHtml:""});return}N.selectedColumns.length===0&&n({selectedColumns:[N.columns[0]]})}catch(w){console.error(`Failed to load ${r} columns:`,w)}}async function v(){let S=a();if(S.selectedCases.length){if(await o(),S=a(),!S.file){n({positionText:"",svgHtml:""});return}if((S.columns.length===0||S.selectedColumns.length===0)&&(await u(),S=a(),!S.selectedColumns.length)){n({positionText:"",svgHtml:""});return}try{let w;const T=a();if(T.startFrom==="restart"){const x=await Ra(T.selectedCases),c=i().toLowerCase(),m=c==="t"||c==="time"?"time":"iteration",P=Object.values(x.origins).map(_=>_[m]).filter(_=>_!==void 0&&Number.isFinite(_));w=P.length>0?Math.min(...P):void 0}else T.startFrom==="custom"&&(w=T.xMin);const N=await js({cases:T.selectedCases,probes:[T.file],columns:T.selectedColumns,axis:i(),timeMin:typeof w=="number"?w:void 0,xMin:w,includeHistory:!0});N&&n({svgHtml:N})}catch(w){console.error(`Failed to load ${r} plot:`,w)}}}async function l(S){if(n({selectedCases:S}),S.length===0){n({svgHtml:""});return}await o(),r==="probes"&&await v()}function y(S){if(n({selectedColumns:S}),S.length===0){n({svgHtml:""});return}v()}async function b(S){n({file:S}),await u(),await v()}return{loadFiles:o,loadColumns:u,loadPlot:v,handleCasesChange:l,handleColumnsChange:y,handleFileChange:b}}function Ka(){return{selectedCases:[],file:"",files:[],columns:[],selectedColumns:[],axis:"time",startFrom:"zero",xMin:0,positionText:"",svgHtml:"",autoRefresh:!0}}let Ut=F("time"),ln=F(se(Ka())),cn=F(se({...Ka(),axis:""})),Xc=F(!0),Mr=F(!1),Nr=F(!1);function Yc(){return e(Ut)}function Qc(t){d(Ut,t,!0)}function Jc(){return e(Mr)}function ra(t){d(Mr,t,!0)}function Zc(){return e(Nr)}function na(t){d(Nr,t,!0)}function eu(){e(Ut)==="time"&&!e(Mr)&&e(Nr)?d(Ut,"profile"):e(Ut)==="profile"&&!e(Nr)&&e(Mr)&&d(Ut,"time")}function aa(){return e(ln)}function Xr(){return e(cn)}function yt(t){d(ln,{...e(ln),...t},!0)}function Tt(t){d(cn,{...e(cn),...t},!0)}function tu(){return e(Xc)}var ru=M(" Download as PNG",1),nu=M('
                '),au=M("
                "),ou=M('
                '),su=M('
                ',1),iu=M('
                ');function lu(t,r){Me(r,!0);let a=fe(r,"onRefresh",15),n=z(aa);const i=new Set(["time","t","iteration","iter"]),o=qa({scope:"probes",getState:aa,setState:yt,filterFiles:x=>x.filter(c=>{const m=c.replace(/\.csv$/i,"").toLowerCase();return m!=="coords"&&!m.includes("coordinates")}),filterColumns:x=>x.filter(c=>!i.has(c.toLowerCase())),onColumnsLoaded:x=>{const c=x.filter(m=>!i.has(m.toLowerCase()));yt({columns:c}),u()},getAxis:()=>"time"});async function u(){if(!(!e(n).selectedCases.length||!e(n).file||!e(n).selectedColumns.length))try{const x=[];for(const $ of e(n).selectedColumns){const h=await Hs(e(n).selectedCases[0],e(n).file,[$]);h.found&&x.push({col:$,x:h.x,y:h.y,z:h.z})}if(!x.length){yt({positionText:""});return}const c=$=>{let h=0;for(const E of $){if(E===void 0)continue;const D=String(E),L=D.indexOf(".");L>=0&&(h=Math.max(h,D.length-L-1))}return h},m=c(x.map($=>$.x)),P=c(x.map($=>$.y)),_=c(x.map($=>$.z)),R=x.map($=>{const h=[];return $.x!==void 0&&h.push(`x=${$.x.toFixed(m)}`),$.y!==void 0&&h.push(`y=${$.y.toFixed(P)}`),$.z!==void 0&&h.push(`z=${$.z.toFixed(_)}`),`Probe position [${$.col}] : ${h.join(" · ")}`});yt({positionText:R.join(` +`)})}catch{yt({positionText:""})}}function v(x){o.handleColumnsChange(x),x.length>0&&u()}let l=z(()=>e(n).files.map(x=>({value:x,label:x.replace(/\.csv$/i,"").replace(/^probes?_/i,"")}))),y=!1;Ee(()=>{r.allCases.length>0&&!y&&(y=!0,yt({selectedCases:[...r.allCases]}),o.loadFiles().then(()=>o.loadPlot()))}),Ee(()=>{a(o.loadPlot)});let b=z(()=>e(n).selectedCases.length===0?"Please select at least one case.":e(n).files.length===0?"No probe data for the selected cases yet.":e(n).selectedColumns.length===0?"Please select at least one probe.":"No data to display.");var S=Ke(),w=Y(S);{var T=x=>{const c=D=>{$e(D,{text:"Quantity",children:(L,j)=>{st(L,{class:"w-[160px]",get options(){return e(l)},get value(){return e(n).file},get onchange(){return o.handleFileChange}})}})},m=D=>{var L=nu(),j=k(L);{let I=z(()=>!e(n).svgHtml);Re(j,{variant:"secondary",size:"sm",onclick:()=>En("probe-plot-holder",_r("probe",e(n).selectedCases)),get disabled(){return e(I)},children:(V,O)=>{var B=ru(),U=Y(B);Le(U,{get icon(){return gr}}),Ce(),f(V,B)},$$slots:{default:!0}})}p(L),f(D,L)};var P=su(),_=Y(P);Rn(_,{prefix:"probe",get allCases(){return r.allCases},get selectedCases(){return e(n).selectedCases},get onCasesChange(){return o.handleCasesChange},get middleSlot(){return c},columnLabel:"Probes",get columns(){return e(n).columns},get selectedColumns(){return e(n).selectedColumns},onColumnsChange:v,get startFrom(){return e(n).startFrom},onStartFromChange:D=>{yt({startFrom:D}),o.loadPlot()},xMinLabel:"Time min",get xMin(){return e(n).xMin},onXMinChange:D=>{yt({xMin:D}),o.loadPlot()},get extraSlot(){return m}});var R=A(_,2);{var $=D=>{var L=ou();je(L,21,()=>e(n).positionText.split(` +`).sort(),vn,(j,I)=>{var V=au(),O=k(V,!0);p(V),Q(()=>re(O,e(I))),f(j,V)}),p(L),f(D,L)};G(R,D=>{e(n).positionText&&D($)})}var h=A(R,2),E=k(h);Gt(E,{id:"probe-plot-holder",get svgHtml(){return e(n).svgHtml},get emptyMessage(){return e(b)}}),p(h),f(x,P)},N=x=>{var c=iu(),m=k(c);Gt(m,{id:"probe-plot-holder",svgHtml:"",emptyMessage:"No probe data available. Please run a simulation first."}),p(c),f(x,c)};G(w,x=>{r.allCases.length>0?x(T):x(N,-1)})}f(t,S),Ne()}var cu=M(" ",1),uu=M(" Download as PNG",1),du=M('
                '),fu=M('
                ',1),vu=M('
                ');function gu(t,r){Me(r,!0);let a=fe(r,"onRefresh",15),n=z(Xr);const i=["s","x","abscissa","distance","arclength","arc_length","curvilinear","length","r","y","z","coord","position"];function o(c){const m=c.map(P=>P.toLowerCase());for(const P of i){const _=m.indexOf(P);if(_>=0)return c[_]}return c[0]??""}const u=qa({scope:"profiles",getState:Xr,setState:Tt,onColumnsLoaded:c=>{const m=e(n).axis||o(c),P=c.filter(_=>_!==m).toSorted((_,R)=>_.localeCompare(R));Tt({columns:P,axis:m,selectedColumns:e(n).selectedColumns.length?e(n).selectedColumns:P.length?[P[0]]:[]})},getAxis:()=>Xr().axis});function v(c){const m=e(n).axis;Tt({axis:c});const _=[...e(n).columns,...m?[m]:[]].filter(R=>R!==c).toSorted((R,$)=>R.localeCompare($));Tt({columns:_}),u.loadPlot()}let l=z(()=>e(n).files.map(c=>({value:c,label:c.replace(/^.*\//,"").replace(/\.csv$/i,"").replace(/_/g," ")}))),y=z(()=>[...e(n).axis?[e(n).axis]:[],...e(n).columns].toSorted((c,m)=>c.localeCompare(m)).map(c=>({value:c,label:c}))),b=!1;Ee(()=>{r.allCases.length>0&&!b&&(b=!0,Tt({selectedCases:[...r.allCases]}),u.loadFiles().then(()=>u.loadPlot()))}),Ee(()=>{a(u.loadPlot)});let S=z(()=>e(n).selectedCases.length===0?"Please select at least one case.":e(n).files.length===0?"No profile data for the selected cases yet.":e(n).selectedColumns.length===0?"Please select at least one value.":"No data to display.");var w=Ke(),T=Y(w);{var N=c=>{const m=E=>{var D=cu(),L=Y(D);$e(L,{text:"Profile",children:(I,V)=>{st(I,{class:"w-[160px]",get options(){return e(l)},get value(){return e(n).file},get onchange(){return u.handleFileChange}})}});var j=A(L,2);$e(j,{text:"X axis",children:(I,V)=>{st(I,{class:"w-[140px]",get options(){return e(y)},get value(){return e(n).axis},onchange:v})}}),f(E,D)},P=E=>{var D=du(),L=k(D);{let j=z(()=>!e(n).svgHtml);Re(L,{variant:"secondary",size:"sm",onclick:()=>En("profile-plot-holder",_r("profile",e(n).selectedCases)),get disabled(){return e(j)},children:(I,V)=>{var O=uu(),B=Y(O);Le(B,{get icon(){return gr}}),Ce(),f(I,O)},$$slots:{default:!0}})}p(D),f(E,D)};var _=fu(),R=Y(_);Rn(R,{prefix:"profile",get allCases(){return r.allCases},get selectedCases(){return e(n).selectedCases},get onCasesChange(){return u.handleCasesChange},get middleSlot(){return m},columnLabel:"Values",get columns(){return e(n).columns},get selectedColumns(){return e(n).selectedColumns},get onColumnsChange(){return u.handleColumnsChange},get startFrom(){return e(n).startFrom},onStartFromChange:E=>{Tt({startFrom:E}),u.loadPlot()},xMinLabel:"X min",get xMin(){return e(n).xMin},onXMinChange:E=>{Tt({xMin:E}),u.loadPlot()},get extraSlot(){return P}});var $=A(R,2),h=k($);Gt(h,{id:"profile-plot-holder",get svgHtml(){return e(n).svgHtml},get emptyMessage(){return e(S)}}),p($),f(c,_)},x=c=>{var m=vu(),P=k(m);Gt(P,{id:"profile-plot-holder",svgHtml:"",emptyMessage:"No profile data available. Please run a simulation first."}),p(m),f(c,m)};G(T,c=>{r.allCases.length>0?c(N):c(x,-1)})}f(t,w),Ne()}var hu=M('
                Diagnostics
                '),pu=M(" Refresh",1),mu=M(" ",1);function _u(t,r){Me(r,!0);let a=z(Yc),n=z(tu),i=z(Jc),o=z(Zc),u=F(se(Qt("probe")));Ee(()=>{Jt("probe",e(u))});let v=F(void 0);function l(){var N;(N=e(v))==null||N()}async function y(){if(r.allCases.length){try{const x=(await Jr(r.allCases,"probes")).filter(c=>{const m=c.replace(/\.csv$/i,"").toLowerCase();return m!=="coords"&&!m.includes("coordinates")});ra(x.length>0)}catch{ra(!1)}try{const N=await Jr(r.allCases,"profiles");na(N.length>0)}catch{na(!1)}}}Ee(()=>{r.allCases.length>0&&y()}),pr(()=>{y(),l()}),Ee(()=>{e(i),e(o),eu()});function b(N){N==="time"&&!e(i)||N==="profile"&&!e(o)||Qc(N)}var S=Ke(),w=Y(S);{var T=N=>{const x=c=>{var m=hu(),P=A(k(m),2),_=k(P),R=A(_,2);p(P),p(m),Q(()=>{ke(_,1,`bg-transparent border-none p-0 m-0 text-lg font-bold tracking-tight transition-colors duration-150 + ${e(i)?e(a)==="time"?"text-edf-bleu-fonce cursor-pointer":"text-edf-gris-moyen cursor-pointer hover:text-muted":"text-edf-gris-moyen cursor-not-allowed opacity-50"}`),_.disabled=!e(i),ye(_,"title",e(i)?"":"No probe data available. Run a simulation first."),ke(R,1,`bg-transparent border-none p-0 m-0 text-lg font-bold tracking-tight transition-colors duration-150 + ${e(o)?e(a)==="profile"?"text-edf-bleu-fonce cursor-pointer":"text-edf-gris-moyen cursor-pointer hover:text-muted":"text-edf-gris-moyen cursor-not-allowed opacity-50"}`),R.disabled=!e(o),ye(R,"title",e(o)?"":"No profile data available. Run a simulation first.")}),ie("click",_,()=>b("time")),ie("click",R,()=>b("profile")),f(c,m)};Ht(N,{wide:!0,get titleSlot(){return x},actions:m=>{var P=mu(),_=Y(P);{let h=z(()=>e(a)==="time"?"probePlot":"profilePlot"),E=z(ol);Zt(_,{get name(){return e(h)},get intervalMs(){return e(E)},onRefresh:l,get checked(){return e(u)},set checked(D){d(u,D,!0)}})}var R=A(_,2);{var $=h=>{Re(h,{variant:"primary",onclick:l,children:(E,D)=>{var L=pu(),j=Y(L);Le(j,{get icon(){return Yt}}),Ce(),f(E,L)},$$slots:{default:!0}})};G(R,h=>{e(u)||h($)})}f(m,P)},children:(m,P)=>{var _=Ke(),R=Y(_);{var $=E=>{lu(E,{get allCases(){return r.allCases},get onRefresh(){return e(v)},set onRefresh(D){d(v,D,!0)}})},h=E=>{gu(E,{get allCases(){return r.allCases},get onRefresh(){return e(v)},set onRefresh(D){d(v,D,!0)}})};G(R,E=>{e(a)==="time"?E($):E(h,-1)})}f(m,_)},$$slots:{actions:!0,default:!0}})};G(w,N=>{e(n)&&N(T)})}f(t,S),Ne()}Be(["click"]);var bu=M(" Refresh",1),xu=M(" ",1),yu=M(" Download as CSV",1),wu=M('
                ',1),ku=M(" "),Cu=M(' '),Su=M(' '),Pu=M('
                Case
                '),Ru=M('

                '),Eu=M(" ",1);function $u(t,r){Me(r,!0);let a=F(se([])),n=F(se([])),i=F(!1),o=F(!1),u=F(se(Qt("perf")));Ee(()=>{Jt("perf",e(u))});const v=5e3;let l=F(se([])),y=z(()=>r.allCases.map(m=>({value:m,label:m}))),b=z(()=>e(l).length>0&&e(n).length>0);async function S(){if(e(a).length){d(o,!0);try{const m=await jn(e(a));d(l,m.columns,!0),d(n,m.records,!0),e(b)&&d(i,!0)}catch(m){console.error("Failed to load perf:",m)}d(o,!1)}}function w(m){if(d(a,m,!0),m.length===0){d(n,[],!0);return}S()}function T(m,P){if(P==null||P==="")return"-";if(m==="text")return String(P);const _=Number(P);return Number.isFinite(_)?m==="int"?String(Math.round(_)):_.toFixed(3):String(P)}async function N(){if(!e(n).length)return;const m=["case_id",...e(l).map($=>$.key)],P=e(n).map($=>[$.case_id,...e(l).map(h=>$[h.key]??"")].join(",")),_=[m.join(","),...P].join(` +`),R=_r("timing_snapshot",e(a),"csv");await za(_,R)}let x=!1;Ee(()=>{r.allCases.length>0&&!x&&(x=!0,d(a,[...r.allCases],!0),jn(r.allCases).then(m=>{d(l,m.columns,!0),d(n,m.records,!0),d(i,e(b),!0)}).catch(()=>{}))}),Ee(()=>{e(u)?hr("perf",S,v):ft("perf")});const c=pr(()=>{x&&S()});dr(()=>{ft("perf"),c()}),Ht(t,{eyebrow:"Performance",title:"Timing Snapshot",wide:!0,actions:P=>{var _=xu(),R=Y(_);Zt(R,{name:"perf",intervalMs:v,onRefresh:S,get checked(){return e(u)},set checked(E){d(u,E,!0)}});var $=A(R,2);{var h=E=>{Re(E,{variant:"primary",onclick:S,children:(D,L)=>{var j=bu(),I=Y(j);Le(I,{get icon(){return Yt}}),Ce(),f(D,j)},$$slots:{default:!0}})};G($,E=>{e(u)||E(h)})}f(P,_)},children:(P,_)=>{var R=Eu(),$=Y(R);{var h=j=>{Wt(j,{children:(I,V)=>{var O=wu(),B=Y(O);$e(B,{text:"Cases",children:(g,s)=>{Bt(g,{class:"w-[160px]",get options(){return e(y)},get selected(){return e(a)},onchange:w,placeholder:"Select cases..."})}});var U=A(B,2),q=k(U);{let g=z(()=>!e(b));Re(q,{variant:"secondary",size:"sm",onclick:N,get disabled(){return e(g)},children:(s,C)=>{var H=yu(),W=Y(H);Le(W,{get icon(){return gr}}),Ce(),f(s,H)},$$slots:{default:!0}})}p(U),f(I,O)}})};G($,j=>{e(i)&&j(h)})}var E=A($,2);{var D=j=>{var I=Pu(),V=k(I),O=k(V),B=k(O),U=A(k(B));je(U,17,()=>e(l),g=>g.key,(g,s)=>{var C=ku(),H=k(C,!0);p(C),Q(()=>re(H,e(s).label)),f(g,C)}),p(B),p(O);var q=A(O);je(q,21,()=>e(n),g=>g.case_id,(g,s)=>{var C=Su(),H=k(C),W=k(H,!0);p(H);var ee=A(H);je(ee,17,()=>e(l),ne=>ne.key,(ne,me)=>{var K=Cu(),X=k(K,!0);p(K),Q(ce=>re(X,ce),[()=>T(e(me).kind,e(s)[e(me).key])]),f(ne,K)}),p(C),Q(()=>re(W,e(s).case_id)),f(g,C)}),p(q),p(V),p(I),f(j,I)},L=j=>{var I=Ru(),V=k(I);{var O=U=>{var q=Ie("Select cases above to view timing information.");f(U,q)},B=U=>{var q=Ie("No performance data available. Please run a simulation first.");f(U,q)};G(V,U=>{e(i)?U(O):U(B,-1)})}p(I),f(j,I)};G(E,j=>{e(b)?j(D):j(L,-1)})}f(P,R)},$$slots:{actions:!0,default:!0}}),Ne()}const Mu={"&":"&","<":"<",">":">",'"':""","'":"'"};function Wa(t){return t.replace(/[&<>"']/g,r=>Mu[r]??r)}var Nu=M("
                "),Au=M('
                ');function Tu(t,r){Me(r,!0);let a=F(void 0);function n(y){const b=Wa(y);if(!r.searchQuery.trim())return b;try{const S=new RegExp(`(${r.searchQuery})`,"gi");return b.replace(S,'$1')}catch{return b}}function i(y){return y==="error"?"tail-sev-error":y==="warn"?"tail-sev-warn":""}function o(){return e(a)?e(a).scrollHeight-e(a).scrollTop-e(a).clientHeight<=24:!0}let u=F(!0);function v(){d(u,o(),!0)}Ee(()=>{r.autoScroll&&r.lines.length>0&&e(a)&&e(u)&&St().then(()=>{e(a)&&(e(a).scrollTop=e(a).scrollHeight)})});var l=Au();je(l,21,()=>r.lines,y=>y.index,(y,b)=>{var S=Nu();Tr(S,()=>n(e(b).text),!0),p(S),Q(w=>ke(S,1,`tail-line ${w??""} ${e(b).isNew?"tail-new":""}`),[()=>i(e(b).severity)]),f(y,S)}),p(l),tt(l,y=>d(a,y),()=>e(a)),Ze("scroll",l,v),f(t,l),Ne()}var Lu=M(" Refresh",1),Du=M(" ",1),Fu=M(''),zu=M(''),Iu=M("   ",1),Ou=M(" ",1),Hu=Ot(''),ju=Ot(''),Uu=Ot(''),Vu=M(" Resume",1),Bu=M(" Pause",1),qu=M('Case not running'),Ku=M(' 
                ',1),Wu=M('

                '),Gu=M('

                '),Xu=M(" ",1);function Yu(t,r){Me(r,!0);const a=80;let n=F(""),i=F(""),o=F(!1),u=F(se([])),v=F(a),l=F(se([])),y=F(se(new Set)),b=F(!1),S=F(se(Qt("tail")));Ee(()=>{Jt("tail",e(S))});let w=F(!0),T=F("all"),N=F(""),x=F(""),c=F(void 0),m=z(()=>xn(r.allCases)),P=z(()=>e(u).map(U=>{const q=U.split("/").pop()??U;return{value:U,label:q}})),_=[{value:"all",label:"All"},{value:"error",label:"Error"},{value:"warn",label:"Warn"}],R=z(()=>e(u).length>0),$=z(()=>Fr().some(U=>{var q;return U.case_id===e(n)&&((q=U.status)==null?void 0:q.toUpperCase())==="RUNNING"}));async function h(){if(e(n)){try{d(u,await zs(e(n)),!0)}catch(U){console.error("Failed to load tail files:",U),d(u,[],!0);return}(!e(o)||!e(u).includes(e(i)))&&(d(i,e(u)[0]??"",!0),d(o,!1)),e(i)||d(l,[],!0)}}async function E(U=!1){if(e(n)&&!(e(b)&&!U)&&(await h(),!!e(i)))try{const q=(await Is(e(n),e(i),e(v))).lines;if(d(x,""),e(l).length>0){const g=D(e(l),q),s=new Set;for(let C=g;C{let U=e(l).map((q,g)=>({...q,index:g,isNew:e(y).has(g)}));if(e(T)!=="all"&&(U=U.filter(q=>q.severity===e(T))),e(N).trim())try{const q=new RegExp(e(N),"i");U=U.filter(g=>q.test(g.text))}catch{}return U});function j(U){d(n,U,!0),d(i,""),d(o,!1),d(l,[],!0),h().then(()=>E(!0))}function I(U){d(i,U,!0),d(o,!0),d(l,[],!0),E(!0)}function V(){d(b,!e(b)),e(b)||E(!0)}function O(U){(U.ctrlKey||U.metaKey)&&U.key==="f"&&e(c)&&(U.preventDefault(),e(c).focus())}Ee(()=>{r.allCases.length>0&&!e(n)&&(d(n,r.allCases[0],!0),h().then(()=>E(!0)))}),Ee(()=>{e(S)&&!e(b)&&e(n)?hr("tail",()=>E(!1),qn()):ft("tail")});const B=pr(()=>{e(n)&&h().then(()=>E(!0))});dr(()=>{ft("tail"),B()}),Ze("keydown",ot,O),Ht(t,{eyebrow:"Live",title:"Log Tail",wide:!0,actions:q=>{var g=Du(),s=Y(g);{let W=z(qn);Zt(s,{name:"tail",get intervalMs(){return e(W)},onRefresh:()=>E(!1),get checked(){return e(S)},set checked(ee){d(S,ee,!0)}})}var C=A(s,2);{var H=W=>{Re(W,{variant:"primary",onclick:()=>E(!0),children:(ee,ne)=>{var me=Lu(),K=Y(me);Le(K,{get icon(){return Yt}}),Ce(),f(ee,me)},$$slots:{default:!0}})};G(C,W=>{e(S)||W(H)})}f(q,g)},children:(q,g)=>{var s=Xu(),C=Y(s);Wt(C,{children:(K,X)=>{var ce=Ou(),le=Y(ce);$e(le,{text:"Case",children:(Z,_e)=>{st(Z,{class:"w-[130px]",get options(){return e(m)},get value(){return e(n)},onchange:j})}});var we=A(le,2);{var he=Z=>{var _e=Iu(),Se=Y(_e);$e(Se,{text:"File",children:(be,Oe)=>{st(be,{class:"w-[150px]",get options(){return e(P)},get value(){return e(i)},onchange:I})}});var Pe=A(Se,2);$e(Pe,{text:"Lines",children:(be,Oe)=>{var Fe=Fu();qe(Fe),ie("change",Fe,()=>E(!0)),Je(Fe,()=>e(v),oe=>d(v,oe)),f(be,Fe)}});var ge=A(Pe,2);$e(ge,{text:"Filter",children:(be,Oe)=>{var Fe=zu();qe(Fe),tt(Fe,oe=>d(c,oe),()=>e(c)),Je(Fe,()=>e(N),oe=>d(N,oe)),f(be,Fe)}});var De=A(ge,2);$e(De,{text:"Severity",children:(be,Oe)=>{st(be,{class:"w-[90px]",get options(){return _},get value(){return e(T)},onchange:Fe=>d(T,Fe,!0)})}}),f(Z,_e)};G(we,Z=>{e(R)&&Z(he)})}f(K,ce)}});var H=A(C,2);{var W=K=>{var X=Ku(),ce=Y(X);Tu(ce,{get lines(){return e(L)},get searchQuery(){return e(N)},get autoScroll(){return e(w)}});var le=A(ce,2),we=k(le),he=k(we);{var Z=oe=>{var ue=Hu();f(oe,ue)},_e=oe=>{var ue=ju();f(oe,ue)},Se=oe=>{var ue=Uu();f(oe,ue)};G(he,oe=>{e(b)?oe(Z):e($)?oe(_e,1):oe(Se,-1)})}var Pe=A(he);p(we);var ge=A(we,2);{var De=oe=>{Re(oe,{variant:"secondary",size:"sm",onclick:V,children:(ue,He)=>{var te=Ke(),J=Y(te);{var ae=xe=>{var Ae=Vu(),pe=Y(Ae);Le(pe,{get icon(){return Na}}),Ce(),f(xe,Ae)},de=xe=>{var Ae=Bu(),pe=Y(Ae);Le(pe,{get icon(){return wi}}),Ce(),f(xe,Ae)};G(J,xe=>{e(b)?xe(ae):xe(de,-1)})}f(ue,te)},$$slots:{default:!0}})},be=oe=>{var ue=qu();f(oe,ue)};G(ge,oe=>{e($)?oe(De):oe(be,-1)})}var Oe=A(ge,2),Fe=k(Oe);It(Fe,{get checked(){return e(w)},onchange:oe=>d(w,oe,!0),size:14,label:"Auto-scroll",labelFirst:!0}),p(Oe),p(le),Q(()=>re(Pe,` ${e(L).length??""} / ${e(l).length??""}`)),f(K,X)},ee=K=>{var X=Wu(),ce=k(X);{var le=he=>{var Z=Ie("No log file yet for this case.");f(he,Z)},we=he=>{var Z=Ie("No log data available. Please run a simulation first.");f(he,Z)};G(ce,he=>{e(n)&&!e(R)?he(le):he(we,-1)})}p(X),f(K,X)};G(H,K=>{e(l).length>0?K(W):K(ee,-1)})}var ne=A(H,2);{var me=K=>{var X=Gu(),ce=k(X,!0);p(X),Q(()=>re(ce,e(x))),f(K,X)};G(ne,K=>{e(x)&&K(me)})}f(q,s)},$$slots:{actions:!0,default:!0}}),Ne()}Be(["change"]);function Qu(t,r=3){var T,N;const a=t.split(` +`),n=[];let i=0,o=0,u=!1;for(const x of a){if(x.startsWith("===")||x.startsWith("---")||x.startsWith("+++"))continue;const c=x.match(/^@@ -(\d+),?\d* \+(\d+),?\d* @@/);if(c){i=parseInt(c[1],10)-1,o=parseInt(c[2],10)-1,u=!0;continue}if(u)if(x.startsWith("-"))i++,n.push({type:"del",leftNum:i,rightNum:null,leftContent:x.slice(1),rightContent:""});else if(x.startsWith("+"))o++,n.push({type:"add",leftNum:null,rightNum:o,leftContent:"",rightContent:x.slice(1)});else{i++,o++;const m=x.startsWith(" ")?x.slice(1):x;n.push({type:"equal",leftNum:i,rightNum:o,leftContent:m,rightContent:m})}}const v=[];let l=0;for(;l=0&&x-S>1&&b.push({kind:"separator",skipped:x-S-1});const c=v[x].type!=="equal",m=c&&!w;b.push({kind:"line",row:v[x],hunkStart:m}),w=c,S=x}if(S=0&&b.push({kind:"separator",skipped:v.length-1-S}),b.length>0&&b[0].kind==="line"){const x=((T=b[0].row)==null?void 0:T.leftNum)??0,c=((N=b[0].row)==null?void 0:N.rightNum)??0,m=Math.max(x,c)-1;m>0&&b.unshift({kind:"separator",skipped:m})}return b}var Ju=M('
                '),Zu=M('
                '),ed=M(' ',1),td=M('No matches'),rd=M('
                '),nd=M('

                Files are identical.

                '),ad=M('
                Loading...
                '),od=M('
                ');function sd(t,r){Me(r,!0);let a=fe(r,"loading",3,!1),n=F(void 0),i=z(()=>Qu(r.diffText)),o=z(()=>{const te=[];return e(i).forEach((J,ae)=>{J.hunkStart&&te.push(ae)}),te}),u=z(()=>e(o).length>0),v=z(()=>{var J;const te=new Array(e(i).length).fill(-1);for(let ae=0;ae{r.diffText!==y&&(y=r.diffText,d(l,-1))});let b=z(()=>{if(!r.search.trim())return[];try{const te=new RegExp(r.search,"i"),J=[];return e(i).forEach((ae,de)=>{ae.kind==="line"&&ae.row&&(te.test(ae.row.leftContent)||te.test(ae.row.rightContent))&&J.push(de)}),J}catch{return[]}}),S=F(-1),w="";Ee(()=>{r.search!==w&&(w=r.search,d(S,e(b).length>0?0:-1,!0))});async function T(te){var de;d(S,te,!0),await St();const J=e(b)[te],ae=(de=e(_))==null?void 0:de.querySelector(`[data-item-idx="${J}"]`);if(ae&&e(_)&&e(R)){const xe=e(_).getBoundingClientRect(),pe=ae.getBoundingClientRect().top-xe.top+e(_).scrollTop-e(_).clientHeight/3;h=!0,e(_).scrollTop=pe,e(R).scrollTop=pe,requestAnimationFrame(()=>{h=!1})}}function N(){e(S)>0&&T(e(S)-1)}function x(){e(S)<0&&e(b).length>0?T(0):e(S)$1`)}catch{return ae}}function m(te,J){return te==="equal"?"":te==="del"&&J==="left"?"bg-[rgba(214,67,10,0.08)] text-edf-orange-fonce":te==="del"&&J==="right"?"bg-[rgba(48,122,16,0.08)] text-edf-vert-fonce":te==="add"&&J==="left"?"bg-edf-gris-clair":te==="add"&&J==="right"?"bg-[rgba(48,122,16,0.08)] text-edf-vert-fonce":""}function P(te,J){return te==="del"&&J==="left"?"rgb(251,237,233)":te==="del"&&J==="right"?"rgb(238,247,236)":te==="add"&&J==="left"?"var(--color-edf-gris-clair)":te==="add"&&J==="right"?"rgb(238,247,236)":"white"}let _=F(void 0),R=F(void 0),$=!1,h=!1;function E(te){$||h||!e(_)||!e(R)||($=!0,te==="left"?(e(R).scrollTop=e(_).scrollTop,e(R).scrollLeft=e(_).scrollLeft):(e(_).scrollTop=e(R).scrollTop,e(_).scrollLeft=e(R).scrollLeft),requestAnimationFrame(()=>{$=!1}))}async function D(te){var ae;d(l,te,!0),await St();const J=(ae=e(_))==null?void 0:ae.querySelector(`[data-hunk-start="${te}"]`);if(J&&e(_)&&e(R)){h=!0;const de=e(_).getBoundingClientRect(),Ae=J.getBoundingClientRect().top-de.top+e(_).scrollTop-e(_).clientHeight/3;e(_).scrollTop=Ae,e(R).scrollTop=Ae,requestAnimationFrame(()=>{h=!1})}}function L(){e(l)>0&&D(e(l)-1)}function j(){e(l)<0?D(0):e(l)=0&&d(l,J,!0)}function V(te){te.target instanceof HTMLInputElement||(te.key==="n"&&!te.shiftKey?(te.preventDefault(),j()):te.key==="N"||te.key==="n"&&te.shiftKey?(te.preventDefault(),L()):te.key==="j"?(te.preventDefault(),x()):(te.key==="J"||te.key==="j"&&te.shiftKey)&&(te.preventDefault(),N()))}var O=od();{const te=(J,ae=ba)=>{var de=Ke(),xe=Y(de);je(xe,17,()=>e(i),vn,(Ae,pe,ve)=>{const Ue=z(()=>e(o).indexOf(ve)),ze=z(()=>e(v)[ve]>=0&&e(v)[ve]===e(l)),rt=z(()=>{var lt,Ve;return ae()==="left"?(lt=e(pe).row)==null?void 0:lt.leftNum:(Ve=e(pe).row)==null?void 0:Ve.rightNum}),er=z(()=>{var lt,Ve;return ae()==="left"?((lt=e(pe).row)==null?void 0:lt.leftContent)??"":((Ve=e(pe).row)==null?void 0:Ve.rightContent)??""});var br=Ke(),Qe=Y(br);{var ut=lt=>{var Ve=Ju(),$t=A(k(Ve),2),Ir=k($t);p($t),p(Ve),Q(()=>re(Ir,`... ${e(pe).skipped??""} lines hidden ...`)),f(lt,Ve)},zr=lt=>{var Ve=Zu(),$t=k(Ve),Ir=k($t,!0);p($t);var $n=A($t,2);Tr($n,()=>c(e(er),e(S)>=0&&e(b)[e(S)]===ve),!0),p($n),p(Ve),Q((bt,Mt,xr,Ga,Xa)=>{ke(Ve,1,`flex w-full ${bt??""} ${Mt??""}`),Ge(Ve,e(ze)?"background-color: rgba(16,87,200,0.12); color: rgb(16,87,200);":""),ye(Ve,"role",xr),ye(Ve,"tabindex",Ga),ye(Ve,"data-hunk-start",ae()==="left"&&e(Ue)>=0?e(Ue):void 0),ye(Ve,"data-item-idx",ae()==="left"?ve:void 0),Ge($t,`background: ${Xa??""}; color: ${e(ze)?"white":"var(--color-muted)"};`),re(Ir,e(rt)??"")},[()=>m(e(pe).row.type,ae()),()=>e(pe).row.type!=="equal"||e(b).includes(ve)?"cursor-pointer":"",()=>e(pe).row.type!=="equal"||e(b).includes(ve)?"button":void 0,()=>e(pe).row.type!=="equal"||e(b).includes(ve)?0:void 0,()=>e(ze)?"rgb(16,87,200)":P(e(pe).row.type,ae())]),ie("click",Ve,()=>{var Mt;((Mt=e(pe).row)==null?void 0:Mt.type)!=="equal"&&I(ve);const bt=e(b).indexOf(ve);bt>=0&&d(S,bt,!0)}),ie("keydown",Ve,bt=>{var Mt;if(bt.key==="Enter"||bt.key===" "){bt.preventDefault(),((Mt=e(pe).row)==null?void 0:Mt.type)!=="equal"&&I(ve);const xr=e(b).indexOf(ve);xr>=0&&d(S,xr,!0)}}),f(lt,Ve)};G(Qe,lt=>{e(pe).kind==="separator"?lt(ut):e(pe).row&<(zr,1)})}f(Ae,br)}),f(J,de)};var B=k(O),U=k(B),q=k(U),g=k(q,!0);p(q);var s=A(q,2),C=k(s,!0);p(s),p(U);var H=A(U,2),W=k(H),ee=k(W,!0);p(W);var ne=A(W,2),me=k(ne,!0);p(ne),p(H),p(B);var K=A(B,2),X=k(K),ce=k(X);qe(ce);var le=A(ce,2);{var we=J=>{var ae=ed(),de=Y(ae);{let ve=z(()=>e(S)<=0);Re(de,{variant:"secondary",size:"sm",onclick:N,get disabled(){return e(ve)},children:(Ue,ze)=>{Ce();var rt=Ie("Prev");f(Ue,rt)},$$slots:{default:!0}})}var xe=A(de,2),Ae=k(xe);p(xe);var pe=A(xe,2);{let ve=z(()=>e(S)>=e(b).length-1);Re(pe,{variant:"secondary",size:"sm",onclick:x,get disabled(){return e(ve)},children:(Ue,ze)=>{Ce();var rt=Ie("Next");f(Ue,rt)},$$slots:{default:!0}})}Q(()=>re(Ae,`${e(S)>=0?e(S)+1:"–"} / ${e(b).length??""} occurrence${e(b).length!==1?"s":""}`)),f(J,ae)},he=z(()=>r.search.trim()&&e(b).length>0),Z=J=>{var ae=td();f(J,ae)},_e=z(()=>r.search.trim());G(le,J=>{e(he)?J(we):e(_e)&&J(Z,1)})}p(X);var Se=A(X,2),Pe=k(Se);{let J=z(()=>e(o).length===0||e(l)<=0);Re(Pe,{variant:"secondary",size:"sm",onclick:L,get disabled(){return e(J)},children:(ae,de)=>{Ce();var xe=Ie("Prev");f(ae,xe)},$$slots:{default:!0}})}var ge=A(Pe,2),De=k(ge);p(ge);var be=A(ge,2);{let J=z(()=>e(o).length===0||e(l)>=e(o).length-1);Re(be,{variant:"secondary",size:"sm",onclick:j,get disabled(){return e(J)},children:(ae,de)=>{Ce();var xe=Ie("Next");f(ae,xe)},$$slots:{default:!0}})}p(Se),p(K);var Oe=A(K,2);{var Fe=J=>{var ae=rd(),de=k(ae),xe=k(de),Ae=k(xe);te(Ae,()=>"left"),p(xe),p(de),tt(de,ze=>d(_,ze),()=>e(_));var pe=A(de,2),ve=k(pe),Ue=k(ve);te(Ue,()=>"right"),p(ve),p(pe),tt(pe,ze=>d(R,ze),()=>e(R)),p(ae),Ze("scroll",de,()=>E("left")),Ze("scroll",pe,()=>E("right")),f(J,ae)},oe=J=>{var ae=nd();f(J,ae)};G(Oe,J=>{e(u)?J(Fe):J(oe,-1)})}var ue=A(Oe,2);{var He=J=>{var ae=ad();f(J,ae)};G(ue,J=>{a()&&J(He)})}p(O),tt(O,J=>d(n,J),()=>e(n)),Q(()=>{re(g,r.leftLabel),re(C,r.kind),re(ee,r.rightLabel),re(me,r.kind),gn(ce,r.search),re(De,`${e(l)>=0?e(l)+1:"–"} / ${e(o).length??""} diff${e(o).length!==1?"s":""}`)}),ie("input",ce,J=>r.onSearchChange(J.target.value)),ie("keydown",ce,J=>{J.key==="Enter"&&(J.preventDefault(),x())})}ie("keydown",O,V),f(t,O),Ne()}Be(["keydown","click","input"]);var id=M(" ",1),ld=M('

                Please select two different cases to compare.

                '),cd=M('

                Select two cases to compare.

                '),ud=M(' '),dd=M('
                Parameter
                '),fd=M('

                All parameters are identical.

                '),vd=M('
                ',1),gd=M('

                '),hd=M('

                Loading...

                '),pd=M(" ",1),md=M(" ",1);function _d(t,r){Me(r,!0);let a=F(""),n=F(""),i=F(""),o=F(""),u=F(""),v=F(!1),l=F(!1),y=F(""),b=z(()=>r.allCases.map(h=>({value:h,label:h})));const S=[{value:"doe_row.csv",label:"doe_row.csv"}];let w=z(()=>{var h;return((h=Pt())==null?void 0:h.compare_kinds)??S});Ee(()=>{var h;e(w).some(E=>E.value===e(i))||d(i,((h=e(w)[0])==null?void 0:h.value)??"",!0)});let T=F(!1),N=z(()=>e(a)&&e(n)&&e(a)!==e(n));function x(){const h=e(a);d(a,e(n),!0),d(n,h,!0)}async function c(){if(e(N)){d(v,!0),d(y,"");try{const h=await Us({cases:[e(a),e(n)],base:e(a),kind:e(i)});d(u,h,!0),d(l,!0)}catch(h){console.error("Failed to load diff:",h),d(u,""),d(l,!1);const E=h instanceof Error?h.message:String(h);d(y,E.includes("404")?`File "${e(i)}" not found for one of the selected cases. It may not have been run yet.`:"Failed to load comparison.",!0)}d(v,!1)}}Ee(()=>{e(a)&&e(n)&&e(a)!==e(n)&&e(i)?c():e(a)&&e(n)&&e(a)===e(n)&&(d(u,""),d(l,!0))});let m=!1;Ee(()=>{r.allCases.length>=2&&!m?(m=!0,d(a,r.allCases[0],!0),d(n,r.allCases[1],!0)):r.allCases.length===1&&!m&&(m=!0,d(a,r.allCases[0],!0))});let P=z(Sn),_=z(()=>{if(!e(a)||!e(n)||e(a)===e(n)||e(P).length===0)return[];const h=Fr(),E=h.find(L=>L.case_id===e(a)),D=h.find(L=>L.case_id===e(n));return!E&&!D?[]:e(P).map(L=>{var V,O;const j=((V=E==null?void 0:E.doe)==null?void 0:V[L])!=null&&String(E.doe[L])!==""?String(E.doe[L]):"—",I=((O=D==null?void 0:D.doe)==null?void 0:O[L])!=null&&String(D.doe[L])!==""?String(D.doe[L]):"—";return{param:L,left:j,right:I,differs:j!==I}})}),R=z(()=>e(T)?e(_):e(_).filter(h=>h.differs)),$=z(()=>e(_).filter(h=>h.differs).length);Ht(t,{eyebrow:"Compare",title:"Side-by-Side Comparison",wide:!0,children:(h,E)=>{var D=md(),L=Y(D);Wt(L,{children:(B,U)=>{var q=id(),g=Y(q);$e(g,{text:"First case",children:(H,W)=>{st(H,{class:"w-32.5",get options(){return e(b)},get value(){return e(a)},onchange:ee=>d(a,ee,!0),placeholder:"Select..."})}});var s=A(g,2);{let H=z(()=>!e(a)&&!e(n));Re(s,{variant:"secondary",size:"sm",onclick:x,get disabled(){return e(H)},children:(W,ee)=>{Le(W,{get icon(){return pi}})},$$slots:{default:!0}})}var C=A(s,2);$e(C,{text:"Second case",children:(H,W)=>{st(H,{class:"w-32.5",get options(){return e(b)},get value(){return e(n)},onchange:ee=>d(n,ee,!0),placeholder:"Select..."})}}),f(B,q)}});var j=A(L,2);{var I=B=>{var U=ld();f(B,U)},V=B=>{var U=cd();f(B,U)},O=B=>{var U=pd(),q=Y(U);{var g=ne=>{var me=vd(),K=Y(me),X=k(K),ce=k(X);p(X);var le=A(X,2),we=k(le,!0);p(le),p(K);var he=A(K,2);{var Z=Se=>{var Pe=dd(),ge=k(Pe),De=k(ge),be=k(De),Oe=k(be),Fe=k(Oe,!0);p(Oe);var oe=A(Oe,2),ue=k(oe,!0);p(oe),p(be),p(De);var He=A(De);je(He,21,()=>e(R),te=>te.param,(te,J)=>{var ae=ud(),de=k(ae),xe=k(de,!0);p(de);var Ae=A(de),pe=k(Ae,!0);p(Ae);var ve=A(Ae),Ue=k(ve,!0);p(ve),p(ae),Q(()=>{ke(de,1,dt(e(J).differs?"text-edf-orange-fonce bg-[rgba(214,67,10,0.04)]":"")),re(xe,e(J).left),re(pe,e(J).param),ke(ve,1,dt(e(J).differs?"text-edf-vert-fonce bg-[rgba(48,122,16,0.04)]":"")),re(Ue,e(J).right)}),f(te,ae)}),p(He),p(ge),p(Pe),Q(()=>{re(Fe,e(a)),re(ue,e(n))}),f(Se,Pe)},_e=Se=>{var Pe=fd();f(Se,Pe)};G(he,Se=>{e(R).length>0?Se(Z):Se(_e,-1)})}Q(()=>{re(ce,`${e($)??""} difference${e($)!==1?"s":""} out of ${e(_).length??""} + parameters`),re(we,e(T)?"Show differences only":"Show all parameters")}),ie("click",le,()=>d(T,!e(T))),f(ne,me)};G(q,ne=>{e(_).length>0&&ne(g)})}var s=A(q,2);Wt(s,{children:(ne,me)=>{$e(ne,{text:"File",children:(K,X)=>{st(K,{class:"w-37.5",get options(){return e(w)},get value(){return e(i)},onchange:ce=>d(i,ce,!0)})}})}});var C=A(s,2);{var H=ne=>{var me=gd(),K=k(me,!0);p(me),Q(()=>re(K,e(y))),f(ne,me)},W=ne=>{sd(ne,{get diffText(){return e(u)},get leftLabel(){return e(a)},get rightLabel(){return e(n)},get kind(){return e(i)},get search(){return e(o)},get loading(){return e(v)},onSearchChange:me=>d(o,me,!0)})},ee=ne=>{var me=hd();f(ne,me)};G(C,ne=>{e(y)?ne(H):e(l)?ne(W,1):e(v)&&ne(ee,2)})}f(B,U)};G(j,B=>{e(a)&&e(n)&&e(a)===e(n)?B(I):!e(a)||!e(n)?B(V,1):B(O,-1)})}f(h,D)},$$slots:{default:!0}}),Ne()}Be(["click"]);var bd=M(" Refresh",1),xd=M(" ",1),yd=M(''),wd=M(''),kd=M(" Download as CSV",1),Cd=M('
                ',1),Sd=M(" ",1),Pd=M(""),Rd=M('
                Sort by:
                '),Ed=M('

                No errors found. Select cases and adjust filters above.

                '),$d=M(' '),Md=M('NEW'),Nd=M('
                '),Ad=M('
                '),Td=M(' '),Ld=M('
                '),Dd=M('

                '),Fd=M("
                ",1);function zd(t,r){Me(r,!0);const a=6,n=["csauto.stderr","csauto.stdout"];let i=F(se([])),o=F(se([...n])),u=!1;Ee(()=>{var X;const K=(X=Pt())==null?void 0:X.error_files;K!=null&&K.length&&!u&&d(o,[...K],!0)});let v=F("all"),l=F(""),y=F(a),b=F(!1),S=F(""),w=F(se(Qt("errors")));Ee(()=>{Jt("errors",e(w))});let T=F(se([])),N=F(se(new Set));function x(K){return K.toLowerCase().replace(/[0-9]+/g,"#").replace(/0x[0-9a-f]+/gi,"#").replace(/\s+/g," ").trim()}function c(K){const X=K.line_html.replace(/<[^>]*>/g,"").slice(0,120);return`${K.case_id}|${K.file}|${K.severity}|${x(X)}`}function m(K){const X=new Map;for(const ce of K){const le=c(ce),we=X.get(le);we?we.count++:X.set(le,{...ce,count:1,fingerprint:le,isNew:!e(N).has(le)})}return Array.from(X.values())}async function P(){if(!(!e(i).length||!e(o).length)){d(b,!0);try{const K=await Fs({cases:e(i),files:e(o),context:e(y),sev:e(v)==="all"?"":e(v),q:e(l)});d(S,"");const X=m(K.items);d(T,K.items,!0);const ce=new Set(X.map(le=>le.fingerprint));d(N,ce,!0),d(_,X,!0)}catch(K){d(S,"Failed to load errors"),console.error("Failed to load errors:",K)}finally{d(b,!1)}}}let _=F(se([])),R=null;function $(){R&&clearTimeout(R),R=setTimeout(P,250)}function h(K){return K==="error"?"error-sev-error":K==="warn"?"error-sev-warn":"error-sev-info"}let E=z(()=>xn(r.allCases)),D=z(()=>{var K;return(((K=Pt())==null?void 0:K.error_files)??n).map(X=>({value:X,label:X}))}),L=[{value:"all",label:"All"},{value:"error",label:"Error"},{value:"warn",label:"Warn"}];function j(K){if(d(i,K,!0),K.length===0){d(_,[],!0),d(T,[],!0);return}P()}function I(K){if(u=!0,d(o,K,!0),K.length===0){d(_,[],!0),d(T,[],!0);return}P()}function V(K){d(v,K,!0),P()}function O(){P()}let B=!1;Ee(()=>{r.allCases.length>0&&!B&&(B=!0,d(i,[...r.allCases],!0),P())}),Ee(()=>{e(w)?hr("errors",P,Wn()):ft("errors")});const U=pr(()=>{B&&P()});dr(()=>{ft("errors"),U()});let q=F(se(new Set));function g(K){const X=new Set(e(q));X.has(K)?X.delete(K):X.add(K),d(q,X,!0)}let s=F("severity"),C=F("desc");const H={info:0,warn:1,error:2};let W=z(()=>{const K=[...e(_)];return K.sort((X,ce)=>{let le=0;return e(s)==="severity"?le=(H[X.severity]??9)-(H[ce.severity]??9):e(s)==="count"?le=X.count-ce.count:le=X[e(s)].localeCompare(ce[e(s)]),e(C)==="asc"?le:-le}),K});const ee={severity:"desc",count:"desc",case_id:"asc",file:"asc"};function ne(K){e(s)===K?d(C,e(C)==="asc"?"desc":"asc",!0):(d(s,K,!0),d(C,ee[K],!0))}function me(){if(!e(_).length)return;const K=["case_id","file","severity","count","is_new","line_text"],X=e(W).map(we=>[we.case_id,we.file,we.severity,we.count,we.isNew?"yes":"no",`"${we.line_html.replace(/<[^>]*>/g,"").replace(/"/g,'""')}"`].join(",")),ce=[K.join(","),...X].join(` +`),le=_r("errors",e(i),"csv");za(ce,le)}Ht(t,{eyebrow:"Diagnostics",title:"Recent Errors",wide:!0,actions:X=>{var ce=xd(),le=Y(ce);{let Z=z(Wn);Zt(le,{name:"errors",get intervalMs(){return e(Z)},onRefresh:P,get checked(){return e(w)},set checked(_e){d(w,_e,!0)}})}var we=A(le,2);{var he=Z=>{Re(Z,{variant:"primary",onclick:P,children:(_e,Se)=>{var Pe=bd(),ge=Y(Pe);Le(ge,{get icon(){return Yt}}),Ce(),f(_e,Pe)},$$slots:{default:!0}})};G(we,Z=>{e(w)||Z(he)})}f(X,ce)},children:(X,ce)=>{var le=Fd(),we=Y(le);Wt(we,{children:(oe,ue)=>{var He=Cd(),te=Y(He);$e(te,{text:"Cases",children:(ve,Ue)=>{Bt(ve,{class:"w-[160px]",get options(){return e(E)},get selected(){return e(i)},onchange:j,placeholder:"Select cases..."})}});var J=A(te,2);$e(J,{text:"Files",children:(ve,Ue)=>{Bt(ve,{class:"w-[160px]",get options(){return e(D)},get selected(){return e(o)},onchange:I,placeholder:"Select files..."})}});var ae=A(J,2);$e(ae,{text:"Severity",children:(ve,Ue)=>{st(ve,{class:"w-[90px]",get options(){return L},get value(){return e(v)},onchange:V})}});var de=A(ae,2);$e(de,{text:"Search",children:(ve,Ue)=>{var ze=yd();qe(ze),ie("input",ze,$),Je(ze,()=>e(l),rt=>d(l,rt)),f(ve,ze)}});var xe=A(de,2);$e(xe,{text:"Context",children:(ve,Ue)=>{var ze=wd();qe(ze),ie("change",ze,O),Je(ze,()=>e(y),rt=>d(y,rt)),f(ve,ze)}});var Ae=A(xe,2),pe=k(Ae);{let ve=z(()=>e(_).length===0);Re(pe,{variant:"secondary",size:"sm",onclick:me,get disabled(){return e(ve)},children:(Ue,ze)=>{var rt=kd(),er=Y(rt);Le(er,{get icon(){return gr}}),Ce(),f(Ue,rt)},$$slots:{default:!0}})}p(Ae),f(oe,He)}});var he=A(we,2);{var Z=oe=>{var ue=Rd(),He=A(k(ue),2);je(He,16,()=>[{key:"severity",label:"Severity"},{key:"count",label:"Count"},{key:"case_id",label:"Case"},{key:"file",label:"File"}],te=>te.key,(te,J)=>{var ae=Pd(),de=k(ae,!0),xe=A(de);{var Ae=pe=>{var ve=Sd(),Ue=A(Y(ve));{let ze=z(()=>e(C)==="asc"?mi:hi);Le(Ue,{get icon(){return e(ze)},size:12})}f(pe,ve)};G(xe,pe=>{e(s)===J.key&&pe(Ae)})}p(ae),Q(()=>{ke(ae,1,`cursor-pointer bg-transparent border-none text-xs hover:underline ${e(s)===J.key?"text-edf-bleu-fonce font-bold":"text-muted"}`),re(de,J.label)}),ie("click",ae,()=>ne(J.key)),f(te,ae)}),p(ue),f(oe,ue)};G(he,oe=>{e(W).length>0&&oe(Z)})}var _e=A(he,2),Se=k(_e);{var Pe=oe=>{var ue=Ed();f(oe,ue)};G(Se,oe=>{e(W).length===0&&oe(Pe)})}var ge=A(Se,2);je(ge,17,()=>e(W),oe=>oe.fingerprint,(oe,ue)=>{var He=Ad(),te=k(He),J=k(te),ae=k(J);{let Qe=z(()=>e(q).has(e(ue).fingerprint)?yn:_i);Le(ae,{get icon(){return e(Qe)},size:14})}p(J);var de=A(J,2),xe=k(de);p(de);var Ae=A(de,2),pe=k(Ae);{var ve=Qe=>{var ut=$d(),zr=k(ut);p(ut),Q(()=>re(zr,`${e(ue).count??""}x`)),f(Qe,ut)};G(pe,Qe=>{e(ue).count>1&&Qe(ve)})}var Ue=A(pe,2);{var ze=Qe=>{var ut=Md();f(Qe,ut)};G(Ue,Qe=>{e(ue).isNew&&Qe(ze)})}p(Ae),p(te);var rt=A(te,2);{var er=Qe=>{var ut=Nd();Tr(ut,()=>e(ue).line_html,!0),p(ut),f(Qe,ut)},br=z(()=>e(q).has(e(ue).fingerprint));G(rt,Qe=>{e(br)&&Qe(er)})}p(He),Q(Qe=>{ke(He,1,`error-item ${Qe??""}`),re(xe,`${e(ue).case_id??""} / ${e(ue).file??""} : ${e(ue).severity??""}`)},[()=>h(e(ue).severity)]),ie("click",te,()=>g(e(ue).fingerprint)),f(oe,He)}),p(_e);var De=A(_e,2);{var be=oe=>{var ue=Ld(),He=k(ue),te=k(He);p(He);var J=A(He,2);{var ae=xe=>{var Ae=Td(),pe=k(Ae);p(Ae),Q(ve=>re(pe,`${ve??""} new`),[()=>e(_).filter(ve=>ve.isNew).length]),f(xe,Ae)},de=z(()=>e(_).some(xe=>xe.isNew));G(J,xe=>{e(de)&&xe(ae)})}p(ue),Q(()=>re(te,`${e(_).length??""} unique / ${e(T).length??""} total`)),f(oe,ue)};G(De,oe=>{e(W).length>0&&oe(be)})}var Oe=A(De,2);{var Fe=oe=>{var ue=Dd(),He=k(ue,!0);p(ue),Q(()=>re(He,e(S))),f(oe,ue)};G(Oe,oe=>{e(S)&&oe(Fe)})}Q(()=>ke(_e,1,`error-list ${e(b)?"opacity-50 pointer-events-none":""}`)),f(X,le)},$$slots:{actions:!0,default:!0}}),Ne()}Be(["input","change","click"]);var Id=M('
                Developed by Simvia
                ',1);function Kd(t,r){Me(r,!0);let a=F(se({totalCases:0,shownCases:0,totalRunning:0,shownRunning:0,totalConverged:0,shownConverged:0})),n=F(se([]));Ee(()=>{mn(),fn(()=>void $a())}),Ee(()=>{const s=Pt(),C=document.querySelector('link[rel="icon"]');C&&(s!=null&&s.icon)&&(C.href=Ts(s.solver))});async function i(){try{const s=await Ms();Fl(s.rows),zl(s.doe_columns),d(n,s.rows.map(C=>C.case_id),!0),d(a,Yl(Da(),Fr()),!0)}catch(s){console.error("Failed to load status:",s)}}un(()=>{i()});var o=Id(),u=Y(o);Vi(u,{});var v=A(u,2);Gi(v,{});var l=A(v,2);hl(l,{get totalCases(){return e(a).totalCases},get shownCases(){return e(a).shownCases},get totalRunning(){return e(a).totalRunning},get shownRunning(){return e(a).shownRunning},get totalConverged(){return e(a).totalConverged},get shownConverged(){return e(a).shownConverged}});var y=A(l,2),b=k(y);{var S=s=>{Pc(s,{onRefresh:i})},w=z(()=>Nt("status"));G(b,s=>{e(w)&&s(S)})}var T=A(b,2);{var N=s=>{Gc(s,{get allCases(){return e(n)}})},x=z(()=>Nt("residuals"));G(T,s=>{e(x)&&s(N)})}var c=A(T,2);{var m=s=>{_u(s,{get allCases(){return e(n)}})},P=z(()=>Nt("probes"));G(c,s=>{e(P)&&s(m)})}var _=A(c,2);{var R=s=>{$u(s,{get allCases(){return e(n)}})},$=z(()=>Nt("performance"));G(_,s=>{e($)&&s(R)})}var h=A(_,2);{var E=s=>{_d(s,{get allCases(){return e(n)}})},D=z(()=>Nt("compare"));G(h,s=>{e(D)&&s(E)})}var L=A(h,2);{var j=s=>{Yu(s,{get allCases(){return e(n)}})},I=z(()=>Nt("tail"));G(L,s=>{e(I)&&s(j)})}var V=A(L,2);{var O=s=>{zd(s,{get allCases(){return e(n)}})},B=z(()=>Nt("errors"));G(V,s=>{e(B)&&s(O)})}p(y);var U=A(y,2),q=A(k(U),2),g=k(q);p(q),p(U),Q(()=>ye(g,"src",pl)),f(t,o),Ne()}export{Kd as component}; diff --git a/frontend/dist/_app/version.json b/frontend/dist/_app/version.json index 57f5fe6..352b7e3 100644 --- a/frontend/dist/_app/version.json +++ b/frontend/dist/_app/version.json @@ -1 +1 @@ -{"version":"1791465414043"} \ No newline at end of file +{"version":"1791465900433"} \ No newline at end of file diff --git a/frontend/dist/index.html b/frontend/dist/index.html index 6d3072e..46e7c5e 100644 --- a/frontend/dist/index.html +++ b/frontend/dist/index.html @@ -5,30 +5,30 @@ csauto by Simvia - - - - - - - - - + + + + + + + + + {#if visible} - - {#snippet tabs()} -
                -
                Diagnostics
                -
                -
                +
                + - + -
                + ? 'text-edf-gris-moyen cursor-not-allowed opacity-50' + : activeTab === 'profile' + ? 'text-edf-bleu-fonce cursor-pointer' + : 'text-edf-gris-moyen cursor-pointer hover:text-muted'}" + onclick={() => switchTab("profile")} + disabled={!profileHasData} + title={!profileHasData + ? "No profile data available. Run a simulation first." + : ""} + > + Profiles +
                - {/snippet} - + + {/snippet} + {#snippet actions()} - +