From 0e348b28d0824ee99d6b5ec4640dbb3a1906d2df Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Fri, 14 Aug 2026 22:43:13 +0000 Subject: [PATCH 1/2] Add ORM-lens N+1/cascade checks, git churn, and UI themes Fold django-orm-lens heuristics into the typed graph (queryset N+1, cross-context CASCADE, migration blast radius) and CodeScene-style hotspots, bus factor, and temporal coupling into the review brief. Ship twelve UI themes from the rail and Settings, persisted locally. Co-authored-by: Damon --- README.md | 9 +- .../demo_monorepo/backend/billing/services.py | 8 + fixtures/demo_monorepo/loadpath.yml | 3 + loadpath.yml.example | 3 + src/loadpath/architecture/rules.py | 103 +++++ src/loadpath/config.py | 3 + src/loadpath/extractors/django.py | 9 + src/loadpath/orm/__init__.py | 1 + src/loadpath/orm/nplusone.py | 259 +++++++++++ src/loadpath/review/engine.py | 22 +- src/loadpath/review/evolution.py | 253 +++++++++++ src/loadpath/review/render.py | 14 + ...{index-BCwS4krr.css => index-BJMocGG4.css} | 2 +- src/loadpath/static/assets/index-BlJPyDt6.js | 62 --- src/loadpath/static/assets/index-DzkAzhEt.js | 62 +++ src/loadpath/static/index.html | 4 +- tests/e2e/test_ui_screenshots.py | 6 + tests/unit/test_architecture_rules.py | 46 ++ tests/unit/test_django_extractors.py | 34 ++ tests/unit/test_evolution.py | 39 ++ ui/src/App.tsx | 56 +++ ui/src/ImpactGraph.tsx | 10 +- ui/src/main.tsx | 3 + ui/src/styles.css | 416 +++++++++++++++++- ui/src/themes.test.ts | 13 + ui/src/themes.ts | 56 +++ ui/src/types.ts | 5 + 27 files changed, 1411 insertions(+), 90 deletions(-) create mode 100644 src/loadpath/orm/__init__.py create mode 100644 src/loadpath/orm/nplusone.py create mode 100644 src/loadpath/review/evolution.py rename src/loadpath/static/assets/{index-BCwS4krr.css => index-BJMocGG4.css} (58%) delete mode 100644 src/loadpath/static/assets/index-BlJPyDt6.js create mode 100644 src/loadpath/static/assets/index-DzkAzhEt.js create mode 100644 tests/unit/test_evolution.py create mode 100644 ui/src/themes.test.ts create mode 100644 ui/src/themes.ts diff --git a/README.md b/README.md index a2d5266..53f6a76 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,7 @@ plus the jobs the view enqueues (`send_invoice_email.delay`, `rebuild_ledger.sen ## App -`loadpath serve --port 7345` opens a local desktop-style UI. Tokens stay on the machine in `~/.loadpath/settings.json`. AI is used **only** for residual uncertainty the graph cannot close. +`loadpath serve --port 7345` opens a local desktop-style UI. Tokens stay on the machine in `~/.loadpath/settings.json`. AI is used **only** for residual uncertainty the graph cannot close. The rail and Settings page ship a dozen themes (Obsidian, Nord, Solarized, Paper, high-contrast, …); the choice stays in `localStorage`. ### Review @@ -143,11 +143,16 @@ AST is enough for review. If you need live `_meta` (db_table, resolved relations | `serializers_are_the_only_published_contract` | Zod/form fields must not drift from the serializer | | `no_queryset_in_serializer` | Serializers must not run querysets | | `celery_tasks_must_be_idempotent_on_model_pk` | Celery and Dramatiq tasks take a model pk | +| `queryset_nplusone` | Loops over querysets that touch related objects need `select_related` / `prefetch_related` | +| `cascade_crosses_context` | `on_delete=CASCADE` must not blast into another bounded context | +| `migration_blast_radius` | `RemoveField` / `DeleteModel` still referenced by the typed graph | Waivers live under `waivers:` in the same file. Reviewers are the `owners` of the bounded contexts in the impact subgraph. Impact walk skips permission/app/context hubs, does not climb `renders` into the App shell, and does not follow cross-context `relates_to` (an Invoice FK to UserProfile does not pull identity into a billing review). +Review also folds in a **churn & coupling** slice of git history (CodeScene-style hotspots, bus factor, temporal coupling, cyclomatic complexity on the changed functions) scoped to the same impact files — not a whole-repo hotspot map. + ## How confidence is scored Line coverage on changed files is the wrong metric. Loadpath scores the **impact subgraph**: @@ -186,4 +191,4 @@ CI installs Chromium and runs the full suite. ## What this is not -Not CodeRabbit (comments without a closed impact set). Not CodeScene (historical coupling). Not django-orm-lens (models only). Not a generic SCIP call graph. The product is review as load-path inspection. +Not CodeRabbit (comments without a closed impact set). Not a CodeScene clone (we do not replace its hotspot maps; we only score churn/coupling on the load path). Not django-orm-lens (we do not boot an ER explorer; we reuse its N+1 / cascade / blast-radius heuristics inside the typed graph). Not a generic SCIP call graph. The product is review as load-path inspection. diff --git a/fixtures/demo_monorepo/backend/billing/services.py b/fixtures/demo_monorepo/backend/billing/services.py index 6cdffeb..fd54af5 100644 --- a/fixtures/demo_monorepo/backend/billing/services.py +++ b/fixtures/demo_monorepo/backend/billing/services.py @@ -5,3 +5,11 @@ def recalculate_total(invoice: Invoice) -> Invoice: invoice.total = invoice.total invoice.save(update_fields=["total"]) return invoice + + +def overdue_account_emails(): + """Classic N+1: related FK accessed per row with no select_related.""" + names = [] + for invoice in Invoice.objects.filter(status="open"): + names.append(invoice.account.email) + return names diff --git a/fixtures/demo_monorepo/loadpath.yml b/fixtures/demo_monorepo/loadpath.yml index 30f8bec..0bc9fae 100644 --- a/fixtures/demo_monorepo/loadpath.yml +++ b/fixtures/demo_monorepo/loadpath.yml @@ -25,6 +25,9 @@ rules: - serializers_are_the_only_published_contract - no_queryset_in_serializer - celery_tasks_must_be_idempotent_on_model_pk + - queryset_nplusone + - cascade_crosses_context + - migration_blast_radius django_root: backend react_root: frontend/src openapi_paths: diff --git a/loadpath.yml.example b/loadpath.yml.example index 1a2368f..0da7da2 100644 --- a/loadpath.yml.example +++ b/loadpath.yml.example @@ -24,6 +24,9 @@ rules: - serializers_are_the_only_published_contract - no_queryset_in_serializer - celery_tasks_must_be_idempotent_on_model_pk + - queryset_nplusone + - cascade_crosses_context + - migration_blast_radius django_root: backend react_root: frontend/src openapi_paths: [] diff --git a/src/loadpath/architecture/rules.py b/src/loadpath/architecture/rules.py index 5fef789..8c895d4 100644 --- a/src/loadpath/architecture/rules.py +++ b/src/loadpath/architecture/rules.py @@ -15,6 +15,9 @@ "no_queryset_in_serializer": "Serializers must not run querysets.", "celery_tasks_must_be_idempotent_on_model_pk": "Celery and Dramatiq tasks must take a model pk/id, not a full object payload.", "async_tasks_must_be_idempotent_on_model_pk": "Celery and Dramatiq tasks must take a model pk/id, not a full object payload.", + "queryset_nplusone": "Querysets iterated in a loop must select_related/prefetch_related related objects they touch.", + "cascade_crosses_context": "on_delete=CASCADE must not blast into another bounded context.", + "migration_blast_radius": "Destructive migrations must not drop fields/models still referenced on the load path.", } @@ -63,6 +66,12 @@ def evaluate(store: GraphStore, config: LoadpathConfig, changed_ids: set[str] | findings.extend(_queryset_in_serializer(store)) if "celery_tasks_must_be_idempotent_on_model_pk" in enabled or "async_tasks_must_be_idempotent_on_model_pk" in enabled: findings.extend(_task_idempotency(store, changed_ids)) + if "queryset_nplusone" in enabled: + findings.extend(_nplusone(store)) + if "cascade_crosses_context" in enabled: + findings.extend(_cascade_crosses_context(store, config)) + if "migration_blast_radius" in enabled: + findings.extend(_migration_blast_radius(store)) for f in findings: f.waived = _waived(config, f.rule, f.node_id) @@ -282,3 +291,97 @@ def _task_idempotency(store: GraphStore, changed_ids: set[str] | None) -> list[F ) ) return out + + +def _nplusone(store: GraphStore) -> list[Finding]: + out: list[Finding] = [] + for node in store.nodes(): + hits = (node.get("extra") or {}).get("nplusone") or [] + for hit in hits: + accessed = ", ".join(hit.get("accessed") or []) or "related fields" + fix = hit.get("suggested_fix") or ".select_related()" + out.append( + Finding( + rule="queryset_nplusone", + severity=RuleSeverity.WARNING, + message=( + f"{node['name']} loops `{hit.get('loop_var')}` over a queryset and touches {accessed} " + f"without {fix} ({node.get('file_path')}:{hit.get('line')})" + ), + node_id=node["id"], + file_path=node.get("file_path"), + extra=hit, + ) + ) + return out + + +def _cascade_crosses_context(store: GraphStore, config: LoadpathConfig) -> list[Finding]: + out: list[Finding] = [] + fields = {n["id"]: n for n in store.nodes([NodeType.FIELD])} + models = {n["id"]: n for n in store.nodes([NodeType.MODEL])} + for edge in store.edges(): + if edge["type"] != EdgeType.RELATES_TO.value: + continue + if (edge.get("extra") or {}).get("on_delete") != "CASCADE": + continue + field = fields.get(edge["src"]) + target = models.get(edge["dst"]) or store.get_node(edge["dst"]) + if not field or not target: + continue + src_model = field["qualified_name"].rsplit(".", 1)[0] + src_app = (field.get("extra") or {}).get("app") or src_model.split(".")[0] + dst_app = (target.get("extra") or {}).get("app") or (target.get("qualified_name") or "").split(".")[0] + sctx = field.get("context") or config.context_for_django_app(src_app) + dctx = target.get("context") or config.context_for_django_app(dst_app) + if sctx and dctx and sctx != dctx: + out.append( + Finding( + rule="cascade_crosses_context", + severity=RuleSeverity.WARNING, + message=( + f"{field['qualified_name']} CASCADE-deletes {target.get('qualified_name')} " + f"across {sctx} → {dctx}" + ), + node_id=field["id"], + file_path=field.get("file_path"), + extra={"other_context": dctx, "on_delete": "CASCADE"}, + ) + ) + return out + + +def _migration_blast_radius(store: GraphStore) -> list[Finding]: + out: list[Finding] = [] + refs = {n["id"]: n for n in store.nodes([NodeType.FIELD, NodeType.MODEL, NodeType.SERIALIZER_FIELD])} + for op in store.nodes([NodeType.MIGRATION_OP]): + extra = op.get("extra") or {} + kind = extra.get("op") + if kind not in {"RemoveField", "DeleteModel"}: + continue + args = extra.get("args") or [] + targets: list[str] = [] + app = extra.get("app") or "" + if kind == "RemoveField" and len(args) >= 2: + targets.append(f"{app}.{args[0]}.{args[1]}") + elif kind == "DeleteModel" and args: + targets.append(f"{app}.{args[0]}") + still = [ + node + for node in refs.values() + if (node.get("qualified_name") or "").lower() in {t.lower() for t in targets} + ] + if not still: + continue + names = ", ".join(sorted({n["qualified_name"] for n in still})[:6]) + out.append( + Finding( + rule="migration_blast_radius", + severity=RuleSeverity.WARNING, + message=f"{op['name']} still referenced by {names}", + node_id=op["id"], + file_path=op.get("file_path"), + extra={"op": kind, "still": [n["id"] for n in still[:8]]}, + ) + ) + return out diff --git a/src/loadpath/config.py b/src/loadpath/config.py index a6e9c6e..34c0dee 100644 --- a/src/loadpath/config.py +++ b/src/loadpath/config.py @@ -12,6 +12,9 @@ "serializers_are_the_only_published_contract", "no_queryset_in_serializer", "celery_tasks_must_be_idempotent_on_model_pk", + "queryset_nplusone", + "cascade_crosses_context", + "migration_blast_radius", ] diff --git a/src/loadpath/extractors/django.py b/src/loadpath/extractors/django.py index 742102f..6df8b7d 100644 --- a/src/loadpath/extractors/django.py +++ b/src/loadpath/extractors/django.py @@ -129,6 +129,10 @@ def _kw(call: ast.Call, key: str) -> ast.AST | None: return None +def _truthy(node: ast.AST | None) -> bool: + return isinstance(node, ast.Constant) and node.value is True + + def _app_from_path(rel: str) -> str | None: parts = Path(rel).parts # backend/billing/models.py → billing @@ -323,6 +327,8 @@ def _model(self, node: ast.ClassDef) -> None: on_delete = _name(od) extra["on_delete"] = on_delete.split(".")[-1] if on_delete else None extra["related_name"] = _const_str(_kw(stmt.value, "related_name")) + extra["db_index"] = _truthy(_kw(stmt.value, "db_index")) + extra["unique"] = _truthy(_kw(stmt.value, "unique")) field_node = self.add_node(NodeType.FIELD, fname, field_q, stmt.lineno, extra) self.add_edge(model.id, field_node.id, EdgeType.HAS_FIELD) if rel_to: @@ -974,6 +980,9 @@ def extract_django_file(rel_path: str, source: str, config: LoadpathConfig) -> E return g extractor = DjangoExtractor(rel, source, config) extractor.visit(tree) + from loadpath.orm.nplusone import apply_nplusone + + apply_nplusone(extractor.graph, tree) return extractor.graph diff --git a/src/loadpath/orm/__init__.py b/src/loadpath/orm/__init__.py new file mode 100644 index 0000000..1164a30 --- /dev/null +++ b/src/loadpath/orm/__init__.py @@ -0,0 +1 @@ +"""ORM-lens style static checks that feed the load-path graph.""" diff --git a/src/loadpath/orm/nplusone.py b/src/loadpath/orm/nplusone.py new file mode 100644 index 0000000..2e5d4e4 --- /dev/null +++ b/src/loadpath/orm/nplusone.py @@ -0,0 +1,259 @@ +"""Static N+1 detector (django-orm-lens shape) for Django source. + +Flags `for x in qs:` bodies that traverse related objects without a matching +`select_related` / `prefetch_related` on that queryset. Structural only: no +Django boot. Prefers misses over invented findings. + +Findings live on the enclosing view/service node (`extra.nplusone`). They are +not stored as index residuals, so a serializer-field review does not inherit +an unrelated loop in `services.py`. +""" + +from __future__ import annotations + +import ast +from dataclasses import dataclass, field + +from loadpath.types import ExtractedGraph + +QS_MARKERS = ( + "objects", + "filter", + "exclude", + "all", + "select_related", + "prefetch_related", + "get_queryset", + "annotate", + "only", + "defer", +) +PREFETCH_HINTS = {"all", "filter", "exclude", "count", "exists"} + + +@dataclass +class NPlusOne: + line: int + loop_var: str + queryset: str + accessed: list[str] + kind: str + suggested_fix: str + confidence: str + owner: str | None = None + extra: dict = field(default_factory=dict) + + def to_dict(self) -> dict: + return { + "line": self.line, + "loop_var": self.loop_var, + "queryset": self.queryset, + "accessed": self.accessed, + "kind": self.kind, + "suggested_fix": self.suggested_fix, + "confidence": self.confidence, + "owner": self.owner, + } + + +def apply_nplusone(graph: ExtractedGraph, tree: ast.AST) -> list[NPlusOne]: + findings = scan_nplusone(tree) + if not findings: + return [] + by_name = {n.name: n for n in graph.nodes} + for item in findings: + owner = by_name.get(item.owner or "") + if owner is None: + continue + bucket = list(owner.extra.get("nplusone") or []) + bucket.append(item.to_dict()) + owner.extra["nplusone"] = bucket + return findings + + +def scan_nplusone(tree: ast.AST) -> list[NPlusOne]: + findings: list[NPlusOne] = [] + + def visit_function(fn: ast.FunctionDef | ast.AsyncFunctionDef, owner: str) -> None: + bindings: dict[str, ast.AST] = {} + for stmt in fn.body: + _bind(stmt, bindings) + for child in ast.walk(fn): + if isinstance(child, ast.For): + _scan_for(child, bindings, owner, findings) + + if not isinstance(tree, ast.Module): + return findings + for node in tree.body: + if isinstance(node, ast.ClassDef): + for stmt in node.body: + if isinstance(stmt, (ast.FunctionDef, ast.AsyncFunctionDef)): + visit_function(stmt, node.name) + elif isinstance(node, (ast.FunctionDef, ast.AsyncFunctionDef)): + visit_function(node, node.name) + return findings + + +def _bind(stmt: ast.AST, bindings: dict[str, ast.AST]) -> None: + if isinstance(stmt, ast.Assign): + for target in stmt.targets: + if isinstance(target, ast.Name): + bindings[target.id] = stmt.value + elif isinstance(stmt, ast.AnnAssign) and isinstance(stmt.target, ast.Name) and stmt.value is not None: + bindings[stmt.target.id] = stmt.value + elif isinstance(stmt, (ast.If, ast.For, ast.With, ast.Try, ast.While)): + for child in ast.iter_child_nodes(stmt): + if isinstance(child, (ast.FunctionDef, ast.AsyncFunctionDef, ast.ClassDef)): + continue + _bind(child, bindings) + + +def _scan_for(node: ast.For, bindings: dict[str, ast.AST], owner: str, findings: list[NPlusOne]) -> None: + if not isinstance(node.target, ast.Name): + return + loop_var = node.target.id + source = node.iter + if isinstance(source, ast.Name) and source.id in bindings: + source = bindings[source.id] + qs_text, selects, prefetches, is_qs = _queryset_shape(source) + if not is_qs: + return + select_hits: list[str] = [] + prefetch_hits: list[str] = [] + for child in ast.walk(node): + kind, field = _related_access(child, loop_var) + if not kind or not field: + continue + if kind == "select_related" and field not in select_hits: + select_hits.append(field) + elif kind == "prefetch_related" and field not in prefetch_hits: + prefetch_hits.append(field) + if "*" in selects: + select_hits = [] + else: + select_hits = [f for f in select_hits if f.split("__")[0] not in selects] + if "*" in prefetches: + prefetch_hits = [] + else: + prefetch_hits = [f for f in prefetch_hits if f.split("__")[0] not in prefetches] + if not select_hits and not prefetch_hits: + return + accessed = select_hits + prefetch_hits + if prefetch_hits and select_hits: + kind = "select_related+prefetch_related" + elif prefetch_hits: + kind = "prefetch_related" + else: + kind = "select_related" + bits: list[str] = [] + if select_hits: + bits.append(".select_related(" + ", ".join(repr(f) for f in select_hits) + ")") + if prefetch_hits: + bits.append(".prefetch_related(" + ", ".join(repr(f) for f in prefetch_hits) + ")") + confidence = "high" if prefetch_hits else "medium" + findings.append( + NPlusOne( + line=node.lineno, + loop_var=loop_var, + queryset=qs_text, + accessed=accessed, + kind=kind, + suggested_fix="".join(bits), + confidence=confidence, + owner=owner, + ) + ) + + +def _queryset_shape(node: ast.AST) -> tuple[str, set[str], set[str], bool]: + text = _unparse(node) + blob = text.replace(" ", "") + looks = any(m in blob for m in QS_MARKERS) or ".objects." in blob + selects: set[str] = set() + prefetches: set[str] = set() + for call in _call_chain(node): + short = _call_name(call) + args = [a for a in (_const_str(a) for a in call.args) if a] + if short == "select_related": + if args: + selects.update(a.split("__")[0] for a in args) + else: + selects.add("*") + elif short == "prefetch_related": + if args: + prefetches.update(a.split("__")[0] for a in args) + else: + prefetches.add("*") + for kw in call.keywords: + val = kw.value + if isinstance(val, ast.Call) and val.args: + inner = _const_str(val.args[0]) + if inner: + prefetches.add(inner.split("__")[0]) + return text, selects, prefetches, looks + + +def _related_access(node: ast.AST, loop_var: str) -> tuple[str | None, str]: + if isinstance(node, ast.Call) and isinstance(node.func, ast.Attribute): + short = node.func.attr + root, fields = _attr_root(node.func.value) + if root == loop_var and fields and short in PREFETCH_HINTS: + return "prefetch_related", fields[0] + if isinstance(node, ast.Attribute): + root, fields = _attr_root(node) + if root != loop_var or not fields: + return None, "" + first = fields[0] + if first.endswith("_set"): + return "prefetch_related", first + if len(fields) >= 2: + return "select_related", first + return None, "" + + +def _attr_root(node: ast.AST) -> tuple[str | None, list[str]]: + fields: list[str] = [] + cur: ast.AST | None = node + while isinstance(cur, ast.Attribute): + fields.append(cur.attr) + cur = cur.value + fields.reverse() + if isinstance(cur, ast.Name): + return cur.id, fields + return None, fields + + +def _call_chain(node: ast.AST) -> list[ast.Call]: + out: list[ast.Call] = [] + cur: ast.AST | None = node + while cur is not None: + if isinstance(cur, ast.Call): + out.append(cur) + nxt = cur.func + cur = nxt.value if isinstance(nxt, ast.Attribute) else None + elif isinstance(cur, ast.Attribute): + cur = cur.value + else: + break + return out + + +def _call_name(call: ast.Call) -> str: + if isinstance(call.func, ast.Name): + return call.func.id + if isinstance(call.func, ast.Attribute): + return call.func.attr + return "" + + +def _const_str(node: ast.AST | None) -> str | None: + if isinstance(node, ast.Constant) and isinstance(node.value, str): + return node.value + return None + + +def _unparse(node: ast.AST) -> str: + try: + return ast.unparse(node) + except Exception: + return type(node).__name__ diff --git a/src/loadpath/review/engine.py b/src/loadpath/review/engine.py index b012d47..83f8447 100644 --- a/src/loadpath/review/engine.py +++ b/src/loadpath/review/engine.py @@ -11,6 +11,7 @@ from loadpath.review.cluster import cluster_diff from loadpath.review.confidence import score_confidence from loadpath.review.diff import DiffSet, git_diff +from loadpath.review.evolution import analyze_evolution from loadpath.types import ( ChangeKind, GENERATED_PATH_MARKERS, @@ -162,6 +163,11 @@ def collect_residuals(store: GraphStore, impact_nodes: list[dict]) -> list[str]: residuals.append(f"Inferred client {n.get('name')} in {n.get('file_path')}") if extra.get("queryset_in_serializer"): residuals.append(f"Queryset inside serializer {n['qualified_name']}") + for hit in extra.get("nplusone") or []: + accessed = ", ".join(hit.get("accessed") or []) or "related fields" + residuals.append( + f"N+1 {accessed} in {n.get('file_path')}:{hit.get('line')} — {hit.get('suggested_fix')}" + ) seen = set() out = [] for r in residuals: @@ -234,7 +240,13 @@ def run_review( or not impact_ids ] residuals = collect_residuals(store, impact_nodes) + evolution = analyze_evolution(repo_root, diff, impact_nodes, config) confidence = score_confidence(store, impact_nodes, impact_edges, scoped, residuals) + if evolution.get("notes") and confidence["level"] == "high": + confidence["level"] = "medium" + reasons = list(confidence.get("reasons") or []) + reasons = [evolution["notes"][0], *reasons][:3] + confidence["reasons"] = reasons kinds = classify_change(impact_nodes, scoped, seeds=store.nodes_in_files(diff.paths)) read, skip = read_order_files(diff, impact_nodes) reviewers = suggested_reviewers(config, impact_nodes) @@ -272,6 +284,7 @@ def run_review( "sinks": sinks, "tests_note": tests_note, "architecture_note": arch_note, + "evolution": evolution, "nodes": impact_nodes, "edges": impact_edges, "counts": store.counts(), @@ -283,7 +296,9 @@ def run_review( "reindexed": reindex, "incremental": incremental if reindex else store.get_meta("incremental") == "1", }, - "headline": _headline(confidence, title, sinks, tests_note, arch_note, residuals, reviewers), + "headline": _headline( + confidence, title, sinks, tests_note, arch_note, residuals, reviewers, evolution + ), } store.save_review(payload["id"], payload["created_at"], str(repo_root), diff.base, diff.head, payload) store.close() @@ -349,7 +364,7 @@ def _arch_note(findings: list, kinds: list[str], impact_nodes: list[dict] | None return "no cross-context rule hits" -def _headline(confidence, title, sinks, tests_note, arch_note, residuals, reviewers) -> str: +def _headline(confidence, title, sinks, tests_note, arch_note, residuals, reviewers, evolution=None) -> str: sink_bits = [] routes = [s["name"] for s in sinks if s["type"] == NodeType.ROUTE.value] celery_tasks = [s["name"] for s in sinks if s["type"] == NodeType.TASK.value and s.get("broker") == "celery"] @@ -372,11 +387,14 @@ def _headline(confidence, title, sinks, tests_note, arch_note, residuals, review sink_bits.append("React " + ", ".join(pages[:4])) residual = residuals[0] if residuals else "none" owners = ", ".join(reviewers) if reviewers else "context owners" + pressure = (evolution or {}).get("notes") or [] + churn = pressure[0] if pressure else "none" return ( f"Loadpath: {confidence['level'].upper()} — {title}\n" f"Sinks: {'; '.join(sink_bits) or 'none typed'}\n" f"Tests: {tests_note}\n" f"Architecture: {arch_note}\n" f"Residual: {residual}\n" + f"Churn: {churn}\n" f"Suggested reviewers: {owners}" ) diff --git a/src/loadpath/review/evolution.py b/src/loadpath/review/evolution.py new file mode 100644 index 0000000..b5a4a6a --- /dev/null +++ b/src/loadpath/review/evolution.py @@ -0,0 +1,253 @@ +"""CodeScene-style evolution: hotspots, change coupling, knowledge, complexity. + +Mined from git history and the current diff, then scoped to the load-path +impact set. Empty when the repo has no history. +""" + +from __future__ import annotations + +import ast +import re +import subprocess +from collections import Counter, defaultdict +from pathlib import Path + +from loadpath.config import LoadpathConfig +from loadpath.review.diff import DiffSet, FileDiff + +COMMIT_HEADER = re.compile(r"^([0-9a-f]{40})\t(.*)$") +LOG_LIMIT = 250 +COUPLE_MIN = 3 + + +def analyze_evolution( + repo_root: Path, + diff: DiffSet, + impact_nodes: list[dict], + config: LoadpathConfig | None = None, + limit: int = LOG_LIMIT, +) -> dict: + repo_root = repo_root.resolve() + impact_files = sorted( + {n["file_path"] for n in impact_nodes if n.get("file_path")} | set(diff.paths) + ) + commits = _git_commits(repo_root, limit) + if not commits: + return {"hotspots": [], "change_coupling": [], "notes": [], "commits_sampled": 0} + + file_commits: dict[str, int] = Counter() + file_authors: dict[str, set[str]] = defaultdict(set) + pair_counts: Counter[tuple[str, str]] = Counter() + for commit in commits: + files = [f for f in commit["files"] if _sourcey(f)] + for path in files: + file_commits[path] += 1 + file_authors[path].add(commit["author"]) + for i, a in enumerate(files): + for b in files[i + 1 :]: + pair = (a, b) if a < b else (b, a) + pair_counts[pair] += 1 + + complexity = _complexity_for_diff(repo_root, diff) + hotspots = [] + for path in impact_files: + commits_n = file_commits.get(path, 0) + authors = sorted(file_authors.get(path, set())) + if not commits_n and path not in complexity: + continue + hotspots.append( + { + "path": path, + "commits": commits_n, + "authors": authors, + "bus_factor": len(authors), + "complexity": complexity.get(path, 0), + } + ) + hotspots.sort(key=lambda h: (h["commits"], h["complexity"]), reverse=True) + + coupling = [] + impact_set = set(impact_files) + for (a, b), together in pair_counts.most_common(40): + if together < COUPLE_MIN: + continue + if a not in impact_set and b not in impact_set: + continue + other = b if a in impact_set else a + if other in impact_set and a in impact_set: + # both on the path — expected if they are the same slice + continue + denom = max(file_commits.get(a, 1), file_commits.get(b, 1)) + coupling.append( + { + "a": a, + "b": b, + "together": together, + "degree": round(together / denom, 3), + "cross_context": _cross_context(a, b, config) if config else False, + } + ) + if len(coupling) >= 12: + break + + notes = _notes(hotspots, coupling) + return { + "hotspots": hotspots[:16], + "change_coupling": coupling, + "notes": notes, + "commits_sampled": len(commits), + } + + +def _notes(hotspots: list[dict], coupling: list[dict]) -> list[str]: + notes: list[str] = [] + for h in hotspots: + if h["commits"] >= 5 and h["bus_factor"] == 1: + who = h["authors"][0] if h["authors"] else "one author" + notes.append( + f"{h['path']} is a hotspot ({h['commits']} commits, knowledge silo: {who})" + ) + elif h["commits"] >= 8: + notes.append(f"{h['path']} is a hotspot ({h['commits']} commits on the load path)") + elif h["complexity"] >= 12 and h["commits"] >= 3: + notes.append( + f"{h['path']} changed with cyclomatic complexity {h['complexity']} in a historically active file" + ) + for c in coupling: + if c.get("cross_context") and c["degree"] >= 0.4: + notes.append( + f"Temporal coupling {c['a']} ↔ {c['b']} ({c['together']} co-changes, degree {c['degree']}) " + "crosses a bounded context — the architecture graph may not show this dependency" + ) + elif c["degree"] >= 0.6: + notes.append( + f"Temporal coupling {c['a']} ↔ {c['b']} ({c['together']} co-changes) — files move together" + ) + # unique preserve order + seen: set[str] = set() + out: list[str] = [] + for n in notes: + if n not in seen: + seen.add(n) + out.append(n) + return out[:8] + + +def _git_commits(repo_root: Path, limit: int) -> list[dict]: + try: + raw = subprocess.check_output( + [ + "git", + "-C", + str(repo_root), + "log", + f"-n{limit}", + "--name-only", + "--no-merges", + "--pretty=format:%H%x09%an", + ], + text=True, + stderr=subprocess.DEVNULL, + ) + except (subprocess.CalledProcessError, FileNotFoundError): + return [] + commits: list[dict] = [] + current: dict | None = None + for line in raw.splitlines(): + if not line.strip(): + continue + header = COMMIT_HEADER.match(line) + if header: + current = {"sha": header.group(1), "author": header.group(2), "files": []} + commits.append(current) + continue + if current is not None: + current["files"].append(line.strip()) + return commits + + +def _complexity_for_diff(repo_root: Path, diff: DiffSet) -> dict[str, int]: + out: dict[str, int] = {} + for fd in diff.files: + if fd.skip or not fd.path.endswith(".py"): + continue + changed = _changed_lines(fd) + path = repo_root / fd.path + if not path.is_file(): + continue + try: + tree = ast.parse(path.read_text(encoding="utf-8", errors="replace")) + except SyntaxError: + continue + score = 0 + for node in ast.walk(tree): + if isinstance(node, (ast.FunctionDef, ast.AsyncFunctionDef, ast.ClassDef)): + start = getattr(node, "lineno", 0) or 0 + end = getattr(node, "end_lineno", start) or start + if changed and not any(start <= ln <= end for ln in changed): + continue + score += _cyclomatic(node) + out[fd.path] = score + return out + + +def _cyclomatic(node: ast.AST) -> int: + n = 1 + for child in ast.walk(node): + if isinstance(child, (ast.If, ast.For, ast.AsyncFor, ast.While, ast.ExceptHandler, ast.With, ast.Assert)): + n += 1 + elif isinstance(child, ast.BoolOp): + n += max(0, len(child.values) - 1) + elif isinstance(child, ast.comprehension): + n += 1 + return n + + +def _changed_lines(fd: FileDiff) -> set[int]: + lines: set[int] = set() + new_line = 0 + for raw in (fd.patch or "").splitlines(): + if raw.startswith("@@"): + # @@ -a,b +c,d @@ + plus = raw.split("+", 1)[-1] + start = plus.split(",")[0].split(" ")[0] + try: + new_line = int(start) + except ValueError: + new_line = 0 + continue + if raw.startswith("+++") or raw.startswith("---"): + continue + if raw.startswith("+"): + if new_line: + lines.add(new_line) + new_line += 1 + elif raw.startswith("-"): + continue + else: + new_line += 1 + return lines + + +def _sourcey(path: str) -> bool: + return path.endswith((".py", ".ts", ".tsx", ".js", ".jsx")) + + +def _cross_context(a: str, b: str, config: LoadpathConfig) -> bool: + ca = config.context_for_react_path(a) or _django_ctx(a, config) + cb = config.context_for_react_path(b) or _django_ctx(b, config) + return bool(ca and cb and ca != cb) + + +def _django_ctx(path: str, config: LoadpathConfig) -> str | None: + parts = path.replace("\\", "/").split("/") + for i, part in enumerate(parts): + if part == config.django_root and i + 1 < len(parts): + return config.context_for_django_app(parts[i + 1]) + if part in config.contexts: + return part + for ctx in config.contexts.values(): + for app in ctx.django_apps: + if f"/{app}/" in f"/{path}/": + return ctx.name + return None diff --git a/src/loadpath/review/render.py b/src/loadpath/review/render.py index ad37454..74d2928 100644 --- a/src/loadpath/review/render.py +++ b/src/loadpath/review/render.py @@ -45,6 +45,20 @@ def render_markdown(review: dict) -> str: lines.append(f"- {r}") if review["low_risk"]: lines += ["", "_Fast-track: `loadpath:low-risk`. Human review can be a glance._"] + evolution = review.get("evolution") or {} + if evolution.get("notes") or evolution.get("hotspots"): + lines += ["", "### Churn & coupling"] + for note in evolution.get("notes") or []: + lines.append(f"- {note}") + for h in (evolution.get("hotspots") or [])[:6]: + if h.get("commits"): + lines.append( + f"- `{h['path']}` — {h['commits']} commits, bus factor {h.get('bus_factor', 0)}" + + (f", complexity {h['complexity']}" if h.get("complexity") else "") + ) + for c in (evolution.get("change_coupling") or [])[:4]: + flag = " (cross-context)" if c.get("cross_context") else "" + lines.append(f"- coupling `{c['a']}` ↔ `{c['b']}` ×{c['together']}{flag}") index = review.get("index") or {} counts = index.get("counts") or review.get("counts") or {} if counts: diff --git a/src/loadpath/static/assets/index-BCwS4krr.css b/src/loadpath/static/assets/index-BJMocGG4.css similarity index 58% rename from src/loadpath/static/assets/index-BCwS4krr.css rename to src/loadpath/static/assets/index-BJMocGG4.css index 7f56e4e..8fd8e9d 100644 --- a/src/loadpath/static/assets/index-BCwS4krr.css +++ b/src/loadpath/static/assets/index-BJMocGG4.css @@ -1 +1 @@ -.react-flow{direction:ltr;--xy-edge-stroke-default: #b1b1b7;--xy-edge-stroke-width-default: 1;--xy-edge-stroke-selected-default: #555;--xy-connectionline-stroke-default: #b1b1b7;--xy-connectionline-stroke-width-default: 1;--xy-attribution-background-color-default: rgba(255, 255, 255, .5);--xy-minimap-background-color-default: #fff;--xy-minimap-mask-background-color-default: rgba(240, 240, 240, .6);--xy-minimap-mask-stroke-color-default: transparent;--xy-minimap-mask-stroke-width-default: 1;--xy-minimap-node-background-color-default: #e2e2e2;--xy-minimap-node-stroke-color-default: transparent;--xy-minimap-node-stroke-width-default: 2;--xy-background-color-default: transparent;--xy-background-pattern-dots-color-default: #91919a;--xy-background-pattern-lines-color-default: #eee;--xy-background-pattern-cross-color-default: #e2e2e2;background-color:var(--xy-background-color, var(--xy-background-color-default));--xy-node-color-default: inherit;--xy-node-border-default: 1px solid #1a192b;--xy-node-background-color-default: #fff;--xy-node-group-background-color-default: rgba(240, 240, 240, .25);--xy-node-boxshadow-hover-default: 0 1px 4px 1px rgba(0, 0, 0, .08);--xy-node-boxshadow-selected-default: 0 0 0 .5px #1a192b;--xy-node-border-radius-default: 3px;--xy-handle-background-color-default: #1a192b;--xy-handle-border-color-default: #fff;--xy-selection-background-color-default: rgba(0, 89, 220, .08);--xy-selection-border-default: 1px dotted rgba(0, 89, 220, .8);--xy-controls-button-background-color-default: #fefefe;--xy-controls-button-background-color-hover-default: #f4f4f4;--xy-controls-button-color-default: inherit;--xy-controls-button-color-hover-default: inherit;--xy-controls-button-border-color-default: #eee;--xy-controls-box-shadow-default: 0 0 2px 1px rgba(0, 0, 0, .08);--xy-edge-label-background-color-default: #ffffff;--xy-edge-label-color-default: inherit;--xy-resize-background-color-default: #3367d9}.react-flow.dark{--xy-edge-stroke-default: #3e3e3e;--xy-edge-stroke-width-default: 1;--xy-edge-stroke-selected-default: #727272;--xy-connectionline-stroke-default: #b1b1b7;--xy-connectionline-stroke-width-default: 1;--xy-attribution-background-color-default: rgba(150, 150, 150, .25);--xy-minimap-background-color-default: #141414;--xy-minimap-mask-background-color-default: rgba(60, 60, 60, .6);--xy-minimap-mask-stroke-color-default: transparent;--xy-minimap-mask-stroke-width-default: 1;--xy-minimap-node-background-color-default: #2b2b2b;--xy-minimap-node-stroke-color-default: transparent;--xy-minimap-node-stroke-width-default: 2;--xy-background-color-default: #141414;--xy-background-pattern-dots-color-default: #555;--xy-background-pattern-lines-color-default: #333;--xy-background-pattern-cross-color-default: #333;--xy-node-color-default: #f8f8f8;--xy-node-border-default: 1px solid #3c3c3c;--xy-node-background-color-default: #1e1e1e;--xy-node-group-background-color-default: rgba(240, 240, 240, .25);--xy-node-boxshadow-hover-default: 0 1px 4px 1px rgba(255, 255, 255, .08);--xy-node-boxshadow-selected-default: 0 0 0 .5px #999;--xy-handle-background-color-default: #bebebe;--xy-handle-border-color-default: #1e1e1e;--xy-selection-background-color-default: rgba(200, 200, 220, .08);--xy-selection-border-default: 1px dotted rgba(200, 200, 220, .8);--xy-controls-button-background-color-default: #2b2b2b;--xy-controls-button-background-color-hover-default: #3e3e3e;--xy-controls-button-color-default: #f8f8f8;--xy-controls-button-color-hover-default: #fff;--xy-controls-button-border-color-default: #5b5b5b;--xy-controls-box-shadow-default: 0 0 2px 1px rgba(0, 0, 0, .08);--xy-edge-label-background-color-default: #141414;--xy-edge-label-color-default: #f8f8f8}.react-flow__background{background-color:var(--xy-background-color-props, var(--xy-background-color, var(--xy-background-color-default)));pointer-events:none;z-index:-1}.react-flow__container{position:absolute;width:100%;height:100%;top:0;left:0}.react-flow__pane{z-index:1;touch-action:none}.react-flow__pane.draggable{cursor:grab}.react-flow__pane.dragging{cursor:grabbing}.react-flow__pane.selection{cursor:pointer}.react-flow__viewport{transform-origin:0 0;z-index:2;pointer-events:none}.react-flow__renderer{z-index:4}.react-flow__selection{z-index:6}.react-flow__nodesselection-rect:focus,.react-flow__nodesselection-rect:focus-visible{outline:none}.react-flow__edge-path{stroke:var(--xy-edge-stroke, var(--xy-edge-stroke-default));stroke-width:var(--xy-edge-stroke-width, var(--xy-edge-stroke-width-default));fill:none}.react-flow__connection-path{stroke:var(--xy-connectionline-stroke, var(--xy-connectionline-stroke-default));stroke-width:var(--xy-connectionline-stroke-width, var(--xy-connectionline-stroke-width-default));fill:none}.react-flow .react-flow__edges{position:absolute}.react-flow .react-flow__edges svg{overflow:visible;position:absolute;pointer-events:none}.react-flow__edge{pointer-events:visibleStroke}.react-flow__edge.selectable{cursor:pointer}.react-flow__edge.animated path{stroke-dasharray:5;animation:dashdraw .5s linear infinite}.react-flow__edge.animated path.react-flow__edge-interaction{stroke-dasharray:none;animation:none}.react-flow__edge.inactive{pointer-events:none}.react-flow__edge.selected,.react-flow__edge:focus,.react-flow__edge:focus-visible{outline:none}.react-flow__edge.selected .react-flow__edge-path,.react-flow__edge.selectable:focus .react-flow__edge-path,.react-flow__edge.selectable:focus-visible .react-flow__edge-path{stroke:var(--xy-edge-stroke-selected, var(--xy-edge-stroke-selected-default))}.react-flow__edge-textwrapper{pointer-events:all}.react-flow__edge .react-flow__edge-text{pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}.react-flow__arrowhead polyline{stroke:var(--xy-edge-stroke, var(--xy-edge-stroke-default))}.react-flow__arrowhead polyline.arrowclosed{fill:var(--xy-edge-stroke, var(--xy-edge-stroke-default))}.react-flow__connection{pointer-events:none}.react-flow__connection .animated{stroke-dasharray:5;animation:dashdraw .5s linear infinite}svg.react-flow__connectionline{z-index:1001;overflow:visible;position:absolute}.react-flow__nodes{pointer-events:none;transform-origin:0 0}.react-flow__node{position:absolute;-webkit-user-select:none;-moz-user-select:none;user-select:none;pointer-events:all;transform-origin:0 0;box-sizing:border-box;cursor:default}.react-flow__node.selectable{cursor:pointer}.react-flow__node.draggable{cursor:grab;pointer-events:all}.react-flow__node.draggable.dragging{cursor:grabbing}.react-flow__nodesselection{z-index:3;transform-origin:left top;pointer-events:none}.react-flow__nodesselection-rect{position:absolute;pointer-events:all;cursor:grab}.react-flow__handle{position:absolute;pointer-events:none;min-width:5px;min-height:5px;width:6px;height:6px;background-color:var(--xy-handle-background-color, var(--xy-handle-background-color-default));border:1px solid var(--xy-handle-border-color, var(--xy-handle-border-color-default));border-radius:100%}.react-flow__handle.connectingfrom{pointer-events:all}.react-flow__handle.connectionindicator{pointer-events:all;cursor:crosshair}.react-flow__handle-bottom{top:auto;left:50%;bottom:0;transform:translate(-50%,50%)}.react-flow__handle-top{top:0;left:50%;transform:translate(-50%,-50%)}.react-flow__handle-left{top:50%;left:0;transform:translate(-50%,-50%)}.react-flow__handle-right{top:50%;right:0;transform:translate(50%,-50%)}.react-flow__edgeupdater{cursor:move;pointer-events:all}.react-flow__pane.selection .react-flow__panel{pointer-events:none}.react-flow__panel{position:absolute;z-index:5;margin:15px}.react-flow__panel.top{top:0}.react-flow__panel.bottom{bottom:0}.react-flow__panel.top.center,.react-flow__panel.bottom.center{left:50%;transform:translate(-15px) translate(-50%)}.react-flow__panel.left{left:0}.react-flow__panel.right{right:0}.react-flow__panel.left.center,.react-flow__panel.right.center{top:50%;transform:translateY(-15px) translateY(-50%)}.react-flow__attribution{font-size:10px;background:var(--xy-attribution-background-color, var(--xy-attribution-background-color-default));padding:2px 3px;margin:0}.react-flow__attribution a{text-decoration:none;color:#999}@keyframes dashdraw{0%{stroke-dashoffset:10}}.react-flow__edgelabel-renderer{position:absolute;width:100%;height:100%;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;left:0;top:0}.react-flow__viewport-portal{position:absolute;width:100%;height:100%;left:0;top:0;-webkit-user-select:none;-moz-user-select:none;user-select:none}.react-flow__minimap{background:var( --xy-minimap-background-color-props, var(--xy-minimap-background-color, var(--xy-minimap-background-color-default)) )}.react-flow__minimap-svg{display:block}.react-flow__minimap-mask{fill:var( --xy-minimap-mask-background-color-props, var(--xy-minimap-mask-background-color, var(--xy-minimap-mask-background-color-default)) );stroke:var( --xy-minimap-mask-stroke-color-props, var(--xy-minimap-mask-stroke-color, var(--xy-minimap-mask-stroke-color-default)) );stroke-width:var( --xy-minimap-mask-stroke-width-props, var(--xy-minimap-mask-stroke-width, var(--xy-minimap-mask-stroke-width-default)) )}.react-flow__minimap-node{fill:var( --xy-minimap-node-background-color-props, var(--xy-minimap-node-background-color, var(--xy-minimap-node-background-color-default)) );stroke:var( --xy-minimap-node-stroke-color-props, var(--xy-minimap-node-stroke-color, var(--xy-minimap-node-stroke-color-default)) );stroke-width:var( --xy-minimap-node-stroke-width-props, var(--xy-minimap-node-stroke-width, var(--xy-minimap-node-stroke-width-default)) )}.react-flow__background-pattern.dots{fill:var( --xy-background-pattern-color-props, var(--xy-background-pattern-color, var(--xy-background-pattern-dots-color-default)) )}.react-flow__background-pattern.lines{stroke:var( --xy-background-pattern-color-props, var(--xy-background-pattern-color, var(--xy-background-pattern-lines-color-default)) )}.react-flow__background-pattern.cross{stroke:var( --xy-background-pattern-color-props, var(--xy-background-pattern-color, var(--xy-background-pattern-cross-color-default)) )}.react-flow__controls{display:flex;flex-direction:column;box-shadow:var(--xy-controls-box-shadow, var(--xy-controls-box-shadow-default))}.react-flow__controls.horizontal{flex-direction:row}.react-flow__controls-button{display:flex;justify-content:center;align-items:center;height:26px;width:26px;padding:4px;border:none;background:var(--xy-controls-button-background-color, var(--xy-controls-button-background-color-default));border-bottom:1px solid var( --xy-controls-button-border-color-props, var(--xy-controls-button-border-color, var(--xy-controls-button-border-color-default)) );color:var( --xy-controls-button-color-props, var(--xy-controls-button-color, var(--xy-controls-button-color-default)) );cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none}.react-flow__controls-button svg{width:100%;max-width:12px;max-height:12px;fill:currentColor}.react-flow__edge.updating .react-flow__edge-path{stroke:#777}.react-flow__edge-text{font-size:10px}.react-flow__node.selectable:focus,.react-flow__node.selectable:focus-visible{outline:none}.react-flow__node-input,.react-flow__node-default,.react-flow__node-output,.react-flow__node-group{padding:10px;border-radius:var(--xy-node-border-radius, var(--xy-node-border-radius-default));width:150px;font-size:12px;color:var(--xy-node-color, var(--xy-node-color-default));text-align:center;border:var(--xy-node-border, var(--xy-node-border-default));background-color:var(--xy-node-background-color, var(--xy-node-background-color-default))}.react-flow__node-input.selectable:hover,.react-flow__node-default.selectable:hover,.react-flow__node-output.selectable:hover,.react-flow__node-group.selectable:hover{box-shadow:var(--xy-node-boxshadow-hover, var(--xy-node-boxshadow-hover-default))}.react-flow__node-input.selectable.selected,.react-flow__node-input.selectable:focus,.react-flow__node-input.selectable:focus-visible,.react-flow__node-default.selectable.selected,.react-flow__node-default.selectable:focus,.react-flow__node-default.selectable:focus-visible,.react-flow__node-output.selectable.selected,.react-flow__node-output.selectable:focus,.react-flow__node-output.selectable:focus-visible,.react-flow__node-group.selectable.selected,.react-flow__node-group.selectable:focus,.react-flow__node-group.selectable:focus-visible{box-shadow:var(--xy-node-boxshadow-selected, var(--xy-node-boxshadow-selected-default))}.react-flow__node-group{background-color:var(--xy-node-group-background-color, var(--xy-node-group-background-color-default))}.react-flow__nodesselection-rect,.react-flow__selection{background:var(--xy-selection-background-color, var(--xy-selection-background-color-default));border:var(--xy-selection-border, var(--xy-selection-border-default))}.react-flow__nodesselection-rect:focus,.react-flow__nodesselection-rect:focus-visible,.react-flow__selection:focus,.react-flow__selection:focus-visible{outline:none}.react-flow__controls-button:hover{background:var( --xy-controls-button-background-color-hover-props, var(--xy-controls-button-background-color-hover, var(--xy-controls-button-background-color-hover-default)) );color:var( --xy-controls-button-color-hover-props, var(--xy-controls-button-color-hover, var(--xy-controls-button-color-hover-default)) )}.react-flow__controls-button:disabled{pointer-events:none}.react-flow__controls-button:disabled svg{fill-opacity:.4}.react-flow__controls-button:last-child{border-bottom:none}.react-flow__controls.horizontal .react-flow__controls-button{border-bottom:none;border-right:1px solid var( --xy-controls-button-border-color-props, var(--xy-controls-button-border-color, var(--xy-controls-button-border-color-default)) )}.react-flow__controls.horizontal .react-flow__controls-button:last-child{border-right:none}.react-flow__resize-control{position:absolute}.react-flow__resize-control.left,.react-flow__resize-control.right{cursor:ew-resize}.react-flow__resize-control.top,.react-flow__resize-control.bottom{cursor:ns-resize}.react-flow__resize-control.top.left,.react-flow__resize-control.bottom.right{cursor:nwse-resize}.react-flow__resize-control.bottom.left,.react-flow__resize-control.top.right{cursor:nesw-resize}.react-flow__resize-control.handle{width:5px;height:5px;border:1px solid #fff;border-radius:1px;background-color:var(--xy-resize-background-color, var(--xy-resize-background-color-default));translate:-50% -50%}.react-flow__resize-control.handle.left{left:0;top:50%}.react-flow__resize-control.handle.right{left:100%;top:50%}.react-flow__resize-control.handle.top{left:50%;top:0}.react-flow__resize-control.handle.bottom{left:50%;top:100%}.react-flow__resize-control.handle.top.left,.react-flow__resize-control.handle.bottom.left{left:0}.react-flow__resize-control.handle.top.right,.react-flow__resize-control.handle.bottom.right{left:100%}.react-flow__resize-control.line{border-color:var(--xy-resize-background-color, var(--xy-resize-background-color-default));border-width:0;border-style:solid}.react-flow__resize-control.line.left,.react-flow__resize-control.line.right{width:1px;transform:translate(-50%);top:0;height:100%}.react-flow__resize-control.line.left{left:0;border-left-width:1px}.react-flow__resize-control.line.right{left:100%;border-right-width:1px}.react-flow__resize-control.line.top,.react-flow__resize-control.line.bottom{height:1px;transform:translateY(-50%);left:0;width:100%}.react-flow__resize-control.line.top{top:0;border-top-width:1px}.react-flow__resize-control.line.bottom{border-bottom-width:1px;top:100%}.react-flow__edge-textbg{fill:var(--xy-edge-label-background-color, var(--xy-edge-label-background-color-default))}.react-flow__edge-text{fill:var(--xy-edge-label-color, var(--xy-edge-label-color-default))}:root{--bg: #070b10;--bg-2: #0d141c;--surface: #121a24;--line: #1e2c3c;--ink: #e7eef6;--muted: #8b9bb0;--high: #2a9d8f;--medium: #e9c46a;--low: #e76f51;--critical: #e85d04;--accent: #4cc9f0}*{box-sizing:border-box}html,body,#root{height:100%;margin:0}body{background:var(--bg);color:var(--ink);font-family:IBM Plex Sans,Segoe UI,sans-serif}button,input,select,textarea{font-family:inherit;color:inherit}.app{display:grid;grid-template-columns:220px 1fr;height:100%}.rail{border-right:1px solid var(--line);background:linear-gradient(180deg,#0b1219,#070b10);padding:20px 14px;display:flex;flex-direction:column;gap:6px}.brand{font-family:IBM Plex Mono,monospace;letter-spacing:.18em;font-size:12px;text-transform:uppercase;color:var(--accent);margin:0 0 18px}.rail button,.tab{background:transparent;border:0;text-align:left;padding:8px 10px;border-radius:6px;color:var(--muted);cursor:pointer}.rail button.active,.tab.active{background:#15202c;color:var(--ink)}.main{display:flex;flex-direction:column;min-width:0}.topbar{display:flex;gap:8px;align-items:center;padding:12px 16px;border-bottom:1px solid var(--line);background:var(--bg-2)}.topbar input,.topbar select{background:var(--surface);border:1px solid var(--line);border-radius:6px;padding:8px 10px;min-width:160px}.topbar input.path{flex:1}.topbar button,.btn{background:#173044;border:1px solid #24506c;border-radius:6px;padding:8px 12px;cursor:pointer}.btn.primary{background:#134e4a;border-color:#2a9d8f}.content{flex:1;min-height:0;display:grid;grid-template-columns:420px 1fr}.brief{overflow:auto;border-right:1px solid var(--line);padding:18px;background:radial-gradient(circle at 0 0,rgba(76,201,240,.05),transparent 40%),var(--bg)}.graph-wrap{position:relative;min-height:0}.graph-wrap .react-flow{background-color:#070b10;background-image:linear-gradient(rgba(42,80,120,.09) 1px,transparent 1px),linear-gradient(90deg,rgba(42,80,120,.09) 1px,transparent 1px);background-size:24px 24px}h1{font-size:18px;margin:0 0 6px}.level{font-family:IBM Plex Mono,monospace;font-weight:600}.level.high{color:var(--high)}.level.medium{color:var(--medium)}.level.low{color:var(--low)}.kicker{color:var(--muted);font-size:12px;text-transform:uppercase;letter-spacing:.08em;margin:16px 0 6px}.chip{display:inline-block;font-size:11px;padding:2px 8px;border-radius:999px;border:1px solid var(--line);margin:0 6px 6px 0;color:var(--muted)}.chip.blocker{color:var(--low);border-color:var(--low)}.file{font-family:IBM Plex Mono,monospace;font-size:12px;color:var(--accent)}.muted{color:var(--muted);font-size:13px;line-height:1.45}.error{color:var(--low);padding:8px 16px}.pr-list{padding:16px;overflow:auto}.pr{border:1px solid var(--line);background:var(--surface);padding:12px 14px;border-radius:8px;margin-bottom:10px}.pr h3{margin:0 0 4px;font-size:14px}.settings{padding:24px;max-width:640px;display:grid;gap:10px}.settings label{font-size:12px;color:var(--muted)}.settings input,.settings select{background:var(--surface);border:1px solid var(--line);border-radius:6px;padding:8px 10px;width:100%}.headline{white-space:pre-wrap;font-family:IBM Plex Mono,monospace;font-size:12px;color:var(--muted)}.graph-modes{display:flex;gap:6px;padding:10px 14px;border-bottom:1px solid var(--line);background:var(--bg-2)}.graph-modes button{background:transparent;border:1px solid var(--line);border-radius:999px;padding:4px 10px;color:var(--muted);cursor:pointer}.graph-modes button.active{background:#15202c;color:var(--ink);border-color:#2a9d8f}.lp-node{padding:8px 10px;border-radius:8px;border:1px solid #2a3d52;background:#101822;min-width:150px;box-shadow:0 0 0 1px #4cc9f014}.lp-node .t{font-size:10px;color:var(--muted);text-transform:uppercase;letter-spacing:.08em}.lp-node .n{font-size:13px;font-weight:600} +.react-flow{direction:ltr;--xy-edge-stroke-default: #b1b1b7;--xy-edge-stroke-width-default: 1;--xy-edge-stroke-selected-default: #555;--xy-connectionline-stroke-default: #b1b1b7;--xy-connectionline-stroke-width-default: 1;--xy-attribution-background-color-default: rgba(255, 255, 255, .5);--xy-minimap-background-color-default: #fff;--xy-minimap-mask-background-color-default: rgba(240, 240, 240, .6);--xy-minimap-mask-stroke-color-default: transparent;--xy-minimap-mask-stroke-width-default: 1;--xy-minimap-node-background-color-default: #e2e2e2;--xy-minimap-node-stroke-color-default: transparent;--xy-minimap-node-stroke-width-default: 2;--xy-background-color-default: transparent;--xy-background-pattern-dots-color-default: #91919a;--xy-background-pattern-lines-color-default: #eee;--xy-background-pattern-cross-color-default: #e2e2e2;background-color:var(--xy-background-color, var(--xy-background-color-default));--xy-node-color-default: inherit;--xy-node-border-default: 1px solid #1a192b;--xy-node-background-color-default: #fff;--xy-node-group-background-color-default: rgba(240, 240, 240, .25);--xy-node-boxshadow-hover-default: 0 1px 4px 1px rgba(0, 0, 0, .08);--xy-node-boxshadow-selected-default: 0 0 0 .5px #1a192b;--xy-node-border-radius-default: 3px;--xy-handle-background-color-default: #1a192b;--xy-handle-border-color-default: #fff;--xy-selection-background-color-default: rgba(0, 89, 220, .08);--xy-selection-border-default: 1px dotted rgba(0, 89, 220, .8);--xy-controls-button-background-color-default: #fefefe;--xy-controls-button-background-color-hover-default: #f4f4f4;--xy-controls-button-color-default: inherit;--xy-controls-button-color-hover-default: inherit;--xy-controls-button-border-color-default: #eee;--xy-controls-box-shadow-default: 0 0 2px 1px rgba(0, 0, 0, .08);--xy-edge-label-background-color-default: #ffffff;--xy-edge-label-color-default: inherit;--xy-resize-background-color-default: #3367d9}.react-flow.dark{--xy-edge-stroke-default: #3e3e3e;--xy-edge-stroke-width-default: 1;--xy-edge-stroke-selected-default: #727272;--xy-connectionline-stroke-default: #b1b1b7;--xy-connectionline-stroke-width-default: 1;--xy-attribution-background-color-default: rgba(150, 150, 150, .25);--xy-minimap-background-color-default: #141414;--xy-minimap-mask-background-color-default: rgba(60, 60, 60, .6);--xy-minimap-mask-stroke-color-default: transparent;--xy-minimap-mask-stroke-width-default: 1;--xy-minimap-node-background-color-default: #2b2b2b;--xy-minimap-node-stroke-color-default: transparent;--xy-minimap-node-stroke-width-default: 2;--xy-background-color-default: #141414;--xy-background-pattern-dots-color-default: #555;--xy-background-pattern-lines-color-default: #333;--xy-background-pattern-cross-color-default: #333;--xy-node-color-default: #f8f8f8;--xy-node-border-default: 1px solid #3c3c3c;--xy-node-background-color-default: #1e1e1e;--xy-node-group-background-color-default: rgba(240, 240, 240, .25);--xy-node-boxshadow-hover-default: 0 1px 4px 1px rgba(255, 255, 255, .08);--xy-node-boxshadow-selected-default: 0 0 0 .5px #999;--xy-handle-background-color-default: #bebebe;--xy-handle-border-color-default: #1e1e1e;--xy-selection-background-color-default: rgba(200, 200, 220, .08);--xy-selection-border-default: 1px dotted rgba(200, 200, 220, .8);--xy-controls-button-background-color-default: #2b2b2b;--xy-controls-button-background-color-hover-default: #3e3e3e;--xy-controls-button-color-default: #f8f8f8;--xy-controls-button-color-hover-default: #fff;--xy-controls-button-border-color-default: #5b5b5b;--xy-controls-box-shadow-default: 0 0 2px 1px rgba(0, 0, 0, .08);--xy-edge-label-background-color-default: #141414;--xy-edge-label-color-default: #f8f8f8}.react-flow__background{background-color:var(--xy-background-color-props, var(--xy-background-color, var(--xy-background-color-default)));pointer-events:none;z-index:-1}.react-flow__container{position:absolute;width:100%;height:100%;top:0;left:0}.react-flow__pane{z-index:1;touch-action:none}.react-flow__pane.draggable{cursor:grab}.react-flow__pane.dragging{cursor:grabbing}.react-flow__pane.selection{cursor:pointer}.react-flow__viewport{transform-origin:0 0;z-index:2;pointer-events:none}.react-flow__renderer{z-index:4}.react-flow__selection{z-index:6}.react-flow__nodesselection-rect:focus,.react-flow__nodesselection-rect:focus-visible{outline:none}.react-flow__edge-path{stroke:var(--xy-edge-stroke, var(--xy-edge-stroke-default));stroke-width:var(--xy-edge-stroke-width, var(--xy-edge-stroke-width-default));fill:none}.react-flow__connection-path{stroke:var(--xy-connectionline-stroke, var(--xy-connectionline-stroke-default));stroke-width:var(--xy-connectionline-stroke-width, var(--xy-connectionline-stroke-width-default));fill:none}.react-flow .react-flow__edges{position:absolute}.react-flow .react-flow__edges svg{overflow:visible;position:absolute;pointer-events:none}.react-flow__edge{pointer-events:visibleStroke}.react-flow__edge.selectable{cursor:pointer}.react-flow__edge.animated path{stroke-dasharray:5;animation:dashdraw .5s linear infinite}.react-flow__edge.animated path.react-flow__edge-interaction{stroke-dasharray:none;animation:none}.react-flow__edge.inactive{pointer-events:none}.react-flow__edge.selected,.react-flow__edge:focus,.react-flow__edge:focus-visible{outline:none}.react-flow__edge.selected .react-flow__edge-path,.react-flow__edge.selectable:focus .react-flow__edge-path,.react-flow__edge.selectable:focus-visible .react-flow__edge-path{stroke:var(--xy-edge-stroke-selected, var(--xy-edge-stroke-selected-default))}.react-flow__edge-textwrapper{pointer-events:all}.react-flow__edge .react-flow__edge-text{pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}.react-flow__arrowhead polyline{stroke:var(--xy-edge-stroke, var(--xy-edge-stroke-default))}.react-flow__arrowhead polyline.arrowclosed{fill:var(--xy-edge-stroke, var(--xy-edge-stroke-default))}.react-flow__connection{pointer-events:none}.react-flow__connection .animated{stroke-dasharray:5;animation:dashdraw .5s linear infinite}svg.react-flow__connectionline{z-index:1001;overflow:visible;position:absolute}.react-flow__nodes{pointer-events:none;transform-origin:0 0}.react-flow__node{position:absolute;-webkit-user-select:none;-moz-user-select:none;user-select:none;pointer-events:all;transform-origin:0 0;box-sizing:border-box;cursor:default}.react-flow__node.selectable{cursor:pointer}.react-flow__node.draggable{cursor:grab;pointer-events:all}.react-flow__node.draggable.dragging{cursor:grabbing}.react-flow__nodesselection{z-index:3;transform-origin:left top;pointer-events:none}.react-flow__nodesselection-rect{position:absolute;pointer-events:all;cursor:grab}.react-flow__handle{position:absolute;pointer-events:none;min-width:5px;min-height:5px;width:6px;height:6px;background-color:var(--xy-handle-background-color, var(--xy-handle-background-color-default));border:1px solid var(--xy-handle-border-color, var(--xy-handle-border-color-default));border-radius:100%}.react-flow__handle.connectingfrom{pointer-events:all}.react-flow__handle.connectionindicator{pointer-events:all;cursor:crosshair}.react-flow__handle-bottom{top:auto;left:50%;bottom:0;transform:translate(-50%,50%)}.react-flow__handle-top{top:0;left:50%;transform:translate(-50%,-50%)}.react-flow__handle-left{top:50%;left:0;transform:translate(-50%,-50%)}.react-flow__handle-right{top:50%;right:0;transform:translate(50%,-50%)}.react-flow__edgeupdater{cursor:move;pointer-events:all}.react-flow__pane.selection .react-flow__panel{pointer-events:none}.react-flow__panel{position:absolute;z-index:5;margin:15px}.react-flow__panel.top{top:0}.react-flow__panel.bottom{bottom:0}.react-flow__panel.top.center,.react-flow__panel.bottom.center{left:50%;transform:translate(-15px) translate(-50%)}.react-flow__panel.left{left:0}.react-flow__panel.right{right:0}.react-flow__panel.left.center,.react-flow__panel.right.center{top:50%;transform:translateY(-15px) translateY(-50%)}.react-flow__attribution{font-size:10px;background:var(--xy-attribution-background-color, var(--xy-attribution-background-color-default));padding:2px 3px;margin:0}.react-flow__attribution a{text-decoration:none;color:#999}@keyframes dashdraw{0%{stroke-dashoffset:10}}.react-flow__edgelabel-renderer{position:absolute;width:100%;height:100%;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;left:0;top:0}.react-flow__viewport-portal{position:absolute;width:100%;height:100%;left:0;top:0;-webkit-user-select:none;-moz-user-select:none;user-select:none}.react-flow__minimap{background:var( --xy-minimap-background-color-props, var(--xy-minimap-background-color, var(--xy-minimap-background-color-default)) )}.react-flow__minimap-svg{display:block}.react-flow__minimap-mask{fill:var( --xy-minimap-mask-background-color-props, var(--xy-minimap-mask-background-color, var(--xy-minimap-mask-background-color-default)) );stroke:var( --xy-minimap-mask-stroke-color-props, var(--xy-minimap-mask-stroke-color, var(--xy-minimap-mask-stroke-color-default)) );stroke-width:var( --xy-minimap-mask-stroke-width-props, var(--xy-minimap-mask-stroke-width, var(--xy-minimap-mask-stroke-width-default)) )}.react-flow__minimap-node{fill:var( --xy-minimap-node-background-color-props, var(--xy-minimap-node-background-color, var(--xy-minimap-node-background-color-default)) );stroke:var( --xy-minimap-node-stroke-color-props, var(--xy-minimap-node-stroke-color, var(--xy-minimap-node-stroke-color-default)) );stroke-width:var( --xy-minimap-node-stroke-width-props, var(--xy-minimap-node-stroke-width, var(--xy-minimap-node-stroke-width-default)) )}.react-flow__background-pattern.dots{fill:var( --xy-background-pattern-color-props, var(--xy-background-pattern-color, var(--xy-background-pattern-dots-color-default)) )}.react-flow__background-pattern.lines{stroke:var( --xy-background-pattern-color-props, var(--xy-background-pattern-color, var(--xy-background-pattern-lines-color-default)) )}.react-flow__background-pattern.cross{stroke:var( --xy-background-pattern-color-props, var(--xy-background-pattern-color, var(--xy-background-pattern-cross-color-default)) )}.react-flow__controls{display:flex;flex-direction:column;box-shadow:var(--xy-controls-box-shadow, var(--xy-controls-box-shadow-default))}.react-flow__controls.horizontal{flex-direction:row}.react-flow__controls-button{display:flex;justify-content:center;align-items:center;height:26px;width:26px;padding:4px;border:none;background:var(--xy-controls-button-background-color, var(--xy-controls-button-background-color-default));border-bottom:1px solid var( --xy-controls-button-border-color-props, var(--xy-controls-button-border-color, var(--xy-controls-button-border-color-default)) );color:var( --xy-controls-button-color-props, var(--xy-controls-button-color, var(--xy-controls-button-color-default)) );cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none}.react-flow__controls-button svg{width:100%;max-width:12px;max-height:12px;fill:currentColor}.react-flow__edge.updating .react-flow__edge-path{stroke:#777}.react-flow__edge-text{font-size:10px}.react-flow__node.selectable:focus,.react-flow__node.selectable:focus-visible{outline:none}.react-flow__node-input,.react-flow__node-default,.react-flow__node-output,.react-flow__node-group{padding:10px;border-radius:var(--xy-node-border-radius, var(--xy-node-border-radius-default));width:150px;font-size:12px;color:var(--xy-node-color, var(--xy-node-color-default));text-align:center;border:var(--xy-node-border, var(--xy-node-border-default));background-color:var(--xy-node-background-color, var(--xy-node-background-color-default))}.react-flow__node-input.selectable:hover,.react-flow__node-default.selectable:hover,.react-flow__node-output.selectable:hover,.react-flow__node-group.selectable:hover{box-shadow:var(--xy-node-boxshadow-hover, var(--xy-node-boxshadow-hover-default))}.react-flow__node-input.selectable.selected,.react-flow__node-input.selectable:focus,.react-flow__node-input.selectable:focus-visible,.react-flow__node-default.selectable.selected,.react-flow__node-default.selectable:focus,.react-flow__node-default.selectable:focus-visible,.react-flow__node-output.selectable.selected,.react-flow__node-output.selectable:focus,.react-flow__node-output.selectable:focus-visible,.react-flow__node-group.selectable.selected,.react-flow__node-group.selectable:focus,.react-flow__node-group.selectable:focus-visible{box-shadow:var(--xy-node-boxshadow-selected, var(--xy-node-boxshadow-selected-default))}.react-flow__node-group{background-color:var(--xy-node-group-background-color, var(--xy-node-group-background-color-default))}.react-flow__nodesselection-rect,.react-flow__selection{background:var(--xy-selection-background-color, var(--xy-selection-background-color-default));border:var(--xy-selection-border, var(--xy-selection-border-default))}.react-flow__nodesselection-rect:focus,.react-flow__nodesselection-rect:focus-visible,.react-flow__selection:focus,.react-flow__selection:focus-visible{outline:none}.react-flow__controls-button:hover{background:var( --xy-controls-button-background-color-hover-props, var(--xy-controls-button-background-color-hover, var(--xy-controls-button-background-color-hover-default)) );color:var( --xy-controls-button-color-hover-props, var(--xy-controls-button-color-hover, var(--xy-controls-button-color-hover-default)) )}.react-flow__controls-button:disabled{pointer-events:none}.react-flow__controls-button:disabled svg{fill-opacity:.4}.react-flow__controls-button:last-child{border-bottom:none}.react-flow__controls.horizontal .react-flow__controls-button{border-bottom:none;border-right:1px solid var( --xy-controls-button-border-color-props, var(--xy-controls-button-border-color, var(--xy-controls-button-border-color-default)) )}.react-flow__controls.horizontal .react-flow__controls-button:last-child{border-right:none}.react-flow__resize-control{position:absolute}.react-flow__resize-control.left,.react-flow__resize-control.right{cursor:ew-resize}.react-flow__resize-control.top,.react-flow__resize-control.bottom{cursor:ns-resize}.react-flow__resize-control.top.left,.react-flow__resize-control.bottom.right{cursor:nwse-resize}.react-flow__resize-control.bottom.left,.react-flow__resize-control.top.right{cursor:nesw-resize}.react-flow__resize-control.handle{width:5px;height:5px;border:1px solid #fff;border-radius:1px;background-color:var(--xy-resize-background-color, var(--xy-resize-background-color-default));translate:-50% -50%}.react-flow__resize-control.handle.left{left:0;top:50%}.react-flow__resize-control.handle.right{left:100%;top:50%}.react-flow__resize-control.handle.top{left:50%;top:0}.react-flow__resize-control.handle.bottom{left:50%;top:100%}.react-flow__resize-control.handle.top.left,.react-flow__resize-control.handle.bottom.left{left:0}.react-flow__resize-control.handle.top.right,.react-flow__resize-control.handle.bottom.right{left:100%}.react-flow__resize-control.line{border-color:var(--xy-resize-background-color, var(--xy-resize-background-color-default));border-width:0;border-style:solid}.react-flow__resize-control.line.left,.react-flow__resize-control.line.right{width:1px;transform:translate(-50%);top:0;height:100%}.react-flow__resize-control.line.left{left:0;border-left-width:1px}.react-flow__resize-control.line.right{left:100%;border-right-width:1px}.react-flow__resize-control.line.top,.react-flow__resize-control.line.bottom{height:1px;transform:translateY(-50%);left:0;width:100%}.react-flow__resize-control.line.top{top:0;border-top-width:1px}.react-flow__resize-control.line.bottom{border-bottom-width:1px;top:100%}.react-flow__edge-textbg{fill:var(--xy-edge-label-background-color, var(--xy-edge-label-background-color-default))}.react-flow__edge-text{fill:var(--xy-edge-label-color, var(--xy-edge-label-color-default))}:root,[data-theme=obsidian]{--bg: #070b10;--bg-2: #0d141c;--surface: #121a24;--line: #1e2c3c;--ink: #e7eef6;--muted: #8b9bb0;--high: #2a9d8f;--medium: #e9c46a;--low: #e76f51;--critical: #e85d04;--accent: #4cc9f0;--rail-from: #0b1219;--rail-to: #070b10;--rail-active: #15202c;--btn: #173044;--btn-line: #24506c;--btn-primary: #134e4a;--btn-primary-line: #2a9d8f;--node-bg: #101822;--node-line: #2a3d52;--graph-bg: #070b10;--graph-grid: rgba(42, 80, 120, .09);--edge-cheap: #4a5568;--edge-expensive: #f4a261;--edge-critical: #e85d04;--shadow: rgba(76, 201, 240, .08)}[data-theme=nord]{--bg: #2e3440;--bg-2: #3b4252;--surface: #434c5e;--line: #4c566a;--ink: #eceff4;--muted: #d8dee9;--high: #a3be8c;--medium: #ebcb8b;--low: #bf616a;--critical: #d08770;--accent: #88c0d0;--rail-from: #3b4252;--rail-to: #2e3440;--rail-active: #4c566a;--btn: #434c5e;--btn-line: #81a1c1;--btn-primary: #5e81ac;--btn-primary-line: #88c0d0;--node-bg: #3b4252;--node-line: #81a1c1;--graph-bg: #2e3440;--graph-grid: rgba(136, 192, 208, .12);--edge-cheap: #4c566a;--edge-expensive: #d08770;--edge-critical: #bf616a;--shadow: rgba(136, 192, 208, .12)}[data-theme=solarized-dark]{--bg: #002b36;--bg-2: #073642;--surface: #0a3944;--line: #16444f;--ink: #eee8d5;--muted: #93a1a1;--high: #859900;--medium: #b58900;--low: #dc322f;--critical: #cb4b16;--accent: #2aa198;--rail-from: #073642;--rail-to: #002b36;--rail-active: #16444f;--btn: #073642;--btn-line: #268bd2;--btn-primary: #0a4a42;--btn-primary-line: #2aa198;--node-bg: #073642;--node-line: #268bd2;--graph-bg: #002b36;--graph-grid: rgba(42, 161, 152, .12);--edge-cheap: #586e75;--edge-expensive: #cb4b16;--edge-critical: #dc322f;--shadow: rgba(42, 161, 152, .12)}[data-theme=forest]{--bg: #0e1510;--bg-2: #152019;--surface: #1b2a20;--line: #2c4334;--ink: #e4f0e6;--muted: #8eaa96;--high: #6ab04c;--medium: #c8a951;--low: #e17055;--critical: #d35400;--accent: #7bed9f;--rail-from: #152019;--rail-to: #0e1510;--rail-active: #1f3326;--btn: #1f3326;--btn-line: #3d6b4f;--btn-primary: #1e4d32;--btn-primary-line: #6ab04c;--node-bg: #16241b;--node-line: #3d6b4f;--graph-bg: #0e1510;--graph-grid: rgba(123, 237, 159, .1);--edge-cheap: #3d6b4f;--edge-expensive: #c8a951;--edge-critical: #d35400;--shadow: rgba(123, 237, 159, .1)}[data-theme=rose]{--bg: #191724;--bg-2: #1f1d2e;--surface: #26233a;--line: #403d52;--ink: #e0def4;--muted: #908caa;--high: #9ccfd8;--medium: #f6c177;--low: #eb6f92;--critical: #eb6f92;--accent: #c4a7e7;--rail-from: #1f1d2e;--rail-to: #191724;--rail-active: #26233a;--btn: #26233a;--btn-line: #c4a7e7;--btn-primary: #3a2f4d;--btn-primary-line: #c4a7e7;--node-bg: #1f1d2e;--node-line: #524f67;--graph-bg: #191724;--graph-grid: rgba(196, 167, 231, .12);--edge-cheap: #524f67;--edge-expensive: #f6c177;--edge-critical: #eb6f92;--shadow: rgba(196, 167, 231, .12)}[data-theme=amber]{--bg: #120e0a;--bg-2: #1c1610;--surface: #261e16;--line: #3d2f22;--ink: #f4e6d0;--muted: #b59a78;--high: #c4d6a0;--medium: #e9b44c;--low: #d8572a;--critical: #c0392b;--accent: #f0a05a;--rail-from: #1c1610;--rail-to: #120e0a;--rail-active: #2b2218;--btn: #2b2218;--btn-line: #8a5a2b;--btn-primary: #4a3418;--btn-primary-line: #f0a05a;--node-bg: #1c1610;--node-line: #8a5a2b;--graph-bg: #120e0a;--graph-grid: rgba(240, 160, 90, .12);--edge-cheap: #5c4a38;--edge-expensive: #e9b44c;--edge-critical: #d8572a;--shadow: rgba(240, 160, 90, .12)}[data-theme=volcano]{--bg: #14090a;--bg-2: #1e0e10;--surface: #2a1416;--line: #4a2226;--ink: #fde8e4;--muted: #c48b86;--high: #7bed9f;--medium: #f6c90e;--low: #ff6b6b;--critical: #ff3b3b;--accent: #ff7b54;--rail-from: #1e0e10;--rail-to: #14090a;--rail-active: #32181b;--btn: #32181b;--btn-line: #ff7b54;--btn-primary: #5a1f18;--btn-primary-line: #ff7b54;--node-bg: #1e0e10;--node-line: #7a3330;--graph-bg: #14090a;--graph-grid: rgba(255, 123, 84, .12);--edge-cheap: #5a3330;--edge-expensive: #ff7b54;--edge-critical: #ff3b3b;--shadow: rgba(255, 123, 84, .14)}[data-theme=lavender]{--bg: #12101c;--bg-2: #1a1730;--surface: #221e3c;--line: #3b3560;--ink: #efeaff;--muted: #b3a7d6;--high: #80ffdb;--medium: #ffd166;--low: #ff6b9d;--critical: #ff4d6d;--accent: #c77dff;--rail-from: #1a1730;--rail-to: #12101c;--rail-active: #2a2550;--btn: #2a2550;--btn-line: #c77dff;--btn-primary: #3d2a66;--btn-primary-line: #c77dff;--node-bg: #1a1730;--node-line: #5a4d8a;--graph-bg: #12101c;--graph-grid: rgba(199, 125, 255, .12);--edge-cheap: #5a4d8a;--edge-expensive: #ffd166;--edge-critical: #ff4d6d;--shadow: rgba(199, 125, 255, .14)}[data-theme=paper]{--bg: #f6f1e8;--bg-2: #efe6d6;--surface: #fffaf2;--line: #d9cbb6;--ink: #2b241c;--muted: #6f6456;--high: #2a7a4b;--medium: #b5811a;--low: #c0392b;--critical: #a93226;--accent: #1d6a7a;--rail-from: #efe6d6;--rail-to: #e7dcc8;--rail-active: #e2d3bb;--btn: #fffaf2;--btn-line: #c9b79a;--btn-primary: #d7eee0;--btn-primary-line: #2a7a4b;--node-bg: #fffaf2;--node-line: #c9b79a;--graph-bg: #f6f1e8;--graph-grid: rgba(29, 106, 122, .1);--edge-cheap: #b7a48c;--edge-expensive: #c0392b;--edge-critical: #a93226;--shadow: rgba(43, 36, 28, .08)}[data-theme=solarized-light]{--bg: #fdf6e3;--bg-2: #eee8d5;--surface: #f5efdc;--line: #d6cba9;--ink: #657b83;--muted: #93a1a1;--high: #859900;--medium: #b58900;--low: #dc322f;--critical: #cb4b16;--accent: #268bd2;--rail-from: #eee8d5;--rail-to: #e6dfc8;--rail-active: #e0d9c0;--btn: #fdf6e3;--btn-line: #93a1a1;--btn-primary: #e8efc8;--btn-primary-line: #859900;--node-bg: #fdf6e3;--node-line: #93a1a1;--graph-bg: #fdf6e3;--graph-grid: rgba(38, 139, 210, .12);--edge-cheap: #93a1a1;--edge-expensive: #cb4b16;--edge-critical: #dc322f;--shadow: rgba(101, 123, 131, .1)}[data-theme=seafoam]{--bg: #eef7f4;--bg-2: #dff0ea;--surface: #ffffff;--line: #b7d5cc;--ink: #17332c;--muted: #4d7268;--high: #1b8a5a;--medium: #c48a14;--low: #c44536;--critical: #9b2d22;--accent: #1d9a8a;--rail-from: #dff0ea;--rail-to: #cfe6de;--rail-active: #c4ddd4;--btn: #ffffff;--btn-line: #8fbfb2;--btn-primary: #d4f0e4;--btn-primary-line: #1b8a5a;--node-bg: #ffffff;--node-line: #8fbfb2;--graph-bg: #eef7f4;--graph-grid: rgba(29, 154, 138, .12);--edge-cheap: #8fbfb2;--edge-expensive: #c48a14;--edge-critical: #c44536;--shadow: rgba(23, 51, 44, .08)}[data-theme=high-contrast]{--bg: #ffffff;--bg-2: #f2f2f2;--surface: #ffffff;--line: #111111;--ink: #000000;--muted: #222222;--high: #007a33;--medium: #8a5a00;--low: #b00000;--critical: #9b0000;--accent: #0033cc;--rail-from: #f2f2f2;--rail-to: #e6e6e6;--rail-active: #d9d9d9;--btn: #ffffff;--btn-line: #000000;--btn-primary: #d9f2e3;--btn-primary-line: #007a33;--node-bg: #ffffff;--node-line: #000000;--graph-bg: #ffffff;--graph-grid: rgba(0, 0, 0, .12);--edge-cheap: #444444;--edge-expensive: #8a5a00;--edge-critical: #b00000;--shadow: rgba(0, 0, 0, .12)}*{box-sizing:border-box}html,body,#root{height:100%;margin:0}body{background:var(--bg);color:var(--ink);font-family:IBM Plex Sans,Segoe UI,sans-serif}button,input,select,textarea{font-family:inherit;color:inherit}.app{display:grid;grid-template-columns:220px 1fr;height:100%}.rail{border-right:1px solid var(--line);background:linear-gradient(180deg,var(--rail-from),var(--rail-to));padding:20px 14px;display:flex;flex-direction:column;gap:6px}.brand{font-family:IBM Plex Mono,monospace;letter-spacing:.18em;font-size:12px;text-transform:uppercase;color:var(--accent);margin:0 0 18px}.rail button,.tab{background:transparent;border:0;text-align:left;padding:8px 10px;border-radius:6px;color:var(--muted);cursor:pointer}.rail button.active,.tab.active{background:var(--rail-active);color:var(--ink)}.theme-pick{margin-top:10px;display:grid;gap:4px}.theme-pick label{font-size:10px;letter-spacing:.08em;text-transform:uppercase;color:var(--muted)}.theme-pick select{background:var(--surface);border:1px solid var(--line);border-radius:6px;padding:6px 8px;width:100%}.main{display:flex;flex-direction:column;min-width:0}.topbar{display:flex;gap:8px;align-items:center;padding:12px 16px;border-bottom:1px solid var(--line);background:var(--bg-2)}.topbar input,.topbar select{background:var(--surface);border:1px solid var(--line);border-radius:6px;padding:8px 10px;min-width:160px}.topbar input.path{flex:1}.topbar button,.btn{background:var(--btn);border:1px solid var(--btn-line);border-radius:6px;padding:8px 12px;cursor:pointer}.btn.primary{background:var(--btn-primary);border-color:var(--btn-primary-line)}.content{flex:1;min-height:0;display:grid;grid-template-columns:420px 1fr}.brief{overflow:auto;border-right:1px solid var(--line);padding:18px;background:radial-gradient(circle at 0 0,color-mix(in srgb,var(--accent) 8%,transparent),transparent 40%),var(--bg)}.graph-wrap{position:relative;min-height:0}.graph-wrap .react-flow{background-color:var(--graph-bg);background-image:linear-gradient(var(--graph-grid) 1px,transparent 1px),linear-gradient(90deg,var(--graph-grid) 1px,transparent 1px);background-size:24px 24px}.react-flow__minimap{background:var(--surface)!important}.react-flow__controls{box-shadow:none!important}.react-flow__controls-button{background:var(--surface)!important;border-bottom:1px solid var(--line)!important;fill:var(--ink)!important}h1{font-size:18px;margin:0 0 6px}.level{font-family:IBM Plex Mono,monospace;font-weight:600}.level.high{color:var(--high)}.level.medium{color:var(--medium)}.level.low{color:var(--low)}.kicker{color:var(--muted);font-size:12px;text-transform:uppercase;letter-spacing:.08em;margin:16px 0 6px}.chip{display:inline-block;font-size:11px;padding:2px 8px;border-radius:999px;border:1px solid var(--line);margin:0 6px 6px 0;color:var(--muted)}.chip.blocker{color:var(--low);border-color:var(--low)}.chip.warning{color:var(--medium);border-color:var(--medium)}.file{font-family:IBM Plex Mono,monospace;font-size:12px;color:var(--accent)}.muted{color:var(--muted);font-size:13px;line-height:1.45}.error{color:var(--low);padding:8px 16px}.pr-list{padding:16px;overflow:auto}.pr{border:1px solid var(--line);background:var(--surface);padding:12px 14px;border-radius:8px;margin-bottom:10px}.pr h3{margin:0 0 4px;font-size:14px}.settings{padding:24px;max-width:720px;display:grid;gap:10px}.settings label{font-size:12px;color:var(--muted)}.settings input,.settings select{background:var(--surface);border:1px solid var(--line);border-radius:6px;padding:8px 10px;width:100%}.theme-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(140px,1fr));gap:8px}.theme-swatch{border:1px solid var(--line);background:var(--surface);border-radius:8px;padding:10px;text-align:left;cursor:pointer}.theme-swatch.active{border-color:var(--accent);box-shadow:0 0 0 1px var(--accent)}.theme-swatch .name{font-size:13px;font-weight:600}.theme-swatch .group{font-size:11px;color:var(--muted)}.headline{white-space:pre-wrap;font-family:IBM Plex Mono,monospace;font-size:12px;color:var(--muted)}.graph-modes{display:flex;gap:6px;padding:10px 14px;border-bottom:1px solid var(--line);background:var(--bg-2)}.graph-modes button{background:transparent;border:1px solid var(--line);border-radius:999px;padding:4px 10px;color:var(--muted);cursor:pointer}.graph-modes button.active{background:var(--rail-active);color:var(--ink);border-color:var(--btn-primary-line)}.lp-node{padding:8px 10px;border-radius:8px;border:1px solid var(--node-line);background:var(--node-bg);min-width:150px;box-shadow:0 0 0 1px var(--shadow)}.lp-node .t{font-size:10px;color:var(--muted);text-transform:uppercase;letter-spacing:.08em}.lp-node .n{font-size:13px;font-weight:600} diff --git a/src/loadpath/static/assets/index-BlJPyDt6.js b/src/loadpath/static/assets/index-BlJPyDt6.js deleted file mode 100644 index b60ce67..0000000 --- a/src/loadpath/static/assets/index-BlJPyDt6.js +++ /dev/null @@ -1,62 +0,0 @@ -(function(){const r=document.createElement("link").relList;if(r&&r.supports&&r.supports("modulepreload"))return;for(const u of document.querySelectorAll('link[rel="modulepreload"]'))l(u);new MutationObserver(u=>{for(const c of u)if(c.type==="childList")for(const f of c.addedNodes)f.tagName==="LINK"&&f.rel==="modulepreload"&&l(f)}).observe(document,{childList:!0,subtree:!0});function o(u){const c={};return u.integrity&&(c.integrity=u.integrity),u.referrerPolicy&&(c.referrerPolicy=u.referrerPolicy),u.crossOrigin==="use-credentials"?c.credentials="include":u.crossOrigin==="anonymous"?c.credentials="omit":c.credentials="same-origin",c}function l(u){if(u.ep)return;u.ep=!0;const c=o(u);fetch(u.href,c)}})();function Zh(t){return t&&t.__esModule&&Object.prototype.hasOwnProperty.call(t,"default")?t.default:t}var ha={exports:{}},Gi={},pa={exports:{}},Ne={};/** - * @license React - * react.production.min.js - * - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */var jd;function w0(){if(jd)return Ne;jd=1;var t=Symbol.for("react.element"),r=Symbol.for("react.portal"),o=Symbol.for("react.fragment"),l=Symbol.for("react.strict_mode"),u=Symbol.for("react.profiler"),c=Symbol.for("react.provider"),f=Symbol.for("react.context"),h=Symbol.for("react.forward_ref"),p=Symbol.for("react.suspense"),y=Symbol.for("react.memo"),m=Symbol.for("react.lazy"),v=Symbol.iterator;function g(C){return C===null||typeof C!="object"?null:(C=v&&C[v]||C["@@iterator"],typeof C=="function"?C:null)}var w={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},S=Object.assign,M={};function N(C,z,ne){this.props=C,this.context=z,this.refs=M,this.updater=ne||w}N.prototype.isReactComponent={},N.prototype.setState=function(C,z){if(typeof C!="object"&&typeof C!="function"&&C!=null)throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,C,z,"setState")},N.prototype.forceUpdate=function(C){this.updater.enqueueForceUpdate(this,C,"forceUpdate")};function E(){}E.prototype=N.prototype;function R(C,z,ne){this.props=C,this.context=z,this.refs=M,this.updater=ne||w}var _=R.prototype=new E;_.constructor=R,S(_,N.prototype),_.isPureReactComponent=!0;var I=Array.isArray,W=Object.prototype.hasOwnProperty,$={current:null},V={key:!0,ref:!0,__self:!0,__source:!0};function X(C,z,ne){var ie,ce={},O=null,re=null;if(z!=null)for(ie in z.ref!==void 0&&(re=z.ref),z.key!==void 0&&(O=""+z.key),z)W.call(z,ie)&&!V.hasOwnProperty(ie)&&(ce[ie]=z[ie]);var Q=arguments.length-2;if(Q===1)ce.children=ne;else if(1>>1,z=A[C];if(0>>1;Cu(ce,F))Ou(re,ce)?(A[C]=re,A[O]=F,C=O):(A[C]=ce,A[ie]=F,C=ie);else if(Ou(re,F))A[C]=re,A[O]=F,C=O;else break e}}return j}function u(A,j){var F=A.sortIndex-j.sortIndex;return F!==0?F:A.id-j.id}if(typeof performance=="object"&&typeof performance.now=="function"){var c=performance;t.unstable_now=function(){return c.now()}}else{var f=Date,h=f.now();t.unstable_now=function(){return f.now()-h}}var p=[],y=[],m=1,v=null,g=3,w=!1,S=!1,M=!1,N=typeof setTimeout=="function"?setTimeout:null,E=typeof clearTimeout=="function"?clearTimeout:null,R=typeof setImmediate<"u"?setImmediate:null;typeof navigator<"u"&&navigator.scheduling!==void 0&&navigator.scheduling.isInputPending!==void 0&&navigator.scheduling.isInputPending.bind(navigator.scheduling);function _(A){for(var j=o(y);j!==null;){if(j.callback===null)l(y);else if(j.startTime<=A)l(y),j.sortIndex=j.expirationTime,r(p,j);else break;j=o(y)}}function I(A){if(M=!1,_(A),!S)if(o(p)!==null)S=!0,H(W);else{var j=o(y);j!==null&&U(I,j.startTime-A)}}function W(A,j){S=!1,M&&(M=!1,E(X),X=-1),w=!0;var F=g;try{for(_(j),v=o(p);v!==null&&(!(v.expirationTime>j)||A&&!Z());){var C=v.callback;if(typeof C=="function"){v.callback=null,g=v.priorityLevel;var z=C(v.expirationTime<=j);j=t.unstable_now(),typeof z=="function"?v.callback=z:v===o(p)&&l(p),_(j)}else l(p);v=o(p)}if(v!==null)var ne=!0;else{var ie=o(y);ie!==null&&U(I,ie.startTime-j),ne=!1}return ne}finally{v=null,g=F,w=!1}}var $=!1,V=null,X=-1,K=5,te=-1;function Z(){return!(t.unstable_now()-teA||125C?(A.sortIndex=F,r(y,A),o(p)===null&&A===o(y)&&(M?(E(X),X=-1):M=!0,U(I,F-C))):(A.sortIndex=z,r(p,A),S||w||(S=!0,H(W))),A},t.unstable_shouldYield=Z,t.unstable_wrapCallback=function(A){var j=g;return function(){var F=g;g=j;try{return A.apply(this,arguments)}finally{g=F}}}})(ya)),ya}var Fd;function N0(){return Fd||(Fd=1,ma.exports=k0()),ma.exports}/** - * @license React - * react-dom.production.min.js - * - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */var Hd;function C0(){if(Hd)return gt;Hd=1;var t=fo(),r=N0();function o(e){for(var n="https://reactjs.org/docs/error-decoder.html?invariant="+e,i=1;i"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),p=Object.prototype.hasOwnProperty,y=/^[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/,m={},v={};function g(e){return p.call(v,e)?!0:p.call(m,e)?!1:y.test(e)?v[e]=!0:(m[e]=!0,!1)}function w(e,n,i,s){if(i!==null&&i.type===0)return!1;switch(typeof n){case"function":case"symbol":return!0;case"boolean":return s?!1:i!==null?!i.acceptsBooleans:(e=e.toLowerCase().slice(0,5),e!=="data-"&&e!=="aria-");default:return!1}}function S(e,n,i,s){if(n===null||typeof n>"u"||w(e,n,i,s))return!0;if(s)return!1;if(i!==null)switch(i.type){case 3:return!n;case 4:return n===!1;case 5:return isNaN(n);case 6:return isNaN(n)||1>n}return!1}function M(e,n,i,s,a,d,x){this.acceptsBooleans=n===2||n===3||n===4,this.attributeName=s,this.attributeNamespace=a,this.mustUseProperty=i,this.propertyName=e,this.type=n,this.sanitizeURL=d,this.removeEmptyString=x}var N={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(e){N[e]=new M(e,0,!1,e,null,!1,!1)}),[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach(function(e){var n=e[0];N[n]=new M(n,1,!1,e[1],null,!1,!1)}),["contentEditable","draggable","spellCheck","value"].forEach(function(e){N[e]=new M(e,2,!1,e.toLowerCase(),null,!1,!1)}),["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach(function(e){N[e]=new M(e,2,!1,e,null,!1,!1)}),"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach(function(e){N[e]=new M(e,3,!1,e.toLowerCase(),null,!1,!1)}),["checked","multiple","muted","selected"].forEach(function(e){N[e]=new M(e,3,!0,e,null,!1,!1)}),["capture","download"].forEach(function(e){N[e]=new M(e,4,!1,e,null,!1,!1)}),["cols","rows","size","span"].forEach(function(e){N[e]=new M(e,6,!1,e,null,!1,!1)}),["rowSpan","start"].forEach(function(e){N[e]=new M(e,5,!1,e.toLowerCase(),null,!1,!1)});var E=/[\-:]([a-z])/g;function R(e){return e[1].toUpperCase()}"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach(function(e){var n=e.replace(E,R);N[n]=new M(n,1,!1,e,null,!1,!1)}),"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach(function(e){var n=e.replace(E,R);N[n]=new M(n,1,!1,e,"http://www.w3.org/1999/xlink",!1,!1)}),["xml:base","xml:lang","xml:space"].forEach(function(e){var n=e.replace(E,R);N[n]=new M(n,1,!1,e,"http://www.w3.org/XML/1998/namespace",!1,!1)}),["tabIndex","crossOrigin"].forEach(function(e){N[e]=new M(e,1,!1,e.toLowerCase(),null,!1,!1)}),N.xlinkHref=new M("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1),["src","href","action","formAction"].forEach(function(e){N[e]=new M(e,1,!1,e.toLowerCase(),null,!0,!0)});function _(e,n,i,s){var a=N.hasOwnProperty(n)?N[n]:null;(a!==null?a.type!==0:s||!(2T||a[x]!==d[T]){var L=` -`+a[x].replace(" at new "," at ");return e.displayName&&L.includes("")&&(L=L.replace("",e.displayName)),L}while(1<=x&&0<=T);break}}}finally{ne=!1,Error.prepareStackTrace=i}return(e=e?e.displayName||e.name:"")?z(e):""}function ce(e){switch(e.tag){case 5:return z(e.type);case 16:return z("Lazy");case 13:return z("Suspense");case 19:return z("SuspenseList");case 0:case 2:case 15:return e=ie(e.type,!1),e;case 11:return e=ie(e.type.render,!1),e;case 1:return e=ie(e.type,!0),e;default:return""}}function O(e){if(e==null)return null;if(typeof e=="function")return e.displayName||e.name||null;if(typeof e=="string")return e;switch(e){case V:return"Fragment";case $:return"Portal";case K:return"Profiler";case X:return"StrictMode";case J:return"Suspense";case k:return"SuspenseList"}if(typeof e=="object")switch(e.$$typeof){case Z:return(e.displayName||"Context")+".Consumer";case te:return(e._context.displayName||"Context")+".Provider";case ee:var n=e.render;return e=e.displayName,e||(e=n.displayName||n.name||"",e=e!==""?"ForwardRef("+e+")":"ForwardRef"),e;case B:return n=e.displayName||null,n!==null?n:O(e.type)||"Memo";case H:n=e._payload,e=e._init;try{return O(e(n))}catch{}}return null}function re(e){var n=e.type;switch(e.tag){case 24:return"Cache";case 9:return(n.displayName||"Context")+".Consumer";case 10:return(n._context.displayName||"Context")+".Provider";case 18:return"DehydratedFragment";case 11:return e=n.render,e=e.displayName||e.name||"",n.displayName||(e!==""?"ForwardRef("+e+")":"ForwardRef");case 7:return"Fragment";case 5:return n;case 4:return"Portal";case 3:return"Root";case 6:return"Text";case 16:return O(n);case 8:return n===X?"StrictMode":"Mode";case 22:return"Offscreen";case 12:return"Profiler";case 21:return"Scope";case 13:return"Suspense";case 19:return"SuspenseList";case 25:return"TracingMarker";case 1:case 0:case 17:case 2:case 14:case 15:if(typeof n=="function")return n.displayName||n.name||null;if(typeof n=="string")return n}return null}function Q(e){switch(typeof e){case"boolean":case"number":case"string":case"undefined":return e;case"object":return e;default:return""}}function le(e){var n=e.type;return(e=e.nodeName)&&e.toLowerCase()==="input"&&(n==="checkbox"||n==="radio")}function pe(e){var n=le(e)?"checked":"value",i=Object.getOwnPropertyDescriptor(e.constructor.prototype,n),s=""+e[n];if(!e.hasOwnProperty(n)&&typeof i<"u"&&typeof i.get=="function"&&typeof i.set=="function"){var a=i.get,d=i.set;return Object.defineProperty(e,n,{configurable:!0,get:function(){return a.call(this)},set:function(x){s=""+x,d.call(this,x)}}),Object.defineProperty(e,n,{enumerable:i.enumerable}),{getValue:function(){return s},setValue:function(x){s=""+x},stopTracking:function(){e._valueTracker=null,delete e[n]}}}}function we(e){e._valueTracker||(e._valueTracker=pe(e))}function ve(e){if(!e)return!1;var n=e._valueTracker;if(!n)return!0;var i=n.getValue(),s="";return e&&(s=le(e)?e.checked?"true":"false":e.value),e=s,e!==i?(n.setValue(e),!0):!1}function me(e){if(e=e||(typeof document<"u"?document:void 0),typeof e>"u")return null;try{return e.activeElement||e.body}catch{return e.body}}function ke(e,n){var i=n.checked;return F({},n,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:i??e._wrapperState.initialChecked})}function Ce(e,n){var i=n.defaultValue==null?"":n.defaultValue,s=n.checked!=null?n.checked:n.defaultChecked;i=Q(n.value!=null?n.value:i),e._wrapperState={initialChecked:s,initialValue:i,controlled:n.type==="checkbox"||n.type==="radio"?n.checked!=null:n.value!=null}}function Me(e,n){n=n.checked,n!=null&&_(e,"checked",n,!1)}function Re(e,n){Me(e,n);var i=Q(n.value),s=n.type;if(i!=null)s==="number"?(i===0&&e.value===""||e.value!=i)&&(e.value=""+i):e.value!==""+i&&(e.value=""+i);else if(s==="submit"||s==="reset"){e.removeAttribute("value");return}n.hasOwnProperty("value")?ut(e,n.type,i):n.hasOwnProperty("defaultValue")&&ut(e,n.type,Q(n.defaultValue)),n.checked==null&&n.defaultChecked!=null&&(e.defaultChecked=!!n.defaultChecked)}function ot(e,n,i){if(n.hasOwnProperty("value")||n.hasOwnProperty("defaultValue")){var s=n.type;if(!(s!=="submit"&&s!=="reset"||n.value!==void 0&&n.value!==null))return;n=""+e._wrapperState.initialValue,i||n===e.value||(e.value=n),e.defaultValue=n}i=e.name,i!==""&&(e.name=""),e.defaultChecked=!!e._wrapperState.initialChecked,i!==""&&(e.name=i)}function ut(e,n,i){(n!=="number"||me(e.ownerDocument)!==e)&&(i==null?e.defaultValue=""+e._wrapperState.initialValue:e.defaultValue!==""+i&&(e.defaultValue=""+i))}var Je=Array.isArray;function et(e,n,i,s){if(e=e.options,n){n={};for(var a=0;a"+n.valueOf().toString()+"",n=Mt.firstChild;e.firstChild;)e.removeChild(e.firstChild);for(;n.firstChild;)e.appendChild(n.firstChild)}});function ln(e,n){if(n){var i=e.firstChild;if(i&&i===e.lastChild&&i.nodeType===3){i.nodeValue=n;return}}e.textContent=n}var Yn={animationIterationCount:!0,aspectRatio:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},Sl=["Webkit","ms","Moz","O"];Object.keys(Yn).forEach(function(e){Sl.forEach(function(n){n=n+e.charAt(0).toUpperCase()+e.substring(1),Yn[n]=Yn[e]})});function xo(e,n,i){return n==null||typeof n=="boolean"||n===""?"":i||typeof n!="number"||n===0||Yn.hasOwnProperty(e)&&Yn[e]?(""+n).trim():n+"px"}function wo(e,n){e=e.style;for(var i in n)if(n.hasOwnProperty(i)){var s=i.indexOf("--")===0,a=xo(i,n[i],s);i==="float"&&(i="cssFloat"),s?e.setProperty(i,a):e[i]=a}}var _l=F({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});function si(e,n){if(n){if(_l[e]&&(n.children!=null||n.dangerouslySetInnerHTML!=null))throw Error(o(137,e));if(n.dangerouslySetInnerHTML!=null){if(n.children!=null)throw Error(o(60));if(typeof n.dangerouslySetInnerHTML!="object"||!("__html"in n.dangerouslySetInnerHTML))throw Error(o(61))}if(n.style!=null&&typeof n.style!="object")throw Error(o(62))}}function li(e,n){if(e.indexOf("-")===-1)return typeof n.is=="string";switch(e){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}var ui=null;function ai(e){return e=e.target||e.srcElement||window,e.correspondingUseElement&&(e=e.correspondingUseElement),e.nodeType===3?e.parentNode:e}var ci=null,wn=null,Sn=null;function So(e){if(e=ji(e)){if(typeof ci!="function")throw Error(o(280));var n=e.stateNode;n&&(n=qo(n),ci(e.stateNode,e.type,n))}}function _o(e){wn?Sn?Sn.push(e):Sn=[e]:wn=e}function Eo(){if(wn){var e=wn,n=Sn;if(Sn=wn=null,So(e),n)for(e=0;e>>=0,e===0?32:31-(Rl(e)/Ll|0)|0}var Nr=64,Cr=4194304;function Kn(e){switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return e&4194240;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return e&130023424;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;default:return e}}function un(e,n){var i=e.pendingLanes;if(i===0)return 0;var s=0,a=e.suspendedLanes,d=e.pingedLanes,x=i&268435455;if(x!==0){var T=x&~a;T!==0?s=Kn(T):(d&=x,d!==0&&(s=Kn(d)))}else x=i&~a,x!==0?s=Kn(x):d!==0&&(s=Kn(d));if(s===0)return 0;if(n!==0&&n!==s&&(n&a)===0&&(a=s&-s,d=n&-n,a>=d||a===16&&(d&4194240)!==0))return n;if((s&4)!==0&&(s|=i&16),n=e.entangledLanes,n!==0)for(e=e.entanglements,n&=s;0i;i++)n.push(e);return n}function Zn(e,n,i){e.pendingLanes|=n,n!==536870912&&(e.suspendedLanes=0,e.pingedLanes=0),e=e.eventTimes,n=31-xt(n),e[n]=i}function $l(e,n){var i=e.pendingLanes&~n;e.pendingLanes=n,e.suspendedLanes=0,e.pingedLanes=0,e.expiredLanes&=n,e.mutableReadLanes&=n,e.entangledLanes&=n,n=e.entanglements;var s=e.eventTimes;for(e=e.expirationTimes;0=Ni),Cc=" ",Mc=!1;function Pc(e,n){switch(e){case"keyup":return gm.indexOf(n.keyCode)!==-1;case"keydown":return n.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function Ic(e){return e=e.detail,typeof e=="object"&&"data"in e?e.data:null}var Tr=!1;function ym(e,n){switch(e){case"compositionend":return Ic(n);case"keypress":return n.which!==32?null:(Mc=!0,Cc);case"textInput":return e=n.data,e===Cc&&Mc?null:e;default:return null}}function vm(e,n){if(Tr)return e==="compositionend"||!Xl&&Pc(e,n)?(e=wc(),Ho=Vl=Cn=null,Tr=!1,e):null;switch(e){case"paste":return null;case"keypress":if(!(n.ctrlKey||n.altKey||n.metaKey)||n.ctrlKey&&n.altKey){if(n.char&&1=n)return{node:i,offset:n-e};e=s}e:{for(;i;){if(i.nextSibling){i=i.nextSibling;break e}i=i.parentNode}i=void 0}i=$c(i)}}function Oc(e,n){return e&&n?e===n?!0:e&&e.nodeType===3?!1:n&&n.nodeType===3?Oc(e,n.parentNode):"contains"in e?e.contains(n):e.compareDocumentPosition?!!(e.compareDocumentPosition(n)&16):!1:!1}function Fc(){for(var e=window,n=me();n instanceof e.HTMLIFrameElement;){try{var i=typeof n.contentWindow.location.href=="string"}catch{i=!1}if(i)e=n.contentWindow;else break;n=me(e.document)}return n}function Kl(e){var n=e&&e.nodeName&&e.nodeName.toLowerCase();return n&&(n==="input"&&(e.type==="text"||e.type==="search"||e.type==="tel"||e.type==="url"||e.type==="password")||n==="textarea"||e.contentEditable==="true")}function Mm(e){var n=Fc(),i=e.focusedElem,s=e.selectionRange;if(n!==i&&i&&i.ownerDocument&&Oc(i.ownerDocument.documentElement,i)){if(s!==null&&Kl(i)){if(n=s.start,e=s.end,e===void 0&&(e=n),"selectionStart"in i)i.selectionStart=n,i.selectionEnd=Math.min(e,i.value.length);else if(e=(n=i.ownerDocument||document)&&n.defaultView||window,e.getSelection){e=e.getSelection();var a=i.textContent.length,d=Math.min(s.start,a);s=s.end===void 0?d:Math.min(s.end,a),!e.extend&&d>s&&(a=s,s=d,d=a),a=Dc(i,d);var x=Dc(i,s);a&&x&&(e.rangeCount!==1||e.anchorNode!==a.node||e.anchorOffset!==a.offset||e.focusNode!==x.node||e.focusOffset!==x.offset)&&(n=n.createRange(),n.setStart(a.node,a.offset),e.removeAllRanges(),d>s?(e.addRange(n),e.extend(x.node,x.offset)):(n.setEnd(x.node,x.offset),e.addRange(n)))}}for(n=[],e=i;e=e.parentNode;)e.nodeType===1&&n.push({element:e,left:e.scrollLeft,top:e.scrollTop});for(typeof i.focus=="function"&&i.focus(),i=0;i=document.documentMode,zr=null,ql=null,Ii=null,Zl=!1;function Hc(e,n,i){var s=i.window===i?i.document:i.nodeType===9?i:i.ownerDocument;Zl||zr==null||zr!==me(s)||(s=zr,"selectionStart"in s&&Kl(s)?s={start:s.selectionStart,end:s.selectionEnd}:(s=(s.ownerDocument&&s.ownerDocument.defaultView||window).getSelection(),s={anchorNode:s.anchorNode,anchorOffset:s.anchorOffset,focusNode:s.focusNode,focusOffset:s.focusOffset}),Ii&&Pi(Ii,s)||(Ii=s,s=Qo(ql,"onSelect"),0$r||(e.current=cu[$r],cu[$r]=null,$r--)}function Le(e,n){$r++,cu[$r]=e.current,e.current=n}var Tn={},tt=In(Tn),ct=In(!1),er=Tn;function Dr(e,n){var i=e.type.contextTypes;if(!i)return Tn;var s=e.stateNode;if(s&&s.__reactInternalMemoizedUnmaskedChildContext===n)return s.__reactInternalMemoizedMaskedChildContext;var a={},d;for(d in i)a[d]=n[d];return s&&(e=e.stateNode,e.__reactInternalMemoizedUnmaskedChildContext=n,e.__reactInternalMemoizedMaskedChildContext=a),a}function ft(e){return e=e.childContextTypes,e!=null}function Zo(){Ae(ct),Ae(tt)}function tf(e,n,i){if(tt.current!==Tn)throw Error(o(168));Le(tt,n),Le(ct,i)}function nf(e,n,i){var s=e.stateNode;if(n=n.childContextTypes,typeof s.getChildContext!="function")return i;s=s.getChildContext();for(var a in s)if(!(a in n))throw Error(o(108,re(e)||"Unknown",a));return F({},i,s)}function Jo(e){return e=(e=e.stateNode)&&e.__reactInternalMemoizedMergedChildContext||Tn,er=tt.current,Le(tt,e),Le(ct,ct.current),!0}function rf(e,n,i){var s=e.stateNode;if(!s)throw Error(o(169));i?(e=nf(e,n,er),s.__reactInternalMemoizedMergedChildContext=e,Ae(ct),Ae(tt),Le(tt,e)):Ae(ct),Le(ct,i)}var cn=null,es=!1,fu=!1;function of(e){cn===null?cn=[e]:cn.push(e)}function Fm(e){es=!0,of(e)}function zn(){if(!fu&&cn!==null){fu=!0;var e=0,n=ze;try{var i=cn;for(ze=1;e>=x,a-=x,fn=1<<32-xt(n)+a|i<Ee?(Ke=_e,_e=null):Ke=_e.sibling;var Te=oe(b,_e,Y[Ee],ae);if(Te===null){_e===null&&(_e=Ke);break}e&&_e&&Te.alternate===null&&n(b,_e),D=d(Te,D,Ee),Se===null?ye=Te:Se.sibling=Te,Se=Te,_e=Ke}if(Ee===Y.length)return i(b,_e),De&&nr(b,Ee),ye;if(_e===null){for(;EeEe?(Ke=_e,_e=null):Ke=_e.sibling;var Hn=oe(b,_e,Te.value,ae);if(Hn===null){_e===null&&(_e=Ke);break}e&&_e&&Hn.alternate===null&&n(b,_e),D=d(Hn,D,Ee),Se===null?ye=Hn:Se.sibling=Hn,Se=Hn,_e=Ke}if(Te.done)return i(b,_e),De&&nr(b,Ee),ye;if(_e===null){for(;!Te.done;Ee++,Te=Y.next())Te=ue(b,Te.value,ae),Te!==null&&(D=d(Te,D,Ee),Se===null?ye=Te:Se.sibling=Te,Se=Te);return De&&nr(b,Ee),ye}for(_e=s(b,_e);!Te.done;Ee++,Te=Y.next())Te=fe(_e,b,Ee,Te.value,ae),Te!==null&&(e&&Te.alternate!==null&&_e.delete(Te.key===null?Ee:Te.key),D=d(Te,D,Ee),Se===null?ye=Te:Se.sibling=Te,Se=Te);return e&&_e.forEach(function(x0){return n(b,x0)}),De&&nr(b,Ee),ye}function Ue(b,D,Y,ae){if(typeof Y=="object"&&Y!==null&&Y.type===V&&Y.key===null&&(Y=Y.props.children),typeof Y=="object"&&Y!==null){switch(Y.$$typeof){case W:e:{for(var ye=Y.key,Se=D;Se!==null;){if(Se.key===ye){if(ye=Y.type,ye===V){if(Se.tag===7){i(b,Se.sibling),D=a(Se,Y.props.children),D.return=b,b=D;break e}}else if(Se.elementType===ye||typeof ye=="object"&&ye!==null&&ye.$$typeof===H&&ff(ye)===Se.type){i(b,Se.sibling),D=a(Se,Y.props),D.ref=Ai(b,Se,Y),D.return=b,b=D;break e}i(b,Se);break}else n(b,Se);Se=Se.sibling}Y.type===V?(D=cr(Y.props.children,b.mode,ae,Y.key),D.return=b,b=D):(ae=Ps(Y.type,Y.key,Y.props,null,b.mode,ae),ae.ref=Ai(b,D,Y),ae.return=b,b=ae)}return x(b);case $:e:{for(Se=Y.key;D!==null;){if(D.key===Se)if(D.tag===4&&D.stateNode.containerInfo===Y.containerInfo&&D.stateNode.implementation===Y.implementation){i(b,D.sibling),D=a(D,Y.children||[]),D.return=b,b=D;break e}else{i(b,D);break}else n(b,D);D=D.sibling}D=ua(Y,b.mode,ae),D.return=b,b=D}return x(b);case H:return Se=Y._init,Ue(b,D,Se(Y._payload),ae)}if(Je(Y))return he(b,D,Y,ae);if(j(Y))return ge(b,D,Y,ae);is(b,Y)}return typeof Y=="string"&&Y!==""||typeof Y=="number"?(Y=""+Y,D!==null&&D.tag===6?(i(b,D.sibling),D=a(D,Y),D.return=b,b=D):(i(b,D),D=la(Y,b.mode,ae),D.return=b,b=D),x(b)):i(b,D)}return Ue}var Vr=df(!0),hf=df(!1),os=In(null),ss=null,Br=null,yu=null;function vu(){yu=Br=ss=null}function xu(e){var n=os.current;Ae(os),e._currentValue=n}function wu(e,n,i){for(;e!==null;){var s=e.alternate;if((e.childLanes&n)!==n?(e.childLanes|=n,s!==null&&(s.childLanes|=n)):s!==null&&(s.childLanes&n)!==n&&(s.childLanes|=n),e===i)break;e=e.return}}function Ur(e,n){ss=e,yu=Br=null,e=e.dependencies,e!==null&&e.firstContext!==null&&((e.lanes&n)!==0&&(dt=!0),e.firstContext=null)}function Tt(e){var n=e._currentValue;if(yu!==e)if(e={context:e,memoizedValue:n,next:null},Br===null){if(ss===null)throw Error(o(308));Br=e,ss.dependencies={lanes:0,firstContext:e}}else Br=Br.next=e;return n}var rr=null;function Su(e){rr===null?rr=[e]:rr.push(e)}function pf(e,n,i,s){var a=n.interleaved;return a===null?(i.next=i,Su(n)):(i.next=a.next,a.next=i),n.interleaved=i,hn(e,s)}function hn(e,n){e.lanes|=n;var i=e.alternate;for(i!==null&&(i.lanes|=n),i=e,e=e.return;e!==null;)e.childLanes|=n,i=e.alternate,i!==null&&(i.childLanes|=n),i=e,e=e.return;return i.tag===3?i.stateNode:null}var Rn=!1;function _u(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,interleaved:null,lanes:0},effects:null}}function gf(e,n){e=e.updateQueue,n.updateQueue===e&&(n.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,effects:e.effects})}function pn(e,n){return{eventTime:e,lane:n,tag:0,payload:null,callback:null,next:null}}function Ln(e,n,i){var s=e.updateQueue;if(s===null)return null;if(s=s.shared,(Pe&2)!==0){var a=s.pending;return a===null?n.next=n:(n.next=a.next,a.next=n),s.pending=n,hn(e,i)}return a=s.interleaved,a===null?(n.next=n,Su(s)):(n.next=a.next,a.next=n),s.interleaved=n,hn(e,i)}function ls(e,n,i){if(n=n.updateQueue,n!==null&&(n=n.shared,(i&4194240)!==0)){var s=n.lanes;s&=e.pendingLanes,i|=s,n.lanes=i,Mr(e,i)}}function mf(e,n){var i=e.updateQueue,s=e.alternate;if(s!==null&&(s=s.updateQueue,i===s)){var a=null,d=null;if(i=i.firstBaseUpdate,i!==null){do{var x={eventTime:i.eventTime,lane:i.lane,tag:i.tag,payload:i.payload,callback:i.callback,next:null};d===null?a=d=x:d=d.next=x,i=i.next}while(i!==null);d===null?a=d=n:d=d.next=n}else a=d=n;i={baseState:s.baseState,firstBaseUpdate:a,lastBaseUpdate:d,shared:s.shared,effects:s.effects},e.updateQueue=i;return}e=i.lastBaseUpdate,e===null?i.firstBaseUpdate=n:e.next=n,i.lastBaseUpdate=n}function us(e,n,i,s){var a=e.updateQueue;Rn=!1;var d=a.firstBaseUpdate,x=a.lastBaseUpdate,T=a.shared.pending;if(T!==null){a.shared.pending=null;var L=T,q=L.next;L.next=null,x===null?d=q:x.next=q,x=L;var se=e.alternate;se!==null&&(se=se.updateQueue,T=se.lastBaseUpdate,T!==x&&(T===null?se.firstBaseUpdate=q:T.next=q,se.lastBaseUpdate=L))}if(d!==null){var ue=a.baseState;x=0,se=q=L=null,T=d;do{var oe=T.lane,fe=T.eventTime;if((s&oe)===oe){se!==null&&(se=se.next={eventTime:fe,lane:0,tag:T.tag,payload:T.payload,callback:T.callback,next:null});e:{var he=e,ge=T;switch(oe=n,fe=i,ge.tag){case 1:if(he=ge.payload,typeof he=="function"){ue=he.call(fe,ue,oe);break e}ue=he;break e;case 3:he.flags=he.flags&-65537|128;case 0:if(he=ge.payload,oe=typeof he=="function"?he.call(fe,ue,oe):he,oe==null)break e;ue=F({},ue,oe);break e;case 2:Rn=!0}}T.callback!==null&&T.lane!==0&&(e.flags|=64,oe=a.effects,oe===null?a.effects=[T]:oe.push(T))}else fe={eventTime:fe,lane:oe,tag:T.tag,payload:T.payload,callback:T.callback,next:null},se===null?(q=se=fe,L=ue):se=se.next=fe,x|=oe;if(T=T.next,T===null){if(T=a.shared.pending,T===null)break;oe=T,T=oe.next,oe.next=null,a.lastBaseUpdate=oe,a.shared.pending=null}}while(!0);if(se===null&&(L=ue),a.baseState=L,a.firstBaseUpdate=q,a.lastBaseUpdate=se,n=a.shared.interleaved,n!==null){a=n;do x|=a.lane,a=a.next;while(a!==n)}else d===null&&(a.shared.lanes=0);sr|=x,e.lanes=x,e.memoizedState=ue}}function yf(e,n,i){if(e=n.effects,n.effects=null,e!==null)for(n=0;ni?i:4,e(!0);var s=Mu.transition;Mu.transition={};try{e(!1),n()}finally{ze=i,Mu.transition=s}}function $f(){return zt().memoizedState}function Um(e,n,i){var s=Dn(e);if(i={lane:s,action:i,hasEagerState:!1,eagerState:null,next:null},Df(e))Of(n,i);else if(i=pf(e,n,i,s),i!==null){var a=lt();Ft(i,e,s,a),Ff(i,n,s)}}function Wm(e,n,i){var s=Dn(e),a={lane:s,action:i,hasEagerState:!1,eagerState:null,next:null};if(Df(e))Of(n,a);else{var d=e.alternate;if(e.lanes===0&&(d===null||d.lanes===0)&&(d=n.lastRenderedReducer,d!==null))try{var x=n.lastRenderedState,T=d(x,i);if(a.hasEagerState=!0,a.eagerState=T,jt(T,x)){var L=n.interleaved;L===null?(a.next=a,Su(n)):(a.next=L.next,L.next=a),n.interleaved=a;return}}catch{}finally{}i=pf(e,n,a,s),i!==null&&(a=lt(),Ft(i,e,s,a),Ff(i,n,s))}}function Df(e){var n=e.alternate;return e===He||n!==null&&n===He}function Of(e,n){Fi=fs=!0;var i=e.pending;i===null?n.next=n:(n.next=i.next,i.next=n),e.pending=n}function Ff(e,n,i){if((i&4194240)!==0){var s=n.lanes;s&=e.pendingLanes,i|=s,n.lanes=i,Mr(e,i)}}var ps={readContext:Tt,useCallback:nt,useContext:nt,useEffect:nt,useImperativeHandle:nt,useInsertionEffect:nt,useLayoutEffect:nt,useMemo:nt,useReducer:nt,useRef:nt,useState:nt,useDebugValue:nt,useDeferredValue:nt,useTransition:nt,useMutableSource:nt,useSyncExternalStore:nt,useId:nt,unstable_isNewReconciler:!1},bm={readContext:Tt,useCallback:function(e,n){return en().memoizedState=[e,n===void 0?null:n],e},useContext:Tt,useEffect:Pf,useImperativeHandle:function(e,n,i){return i=i!=null?i.concat([e]):null,ds(4194308,4,zf.bind(null,n,e),i)},useLayoutEffect:function(e,n){return ds(4194308,4,e,n)},useInsertionEffect:function(e,n){return ds(4,2,e,n)},useMemo:function(e,n){var i=en();return n=n===void 0?null:n,e=e(),i.memoizedState=[e,n],e},useReducer:function(e,n,i){var s=en();return n=i!==void 0?i(n):n,s.memoizedState=s.baseState=n,e={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:n},s.queue=e,e=e.dispatch=Um.bind(null,He,e),[s.memoizedState,e]},useRef:function(e){var n=en();return e={current:e},n.memoizedState=e},useState:Cf,useDebugValue:ju,useDeferredValue:function(e){return en().memoizedState=e},useTransition:function(){var e=Cf(!1),n=e[0];return e=Bm.bind(null,e[1]),en().memoizedState=e,[n,e]},useMutableSource:function(){},useSyncExternalStore:function(e,n,i){var s=He,a=en();if(De){if(i===void 0)throw Error(o(407));i=i()}else{if(i=n(),Ge===null)throw Error(o(349));(or&30)!==0||Sf(s,n,i)}a.memoizedState=i;var d={value:i,getSnapshot:n};return a.queue=d,Pf(Ef.bind(null,s,d,e),[e]),s.flags|=2048,Bi(9,_f.bind(null,s,d,i,n),void 0,null),i},useId:function(){var e=en(),n=Ge.identifierPrefix;if(De){var i=dn,s=fn;i=(s&~(1<<32-xt(s)-1)).toString(32)+i,n=":"+n+"R"+i,i=Hi++,0<\/script>",e=e.removeChild(e.firstChild)):typeof s.is=="string"?e=x.createElement(i,{is:s.is}):(e=x.createElement(i),i==="select"&&(x=e,s.multiple?x.multiple=!0:s.size&&(x.size=s.size))):e=x.createElementNS(e,i),e[Zt]=n,e[Li]=s,od(e,n,!1,!1),n.stateNode=e;e:{switch(x=li(i,s),i){case"dialog":je("cancel",e),je("close",e),a=s;break;case"iframe":case"object":case"embed":je("load",e),a=s;break;case"video":case"audio":for(a=0;aQr&&(n.flags|=128,s=!0,Ui(d,!1),n.lanes=4194304)}else{if(!s)if(e=as(x),e!==null){if(n.flags|=128,s=!0,i=e.updateQueue,i!==null&&(n.updateQueue=i,n.flags|=4),Ui(d,!0),d.tail===null&&d.tailMode==="hidden"&&!x.alternate&&!De)return rt(n),null}else 2*Oe()-d.renderingStartTime>Qr&&i!==1073741824&&(n.flags|=128,s=!0,Ui(d,!1),n.lanes=4194304);d.isBackwards?(x.sibling=n.child,n.child=x):(i=d.last,i!==null?i.sibling=x:n.child=x,d.last=x)}return d.tail!==null?(n=d.tail,d.rendering=n,d.tail=n.sibling,d.renderingStartTime=Oe(),n.sibling=null,i=Fe.current,Le(Fe,s?i&1|2:i&1),n):(rt(n),null);case 22:case 23:return ia(),s=n.memoizedState!==null,e!==null&&e.memoizedState!==null!==s&&(n.flags|=8192),s&&(n.mode&1)!==0?(Et&1073741824)!==0&&(rt(n),n.subtreeFlags&6&&(n.flags|=8192)):rt(n),null;case 24:return null;case 25:return null}throw Error(o(156,n.tag))}function Jm(e,n){switch(hu(n),n.tag){case 1:return ft(n.type)&&Zo(),e=n.flags,e&65536?(n.flags=e&-65537|128,n):null;case 3:return Wr(),Ae(ct),Ae(tt),Cu(),e=n.flags,(e&65536)!==0&&(e&128)===0?(n.flags=e&-65537|128,n):null;case 5:return ku(n),null;case 13:if(Ae(Fe),e=n.memoizedState,e!==null&&e.dehydrated!==null){if(n.alternate===null)throw Error(o(340));Hr()}return e=n.flags,e&65536?(n.flags=e&-65537|128,n):null;case 19:return Ae(Fe),null;case 4:return Wr(),null;case 10:return xu(n.type._context),null;case 22:case 23:return ia(),null;case 24:return null;default:return null}}var vs=!1,it=!1,e0=typeof WeakSet=="function"?WeakSet:Set,de=null;function Yr(e,n){var i=e.ref;if(i!==null)if(typeof i=="function")try{i(null)}catch(s){Be(e,n,s)}else i.current=null}function Yu(e,n,i){try{i()}catch(s){Be(e,n,s)}}var ud=!1;function t0(e,n){if(iu=Oo,e=Fc(),Kl(e)){if("selectionStart"in e)var i={start:e.selectionStart,end:e.selectionEnd};else e:{i=(i=e.ownerDocument)&&i.defaultView||window;var s=i.getSelection&&i.getSelection();if(s&&s.rangeCount!==0){i=s.anchorNode;var a=s.anchorOffset,d=s.focusNode;s=s.focusOffset;try{i.nodeType,d.nodeType}catch{i=null;break e}var x=0,T=-1,L=-1,q=0,se=0,ue=e,oe=null;t:for(;;){for(var fe;ue!==i||a!==0&&ue.nodeType!==3||(T=x+a),ue!==d||s!==0&&ue.nodeType!==3||(L=x+s),ue.nodeType===3&&(x+=ue.nodeValue.length),(fe=ue.firstChild)!==null;)oe=ue,ue=fe;for(;;){if(ue===e)break t;if(oe===i&&++q===a&&(T=x),oe===d&&++se===s&&(L=x),(fe=ue.nextSibling)!==null)break;ue=oe,oe=ue.parentNode}ue=fe}i=T===-1||L===-1?null:{start:T,end:L}}else i=null}i=i||{start:0,end:0}}else i=null;for(ou={focusedElem:e,selectionRange:i},Oo=!1,de=n;de!==null;)if(n=de,e=n.child,(n.subtreeFlags&1028)!==0&&e!==null)e.return=n,de=e;else for(;de!==null;){n=de;try{var he=n.alternate;if((n.flags&1024)!==0)switch(n.tag){case 0:case 11:case 15:break;case 1:if(he!==null){var ge=he.memoizedProps,Ue=he.memoizedState,b=n.stateNode,D=b.getSnapshotBeforeUpdate(n.elementType===n.type?ge:$t(n.type,ge),Ue);b.__reactInternalSnapshotBeforeUpdate=D}break;case 3:var Y=n.stateNode.containerInfo;Y.nodeType===1?Y.textContent="":Y.nodeType===9&&Y.documentElement&&Y.removeChild(Y.documentElement);break;case 5:case 6:case 4:case 17:break;default:throw Error(o(163))}}catch(ae){Be(n,n.return,ae)}if(e=n.sibling,e!==null){e.return=n.return,de=e;break}de=n.return}return he=ud,ud=!1,he}function Wi(e,n,i){var s=n.updateQueue;if(s=s!==null?s.lastEffect:null,s!==null){var a=s=s.next;do{if((a.tag&e)===e){var d=a.destroy;a.destroy=void 0,d!==void 0&&Yu(n,i,d)}a=a.next}while(a!==s)}}function xs(e,n){if(n=n.updateQueue,n=n!==null?n.lastEffect:null,n!==null){var i=n=n.next;do{if((i.tag&e)===e){var s=i.create;i.destroy=s()}i=i.next}while(i!==n)}}function Xu(e){var n=e.ref;if(n!==null){var i=e.stateNode;switch(e.tag){case 5:e=i;break;default:e=i}typeof n=="function"?n(e):n.current=e}}function ad(e){var n=e.alternate;n!==null&&(e.alternate=null,ad(n)),e.child=null,e.deletions=null,e.sibling=null,e.tag===5&&(n=e.stateNode,n!==null&&(delete n[Zt],delete n[Li],delete n[au],delete n[Dm],delete n[Om])),e.stateNode=null,e.return=null,e.dependencies=null,e.memoizedProps=null,e.memoizedState=null,e.pendingProps=null,e.stateNode=null,e.updateQueue=null}function cd(e){return e.tag===5||e.tag===3||e.tag===4}function fd(e){e:for(;;){for(;e.sibling===null;){if(e.return===null||cd(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;e.tag!==5&&e.tag!==6&&e.tag!==18;){if(e.flags&2||e.child===null||e.tag===4)continue e;e.child.return=e,e=e.child}if(!(e.flags&2))return e.stateNode}}function Qu(e,n,i){var s=e.tag;if(s===5||s===6)e=e.stateNode,n?i.nodeType===8?i.parentNode.insertBefore(e,n):i.insertBefore(e,n):(i.nodeType===8?(n=i.parentNode,n.insertBefore(e,i)):(n=i,n.appendChild(e)),i=i._reactRootContainer,i!=null||n.onclick!==null||(n.onclick=Ko));else if(s!==4&&(e=e.child,e!==null))for(Qu(e,n,i),e=e.sibling;e!==null;)Qu(e,n,i),e=e.sibling}function Gu(e,n,i){var s=e.tag;if(s===5||s===6)e=e.stateNode,n?i.insertBefore(e,n):i.appendChild(e);else if(s!==4&&(e=e.child,e!==null))for(Gu(e,n,i),e=e.sibling;e!==null;)Gu(e,n,i),e=e.sibling}var qe=null,Dt=!1;function jn(e,n,i){for(i=i.child;i!==null;)dd(e,n,i),i=i.sibling}function dd(e,n,i){if(vt&&typeof vt.onCommitFiberUnmount=="function")try{vt.onCommitFiberUnmount(kr,i)}catch{}switch(i.tag){case 5:it||Yr(i,n);case 6:var s=qe,a=Dt;qe=null,jn(e,n,i),qe=s,Dt=a,qe!==null&&(Dt?(e=qe,i=i.stateNode,e.nodeType===8?e.parentNode.removeChild(i):e.removeChild(i)):qe.removeChild(i.stateNode));break;case 18:qe!==null&&(Dt?(e=qe,i=i.stateNode,e.nodeType===8?uu(e.parentNode,i):e.nodeType===1&&uu(e,i),_i(e)):uu(qe,i.stateNode));break;case 4:s=qe,a=Dt,qe=i.stateNode.containerInfo,Dt=!0,jn(e,n,i),qe=s,Dt=a;break;case 0:case 11:case 14:case 15:if(!it&&(s=i.updateQueue,s!==null&&(s=s.lastEffect,s!==null))){a=s=s.next;do{var d=a,x=d.destroy;d=d.tag,x!==void 0&&((d&2)!==0||(d&4)!==0)&&Yu(i,n,x),a=a.next}while(a!==s)}jn(e,n,i);break;case 1:if(!it&&(Yr(i,n),s=i.stateNode,typeof s.componentWillUnmount=="function"))try{s.props=i.memoizedProps,s.state=i.memoizedState,s.componentWillUnmount()}catch(T){Be(i,n,T)}jn(e,n,i);break;case 21:jn(e,n,i);break;case 22:i.mode&1?(it=(s=it)||i.memoizedState!==null,jn(e,n,i),it=s):jn(e,n,i);break;default:jn(e,n,i)}}function hd(e){var n=e.updateQueue;if(n!==null){e.updateQueue=null;var i=e.stateNode;i===null&&(i=e.stateNode=new e0),n.forEach(function(s){var a=c0.bind(null,e,s);i.has(s)||(i.add(s),s.then(a,a))})}}function Ot(e,n){var i=n.deletions;if(i!==null)for(var s=0;sa&&(a=x),s&=~d}if(s=a,s=Oe()-s,s=(120>s?120:480>s?480:1080>s?1080:1920>s?1920:3e3>s?3e3:4320>s?4320:1960*r0(s/1960))-s,10e?16:e,$n===null)var s=!1;else{if(e=$n,$n=null,ks=0,(Pe&6)!==0)throw Error(o(331));var a=Pe;for(Pe|=4,de=e.current;de!==null;){var d=de,x=d.child;if((de.flags&16)!==0){var T=d.deletions;if(T!==null){for(var L=0;LOe()-Zu?ur(e,0):qu|=i),pt(e,n)}function Cd(e,n){n===0&&((e.mode&1)===0?n=1:(n=Cr,Cr<<=1,(Cr&130023424)===0&&(Cr=4194304)));var i=lt();e=hn(e,n),e!==null&&(Zn(e,n,i),pt(e,i))}function a0(e){var n=e.memoizedState,i=0;n!==null&&(i=n.retryLane),Cd(e,i)}function c0(e,n){var i=0;switch(e.tag){case 13:var s=e.stateNode,a=e.memoizedState;a!==null&&(i=a.retryLane);break;case 19:s=e.stateNode;break;default:throw Error(o(314))}s!==null&&s.delete(n),Cd(e,i)}var Md;Md=function(e,n,i){if(e!==null)if(e.memoizedProps!==n.pendingProps||ct.current)dt=!0;else{if((e.lanes&i)===0&&(n.flags&128)===0)return dt=!1,qm(e,n,i);dt=(e.flags&131072)!==0}else dt=!1,De&&(n.flags&1048576)!==0&&sf(n,ns,n.index);switch(n.lanes=0,n.tag){case 2:var s=n.type;ys(e,n),e=n.pendingProps;var a=Dr(n,tt.current);Ur(n,i),a=Iu(null,n,s,e,a,i);var d=Tu();return n.flags|=1,typeof a=="object"&&a!==null&&typeof a.render=="function"&&a.$$typeof===void 0?(n.tag=1,n.memoizedState=null,n.updateQueue=null,ft(s)?(d=!0,Jo(n)):d=!1,n.memoizedState=a.state!==null&&a.state!==void 0?a.state:null,_u(n),a.updater=gs,n.stateNode=a,a._reactInternals=n,$u(n,s,e,i),n=Hu(null,n,s,!0,d,i)):(n.tag=0,De&&d&&du(n),st(null,n,a,i),n=n.child),n;case 16:s=n.elementType;e:{switch(ys(e,n),e=n.pendingProps,a=s._init,s=a(s._payload),n.type=s,a=n.tag=d0(s),e=$t(s,e),a){case 0:n=Fu(null,n,s,e,i);break e;case 1:n=Jf(null,n,s,e,i);break e;case 11:n=Qf(null,n,s,e,i);break e;case 14:n=Gf(null,n,s,$t(s.type,e),i);break e}throw Error(o(306,s,""))}return n;case 0:return s=n.type,a=n.pendingProps,a=n.elementType===s?a:$t(s,a),Fu(e,n,s,a,i);case 1:return s=n.type,a=n.pendingProps,a=n.elementType===s?a:$t(s,a),Jf(e,n,s,a,i);case 3:e:{if(ed(n),e===null)throw Error(o(387));s=n.pendingProps,d=n.memoizedState,a=d.element,gf(e,n),us(n,s,null,i);var x=n.memoizedState;if(s=x.element,d.isDehydrated)if(d={element:s,isDehydrated:!1,cache:x.cache,pendingSuspenseBoundaries:x.pendingSuspenseBoundaries,transitions:x.transitions},n.updateQueue.baseState=d,n.memoizedState=d,n.flags&256){a=br(Error(o(423)),n),n=td(e,n,s,i,a);break e}else if(s!==a){a=br(Error(o(424)),n),n=td(e,n,s,i,a);break e}else for(_t=Pn(n.stateNode.containerInfo.firstChild),St=n,De=!0,At=null,i=hf(n,null,s,i),n.child=i;i;)i.flags=i.flags&-3|4096,i=i.sibling;else{if(Hr(),s===a){n=gn(e,n,i);break e}st(e,n,s,i)}n=n.child}return n;case 5:return vf(n),e===null&&gu(n),s=n.type,a=n.pendingProps,d=e!==null?e.memoizedProps:null,x=a.children,su(s,a)?x=null:d!==null&&su(s,d)&&(n.flags|=32),Zf(e,n),st(e,n,x,i),n.child;case 6:return e===null&&gu(n),null;case 13:return nd(e,n,i);case 4:return Eu(n,n.stateNode.containerInfo),s=n.pendingProps,e===null?n.child=Vr(n,null,s,i):st(e,n,s,i),n.child;case 11:return s=n.type,a=n.pendingProps,a=n.elementType===s?a:$t(s,a),Qf(e,n,s,a,i);case 7:return st(e,n,n.pendingProps,i),n.child;case 8:return st(e,n,n.pendingProps.children,i),n.child;case 12:return st(e,n,n.pendingProps.children,i),n.child;case 10:e:{if(s=n.type._context,a=n.pendingProps,d=n.memoizedProps,x=a.value,Le(os,s._currentValue),s._currentValue=x,d!==null)if(jt(d.value,x)){if(d.children===a.children&&!ct.current){n=gn(e,n,i);break e}}else for(d=n.child,d!==null&&(d.return=n);d!==null;){var T=d.dependencies;if(T!==null){x=d.child;for(var L=T.firstContext;L!==null;){if(L.context===s){if(d.tag===1){L=pn(-1,i&-i),L.tag=2;var q=d.updateQueue;if(q!==null){q=q.shared;var se=q.pending;se===null?L.next=L:(L.next=se.next,se.next=L),q.pending=L}}d.lanes|=i,L=d.alternate,L!==null&&(L.lanes|=i),wu(d.return,i,n),T.lanes|=i;break}L=L.next}}else if(d.tag===10)x=d.type===n.type?null:d.child;else if(d.tag===18){if(x=d.return,x===null)throw Error(o(341));x.lanes|=i,T=x.alternate,T!==null&&(T.lanes|=i),wu(x,i,n),x=d.sibling}else x=d.child;if(x!==null)x.return=d;else for(x=d;x!==null;){if(x===n){x=null;break}if(d=x.sibling,d!==null){d.return=x.return,x=d;break}x=x.return}d=x}st(e,n,a.children,i),n=n.child}return n;case 9:return a=n.type,s=n.pendingProps.children,Ur(n,i),a=Tt(a),s=s(a),n.flags|=1,st(e,n,s,i),n.child;case 14:return s=n.type,a=$t(s,n.pendingProps),a=$t(s.type,a),Gf(e,n,s,a,i);case 15:return Kf(e,n,n.type,n.pendingProps,i);case 17:return s=n.type,a=n.pendingProps,a=n.elementType===s?a:$t(s,a),ys(e,n),n.tag=1,ft(s)?(e=!0,Jo(n)):e=!1,Ur(n,i),Vf(n,s,a),$u(n,s,a,i),Hu(null,n,s,!0,e,i);case 19:return id(e,n,i);case 22:return qf(e,n,i)}throw Error(o(156,n.tag))};function Pd(e,n){return Io(e,n)}function f0(e,n,i,s){this.tag=e,this.key=i,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=n,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=s,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function Lt(e,n,i,s){return new f0(e,n,i,s)}function sa(e){return e=e.prototype,!(!e||!e.isReactComponent)}function d0(e){if(typeof e=="function")return sa(e)?1:0;if(e!=null){if(e=e.$$typeof,e===ee)return 11;if(e===B)return 14}return 2}function Fn(e,n){var i=e.alternate;return i===null?(i=Lt(e.tag,n,e.key,e.mode),i.elementType=e.elementType,i.type=e.type,i.stateNode=e.stateNode,i.alternate=e,e.alternate=i):(i.pendingProps=n,i.type=e.type,i.flags=0,i.subtreeFlags=0,i.deletions=null),i.flags=e.flags&14680064,i.childLanes=e.childLanes,i.lanes=e.lanes,i.child=e.child,i.memoizedProps=e.memoizedProps,i.memoizedState=e.memoizedState,i.updateQueue=e.updateQueue,n=e.dependencies,i.dependencies=n===null?null:{lanes:n.lanes,firstContext:n.firstContext},i.sibling=e.sibling,i.index=e.index,i.ref=e.ref,i}function Ps(e,n,i,s,a,d){var x=2;if(s=e,typeof e=="function")sa(e)&&(x=1);else if(typeof e=="string")x=5;else e:switch(e){case V:return cr(i.children,a,d,n);case X:x=8,a|=8;break;case K:return e=Lt(12,i,n,a|2),e.elementType=K,e.lanes=d,e;case J:return e=Lt(13,i,n,a),e.elementType=J,e.lanes=d,e;case k:return e=Lt(19,i,n,a),e.elementType=k,e.lanes=d,e;case U:return Is(i,a,d,n);default:if(typeof e=="object"&&e!==null)switch(e.$$typeof){case te:x=10;break e;case Z:x=9;break e;case ee:x=11;break e;case B:x=14;break e;case H:x=16,s=null;break e}throw Error(o(130,e==null?e:typeof e,""))}return n=Lt(x,i,n,a),n.elementType=e,n.type=s,n.lanes=d,n}function cr(e,n,i,s){return e=Lt(7,e,s,n),e.lanes=i,e}function Is(e,n,i,s){return e=Lt(22,e,s,n),e.elementType=U,e.lanes=i,e.stateNode={isHidden:!1},e}function la(e,n,i){return e=Lt(6,e,null,n),e.lanes=i,e}function ua(e,n,i){return n=Lt(4,e.children!==null?e.children:[],e.key,n),n.lanes=i,n.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},n}function h0(e,n,i,s,a){this.tag=n,this.containerInfo=e,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.callbackNode=this.pendingContext=this.context=null,this.callbackPriority=0,this.eventTimes=qn(0),this.expirationTimes=qn(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=qn(0),this.identifierPrefix=s,this.onRecoverableError=a,this.mutableSourceEagerHydrationData=null}function aa(e,n,i,s,a,d,x,T,L){return e=new h0(e,n,i,T,L),n===1?(n=1,d===!0&&(n|=8)):n=0,d=Lt(3,null,null,n),e.current=d,d.stateNode=e,d.memoizedState={element:s,isDehydrated:i,cache:null,transitions:null,pendingSuspenseBoundaries:null},_u(d),e}function p0(e,n,i){var s=3"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(t)}catch(r){console.error(r)}}return t(),ga.exports=C0(),ga.exports}var Bd;function M0(){if(Bd)return $s;Bd=1;var t=Jh();return $s.createRoot=t.createRoot,$s.hydrateRoot=t.hydrateRoot,$s}var P0=M0();async function Ht(t,r){const o=await fetch(t,{...r,headers:{"Content-Type":"application/json",...(r==null?void 0:r.headers)||{}}});if(!o.ok){const l=await o.text();throw new Error(l||o.statusText)}return o.json()}const Vt={health:()=>Ht("/api/health"),settings:()=>Ht("/api/settings"),saveSettings:t=>Ht("/api/settings",{method:"PUT",body:JSON.stringify(t)}),repos:()=>Ht("/api/repos"),index:(t,r=!0)=>Ht("/api/index",{method:"POST",body:JSON.stringify({repo_path:t,incremental:r})}),indexStatus:t=>Ht(`/api/index?repo_path=${encodeURIComponent(t)}`),architecture:t=>Ht(`/api/architecture?repo_path=${encodeURIComponent(t)}`),review:(t,r,o,l=!0)=>Ht("/api/review",{method:"POST",body:JSON.stringify({repo_path:t,base:r,head:o||null,reindex:l,incremental:!0})}),graph:(t,r="full")=>Ht(`/api/graph?repo_path=${encodeURIComponent(t)}&scope=${r}`),prs:(t,r,o="open")=>Ht("/api/prs",{method:"POST",body:JSON.stringify({provider:t,repo:r,state:o})}),residual:t=>Ht("/api/ai/residual",{method:"POST",body:JSON.stringify({review:t})})};function be(t){if(typeof t=="string"||typeof t=="number")return""+t;let r="";if(Array.isArray(t))for(let o=0,l;o{}};function al(){for(var t=0,r=arguments.length,o={},l;t=0&&(l=o.slice(u+1),o=o.slice(0,u)),o&&!r.hasOwnProperty(o))throw new Error("unknown type: "+o);return{type:o,name:l}})}Ys.prototype=al.prototype={constructor:Ys,on:function(t,r){var o=this._,l=T0(t+"",o),u,c=-1,f=l.length;if(arguments.length<2){for(;++c0)for(var o=new Array(u),l=0,u,c;l=0&&(r=t.slice(0,o))!=="xmlns"&&(t=t.slice(o+1)),Wd.hasOwnProperty(r)?{space:Wd[r],local:t}:t}function R0(t){return function(){var r=this.ownerDocument,o=this.namespaceURI;return o===Ra&&r.documentElement.namespaceURI===Ra?r.createElement(t):r.createElementNS(o,t)}}function L0(t){return function(){return this.ownerDocument.createElementNS(t.space,t.local)}}function ep(t){var r=cl(t);return(r.local?L0:R0)(r)}function j0(){}function Ya(t){return t==null?j0:function(){return this.querySelector(t)}}function A0(t){typeof t!="function"&&(t=Ya(t));for(var r=this._groups,o=r.length,l=new Array(o),u=0;u=_&&(_=R+1);!(W=N[_])&&++_=0;)(f=l[u])&&(c&&f.compareDocumentPosition(c)^4&&c.parentNode.insertBefore(f,c),c=f);return this}function sy(t){t||(t=ly);function r(v,g){return v&&g?t(v.__data__,g.__data__):!v-!g}for(var o=this._groups,l=o.length,u=new Array(l),c=0;cr?1:t>=r?0:NaN}function uy(){var t=arguments[0];return arguments[0]=this,t.apply(null,arguments),this}function ay(){return Array.from(this)}function cy(){for(var t=this._groups,r=0,o=t.length;r1?this.each((r==null?Sy:typeof r=="function"?Ey:_y)(t,r,o??"")):ei(this.node(),t)}function ei(t,r){return t.style.getPropertyValue(r)||op(t).getComputedStyle(t,null).getPropertyValue(r)}function Ny(t){return function(){delete this[t]}}function Cy(t,r){return function(){this[t]=r}}function My(t,r){return function(){var o=r.apply(this,arguments);o==null?delete this[t]:this[t]=o}}function Py(t,r){return arguments.length>1?this.each((r==null?Ny:typeof r=="function"?My:Cy)(t,r)):this.node()[t]}function sp(t){return t.trim().split(/^|\s+/)}function Xa(t){return t.classList||new lp(t)}function lp(t){this._node=t,this._names=sp(t.getAttribute("class")||"")}lp.prototype={add:function(t){var r=this._names.indexOf(t);r<0&&(this._names.push(t),this._node.setAttribute("class",this._names.join(" ")))},remove:function(t){var r=this._names.indexOf(t);r>=0&&(this._names.splice(r,1),this._node.setAttribute("class",this._names.join(" ")))},contains:function(t){return this._names.indexOf(t)>=0}};function up(t,r){for(var o=Xa(t),l=-1,u=r.length;++l=0&&(o=r.slice(l+1),r=r.slice(0,l)),{type:r,name:o}})}function nv(t){return function(){var r=this.__on;if(r){for(var o=0,l=-1,u=r.length,c;o()=>t;function La(t,{sourceEvent:r,subject:o,target:l,identifier:u,active:c,x:f,y:h,dx:p,dy:y,dispatch:m}){Object.defineProperties(this,{type:{value:t,enumerable:!0,configurable:!0},sourceEvent:{value:r,enumerable:!0,configurable:!0},subject:{value:o,enumerable:!0,configurable:!0},target:{value:l,enumerable:!0,configurable:!0},identifier:{value:u,enumerable:!0,configurable:!0},active:{value:c,enumerable:!0,configurable:!0},x:{value:f,enumerable:!0,configurable:!0},y:{value:h,enumerable:!0,configurable:!0},dx:{value:p,enumerable:!0,configurable:!0},dy:{value:y,enumerable:!0,configurable:!0},_:{value:m}})}La.prototype.on=function(){var t=this._.on.apply(this._,arguments);return t===this._?this:t};function dv(t){return!t.ctrlKey&&!t.button}function hv(){return this.parentNode}function pv(t,r){return r??{x:t.x,y:t.y}}function gv(){return navigator.maxTouchPoints||"ontouchstart"in this}function pp(){var t=dv,r=hv,o=pv,l=gv,u={},c=al("start","drag","end"),f=0,h,p,y,m,v=0;function g(I){I.on("mousedown.drag",w).filter(l).on("touchstart.drag",N).on("touchmove.drag",E,fv).on("touchend.drag touchcancel.drag",R).style("touch-action","none").style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}function w(I,W){if(!(m||!t.call(this,I,W))){var $=_(this,r.call(this,I,W),I,W,"mouse");$&&(kt(I.view).on("mousemove.drag",S,no).on("mouseup.drag",M,no),dp(I.view),va(I),y=!1,h=I.clientX,p=I.clientY,$("start",I))}}function S(I){if(Zr(I),!y){var W=I.clientX-h,$=I.clientY-p;y=W*W+$*$>v}u.mouse("drag",I)}function M(I){kt(I.view).on("mousemove.drag mouseup.drag",null),hp(I.view,y),Zr(I),u.mouse("end",I)}function N(I,W){if(t.call(this,I,W)){var $=I.changedTouches,V=r.call(this,I,W),X=$.length,K,te;for(K=0;K>8&15|r>>4&240,r>>4&15|r&240,(r&15)<<4|r&15,1):o===8?Os(r>>24&255,r>>16&255,r>>8&255,(r&255)/255):o===4?Os(r>>12&15|r>>8&240,r>>8&15|r>>4&240,r>>4&15|r&240,((r&15)<<4|r&15)/255):null):(r=yv.exec(t))?new mt(r[1],r[2],r[3],1):(r=vv.exec(t))?new mt(r[1]*255/100,r[2]*255/100,r[3]*255/100,1):(r=xv.exec(t))?Os(r[1],r[2],r[3],r[4]):(r=wv.exec(t))?Os(r[1]*255/100,r[2]*255/100,r[3]*255/100,r[4]):(r=Sv.exec(t))?qd(r[1],r[2]/100,r[3]/100,1):(r=_v.exec(t))?qd(r[1],r[2]/100,r[3]/100,r[4]):bd.hasOwnProperty(t)?Qd(bd[t]):t==="transparent"?new mt(NaN,NaN,NaN,0):null}function Qd(t){return new mt(t>>16&255,t>>8&255,t&255,1)}function Os(t,r,o,l){return l<=0&&(t=r=o=NaN),new mt(t,r,o,l)}function Nv(t){return t instanceof po||(t=gr(t)),t?(t=t.rgb(),new mt(t.r,t.g,t.b,t.opacity)):new mt}function ja(t,r,o,l){return arguments.length===1?Nv(t):new mt(t,r,o,l??1)}function mt(t,r,o,l){this.r=+t,this.g=+r,this.b=+o,this.opacity=+l}Qa(mt,ja,gp(po,{brighter(t){return t=t==null?Zs:Math.pow(Zs,t),new mt(this.r*t,this.g*t,this.b*t,this.opacity)},darker(t){return t=t==null?ro:Math.pow(ro,t),new mt(this.r*t,this.g*t,this.b*t,this.opacity)},rgb(){return this},clamp(){return new mt(hr(this.r),hr(this.g),hr(this.b),Js(this.opacity))},displayable(){return-.5<=this.r&&this.r<255.5&&-.5<=this.g&&this.g<255.5&&-.5<=this.b&&this.b<255.5&&0<=this.opacity&&this.opacity<=1},hex:Gd,formatHex:Gd,formatHex8:Cv,formatRgb:Kd,toString:Kd}));function Gd(){return`#${dr(this.r)}${dr(this.g)}${dr(this.b)}`}function Cv(){return`#${dr(this.r)}${dr(this.g)}${dr(this.b)}${dr((isNaN(this.opacity)?1:this.opacity)*255)}`}function Kd(){const t=Js(this.opacity);return`${t===1?"rgb(":"rgba("}${hr(this.r)}, ${hr(this.g)}, ${hr(this.b)}${t===1?")":`, ${t})`}`}function Js(t){return isNaN(t)?1:Math.max(0,Math.min(1,t))}function hr(t){return Math.max(0,Math.min(255,Math.round(t)||0))}function dr(t){return t=hr(t),(t<16?"0":"")+t.toString(16)}function qd(t,r,o,l){return l<=0?t=r=o=NaN:o<=0||o>=1?t=r=NaN:r<=0&&(t=NaN),new Ut(t,r,o,l)}function mp(t){if(t instanceof Ut)return new Ut(t.h,t.s,t.l,t.opacity);if(t instanceof po||(t=gr(t)),!t)return new Ut;if(t instanceof Ut)return t;t=t.rgb();var r=t.r/255,o=t.g/255,l=t.b/255,u=Math.min(r,o,l),c=Math.max(r,o,l),f=NaN,h=c-u,p=(c+u)/2;return h?(r===c?f=(o-l)/h+(o0&&p<1?0:f,new Ut(f,h,p,t.opacity)}function Mv(t,r,o,l){return arguments.length===1?mp(t):new Ut(t,r,o,l??1)}function Ut(t,r,o,l){this.h=+t,this.s=+r,this.l=+o,this.opacity=+l}Qa(Ut,Mv,gp(po,{brighter(t){return t=t==null?Zs:Math.pow(Zs,t),new Ut(this.h,this.s,this.l*t,this.opacity)},darker(t){return t=t==null?ro:Math.pow(ro,t),new Ut(this.h,this.s,this.l*t,this.opacity)},rgb(){var t=this.h%360+(this.h<0)*360,r=isNaN(t)||isNaN(this.s)?0:this.s,o=this.l,l=o+(o<.5?o:1-o)*r,u=2*o-l;return new mt(xa(t>=240?t-240:t+120,u,l),xa(t,u,l),xa(t<120?t+240:t-120,u,l),this.opacity)},clamp(){return new Ut(Zd(this.h),Fs(this.s),Fs(this.l),Js(this.opacity))},displayable(){return(0<=this.s&&this.s<=1||isNaN(this.s))&&0<=this.l&&this.l<=1&&0<=this.opacity&&this.opacity<=1},formatHsl(){const t=Js(this.opacity);return`${t===1?"hsl(":"hsla("}${Zd(this.h)}, ${Fs(this.s)*100}%, ${Fs(this.l)*100}%${t===1?")":`, ${t})`}`}}));function Zd(t){return t=(t||0)%360,t<0?t+360:t}function Fs(t){return Math.max(0,Math.min(1,t||0))}function xa(t,r,o){return(t<60?r+(o-r)*t/60:t<180?o:t<240?r+(o-r)*(240-t)/60:r)*255}const Ga=t=>()=>t;function Pv(t,r){return function(o){return t+o*r}}function Iv(t,r,o){return t=Math.pow(t,o),r=Math.pow(r,o)-t,o=1/o,function(l){return Math.pow(t+l*r,o)}}function Tv(t){return(t=+t)==1?yp:function(r,o){return o-r?Iv(r,o,t):Ga(isNaN(r)?o:r)}}function yp(t,r){var o=r-t;return o?Pv(t,o):Ga(isNaN(t)?r:t)}const el=(function t(r){var o=Tv(r);function l(u,c){var f=o((u=ja(u)).r,(c=ja(c)).r),h=o(u.g,c.g),p=o(u.b,c.b),y=yp(u.opacity,c.opacity);return function(m){return u.r=f(m),u.g=h(m),u.b=p(m),u.opacity=y(m),u+""}}return l.gamma=t,l})(1);function zv(t,r){r||(r=[]);var o=t?Math.min(r.length,t.length):0,l=r.slice(),u;return function(c){for(u=0;uo&&(c=r.slice(o,c),h[f]?h[f]+=c:h[++f]=c),(l=l[0])===(u=u[0])?h[f]?h[f]+=u:h[++f]=u:(h[++f]=null,p.push({i:f,x:nn(l,u)})),o=wa.lastIndex;return o180?m+=360:m-y>180&&(y+=360),g.push({i:v.push(u(v)+"rotate(",null,l)-2,x:nn(y,m)})):m&&v.push(u(v)+"rotate("+m+l)}function h(y,m,v,g){y!==m?g.push({i:v.push(u(v)+"skewX(",null,l)-2,x:nn(y,m)}):m&&v.push(u(v)+"skewX("+m+l)}function p(y,m,v,g,w,S){if(y!==v||m!==g){var M=w.push(u(w)+"scale(",null,",",null,")");S.push({i:M-4,x:nn(y,v)},{i:M-2,x:nn(m,g)})}else(v!==1||g!==1)&&w.push(u(w)+"scale("+v+","+g+")")}return function(y,m){var v=[],g=[];return y=t(y),m=t(m),c(y.translateX,y.translateY,m.translateX,m.translateY,v,g),f(y.rotate,m.rotate,v,g),h(y.skewX,m.skewX,v,g),p(y.scaleX,y.scaleY,m.scaleX,m.scaleY,v,g),y=m=null,function(w){for(var S=-1,M=g.length,N;++S=0&&t._call.call(void 0,r),t=t._next;--ti}function th(){mr=(nl=oo.now())+fl,ti=Zi=0;try{Yv()}finally{ti=0,Qv(),mr=0}}function Xv(){var t=oo.now(),r=t-nl;r>Sp&&(fl-=r,nl=t)}function Qv(){for(var t,r=tl,o,l=1/0;r;)r._call?(l>r._time&&(l=r._time),t=r,r=r._next):(o=r._next,r._next=null,r=t?t._next=o:tl=o);Ji=t,Da(l)}function Da(t){if(!ti){Zi&&(Zi=clearTimeout(Zi));var r=t-mr;r>24?(t<1/0&&(Zi=setTimeout(th,t-oo.now()-fl)),Ki&&(Ki=clearInterval(Ki))):(Ki||(nl=oo.now(),Ki=setInterval(Xv,Sp)),ti=1,_p(th))}}function nh(t,r,o){var l=new rl;return r=r==null?0:+r,l.restart(u=>{l.stop(),t(u+r)},r,o),l}var Gv=al("start","end","cancel","interrupt"),Kv=[],kp=0,rh=1,Oa=2,Qs=3,ih=4,Fa=5,Gs=6;function dl(t,r,o,l,u,c){var f=t.__transition;if(!f)t.__transition={};else if(o in f)return;qv(t,o,{name:r,index:l,group:u,on:Gv,tween:Kv,time:c.time,delay:c.delay,duration:c.duration,ease:c.ease,timer:null,state:kp})}function qa(t,r){var o=Xt(t,r);if(o.state>kp)throw new Error("too late; already scheduled");return o}function on(t,r){var o=Xt(t,r);if(o.state>Qs)throw new Error("too late; already running");return o}function Xt(t,r){var o=t.__transition;if(!o||!(o=o[r]))throw new Error("transition not found");return o}function qv(t,r,o){var l=t.__transition,u;l[r]=o,o.timer=Ep(c,0,o.time);function c(y){o.state=rh,o.timer.restart(f,o.delay,o.time),o.delay<=y&&f(y-o.delay)}function f(y){var m,v,g,w;if(o.state!==rh)return p();for(m in l)if(w=l[m],w.name===o.name){if(w.state===Qs)return nh(f);w.state===ih?(w.state=Gs,w.timer.stop(),w.on.call("interrupt",t,t.__data__,w.index,w.group),delete l[m]):+mOa&&l.state=0&&(r=r.slice(0,o)),!r||r==="start"})}function Mx(t,r,o){var l,u,c=Cx(r)?qa:on;return function(){var f=c(this,t),h=f.on;h!==l&&(u=(l=h).copy()).on(r,o),f.on=u}}function Px(t,r){var o=this._id;return arguments.length<2?Xt(this.node(),o).on.on(t):this.each(Mx(o,t,r))}function Ix(t){return function(){var r=this.parentNode;for(var o in this.__transition)if(+o!==t)return;r&&r.removeChild(this)}}function Tx(){return this.on("end.remove",Ix(this._id))}function zx(t){var r=this._name,o=this._id;typeof t!="function"&&(t=Ya(t));for(var l=this._groups,u=l.length,c=new Array(u),f=0;f()=>t;function nw(t,{sourceEvent:r,target:o,transform:l,dispatch:u}){Object.defineProperties(this,{type:{value:t,enumerable:!0,configurable:!0},sourceEvent:{value:r,enumerable:!0,configurable:!0},target:{value:o,enumerable:!0,configurable:!0},transform:{value:l,enumerable:!0,configurable:!0},_:{value:u}})}function vn(t,r,o){this.k=t,this.x=r,this.y=o}vn.prototype={constructor:vn,scale:function(t){return t===1?this:new vn(this.k*t,this.x,this.y)},translate:function(t,r){return t===0&r===0?this:new vn(this.k,this.x+this.k*t,this.y+this.k*r)},apply:function(t){return[t[0]*this.k+this.x,t[1]*this.k+this.y]},applyX:function(t){return t*this.k+this.x},applyY:function(t){return t*this.k+this.y},invert:function(t){return[(t[0]-this.x)/this.k,(t[1]-this.y)/this.k]},invertX:function(t){return(t-this.x)/this.k},invertY:function(t){return(t-this.y)/this.k},rescaleX:function(t){return t.copy().domain(t.range().map(this.invertX,this).map(t.invert,t))},rescaleY:function(t){return t.copy().domain(t.range().map(this.invertY,this).map(t.invert,t))},toString:function(){return"translate("+this.x+","+this.y+") scale("+this.k+")"}};var hl=new vn(1,0,0);Pp.prototype=vn.prototype;function Pp(t){for(;!t.__zoom;)if(!(t=t.parentNode))return hl;return t.__zoom}function Sa(t){t.stopImmediatePropagation()}function qi(t){t.preventDefault(),t.stopImmediatePropagation()}function rw(t){return(!t.ctrlKey||t.type==="wheel")&&!t.button}function iw(){var t=this;return t instanceof SVGElement?(t=t.ownerSVGElement||t,t.hasAttribute("viewBox")?(t=t.viewBox.baseVal,[[t.x,t.y],[t.x+t.width,t.y+t.height]]):[[0,0],[t.width.baseVal.value,t.height.baseVal.value]]):[[0,0],[t.clientWidth,t.clientHeight]]}function oh(){return this.__zoom||hl}function ow(t){return-t.deltaY*(t.deltaMode===1?.05:t.deltaMode?1:.002)*(t.ctrlKey?10:1)}function sw(){return navigator.maxTouchPoints||"ontouchstart"in this}function lw(t,r,o){var l=t.invertX(r[0][0])-o[0][0],u=t.invertX(r[1][0])-o[1][0],c=t.invertY(r[0][1])-o[0][1],f=t.invertY(r[1][1])-o[1][1];return t.translate(u>l?(l+u)/2:Math.min(0,l)||Math.max(0,u),f>c?(c+f)/2:Math.min(0,c)||Math.max(0,f))}function Ip(){var t=rw,r=iw,o=lw,l=ow,u=sw,c=[0,1/0],f=[[-1/0,-1/0],[1/0,1/0]],h=250,p=Xs,y=al("start","zoom","end"),m,v,g,w=500,S=150,M=0,N=10;function E(k){k.property("__zoom",oh).on("wheel.zoom",X,{passive:!1}).on("mousedown.zoom",K).on("dblclick.zoom",te).filter(u).on("touchstart.zoom",Z).on("touchmove.zoom",ee).on("touchend.zoom touchcancel.zoom",J).style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}E.transform=function(k,B,H,U){var A=k.selection?k.selection():k;A.property("__zoom",oh),k!==A?W(k,B,H,U):A.interrupt().each(function(){$(this,arguments).event(U).start().zoom(null,typeof B=="function"?B.apply(this,arguments):B).end()})},E.scaleBy=function(k,B,H,U){E.scaleTo(k,function(){var A=this.__zoom.k,j=typeof B=="function"?B.apply(this,arguments):B;return A*j},H,U)},E.scaleTo=function(k,B,H,U){E.transform(k,function(){var A=r.apply(this,arguments),j=this.__zoom,F=H==null?I(A):typeof H=="function"?H.apply(this,arguments):H,C=j.invert(F),z=typeof B=="function"?B.apply(this,arguments):B;return o(_(R(j,z),F,C),A,f)},H,U)},E.translateBy=function(k,B,H,U){E.transform(k,function(){return o(this.__zoom.translate(typeof B=="function"?B.apply(this,arguments):B,typeof H=="function"?H.apply(this,arguments):H),r.apply(this,arguments),f)},null,U)},E.translateTo=function(k,B,H,U,A){E.transform(k,function(){var j=r.apply(this,arguments),F=this.__zoom,C=U==null?I(j):typeof U=="function"?U.apply(this,arguments):U;return o(hl.translate(C[0],C[1]).scale(F.k).translate(typeof B=="function"?-B.apply(this,arguments):-B,typeof H=="function"?-H.apply(this,arguments):-H),j,f)},U,A)};function R(k,B){return B=Math.max(c[0],Math.min(c[1],B)),B===k.k?k:new vn(B,k.x,k.y)}function _(k,B,H){var U=B[0]-H[0]*k.k,A=B[1]-H[1]*k.k;return U===k.x&&A===k.y?k:new vn(k.k,U,A)}function I(k){return[(+k[0][0]+ +k[1][0])/2,(+k[0][1]+ +k[1][1])/2]}function W(k,B,H,U){k.on("start.zoom",function(){$(this,arguments).event(U).start()}).on("interrupt.zoom end.zoom",function(){$(this,arguments).event(U).end()}).tween("zoom",function(){var A=this,j=arguments,F=$(A,j).event(U),C=r.apply(A,j),z=H==null?I(C):typeof H=="function"?H.apply(A,j):H,ne=Math.max(C[1][0]-C[0][0],C[1][1]-C[0][1]),ie=A.__zoom,ce=typeof B=="function"?B.apply(A,j):B,O=p(ie.invert(z).concat(ne/ie.k),ce.invert(z).concat(ne/ce.k));return function(re){if(re===1)re=ce;else{var Q=O(re),le=ne/Q[2];re=new vn(le,z[0]-Q[0]*le,z[1]-Q[1]*le)}F.zoom(null,re)}})}function $(k,B,H){return!H&&k.__zooming||new V(k,B)}function V(k,B){this.that=k,this.args=B,this.active=0,this.sourceEvent=null,this.extent=r.apply(k,B),this.taps=0}V.prototype={event:function(k){return k&&(this.sourceEvent=k),this},start:function(){return++this.active===1&&(this.that.__zooming=this,this.emit("start")),this},zoom:function(k,B){return this.mouse&&k!=="mouse"&&(this.mouse[1]=B.invert(this.mouse[0])),this.touch0&&k!=="touch"&&(this.touch0[1]=B.invert(this.touch0[0])),this.touch1&&k!=="touch"&&(this.touch1[1]=B.invert(this.touch1[0])),this.that.__zoom=B,this.emit("zoom"),this},end:function(){return--this.active===0&&(delete this.that.__zooming,this.emit("end")),this},emit:function(k){var B=kt(this.that).datum();y.call(k,this.that,new nw(k,{sourceEvent:this.sourceEvent,target:E,transform:this.that.__zoom,dispatch:y}),B)}};function X(k,...B){if(!t.apply(this,arguments))return;var H=$(this,B).event(k),U=this.__zoom,A=Math.max(c[0],Math.min(c[1],U.k*Math.pow(2,l.apply(this,arguments)))),j=Bt(k);if(H.wheel)(H.mouse[0][0]!==j[0]||H.mouse[0][1]!==j[1])&&(H.mouse[1]=U.invert(H.mouse[0]=j)),clearTimeout(H.wheel);else{if(U.k===A)return;H.mouse=[j,U.invert(j)],Ks(this),H.start()}qi(k),H.wheel=setTimeout(F,S),H.zoom("mouse",o(_(R(U,A),H.mouse[0],H.mouse[1]),H.extent,f));function F(){H.wheel=null,H.end()}}function K(k,...B){if(g||!t.apply(this,arguments))return;var H=k.currentTarget,U=$(this,B,!0).event(k),A=kt(k.view).on("mousemove.zoom",z,!0).on("mouseup.zoom",ne,!0),j=Bt(k,H),F=k.clientX,C=k.clientY;dp(k.view),Sa(k),U.mouse=[j,this.__zoom.invert(j)],Ks(this),U.start();function z(ie){if(qi(ie),!U.moved){var ce=ie.clientX-F,O=ie.clientY-C;U.moved=ce*ce+O*O>M}U.event(ie).zoom("mouse",o(_(U.that.__zoom,U.mouse[0]=Bt(ie,H),U.mouse[1]),U.extent,f))}function ne(ie){A.on("mousemove.zoom mouseup.zoom",null),hp(ie.view,U.moved),qi(ie),U.event(ie).end()}}function te(k,...B){if(t.apply(this,arguments)){var H=this.__zoom,U=Bt(k.changedTouches?k.changedTouches[0]:k,this),A=H.invert(U),j=H.k*(k.shiftKey?.5:2),F=o(_(R(H,j),U,A),r.apply(this,B),f);qi(k),h>0?kt(this).transition().duration(h).call(W,F,U,k):kt(this).call(E.transform,F,U,k)}}function Z(k,...B){if(t.apply(this,arguments)){var H=k.touches,U=H.length,A=$(this,B,k.changedTouches.length===U).event(k),j,F,C,z;for(Sa(k),F=0;F`Seems like you have not used ${t==="svelte"?"SvelteFlowProvider":"ReactFlowProvider"} as an ancestor. Help: https://${t}flow.dev/error#001`,error002:()=>"It looks like you've created a new nodeTypes or edgeTypes object. If this wasn't on purpose please define the nodeTypes/edgeTypes outside of the component or memoize them.",error003:t=>`Node type "${t}" not found. Using fallback type "default".`,error004:()=>"The parent container needs a width and a height to render the graph.",error005:()=>"Only child nodes can use a parent extent.",error006:()=>"Can't create edge. An edge needs a source and a target.",error007:t=>`The old edge with id=${t} does not exist.`,error009:t=>`Marker type "${t}" doesn't exist.`,error008:(t,{id:r,sourceHandle:o,targetHandle:l})=>`Couldn't create edge for ${t} handle id: "${t==="source"?o:l}", edge id: ${r}.`,error010:()=>"Handle: No node id found. Make sure to only use a Handle inside a custom Node.",error011:t=>`Edge type "${t}" not found. Using fallback type "default".`,error012:t=>`Node with id "${t}" does not exist, it may have been removed. This can happen when a node is deleted before the "onNodeClick" handler is called.`,error013:(t="react")=>`It seems that you haven't loaded the styles. Please import '@xyflow/${t}/dist/style.css' or base.css to make sure everything is working properly.`,error014:()=>"useNodeConnections: No node ID found. Call useNodeConnections inside a custom Node or provide a node ID.",error015:()=>"It seems that you are trying to drag a node that is not initialized. Please use onNodesChange as explained in the docs.",error016:t=>`Edge with id "${t}" does not exist, it may have been removed. This can happen when an edge is deleted before the "onEdgeClick" handler is called.`},so=[[Number.NEGATIVE_INFINITY,Number.NEGATIVE_INFINITY],[Number.POSITIVE_INFINITY,Number.POSITIVE_INFINITY]],Tp=["Enter"," ","Escape"],zp={"node.a11yDescription.default":"Press enter or space to select a node. Press delete to remove it and escape to cancel.","node.a11yDescription.keyboardDisabled":"Press enter or space to select a node. You can then use the arrow keys to move the node around. Press delete to remove it and escape to cancel.","node.a11yDescription.ariaLiveMessage":({direction:t,x:r,y:o})=>`Moved selected node ${t}. New position, x: ${r}, y: ${o}`,"edge.a11yDescription.default":"Press enter or space to select an edge. You can then press delete to remove it or escape to cancel.","controls.ariaLabel":"Control Panel","controls.zoomIn.ariaLabel":"Zoom In","controls.zoomOut.ariaLabel":"Zoom Out","controls.fitView.ariaLabel":"Fit View","controls.interactive.ariaLabel":"Toggle Interactivity","minimap.ariaLabel":"Mini Map","handle.ariaLabel":"Handle"};var ni;(function(t){t.Strict="strict",t.Loose="loose"})(ni||(ni={}));var pr;(function(t){t.Free="free",t.Vertical="vertical",t.Horizontal="horizontal"})(pr||(pr={}));var lo;(function(t){t.Partial="partial",t.Full="full"})(lo||(lo={}));const Rp={inProgress:!1,isValid:null,from:null,fromHandle:null,fromPosition:null,fromNode:null,to:null,toHandle:null,toPosition:null,toNode:null,pointer:null};var Wn;(function(t){t.Bezier="default",t.Straight="straight",t.Step="step",t.SmoothStep="smoothstep",t.SimpleBezier="simplebezier"})(Wn||(Wn={}));var il;(function(t){t.Arrow="arrow",t.ArrowClosed="arrowclosed"})(il||(il={}));var xe;(function(t){t.Left="left",t.Top="top",t.Right="right",t.Bottom="bottom"})(xe||(xe={}));const sh={[xe.Left]:xe.Right,[xe.Right]:xe.Left,[xe.Top]:xe.Bottom,[xe.Bottom]:xe.Top};function Lp(t){return t===null?null:t?"valid":"invalid"}const jp=t=>!!t&&typeof t=="object"&&"id"in t&&"source"in t&&"target"in t,uw=t=>!!t&&typeof t=="object"&&"id"in t&&"position"in t&&!("source"in t)&&!("target"in t),Ja=t=>!!t&&typeof t=="object"&&"id"in t&&"internals"in t&&!("source"in t)&&!("target"in t),go=(t,r=[0,0])=>{const{width:o,height:l}=Qt(t),u=t.origin??r,c=o*u[0],f=l*u[1];return{x:t.position.x-c,y:t.position.y-f}},aw=(t,r={nodeOrigin:[0,0]})=>{if(t.length===0)return{x:0,y:0,width:0,height:0};let o=!1;const l=t.reduce((u,c)=>{const f=typeof c=="string";let h=!r.nodeLookup&&!f?c:void 0;return r.nodeLookup&&(h=f?r.nodeLookup.get(c):Ja(c)?c:r.nodeLookup.get(c.id)),h?(o=!0,pl(u,ol(h,r.nodeOrigin))):u},{x:1/0,y:1/0,x2:-1/0,y2:-1/0});return o?gl(l):{x:0,y:0,width:0,height:0}},mo=(t,r={})=>{let o={x:1/0,y:1/0,x2:-1/0,y2:-1/0},l=!1;return t.forEach(u=>{(r.filter===void 0||r.filter(u))&&(o=pl(o,ol(u)),l=!0)}),l?gl(o):{x:0,y:0,width:0,height:0}},ec=(t,r,[o,l,u]=[0,0,1],c=!1,f=!1)=>{const h=(r.x-o)/u,p=(r.y-l)/u,y=r.width/u,m=r.height/u,v=[];for(const g of t.values()){const{measured:w,selectable:S=!0,hidden:M=!1}=g;if(f&&!S||M)continue;const N=w.width??g.width??g.initialWidth??0,E=w.height??g.height??g.initialHeight??0,{x:R,y:_}=g.internals.positionAbsolute,I=Op(h,p,y,m,R,_,N,E),W=N*E,$=c&&I>0;(!g.internals.handleBounds||$||I>=W||g.dragging)&&v.push(g)}return v},cw=(t,r)=>{const o=new Set;return t.forEach(l=>{o.add(l.id)}),r.filter(l=>o.has(l.source)||o.has(l.target))};function fw(t,r){const o=new Map,l=r!=null&&r.nodes?new Set(r.nodes.map(u=>u.id)):null;return t.forEach(u=>{let c;if(r!=null&&r.includeHiddenNodes){const{width:f,height:h}=Qt(u);c=f>0&&h>0}else c=!!(u.measured.width&&u.measured.height&&!u.hidden);c&&(!l||l.has(u.id))&&o.set(u.id,u)}),o}async function dw({nodes:t,width:r,height:o,panZoom:l,minZoom:u,maxZoom:c},f){if(t.size===0)return!0;const h=fw(t,f),p=mo(h),y=nc(p,r,o,(f==null?void 0:f.minZoom)??u,(f==null?void 0:f.maxZoom)??c,(f==null?void 0:f.padding)??.1);return await l.setViewport(y,{duration:f==null?void 0:f.duration,ease:f==null?void 0:f.ease,interpolate:f==null?void 0:f.interpolate}),!0}function Ap({nodeId:t,nextPosition:r,nodeLookup:o,nodeOrigin:l=[0,0],nodeExtent:u,onError:c}){const f=o.get(t),h=f.parentId?o.get(f.parentId):void 0,{x:p,y}=h?h.internals.positionAbsolute:{x:0,y:0},m=f.origin??l;let v=f.extent||u;if(f.extent==="parent"&&!f.expandParent)if(!h)c==null||c("005",Yt.error005());else{const{width:w,height:S}=Qt(h);w&&S&&(v=[[p,y],[p+w,y+S]])}else h&&vr(f.extent)&&(v=[[f.extent[0][0]+p,f.extent[0][1]+y],[f.extent[1][0]+p,f.extent[1][1]+y]]);const g=vr(v)?yr(r,v,f.measured):r;return(f.measured.width===void 0||f.measured.height===void 0)&&(c==null||c("015",Yt.error015())),{position:{x:g.x-p+(f.measured.width??0)*m[0],y:g.y-y+(f.measured.height??0)*m[1]},positionAbsolute:g}}async function hw({nodesToRemove:t=[],edgesToRemove:r=[],nodes:o,edges:l,onBeforeDelete:u}){const c=new Set(t.map(g=>g.id)),f=[];for(const g of o){if(g.deletable===!1)continue;const w=c.has(g.id),S=!w&&g.parentId&&f.find(M=>M.id===g.parentId);(w||S)&&f.push(g)}const h=new Set(r.map(g=>g.id)),p=l.filter(g=>g.deletable!==!1),m=cw(f,p);for(const g of p)h.has(g.id)&&!m.find(S=>S.id===g.id)&&m.push(g);if(!u)return{edges:m,nodes:f};const v=await u({nodes:f,edges:m});return typeof v=="boolean"?v?{edges:m,nodes:f}:{edges:[],nodes:[]}:v}const ri=(t,r=0,o=1)=>Math.min(Math.max(t,r),o),yr=(t={x:0,y:0},r,o)=>({x:ri(t.x,r[0][0],r[1][0]-((o==null?void 0:o.width)??0)),y:ri(t.y,r[0][1],r[1][1]-((o==null?void 0:o.height)??0))});function $p(t,r,o){const{width:l,height:u}=Qt(o),{x:c,y:f}=o.internals.positionAbsolute;return yr(t,[[c,f],[c+l,f+u]],r)}const lh=(t,r,o)=>to?-ri(Math.abs(t-o),1,r)/r:0,tc=(t,r,o=15,l=40)=>{const u=lh(t.x,l,r.width-l)*o,c=lh(t.y,l,r.height-l)*o;return[u,c]},pl=(t,r)=>({x:Math.min(t.x,r.x),y:Math.min(t.y,r.y),x2:Math.max(t.x2,r.x2),y2:Math.max(t.y2,r.y2)}),Ha=({x:t,y:r,width:o,height:l})=>({x:t,y:r,x2:t+o,y2:r+l}),gl=({x:t,y:r,x2:o,y2:l})=>({x:t,y:r,width:o-t,height:l-r}),uo=(t,r=[0,0])=>{var u,c;const{x:o,y:l}=Ja(t)?t.internals.positionAbsolute:go(t,r);return{x:o,y:l,width:((u=t.measured)==null?void 0:u.width)??t.width??t.initialWidth??0,height:((c=t.measured)==null?void 0:c.height)??t.height??t.initialHeight??0}},ol=(t,r=[0,0])=>{var u,c;const{x:o,y:l}=Ja(t)?t.internals.positionAbsolute:go(t,r);return{x:o,y:l,x2:o+(((u=t.measured)==null?void 0:u.width)??t.width??t.initialWidth??0),y2:l+(((c=t.measured)==null?void 0:c.height)??t.height??t.initialHeight??0)}},Dp=(t,r)=>gl(pl(Ha(t),Ha(r))),Op=(t,r,o,l,u,c,f,h)=>{const p=Math.max(0,Math.min(t+o,u+f)-Math.max(t,u)),y=Math.max(0,Math.min(r+l,c+h)-Math.max(r,c));return Math.ceil(p*y)},sl=(t,r)=>Op(t.x,t.y,t.width,t.height,r.x,r.y,r.width,r.height),uh=t=>Wt(t.width)&&Wt(t.height)&&Wt(t.x)&&Wt(t.y),Wt=t=>!isNaN(t)&&isFinite(t),Fp=(t,r)=>(o,l)=>{},yo=(t,r=[1,1])=>({x:r[0]*Math.round(t.x/r[0]),y:r[1]*Math.round(t.y/r[1])}),vo=({x:t,y:r},[o,l,u],c=!1,f=[1,1])=>{const h={x:(t-o)/u,y:(r-l)/u};return c?yo(h,f):h},ii=({x:t,y:r},[o,l,u])=>({x:t*u+o,y:r*u+l});function Kr(t,r){if(typeof t=="number")return Math.floor((r-r/(1+t))*.5);if(typeof t=="string"&&t.endsWith("px")){const o=parseFloat(t);if(!Number.isNaN(o))return Math.floor(o)}if(typeof t=="string"&&t.endsWith("%")){const o=parseFloat(t);if(!Number.isNaN(o))return Math.floor(r*o*.01)}return console.error(`The padding value "${t}" is invalid. Please provide a number or a string with a valid unit (px or %).`),0}function pw(t,r,o){if(typeof t=="string"||typeof t=="number"){const l=Kr(t,o),u=Kr(t,r);return{top:l,right:u,bottom:l,left:u,x:u*2,y:l*2}}if(typeof t=="object"){const l=Kr(t.top??t.y??0,o),u=Kr(t.bottom??t.y??0,o),c=Kr(t.left??t.x??0,r),f=Kr(t.right??t.x??0,r);return{top:l,right:f,bottom:u,left:c,x:c+f,y:l+u}}return{top:0,right:0,bottom:0,left:0,x:0,y:0}}function gw(t,r,o,l,u,c){const{x:f,y:h}=ii(t,[r,o,l]),{x:p,y}=ii({x:t.x+t.width,y:t.y+t.height},[r,o,l]),m=u-p,v=c-y;return{left:Math.floor(f),top:Math.floor(h),right:Math.floor(m),bottom:Math.floor(v)}}const nc=(t,r,o,l,u,c)=>{const f=pw(c,r,o),h=(r-f.x)/t.width,p=(o-f.y)/t.height,y=Math.min(h,p),m=ri(y,l,u),v=t.x+t.width/2,g=t.y+t.height/2,w=r/2-v*m,S=o/2-g*m,M=gw(t,w,S,m,r,o),N={left:Math.min(M.left-f.left,0),top:Math.min(M.top-f.top,0),right:Math.min(M.right-f.right,0),bottom:Math.min(M.bottom-f.bottom,0)};return{x:w-N.left+N.right,y:S-N.top+N.bottom,zoom:m}},ao=()=>{var t;return typeof navigator<"u"&&((t=navigator==null?void 0:navigator.userAgent)==null?void 0:t.indexOf("Mac"))>=0};function vr(t){return t!=null&&t!=="parent"}function Qt(t){var r,o;return{width:((r=t.measured)==null?void 0:r.width)??t.width??t.initialWidth??0,height:((o=t.measured)==null?void 0:o.height)??t.height??t.initialHeight??0}}function Hp(t){var r,o;return(((r=t.measured)==null?void 0:r.width)??t.width??t.initialWidth)!==void 0&&(((o=t.measured)==null?void 0:o.height)??t.height??t.initialHeight)!==void 0}function Vp(t,r={width:0,height:0},o,l,u){const c={...t},f=l.get(o);if(f){const h=f.origin||u;c.x+=f.internals.positionAbsolute.x-(r.width??0)*h[0],c.y+=f.internals.positionAbsolute.y-(r.height??0)*h[1]}return c}function ah(t,r){if(t.size!==r.size)return!1;for(const o of t)if(!r.has(o))return!1;return!0}function mw(){let t,r;return{promise:new Promise((l,u)=>{t=l,r=u}),resolve:t,reject:r}}function yw(t){return{...zp,...t||{}}}function to(t,{snapGrid:r=[0,0],snapToGrid:o=!1,transform:l,containerBounds:u}){const{x:c,y:f}=bt(t),h=vo({x:c-((u==null?void 0:u.left)??0),y:f-((u==null?void 0:u.top)??0)},l),{x:p,y}=o?yo(h,r):h;return{xSnapped:p,ySnapped:y,...h}}const rc=t=>({width:t.offsetWidth,height:t.offsetHeight}),Bp=t=>{var r;return((r=t==null?void 0:t.getRootNode)==null?void 0:r.call(t))||(window==null?void 0:window.document)},vw=["INPUT","SELECT","TEXTAREA"];function Up(t){var l,u;const r=((u=(l=t.composedPath)==null?void 0:l.call(t))==null?void 0:u[0])||t.target;return(r==null?void 0:r.nodeType)!==1?!1:vw.includes(r.nodeName)||r.hasAttribute("contenteditable")||!!r.closest(".nokey")}const Wp=t=>"clientX"in t,bt=(t,r)=>{var c,f;const o=Wp(t),l=o?t.clientX:(c=t.touches)==null?void 0:c[0].clientX,u=o?t.clientY:(f=t.touches)==null?void 0:f[0].clientY;return{x:l-((r==null?void 0:r.left)??0),y:u-((r==null?void 0:r.top)??0)}},ch=(t,r,o,l,u)=>{const c=r.querySelectorAll(`.${t}`);return!c||!c.length?null:Array.from(c).map(f=>{const h=f.getBoundingClientRect();return{id:f.getAttribute("data-handleid"),type:t,nodeId:u,position:f.getAttribute("data-handlepos"),x:(h.left-o.left)/l,y:(h.top-o.top)/l,...rc(f)}})};function bp({sourceX:t,sourceY:r,targetX:o,targetY:l,sourceControlX:u,sourceControlY:c,targetControlX:f,targetControlY:h}){const p=t*.125+u*.375+f*.375+o*.125,y=r*.125+c*.375+h*.375+l*.125,m=Math.abs(p-t),v=Math.abs(y-r);return[p,y,m,v]}function Bs(t,r){return t>=0?.5*t:r*25*Math.sqrt(-t)}function fh({pos:t,x1:r,y1:o,x2:l,y2:u,c}){switch(t){case xe.Left:return[r-Bs(r-l,c),o];case xe.Right:return[r+Bs(l-r,c),o];case xe.Top:return[r,o-Bs(o-u,c)];case xe.Bottom:return[r,o+Bs(u-o,c)]}}function Yp({sourceX:t,sourceY:r,sourcePosition:o=xe.Bottom,targetX:l,targetY:u,targetPosition:c=xe.Top,curvature:f=.25}){const[h,p]=fh({pos:o,x1:t,y1:r,x2:l,y2:u,c:f}),[y,m]=fh({pos:c,x1:l,y1:u,x2:t,y2:r,c:f}),[v,g,w,S]=bp({sourceX:t,sourceY:r,targetX:l,targetY:u,sourceControlX:h,sourceControlY:p,targetControlX:y,targetControlY:m});return[`M${t},${r} C${h},${p} ${y},${m} ${l},${u}`,v,g,w,S]}function Xp({sourceX:t,sourceY:r,targetX:o,targetY:l}){const u=Math.abs(o-t)/2,c=o0}const Sw=({source:t,sourceHandle:r,target:o,targetHandle:l})=>`xy-edge__${t}${r||""}-${o}${l||""}`,_w=(t,r)=>r.some(o=>o.source===t.source&&o.target===t.target&&(o.sourceHandle===t.sourceHandle||!o.sourceHandle&&!t.sourceHandle)&&(o.targetHandle===t.targetHandle||!o.targetHandle&&!t.targetHandle)),Ew=(t,r,o={})=>{var c;if(!t.source||!t.target)return(c=o.onError)==null||c.call(o,"006",Yt.error006()),r;const l=o.getEdgeId||Sw;let u;return jp(t)?u={...t}:u={...t,id:l(t)},_w(u,r)?r:(u.sourceHandle===null&&delete u.sourceHandle,u.targetHandle===null&&delete u.targetHandle,r.concat(u))};function Qp({sourceX:t,sourceY:r,targetX:o,targetY:l}){const[u,c,f,h]=Xp({sourceX:t,sourceY:r,targetX:o,targetY:l});return[`M ${t},${r}L ${o},${l}`,u,c,f,h]}const dh={[xe.Left]:{x:-1,y:0},[xe.Right]:{x:1,y:0},[xe.Top]:{x:0,y:-1},[xe.Bottom]:{x:0,y:1}},kw=({source:t,sourcePosition:r=xe.Bottom,target:o})=>r===xe.Left||r===xe.Right?t.xMath.sqrt(Math.pow(r.x-t.x,2)+Math.pow(r.y-t.y,2));function Nw({source:t,sourcePosition:r=xe.Bottom,target:o,targetPosition:l=xe.Top,center:u,offset:c,stepPosition:f}){const h=dh[r],p=dh[l],y={x:t.x+h.x*c,y:t.y+h.y*c},m={x:o.x+p.x*c,y:o.y+p.y*c},v=kw({source:y,sourcePosition:r,target:m}),g=v.x!==0?"x":"y",w=v[g];let S=[],M,N;const E={x:0,y:0},R={x:0,y:0},[,,_,I]=Xp({sourceX:t.x,sourceY:t.y,targetX:o.x,targetY:o.y});if(h[g]*p[g]===-1){g==="x"?(M=u.x??y.x+(m.x-y.x)*f,N=u.y??(y.y+m.y)/2):(M=u.x??(y.x+m.x)/2,N=u.y??y.y+(m.y-y.y)*f);const X=[{x:M,y:y.y},{x:M,y:m.y}],K=[{x:y.x,y:N},{x:m.x,y:N}];h[g]===w?S=g==="x"?X:K:S=g==="x"?K:X}else{const X=[{x:y.x,y:m.y}],K=[{x:m.x,y:y.y}];if(g==="x"?S=h.x===w?K:X:S=h.y===w?X:K,r===l){const k=Math.abs(t[g]-o[g]);if(k<=c){const B=Math.min(c-1,c-k);h[g]===w?E[g]=(y[g]>t[g]?-1:1)*B:R[g]=(m[g]>o[g]?-1:1)*B}}if(r!==l){const k=g==="x"?"y":"x",B=h[g]===p[k],H=y[k]>m[k],U=y[k]=J?(M=(te.x+Z.x)/2,N=S[0].y):(M=S[0].x,N=(te.y+Z.y)/2)}const W={x:y.x+E.x,y:y.y+E.y},$={x:m.x+R.x,y:m.y+R.y};return[[t,...W.x!==S[0].x||W.y!==S[0].y?[W]:[],...S,...$.x!==S[S.length-1].x||$.y!==S[S.length-1].y?[$]:[],o],M,N,_,I]}function Cw(t,r,o,l){const u=Math.min(hh(t,r)/2,hh(r,o)/2,l),{x:c,y:f}=r;if(t.x===c&&c===o.x||t.y===f&&f===o.y)return`L${c} ${f}`;if(t.y===f){const y=t.xo.id===r):t[0])||null}function Ba(t,r){return t?typeof t=="string"?t:`${r?`${r}__`:""}${Object.keys(t).sort().map(l=>`${l}=${t[l]}`).join("&")}`:""}function Pw(t,{id:r,defaultColor:o,defaultMarkerStart:l,defaultMarkerEnd:u}){const c=new Set;return t.reduce((f,h)=>([h.markerStart||l,h.markerEnd||u].forEach(p=>{if(p&&typeof p=="object"){const y=Ba(p,r);c.has(y)||(f.push({id:y,color:p.color||o,...p}),c.add(y))}}),f),[]).sort((f,h)=>f.id.localeCompare(h.id))}const Gp=1e3,Iw=10,ic={nodeOrigin:[0,0],nodeExtent:so,elevateNodesOnSelect:!0,zIndexMode:"basic",defaults:{}},Tw={...ic,checkEquality:!0};function oc(t,r){const o={...t};for(const l in r)r[l]!==void 0&&(o[l]=r[l]);return o}function zw(t,r,o){const l=oc(ic,o);for(const u of t.values())if(u.parentId)lc(u,t,r,l);else{const c=go(u,l.nodeOrigin),f=vr(u.extent)?u.extent:l.nodeExtent,h=yr(c,f,Qt(u));u.internals.positionAbsolute=h}}function Rw(t,r){if(!t.handles)return t.measured?r==null?void 0:r.internals.handleBounds:void 0;const o=[],l=[];for(const u of t.handles){const c={id:u.id,width:u.width??1,height:u.height??1,nodeId:t.id,x:u.x,y:u.y,position:u.position,type:u.type};u.type==="source"?o.push(c):u.type==="target"&&l.push(c)}return{source:o,target:l}}function sc(t){return t==="manual"}function Ua(t,r,o,l={}){var m,v;const u=oc(Tw,l),c={i:0},f=new Map(r),h=u!=null&&u.elevateNodesOnSelect&&!sc(u.zIndexMode)?Gp:0;let p=t.length>0,y=!1;r.clear(),o.clear();for(const g of t){let w=f.get(g.id);if(u.checkEquality&&g===(w==null?void 0:w.internals.userNode))r.set(g.id,w);else{const S=go(g,u.nodeOrigin),M=vr(g.extent)?g.extent:u.nodeExtent,N=yr(S,M,Qt(g));w={...u.defaults,...g,measured:{width:(m=g.measured)==null?void 0:m.width,height:(v=g.measured)==null?void 0:v.height},internals:{positionAbsolute:N,handleBounds:Rw(g,w),z:Kp(g,h,u.zIndexMode),userNode:g}},r.set(g.id,w)}(w.measured===void 0||w.measured.width===void 0||w.measured.height===void 0)&&!w.hidden&&(p=!1),g.parentId&&lc(w,r,o,l,c),y||(y=g.selected??!1)}return{nodesInitialized:p,hasSelectedNodes:y}}function Lw(t,r){if(!t.parentId)return;const o=r.get(t.parentId);o?o.set(t.id,t):r.set(t.parentId,new Map([[t.id,t]]))}function lc(t,r,o,l,u){const{elevateNodesOnSelect:c,nodeOrigin:f,nodeExtent:h,zIndexMode:p}=oc(ic,l),y=t.parentId,m=r.get(y);if(!m){console.warn(`Parent node ${y} not found. Please make sure that parent nodes are in front of their child nodes in the nodes array.`);return}Lw(t,o),u&&!m.parentId&&m.internals.rootParentIndex===void 0&&p==="auto"&&(m.internals.rootParentIndex=++u.i,m.internals.z=m.internals.z+u.i*Iw),u&&m.internals.rootParentIndex!==void 0&&(u.i=m.internals.rootParentIndex);const v=c&&!sc(p)?Gp:0,{x:g,y:w,z:S}=jw(t,m,f,h,v,p),{positionAbsolute:M}=t.internals,N=g!==M.x||w!==M.y;(N||S!==t.internals.z)&&r.set(t.id,{...t,internals:{...t.internals,positionAbsolute:N?{x:g,y:w}:M,z:S}})}function Kp(t,r,o){const l=Wt(t.zIndex)?t.zIndex:0;return sc(o)?l:l+(t.selected?r:0)}function jw(t,r,o,l,u,c){const{x:f,y:h}=r.internals.positionAbsolute,p=Qt(t),y=go(t,o),m=vr(t.extent)?yr(y,t.extent,p):y;let v=yr({x:f+m.x,y:h+m.y},l,p);t.extent==="parent"&&(v=$p(v,p,r));const g=Kp(t,u,c),w=r.internals.z??0;return{x:v.x,y:v.y,z:w>=g?w+1:g}}function uc(t,r,o,l=[0,0]){var f;const u=[],c=new Map;for(const h of t){const p=r.get(h.parentId);if(!p)continue;const y=((f=c.get(h.parentId))==null?void 0:f.expandedRect)??uo(p),m=Dp(y,h.rect);c.set(h.parentId,{expandedRect:m,parent:p})}return c.size>0&&c.forEach(({expandedRect:h,parent:p},y)=>{var _;const m=p.internals.positionAbsolute,v=Qt(p),g=p.origin??l,w=h.x0||S>0||E||R)&&(u.push({id:y,type:"position",position:{x:p.position.x-w+E,y:p.position.y-S+R}}),(_=o.get(y))==null||_.forEach(I=>{t.some(W=>W.id===I.id)||u.push({id:I.id,type:"position",position:{x:I.position.x+w,y:I.position.y+S}})})),(v.width0){const w=uc(g,r,o,u);y.push(...w)}return{changes:y,updatedInternals:p}}async function $w({delta:t,panZoom:r,transform:o,translateExtent:l,width:u,height:c}){if(!r||!t.x&&!t.y)return!1;const f=await r.setViewportConstrained({x:o[0]+t.x,y:o[1]+t.y,zoom:o[2]},[[0,0],[u,c]],l);return!!f&&(f.x!==o[0]||f.y!==o[1]||f.k!==o[2])}function yh(t,r,o,l,u,c){let f=u;const h=l.get(f)||new Map;l.set(f,h.set(o,r)),f=`${u}-${t}`;const p=l.get(f)||new Map;if(l.set(f,p.set(o,r)),c){f=`${u}-${t}-${c}`;const y=l.get(f)||new Map;l.set(f,y.set(o,r))}}function qp(t,r,o){t.clear(),r.clear();for(const l of o){const{source:u,target:c,sourceHandle:f=null,targetHandle:h=null}=l,p={edgeId:l.id,source:u,target:c,sourceHandle:f,targetHandle:h},y=`${u}-${f}--${c}-${h}`,m=`${c}-${h}--${u}-${f}`;yh("source",p,m,t,u,f),yh("target",p,y,t,c,h),r.set(l.id,l)}}function Zp(t,r){if(!t.parentId)return!1;const o=r.get(t.parentId);return o?o.selected?!0:Zp(o,r):!1}function vh(t,r,o){var u;let l=t;do{if((u=l==null?void 0:l.matches)!=null&&u.call(l,r))return!0;if(l===o)return!1;l=l==null?void 0:l.parentElement}while(l);return!1}function Dw(t,r,o,l){const u=new Map;for(const[c,f]of t)if((f.selected||f.id===l)&&(!f.parentId||!Zp(f,t))&&(f.draggable||r&&typeof f.draggable>"u")){const h=t.get(c);h&&u.set(c,{id:c,position:h.position||{x:0,y:0},distance:{x:o.x-h.internals.positionAbsolute.x,y:o.y-h.internals.positionAbsolute.y},extent:h.extent,parentId:h.parentId,origin:h.origin,expandParent:h.expandParent,internals:{positionAbsolute:h.internals.positionAbsolute||{x:0,y:0}},measured:{width:h.measured.width??0,height:h.measured.height??0}})}return u}function _a({nodeId:t,dragItems:r,nodeLookup:o,dragging:l=!0}){var f,h,p;const u=[];for(const[y,m]of r){const v=(f=o.get(y))==null?void 0:f.internals.userNode;v&&u.push({...v,position:m.position,dragging:l})}if(!t)return[u[0],u];const c=(h=o.get(t))==null?void 0:h.internals.userNode;return[c?{...c,position:((p=r.get(t))==null?void 0:p.position)||c.position,dragging:l}:u[0],u]}function Ow({dragItems:t,snapGrid:r,x:o,y:l}){const u=t.values().next().value;if(!u)return null;const c={x:o-u.distance.x,y:l-u.distance.y},f=yo(c,r);return{x:f.x-c.x,y:f.y-c.y}}function Fw({onNodeMouseDown:t,getStoreItems:r,onDragStart:o,onDrag:l,onDragStop:u}){let c={x:null,y:null},f=0,h=new Map,p=!1,y={x:0,y:0},m=null,v=!1,g=null,w=!1,S=!1,M=null;function N({noDragClassName:R,handleSelector:_,domNode:I,isSelectable:W,nodeId:$,nodeClickDistance:V=0}){g=kt(I);function X({x:ee,y:J}){const{nodeLookup:k,nodeExtent:B,snapGrid:H,snapToGrid:U,nodeOrigin:A,onNodeDrag:j,onSelectionDrag:F,onError:C,updateNodePositions:z}=r();c={x:ee,y:J};let ne=!1;const ie=h.size>1,ce=ie&&B?Ha(mo(h)):null,O=ie&&U?Ow({dragItems:h,snapGrid:H,x:ee,y:J}):null;for(const[re,Q]of h){if(!k.has(re))continue;let le={x:ee-Q.distance.x,y:J-Q.distance.y};U&&(le=O?{x:Math.round(le.x+O.x),y:Math.round(le.y+O.y)}:yo(le,H));let pe=null;if(ie&&B&&!Q.extent&&ce){const{positionAbsolute:me}=Q.internals,ke=me.x-ce.x+B[0][0],Ce=me.x+Q.measured.width-ce.x2+B[1][0],Me=me.y-ce.y+B[0][1],Re=me.y+Q.measured.height-ce.y2+B[1][1];pe=[[ke,Me],[Ce,Re]]}const{position:we,positionAbsolute:ve}=Ap({nodeId:re,nextPosition:le,nodeLookup:k,nodeExtent:pe||B,nodeOrigin:A,onError:C});ne=ne||Q.position.x!==we.x||Q.position.y!==we.y,Q.position=we,Q.internals.positionAbsolute=ve}if(S=S||ne,!!ne&&(z(h,!0),M&&(l||j||!$&&F))){const[re,Q]=_a({nodeId:$,dragItems:h,nodeLookup:k});l==null||l(M,h,re,Q),j==null||j(M,re,Q),$||F==null||F(M,Q)}}async function K(){if(!m)return;const{transform:ee,panBy:J,autoPanSpeed:k,autoPanOnNodeDrag:B}=r();if(!B){p=!1,cancelAnimationFrame(f);return}const[H,U]=tc(y,m,k);(H!==0||U!==0)&&(c.x=(c.x??0)-H/ee[2],c.y=(c.y??0)-U/ee[2],await J({x:H,y:U})&&X(c)),f=requestAnimationFrame(K)}function te(ee){var ie;const{nodeLookup:J,multiSelectionActive:k,nodesDraggable:B,transform:H,snapGrid:U,snapToGrid:A,selectNodesOnDrag:j,onNodeDragStart:F,onSelectionDragStart:C,unselectNodesAndEdges:z}=r();v=!0,(!j||!W)&&!k&&$&&((ie=J.get($))!=null&&ie.selected||z()),W&&j&&$&&(t==null||t($));const ne=to(ee.sourceEvent,{transform:H,snapGrid:U,snapToGrid:A,containerBounds:m});if(c=ne,h=Dw(J,B,ne,$),h.size>0&&(o||F||!$&&C)){const[ce,O]=_a({nodeId:$,dragItems:h,nodeLookup:J});o==null||o(ee.sourceEvent,h,ce,O),F==null||F(ee.sourceEvent,ce,O),$||C==null||C(ee.sourceEvent,O)}}const Z=pp().clickDistance(V).on("start",ee=>{const{domNode:J,nodeDragThreshold:k,transform:B,snapGrid:H,snapToGrid:U}=r();m=(J==null?void 0:J.getBoundingClientRect())||null,w=!1,S=!1,M=ee.sourceEvent,k===0&&te(ee),c=to(ee.sourceEvent,{transform:B,snapGrid:H,snapToGrid:U,containerBounds:m}),y=bt(ee.sourceEvent,m)}).on("drag",ee=>{const{autoPanOnNodeDrag:J,transform:k,snapGrid:B,snapToGrid:H,nodeDragThreshold:U,nodeLookup:A}=r(),j=to(ee.sourceEvent,{transform:k,snapGrid:B,snapToGrid:H,containerBounds:m});if(M=ee.sourceEvent,(ee.sourceEvent.type==="touchmove"&&ee.sourceEvent.touches.length>1||$&&!A.has($))&&(w=!0),!w){if(!p&&J&&v&&(p=!0,K()),!v){const F=bt(ee.sourceEvent,m),C=F.x-y.x,z=F.y-y.y;Math.sqrt(C*C+z*z)>U&&te(ee)}(c.x!==j.xSnapped||c.y!==j.ySnapped)&&h&&v&&(y=bt(ee.sourceEvent,m),X(j))}}).on("end",ee=>{if(!v||w){w&&h.size>0&&r().updateNodePositions(h,!1);return}if(p=!1,v=!1,cancelAnimationFrame(f),h.size>0){const{nodeLookup:J,updateNodePositions:k,onNodeDragStop:B,onSelectionDragStop:H}=r();if(S&&(k(h,!1),S=!1),u||B||!$&&H){const[U,A]=_a({nodeId:$,dragItems:h,nodeLookup:J,dragging:!1});u==null||u(ee.sourceEvent,h,U,A),B==null||B(ee.sourceEvent,U,A),$||H==null||H(ee.sourceEvent,A)}}}).filter(ee=>{const J=ee.target;return!ee.button&&(!R||!vh(J,`.${R}`,I))&&(!_||vh(J,_,I))});g.call(Z)}function E(){g==null||g.on(".drag",null)}return{update:N,destroy:E}}function Hw(t,r,o){const l=[],u={x:t.x-o,y:t.y-o,width:o*2,height:o*2};for(const c of r.values())sl(u,uo(c))>0&&l.push(c);return l}const Vw=250;function Bw(t,r,o,l){var h,p;let u=[],c=1/0;const f=Hw(t,o,r+Vw);for(const y of f){const m=[...((h=y.internals.handleBounds)==null?void 0:h.source)??[],...((p=y.internals.handleBounds)==null?void 0:p.target)??[]];for(const v of m){if(l.nodeId===v.nodeId&&l.type===v.type&&l.id===v.id)continue;const{x:g,y:w}=xr(y,v,v.position,!0),S=Math.sqrt(Math.pow(g-t.x,2)+Math.pow(w-t.y,2));S>r||(S1){const y=l.type==="source"?"target":"source";return u.find(m=>m.type===y)??u[0]}return u[0]}function Jp(t,r,o,l,u,c=!1){var y,m,v;const f=l.get(t);if(!f)return null;const h=u==="strict"?(y=f.internals.handleBounds)==null?void 0:y[r]:[...((m=f.internals.handleBounds)==null?void 0:m.source)??[],...((v=f.internals.handleBounds)==null?void 0:v.target)??[]],p=(o?h==null?void 0:h.find(g=>g.id===o):h==null?void 0:h[0])??null;return p&&c?{...p,...xr(f,p,p.position,!0)}:p}function eg(t,r){return t||(r!=null&&r.classList.contains("target")?"target":r!=null&&r.classList.contains("source")?"source":null)}function Uw(t,r){let o=null;return r?o=!0:t&&!r&&(o=!1),o}const tg=()=>!0;function Ww(t,{connectionMode:r,connectionRadius:o,handleId:l,nodeId:u,edgeUpdaterType:c,isTarget:f,domNode:h,nodeLookup:p,lib:y,autoPanOnConnect:m,flowId:v,panBy:g,cancelConnection:w,onConnectStart:S,onConnect:M,onConnectEnd:N,isValidConnection:E=tg,onReconnectEnd:R,updateConnection:_,getTransform:I,getFromHandle:W,autoPanSpeed:$,dragThreshold:V=1,handleDomNode:X}){const K=Bp(t.target);let te=0,Z;const{x:ee,y:J}=bt(t),k=eg(c,X),B=h==null?void 0:h.getBoundingClientRect();let H=!1;if(!B||!k)return;const U=Jp(u,k,l,p,r);if(!U)return;let A=bt(t,B),j=!1,F=null,C=!1,z=null;function ne(){if(!m||!B)return;const[we,ve]=tc(A,B,$);g({x:we,y:ve}),te=requestAnimationFrame(ne)}const ie={...U,nodeId:u,type:k,position:U.position},ce=p.get(u);let re={inProgress:!0,isValid:null,from:xr(ce,ie,xe.Left,!0),fromHandle:ie,fromPosition:ie.position,fromNode:ce,to:A,toHandle:null,toPosition:sh[ie.position],toNode:null,pointer:A};function Q(){H=!0,_(re),S==null||S(t,{nodeId:u,handleId:l,handleType:k})}V===0&&Q();function le(we){if(!H){const{x:Re,y:ot}=bt(we),ut=Re-ee,Je=ot-J;if(!(ut*ut+Je*Je>V*V))return;Q()}if(!W()||!ie){pe(we);return}const ve=I();A=bt(we,B),Z=Bw(vo(A,ve,!1,[1,1]),o,p,ie),j||(ne(),j=!0);const me=ng(we,{handle:Z,connectionMode:r,fromNodeId:u,fromHandleId:l,fromType:f?"target":"source",isValidConnection:E,doc:K,lib:y,flowId:v,nodeLookup:p});z=me.handleDomNode,F=me.connection,C=Uw(!!Z,me.isValid);const ke=p.get(u),Ce=ke?xr(ke,ie,xe.Left,!0):re.from,Me={...re,from:Ce,isValid:C,to:me.toHandle&&C?ii({x:me.toHandle.x,y:me.toHandle.y},ve):A,toHandle:me.toHandle,toPosition:C&&me.toHandle?me.toHandle.position:sh[ie.position],toNode:me.toHandle?p.get(me.toHandle.nodeId):null,pointer:A};_(Me),re=Me}function pe(we){if(!("touches"in we&&we.touches.length>0)){if(H){(Z||z)&&F&&C&&(M==null||M(F));const{inProgress:ve,...me}=re,ke={...me,toPosition:re.toHandle?re.toPosition:null};N==null||N(we,ke),c&&(R==null||R(we,ke))}w(),cancelAnimationFrame(te),j=!1,C=!1,F=null,z=null,K.removeEventListener("mousemove",le),K.removeEventListener("mouseup",pe),K.removeEventListener("touchmove",le),K.removeEventListener("touchend",pe)}}K.addEventListener("mousemove",le),K.addEventListener("mouseup",pe),K.addEventListener("touchmove",le),K.addEventListener("touchend",pe)}function ng(t,{handle:r,connectionMode:o,fromNodeId:l,fromHandleId:u,fromType:c,doc:f,lib:h,flowId:p,isValidConnection:y=tg,nodeLookup:m}){const v=c==="target",g=r?f.querySelector(`.${h}-flow__handle[data-id="${p}-${r==null?void 0:r.nodeId}-${r==null?void 0:r.id}-${r==null?void 0:r.type}"]`):null,{x:w,y:S}=bt(t),M=f.elementFromPoint(w,S),N=M!=null&&M.classList.contains(`${h}-flow__handle`)?M:g,E={handleDomNode:N,isValid:!1,connection:null,toHandle:null};if(N){const R=eg(void 0,N),_=N.getAttribute("data-nodeid"),I=N.getAttribute("data-handleid"),W=N.classList.contains("connectable"),$=N.classList.contains("connectableend");if(!_||!R)return E;const V={source:v?_:l,sourceHandle:v?I:u,target:v?l:_,targetHandle:v?u:I};E.connection=V;const K=W&&$&&(o===ni.Strict?v&&R==="source"||!v&&R==="target":_!==l||I!==u);E.isValid=K&&y(V),E.toHandle=Jp(_,R,I,m,o,!0)}return E}const Wa={onPointerDown:Ww,isValid:ng};function bw({domNode:t,panZoom:r,getTransform:o,getViewScale:l}){const u=kt(t);function c({translateExtent:h,width:p,height:y,zoomStep:m=1,pannable:v=!0,zoomable:g=!0,inversePan:w=!1}){const S=_=>{if(_.sourceEvent.type!=="wheel"||!r)return;const I=o(),W=_.sourceEvent.ctrlKey&&ao()?10:1,$=-_.sourceEvent.deltaY*(_.sourceEvent.deltaMode===1?.05:_.sourceEvent.deltaMode?1:.002)*m,V=I[2]*Math.pow(2,$*W);r.scaleTo(V)};let M=[0,0];const N=_=>{(_.sourceEvent.type==="mousedown"||_.sourceEvent.type==="touchstart")&&(M=[_.sourceEvent.clientX??_.sourceEvent.touches[0].clientX,_.sourceEvent.clientY??_.sourceEvent.touches[0].clientY])},E=_=>{const I=o();if(_.sourceEvent.type!=="mousemove"&&_.sourceEvent.type!=="touchmove"||!r)return;const W=[_.sourceEvent.clientX??_.sourceEvent.touches[0].clientX,_.sourceEvent.clientY??_.sourceEvent.touches[0].clientY],$=[W[0]-M[0],W[1]-M[1]];M=W;const V=l()*Math.max(I[2],Math.log(I[2]))*(w?-1:1),X={x:I[0]-$[0]*V,y:I[1]-$[1]*V},K=[[0,0],[p,y]];r.setViewportConstrained({x:X.x,y:X.y,zoom:I[2]},K,h)},R=Ip().on("start",N).on("zoom",v?E:null).on("zoom.wheel",g?S:null);u.call(R,{})}function f(){u.on("zoom",null)}return{update:c,destroy:f,pointer:Bt}}const ml=t=>({x:t.x,y:t.y,zoom:t.k}),Ea=({x:t,y:r,zoom:o})=>hl.translate(t,r).scale(o),Un=(t,r)=>t.target.closest(`.${r}`),rg=(t,r)=>r===2&&Array.isArray(t)&&t.includes(2),Yw=t=>((t*=2)<=1?t*t*t:(t-=2)*t*t+2)/2,ka=(t,r=0,o=Yw,l=()=>{})=>{const u=typeof r=="number"&&r>0;return u||l(),u?t.transition().duration(r).ease(o).on("end",l):t},ig=t=>{const r=t.ctrlKey&&ao()?10:1;return-t.deltaY*(t.deltaMode===1?.05:t.deltaMode?1:.002)*r};function Xw({zoomPanValues:t,noWheelClassName:r,d3Selection:o,d3Zoom:l,panOnScrollMode:u,panOnScrollSpeed:c,zoomOnPinch:f,onPanZoomStart:h,onPanZoom:p,onPanZoomEnd:y}){return m=>{if(Un(m,r))return m.ctrlKey&&m.preventDefault(),!1;m.preventDefault(),m.stopImmediatePropagation();const v=o.property("__zoom").k||1;if(m.ctrlKey&&f){const N=Bt(m),E=ig(m),R=v*Math.pow(2,E);l.scaleTo(o,R,N,m);return}const g=m.deltaMode===1?20:1;let w=u===pr.Vertical?0:m.deltaX*g,S=u===pr.Horizontal?0:m.deltaY*g;!ao()&&m.shiftKey&&u!==pr.Vertical&&(w=m.deltaY*g,S=0),l.translateBy(o,-(w/v)*c,-(S/v)*c,{internal:!0});const M=ml(o.property("__zoom"));clearTimeout(t.panScrollTimeout),t.isPanScrolling?p==null||p(m,M):(t.isPanScrolling=!0,h==null||h(m,M)),t.panScrollTimeout=setTimeout(()=>{y==null||y(m,M),t.isPanScrolling=!1},150)}}function Qw({noWheelClassName:t,preventScrolling:r,d3ZoomHandler:o}){return function(l,u){const c=l.type==="wheel",f=!r&&c&&!l.ctrlKey,h=Un(l,t);if(l.ctrlKey&&c&&h&&l.preventDefault(),f||h)return null;l.preventDefault(),o.call(this,l,u)}}function Gw({zoomPanValues:t,onDraggingChange:r,onPanZoomStart:o}){return l=>{var c,f,h;if((c=l.sourceEvent)!=null&&c.internal)return;const u=ml(l.transform);t.mouseButton=((f=l.sourceEvent)==null?void 0:f.button)||0,t.isZoomingOrPanning=!0,t.prevViewport=u,((h=l.sourceEvent)==null?void 0:h.type)==="mousedown"&&r(!0),o&&(o==null||o(l.sourceEvent,u))}}function Kw({zoomPanValues:t,panOnDrag:r,onPaneContextMenu:o,onTransformChange:l,onPanZoom:u}){return c=>{var f,h;t.usedRightMouseButton=!!(o&&rg(r,t.mouseButton??0)),(f=c.sourceEvent)!=null&&f.sync||l([c.transform.x,c.transform.y,c.transform.k]),u&&!((h=c.sourceEvent)!=null&&h.internal)&&(u==null||u(c.sourceEvent,ml(c.transform)))}}function qw({zoomPanValues:t,panOnDrag:r,panOnScroll:o,onDraggingChange:l,onPanZoomEnd:u,onPaneContextMenu:c}){return f=>{var h;if(!((h=f.sourceEvent)!=null&&h.internal)&&(t.isZoomingOrPanning=!1,c&&rg(r,t.mouseButton??0)&&!t.usedRightMouseButton&&f.sourceEvent&&c(f.sourceEvent),t.usedRightMouseButton=!1,l(!1),u)){const p=ml(f.transform);t.prevViewport=p,clearTimeout(t.timerId),t.timerId=setTimeout(()=>{u==null||u(f.sourceEvent,p)},o?150:0)}}}function Zw({panActivationKeyPressed:t,zoomActivationKeyPressed:r,zoomOnScroll:o,zoomOnPinch:l,panOnDrag:u,panOnScroll:c,zoomOnDoubleClick:f,userSelectionActive:h,noWheelClassName:p,noPanClassName:y,lib:m,connectionInProgress:v}){return g=>{var E;const w=r||o,S=l&&g.ctrlKey,M=g.type==="wheel";if(g.button===1&&g.type==="mousedown"&&(Un(g,`${m}-flow__node`)||Un(g,`${m}-flow__edge`)||Un(g,`${m}-flow__selection`)||Un(g,`${m}-flow__nodesselection`)))return!0;if(!u&&!w&&!c&&!f&&!l||h||v&&!M||Un(g,p)&&M||Un(g,y)&&(!M||c&&M&&!r)||!l&&g.ctrlKey&&M)return!1;if(!l&&g.type==="touchstart"&&((E=g.touches)==null?void 0:E.length)>1)return g.preventDefault(),!1;if(!w&&!c&&!S&&M||!u&&(g.type==="mousedown"||g.type==="touchstart")||Array.isArray(u)&&!u.includes(g.button)&&g.type==="mousedown")return!1;const N=Array.isArray(u)&&u.includes(g.button)||!g.button||g.button<=1;return(!g.ctrlKey||M||t)&&N}}function Jw({domNode:t,minZoom:r,maxZoom:o,translateExtent:l,viewport:u,onPanZoom:c,onPanZoomStart:f,onPanZoomEnd:h,onDraggingChange:p}){const y={isZoomingOrPanning:!1,usedRightMouseButton:!1,prevViewport:{},mouseButton:0,timerId:void 0,panScrollTimeout:void 0,isPanScrolling:!1},m=t.getBoundingClientRect();let v=[[0,0],[m.width,m.height]];const g=typeof ResizeObserver<"u"?new ResizeObserver(J=>{const k=J[0];k&&(v=[[0,0],[k.contentRect.width,k.contentRect.height]])}):null;g==null||g.observe(t);const w=Ip().extent(()=>v).scaleExtent([r,o]).translateExtent(l),S=kt(t).call(w);I({x:u.x,y:u.y,zoom:ri(u.zoom,r,o)},[[0,0],[m.width,m.height]],l);const M=S.on("wheel.zoom"),N=S.on("dblclick.zoom");w.wheelDelta(ig);async function E(J,k){return S?new Promise(B=>{w==null||w.interpolate((k==null?void 0:k.interpolate)==="linear"?eo:Xs).transform(ka(S,k==null?void 0:k.duration,k==null?void 0:k.ease,()=>B(!0)),J)}):!1}function R({noWheelClassName:J,noPanClassName:k,onPaneContextMenu:B,userSelectionActive:H,panOnScroll:U,panOnDrag:A,panOnScrollMode:j,panOnScrollSpeed:F,preventScrolling:C,zoomOnPinch:z,zoomOnScroll:ne,zoomOnDoubleClick:ie,panActivationKeyPressed:ce=!1,zoomActivationKeyPressed:O,lib:re,onTransformChange:Q,connectionInProgress:le,paneClickDistance:pe,selectionOnDrag:we}){H&&!y.isZoomingOrPanning&&_();const ve=U&&!O&&!H;w.clickDistance(we?1/0:!Wt(pe)||pe<0?0:pe);const me=ve?Xw({zoomPanValues:y,noWheelClassName:J,d3Selection:S,d3Zoom:w,panOnScrollMode:j,panOnScrollSpeed:F,zoomOnPinch:z,onPanZoomStart:f,onPanZoom:c,onPanZoomEnd:h}):Qw({noWheelClassName:J,preventScrolling:C,d3ZoomHandler:M});S.on("wheel.zoom",me,{passive:!1});const ke=Gw({zoomPanValues:y,onDraggingChange:p,onPanZoomStart:f});w.on("start",ke);const Ce=Kw({zoomPanValues:y,panOnDrag:A,onPaneContextMenu:!!B,onPanZoom:c,onTransformChange:Q});w.on("zoom",Ce);const Me=qw({zoomPanValues:y,panOnDrag:A,panOnScroll:U,onPaneContextMenu:B,onPanZoomEnd:h,onDraggingChange:p});w.on("end",Me);const Re=Zw({panActivationKeyPressed:ce,zoomActivationKeyPressed:O,panOnDrag:A,zoomOnScroll:ne,panOnScroll:U,zoomOnDoubleClick:ie,zoomOnPinch:z,userSelectionActive:H,noPanClassName:k,noWheelClassName:J,lib:re,connectionInProgress:le});w.filter(Re),ie?S.on("dblclick.zoom",N):S.on("dblclick.zoom",null)}function _(){w.on("zoom",null)}async function I(J,k,B){const H=Ea(J),U=w==null?void 0:w.constrain()(H,k,B);return U&&await E(U),U}async function W(J,k){const B=Ea(J);return await E(B,k),B}function $(J){if(S){const k=Ea(J),B=S.property("__zoom");(B.k!==J.zoom||B.x!==J.x||B.y!==J.y)&&(w==null||w.transform(S,k,null,{sync:!0}))}}function V(){const J=S?Pp(S.node()):{x:0,y:0,k:1};return{x:J.x,y:J.y,zoom:J.k}}async function X(J,k){return S?new Promise(B=>{w==null||w.interpolate((k==null?void 0:k.interpolate)==="linear"?eo:Xs).scaleTo(ka(S,k==null?void 0:k.duration,k==null?void 0:k.ease,()=>B(!0)),J)}):!1}async function K(J,k){return S?new Promise(B=>{w==null||w.interpolate((k==null?void 0:k.interpolate)==="linear"?eo:Xs).scaleBy(ka(S,k==null?void 0:k.duration,k==null?void 0:k.ease,()=>B(!0)),J)}):!1}function te(J){w==null||w.scaleExtent(J)}function Z(J){w==null||w.translateExtent(J)}function ee(J){const k=!Wt(J)||J<0?0:J;w==null||w.clickDistance(k)}return{update:R,destroy:_,setViewport:W,setViewportConstrained:I,getViewport:V,scaleTo:X,scaleBy:K,setScaleExtent:te,setTranslateExtent:Z,syncViewport:$,setClickDistance:ee}}var oi;(function(t){t.Line="line",t.Handle="handle"})(oi||(oi={}));function e1({width:t,prevWidth:r,height:o,prevHeight:l,affectsX:u,affectsY:c}){const f=t-r,h=o-l,p=[f>0?1:f<0?-1:0,h>0?1:h<0?-1:0];return f&&u&&(p[0]=p[0]*-1),h&&c&&(p[1]=p[1]*-1),p}function xh(t){const r=t.includes("right")||t.includes("left"),o=t.includes("bottom")||t.includes("top"),l=t.includes("left"),u=t.includes("top");return{isHorizontal:r,isVertical:o,affectsX:l,affectsY:u}}function Vn(t,r){return Math.max(0,r-t)}function Bn(t,r){return Math.max(0,t-r)}function Us(t,r,o){return Math.max(0,r-t,t-o)}function wh(t,r){return t?!r:r}function t1(t,r,o,l,u,c,f,h){let{affectsX:p,affectsY:y}=r;const{isHorizontal:m,isVertical:v}=r,g=m&&v,{xSnapped:w,ySnapped:S}=o,{minWidth:M,maxWidth:N,minHeight:E,maxHeight:R}=l,{x:_,y:I,width:W,height:$,aspectRatio:V}=t;let X=Math.floor(m?w-t.pointerX:0),K=Math.floor(v?S-t.pointerY:0);const te=W+(p?-X:X),Z=$+(y?-K:K),ee=-c[0]*W,J=-c[1]*$;let k=Us(te,M,N),B=Us(Z,E,R);if(f){let A=0,j=0;p&&X<0?A=Vn(_+X+ee,f[0][0]):!p&&X>0&&(A=Bn(_+te+ee,f[1][0])),y&&K<0?j=Vn(I+K+J,f[0][1]):!y&&K>0&&(j=Bn(I+Z+J,f[1][1])),k=Math.max(k,A),B=Math.max(B,j)}if(h){let A=0,j=0;p&&X>0?A=Bn(_+X,h[0][0]):!p&&X<0&&(A=Vn(_+te,h[1][0])),y&&K>0?j=Bn(I+K,h[0][1]):!y&&K<0&&(j=Vn(I+Z,h[1][1])),k=Math.max(k,A),B=Math.max(B,j)}if(u){if(m){const A=Us(te/V,E,R)*V;if(k=Math.max(k,A),f){let j=0;!p&&!y||p&&!y&&g?j=Bn(I+J+te/V,f[1][1])*V:j=Vn(I+J+(p?X:-X)/V,f[0][1])*V,k=Math.max(k,j)}if(h){let j=0;!p&&!y||p&&!y&&g?j=Vn(I+te/V,h[1][1])*V:j=Bn(I+(p?X:-X)/V,h[0][1])*V,k=Math.max(k,j)}}if(v){const A=Us(Z*V,M,N)/V;if(B=Math.max(B,A),f){let j=0;!p&&!y||y&&!p&&g?j=Bn(_+Z*V+ee,f[1][0])/V:j=Vn(_+(y?K:-K)*V+ee,f[0][0])/V,B=Math.max(B,j)}if(h){let j=0;!p&&!y||y&&!p&&g?j=Vn(_+Z*V,h[1][0])/V:j=Bn(_+(y?K:-K)*V,h[0][0])/V,B=Math.max(B,j)}}}K=K+(K<0?B:-B),X=X+(X<0?k:-k),u&&(g?te>Z*V?K=(wh(p,y)?-X:X)/V:X=(wh(p,y)?-K:K)*V:m?(K=X/V,y=p):(X=K*V,p=y));const H=p?_+X:_,U=y?I+K:I;return{width:W+(p?-X:X),height:$+(y?-K:K),x:c[0]*X*(p?-1:1)+H,y:c[1]*K*(y?-1:1)+U}}const og={width:0,height:0,x:0,y:0},n1={...og,pointerX:0,pointerY:0,aspectRatio:1};function r1(t,r,o){const l=r.position.x+t.position.x,u=r.position.y+t.position.y,c=t.measured.width??0,f=t.measured.height??0,h=o[0]*c,p=o[1]*f;return[[l-h,u-p],[l+c-h,u+f-p]]}function i1({domNode:t,nodeId:r,getStoreItems:o,onChange:l,onEnd:u}){const c=kt(t);let f={controlDirection:xh("bottom-right"),boundaries:{minWidth:0,minHeight:0,maxWidth:Number.MAX_VALUE,maxHeight:Number.MAX_VALUE},resizeDirection:void 0,keepAspectRatio:!1};function h({controlPosition:y,boundaries:m,keepAspectRatio:v,resizeDirection:g,onResizeStart:w,onResize:S,onResizeEnd:M,shouldResize:N}){let E={...og},R={...n1};f={boundaries:m,resizeDirection:g,keepAspectRatio:v,controlDirection:xh(y)};let _,I=null,W=[],$,V,X,K=!1;const te=pp().on("start",Z=>{const{nodeLookup:ee,transform:J,snapGrid:k,snapToGrid:B,nodeOrigin:H,paneDomNode:U}=o();if(_=ee.get(r),!_)return;I=(U==null?void 0:U.getBoundingClientRect())??null;const{xSnapped:A,ySnapped:j}=to(Z.sourceEvent,{transform:J,snapGrid:k,snapToGrid:B,containerBounds:I});E={width:_.measured.width??0,height:_.measured.height??0,x:_.position.x??0,y:_.position.y??0},R={...E,pointerX:A,pointerY:j,aspectRatio:E.width/E.height},$=void 0,V=vr(_.extent)?_.extent:void 0,_.parentId&&(_.extent==="parent"||_.expandParent)&&($=ee.get(_.parentId)),$&&_.extent==="parent"&&(V=[[0,0],[$.measured.width,$.measured.height]]),W=[],X=void 0;for(const[F,C]of ee)if(C.parentId===r&&(W.push({id:F,position:{...C.position},extent:C.extent}),C.extent==="parent"||C.expandParent)){const z=r1(C,_,C.origin??H);X?X=[[Math.min(z[0][0],X[0][0]),Math.min(z[0][1],X[0][1])],[Math.max(z[1][0],X[1][0]),Math.max(z[1][1],X[1][1])]]:X=z}w==null||w(Z,{...E})}).on("drag",Z=>{const{transform:ee,snapGrid:J,snapToGrid:k,nodeOrigin:B}=o(),H=to(Z.sourceEvent,{transform:ee,snapGrid:J,snapToGrid:k,containerBounds:I}),U=[];if(!_)return;const{x:A,y:j,width:F,height:C}=E,z={},ne=_.origin??B,{width:ie,height:ce,x:O,y:re}=t1(R,f.controlDirection,H,f.boundaries,f.keepAspectRatio,ne,V,X),Q=ie!==F,le=ce!==C,pe=O!==A&&Q,we=re!==j&≤if(!pe&&!we&&!Q&&!le)return;if((pe||we||ne[0]===1||ne[1]===1)&&(z.x=pe?O:E.x,z.y=we?re:E.y,E.x=z.x,E.y=z.y,W.length>0)){const Ce=O-A,Me=re-j;for(const Re of W)Re.position={x:Re.position.x-Ce+ne[0]*(ie-F),y:Re.position.y-Me+ne[1]*(ce-C)},U.push(Re)}if((Q||le)&&(z.width=Q&&(!f.resizeDirection||f.resizeDirection==="horizontal")?ie:E.width,z.height=le&&(!f.resizeDirection||f.resizeDirection==="vertical")?ce:E.height,E.width=z.width,E.height=z.height),$&&_.expandParent){const Ce=ne[0]*(z.width??0);z.x&&z.x{K&&(M==null||M(Z,{...E}),u==null||u({...E}),K=!1)});c.call(te)}function p(){c.on(".drag",null)}return{update:h,destroy:p}}var Na={exports:{}},Ca={},Ma={exports:{}},Pa={};/** - * @license React - * use-sync-external-store-shim.production.js - * - * Copyright (c) Meta Platforms, Inc. and affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */var Sh;function o1(){if(Sh)return Pa;Sh=1;var t=fo();function r(v,g){return v===g&&(v!==0||1/v===1/g)||v!==v&&g!==g}var o=typeof Object.is=="function"?Object.is:r,l=t.useState,u=t.useEffect,c=t.useLayoutEffect,f=t.useDebugValue;function h(v,g){var w=g(),S=l({inst:{value:w,getSnapshot:g}}),M=S[0].inst,N=S[1];return c(function(){M.value=w,M.getSnapshot=g,p(M)&&N({inst:M})},[v,w,g]),u(function(){return p(M)&&N({inst:M}),v(function(){p(M)&&N({inst:M})})},[v]),f(w),w}function p(v){var g=v.getSnapshot;v=v.value;try{var w=g();return!o(v,w)}catch{return!0}}function y(v,g){return g()}var m=typeof window>"u"||typeof window.document>"u"||typeof window.document.createElement>"u"?y:h;return Pa.useSyncExternalStore=t.useSyncExternalStore!==void 0?t.useSyncExternalStore:m,Pa}var _h;function s1(){return _h||(_h=1,Ma.exports=o1()),Ma.exports}/** - * @license React - * use-sync-external-store-shim/with-selector.production.js - * - * Copyright (c) Meta Platforms, Inc. and affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */var Eh;function l1(){if(Eh)return Ca;Eh=1;var t=fo(),r=s1();function o(y,m){return y===m&&(y!==0||1/y===1/m)||y!==y&&m!==m}var l=typeof Object.is=="function"?Object.is:o,u=r.useSyncExternalStore,c=t.useRef,f=t.useEffect,h=t.useMemo,p=t.useDebugValue;return Ca.useSyncExternalStoreWithSelector=function(y,m,v,g,w){var S=c(null);if(S.current===null){var M={hasValue:!1,value:null};S.current=M}else M=S.current;S=h(function(){function E($){if(!R){if(R=!0,_=$,$=g($),w!==void 0&&M.hasValue){var V=M.value;if(w(V,$))return I=V}return I=$}if(V=I,l(_,$))return V;var X=g($);return w!==void 0&&w(V,X)?(_=$,V):(_=$,I=X)}var R=!1,_,I,W=v===void 0?null:v;return[function(){return E(m())},W===null?void 0:function(){return E(W())}]},[m,v,g,w]);var N=u(y,S[0],S[1]);return f(function(){M.hasValue=!0,M.value=N},[N]),p(N),N},Ca}var kh;function u1(){return kh||(kh=1,Na.exports=l1()),Na.exports}var a1=u1();const c1=Zh(a1),f1={},Nh=t=>{let r;const o=new Set,l=(m,v)=>{const g=typeof m=="function"?m(r):m;if(!Object.is(g,r)){const w=r;r=v??(typeof g!="object"||g===null)?g:Object.assign({},r,g),o.forEach(S=>S(r,w))}},u=()=>r,p={setState:l,getState:u,getInitialState:()=>y,subscribe:m=>(o.add(m),()=>o.delete(m)),destroy:()=>{(f1?"production":void 0)!=="production"&&console.warn("[DEPRECATED] The `destroy` method will be unsupported in a future version. Instead use unsubscribe function returned by subscribe. Everything will be garbage-collected if store is garbage-collected."),o.clear()}},y=r=t(l,u,p);return p},d1=t=>t?Nh(t):Nh,{useDebugValue:h1}=E0,{useSyncExternalStoreWithSelector:p1}=c1,g1=t=>t;function sg(t,r=g1,o){const l=p1(t.subscribe,t.getState,t.getServerState||t.getInitialState,r,o);return h1(l),l}const Ch=(t,r)=>{const o=d1(t),l=(u,c=r)=>sg(o,u,c);return Object.assign(l,o),l},m1=(t,r)=>t?Ch(t,r):Ch;function Ve(t,r){if(Object.is(t,r))return!0;if(typeof t!="object"||t===null||typeof r!="object"||r===null)return!1;if(t instanceof Map&&r instanceof Map){if(t.size!==r.size)return!1;for(const[l,u]of t)if(!Object.is(u,r.get(l)))return!1;return!0}if(t instanceof Set&&r instanceof Set){if(t.size!==r.size)return!1;for(const l of t)if(!r.has(l))return!1;return!0}const o=Object.keys(t);if(o.length!==Object.keys(r).length)return!1;for(const l of o)if(!Object.prototype.hasOwnProperty.call(r,l)||!Object.is(t[l],r[l]))return!1;return!0}Jh();const yl=G.createContext(null),y1=yl.Provider,lg=Yt.error001("react");function Ie(t,r){const o=G.useContext(yl);if(o===null)throw new Error(lg);return sg(o,t,r)}function $e(){const t=G.useContext(yl);if(t===null)throw new Error(lg);return G.useMemo(()=>({getState:t.getState,setState:t.setState,subscribe:t.subscribe}),[t])}const Mh={display:"none"},v1={position:"absolute",width:1,height:1,margin:-1,border:0,padding:0,overflow:"hidden",clip:"rect(0px, 0px, 0px, 0px)",clipPath:"inset(100%)"},ug="react-flow__node-desc",ag="react-flow__edge-desc",x1="react-flow__aria-live",w1=t=>t.ariaLiveMessage,S1=t=>t.ariaLabelConfig;function _1({rfId:t}){const r=Ie(w1);return P.jsx("div",{id:`${x1}-${t}`,"aria-live":"assertive","aria-atomic":"true",style:v1,children:r})}function E1({rfId:t,disableKeyboardA11y:r}){const o=Ie(S1);return P.jsxs(P.Fragment,{children:[P.jsx("div",{id:`${ug}-${t}`,style:Mh,children:r?o["node.a11yDescription.default"]:o["node.a11yDescription.keyboardDisabled"]}),P.jsx("div",{id:`${ag}-${t}`,style:Mh,children:o["edge.a11yDescription.default"]}),!r&&P.jsx(_1,{rfId:t})]})}const vl=G.forwardRef(({position:t="top-left",children:r,className:o,style:l,...u},c)=>{const f=`${t}`.split("-");return P.jsx("div",{className:be(["react-flow__panel",o,...f]),style:l,ref:c,...u,children:r})});vl.displayName="Panel";const Ph="https://reactflow.dev?utm_source=attribution";function k1({proOptions:t,position:r="bottom-right"}){return t!=null&&t.hideAttribution?null:P.jsx(vl,{position:r,className:"react-flow__attribution","data-message":`Please only hide this attribution when you are subscribed to React Flow Pro: ${Ph}`,children:P.jsx("a",{href:Ph,target:"_blank",rel:"noopener noreferrer","aria-label":"React Flow attribution",children:"React Flow"})})}const N1=t=>{const r=[],o=[];for(const[,l]of t.nodeLookup)l.selected&&r.push(l.internals.userNode);for(const[,l]of t.edgeLookup)l.selected&&o.push(l);return{selectedNodes:r,selectedEdges:o}},Ws=t=>t.id;function C1(t,r){return Ve(t.selectedNodes.map(Ws),r.selectedNodes.map(Ws))&&Ve(t.selectedEdges.map(Ws),r.selectedEdges.map(Ws))}function M1({onSelectionChange:t}){const r=$e(),{selectedNodes:o,selectedEdges:l}=Ie(N1,C1);return G.useEffect(()=>{const u={nodes:o,edges:l};t==null||t(u),r.getState().onSelectionChangeHandlers.forEach(c=>c(u))},[o,l,t]),null}const P1=t=>!!t.onSelectionChangeHandlers;function I1({onSelectionChange:t}){const r=Ie(P1);return t||r?P.jsx(M1,{onSelectionChange:t}):null}const cg=[0,0],T1={x:0,y:0,zoom:1},z1=["nodes","edges","defaultNodes","defaultEdges","onConnect","onConnectStart","onConnectEnd","onClickConnectStart","onClickConnectEnd","nodesDraggable","autoPanOnNodeFocus","nodesConnectable","nodesFocusable","edgesFocusable","edgesReconnectable","elevateNodesOnSelect","elevateEdgesOnSelect","minZoom","maxZoom","nodeExtent","onNodesChange","onEdgesChange","elementsSelectable","connectionMode","snapGrid","snapToGrid","translateExtent","connectOnClick","defaultEdgeOptions","fitView","fitViewOptions","onNodesDelete","onEdgesDelete","onDelete","onNodeDrag","onNodeDragStart","onNodeDragStop","onSelectionDrag","onSelectionDragStart","onSelectionDragStop","onMoveStart","onMove","onMoveEnd","noPanClassName","nodeOrigin","autoPanOnConnect","autoPanOnNodeDrag","onError","connectionRadius","isValidConnection","selectNodesOnDrag","nodeDragThreshold","connectionDragThreshold","onBeforeDelete","debug","autoPanSpeed","ariaLabelConfig","zIndexMode"],Ih=[...z1,"rfId"],R1=t=>({setNodes:t.setNodes,setEdges:t.setEdges,setMinZoom:t.setMinZoom,setMaxZoom:t.setMaxZoom,setTranslateExtent:t.setTranslateExtent,setNodeExtent:t.setNodeExtent,reset:t.reset,setDefaultNodesAndEdges:t.setDefaultNodesAndEdges}),Th={translateExtent:so,nodeOrigin:cg,minZoom:.5,maxZoom:2,elementsSelectable:!0,noPanClassName:"nopan",rfId:"1"};function L1(t){const{setNodes:r,setEdges:o,setMinZoom:l,setMaxZoom:u,setTranslateExtent:c,setNodeExtent:f,reset:h,setDefaultNodesAndEdges:p}=Ie(R1,Ve),y=$e();G.useEffect(()=>(p(t.defaultNodes,t.defaultEdges),()=>{m.current=Th,h()}),[]);const m=G.useRef(Th);return G.useEffect(()=>{for(const v of Ih){const g=t[v],w=m.current[v];g!==w&&(typeof t[v]>"u"||(v==="nodes"?r(g):v==="edges"?o(g):v==="minZoom"?l(g):v==="maxZoom"?u(g):v==="translateExtent"?c(g):v==="nodeExtent"?f(g):v==="ariaLabelConfig"?y.setState({ariaLabelConfig:yw(g)}):v==="fitView"?y.setState({fitViewQueued:g}):v==="fitViewOptions"?y.setState({fitViewOptions:g}):y.setState({[v]:g})))}m.current=t},Ih.map(v=>t[v])),null}function zh(){return typeof window>"u"||!window.matchMedia?null:window.matchMedia("(prefers-color-scheme: dark)")}function j1(t){var l;const[r,o]=G.useState(t==="system"?null:t);return G.useEffect(()=>{if(t!=="system"){o(t);return}const u=zh(),c=()=>o(u!=null&&u.matches?"dark":"light");return c(),u==null||u.addEventListener("change",c),()=>{u==null||u.removeEventListener("change",c)}},[t]),r!==null?r:(l=zh())!=null&&l.matches?"dark":"light"}const Rh=typeof document<"u"?document:null;function co(t=null,r={target:Rh,actInsideInputWithModifier:!0}){const[o,l]=G.useState(!1),u=G.useRef(!1),c=G.useRef(new Set([])),[f,h]=G.useMemo(()=>{if(t!==null){const y=(Array.isArray(t)?t:[t]).filter(v=>typeof v=="string").map(v=>v.replace(/\+/g,` -`).replace(` - -`,` -+`).split(` -`)),m=y.reduce((v,g)=>v.concat(...g),[]);return[y,m]}return[[],[]]},[t]);return G.useEffect(()=>{const p=(r==null?void 0:r.target)??Rh,y=(r==null?void 0:r.actInsideInputWithModifier)??!0;if(t!==null){const m=w=>{var N,E;if(u.current=w.ctrlKey||w.metaKey||w.shiftKey||w.altKey,(!u.current||u.current&&!y)&&Up(w))return!1;const M=jh(w.code,h);if(c.current.add(w[M]),Lh(f,c.current,!1)){const R=((E=(N=w.composedPath)==null?void 0:N.call(w))==null?void 0:E[0])||w.target,_=(R==null?void 0:R.nodeName)==="BUTTON"||(R==null?void 0:R.nodeName)==="A";r.preventDefault!==!1&&(u.current||!_)&&w.preventDefault(),l(!0)}},v=w=>{const S=jh(w.code,h);Lh(f,c.current,!0)?(l(!1),c.current.clear()):c.current.delete(w[S]),w.key==="Meta"&&c.current.clear(),u.current=!1},g=()=>{c.current.clear(),l(!1)};return p==null||p.addEventListener("keydown",m),p==null||p.addEventListener("keyup",v),window.addEventListener("blur",g),window.addEventListener("contextmenu",g),()=>{p==null||p.removeEventListener("keydown",m),p==null||p.removeEventListener("keyup",v),window.removeEventListener("blur",g),window.removeEventListener("contextmenu",g)}}},[t,l]),o}function Lh(t,r,o){return t.filter(l=>o||l.length===r.size).some(l=>l.every(u=>r.has(u)))}function jh(t,r){return r.includes(t)?"code":"key"}const A1=()=>{const t=$e();return G.useMemo(()=>({zoomIn:async r=>{const{panZoom:o}=t.getState();return o?o.scaleBy(1.2,r):!1},zoomOut:async r=>{const{panZoom:o}=t.getState();return o?o.scaleBy(1/1.2,r):!1},zoomTo:async(r,o)=>{const{panZoom:l}=t.getState();return l?l.scaleTo(r,o):!1},getZoom:()=>t.getState().transform[2],setViewport:async(r,o)=>{const{transform:[l,u,c],panZoom:f}=t.getState();return f?(await f.setViewport({x:r.x??l,y:r.y??u,zoom:r.zoom??c},o),!0):!1},getViewport:()=>{const[r,o,l]=t.getState().transform;return{x:r,y:o,zoom:l}},setCenter:async(r,o,l)=>t.getState().setCenter(r,o,l),fitBounds:async(r,o)=>{const{width:l,height:u,minZoom:c,maxZoom:f,panZoom:h}=t.getState(),p=nc(r,l,u,c,f,(o==null?void 0:o.padding)??.1);return h?(await h.setViewport(p,{duration:o==null?void 0:o.duration,ease:o==null?void 0:o.ease,interpolate:o==null?void 0:o.interpolate}),!0):!1},screenToFlowPosition:(r,o={})=>{const{transform:l,snapGrid:u,snapToGrid:c,domNode:f}=t.getState();if(!f)return r;const{x:h,y:p}=f.getBoundingClientRect(),y={x:r.x-h,y:r.y-p},m=o.snapGrid??u,v=o.snapToGrid??c;return vo(y,l,v,m)},flowToScreenPosition:r=>{const{transform:o,domNode:l}=t.getState();if(!l)return r;const{x:u,y:c}=l.getBoundingClientRect(),f=ii(r,o);return{x:f.x+u,y:f.y+c}}}),[])};function fg(t,r){const o=[],l=new Map,u=[];for(const c of t)if(c.type==="add"){u.push(c);continue}else if(c.type==="remove"||c.type==="replace")l.set(c.id,[c]);else{const f=l.get(c.id);f?f.push(c):l.set(c.id,[c])}for(const c of r){const f=l.get(c.id);if(!f){o.push(c);continue}if(f[0].type==="remove")continue;if(f[0].type==="replace"){o.push({...f[0].item});continue}const h={...c};for(const p of f)$1(p,h);o.push(h)}return u.length&&u.forEach(c=>{c.index!==void 0?o.splice(c.index,0,{...c.item}):o.push({...c.item})}),o}function $1(t,r){switch(t.type){case"select":{r.selected=t.selected;break}case"position":{typeof t.position<"u"&&(r.position=t.position),typeof t.dragging<"u"&&(r.dragging=t.dragging);break}case"dimensions":{typeof t.dimensions<"u"&&(r.measured={...t.dimensions},t.setAttributes&&((t.setAttributes===!0||t.setAttributes==="width")&&(r.width=t.dimensions.width),(t.setAttributes===!0||t.setAttributes==="height")&&(r.height=t.dimensions.height))),typeof t.resizing=="boolean"&&(r.resizing=t.resizing);break}}}function D1(t,r){return fg(t,r)}function O1(t,r){return fg(t,r)}function fr(t,r){return{id:t,type:"select",selected:r}}function qr(t,r=new Set,o=!1){const l=[];for(const[u,c]of t){const f=r.has(u);!(c.selected===void 0&&!f)&&c.selected!==f&&(o&&(c.selected=f),l.push(fr(c.id,f)))}return l}function Ah({items:t=[],lookup:r}){var u;const o=[],l=new Map(t.map(c=>[c.id,c]));for(const[c,f]of t.entries()){const h=r.get(f.id),p=((u=h==null?void 0:h.internals)==null?void 0:u.userNode)??h;p!==void 0&&p!==f&&o.push({id:f.id,item:f,type:"replace"}),p===void 0&&o.push({item:f,type:"add",index:c})}for(const[c]of r)l.get(c)===void 0&&o.push({id:c,type:"remove"});return o}function $h(t){return{id:t.id,type:"remove"}}const F1=Fp();function H1(t,r,o={}){return Ew(t,r,{...o,onError:o.onError??F1})}const Dh=t=>uw(t),V1=t=>jp(t);function dg(t){return G.forwardRef(t)}const hg=typeof window<"u"?G.useLayoutEffect:G.useEffect;function Oh(t){const[r,o]=G.useState(BigInt(0)),[l]=G.useState(()=>B1(()=>o(u=>u+BigInt(1))));return hg(()=>{const u=l.get();u.length&&(t(u),l.reset())},[r]),l}function B1(t){let r=[];return{get:()=>r,reset:()=>{r=[]},push:o=>{r.push(o),t()}}}const pg=G.createContext(null);function U1({children:t}){const r=$e(),o=G.useCallback(h=>{const{nodes:p=[],setNodes:y,hasDefaultNodes:m,onNodesChange:v,nodeLookup:g,fitViewQueued:w,onNodesChangeMiddlewareMap:S}=r.getState();let M=p;for(const E of h)M=typeof E=="function"?E(M):E;let N=Ah({items:M,lookup:g});for(const E of S.values())N=E(N);m&&y(M),N.length>0?v==null||v(N):w&&window.requestAnimationFrame(()=>{const{fitViewQueued:E,nodes:R,setNodes:_}=r.getState();E&&_(R)})},[]),l=Oh(o),u=G.useCallback(h=>{const{edges:p=[],setEdges:y,hasDefaultEdges:m,onEdgesChange:v,edgeLookup:g}=r.getState();let w=p;for(const S of h)w=typeof S=="function"?S(w):S;m?y(w):v&&v(Ah({items:w,lookup:g}))},[]),c=Oh(u),f=G.useMemo(()=>({nodeQueue:l,edgeQueue:c}),[]);return P.jsx(pg.Provider,{value:f,children:t})}function W1(){const t=G.useContext(pg);if(!t)throw new Error("useBatchContext must be used within a BatchProvider");return t}const b1=t=>!!t.panZoom;function ac(){const t=A1(),r=$e(),o=W1(),l=Ie(b1),u=G.useMemo(()=>{const c=v=>r.getState().nodeLookup.get(v),f=v=>{o.nodeQueue.push(v)},h=v=>{o.edgeQueue.push(v)},p=v=>{var E,R;const{nodeLookup:g,nodeOrigin:w}=r.getState(),S=Dh(v)?v:g.get(v.id),M=S.parentId?Vp(S.position,S.measured,S.parentId,g,w):S.position,N={...S,position:M,width:((E=S.measured)==null?void 0:E.width)??S.width,height:((R=S.measured)==null?void 0:R.height)??S.height};return uo(N)},y=(v,g,w={replace:!1})=>{f(S=>S.map(M=>{if(M.id===v){const N=typeof g=="function"?g(M):g;return w.replace&&Dh(N)?N:{...M,...N}}return M}))},m=(v,g,w={replace:!1})=>{h(S=>S.map(M=>{if(M.id===v){const N=typeof g=="function"?g(M):g;return w.replace&&V1(N)?N:{...M,...N}}return M}))};return{getNodes:()=>r.getState().nodes.map(v=>({...v})),getNode:v=>{var g;return(g=c(v))==null?void 0:g.internals.userNode},getInternalNode:c,getEdges:()=>{const{edges:v=[]}=r.getState();return v.map(g=>({...g}))},getEdge:v=>r.getState().edgeLookup.get(v),setNodes:f,setEdges:h,addNodes:v=>{const g=Array.isArray(v)?v:[v];o.nodeQueue.push(w=>[...w,...g])},addEdges:v=>{const g=Array.isArray(v)?v:[v];o.edgeQueue.push(w=>[...w,...g])},toObject:()=>{const{nodes:v=[],edges:g=[],transform:w}=r.getState(),[S,M,N]=w;return{nodes:v.map(E=>({...E})),edges:g.map(E=>({...E})),viewport:{x:S,y:M,zoom:N}}},deleteElements:async({nodes:v=[],edges:g=[]})=>{const{nodes:w,edges:S,onNodesDelete:M,onEdgesDelete:N,triggerNodeChanges:E,triggerEdgeChanges:R,onDelete:_,onBeforeDelete:I}=r.getState(),{nodes:W,edges:$}=await hw({nodesToRemove:v,edgesToRemove:g,nodes:w,edges:S,onBeforeDelete:I}),V=$.length>0,X=W.length>0;if(V){const K=$.map($h);N==null||N($),R(K)}if(X){const K=W.map($h);M==null||M(W),E(K)}return(X||V)&&(_==null||_({nodes:W,edges:$})),{deletedNodes:W,deletedEdges:$}},getIntersectingNodes:(v,g=!0,w)=>{const S=uh(v),M=S?v:p(v),N=w!==void 0;return M?(w||r.getState().nodes).filter(E=>{const R=r.getState().nodeLookup.get(E.id);if(R&&!S&&(E.id===v.id||!R.internals.positionAbsolute))return!1;const _=uo(N?E:R),I=sl(_,M);return g&&I>0||I>=_.width*_.height||I>=M.width*M.height}):[]},isNodeIntersecting:(v,g,w=!0)=>{const M=uh(v)?v:p(v);if(!M)return!1;const N=sl(M,g);return w&&N>0||N>=g.width*g.height||N>=M.width*M.height},updateNode:y,updateNodeData:(v,g,w={replace:!1})=>{y(v,S=>{const M=typeof g=="function"?g(S):g;return w.replace?{...S,data:M}:{...S,data:{...S.data,...M}}},w)},updateEdge:m,updateEdgeData:(v,g,w={replace:!1})=>{m(v,S=>{const M=typeof g=="function"?g(S):g;return w.replace?{...S,data:M}:{...S,data:{...S.data,...M}}},w)},getNodesBounds:v=>{const{nodeLookup:g,nodeOrigin:w}=r.getState();return aw(v,{nodeLookup:g,nodeOrigin:w})},getHandleConnections:({type:v,id:g,nodeId:w})=>{var S;return Array.from(((S=r.getState().connectionLookup.get(`${w}-${v}${g?`-${g}`:""}`))==null?void 0:S.values())??[])},getNodeConnections:({type:v,handleId:g,nodeId:w})=>{var S;return Array.from(((S=r.getState().connectionLookup.get(`${w}${v?g?`-${v}-${g}`:`-${v}`:""}`))==null?void 0:S.values())??[])},fitView:async v=>{const g=r.getState().fitViewResolver??mw();return r.setState({fitViewQueued:!0,fitViewOptions:v,fitViewResolver:g}),o.nodeQueue.push(w=>[...w]),g.promise}}},[]);return G.useMemo(()=>({...u,...t,viewportInitialized:l}),[l])}const Fh=t=>t.selected,Y1=typeof window<"u"?window:void 0;function X1({deleteKeyCode:t,multiSelectionKeyCode:r}){const o=$e(),{deleteElements:l}=ac(),u=co(t,{actInsideInputWithModifier:!1}),c=co(r,{target:Y1});G.useEffect(()=>{if(u){const{edges:f,nodes:h}=o.getState();l({nodes:h.filter(Fh),edges:f.filter(Fh)}),o.setState({nodesSelectionActive:!1})}},[u]),G.useEffect(()=>{o.setState({multiSelectionActive:c})},[c])}function Q1(t){const r=$e();G.useEffect(()=>{const o=()=>{var u,c,f,h;if(!t.current||!(((c=(u=t.current).checkVisibility)==null?void 0:c.call(u))??!0))return!1;const l=rc(t.current);(l.height===0||l.width===0)&&((h=(f=r.getState()).onError)==null||h.call(f,"004",Yt.error004())),r.setState({width:l.width||500,height:l.height||500})};if(t.current){o(),window.addEventListener("resize",o);const l=new ResizeObserver(()=>o());return l.observe(t.current),()=>{window.removeEventListener("resize",o),l&&t.current&&l.unobserve(t.current)}}},[])}const xl={position:"absolute",width:"100%",height:"100%",top:0,left:0},G1=t=>({userSelectionActive:t.userSelectionActive,lib:t.lib,connectionInProgress:t.connection.inProgress});function K1({onPaneContextMenu:t,zoomOnScroll:r=!0,zoomOnPinch:o=!0,panOnScroll:l=!1,panActivationKeyPressed:u,panOnScrollSpeed:c=.5,panOnScrollMode:f=pr.Free,zoomOnDoubleClick:h=!0,panOnDrag:p=!0,defaultViewport:y,translateExtent:m,minZoom:v,maxZoom:g,zoomActivationKeyCode:w,preventScrolling:S=!0,children:M,noWheelClassName:N,noPanClassName:E,onViewportChange:R,isControlledViewport:_,paneClickDistance:I,selectionOnDrag:W}){const $=$e(),V=G.useRef(null),{userSelectionActive:X,lib:K,connectionInProgress:te}=Ie(G1,Ve),Z=co(w),ee=G.useRef();Q1(V);const J=G.useCallback(k=>{R==null||R({x:k[0],y:k[1],zoom:k[2]}),_||$.setState({transform:k})},[R,_]);return G.useEffect(()=>{if(V.current){ee.current=Jw({domNode:V.current,minZoom:v,maxZoom:g,translateExtent:m,viewport:y,onDraggingChange:U=>$.setState(A=>A.paneDragging===U?A:{paneDragging:U}),onPanZoomStart:(U,A)=>{const{onViewportChangeStart:j,onMoveStart:F}=$.getState();F==null||F(U,A),j==null||j(A)},onPanZoom:(U,A)=>{const{onViewportChange:j,onMove:F}=$.getState();F==null||F(U,A),j==null||j(A)},onPanZoomEnd:(U,A)=>{const{onViewportChangeEnd:j,onMoveEnd:F}=$.getState();F==null||F(U,A),j==null||j(A)}});const{x:k,y:B,zoom:H}=ee.current.getViewport();return $.setState({panZoom:ee.current,transform:[k,B,H],domNode:V.current.closest(".react-flow")}),()=>{var U;(U=ee.current)==null||U.destroy()}}},[]),G.useEffect(()=>{var k;(k=ee.current)==null||k.update({onPaneContextMenu:t,zoomOnScroll:r,zoomOnPinch:o,panOnScroll:l,panActivationKeyPressed:u,panOnScrollSpeed:c,panOnScrollMode:f,zoomOnDoubleClick:h,panOnDrag:p,zoomActivationKeyPressed:Z,preventScrolling:S,noPanClassName:E,userSelectionActive:X,noWheelClassName:N,lib:K,onTransformChange:J,connectionInProgress:te,selectionOnDrag:W,paneClickDistance:I})},[t,r,o,l,u,c,f,h,p,Z,S,E,X,N,K,J,te,W,I]),P.jsx("div",{className:"react-flow__renderer",ref:V,style:xl,children:M})}const q1=t=>({userSelectionActive:t.userSelectionActive,userSelectionRect:t.userSelectionRect});function Z1(){const{userSelectionActive:t,userSelectionRect:r}=Ie(q1,Ve);return t&&r?P.jsx("div",{className:"react-flow__selection react-flow__container",style:{width:r.width,height:r.height,transform:`translate(${r.x}px, ${r.y}px)`}}):null}const Ia=(t,r)=>o=>{o.target===r.current&&(t==null||t(o))},J1=t=>({userSelectionActive:t.userSelectionActive,elementsSelectable:t.elementsSelectable,dragging:t.paneDragging,panBy:t.panBy,autoPanSpeed:t.autoPanSpeed});function eS({isSelecting:t,selectionKeyPressed:r,selectionMode:o=lo.Full,panOnDrag:l,autoPanOnSelection:u,paneClickDistance:c,selectionOnDrag:f,onSelectionStart:h,onSelectionEnd:p,onPaneClick:y,onPaneContextMenu:m,onPaneScroll:v,onPaneMouseEnter:g,onPaneMouseMove:w,onPaneMouseLeave:S,children:M}){const N=G.useRef(0),E=$e(),{userSelectionActive:R,elementsSelectable:_,dragging:I,panBy:W,autoPanSpeed:$}=Ie(J1,Ve),V=_&&(t||R),X=G.useRef(null),K=G.useRef(),te=G.useRef(new Set),Z=G.useRef(new Set),ee=G.useRef(!1),J=G.useRef(!1),k=G.useRef({x:0,y:0}),B=G.useRef(!1),H=Q=>{if(J.current||ee.current||E.getState().connection.inProgress){J.current=!1,ee.current=!1;return}y==null||y(Q),E.getState().resetSelectedElements(),E.setState({nodesSelectionActive:!1})},U=Q=>{if(Array.isArray(l)&&(l!=null&&l.includes(2))){Q.preventDefault();return}m==null||m(Q)},A=v?Q=>v(Q):void 0,j=Q=>{J.current&&(Q.stopPropagation(),J.current=!1)},F=Q=>{var Re,ot;if(Q.pointerType==="touch"&&l!==!1&&!r)return;const{domNode:le,transform:pe}=E.getState();if(K.current=le==null?void 0:le.getBoundingClientRect(),!K.current)return;const we=Q.target===X.current;if(!we&&!!Q.target.closest(".nokey")||!t||!(f&&we||r)||Q.button!==0||!Q.isPrimary)return;(ot=(Re=Q.target)==null?void 0:Re.setPointerCapture)==null||ot.call(Re,Q.pointerId),J.current=!1;const{x:ke,y:Ce}=bt(Q.nativeEvent,K.current),Me=vo({x:ke,y:Ce},pe);E.setState({userSelectionRect:{width:0,height:0,startX:Me.x,startY:Me.y,x:ke,y:Ce}}),we||(Q.stopPropagation(),Q.preventDefault())};function C(Q,le){const{userSelectionRect:pe}=E.getState();if(!pe)return;const{transform:we,nodeLookup:ve,edgeLookup:me,connectionLookup:ke,triggerNodeChanges:Ce,triggerEdgeChanges:Me,defaultEdgeOptions:Re}=E.getState(),ot={x:pe.startX,y:pe.startY},{x:ut,y:Je}=ii(ot,we),et={startX:ot.x,startY:ot.y,x:Qat.id)),Z.current=new Set;const Kt=(Re==null?void 0:Re.selectable)??!0;for(const at of te.current){const Ct=ke.get(at);if(Ct)for(const{edgeId:yt}of Ct.values()){const Mt=me.get(yt);Mt&&(Mt.selectable??Kt)&&Z.current.add(yt)}}if(!ah(sn,te.current)){const at=qr(ve,te.current,!0);Ce(at)}if(!ah(Gt,Z.current)){const at=qr(me,Z.current);Me(at)}E.setState({userSelectionRect:et,userSelectionActive:!0,nodesSelectionActive:!1})}function z(){if(!u||!K.current)return;const[Q,le]=tc(k.current,K.current,$);W({x:Q,y:le}).then(pe=>{if(!J.current||!pe){N.current=requestAnimationFrame(z);return}const{x:we,y:ve}=k.current;C(we,ve),N.current=requestAnimationFrame(z)})}const ne=()=>{cancelAnimationFrame(N.current),N.current=0,B.current=!1};G.useEffect(()=>()=>ne(),[]);const ie=Q=>{const{userSelectionRect:le,transform:pe,resetSelectedElements:we}=E.getState();if(!K.current||!le)return;const{x:ve,y:me}=bt(Q.nativeEvent,K.current);k.current={x:ve,y:me};const ke=ii({x:le.startX,y:le.startY},pe);if(!J.current){const Ce=r?0:c;if(Math.hypot(ve-ke.x,me-ke.y)<=Ce)return;we(),h==null||h(Q)}J.current=!0,B.current||(z(),B.current=!0),C(ve,me)},ce=Q=>{var le,pe;if(!V){Q.target===X.current&&E.getState().connection.inProgress&&(ee.current=!0);return}Q.button===0&&((pe=(le=Q.target)==null?void 0:le.releasePointerCapture)==null||pe.call(le,Q.pointerId),!R&&Q.target===X.current&&E.getState().userSelectionRect&&(H==null||H(Q)),E.setState({userSelectionActive:!1,userSelectionRect:null}),J.current&&(p==null||p(Q),E.setState({nodesSelectionActive:te.current.size>0})),ne())},O=Q=>{var le,pe;(pe=(le=Q.target)==null?void 0:le.releasePointerCapture)==null||pe.call(le,Q.pointerId),ne()},re=l===!0||Array.isArray(l)&&l.includes(0);return P.jsxs("div",{className:be(["react-flow__pane",{draggable:re,dragging:I,selection:t}]),onClick:V?void 0:Ia(H,X),onContextMenu:Ia(U,X),onWheel:Ia(A,X),onPointerEnter:V?void 0:g,onPointerMove:V?ie:w,onPointerUp:ce,onPointerCancel:V?O:void 0,onPointerDownCapture:V?F:void 0,onClickCapture:V?j:void 0,onPointerLeave:S,ref:X,style:xl,children:[M,P.jsx(Z1,{})]})}function ba({id:t,store:r,unselect:o=!1,nodeRef:l}){const{addSelectedNodes:u,unselectNodesAndEdges:c,multiSelectionActive:f,nodeLookup:h,onError:p}=r.getState(),y=h.get(t);if(!y){p==null||p("012",Yt.error012(t));return}r.setState({nodesSelectionActive:!1}),y.selected?(o||y.selected&&f)&&(c({nodes:[y],edges:[]}),requestAnimationFrame(()=>{var m;return(m=l==null?void 0:l.current)==null?void 0:m.blur()})):u([t])}function gg({nodeRef:t,disabled:r=!1,noDragClassName:o,handleSelector:l,nodeId:u,isSelectable:c,nodeClickDistance:f}){const h=$e(),[p,y]=G.useState(!1),m=G.useRef();return G.useEffect(()=>{if(!r)return m.current=Fw({getStoreItems:()=>h.getState(),onNodeMouseDown:v=>{ba({id:v,store:h,nodeRef:t})},onDragStart:()=>{y(!0)},onDragStop:()=>{y(!1)}}),()=>{var v;(v=m.current)==null||v.destroy(),m.current=void 0}},[r,h,t]),G.useEffect(()=>{r||!t.current||!m.current||m.current.update({noDragClassName:o,handleSelector:l,domNode:t.current,isSelectable:c,nodeId:u,nodeClickDistance:f})},[o,l,r,c,t,u,f]),p}const tS=t=>r=>r.selected&&(r.draggable||t&&typeof r.draggable>"u");function mg(){const t=$e();return G.useCallback(o=>{const{nodeExtent:l,snapToGrid:u,snapGrid:c,nodesDraggable:f,onError:h,updateNodePositions:p,nodeLookup:y,nodeOrigin:m}=t.getState(),v=new Map,g=tS(f),w=u?c[0]:5,S=u?c[1]:5,M=o.direction.x*w*o.factor,N=o.direction.y*S*o.factor;for(const[,E]of y){if(!g(E))continue;let R={x:E.internals.positionAbsolute.x+M,y:E.internals.positionAbsolute.y+N};u&&(R=yo(R,c));const{position:_,positionAbsolute:I}=Ap({nodeId:E.id,nextPosition:R,nodeLookup:y,nodeExtent:l,nodeOrigin:m,onError:h});E.position=_,E.internals.positionAbsolute=I,v.set(E.id,E)}p(v)},[])}const cc=G.createContext(null),nS=cc.Provider;cc.Consumer;const yg=()=>G.useContext(cc),rS=t=>({connectOnClick:t.connectOnClick,noPanClassName:t.noPanClassName,rfId:t.rfId}),vg=G.createContext(null);function iS({children:t}){const r=Ie(rS,Ve);return P.jsx(vg.Provider,{value:r,children:t})}function oS(){const t=G.useContext(vg);if(!t)throw new Error("useHandleConfig must be used within a HandleConfigProvider");return t}const sS={connectingFrom:!1,connectingTo:!1,clickConnecting:!1,isPossibleEndHandle:!0,connectionInProcess:!1,clickConnectionInProcess:!1,valid:!1},lS=(t,r,o)=>l=>{const{connectionClickStartHandle:u,connectionMode:c,connection:f}=l,{fromHandle:h,toHandle:p,isValid:y}=f;if(!h&&!u)return sS;const m=(p==null?void 0:p.nodeId)===t&&(p==null?void 0:p.id)===r&&(p==null?void 0:p.type)===o;return{connectingFrom:(h==null?void 0:h.nodeId)===t&&(h==null?void 0:h.id)===r&&(h==null?void 0:h.type)===o,connectingTo:m,clickConnecting:(u==null?void 0:u.nodeId)===t&&(u==null?void 0:u.id)===r&&(u==null?void 0:u.type)===o,isPossibleEndHandle:c===ni.Strict?(h==null?void 0:h.type)!==o:t!==(h==null?void 0:h.nodeId)||r!==(h==null?void 0:h.id),connectionInProcess:!!h,clickConnectionInProcess:!!u,valid:m&&y}};function uS({type:t="source",position:r=xe.Top,isValidConnection:o,isConnectable:l=!0,isConnectableStart:u=!0,isConnectableEnd:c=!0,id:f,onConnect:h,children:p,className:y,onMouseDown:m,onTouchStart:v,...g},w){var B,H;const S=f||null,M=t==="target",N=$e(),E=yg(),{connectOnClick:R,noPanClassName:_,rfId:I}=oS(),{connectingFrom:W,connectingTo:$,clickConnecting:V,isPossibleEndHandle:X,connectionInProcess:K,clickConnectionInProcess:te,valid:Z}=Ie(lS(E,S,t),Ve);E||(H=(B=N.getState()).onError)==null||H.call(B,"010",Yt.error010());const ee=U=>{const{defaultEdgeOptions:A,onConnect:j,hasDefaultEdges:F}=N.getState(),C={...A,...U};if(F){const{edges:z,setEdges:ne,onError:ie}=N.getState();ne(H1(C,z,{onError:ie}))}j==null||j(C),h==null||h(C)},J=U=>{if(!E)return;const A=Wp(U.nativeEvent);if(u&&(A&&U.button===0||!A)){const j=N.getState();Wa.onPointerDown(U.nativeEvent,{handleDomNode:U.currentTarget,autoPanOnConnect:j.autoPanOnConnect,connectionMode:j.connectionMode,connectionRadius:j.connectionRadius,domNode:j.domNode,nodeLookup:j.nodeLookup,lib:j.lib,isTarget:M,handleId:S,nodeId:E,flowId:j.rfId,panBy:j.panBy,cancelConnection:j.cancelConnection,onConnectStart:j.onConnectStart,onConnectEnd:(...F)=>{var C,z;return(z=(C=N.getState()).onConnectEnd)==null?void 0:z.call(C,...F)},updateConnection:j.updateConnection,onConnect:ee,isValidConnection:o||((...F)=>{var C,z;return((z=(C=N.getState()).isValidConnection)==null?void 0:z.call(C,...F))??!0}),getTransform:()=>N.getState().transform,getFromHandle:()=>N.getState().connection.fromHandle,autoPanSpeed:j.autoPanSpeed,dragThreshold:j.connectionDragThreshold})}A?m==null||m(U):v==null||v(U)},k=U=>{const{onClickConnectStart:A,onClickConnectEnd:j,connectionClickStartHandle:F,connectionMode:C,isValidConnection:z,lib:ne,rfId:ie,nodeLookup:ce,connection:O}=N.getState();if(!E||!F&&!u)return;if(!F){A==null||A(U.nativeEvent,{nodeId:E,handleId:S,handleType:t}),N.setState({connectionClickStartHandle:{nodeId:E,type:t,id:S}});return}const re=Bp(U.target),Q=o||z,{connection:le,isValid:pe}=Wa.isValid(U.nativeEvent,{handle:{nodeId:E,id:S,type:t},connectionMode:C,fromNodeId:F.nodeId,fromHandleId:F.id||null,fromType:F.type,isValidConnection:Q,flowId:ie,doc:re,lib:ne,nodeLookup:ce});pe&&le&&ee(le);const we=structuredClone(O);delete we.inProgress,we.toPosition=we.toHandle?we.toHandle.position:null,j==null||j(U,we),N.setState({connectionClickStartHandle:null})};return P.jsx("div",{"data-handleid":S,"data-nodeid":E,"data-handlepos":r,"data-id":`${I}-${E}-${S}-${t}`,className:be(["react-flow__handle",`react-flow__handle-${r}`,"nodrag",_,y,{source:!M,target:M,connectable:l,connectablestart:u,connectableend:c,clickconnecting:V,connectingfrom:W,connectingto:$,valid:Z,connectionindicator:l&&(!K||X)&&(K||te?c:u)}]),onMouseDown:J,onTouchStart:J,onClick:R?k:void 0,ref:w,...g,children:p})}const ll=G.memo(dg(uS));function aS({data:t,isConnectable:r,sourcePosition:o=xe.Bottom}){return P.jsxs(P.Fragment,{children:[t==null?void 0:t.label,P.jsx(ll,{type:"source",position:o,isConnectable:r})]})}function cS({data:t,isConnectable:r,targetPosition:o=xe.Top,sourcePosition:l=xe.Bottom}){return P.jsxs(P.Fragment,{children:[P.jsx(ll,{type:"target",position:o,isConnectable:r}),t==null?void 0:t.label,P.jsx(ll,{type:"source",position:l,isConnectable:r})]})}function fS(){return null}function dS({data:t,isConnectable:r,targetPosition:o=xe.Top}){return P.jsxs(P.Fragment,{children:[P.jsx(ll,{type:"target",position:o,isConnectable:r}),t==null?void 0:t.label]})}const ul={ArrowUp:{x:0,y:-1},ArrowDown:{x:0,y:1},ArrowLeft:{x:-1,y:0},ArrowRight:{x:1,y:0}},Hh={input:aS,default:cS,output:dS,group:fS};function hS(t){var r,o,l,u;return t.internals.handleBounds===void 0?{width:t.width??t.initialWidth??((r=t.style)==null?void 0:r.width),height:t.height??t.initialHeight??((o=t.style)==null?void 0:o.height)}:{width:t.width??((l=t.style)==null?void 0:l.width),height:t.height??((u=t.style)==null?void 0:u.height)}}const pS=t=>{const{width:r,height:o,x:l,y:u}=mo(t.nodeLookup,{filter:c=>!!c.selected});return{width:Wt(r)?r:null,height:Wt(o)?o:null,userSelectionActive:t.userSelectionActive,transformString:`translate(${t.transform[0]}px,${t.transform[1]}px) scale(${t.transform[2]}) translate(${l}px,${u}px)`}};function gS({onSelectionContextMenu:t,noPanClassName:r,disableKeyboardA11y:o}){const l=$e(),{width:u,height:c,transformString:f,userSelectionActive:h}=Ie(pS,Ve),p=mg(),y=G.useRef(null);G.useEffect(()=>{var w;o||(w=y.current)==null||w.focus({preventScroll:!0})},[o]);const m=!h&&u!==null&&c!==null;if(gg({nodeRef:y,disabled:!m}),!m)return null;const v=t?w=>{const S=l.getState().nodes.filter(M=>M.selected);t(w,S)}:void 0,g=w=>{Object.prototype.hasOwnProperty.call(ul,w.key)&&(w.preventDefault(),p({direction:ul[w.key],factor:w.shiftKey?4:1}))};return P.jsx("div",{className:be(["react-flow__nodesselection","react-flow__container",r]),style:{transform:f},children:P.jsx("div",{ref:y,className:"react-flow__nodesselection-rect",onContextMenu:v,tabIndex:o?void 0:-1,onKeyDown:o?void 0:g,style:{width:u,height:c}})})}const Vh=typeof window<"u"?window:void 0,mS=t=>({nodesSelectionActive:t.nodesSelectionActive,userSelectionActive:t.userSelectionActive});function xg({children:t,onPaneClick:r,onPaneMouseEnter:o,onPaneMouseMove:l,onPaneMouseLeave:u,onPaneContextMenu:c,onPaneScroll:f,paneClickDistance:h,deleteKeyCode:p,selectionKeyCode:y,selectionOnDrag:m,selectionMode:v,onSelectionStart:g,onSelectionEnd:w,multiSelectionKeyCode:S,panActivationKeyCode:M,zoomActivationKeyCode:N,elementsSelectable:E,zoomOnScroll:R,zoomOnPinch:_,panOnScroll:I,panOnScrollSpeed:W,panOnScrollMode:$,zoomOnDoubleClick:V,panOnDrag:X,autoPanOnSelection:K,defaultViewport:te,translateExtent:Z,minZoom:ee,maxZoom:J,preventScrolling:k,onSelectionContextMenu:B,noWheelClassName:H,noPanClassName:U,disableKeyboardA11y:A,onViewportChange:j,isControlledViewport:F}){const{nodesSelectionActive:C,userSelectionActive:z}=Ie(mS,Ve),ne=co(y,{target:Vh}),ie=co(M,{target:Vh}),ce=ie||X,O=ie||I,re=m&&ce!==!0,Q=ne||z||re;return X1({deleteKeyCode:p,multiSelectionKeyCode:S}),P.jsx(K1,{onPaneContextMenu:c,elementsSelectable:E,zoomOnScroll:R,zoomOnPinch:_,panOnScroll:O,panActivationKeyPressed:ie,panOnScrollSpeed:W,panOnScrollMode:$,zoomOnDoubleClick:V,panOnDrag:!ne&&ce,defaultViewport:te,translateExtent:Z,minZoom:ee,maxZoom:J,zoomActivationKeyCode:N,preventScrolling:k,noWheelClassName:H,noPanClassName:U,onViewportChange:j,isControlledViewport:F,paneClickDistance:h,selectionOnDrag:re,children:P.jsxs(eS,{onSelectionStart:g,onSelectionEnd:w,onPaneClick:r,onPaneMouseEnter:o,onPaneMouseMove:l,onPaneMouseLeave:u,onPaneContextMenu:c,onPaneScroll:f,panOnDrag:ce,autoPanOnSelection:K,isSelecting:!!Q,selectionMode:v,selectionKeyPressed:ne,paneClickDistance:h,selectionOnDrag:re,children:[t,C&&P.jsx(gS,{onSelectionContextMenu:B,noPanClassName:U,disableKeyboardA11y:A})]})})}xg.displayName="FlowRenderer";const yS=G.memo(xg),vS=t=>r=>t?ec(r.nodeLookup,{x:0,y:0,width:r.width,height:r.height},r.transform,!0).map(o=>o.id):Array.from(r.nodeLookup.keys());function xS(t){return Ie(G.useCallback(vS(t),[t]),Ve)}const wS=t=>t.updateNodeInternals;function SS(){const t=Ie(wS),[r]=G.useState(()=>typeof ResizeObserver>"u"?null:new ResizeObserver(o=>{const l=new Map;o.forEach(u=>{const c=u.target.getAttribute("data-id");l.set(c,{id:c,nodeElement:u.target,force:!0})}),t(l)}));return G.useEffect(()=>()=>{r==null||r.disconnect()},[r]),r}function _S({node:t,nodeType:r,hasDimensions:o,resizeObserver:l}){const u=$e(),c=G.useRef(null),f=G.useRef(null),h=G.useRef(t.sourcePosition),p=G.useRef(t.targetPosition),y=G.useRef(r),m=o&&!!t.internals.handleBounds;return G.useEffect(()=>{c.current&&!t.hidden&&(!m||f.current!==c.current)&&(f.current&&(l==null||l.unobserve(f.current)),l==null||l.observe(c.current),f.current=c.current)},[m,t.hidden]),G.useEffect(()=>()=>{f.current&&(l==null||l.unobserve(f.current),f.current=null)},[]),G.useEffect(()=>{if(c.current){const v=y.current!==r,g=h.current!==t.sourcePosition,w=p.current!==t.targetPosition;(v||g||w)&&(y.current=r,h.current=t.sourcePosition,p.current=t.targetPosition,u.getState().updateNodeInternals(new Map([[t.id,{id:t.id,nodeElement:c.current,force:!0}]])))}},[t.id,r,t.sourcePosition,t.targetPosition]),c}function ES({id:t,onClick:r,onMouseEnter:o,onMouseMove:l,onMouseLeave:u,onContextMenu:c,onDoubleClick:f,nodesDraggable:h,elementsSelectable:p,nodesConnectable:y,nodesFocusable:m,resizeObserver:v,noDragClassName:g,noPanClassName:w,disableKeyboardA11y:S,rfId:M,nodeTypes:N,nodeClickDistance:E,onError:R}){const{node:_,internals:I,isParent:W}=Ie(Q=>{const le=Q.nodeLookup.get(t),pe=Q.parentLookup.has(t);return{node:le,internals:le.internals,isParent:pe}},Ve);let $=_.type||"default",V=(N==null?void 0:N[$])||Hh[$];V===void 0&&(R==null||R("003",Yt.error003($)),$="default",V=(N==null?void 0:N.default)||Hh.default);const X=!!(_.draggable||h&&typeof _.draggable>"u"),K=!!(_.selectable||p&&typeof _.selectable>"u"),te=!!(_.connectable||y&&typeof _.connectable>"u"),Z=!!(_.focusable||m&&typeof _.focusable>"u"),ee=$e(),J=Hp(_),k=_S({node:_,nodeType:$,hasDimensions:J,resizeObserver:v}),B=gg({nodeRef:k,disabled:_.hidden||!X,noDragClassName:g,handleSelector:_.dragHandle,nodeId:t,isSelectable:K,nodeClickDistance:E}),H=mg();if(_.hidden)return null;const U=Qt(_),A=hS(_),j=K||X||r||o||l||u,F=o?Q=>o(Q,{...I.userNode}):void 0,C=l?Q=>l(Q,{...I.userNode}):void 0,z=u?Q=>u(Q,{...I.userNode}):void 0,ne=c?Q=>c(Q,{...I.userNode}):void 0,ie=f?Q=>f(Q,{...I.userNode}):void 0,ce=Q=>{const{selectNodesOnDrag:le,nodeDragThreshold:pe}=ee.getState();K&&(!le||!X||pe>0)&&ba({id:t,store:ee,nodeRef:k}),r&&r(Q,{...I.userNode})},O=Q=>{if(!(Up(Q.nativeEvent)||S)){if(Tp.includes(Q.key)&&K){const le=Q.key==="Escape";ba({id:t,store:ee,unselect:le,nodeRef:k})}else if(X&&_.selected&&Object.prototype.hasOwnProperty.call(ul,Q.key)){Q.preventDefault();const{ariaLabelConfig:le}=ee.getState();ee.setState({ariaLiveMessage:le["node.a11yDescription.ariaLiveMessage"]({direction:Q.key.replace("Arrow","").toLowerCase(),x:~~I.positionAbsolute.x,y:~~I.positionAbsolute.y})}),H({direction:ul[Q.key],factor:Q.shiftKey?4:1})}}},re=()=>{var ke;if(S||!((ke=k.current)!=null&&ke.matches(":focus-visible")))return;const{transform:Q,width:le,height:pe,autoPanOnNodeFocus:we,setCenter:ve}=ee.getState();if(!we)return;ec(new Map([[t,_]]),{x:0,y:0,width:le,height:pe},Q,!0).length>0||ve(_.position.x+U.width/2,_.position.y+U.height/2,{zoom:Q[2]})};return P.jsx("div",{className:be(["react-flow__node",`react-flow__node-${$}`,{[w]:X},_.className,{selected:_.selected,selectable:K,parent:W,draggable:X,dragging:B}]),ref:k,style:{zIndex:I.z,transform:`translate(${I.positionAbsolute.x}px,${I.positionAbsolute.y}px)`,pointerEvents:j?"all":"none",visibility:J?"visible":"hidden",..._.style,...A},"data-id":t,"data-testid":`rf__node-${t}`,onMouseEnter:F,onMouseMove:C,onMouseLeave:z,onContextMenu:ne,onClick:ce,onDoubleClick:ie,onKeyDown:Z?O:void 0,tabIndex:Z?0:void 0,onFocus:Z?re:void 0,role:_.ariaRole??(Z?"group":void 0),"aria-roledescription":"node","aria-describedby":S?void 0:`${ug}-${M}`,"aria-label":_.ariaLabel,..._.domAttributes,children:P.jsx(nS,{value:t,children:P.jsx(V,{id:t,data:_.data,type:$,positionAbsoluteX:I.positionAbsolute.x,positionAbsoluteY:I.positionAbsolute.y,selected:_.selected??!1,selectable:K,draggable:X,deletable:_.deletable??!0,isConnectable:te,sourcePosition:_.sourcePosition,targetPosition:_.targetPosition,dragging:B,dragHandle:_.dragHandle,zIndex:I.z,parentId:_.parentId,...U})})})}var kS=G.memo(ES);const NS=t=>({nodesConnectable:t.nodesConnectable,nodesFocusable:t.nodesFocusable,elementsSelectable:t.elementsSelectable,onError:t.onError});function wg(t){const{nodesConnectable:r,nodesFocusable:o,elementsSelectable:l,onError:u}=Ie(NS,Ve),c=xS(t.onlyRenderVisibleElements),f=SS();return P.jsx("div",{className:"react-flow__nodes",style:xl,children:c.map(h=>P.jsx(kS,{id:h,nodeTypes:t.nodeTypes,nodeExtent:t.nodeExtent,onClick:t.onNodeClick,onMouseEnter:t.onNodeMouseEnter,onMouseMove:t.onNodeMouseMove,onMouseLeave:t.onNodeMouseLeave,onContextMenu:t.onNodeContextMenu,onDoubleClick:t.onNodeDoubleClick,noDragClassName:t.noDragClassName,noPanClassName:t.noPanClassName,rfId:t.rfId,disableKeyboardA11y:t.disableKeyboardA11y,resizeObserver:f,nodesDraggable:t.nodesDraggable??!0,nodesConnectable:r,nodesFocusable:o,elementsSelectable:l,nodeClickDistance:t.nodeClickDistance,onError:u},h))})}wg.displayName="NodeRenderer";const CS=G.memo(wg);function MS(t){return Ie(G.useCallback(o=>{if(!t)return o.edges.map(u=>u.id);const l=[];if(o.width&&o.height)for(const u of o.edges){const c=o.nodeLookup.get(u.source),f=o.nodeLookup.get(u.target);c&&f&&ww({sourceNode:c,targetNode:f,width:o.width,height:o.height,transform:o.transform})&&l.push(u.id)}return l},[t]),Ve)}const PS=({color:t="none",strokeWidth:r=1})=>{const o={strokeWidth:r,...t&&{stroke:t}};return P.jsx("polyline",{className:"arrow",style:o,strokeLinecap:"round",fill:"none",strokeLinejoin:"round",points:"-5,-4 0,0 -5,4"})},IS=({color:t="none",strokeWidth:r=1})=>{const o={strokeWidth:r,...t&&{stroke:t,fill:t}};return P.jsx("polyline",{className:"arrowclosed",style:o,strokeLinecap:"round",strokeLinejoin:"round",points:"-5,-4 0,0 -5,4 -5,-4"})},Bh={[il.Arrow]:PS,[il.ArrowClosed]:IS};function TS(t){const r=$e();return G.useMemo(()=>{var u,c;return Object.prototype.hasOwnProperty.call(Bh,t)?Bh[t]:((c=(u=r.getState()).onError)==null||c.call(u,"009",Yt.error009(t)),null)},[t])}const zS=({id:t,type:r,color:o,width:l=12.5,height:u=12.5,markerUnits:c="strokeWidth",strokeWidth:f,orient:h="auto-start-reverse"})=>{const p=TS(r);return p?P.jsx("marker",{className:"react-flow__arrowhead",id:t,markerWidth:`${l}`,markerHeight:`${u}`,viewBox:"-10 -10 20 20",markerUnits:c,orient:h,refX:"0",refY:"0",children:P.jsx(p,{color:o,strokeWidth:f})}):null},Sg=({defaultColor:t,rfId:r})=>{const o=Ie(c=>c.edges),l=Ie(c=>c.defaultEdgeOptions),u=G.useMemo(()=>Pw(o,{id:r,defaultColor:t,defaultMarkerStart:l==null?void 0:l.markerStart,defaultMarkerEnd:l==null?void 0:l.markerEnd}),[o,l,r,t]);return u.length?P.jsx("svg",{className:"react-flow__marker","aria-hidden":"true",children:P.jsx("defs",{children:u.map(c=>P.jsx(zS,{id:c.id,type:c.type,color:c.color,width:c.width,height:c.height,markerUnits:c.markerUnits,strokeWidth:c.strokeWidth,orient:c.orient},c.id))})}):null};Sg.displayName="MarkerDefinitions";var RS=G.memo(Sg);function _g({x:t,y:r,label:o,labelStyle:l,labelShowBg:u=!0,labelBgStyle:c,labelBgPadding:f=[2,4],labelBgBorderRadius:h=2,children:p,className:y,...m}){const[v,g]=G.useState({x:1,y:0,width:0,height:0}),w=be(["react-flow__edge-textwrapper",y]),S=G.useRef(null);return G.useEffect(()=>{if(S.current){const M=S.current.getBBox();g({x:M.x,y:M.y,width:M.width,height:M.height})}},[o]),o?P.jsxs("g",{transform:`translate(${t-v.width/2} ${r-v.height/2})`,className:w,visibility:v.width?"visible":"hidden",...m,children:[u&&P.jsx("rect",{width:v.width+2*f[0],x:-f[0],y:-f[1],height:v.height+2*f[1],className:"react-flow__edge-textbg",style:c,rx:h,ry:h}),P.jsx("text",{className:"react-flow__edge-text",y:v.height/2,dy:"0.3em",ref:S,style:l,children:o}),p]}):null}_g.displayName="EdgeText";const LS=G.memo(_g);function wl({path:t,labelX:r,labelY:o,label:l,labelStyle:u,labelShowBg:c,labelBgStyle:f,labelBgPadding:h,labelBgBorderRadius:p,interactionWidth:y=20,...m}){return P.jsxs(P.Fragment,{children:[P.jsx("path",{...m,d:t,fill:"none",className:be(["react-flow__edge-path",m.className])}),y?P.jsx("path",{d:t,fill:"none",strokeOpacity:0,strokeWidth:y,className:"react-flow__edge-interaction"}):null,l&&Wt(r)&&Wt(o)?P.jsx(LS,{x:r,y:o,label:l,labelStyle:u,labelShowBg:c,labelBgStyle:f,labelBgPadding:h,labelBgBorderRadius:p}):null]})}function Uh({pos:t,x1:r,y1:o,x2:l,y2:u}){return t===xe.Left||t===xe.Right?[.5*(r+l),o]:[r,.5*(o+u)]}function Eg({sourceX:t,sourceY:r,sourcePosition:o=xe.Bottom,targetX:l,targetY:u,targetPosition:c=xe.Top}){const[f,h]=Uh({pos:o,x1:t,y1:r,x2:l,y2:u}),[p,y]=Uh({pos:c,x1:l,y1:u,x2:t,y2:r}),[m,v,g,w]=bp({sourceX:t,sourceY:r,targetX:l,targetY:u,sourceControlX:f,sourceControlY:h,targetControlX:p,targetControlY:y});return[`M${t},${r} C${f},${h} ${p},${y} ${l},${u}`,m,v,g,w]}function kg(t){return G.memo(({id:r,sourceX:o,sourceY:l,targetX:u,targetY:c,sourcePosition:f,targetPosition:h,label:p,labelStyle:y,labelShowBg:m,labelBgStyle:v,labelBgPadding:g,labelBgBorderRadius:w,style:S,markerEnd:M,markerStart:N,interactionWidth:E})=>{const[R,_,I]=Eg({sourceX:o,sourceY:l,sourcePosition:f,targetX:u,targetY:c,targetPosition:h}),W=t.isInternal?void 0:r;return P.jsx(wl,{id:W,path:R,labelX:_,labelY:I,label:p,labelStyle:y,labelShowBg:m,labelBgStyle:v,labelBgPadding:g,labelBgBorderRadius:w,style:S,markerEnd:M,markerStart:N,interactionWidth:E})})}const jS=kg({isInternal:!1}),Ng=kg({isInternal:!0});jS.displayName="SimpleBezierEdge";Ng.displayName="SimpleBezierEdgeInternal";function Cg(t){return G.memo(({id:r,sourceX:o,sourceY:l,targetX:u,targetY:c,label:f,labelStyle:h,labelShowBg:p,labelBgStyle:y,labelBgPadding:m,labelBgBorderRadius:v,style:g,sourcePosition:w=xe.Bottom,targetPosition:S=xe.Top,markerEnd:M,markerStart:N,pathOptions:E,interactionWidth:R})=>{const[_,I,W]=Va({sourceX:o,sourceY:l,sourcePosition:w,targetX:u,targetY:c,targetPosition:S,borderRadius:E==null?void 0:E.borderRadius,offset:E==null?void 0:E.offset,stepPosition:E==null?void 0:E.stepPosition}),$=t.isInternal?void 0:r;return P.jsx(wl,{id:$,path:_,labelX:I,labelY:W,label:f,labelStyle:h,labelShowBg:p,labelBgStyle:y,labelBgPadding:m,labelBgBorderRadius:v,style:g,markerEnd:M,markerStart:N,interactionWidth:R})})}const Mg=Cg({isInternal:!1}),Pg=Cg({isInternal:!0});Mg.displayName="SmoothStepEdge";Pg.displayName="SmoothStepEdgeInternal";function Ig(t){return G.memo(({id:r,...o})=>{var u;const l=t.isInternal?void 0:r;return P.jsx(Mg,{...o,id:l,pathOptions:G.useMemo(()=>{var c;return{borderRadius:0,offset:(c=o.pathOptions)==null?void 0:c.offset}},[(u=o.pathOptions)==null?void 0:u.offset])})})}const AS=Ig({isInternal:!1}),Tg=Ig({isInternal:!0});AS.displayName="StepEdge";Tg.displayName="StepEdgeInternal";function zg(t){return G.memo(({id:r,sourceX:o,sourceY:l,targetX:u,targetY:c,label:f,labelStyle:h,labelShowBg:p,labelBgStyle:y,labelBgPadding:m,labelBgBorderRadius:v,style:g,markerEnd:w,markerStart:S,interactionWidth:M})=>{const[N,E,R]=Qp({sourceX:o,sourceY:l,targetX:u,targetY:c}),_=t.isInternal?void 0:r;return P.jsx(wl,{id:_,path:N,labelX:E,labelY:R,label:f,labelStyle:h,labelShowBg:p,labelBgStyle:y,labelBgPadding:m,labelBgBorderRadius:v,style:g,markerEnd:w,markerStart:S,interactionWidth:M})})}const $S=zg({isInternal:!1}),Rg=zg({isInternal:!0});$S.displayName="StraightEdge";Rg.displayName="StraightEdgeInternal";function Lg(t){return G.memo(({id:r,sourceX:o,sourceY:l,targetX:u,targetY:c,sourcePosition:f=xe.Bottom,targetPosition:h=xe.Top,label:p,labelStyle:y,labelShowBg:m,labelBgStyle:v,labelBgPadding:g,labelBgBorderRadius:w,style:S,markerEnd:M,markerStart:N,pathOptions:E,interactionWidth:R})=>{const[_,I,W]=Yp({sourceX:o,sourceY:l,sourcePosition:f,targetX:u,targetY:c,targetPosition:h,curvature:E==null?void 0:E.curvature}),$=t.isInternal?void 0:r;return P.jsx(wl,{id:$,path:_,labelX:I,labelY:W,label:p,labelStyle:y,labelShowBg:m,labelBgStyle:v,labelBgPadding:g,labelBgBorderRadius:w,style:S,markerEnd:M,markerStart:N,interactionWidth:R})})}const DS=Lg({isInternal:!1}),jg=Lg({isInternal:!0});DS.displayName="BezierEdge";jg.displayName="BezierEdgeInternal";const Wh={default:jg,straight:Rg,step:Tg,smoothstep:Pg,simplebezier:Ng},bh={sourceX:null,sourceY:null,targetX:null,targetY:null,sourcePosition:null,targetPosition:null,zIndex:void 0},OS=(t,r,o)=>o===xe.Left?t-r:o===xe.Right?t+r:t,FS=(t,r,o)=>o===xe.Top?t-r:o===xe.Bottom?t+r:t,Yh="react-flow__edgeupdater";function Xh({position:t,centerX:r,centerY:o,radius:l=10,onMouseDown:u,onMouseEnter:c,onMouseOut:f,type:h}){return P.jsx("circle",{onMouseDown:u,onMouseEnter:c,onMouseOut:f,className:be([Yh,`${Yh}-${h}`]),cx:OS(r,l,t),cy:FS(o,l,t),r:l,stroke:"transparent",fill:"transparent"})}function HS({isReconnectable:t,reconnectRadius:r,edge:o,sourceX:l,sourceY:u,targetX:c,targetY:f,sourcePosition:h,targetPosition:p,onReconnect:y,onReconnectStart:m,onReconnectEnd:v,setReconnecting:g,setUpdateHover:w}){const S=$e(),M=(I,W)=>{if(I.button!==0)return;const{autoPanOnConnect:$,domNode:V,connectionMode:X,connectionRadius:K,lib:te,onConnectStart:Z,cancelConnection:ee,nodeLookup:J,rfId:k,panBy:B,updateConnection:H}=S.getState(),U=W.type==="target",A=(C,z)=>{g(!1),v==null||v(C,o,W.type,z)},j=C=>y==null?void 0:y(o,C),F=(C,z)=>{g(!0),m==null||m(I,o,W.type),Z==null||Z(C,z)};Wa.onPointerDown(I.nativeEvent,{autoPanOnConnect:$,connectionMode:X,connectionRadius:K,domNode:V,handleId:W.id,nodeId:W.nodeId,nodeLookup:J,isTarget:U,edgeUpdaterType:W.type,lib:te,flowId:k,cancelConnection:ee,panBy:B,isValidConnection:(...C)=>{var z,ne;return((ne=(z=S.getState()).isValidConnection)==null?void 0:ne.call(z,...C))??!0},onConnect:j,onConnectStart:F,onConnectEnd:(...C)=>{var z,ne;return(ne=(z=S.getState()).onConnectEnd)==null?void 0:ne.call(z,...C)},onReconnectEnd:A,updateConnection:H,getTransform:()=>S.getState().transform,getFromHandle:()=>S.getState().connection.fromHandle,dragThreshold:S.getState().connectionDragThreshold,handleDomNode:I.currentTarget})},N=I=>M(I,{nodeId:o.target,id:o.targetHandle??null,type:"target"}),E=I=>M(I,{nodeId:o.source,id:o.sourceHandle??null,type:"source"}),R=()=>w(!0),_=()=>w(!1);return P.jsxs(P.Fragment,{children:[(t===!0||t==="source")&&P.jsx(Xh,{position:h,centerX:l,centerY:u,radius:r,onMouseDown:N,onMouseEnter:R,onMouseOut:_,type:"source"}),(t===!0||t==="target")&&P.jsx(Xh,{position:p,centerX:c,centerY:f,radius:r,onMouseDown:E,onMouseEnter:R,onMouseOut:_,type:"target"})]})}function VS({id:t,edgesFocusable:r,edgesReconnectable:o,elementsSelectable:l,onClick:u,onDoubleClick:c,onContextMenu:f,onMouseEnter:h,onMouseMove:p,onMouseLeave:y,reconnectRadius:m,onReconnect:v,onReconnectStart:g,onReconnectEnd:w,rfId:S,edgeTypes:M,noPanClassName:N,onError:E,disableKeyboardA11y:R}){let _=Ie(ve=>ve.edgeLookup.get(t));const I=Ie(ve=>ve.defaultEdgeOptions);_=I?{...I,..._}:_;let W=_.type||"default",$=(M==null?void 0:M[W])||Wh[W];$===void 0&&(E==null||E("011",Yt.error011(W)),W="default",$=(M==null?void 0:M.default)||Wh.default);const V=!!(_.focusable||r&&typeof _.focusable>"u"),X=typeof v<"u"&&(_.reconnectable||o&&typeof _.reconnectable>"u"),K=!!(_.selectable||l&&typeof _.selectable>"u"),te=G.useRef(null),[Z,ee]=G.useState(!1),[J,k]=G.useState(!1),B=$e(),{zIndex:H=_.zIndex,sourceX:U,sourceY:A,targetX:j,targetY:F,sourcePosition:C,targetPosition:z}=Ie(G.useCallback(ve=>{const me=ve.nodeLookup.get(_.source),ke=ve.nodeLookup.get(_.target);if(!me||!ke)return bh;const Ce=Mw({id:t,sourceNode:me,targetNode:ke,sourceHandle:_.sourceHandle||null,targetHandle:_.targetHandle||null,connectionMode:ve.connectionMode,onError:E}),Me=xw({selected:_.selected,zIndex:_.zIndex,sourceNode:me,targetNode:ke,elevateOnSelect:ve.elevateEdgesOnSelect,zIndexMode:ve.zIndexMode});return{...Ce||bh,zIndex:Me}},[_.source,_.target,_.sourceHandle,_.targetHandle,_.selected,_.zIndex,E]),Ve),ne=G.useMemo(()=>_.markerStart?`url('#${Ba(_.markerStart,S)}')`:void 0,[_.markerStart,S]),ie=G.useMemo(()=>_.markerEnd?`url('#${Ba(_.markerEnd,S)}')`:void 0,[_.markerEnd,S]);if(_.hidden||U===null||A===null||j===null||F===null)return null;const ce=ve=>{var Me;const{addSelectedEdges:me,unselectNodesAndEdges:ke,multiSelectionActive:Ce}=B.getState();K&&(B.setState({nodesSelectionActive:!1}),_.selected&&Ce?(ke({nodes:[],edges:[_]}),(Me=te.current)==null||Me.blur()):me([t])),u&&u(ve,_)},O=c?ve=>{c(ve,{..._})}:void 0,re=f?ve=>{f(ve,{..._})}:void 0,Q=h?ve=>{h(ve,{..._})}:void 0,le=p?ve=>{p(ve,{..._})}:void 0,pe=y?ve=>{y(ve,{..._})}:void 0,we=ve=>{var me;if(!R&&Tp.includes(ve.key)&&K){const{unselectNodesAndEdges:ke,addSelectedEdges:Ce}=B.getState();ve.key==="Escape"?((me=te.current)==null||me.blur(),ke({edges:[_]})):Ce([t])}};return P.jsx("svg",{style:{zIndex:H},children:P.jsxs("g",{className:be(["react-flow__edge",`react-flow__edge-${W}`,_.className,N,{selected:_.selected,animated:_.animated,inactive:!K&&!u,updating:Z,selectable:K}]),onClick:ce,onDoubleClick:O,onContextMenu:re,onMouseEnter:Q,onMouseMove:le,onMouseLeave:pe,onKeyDown:V?we:void 0,tabIndex:V?0:void 0,role:_.ariaRole??(V?"group":"img"),"aria-roledescription":"edge","data-id":t,"data-testid":`rf__edge-${t}`,"aria-label":_.ariaLabel===null?void 0:_.ariaLabel||`Edge from ${_.source} to ${_.target}`,"aria-describedby":V?`${ag}-${S}`:void 0,ref:te,..._.domAttributes,children:[!J&&P.jsx($,{id:t,source:_.source,target:_.target,type:_.type,selected:_.selected,animated:_.animated,selectable:K,deletable:_.deletable??!0,label:_.label,labelStyle:_.labelStyle,labelShowBg:_.labelShowBg,labelBgStyle:_.labelBgStyle,labelBgPadding:_.labelBgPadding,labelBgBorderRadius:_.labelBgBorderRadius,sourceX:U,sourceY:A,targetX:j,targetY:F,sourcePosition:C,targetPosition:z,data:_.data,style:_.style,sourceHandleId:_.sourceHandle,targetHandleId:_.targetHandle,markerStart:ne,markerEnd:ie,pathOptions:"pathOptions"in _?_.pathOptions:void 0,interactionWidth:_.interactionWidth}),X&&P.jsx(HS,{edge:_,isReconnectable:X,reconnectRadius:m,onReconnect:v,onReconnectStart:g,onReconnectEnd:w,sourceX:U,sourceY:A,targetX:j,targetY:F,sourcePosition:C,targetPosition:z,setUpdateHover:ee,setReconnecting:k})]})})}var BS=G.memo(VS);const US=t=>({edgesFocusable:t.edgesFocusable,edgesReconnectable:t.edgesReconnectable,elementsSelectable:t.elementsSelectable,connectionMode:t.connectionMode,onError:t.onError});function Ag({defaultMarkerColor:t,onlyRenderVisibleElements:r,rfId:o,edgeTypes:l,noPanClassName:u,onReconnect:c,onEdgeContextMenu:f,onEdgeMouseEnter:h,onEdgeMouseMove:p,onEdgeMouseLeave:y,onEdgeClick:m,reconnectRadius:v,onEdgeDoubleClick:g,onReconnectStart:w,onReconnectEnd:S,disableKeyboardA11y:M}){const{edgesFocusable:N,edgesReconnectable:E,elementsSelectable:R,onError:_}=Ie(US,Ve),I=MS(r);return P.jsxs("div",{className:"react-flow__edges",children:[P.jsx(RS,{defaultColor:t,rfId:o}),I.map(W=>P.jsx(BS,{id:W,edgesFocusable:N,edgesReconnectable:E,elementsSelectable:R,noPanClassName:u,onReconnect:c,onContextMenu:f,onMouseEnter:h,onMouseMove:p,onMouseLeave:y,onClick:m,reconnectRadius:v,onDoubleClick:g,onReconnectStart:w,onReconnectEnd:S,rfId:o,onError:_,edgeTypes:l,disableKeyboardA11y:M},W))]})}Ag.displayName="EdgeRenderer";const WS=G.memo(Ag),Qh=t=>`translate(${t[0]}px,${t[1]}px) scale(${t[2]})`;function bS({children:t}){const r=$e(),o=G.useRef(null),[l]=G.useState(()=>r.getState().transform);return hg(()=>{let u=null;const c=()=>{const f=r.getState().transform;u&&f[0]===u[0]&&f[1]===u[1]&&f[2]===u[2]||(u=f,o.current&&(o.current.style.transform=Qh(f)))};return c(),r.subscribe(c)},[r]),P.jsx("div",{ref:o,className:"react-flow__viewport xyflow__viewport react-flow__container",style:{transform:Qh(l)},children:t})}function YS(t){const r=ac(),o=G.useRef(!1);G.useEffect(()=>{!o.current&&r.viewportInitialized&&t&&(setTimeout(()=>t(r),1),o.current=!0)},[t,r.viewportInitialized])}const XS=t=>{var r;return(r=t.panZoom)==null?void 0:r.syncViewport};function QS(t){const r=Ie(XS),o=$e();return G.useEffect(()=>{t&&(r==null||r(t),o.setState({transform:[t.x,t.y,t.zoom]}))},[t,r]),null}function GS(t){return t.connection.inProgress?{...t.connection,to:vo(t.connection.to,t.transform)}:{...t.connection}}function KS(t){return GS}function qS(t){const r=KS();return Ie(r,Ve)}const ZS=t=>({nodesConnectable:t.nodesConnectable,isValid:t.connection.isValid,inProgress:t.connection.inProgress,width:t.width,height:t.height});function JS({containerStyle:t,style:r,type:o,component:l}){const{nodesConnectable:u,width:c,height:f,isValid:h,inProgress:p}=Ie(ZS,Ve);return!(c&&u&&p)?null:P.jsx("svg",{style:t,width:c,height:f,className:"react-flow__connectionline react-flow__container",children:P.jsx("g",{className:be(["react-flow__connection",Lp(h)]),children:P.jsx($g,{style:r,type:o,CustomComponent:l,isValid:h})})})}const $g=({style:t,type:r=Wn.Bezier,CustomComponent:o,isValid:l})=>{const{inProgress:u,from:c,fromNode:f,fromHandle:h,fromPosition:p,to:y,toNode:m,toHandle:v,toPosition:g,pointer:w}=qS();if(!u)return;if(o)return P.jsx(o,{connectionLineType:r,connectionLineStyle:t,fromNode:f,fromHandle:h,fromX:c.x,fromY:c.y,toX:y.x,toY:y.y,fromPosition:p,toPosition:g,connectionStatus:Lp(l),toNode:m,toHandle:v,pointer:w});let S="";const M={sourceX:c.x,sourceY:c.y,sourcePosition:p,targetX:y.x,targetY:y.y,targetPosition:g};switch(r){case Wn.Bezier:[S]=Yp(M);break;case Wn.SimpleBezier:[S]=Eg(M);break;case Wn.Step:[S]=Va({...M,borderRadius:0});break;case Wn.SmoothStep:[S]=Va(M);break;default:[S]=Qp(M)}return P.jsx("path",{d:S,fill:"none",className:"react-flow__connection-path",style:t})};$g.displayName="ConnectionLine";const e_={};function Gh(t=e_){G.useRef(t),$e(),G.useEffect(()=>{},[t])}function t_(){$e(),G.useRef(!1),G.useEffect(()=>{},[])}function Dg({nodeTypes:t,edgeTypes:r,onInit:o,onNodeClick:l,onEdgeClick:u,onNodeDoubleClick:c,onEdgeDoubleClick:f,onNodeMouseEnter:h,onNodeMouseMove:p,onNodeMouseLeave:y,onNodeContextMenu:m,onSelectionContextMenu:v,onSelectionStart:g,onSelectionEnd:w,connectionLineType:S,connectionLineStyle:M,connectionLineComponent:N,connectionLineContainerStyle:E,selectionKeyCode:R,selectionOnDrag:_,selectionMode:I,multiSelectionKeyCode:W,panActivationKeyCode:$,zoomActivationKeyCode:V,deleteKeyCode:X,onlyRenderVisibleElements:K,elementsSelectable:te,defaultViewport:Z,translateExtent:ee,minZoom:J,maxZoom:k,preventScrolling:B,defaultMarkerColor:H,zoomOnScroll:U,zoomOnPinch:A,panOnScroll:j,panOnScrollSpeed:F,panOnScrollMode:C,zoomOnDoubleClick:z,panOnDrag:ne,autoPanOnSelection:ie,onPaneClick:ce,onPaneMouseEnter:O,onPaneMouseMove:re,onPaneMouseLeave:Q,onPaneScroll:le,onPaneContextMenu:pe,paneClickDistance:we,nodeClickDistance:ve,onEdgeContextMenu:me,onEdgeMouseEnter:ke,onEdgeMouseMove:Ce,onEdgeMouseLeave:Me,reconnectRadius:Re,onReconnect:ot,onReconnectStart:ut,onReconnectEnd:Je,noDragClassName:et,noWheelClassName:sn,noPanClassName:Gt,disableKeyboardA11y:Kt,nodeExtent:at,rfId:Ct,viewport:yt,onViewportChange:Mt,nodesDraggable:wr}){return Gh(t),Gh(r),t_(),YS(o),QS(yt),P.jsx(yS,{onPaneClick:ce,onPaneMouseEnter:O,onPaneMouseMove:re,onPaneMouseLeave:Q,onPaneContextMenu:pe,onPaneScroll:le,paneClickDistance:we,deleteKeyCode:X,selectionKeyCode:R,selectionOnDrag:_,selectionMode:I,onSelectionStart:g,onSelectionEnd:w,multiSelectionKeyCode:W,panActivationKeyCode:$,zoomActivationKeyCode:V,elementsSelectable:te,zoomOnScroll:U,zoomOnPinch:A,zoomOnDoubleClick:z,panOnScroll:j,panOnScrollSpeed:F,panOnScrollMode:C,panOnDrag:ne,autoPanOnSelection:ie,defaultViewport:Z,translateExtent:ee,minZoom:J,maxZoom:k,onSelectionContextMenu:v,preventScrolling:B,noDragClassName:et,noWheelClassName:sn,noPanClassName:Gt,disableKeyboardA11y:Kt,onViewportChange:Mt,isControlledViewport:!!yt,children:P.jsxs(bS,{children:[P.jsx(WS,{edgeTypes:r,onEdgeClick:u,onEdgeDoubleClick:f,onReconnect:ot,onReconnectStart:ut,onReconnectEnd:Je,onlyRenderVisibleElements:K,onEdgeContextMenu:me,onEdgeMouseEnter:ke,onEdgeMouseMove:Ce,onEdgeMouseLeave:Me,reconnectRadius:Re,defaultMarkerColor:H,noPanClassName:Gt,disableKeyboardA11y:Kt,rfId:Ct}),P.jsx(JS,{style:M,type:S,component:N,containerStyle:E}),P.jsx("div",{className:"react-flow__edgelabel-renderer"}),P.jsx(CS,{nodeTypes:t,onNodeClick:l,onNodeDoubleClick:c,onNodeMouseEnter:h,onNodeMouseMove:p,onNodeMouseLeave:y,onNodeContextMenu:m,nodeClickDistance:ve,onlyRenderVisibleElements:K,noPanClassName:Gt,noDragClassName:et,disableKeyboardA11y:Kt,nodeExtent:at,rfId:Ct,nodesDraggable:wr}),P.jsx("div",{className:"react-flow__viewport-portal"})]})})}Dg.displayName="GraphView";const n_=G.memo(Dg),r_=Fp(),Kh=({nodes:t,edges:r,defaultNodes:o,defaultEdges:l,width:u,height:c,fitView:f,fitViewOptions:h,minZoom:p=.5,maxZoom:y=2,nodeOrigin:m,nodeExtent:v,zIndexMode:g="basic"}={})=>{const w=new Map,S=new Map,M=new Map,N=new Map,E=l??r??[],R=o??t??[],_=m??[0,0],I=v??so;qp(M,N,E);const{nodesInitialized:W}=Ua(R,w,S,{nodeOrigin:_,nodeExtent:I,zIndexMode:g});let $=[0,0,1];if(f&&u&&c){const V=mo(w,{filter:Z=>!!((Z.width||Z.initialWidth)&&(Z.height||Z.initialHeight))}),{x:X,y:K,zoom:te}=nc(V,u,c,p,y,(h==null?void 0:h.padding)??.1);$=[X,K,te]}return{rfId:"1",width:u??0,height:c??0,transform:$,nodes:R,nodesInitialized:W,nodeLookup:w,parentLookup:S,edges:E,edgeLookup:N,connectionLookup:M,onNodesChange:null,onEdgesChange:null,hasDefaultNodes:o!==void 0,hasDefaultEdges:l!==void 0,panZoom:null,minZoom:p,maxZoom:y,translateExtent:so,nodeExtent:I,nodesSelectionActive:!1,userSelectionActive:!1,userSelectionRect:null,connectionMode:ni.Strict,domNode:null,paneDragging:!1,noPanClassName:"nopan",nodeOrigin:_,nodeDragThreshold:1,connectionDragThreshold:1,snapGrid:[15,15],snapToGrid:!1,nodesDraggable:!0,nodesConnectable:!0,nodesFocusable:!0,edgesFocusable:!0,edgesReconnectable:!0,elementsSelectable:!0,elevateNodesOnSelect:!0,elevateEdgesOnSelect:!0,selectNodesOnDrag:!0,multiSelectionActive:!1,fitViewQueued:f??!1,fitViewOptions:h,fitViewResolver:null,connection:{...Rp},connectionClickStartHandle:null,connectOnClick:!0,ariaLiveMessage:"",autoPanOnConnect:!0,autoPanOnNodeDrag:!0,autoPanOnNodeFocus:!0,autoPanSpeed:15,connectionRadius:20,onError:r_,isValidConnection:void 0,onSelectionChangeHandlers:[],lib:"react",debug:!1,ariaLabelConfig:zp,zIndexMode:g,onNodesChangeMiddlewareMap:new Map,onEdgesChangeMiddlewareMap:new Map}},i_=({nodes:t,edges:r,defaultNodes:o,defaultEdges:l,width:u,height:c,fitView:f,fitViewOptions:h,minZoom:p,maxZoom:y,nodeOrigin:m,nodeExtent:v,zIndexMode:g})=>m1((w,S)=>{async function M(){const{nodeLookup:N,panZoom:E,fitViewOptions:R,fitViewResolver:_,width:I,height:W,minZoom:$,maxZoom:V}=S();E&&(await dw({nodes:N,width:I,height:W,panZoom:E,minZoom:$,maxZoom:V},R),_==null||_.resolve(!0),w({fitViewResolver:null}))}return{...Kh({nodes:t,edges:r,width:u,height:c,fitView:f,fitViewOptions:h,minZoom:p,maxZoom:y,nodeOrigin:m,nodeExtent:v,defaultNodes:o,defaultEdges:l,zIndexMode:g}),setNodes:N=>{const{nodeLookup:E,parentLookup:R,nodeOrigin:_,nodeExtent:I,elevateNodesOnSelect:W,fitViewQueued:$,zIndexMode:V,nodesSelectionActive:X}=S(),{nodesInitialized:K,hasSelectedNodes:te}=Ua(N,E,R,{nodeOrigin:_,nodeExtent:I,elevateNodesOnSelect:W,checkEquality:!0,zIndexMode:V}),Z=X&&te;$&&K?(M(),w({nodes:N,nodesInitialized:K,fitViewQueued:!1,fitViewOptions:void 0,nodesSelectionActive:Z})):w({nodes:N,nodesInitialized:K,nodesSelectionActive:Z})},setEdges:N=>{const{connectionLookup:E,edgeLookup:R}=S();qp(E,R,N),w({edges:N})},setDefaultNodesAndEdges:(N,E)=>{if(N){const{setNodes:R}=S();R(N),w({hasDefaultNodes:!0})}if(E){const{setEdges:R}=S();R(E),w({hasDefaultEdges:!0})}},updateNodeInternals:N=>{const{triggerNodeChanges:E,nodeLookup:R,parentLookup:_,domNode:I,nodeOrigin:W,nodeExtent:$,debug:V,fitViewQueued:X,zIndexMode:K}=S(),{changes:te,updatedInternals:Z}=Aw(N,R,_,I,W,$,K);Z&&(zw(R,_,{nodeOrigin:W,nodeExtent:$,zIndexMode:K}),X?(M(),w({fitViewQueued:!1,fitViewOptions:void 0})):w({}),(te==null?void 0:te.length)>0&&(V&&console.log("React Flow: trigger node changes",te),E==null||E(te)))},updateNodePositions:(N,E=!1)=>{const R=[];let _=[];const{nodeLookup:I,triggerNodeChanges:W,connection:$,updateConnection:V,onNodesChangeMiddlewareMap:X}=S();for(const[K,te]of N){const Z=I.get(K),ee=!!(Z!=null&&Z.expandParent&&(Z!=null&&Z.parentId)&&(te!=null&&te.position)),J={id:K,type:"position",position:ee?{x:Math.max(0,te.position.x),y:Math.max(0,te.position.y)}:te.position,dragging:E};if(Z&&$.inProgress&&$.fromNode.id===Z.id){const k=xr(Z,$.fromHandle,xe.Left,!0);V({...$,from:k})}ee&&Z.parentId&&R.push({id:K,parentId:Z.parentId,rect:{...te.internals.positionAbsolute,width:te.measured.width??0,height:te.measured.height??0}}),_.push(J)}if(R.length>0){const{parentLookup:K,nodeOrigin:te}=S(),Z=uc(R,I,K,te);_.push(...Z)}for(const K of X.values())_=K(_);W(_)},triggerNodeChanges:N=>{const{onNodesChange:E,setNodes:R,nodes:_,hasDefaultNodes:I,debug:W}=S();if(N!=null&&N.length){if(I){const $=D1(N,_);R($)}W&&console.log("React Flow: trigger node changes",N),E==null||E(N)}},triggerEdgeChanges:N=>{const{onEdgesChange:E,setEdges:R,edges:_,hasDefaultEdges:I,debug:W}=S();if(N!=null&&N.length){if(I){const $=O1(N,_);R($)}W&&console.log("React Flow: trigger edge changes",N),E==null||E(N)}},addSelectedNodes:N=>{const{multiSelectionActive:E,edgeLookup:R,nodeLookup:_,triggerNodeChanges:I,triggerEdgeChanges:W}=S();if(E){const $=N.map(V=>fr(V,!0));I($);return}I(qr(_,new Set([...N]),!0)),W(qr(R))},addSelectedEdges:N=>{const{multiSelectionActive:E,edgeLookup:R,nodeLookup:_,triggerNodeChanges:I,triggerEdgeChanges:W}=S();if(E){const $=N.map(V=>fr(V,!0));W($);return}W(qr(R,new Set([...N]))),I(qr(_,new Set,!0))},unselectNodesAndEdges:({nodes:N,edges:E}={})=>{const{edges:R,nodes:_,nodeLookup:I,triggerNodeChanges:W,triggerEdgeChanges:$}=S(),V=N||_,X=E||R,K=[];for(const Z of V){if(!Z.selected)continue;const ee=I.get(Z.id);ee&&(ee.selected=!1),K.push(fr(Z.id,!1))}const te=[];for(const Z of X)Z.selected&&te.push(fr(Z.id,!1));W(K),$(te)},setMinZoom:N=>{const{panZoom:E,maxZoom:R}=S();E==null||E.setScaleExtent([N,R]),w({minZoom:N})},setMaxZoom:N=>{const{panZoom:E,minZoom:R}=S();E==null||E.setScaleExtent([R,N]),w({maxZoom:N})},setTranslateExtent:N=>{var E;(E=S().panZoom)==null||E.setTranslateExtent(N),w({translateExtent:N})},resetSelectedElements:()=>{const{edges:N,nodes:E,triggerNodeChanges:R,triggerEdgeChanges:_,elementsSelectable:I}=S();if(!I)return;const W=E.reduce((V,X)=>X.selected?[...V,fr(X.id,!1)]:V,[]),$=N.reduce((V,X)=>X.selected?[...V,fr(X.id,!1)]:V,[]);R(W),_($)},setNodeExtent:N=>{const{nodes:E,nodeLookup:R,parentLookup:_,nodeOrigin:I,elevateNodesOnSelect:W,nodeExtent:$,zIndexMode:V}=S();N[0][0]===$[0][0]&&N[0][1]===$[0][1]&&N[1][0]===$[1][0]&&N[1][1]===$[1][1]||(Ua(E,R,_,{nodeOrigin:I,nodeExtent:N,elevateNodesOnSelect:W,checkEquality:!1,zIndexMode:V}),w({nodeExtent:N}))},panBy:N=>{const{transform:E,width:R,height:_,panZoom:I,translateExtent:W}=S();return $w({delta:N,panZoom:I,transform:E,translateExtent:W,width:R,height:_})},setCenter:async(N,E,R)=>{const{width:_,height:I,maxZoom:W,panZoom:$}=S();if(!$)return!1;const V=typeof(R==null?void 0:R.zoom)<"u"?R.zoom:W;return await $.setViewport({x:_/2-N*V,y:I/2-E*V,zoom:V},{duration:R==null?void 0:R.duration,ease:R==null?void 0:R.ease,interpolate:R==null?void 0:R.interpolate}),!0},cancelConnection:()=>{w({connection:{...Rp}})},updateConnection:N=>{w({connection:N})},reset:()=>w({...Kh()})}},Object.is);function Og({initialNodes:t,initialEdges:r,defaultNodes:o,defaultEdges:l,initialWidth:u,initialHeight:c,initialMinZoom:f,initialMaxZoom:h,initialFitViewOptions:p,fitView:y,nodeOrigin:m,nodeExtent:v,zIndexMode:g,children:w}){const[S]=G.useState(()=>i_({nodes:t,edges:r,defaultNodes:o,defaultEdges:l,width:u,height:c,fitView:y,minZoom:f,maxZoom:h,fitViewOptions:p,nodeOrigin:m,nodeExtent:v,zIndexMode:g}));return P.jsx(y1,{value:S,children:P.jsx(U1,{children:P.jsx(iS,{children:w})})})}function o_({children:t,nodes:r,edges:o,defaultNodes:l,defaultEdges:u,width:c,height:f,fitView:h,fitViewOptions:p,minZoom:y,maxZoom:m,nodeOrigin:v,nodeExtent:g,zIndexMode:w}){return G.useContext(yl)?P.jsx(P.Fragment,{children:t}):P.jsx(Og,{initialNodes:r,initialEdges:o,defaultNodes:l,defaultEdges:u,initialWidth:c,initialHeight:f,fitView:h,initialFitViewOptions:p,initialMinZoom:y,initialMaxZoom:m,nodeOrigin:v,nodeExtent:g,zIndexMode:w,children:t})}const s_={width:"100%",height:"100%",overflow:"hidden",position:"relative",zIndex:0};function l_({nodes:t,edges:r,defaultNodes:o,defaultEdges:l,className:u,nodeTypes:c,edgeTypes:f,onNodeClick:h,onEdgeClick:p,onInit:y,onMove:m,onMoveStart:v,onMoveEnd:g,onConnect:w,onConnectStart:S,onConnectEnd:M,onClickConnectStart:N,onClickConnectEnd:E,onNodeMouseEnter:R,onNodeMouseMove:_,onNodeMouseLeave:I,onNodeContextMenu:W,onNodeDoubleClick:$,onNodeDragStart:V,onNodeDrag:X,onNodeDragStop:K,onNodesDelete:te,onEdgesDelete:Z,onDelete:ee,onSelectionChange:J,onSelectionDragStart:k,onSelectionDrag:B,onSelectionDragStop:H,onSelectionContextMenu:U,onSelectionStart:A,onSelectionEnd:j,onBeforeDelete:F,connectionMode:C,connectionLineType:z=Wn.Bezier,connectionLineStyle:ne,connectionLineComponent:ie,connectionLineContainerStyle:ce,deleteKeyCode:O="Backspace",selectionKeyCode:re="Shift",selectionOnDrag:Q=!1,selectionMode:le=lo.Full,panActivationKeyCode:pe="Space",multiSelectionKeyCode:we=ao()?"Meta":"Control",zoomActivationKeyCode:ve=ao()?"Meta":"Control",snapToGrid:me,snapGrid:ke,onlyRenderVisibleElements:Ce=!1,selectNodesOnDrag:Me,nodesDraggable:Re,autoPanOnNodeFocus:ot,nodesConnectable:ut,nodesFocusable:Je,nodeOrigin:et=cg,edgesFocusable:sn,edgesReconnectable:Gt,elementsSelectable:Kt=!0,defaultViewport:at=T1,minZoom:Ct=.5,maxZoom:yt=2,translateExtent:Mt=so,preventScrolling:wr=!0,nodeExtent:ln,defaultMarkerColor:Yn="#b1b1b7",zoomOnScroll:Sl=!0,zoomOnPinch:xo=!0,panOnScroll:wo=!1,panOnScrollSpeed:_l=.5,panOnScrollMode:si=pr.Free,zoomOnDoubleClick:li=!0,panOnDrag:ui=!0,onPaneClick:ai,onPaneMouseEnter:ci,onPaneMouseMove:wn,onPaneMouseLeave:Sn,onPaneScroll:So,onPaneContextMenu:_o,paneClickDistance:Eo=1,nodeClickDistance:ko=0,children:No,onReconnect:fi,onReconnectStart:Co,onReconnectEnd:Xn,onEdgeContextMenu:di,onEdgeDoubleClick:Qn,onEdgeMouseEnter:El,onEdgeMouseMove:Gn,onEdgeMouseLeave:Sr,reconnectRadius:_r=10,onNodesChange:hi,onEdgesChange:kl,noDragClassName:Nl="nodrag",noWheelClassName:Cl="nowheel",noPanClassName:qt="nopan",fitView:pi,fitViewOptions:gi,connectOnClick:Ml,attributionPosition:Mo,proOptions:Po,defaultEdgeOptions:Io,elevateNodesOnSelect:To=!0,elevateEdgesOnSelect:Pl=!1,disableKeyboardA11y:zo=!1,autoPanOnConnect:Oe,autoPanOnNodeDrag:Il,autoPanOnSelection:mi=!0,autoPanSpeed:Ro,connectionRadius:Er,isValidConnection:Tl,onError:Lo,style:kr,id:vt,nodeDragThreshold:zl,connectionDragThreshold:xt,viewport:Rl,onViewportChange:Ll,width:jl,height:Nr,colorMode:Cr="light",debug:Kn,onScroll:un,ariaLabelConfig:Al,zIndexMode:jo="basic",...yi},Ao){const qn=vt||"1",Zn=j1(Cr),$l=G.useCallback(Mr=>{Mr.currentTarget.scrollTo({top:0,left:0,behavior:"instant"}),un==null||un(Mr)},[un]);return P.jsx("div",{"data-testid":"rf__wrapper",...yi,onScroll:$l,style:{...kr,...s_},ref:Ao,className:be(["react-flow",u,Zn]),id:vt,role:"application",children:P.jsxs(o_,{nodes:t,edges:r,width:jl,height:Nr,fitView:pi,fitViewOptions:gi,minZoom:Ct,maxZoom:yt,nodeOrigin:et,nodeExtent:ln,zIndexMode:jo,children:[P.jsx(L1,{nodes:t,edges:r,defaultNodes:o,defaultEdges:l,onConnect:w,onConnectStart:S,onConnectEnd:M,onClickConnectStart:N,onClickConnectEnd:E,nodesDraggable:Re,autoPanOnNodeFocus:ot,nodesConnectable:ut,nodesFocusable:Je,edgesFocusable:sn,edgesReconnectable:Gt,elementsSelectable:Kt,elevateNodesOnSelect:To,elevateEdgesOnSelect:Pl,minZoom:Ct,maxZoom:yt,nodeExtent:ln,onNodesChange:hi,onEdgesChange:kl,snapToGrid:me,snapGrid:ke,connectionMode:C,translateExtent:Mt,connectOnClick:Ml,defaultEdgeOptions:Io,fitView:pi,fitViewOptions:gi,onNodesDelete:te,onEdgesDelete:Z,onDelete:ee,onNodeDragStart:V,onNodeDrag:X,onNodeDragStop:K,onSelectionDrag:B,onSelectionDragStart:k,onSelectionDragStop:H,onMove:m,onMoveStart:v,onMoveEnd:g,noPanClassName:qt,nodeOrigin:et,rfId:qn,autoPanOnConnect:Oe,autoPanOnNodeDrag:Il,autoPanSpeed:Ro,onError:Lo,connectionRadius:Er,isValidConnection:Tl,selectNodesOnDrag:Me,nodeDragThreshold:zl,connectionDragThreshold:xt,onBeforeDelete:F,debug:Kn,ariaLabelConfig:Al,zIndexMode:jo}),P.jsx(n_,{onInit:y,onNodeClick:h,onEdgeClick:p,onNodeMouseEnter:R,onNodeMouseMove:_,onNodeMouseLeave:I,onNodeContextMenu:W,onNodeDoubleClick:$,nodeTypes:c,edgeTypes:f,connectionLineType:z,connectionLineStyle:ne,connectionLineComponent:ie,connectionLineContainerStyle:ce,selectionKeyCode:re,selectionOnDrag:Q,selectionMode:le,deleteKeyCode:O,multiSelectionKeyCode:we,panActivationKeyCode:pe,zoomActivationKeyCode:ve,onlyRenderVisibleElements:Ce,defaultViewport:at,translateExtent:Mt,minZoom:Ct,maxZoom:yt,preventScrolling:wr,zoomOnScroll:Sl,zoomOnPinch:xo,zoomOnDoubleClick:li,panOnScroll:wo,panOnScrollSpeed:_l,panOnScrollMode:si,panOnDrag:ui,autoPanOnSelection:mi,onPaneClick:ai,onPaneMouseEnter:ci,onPaneMouseMove:wn,onPaneMouseLeave:Sn,onPaneScroll:So,onPaneContextMenu:_o,paneClickDistance:Eo,nodeClickDistance:ko,onSelectionContextMenu:U,onSelectionStart:A,onSelectionEnd:j,onReconnect:fi,onReconnectStart:Co,onReconnectEnd:Xn,onEdgeContextMenu:di,onEdgeDoubleClick:Qn,onEdgeMouseEnter:El,onEdgeMouseMove:Gn,onEdgeMouseLeave:Sr,reconnectRadius:_r,defaultMarkerColor:Yn,noDragClassName:Nl,noWheelClassName:Cl,noPanClassName:qt,rfId:qn,disableKeyboardA11y:zo,nodeExtent:ln,viewport:Rl,onViewportChange:Ll,nodesDraggable:Re}),P.jsx(I1,{onSelectionChange:J}),No,P.jsx(k1,{proOptions:Po,position:Mo}),P.jsx(E1,{rfId:qn,disableKeyboardA11y:zo})]})})}var u_=dg(l_);function a_({dimensions:t,lineWidth:r,variant:o,className:l}){return P.jsx("path",{strokeWidth:r,d:`M${t[0]/2} 0 V${t[1]} M0 ${t[1]/2} H${t[0]}`,className:be(["react-flow__background-pattern",o,l])})}function c_({radius:t,className:r}){return P.jsx("circle",{cx:t,cy:t,r:t,className:be(["react-flow__background-pattern","dots",r])})}var bn;(function(t){t.Lines="lines",t.Dots="dots",t.Cross="cross"})(bn||(bn={}));const f_={[bn.Dots]:1,[bn.Lines]:1,[bn.Cross]:6},d_=t=>({transform:t.transform,patternId:`pattern-${t.rfId}`});function Fg({id:t,variant:r=bn.Dots,gap:o=20,size:l,lineWidth:u=1,offset:c=0,color:f,bgColor:h,style:p,className:y,patternClassName:m}){const v=G.useRef(null),{transform:g,patternId:w}=Ie(d_,Ve),S=l||f_[r],M=r===bn.Dots,N=r===bn.Cross,E=Array.isArray(o)?o:[o,o],R=[E[0]*g[2]||1,E[1]*g[2]||1],_=S*g[2],I=Array.isArray(c)?c:[c,c],W=N?[_,_]:R,$=[I[0]*g[2]+W[0]/2,I[1]*g[2]+W[1]/2],V=`${w}${t||""}`;return P.jsxs("svg",{className:be(["react-flow__background",y]),style:{...p,...xl,"--xy-background-color-props":h,"--xy-background-pattern-color-props":f},ref:v,"data-testid":"rf__background",children:[P.jsx("pattern",{id:V,x:g[0]%R[0],y:g[1]%R[1],width:R[0],height:R[1],patternUnits:"userSpaceOnUse",patternTransform:`translate(-${$[0]},-${$[1]})`,children:M?P.jsx(c_,{radius:_/2,className:m}):P.jsx(a_,{dimensions:W,lineWidth:u,variant:r,className:m})}),P.jsx("rect",{x:"0",y:"0",width:"100%",height:"100%",fill:`url(#${V})`})]})}Fg.displayName="Background";const h_=G.memo(Fg);function p_(){return P.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 32 32",children:P.jsx("path",{d:"M32 18.133H18.133V32h-4.266V18.133H0v-4.266h13.867V0h4.266v13.867H32z"})})}function g_(){return P.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 32 5",children:P.jsx("path",{d:"M0 0h32v4.2H0z"})})}function m_(){return P.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 32 30",children:P.jsx("path",{d:"M3.692 4.63c0-.53.4-.938.939-.938h5.215V0H4.708C2.13 0 0 2.054 0 4.63v5.216h3.692V4.631zM27.354 0h-5.2v3.692h5.17c.53 0 .984.4.984.939v5.215H32V4.631A4.624 4.624 0 0027.354 0zm.954 24.83c0 .532-.4.94-.939.94h-5.215v3.768h5.215c2.577 0 4.631-2.13 4.631-4.707v-5.139h-3.692v5.139zm-23.677.94c-.531 0-.939-.4-.939-.94v-5.138H0v5.139c0 2.577 2.13 4.707 4.708 4.707h5.138V25.77H4.631z"})})}function y_(){return P.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 25 32",children:P.jsx("path",{d:"M21.333 10.667H19.81V7.619C19.81 3.429 16.38 0 12.19 0 8 0 4.571 3.429 4.571 7.619v3.048H3.048A3.056 3.056 0 000 13.714v15.238A3.056 3.056 0 003.048 32h18.285a3.056 3.056 0 003.048-3.048V13.714a3.056 3.056 0 00-3.048-3.047zM12.19 24.533a3.056 3.056 0 01-3.047-3.047 3.056 3.056 0 013.047-3.048 3.056 3.056 0 013.048 3.048 3.056 3.056 0 01-3.048 3.047zm4.724-13.866H7.467V7.619c0-2.59 2.133-4.724 4.723-4.724 2.591 0 4.724 2.133 4.724 4.724v3.048z"})})}function v_(){return P.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 25 32",children:P.jsx("path",{d:"M21.333 10.667H19.81V7.619C19.81 3.429 16.38 0 12.19 0c-4.114 1.828-1.37 2.133.305 2.438 1.676.305 4.42 2.59 4.42 5.181v3.048H3.047A3.056 3.056 0 000 13.714v15.238A3.056 3.056 0 003.048 32h18.285a3.056 3.056 0 003.048-3.048V13.714a3.056 3.056 0 00-3.048-3.047zM12.19 24.533a3.056 3.056 0 01-3.047-3.047 3.056 3.056 0 013.047-3.048 3.056 3.056 0 013.048 3.048 3.056 3.056 0 01-3.048 3.047z"})})}function bs({children:t,className:r,...o}){return P.jsx("button",{type:"button",className:be(["react-flow__controls-button",r]),...o,children:t})}const x_=t=>({isInteractive:t.nodesDraggable||t.nodesConnectable||t.elementsSelectable,minZoomReached:t.transform[2]<=t.minZoom,maxZoomReached:t.transform[2]>=t.maxZoom,ariaLabelConfig:t.ariaLabelConfig});function Hg({style:t,showZoom:r=!0,showFitView:o=!0,showInteractive:l=!0,fitViewOptions:u,onZoomIn:c,onZoomOut:f,onFitView:h,onInteractiveChange:p,className:y,children:m,position:v="bottom-left",orientation:g="vertical","aria-label":w}){const S=$e(),{isInteractive:M,minZoomReached:N,maxZoomReached:E,ariaLabelConfig:R}=Ie(x_,Ve),{zoomIn:_,zoomOut:I,fitView:W}=ac(),$=()=>{_(),c==null||c()},V=()=>{I(),f==null||f()},X=()=>{W(u),h==null||h()},K=()=>{S.setState({nodesDraggable:!M,nodesConnectable:!M,elementsSelectable:!M}),p==null||p(!M)},te=g==="horizontal"?"horizontal":"vertical";return P.jsxs(vl,{className:be(["react-flow__controls",te,y]),position:v,style:t,"data-testid":"rf__controls","aria-label":w??R["controls.ariaLabel"],children:[r&&P.jsxs(P.Fragment,{children:[P.jsx(bs,{onClick:$,className:"react-flow__controls-zoomin",title:R["controls.zoomIn.ariaLabel"],"aria-label":R["controls.zoomIn.ariaLabel"],disabled:E,children:P.jsx(p_,{})}),P.jsx(bs,{onClick:V,className:"react-flow__controls-zoomout",title:R["controls.zoomOut.ariaLabel"],"aria-label":R["controls.zoomOut.ariaLabel"],disabled:N,children:P.jsx(g_,{})})]}),o&&P.jsx(bs,{className:"react-flow__controls-fitview",onClick:X,title:R["controls.fitView.ariaLabel"],"aria-label":R["controls.fitView.ariaLabel"],children:P.jsx(m_,{})}),l&&P.jsx(bs,{className:"react-flow__controls-interactive",onClick:K,title:R["controls.interactive.ariaLabel"],"aria-label":R["controls.interactive.ariaLabel"],children:M?P.jsx(v_,{}):P.jsx(y_,{})}),m]})}Hg.displayName="Controls";const w_=G.memo(Hg);function S_({id:t,x:r,y:o,width:l,height:u,style:c,color:f,strokeColor:h,strokeWidth:p,className:y,borderRadius:m,shapeRendering:v,selected:g,onClick:w}){const{background:S,backgroundColor:M}=c||{},N=f||S||M;return P.jsx("rect",{className:be(["react-flow__minimap-node",{selected:g},y]),x:r,y:o,rx:m,ry:m,width:l,height:u,style:{fill:N,stroke:h,strokeWidth:p},shapeRendering:v,onClick:w?E=>w(E,t):void 0})}const __=G.memo(S_),E_=t=>t.nodes.map(r=>r.id),Ta=t=>t instanceof Function?t:()=>t;function k_({nodeStrokeColor:t,nodeColor:r,nodeClassName:o="",nodeBorderRadius:l=5,nodeStrokeWidth:u,nodeComponent:c=__,onClick:f}){const h=Ie(E_,Ve),p=Ta(r),y=Ta(t),m=Ta(o),v=typeof window>"u"||window.chrome?"crispEdges":"geometricPrecision";return P.jsx(P.Fragment,{children:h.map(g=>P.jsx(C_,{id:g,nodeColorFunc:p,nodeStrokeColorFunc:y,nodeClassNameFunc:m,nodeBorderRadius:l,nodeStrokeWidth:u,NodeComponent:c,onClick:f,shapeRendering:v},g))})}function N_({id:t,nodeColorFunc:r,nodeStrokeColorFunc:o,nodeClassNameFunc:l,nodeBorderRadius:u,nodeStrokeWidth:c,shapeRendering:f,NodeComponent:h,onClick:p}){const{node:y,x:m,y:v,width:g,height:w}=Ie(S=>{const M=S.nodeLookup.get(t);if(!M)return{node:void 0,x:0,y:0,width:0,height:0};const N=M.internals.userNode,{x:E,y:R}=M.internals.positionAbsolute,{width:_,height:I}=Qt(N);return{node:N,x:E,y:R,width:_,height:I}},Ve);return!y||y.hidden||!Hp(y)?null:P.jsx(h,{x:m,y:v,width:g,height:w,style:y.style,selected:!!y.selected,className:l(y),color:r(y),borderRadius:u,strokeColor:o(y),strokeWidth:c,shapeRendering:f,onClick:p,id:y.id})}const C_=G.memo(N_);var M_=G.memo(k_);const P_=200,I_=150,T_=t=>!t.hidden,z_=t=>{const r={x:-t.transform[0]/t.transform[2],y:-t.transform[1]/t.transform[2],width:t.width/t.transform[2],height:t.height/t.transform[2]};return{viewBB:r,boundingRect:t.nodeLookup.size>0?Dp(mo(t.nodeLookup,{filter:T_}),r):r,rfId:t.rfId,panZoom:t.panZoom,translateExtent:t.translateExtent,flowWidth:t.width,flowHeight:t.height,ariaLabelConfig:t.ariaLabelConfig}},qh=(t,r)=>t.x===r.x&&t.y===r.y&&t.width===r.width&&t.height===r.height,R_=(t,r)=>qh(t.viewBB,r.viewBB)&&qh(t.boundingRect,r.boundingRect)&&t.rfId===r.rfId&&t.panZoom===r.panZoom&&t.translateExtent===r.translateExtent&&t.flowWidth===r.flowWidth&&t.flowHeight===r.flowHeight&&t.ariaLabelConfig===r.ariaLabelConfig,L_="react-flow__minimap-desc";function Vg({style:t,className:r,nodeStrokeColor:o,nodeColor:l,nodeClassName:u="",nodeBorderRadius:c=5,nodeStrokeWidth:f,nodeComponent:h,bgColor:p,maskColor:y,maskStrokeColor:m,maskStrokeWidth:v,position:g="bottom-right",onClick:w,onNodeClick:S,pannable:M=!1,zoomable:N=!1,ariaLabel:E,inversePan:R,zoomStep:_=1,offsetScale:I=5}){const W=$e(),$=G.useRef(null),{boundingRect:V,viewBB:X,rfId:K,panZoom:te,translateExtent:Z,flowWidth:ee,flowHeight:J,ariaLabelConfig:k}=Ie(z_,R_),B=(t==null?void 0:t.width)??P_,H=(t==null?void 0:t.height)??I_,U=V.width/B,A=V.height/H,j=Math.max(U,A),F=j*B,C=j*H,z=I*j,ne=V.x-(F-V.width)/2-z,ie=V.y-(C-V.height)/2-z,ce=F+z*2,O=C+z*2,re=`${L_}-${K}`,Q=G.useRef(0),le=G.useRef();Q.current=j,G.useEffect(()=>{if($.current&&te)return le.current=bw({domNode:$.current,panZoom:te,getTransform:()=>W.getState().transform,getViewScale:()=>Q.current}),()=>{var me;(me=le.current)==null||me.destroy()}},[te]),G.useEffect(()=>{var me;(me=le.current)==null||me.update({translateExtent:Z,width:ee,height:J,inversePan:R,pannable:M,zoomStep:_,zoomable:N})},[M,N,R,_,Z,ee,J]);const pe=w?me=>{var Me;const[ke,Ce]=((Me=le.current)==null?void 0:Me.pointer(me))||[0,0];w(me,{x:ke,y:Ce})}:void 0,we=S?G.useCallback((me,ke)=>{const Ce=W.getState().nodeLookup.get(ke).internals.userNode;S(me,Ce)},[]):void 0,ve=E??k["minimap.ariaLabel"];return P.jsx(vl,{position:g,style:{...t,"--xy-minimap-background-color-props":typeof p=="string"?p:void 0,"--xy-minimap-mask-background-color-props":typeof y=="string"?y:void 0,"--xy-minimap-mask-stroke-color-props":typeof m=="string"?m:void 0,"--xy-minimap-mask-stroke-width-props":typeof v=="number"?v*j:void 0,"--xy-minimap-node-background-color-props":typeof l=="string"?l:void 0,"--xy-minimap-node-stroke-color-props":typeof o=="string"?o:void 0,"--xy-minimap-node-stroke-width-props":typeof f=="number"?f:void 0},className:be(["react-flow__minimap",r]),"data-testid":"rf__minimap",children:P.jsxs("svg",{width:B,height:H,viewBox:`${ne} ${ie} ${ce} ${O}`,className:"react-flow__minimap-svg",role:"img","aria-labelledby":re,ref:$,onClick:pe,children:[ve&&P.jsx("title",{id:re,children:ve}),P.jsx(M_,{onClick:we,nodeColor:l,nodeStrokeColor:o,nodeBorderRadius:c,nodeClassName:u,nodeStrokeWidth:f,nodeComponent:h}),P.jsx("path",{className:"react-flow__minimap-mask",d:`M${ne-z},${ie-z}h${ce+z*2}v${O+z*2}h${-ce-z*2}z - M${X.x},${X.y}h${X.width}v${X.height}h${-X.width}z`,fillRule:"evenodd",pointerEvents:"none"})]})})}Vg.displayName="MiniMap";const j_=G.memo(Vg),A_=t=>r=>t?`${Math.max(1/r.transform[2],1)}`:void 0,$_={[oi.Line]:"right",[oi.Handle]:"bottom-right"};function D_({nodeId:t,position:r,variant:o=oi.Handle,className:l,style:u=void 0,children:c,color:f,minWidth:h=10,minHeight:p=10,maxWidth:y=Number.MAX_VALUE,maxHeight:m=Number.MAX_VALUE,keepAspectRatio:v=!1,resizeDirection:g,autoScale:w=!0,shouldResize:S,onResizeStart:M,onResize:N,onResizeEnd:E}){const R=yg(),_=typeof t=="string"?t:R,I=$e(),W=G.useRef(null),$=o===oi.Handle,V=Ie(G.useCallback(A_($&&w),[$,w]),Ve),X=G.useRef(null),K=r??$_[o];G.useEffect(()=>{if(!(!W.current||!_))return X.current||(X.current=i1({domNode:W.current,nodeId:_,getStoreItems:()=>{const{nodeLookup:Z,transform:ee,snapGrid:J,snapToGrid:k,nodeOrigin:B,domNode:H}=I.getState();return{nodeLookup:Z,transform:ee,snapGrid:J,snapToGrid:k,nodeOrigin:B,paneDomNode:H}},onChange:(Z,ee)=>{const{triggerNodeChanges:J,nodeLookup:k,parentLookup:B,nodeOrigin:H}=I.getState(),U=[],A={x:Z.x,y:Z.y},j=k.get(_);if(j&&j.expandParent&&j.parentId){const F=j.origin??H,C=Z.width??j.measured.width??0,z=Z.height??j.measured.height??0,ne={id:j.id,parentId:j.parentId,rect:{width:C,height:z,...Vp({x:Z.x??j.position.x,y:Z.y??j.position.y},{width:C,height:z},j.parentId,k,F)}},ie=uc([ne],k,B,H);U.push(...ie),A.x=Z.x?Math.max(F[0]*C,Z.x):void 0,A.y=Z.y?Math.max(F[1]*z,Z.y):void 0}if(A.x!==void 0&&A.y!==void 0){const F={id:_,type:"position",position:{...A}};U.push(F)}if(Z.width!==void 0&&Z.height!==void 0){const C={id:_,type:"dimensions",resizing:!0,setAttributes:g?g==="horizontal"?"width":"height":!0,dimensions:{width:Z.width,height:Z.height}};U.push(C)}for(const F of ee){const C={...F,type:"position"};U.push(C)}J(U)},onEnd:({width:Z,height:ee})=>{const J={id:_,type:"dimensions",resizing:!1,dimensions:{width:Z,height:ee}};I.getState().triggerNodeChanges([J])}})),X.current.update({controlPosition:K,boundaries:{minWidth:h,minHeight:p,maxWidth:y,maxHeight:m},keepAspectRatio:v,resizeDirection:g,onResizeStart:M,onResize:N,onResizeEnd:E,shouldResize:S}),()=>{var Z;(Z=X.current)==null||Z.destroy()}},[K,h,p,y,m,v,M,N,E,S]);const te=K.split("-");return P.jsx("div",{className:be(["react-flow__resize-control","nodrag",...te,o,l]),ref:W,style:{...u,scale:V,...f&&{[$?"backgroundColor":"borderColor"]:f}},children:c})}G.memo(D_);const O_={"arch.context":0,"django.app":0,"django.route":1,"django.url_name":1,"django.view":2,"django.viewset_action":2,"django.permission":2,"django.serializer":3,"django.serializer_field":4,"django.service":4,"django.model":5,"django.field":6,"django.relation":6,"django.task":7,"django.receiver":7,"django.signal":7,"django.test":7,"django.migration_op":7,"django.admin":7,"openapi.path":8,"react.api_client":9,"react.query_key":10,"react.hook":10,"react.feature":10,"react.route":11,"react.page":11,"react.component":12,"react.form_schema":13,"react.test":13,"react.context":12};function F_(t){return O_[t]??8}function H_(t){const r=new Map;for(const l of t){const u=F_(l.type),c=r.get(u)??[];c.push(l),r.set(u,c)}const o=new Map;for(const[l,u]of r)u.sort((c,f)=>c.name.localeCompare(f.name)),u.forEach((c,f)=>{o.set(c.id,{x:l*240,y:f*92})});return o}const V_={cheap:"#4a5568",expensive:"#f4a261",critical:"#e85d04"};function B_({data:t}){return P.jsxs("div",{className:"lp-node",children:[P.jsx("div",{className:"t",children:t.type.split(".").pop()}),P.jsx("div",{className:"n",children:t.name})]})}const U_={load:B_};function za({nodes:t,edges:r}){const o=H_(t),l=t.map(c=>({id:c.id,type:"load",position:o.get(c.id)??{x:0,y:0},data:{name:c.name,type:c.type,file:c.file_path}})),u=r.filter(c=>t.some(f=>f.id===c.src)&&t.some(f=>f.id===c.dst)).map(c=>({id:c.id,source:c.src,target:c.dst,animated:c.weight==="critical",style:{stroke:V_[c.weight]||"#4a5568",strokeWidth:c.weight==="critical"?2.4:1.2,strokeDasharray:c.confidence<.8?"6 4":void 0},label:c.type.replaceAll("_"," "),labelStyle:{fill:"#8b9bb0",fontSize:9}}));return P.jsx(Og,{children:P.jsxs(u_,{nodes:l,edges:u,nodeTypes:U_,fitView:!0,minZoom:.2,"data-testid":"impact-graph",children:[P.jsx(h_,{}),P.jsx(j_,{pannable:!0,zoomable:!0}),P.jsx(w_,{})]})})}function W_(){var ce;const[t,r]=G.useState("review"),[o,l]=G.useState(localStorage.getItem("loadpath.repo")||""),[u,c]=G.useState("HEAD~1"),[f,h]=G.useState("HEAD"),[p,y]=G.useState(null),[m,v]=G.useState(null),[g,w]=G.useState([]),[S,M]=G.useState("review"),[N,E]=G.useState(""),[R,_]=G.useState(""),[I,W]=G.useState({}),[$,V]=G.useState([]),[X,K]=G.useState(""),[te,Z]=G.useState("github"),[ee,J]=G.useState(""),k=G.useRef(o);k.current=o,G.useEffect(()=>{Vt.settings().then(W).catch(()=>{}),Vt.repos().then(O=>w(O.repos)).catch(()=>{})},[]),G.useEffect(()=>{if(t!=="architecture"||!o)return;const O=o;let re=!1;return Vt.architecture(O).then(Q=>{!re&&k.current===O&&v(Q)}).catch(()=>{}),()=>{re=!0}},[t,o]);const B=O=>{l(O),localStorage.setItem("loadpath.repo",O)},H=async(O=o)=>{if(!O)return null;const re=await Vt.architecture(O);return k.current===O&&v(re),re},U=async()=>{E(""),_("Tracing load path…"),B(o);try{const O=await Vt.review(o,u,f,!0);y(O),M("review"),r("review"),await Vt.repos().then(re=>w(re.repos)).catch(()=>{}),await H(o)}catch(O){E(O instanceof Error?O.message:String(O))}finally{_("")}},A=async(O=!0)=>{E(""),_(O?"Indexing…":"Full reindex…"),B(o);try{await Vt.index(o,O);const re=await H(o);await Vt.repos().then(Q=>w(Q.repos)).catch(()=>{}),re!=null&&re.indexed&&(M("architecture"),r("architecture"))}catch(re){E(re instanceof Error?re.message:String(re))}finally{_("")}},j=async()=>{E(""),_("Fetching pull requests…");try{const O=await Vt.prs(te,X);V(O.pull_requests)}catch(O){E(O instanceof Error?O.message:String(O))}finally{_("")}},F=async O=>{O.preventDefault();const re=new FormData(O.currentTarget),Q={github_token:String(re.get("github_token")||""),bitbucket_token:String(re.get("bitbucket_token")||""),bitbucket_username:String(re.get("bitbucket_username")||""),ai_provider:String(re.get("ai_provider")||"none"),ai_api_key:String(re.get("ai_api_key")||""),ai_model:String(re.get("ai_model")||""),ai_base_url:String(re.get("ai_base_url")||""),workspaces:g.length?g.map(le=>({path:le.path,name:le.name})):o?[{path:o,name:o.split(/[\\/]/).pop()}]:[]};W(await Vt.saveSettings(Q))},C=async()=>{if(p){_("Residual analysis…");try{const O=await Vt.residual(p);J(O.note)}catch(O){E(O instanceof Error?O.message:String(O))}finally{_("")}}},z=G.useMemo(()=>S==="architecture"?(m==null?void 0:m.nodes)??[]:(p==null?void 0:p.nodes)??[],[S,m,p]),ne=G.useMemo(()=>S==="architecture"?(m==null?void 0:m.edges)??[]:(p==null?void 0:p.edges)??[],[S,m,p]),ie=p!=null&&p.index?`${p.index.counts.nodes} nodes / ${p.index.counts.edges} edges · ${p.index.incremental?"incremental":"full"}`:m!=null&&m.indexed?`${m.counts.nodes} nodes / ${m.counts.edges} edges indexed`:"Not indexed";return P.jsxs("div",{className:"app",children:[P.jsxs("nav",{className:"rail","data-testid":"rail",children:[P.jsx("div",{className:"brand",children:"Loadpath"}),P.jsx("button",{"data-testid":"tab-review",className:t==="review"?"active":"",onClick:()=>r("review"),children:"Review"}),P.jsx("button",{"data-testid":"tab-architecture",className:t==="architecture"?"active":"",onClick:()=>r("architecture"),children:"Architecture"}),P.jsx("button",{"data-testid":"tab-graph",className:t==="graph"?"active":"",onClick:()=>r("graph"),children:"Impact graph"}),P.jsx("button",{"data-testid":"tab-prs",className:t==="prs"?"active":"",onClick:()=>r("prs"),children:"Pull requests"}),P.jsx("button",{"data-testid":"tab-settings",className:t==="settings"?"active":"",onClick:()=>r("settings"),children:"Settings"}),P.jsx("div",{style:{flex:1}}),P.jsx("div",{className:"muted",children:R||ie})]}),P.jsxs("div",{className:"main",children:[P.jsxs("div",{className:"topbar","data-testid":"topbar",children:[g.length>0?P.jsxs("select",{"data-testid":"workspace-select",value:g.some(O=>O.path===o)?o:"",onChange:O=>{O.target.value&&B(O.target.value)},children:[P.jsx("option",{value:"",children:"Indexed repos…"}),g.map(O=>P.jsxs("option",{value:O.path,children:[O.name,O.indexed?` (${O.counts.nodes})`:""]},O.path))]}):null,P.jsx("input",{"data-testid":"repo-path",className:"path",placeholder:"Local monorepo path",value:o,onChange:O=>l(O.target.value)}),P.jsx("input",{"data-testid":"base-ref",value:u,onChange:O=>c(O.target.value),placeholder:"base"}),P.jsx("input",{"data-testid":"head-ref",value:f,onChange:O=>h(O.target.value),placeholder:"head"}),P.jsx("button",{"data-testid":"btn-index",onClick:()=>A(!0),children:"Index"}),P.jsx("button",{"data-testid":"btn-review",className:"btn primary",onClick:U,children:"Review"})]}),N?P.jsx("div",{className:"error",children:N}):null,t==="review"&&P.jsxs("div",{className:"content","data-testid":"review-layout",children:[P.jsx("aside",{className:"brief","data-testid":"brief",children:p?P.jsxs(P.Fragment,{children:[P.jsxs("div",{className:`level ${p.confidence.level}`,children:[p.confidence.level.toUpperCase()," — ",p.title]}),p.low_risk?P.jsx("span",{className:"chip",children:"loadpath:low-risk"}):null,p.change_kinds.map(O=>P.jsx("span",{className:"chip",children:O.replaceAll("_"," ")},O)),P.jsx("pre",{className:"headline",children:p.headline}),p.index?P.jsxs(P.Fragment,{children:[P.jsx("div",{className:"kicker",children:"Index"}),P.jsxs("div",{className:"muted",children:["Walked ",p.index.counts.nodes," nodes / ",p.index.counts.edges," edges",p.index.reindexed?" after an incremental refresh":" from the existing index","."]})]}):null,P.jsx("div",{className:"kicker",children:"Read this"}),p.read_order.map(O=>P.jsxs("div",{children:[P.jsx("span",{className:"file",children:O.path}),P.jsx("div",{className:"muted",children:O.why})]},O.path)),P.jsx("div",{className:"kicker",children:"Clusters"}),p.clusters.map(O=>P.jsxs("div",{className:"muted",children:[P.jsx("strong",{children:O.title})," — ",O.files.join(", ")]},O.id)),P.jsx("div",{className:"kicker",children:"Architecture"}),p.findings.filter(O=>!O.waived).length===0?P.jsx("div",{className:"muted",children:p.architecture_note}):p.findings.filter(O=>!O.waived).map(O=>P.jsxs("div",{className:"muted",children:[P.jsx("span",{className:`chip ${O.severity}`,children:O.severity}),O.message]},O.rule+O.message)),P.jsx("div",{className:"kicker",children:"Residual (AI only here)"}),p.residuals.map(O=>P.jsx("div",{className:"muted",children:O},O)),P.jsx("button",{className:"btn",onClick:C,style:{marginTop:12},children:"Ask configured model"}),ee?P.jsx("pre",{className:"headline",children:ee}):null,P.jsx("div",{className:"kicker",children:"Reviewers"}),P.jsx("div",{className:"muted",children:p.suggested_reviewers.join(", ")||"—"})]}):P.jsxs("p",{className:"muted",children:["Index a Django + React monorepo with ",P.jsx("code",{children:"loadpath.yml"}),", inspect architecture, then review a git range against that graph."]})}),P.jsx("div",{className:"graph-wrap","data-testid":"review-graph",children:p?P.jsx(za,{nodes:p.nodes,edges:p.edges}):null})]}),t==="architecture"&&P.jsxs("div",{className:"content","data-testid":"architecture-panel",children:[P.jsx("aside",{className:"brief","data-testid":"architecture-brief",children:m!=null&&m.indexed?P.jsxs(P.Fragment,{children:[P.jsxs("div",{className:"level high",children:["INDEXED — ",m.counts.nodes," nodes"]}),P.jsxs("span",{className:"chip",children:[m.counts.edges," edges"]}),m.has_config?P.jsx("span",{className:"chip",children:"loadpath.yml"}):null,P.jsxs("div",{className:"muted",style:{marginTop:8},children:[m.indexed_at?`Last index ${m.indexed_at}`:"Indexed",m.incremental?" · incremental":" · full"]}),P.jsx("div",{className:"kicker",children:"Bounded contexts"}),Object.values(m.contexts).map(O=>P.jsxs("div",{className:"muted",children:[P.jsx("strong",{children:O.name})," — ",(O.django_apps||[]).join(", ")||"no apps"," ·"," ",(O.owners||[]).join(", ")||"unowned"]},O.name)),P.jsx("div",{className:"kicker",children:"Rules"}),(m.rules||[]).map(O=>P.jsx("div",{className:"muted",children:O},O)),P.jsx("div",{className:"kicker",children:"Findings on the indexed graph"}),m.findings.filter(O=>!O.waived).length===0?P.jsx("div",{className:"muted",children:"No architecture rule hits on the full graph."}):m.findings.filter(O=>!O.waived).map(O=>P.jsxs("div",{className:"muted",children:[P.jsx("span",{className:`chip ${O.severity}`,children:O.severity}),O.message]},O.rule+O.message)),P.jsx("div",{className:"kicker",children:"Types"}),P.jsx("div",{className:"muted",children:Object.entries(m.type_counts||{}).sort((O,re)=>re[1]-O[1]).slice(0,12).map(([O,re])=>`${O.split(".").pop()} ${re}`).join(" · ")}),P.jsx("button",{className:"btn",style:{marginTop:12},onClick:()=>A(!1),"data-testid":"btn-full-reindex",children:"Full reindex"}),P.jsx("button",{className:"btn primary",style:{marginTop:8},onClick:U,children:"Review against this index"})]}):P.jsx("p",{className:"muted","data-testid":"architecture-empty",children:"Index this repo to build the architecture graph. Review then walks that same graph for a git range — it does not start from a hunk list."})}),P.jsx("div",{className:"graph-wrap","data-testid":"architecture-graph",children:m!=null&&m.indexed?P.jsx(za,{nodes:m.nodes,edges:m.edges}):null})]}),t==="graph"&&P.jsxs("div",{className:"graph-wrap","data-testid":"graph-full",style:{height:"100%",display:"flex",flexDirection:"column"},children:[P.jsxs("div",{className:"graph-modes",children:[P.jsx("button",{"data-testid":"graph-mode-review",className:S==="review"?"active":"",onClick:()=>M("review"),children:"This review"}),P.jsx("button",{"data-testid":"graph-mode-architecture",className:S==="architecture"?"active":"",onClick:()=>M("architecture"),children:"Indexed architecture"})]}),z.length?P.jsx("div",{style:{flex:1,minHeight:0},children:P.jsx(za,{nodes:z,edges:ne})}):P.jsx("p",{className:"muted",children:"Index the repo or run a review first."})]}),t==="prs"&&P.jsxs("div",{className:"pr-list","data-testid":"pr-list",children:[P.jsxs("div",{className:"topbar",style:{border:0,padding:0,marginBottom:12},children:[P.jsxs("select",{"data-testid":"pr-provider",value:te,onChange:O=>Z(O.target.value),children:[P.jsx("option",{value:"github",children:"GitHub"}),P.jsx("option",{value:"bitbucket",children:"Bitbucket"})]}),P.jsx("input",{"data-testid":"pr-repo",className:"path",placeholder:"owner/repo",value:X,onChange:O=>K(O.target.value)}),P.jsx("button",{"data-testid":"btn-list-prs",onClick:j,children:"List PRs"})]}),$.map(O=>P.jsxs("article",{className:"pr","data-testid":`pr-${O.number}`,children:[P.jsxs("h3",{children:["#",O.number," ",O.title]}),P.jsxs("div",{className:"muted",children:[O.author," · ",O.source_branch," → ",O.target_branch," · ",O.provider]}),P.jsxs("a",{href:O.url,target:"_blank",rel:"noreferrer",children:["Open on ",O.provider]}),P.jsx("div",{children:P.jsx("button",{className:"btn",onClick:()=>{c(O.target_branch),h(O.source_branch),r("review")},children:"Review this branch range"})})]},`${O.provider}-${O.number}`))]}),t==="settings"&&P.jsxs("form",{className:"settings","data-testid":"settings-form",onSubmit:F,children:[P.jsx("h1",{children:"Keys & providers"}),P.jsx("p",{className:"muted",children:"Tokens stay on this machine in ~/.loadpath/settings.json. GitHub and Bitbucket power the PR list. Indexed repos are remembered as workspaces. AI is used only for residual uncertainty the graph could not close."}),P.jsx("label",{children:"GitHub token"}),P.jsx("input",{name:"github_token",type:"password",placeholder:"ghp_…"}),P.jsx("label",{children:"Bitbucket token"}),P.jsx("input",{name:"bitbucket_token",type:"password"}),P.jsx("label",{children:"Bitbucket username (app passwords)"}),P.jsx("input",{name:"bitbucket_username",defaultValue:String(I.bitbucket_username||"")}),P.jsx("label",{children:"AI provider"}),P.jsxs("select",{name:"ai_provider",defaultValue:String(((ce=I.ai)==null?void 0:ce.provider)||"none"),children:[P.jsx("option",{value:"none",children:"none (graph only)"}),P.jsx("option",{value:"anthropic",children:"Anthropic"}),P.jsx("option",{value:"openai",children:"OpenAI"}),P.jsx("option",{value:"grok",children:"Grok / xAI"}),P.jsx("option",{value:"deepseek",children:"DeepSeek"}),P.jsx("option",{value:"cursor",children:"Cursor-compatible (OpenAI protocol)"}),P.jsx("option",{value:"ollama",children:"Ollama local"})]}),P.jsx("label",{children:"AI API key"}),P.jsx("input",{name:"ai_api_key",type:"password"}),P.jsx("label",{children:"Model"}),P.jsx("input",{name:"ai_model",placeholder:"optional override"}),P.jsx("label",{children:"Base URL"}),P.jsx("input",{name:"ai_base_url",placeholder:"optional, OpenAI-compatible"}),P.jsx("button",{className:"btn primary",type:"submit",children:"Save"})]})]})]})}P0.createRoot(document.getElementById("root")).render(P.jsx(G.StrictMode,{children:P.jsx(W_,{})})); diff --git a/src/loadpath/static/assets/index-DzkAzhEt.js b/src/loadpath/static/assets/index-DzkAzhEt.js new file mode 100644 index 0000000..f119b44 --- /dev/null +++ b/src/loadpath/static/assets/index-DzkAzhEt.js @@ -0,0 +1,62 @@ +(function(){const r=document.createElement("link").relList;if(r&&r.supports&&r.supports("modulepreload"))return;for(const u of document.querySelectorAll('link[rel="modulepreload"]'))l(u);new MutationObserver(u=>{for(const c of u)if(c.type==="childList")for(const f of c.addedNodes)f.tagName==="LINK"&&f.rel==="modulepreload"&&l(f)}).observe(document,{childList:!0,subtree:!0});function o(u){const c={};return u.integrity&&(c.integrity=u.integrity),u.referrerPolicy&&(c.referrerPolicy=u.referrerPolicy),u.crossOrigin==="use-credentials"?c.credentials="include":u.crossOrigin==="anonymous"?c.credentials="omit":c.credentials="same-origin",c}function l(u){if(u.ep)return;u.ep=!0;const c=o(u);fetch(u.href,c)}})();function Jh(t){return t&&t.__esModule&&Object.prototype.hasOwnProperty.call(t,"default")?t.default:t}var ha={exports:{}},Gi={},pa={exports:{}},Me={};/** + * @license React + * react.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var Ad;function k0(){if(Ad)return Me;Ad=1;var t=Symbol.for("react.element"),r=Symbol.for("react.portal"),o=Symbol.for("react.fragment"),l=Symbol.for("react.strict_mode"),u=Symbol.for("react.profiler"),c=Symbol.for("react.provider"),f=Symbol.for("react.context"),h=Symbol.for("react.forward_ref"),p=Symbol.for("react.suspense"),y=Symbol.for("react.memo"),m=Symbol.for("react.lazy"),v=Symbol.iterator;function g(M){return M===null||typeof M!="object"?null:(M=v&&M[v]||M["@@iterator"],typeof M=="function"?M:null)}var w={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},S=Object.assign,P={};function N(M,z,ne){this.props=M,this.context=z,this.refs=P,this.updater=ne||w}N.prototype.isReactComponent={},N.prototype.setState=function(M,z){if(typeof M!="object"&&typeof M!="function"&&M!=null)throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,M,z,"setState")},N.prototype.forceUpdate=function(M){this.updater.enqueueForceUpdate(this,M,"forceUpdate")};function E(){}E.prototype=N.prototype;function j(M,z,ne){this.props=M,this.context=z,this.refs=P,this.updater=ne||w}var _=j.prototype=new E;_.constructor=j,S(_,N.prototype),_.isPureReactComponent=!0;var I=Array.isArray,b=Object.prototype.hasOwnProperty,$={current:null},V={key:!0,ref:!0,__self:!0,__source:!0};function X(M,z,ne){var re,ae={},fe=null,ce=null;if(z!=null)for(re in z.ref!==void 0&&(ce=z.ref),z.key!==void 0&&(fe=""+z.key),z)b.call(z,re)&&!V.hasOwnProperty(re)&&(ae[re]=z[re]);var K=arguments.length-2;if(K===1)ae.children=ne;else if(1>>1,z=A[M];if(0>>1;Mu(ae,O))feu(ce,ae)?(A[M]=ce,A[fe]=O,M=fe):(A[M]=ae,A[re]=O,M=re);else if(feu(ce,O))A[M]=ce,A[fe]=O,M=fe;else break e}}return R}function u(A,R){var O=A.sortIndex-R.sortIndex;return O!==0?O:A.id-R.id}if(typeof performance=="object"&&typeof performance.now=="function"){var c=performance;t.unstable_now=function(){return c.now()}}else{var f=Date,h=f.now();t.unstable_now=function(){return f.now()-h}}var p=[],y=[],m=1,v=null,g=3,w=!1,S=!1,P=!1,N=typeof setTimeout=="function"?setTimeout:null,E=typeof clearTimeout=="function"?clearTimeout:null,j=typeof setImmediate<"u"?setImmediate:null;typeof navigator<"u"&&navigator.scheduling!==void 0&&navigator.scheduling.isInputPending!==void 0&&navigator.scheduling.isInputPending.bind(navigator.scheduling);function _(A){for(var R=o(y);R!==null;){if(R.callback===null)l(y);else if(R.startTime<=A)l(y),R.sortIndex=R.expirationTime,r(p,R);else break;R=o(y)}}function I(A){if(P=!1,_(A),!S)if(o(p)!==null)S=!0,H(b);else{var R=o(y);R!==null&&B(I,R.startTime-A)}}function b(A,R){S=!1,P&&(P=!1,E(X),X=-1),w=!0;var O=g;try{for(_(R),v=o(p);v!==null&&(!(v.expirationTime>R)||A&&!Z());){var M=v.callback;if(typeof M=="function"){v.callback=null,g=v.priorityLevel;var z=M(v.expirationTime<=R);R=t.unstable_now(),typeof z=="function"?v.callback=z:v===o(p)&&l(p),_(R)}else l(p);v=o(p)}if(v!==null)var ne=!0;else{var re=o(y);re!==null&&B(I,re.startTime-R),ne=!1}return ne}finally{v=null,g=O,w=!1}}var $=!1,V=null,X=-1,G=5,te=-1;function Z(){return!(t.unstable_now()-teA||125M?(A.sortIndex=O,r(y,A),o(p)===null&&A===o(y)&&(P?(E(X),X=-1):P=!0,B(I,O-M))):(A.sortIndex=z,r(p,A),S||w||(S=!0,H(b))),A},t.unstable_shouldYield=Z,t.unstable_wrapCallback=function(A){var R=g;return function(){var O=g;g=R;try{return A.apply(this,arguments)}finally{g=O}}}})(ya)),ya}var Hd;function I0(){return Hd||(Hd=1,ma.exports=P0()),ma.exports}/** + * @license React + * react-dom.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var Vd;function T0(){if(Vd)return gt;Vd=1;var t=fo(),r=I0();function o(e){for(var n="https://reactjs.org/docs/error-decoder.html?invariant="+e,i=1;i"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),p=Object.prototype.hasOwnProperty,y=/^[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/,m={},v={};function g(e){return p.call(v,e)?!0:p.call(m,e)?!1:y.test(e)?v[e]=!0:(m[e]=!0,!1)}function w(e,n,i,s){if(i!==null&&i.type===0)return!1;switch(typeof n){case"function":case"symbol":return!0;case"boolean":return s?!1:i!==null?!i.acceptsBooleans:(e=e.toLowerCase().slice(0,5),e!=="data-"&&e!=="aria-");default:return!1}}function S(e,n,i,s){if(n===null||typeof n>"u"||w(e,n,i,s))return!0;if(s)return!1;if(i!==null)switch(i.type){case 3:return!n;case 4:return n===!1;case 5:return isNaN(n);case 6:return isNaN(n)||1>n}return!1}function P(e,n,i,s,a,d,x){this.acceptsBooleans=n===2||n===3||n===4,this.attributeName=s,this.attributeNamespace=a,this.mustUseProperty=i,this.propertyName=e,this.type=n,this.sanitizeURL=d,this.removeEmptyString=x}var N={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(e){N[e]=new P(e,0,!1,e,null,!1,!1)}),[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach(function(e){var n=e[0];N[n]=new P(n,1,!1,e[1],null,!1,!1)}),["contentEditable","draggable","spellCheck","value"].forEach(function(e){N[e]=new P(e,2,!1,e.toLowerCase(),null,!1,!1)}),["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach(function(e){N[e]=new P(e,2,!1,e,null,!1,!1)}),"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach(function(e){N[e]=new P(e,3,!1,e.toLowerCase(),null,!1,!1)}),["checked","multiple","muted","selected"].forEach(function(e){N[e]=new P(e,3,!0,e,null,!1,!1)}),["capture","download"].forEach(function(e){N[e]=new P(e,4,!1,e,null,!1,!1)}),["cols","rows","size","span"].forEach(function(e){N[e]=new P(e,6,!1,e,null,!1,!1)}),["rowSpan","start"].forEach(function(e){N[e]=new P(e,5,!1,e.toLowerCase(),null,!1,!1)});var E=/[\-:]([a-z])/g;function j(e){return e[1].toUpperCase()}"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach(function(e){var n=e.replace(E,j);N[n]=new P(n,1,!1,e,null,!1,!1)}),"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach(function(e){var n=e.replace(E,j);N[n]=new P(n,1,!1,e,"http://www.w3.org/1999/xlink",!1,!1)}),["xml:base","xml:lang","xml:space"].forEach(function(e){var n=e.replace(E,j);N[n]=new P(n,1,!1,e,"http://www.w3.org/XML/1998/namespace",!1,!1)}),["tabIndex","crossOrigin"].forEach(function(e){N[e]=new P(e,1,!1,e.toLowerCase(),null,!1,!1)}),N.xlinkHref=new P("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1),["src","href","action","formAction"].forEach(function(e){N[e]=new P(e,1,!1,e.toLowerCase(),null,!0,!0)});function _(e,n,i,s){var a=N.hasOwnProperty(n)?N[n]:null;(a!==null?a.type!==0:s||!(2T||a[x]!==d[T]){var L=` +`+a[x].replace(" at new "," at ");return e.displayName&&L.includes("")&&(L=L.replace("",e.displayName)),L}while(1<=x&&0<=T);break}}}finally{ne=!1,Error.prepareStackTrace=i}return(e=e?e.displayName||e.name:"")?z(e):""}function ae(e){switch(e.tag){case 5:return z(e.type);case 16:return z("Lazy");case 13:return z("Suspense");case 19:return z("SuspenseList");case 0:case 2:case 15:return e=re(e.type,!1),e;case 11:return e=re(e.type.render,!1),e;case 1:return e=re(e.type,!0),e;default:return""}}function fe(e){if(e==null)return null;if(typeof e=="function")return e.displayName||e.name||null;if(typeof e=="string")return e;switch(e){case V:return"Fragment";case $:return"Portal";case G:return"Profiler";case X:return"StrictMode";case J:return"Suspense";case C:return"SuspenseList"}if(typeof e=="object")switch(e.$$typeof){case Z:return(e.displayName||"Context")+".Consumer";case te:return(e._context.displayName||"Context")+".Provider";case ee:var n=e.render;return e=e.displayName,e||(e=n.displayName||n.name||"",e=e!==""?"ForwardRef("+e+")":"ForwardRef"),e;case U:return n=e.displayName||null,n!==null?n:fe(e.type)||"Memo";case H:n=e._payload,e=e._init;try{return fe(e(n))}catch{}}return null}function ce(e){var n=e.type;switch(e.tag){case 24:return"Cache";case 9:return(n.displayName||"Context")+".Consumer";case 10:return(n._context.displayName||"Context")+".Provider";case 18:return"DehydratedFragment";case 11:return e=n.render,e=e.displayName||e.name||"",n.displayName||(e!==""?"ForwardRef("+e+")":"ForwardRef");case 7:return"Fragment";case 5:return n;case 4:return"Portal";case 3:return"Root";case 6:return"Text";case 16:return fe(n);case 8:return n===X?"StrictMode":"Mode";case 22:return"Offscreen";case 12:return"Profiler";case 21:return"Scope";case 13:return"Suspense";case 19:return"SuspenseList";case 25:return"TracingMarker";case 1:case 0:case 17:case 2:case 14:case 15:if(typeof n=="function")return n.displayName||n.name||null;if(typeof n=="string")return n}return null}function K(e){switch(typeof e){case"boolean":case"number":case"string":case"undefined":return e;case"object":return e;default:return""}}function se(e){var n=e.type;return(e=e.nodeName)&&e.toLowerCase()==="input"&&(n==="checkbox"||n==="radio")}function he(e){var n=se(e)?"checked":"value",i=Object.getOwnPropertyDescriptor(e.constructor.prototype,n),s=""+e[n];if(!e.hasOwnProperty(n)&&typeof i<"u"&&typeof i.get=="function"&&typeof i.set=="function"){var a=i.get,d=i.set;return Object.defineProperty(e,n,{configurable:!0,get:function(){return a.call(this)},set:function(x){s=""+x,d.call(this,x)}}),Object.defineProperty(e,n,{enumerable:i.enumerable}),{getValue:function(){return s},setValue:function(x){s=""+x},stopTracking:function(){e._valueTracker=null,delete e[n]}}}}function Se(e){e._valueTracker||(e._valueTracker=he(e))}function xe(e){if(!e)return!1;var n=e._valueTracker;if(!n)return!0;var i=n.getValue(),s="";return e&&(s=se(e)?e.checked?"true":"false":e.value),e=s,e!==i?(n.setValue(e),!0):!1}function ge(e){if(e=e||(typeof document<"u"?document:void 0),typeof e>"u")return null;try{return e.activeElement||e.body}catch{return e.body}}function Ce(e,n){var i=n.checked;return O({},n,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:i??e._wrapperState.initialChecked})}function F(e,n){var i=n.defaultValue==null?"":n.defaultValue,s=n.checked!=null?n.checked:n.defaultChecked;i=K(n.value!=null?n.value:i),e._wrapperState={initialChecked:s,initialValue:i,controlled:n.type==="checkbox"||n.type==="radio"?n.checked!=null:n.value!=null}}function ye(e,n){n=n.checked,n!=null&&_(e,"checked",n,!1)}function Pe(e,n){ye(e,n);var i=K(n.value),s=n.type;if(i!=null)s==="number"?(i===0&&e.value===""||e.value!=i)&&(e.value=""+i):e.value!==""+i&&(e.value=""+i);else if(s==="submit"||s==="reset"){e.removeAttribute("value");return}n.hasOwnProperty("value")?ut(e,n.type,i):n.hasOwnProperty("defaultValue")&&ut(e,n.type,K(n.defaultValue)),n.checked==null&&n.defaultChecked!=null&&(e.defaultChecked=!!n.defaultChecked)}function Qe(e,n,i){if(n.hasOwnProperty("value")||n.hasOwnProperty("defaultValue")){var s=n.type;if(!(s!=="submit"&&s!=="reset"||n.value!==void 0&&n.value!==null))return;n=""+e._wrapperState.initialValue,i||n===e.value||(e.value=n),e.defaultValue=n}i=e.name,i!==""&&(e.name=""),e.defaultChecked=!!e._wrapperState.initialChecked,i!==""&&(e.name=i)}function ut(e,n,i){(n!=="number"||ge(e.ownerDocument)!==e)&&(i==null?e.defaultValue=""+e._wrapperState.initialValue:e.defaultValue!==""+i&&(e.defaultValue=""+i))}var et=Array.isArray;function tt(e,n,i,s){if(e=e.options,n){n={};for(var a=0;a"+n.valueOf().toString()+"",n=Mt.firstChild;e.firstChild;)e.removeChild(e.firstChild);for(;n.firstChild;)e.appendChild(n.firstChild)}});function ln(e,n){if(n){var i=e.firstChild;if(i&&i===e.lastChild&&i.nodeType===3){i.nodeValue=n;return}}e.textContent=n}var Yn={animationIterationCount:!0,aspectRatio:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},Sl=["Webkit","ms","Moz","O"];Object.keys(Yn).forEach(function(e){Sl.forEach(function(n){n=n+e.charAt(0).toUpperCase()+e.substring(1),Yn[n]=Yn[e]})});function xo(e,n,i){return n==null||typeof n=="boolean"||n===""?"":i||typeof n!="number"||n===0||Yn.hasOwnProperty(e)&&Yn[e]?(""+n).trim():n+"px"}function wo(e,n){e=e.style;for(var i in n)if(n.hasOwnProperty(i)){var s=i.indexOf("--")===0,a=xo(i,n[i],s);i==="float"&&(i="cssFloat"),s?e.setProperty(i,a):e[i]=a}}var _l=O({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});function si(e,n){if(n){if(_l[e]&&(n.children!=null||n.dangerouslySetInnerHTML!=null))throw Error(o(137,e));if(n.dangerouslySetInnerHTML!=null){if(n.children!=null)throw Error(o(60));if(typeof n.dangerouslySetInnerHTML!="object"||!("__html"in n.dangerouslySetInnerHTML))throw Error(o(61))}if(n.style!=null&&typeof n.style!="object")throw Error(o(62))}}function li(e,n){if(e.indexOf("-")===-1)return typeof n.is=="string";switch(e){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}var ui=null;function ai(e){return e=e.target||e.srcElement||window,e.correspondingUseElement&&(e=e.correspondingUseElement),e.nodeType===3?e.parentNode:e}var ci=null,wn=null,Sn=null;function So(e){if(e=Ri(e)){if(typeof ci!="function")throw Error(o(280));var n=e.stateNode;n&&(n=qo(n),ci(e.stateNode,e.type,n))}}function _o(e){wn?Sn?Sn.push(e):Sn=[e]:wn=e}function Eo(){if(wn){var e=wn,n=Sn;if(Sn=wn=null,So(e),n)for(e=0;e>>=0,e===0?32:31-(jl(e)/Ll|0)|0}var Nr=64,Cr=4194304;function Kn(e){switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return e&4194240;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return e&130023424;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;default:return e}}function un(e,n){var i=e.pendingLanes;if(i===0)return 0;var s=0,a=e.suspendedLanes,d=e.pingedLanes,x=i&268435455;if(x!==0){var T=x&~a;T!==0?s=Kn(T):(d&=x,d!==0&&(s=Kn(d)))}else x=i&~a,x!==0?s=Kn(x):d!==0&&(s=Kn(d));if(s===0)return 0;if(n!==0&&n!==s&&(n&a)===0&&(a=s&-s,d=n&-n,a>=d||a===16&&(d&4194240)!==0))return n;if((s&4)!==0&&(s|=i&16),n=e.entangledLanes,n!==0)for(e=e.entanglements,n&=s;0i;i++)n.push(e);return n}function Zn(e,n,i){e.pendingLanes|=n,n!==536870912&&(e.suspendedLanes=0,e.pingedLanes=0),e=e.eventTimes,n=31-xt(n),e[n]=i}function $l(e,n){var i=e.pendingLanes&~n;e.pendingLanes=n,e.suspendedLanes=0,e.pingedLanes=0,e.expiredLanes&=n,e.mutableReadLanes&=n,e.entangledLanes&=n,n=e.entanglements;var s=e.eventTimes;for(e=e.expirationTimes;0=Ni),Mc=" ",Pc=!1;function Ic(e,n){switch(e){case"keyup":return xm.indexOf(n.keyCode)!==-1;case"keydown":return n.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function Tc(e){return e=e.detail,typeof e=="object"&&"data"in e?e.data:null}var Tr=!1;function Sm(e,n){switch(e){case"compositionend":return Tc(n);case"keypress":return n.which!==32?null:(Pc=!0,Mc);case"textInput":return e=n.data,e===Mc&&Pc?null:e;default:return null}}function _m(e,n){if(Tr)return e==="compositionend"||!Xl&&Ic(e,n)?(e=Sc(),Ho=Vl=Cn=null,Tr=!1,e):null;switch(e){case"paste":return null;case"keypress":if(!(n.ctrlKey||n.altKey||n.metaKey)||n.ctrlKey&&n.altKey){if(n.char&&1=n)return{node:i,offset:n-e};e=s}e:{for(;i;){if(i.nextSibling){i=i.nextSibling;break e}i=i.parentNode}i=void 0}i=Dc(i)}}function Fc(e,n){return e&&n?e===n?!0:e&&e.nodeType===3?!1:n&&n.nodeType===3?Fc(e,n.parentNode):"contains"in e?e.contains(n):e.compareDocumentPosition?!!(e.compareDocumentPosition(n)&16):!1:!1}function Hc(){for(var e=window,n=ge();n instanceof e.HTMLIFrameElement;){try{var i=typeof n.contentWindow.location.href=="string"}catch{i=!1}if(i)e=n.contentWindow;else break;n=ge(e.document)}return n}function Kl(e){var n=e&&e.nodeName&&e.nodeName.toLowerCase();return n&&(n==="input"&&(e.type==="text"||e.type==="search"||e.type==="tel"||e.type==="url"||e.type==="password")||n==="textarea"||e.contentEditable==="true")}function zm(e){var n=Hc(),i=e.focusedElem,s=e.selectionRange;if(n!==i&&i&&i.ownerDocument&&Fc(i.ownerDocument.documentElement,i)){if(s!==null&&Kl(i)){if(n=s.start,e=s.end,e===void 0&&(e=n),"selectionStart"in i)i.selectionStart=n,i.selectionEnd=Math.min(e,i.value.length);else if(e=(n=i.ownerDocument||document)&&n.defaultView||window,e.getSelection){e=e.getSelection();var a=i.textContent.length,d=Math.min(s.start,a);s=s.end===void 0?d:Math.min(s.end,a),!e.extend&&d>s&&(a=s,s=d,d=a),a=Oc(i,d);var x=Oc(i,s);a&&x&&(e.rangeCount!==1||e.anchorNode!==a.node||e.anchorOffset!==a.offset||e.focusNode!==x.node||e.focusOffset!==x.offset)&&(n=n.createRange(),n.setStart(a.node,a.offset),e.removeAllRanges(),d>s?(e.addRange(n),e.extend(x.node,x.offset)):(n.setEnd(x.node,x.offset),e.addRange(n)))}}for(n=[],e=i;e=e.parentNode;)e.nodeType===1&&n.push({element:e,left:e.scrollLeft,top:e.scrollTop});for(typeof i.focus=="function"&&i.focus(),i=0;i=document.documentMode,zr=null,ql=null,Ii=null,Zl=!1;function Vc(e,n,i){var s=i.window===i?i.document:i.nodeType===9?i:i.ownerDocument;Zl||zr==null||zr!==ge(s)||(s=zr,"selectionStart"in s&&Kl(s)?s={start:s.selectionStart,end:s.selectionEnd}:(s=(s.ownerDocument&&s.ownerDocument.defaultView||window).getSelection(),s={anchorNode:s.anchorNode,anchorOffset:s.anchorOffset,focusNode:s.focusNode,focusOffset:s.focusOffset}),Ii&&Pi(Ii,s)||(Ii=s,s=Qo(ql,"onSelect"),0$r||(e.current=cu[$r],cu[$r]=null,$r--)}function Le(e,n){$r++,cu[$r]=e.current,e.current=n}var Tn={},nt=In(Tn),ct=In(!1),er=Tn;function Dr(e,n){var i=e.type.contextTypes;if(!i)return Tn;var s=e.stateNode;if(s&&s.__reactInternalMemoizedUnmaskedChildContext===n)return s.__reactInternalMemoizedMaskedChildContext;var a={},d;for(d in i)a[d]=n[d];return s&&(e=e.stateNode,e.__reactInternalMemoizedUnmaskedChildContext=n,e.__reactInternalMemoizedMaskedChildContext=a),a}function ft(e){return e=e.childContextTypes,e!=null}function Zo(){Ae(ct),Ae(nt)}function nf(e,n,i){if(nt.current!==Tn)throw Error(o(168));Le(nt,n),Le(ct,i)}function rf(e,n,i){var s=e.stateNode;if(n=n.childContextTypes,typeof s.getChildContext!="function")return i;s=s.getChildContext();for(var a in s)if(!(a in n))throw Error(o(108,ce(e)||"Unknown",a));return O({},i,s)}function Jo(e){return e=(e=e.stateNode)&&e.__reactInternalMemoizedMergedChildContext||Tn,er=nt.current,Le(nt,e),Le(ct,ct.current),!0}function of(e,n,i){var s=e.stateNode;if(!s)throw Error(o(169));i?(e=rf(e,n,er),s.__reactInternalMemoizedMergedChildContext=e,Ae(ct),Ae(nt),Le(nt,e)):Ae(ct),Le(ct,i)}var cn=null,es=!1,fu=!1;function sf(e){cn===null?cn=[e]:cn.push(e)}function bm(e){es=!0,sf(e)}function zn(){if(!fu&&cn!==null){fu=!0;var e=0,n=je;try{var i=cn;for(je=1;e>=x,a-=x,fn=1<<32-xt(n)+a|i<Ne?(qe=ke,ke=null):qe=ke.sibling;var ze=ie(W,ke,Y[Ne],ue);if(ze===null){ke===null&&(ke=qe);break}e&&ke&&ze.alternate===null&&n(W,ke),D=d(ze,D,Ne),Ee===null?we=ze:Ee.sibling=ze,Ee=ze,ke=qe}if(Ne===Y.length)return i(W,ke),De&&nr(W,Ne),we;if(ke===null){for(;NeNe?(qe=ke,ke=null):qe=ke.sibling;var Hn=ie(W,ke,ze.value,ue);if(Hn===null){ke===null&&(ke=qe);break}e&&ke&&Hn.alternate===null&&n(W,ke),D=d(Hn,D,Ne),Ee===null?we=Hn:Ee.sibling=Hn,Ee=Hn,ke=qe}if(ze.done)return i(W,ke),De&&nr(W,Ne),we;if(ke===null){for(;!ze.done;Ne++,ze=Y.next())ze=le(W,ze.value,ue),ze!==null&&(D=d(ze,D,Ne),Ee===null?we=ze:Ee.sibling=ze,Ee=ze);return De&&nr(W,Ne),we}for(ke=s(W,ke);!ze.done;Ne++,ze=Y.next())ze=de(ke,W,Ne,ze.value,ue),ze!==null&&(e&&ze.alternate!==null&&ke.delete(ze.key===null?Ne:ze.key),D=d(ze,D,Ne),Ee===null?we=ze:Ee.sibling=ze,Ee=ze);return e&&ke.forEach(function(E0){return n(W,E0)}),De&&nr(W,Ne),we}function be(W,D,Y,ue){if(typeof Y=="object"&&Y!==null&&Y.type===V&&Y.key===null&&(Y=Y.props.children),typeof Y=="object"&&Y!==null){switch(Y.$$typeof){case b:e:{for(var we=Y.key,Ee=D;Ee!==null;){if(Ee.key===we){if(we=Y.type,we===V){if(Ee.tag===7){i(W,Ee.sibling),D=a(Ee,Y.props.children),D.return=W,W=D;break e}}else if(Ee.elementType===we||typeof we=="object"&&we!==null&&we.$$typeof===H&&df(we)===Ee.type){i(W,Ee.sibling),D=a(Ee,Y.props),D.ref=Ai(W,Ee,Y),D.return=W,W=D;break e}i(W,Ee);break}else n(W,Ee);Ee=Ee.sibling}Y.type===V?(D=cr(Y.props.children,W.mode,ue,Y.key),D.return=W,W=D):(ue=Ps(Y.type,Y.key,Y.props,null,W.mode,ue),ue.ref=Ai(W,D,Y),ue.return=W,W=ue)}return x(W);case $:e:{for(Ee=Y.key;D!==null;){if(D.key===Ee)if(D.tag===4&&D.stateNode.containerInfo===Y.containerInfo&&D.stateNode.implementation===Y.implementation){i(W,D.sibling),D=a(D,Y.children||[]),D.return=W,W=D;break e}else{i(W,D);break}else n(W,D);D=D.sibling}D=ua(Y,W.mode,ue),D.return=W,W=D}return x(W);case H:return Ee=Y._init,be(W,D,Ee(Y._payload),ue)}if(et(Y))return me(W,D,Y,ue);if(R(Y))return ve(W,D,Y,ue);is(W,Y)}return typeof Y=="string"&&Y!==""||typeof Y=="number"?(Y=""+Y,D!==null&&D.tag===6?(i(W,D.sibling),D=a(D,Y),D.return=W,W=D):(i(W,D),D=la(Y,W.mode,ue),D.return=W,W=D),x(W)):i(W,D)}return be}var Vr=hf(!0),pf=hf(!1),os=In(null),ss=null,Br=null,yu=null;function vu(){yu=Br=ss=null}function xu(e){var n=os.current;Ae(os),e._currentValue=n}function wu(e,n,i){for(;e!==null;){var s=e.alternate;if((e.childLanes&n)!==n?(e.childLanes|=n,s!==null&&(s.childLanes|=n)):s!==null&&(s.childLanes&n)!==n&&(s.childLanes|=n),e===i)break;e=e.return}}function br(e,n){ss=e,yu=Br=null,e=e.dependencies,e!==null&&e.firstContext!==null&&((e.lanes&n)!==0&&(dt=!0),e.firstContext=null)}function Tt(e){var n=e._currentValue;if(yu!==e)if(e={context:e,memoizedValue:n,next:null},Br===null){if(ss===null)throw Error(o(308));Br=e,ss.dependencies={lanes:0,firstContext:e}}else Br=Br.next=e;return n}var rr=null;function Su(e){rr===null?rr=[e]:rr.push(e)}function gf(e,n,i,s){var a=n.interleaved;return a===null?(i.next=i,Su(n)):(i.next=a.next,a.next=i),n.interleaved=i,hn(e,s)}function hn(e,n){e.lanes|=n;var i=e.alternate;for(i!==null&&(i.lanes|=n),i=e,e=e.return;e!==null;)e.childLanes|=n,i=e.alternate,i!==null&&(i.childLanes|=n),i=e,e=e.return;return i.tag===3?i.stateNode:null}var jn=!1;function _u(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,interleaved:null,lanes:0},effects:null}}function mf(e,n){e=e.updateQueue,n.updateQueue===e&&(n.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,effects:e.effects})}function pn(e,n){return{eventTime:e,lane:n,tag:0,payload:null,callback:null,next:null}}function Ln(e,n,i){var s=e.updateQueue;if(s===null)return null;if(s=s.shared,(Ie&2)!==0){var a=s.pending;return a===null?n.next=n:(n.next=a.next,a.next=n),s.pending=n,hn(e,i)}return a=s.interleaved,a===null?(n.next=n,Su(s)):(n.next=a.next,a.next=n),s.interleaved=n,hn(e,i)}function ls(e,n,i){if(n=n.updateQueue,n!==null&&(n=n.shared,(i&4194240)!==0)){var s=n.lanes;s&=e.pendingLanes,i|=s,n.lanes=i,Mr(e,i)}}function yf(e,n){var i=e.updateQueue,s=e.alternate;if(s!==null&&(s=s.updateQueue,i===s)){var a=null,d=null;if(i=i.firstBaseUpdate,i!==null){do{var x={eventTime:i.eventTime,lane:i.lane,tag:i.tag,payload:i.payload,callback:i.callback,next:null};d===null?a=d=x:d=d.next=x,i=i.next}while(i!==null);d===null?a=d=n:d=d.next=n}else a=d=n;i={baseState:s.baseState,firstBaseUpdate:a,lastBaseUpdate:d,shared:s.shared,effects:s.effects},e.updateQueue=i;return}e=i.lastBaseUpdate,e===null?i.firstBaseUpdate=n:e.next=n,i.lastBaseUpdate=n}function us(e,n,i,s){var a=e.updateQueue;jn=!1;var d=a.firstBaseUpdate,x=a.lastBaseUpdate,T=a.shared.pending;if(T!==null){a.shared.pending=null;var L=T,q=L.next;L.next=null,x===null?d=q:x.next=q,x=L;var oe=e.alternate;oe!==null&&(oe=oe.updateQueue,T=oe.lastBaseUpdate,T!==x&&(T===null?oe.firstBaseUpdate=q:T.next=q,oe.lastBaseUpdate=L))}if(d!==null){var le=a.baseState;x=0,oe=q=L=null,T=d;do{var ie=T.lane,de=T.eventTime;if((s&ie)===ie){oe!==null&&(oe=oe.next={eventTime:de,lane:0,tag:T.tag,payload:T.payload,callback:T.callback,next:null});e:{var me=e,ve=T;switch(ie=n,de=i,ve.tag){case 1:if(me=ve.payload,typeof me=="function"){le=me.call(de,le,ie);break e}le=me;break e;case 3:me.flags=me.flags&-65537|128;case 0:if(me=ve.payload,ie=typeof me=="function"?me.call(de,le,ie):me,ie==null)break e;le=O({},le,ie);break e;case 2:jn=!0}}T.callback!==null&&T.lane!==0&&(e.flags|=64,ie=a.effects,ie===null?a.effects=[T]:ie.push(T))}else de={eventTime:de,lane:ie,tag:T.tag,payload:T.payload,callback:T.callback,next:null},oe===null?(q=oe=de,L=le):oe=oe.next=de,x|=ie;if(T=T.next,T===null){if(T=a.shared.pending,T===null)break;ie=T,T=ie.next,ie.next=null,a.lastBaseUpdate=ie,a.shared.pending=null}}while(!0);if(oe===null&&(L=le),a.baseState=L,a.firstBaseUpdate=q,a.lastBaseUpdate=oe,n=a.shared.interleaved,n!==null){a=n;do x|=a.lane,a=a.next;while(a!==n)}else d===null&&(a.shared.lanes=0);sr|=x,e.lanes=x,e.memoizedState=le}}function vf(e,n,i){if(e=n.effects,n.effects=null,e!==null)for(n=0;ni?i:4,e(!0);var s=Mu.transition;Mu.transition={};try{e(!1),n()}finally{je=i,Mu.transition=s}}function Df(){return zt().memoizedState}function Xm(e,n,i){var s=Dn(e);if(i={lane:s,action:i,hasEagerState:!1,eagerState:null,next:null},Of(e))Ff(n,i);else if(i=gf(e,n,i,s),i!==null){var a=lt();Ft(i,e,s,a),Hf(i,n,s)}}function Qm(e,n,i){var s=Dn(e),a={lane:s,action:i,hasEagerState:!1,eagerState:null,next:null};if(Of(e))Ff(n,a);else{var d=e.alternate;if(e.lanes===0&&(d===null||d.lanes===0)&&(d=n.lastRenderedReducer,d!==null))try{var x=n.lastRenderedState,T=d(x,i);if(a.hasEagerState=!0,a.eagerState=T,Rt(T,x)){var L=n.interleaved;L===null?(a.next=a,Su(n)):(a.next=L.next,L.next=a),n.interleaved=a;return}}catch{}finally{}i=gf(e,n,a,s),i!==null&&(a=lt(),Ft(i,e,s,a),Hf(i,n,s))}}function Of(e){var n=e.alternate;return e===He||n!==null&&n===He}function Ff(e,n){Fi=fs=!0;var i=e.pending;i===null?n.next=n:(n.next=i.next,i.next=n),e.pending=n}function Hf(e,n,i){if((i&4194240)!==0){var s=n.lanes;s&=e.pendingLanes,i|=s,n.lanes=i,Mr(e,i)}}var ps={readContext:Tt,useCallback:rt,useContext:rt,useEffect:rt,useImperativeHandle:rt,useInsertionEffect:rt,useLayoutEffect:rt,useMemo:rt,useReducer:rt,useRef:rt,useState:rt,useDebugValue:rt,useDeferredValue:rt,useTransition:rt,useMutableSource:rt,useSyncExternalStore:rt,useId:rt,unstable_isNewReconciler:!1},Gm={readContext:Tt,useCallback:function(e,n){return en().memoizedState=[e,n===void 0?null:n],e},useContext:Tt,useEffect:If,useImperativeHandle:function(e,n,i){return i=i!=null?i.concat([e]):null,ds(4194308,4,jf.bind(null,n,e),i)},useLayoutEffect:function(e,n){return ds(4194308,4,e,n)},useInsertionEffect:function(e,n){return ds(4,2,e,n)},useMemo:function(e,n){var i=en();return n=n===void 0?null:n,e=e(),i.memoizedState=[e,n],e},useReducer:function(e,n,i){var s=en();return n=i!==void 0?i(n):n,s.memoizedState=s.baseState=n,e={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:n},s.queue=e,e=e.dispatch=Xm.bind(null,He,e),[s.memoizedState,e]},useRef:function(e){var n=en();return e={current:e},n.memoizedState=e},useState:Mf,useDebugValue:Ru,useDeferredValue:function(e){return en().memoizedState=e},useTransition:function(){var e=Mf(!1),n=e[0];return e=Ym.bind(null,e[1]),en().memoizedState=e,[n,e]},useMutableSource:function(){},useSyncExternalStore:function(e,n,i){var s=He,a=en();if(De){if(i===void 0)throw Error(o(407));i=i()}else{if(i=n(),Ke===null)throw Error(o(349));(or&30)!==0||_f(s,n,i)}a.memoizedState=i;var d={value:i,getSnapshot:n};return a.queue=d,If(kf.bind(null,s,d,e),[e]),s.flags|=2048,Bi(9,Ef.bind(null,s,d,i,n),void 0,null),i},useId:function(){var e=en(),n=Ke.identifierPrefix;if(De){var i=dn,s=fn;i=(s&~(1<<32-xt(s)-1)).toString(32)+i,n=":"+n+"R"+i,i=Hi++,0<\/script>",e=e.removeChild(e.firstChild)):typeof s.is=="string"?e=x.createElement(i,{is:s.is}):(e=x.createElement(i),i==="select"&&(x=e,s.multiple?x.multiple=!0:s.size&&(x.size=s.size))):e=x.createElementNS(e,i),e[Zt]=n,e[Li]=s,sd(e,n,!1,!1),n.stateNode=e;e:{switch(x=li(i,s),i){case"dialog":Re("cancel",e),Re("close",e),a=s;break;case"iframe":case"object":case"embed":Re("load",e),a=s;break;case"video":case"audio":for(a=0;aQr&&(n.flags|=128,s=!0,bi(d,!1),n.lanes=4194304)}else{if(!s)if(e=as(x),e!==null){if(n.flags|=128,s=!0,i=e.updateQueue,i!==null&&(n.updateQueue=i,n.flags|=4),bi(d,!0),d.tail===null&&d.tailMode==="hidden"&&!x.alternate&&!De)return it(n),null}else 2*Oe()-d.renderingStartTime>Qr&&i!==1073741824&&(n.flags|=128,s=!0,bi(d,!1),n.lanes=4194304);d.isBackwards?(x.sibling=n.child,n.child=x):(i=d.last,i!==null?i.sibling=x:n.child=x,d.last=x)}return d.tail!==null?(n=d.tail,d.rendering=n,d.tail=n.sibling,d.renderingStartTime=Oe(),n.sibling=null,i=Fe.current,Le(Fe,s?i&1|2:i&1),n):(it(n),null);case 22:case 23:return ia(),s=n.memoizedState!==null,e!==null&&e.memoizedState!==null!==s&&(n.flags|=8192),s&&(n.mode&1)!==0?(Et&1073741824)!==0&&(it(n),n.subtreeFlags&6&&(n.flags|=8192)):it(n),null;case 24:return null;case 25:return null}throw Error(o(156,n.tag))}function r0(e,n){switch(hu(n),n.tag){case 1:return ft(n.type)&&Zo(),e=n.flags,e&65536?(n.flags=e&-65537|128,n):null;case 3:return Ur(),Ae(ct),Ae(nt),Cu(),e=n.flags,(e&65536)!==0&&(e&128)===0?(n.flags=e&-65537|128,n):null;case 5:return ku(n),null;case 13:if(Ae(Fe),e=n.memoizedState,e!==null&&e.dehydrated!==null){if(n.alternate===null)throw Error(o(340));Hr()}return e=n.flags,e&65536?(n.flags=e&-65537|128,n):null;case 19:return Ae(Fe),null;case 4:return Ur(),null;case 10:return xu(n.type._context),null;case 22:case 23:return ia(),null;case 24:return null;default:return null}}var vs=!1,ot=!1,i0=typeof WeakSet=="function"?WeakSet:Set,pe=null;function Yr(e,n){var i=e.ref;if(i!==null)if(typeof i=="function")try{i(null)}catch(s){Be(e,n,s)}else i.current=null}function Yu(e,n,i){try{i()}catch(s){Be(e,n,s)}}var ad=!1;function o0(e,n){if(iu=Oo,e=Hc(),Kl(e)){if("selectionStart"in e)var i={start:e.selectionStart,end:e.selectionEnd};else e:{i=(i=e.ownerDocument)&&i.defaultView||window;var s=i.getSelection&&i.getSelection();if(s&&s.rangeCount!==0){i=s.anchorNode;var a=s.anchorOffset,d=s.focusNode;s=s.focusOffset;try{i.nodeType,d.nodeType}catch{i=null;break e}var x=0,T=-1,L=-1,q=0,oe=0,le=e,ie=null;t:for(;;){for(var de;le!==i||a!==0&&le.nodeType!==3||(T=x+a),le!==d||s!==0&&le.nodeType!==3||(L=x+s),le.nodeType===3&&(x+=le.nodeValue.length),(de=le.firstChild)!==null;)ie=le,le=de;for(;;){if(le===e)break t;if(ie===i&&++q===a&&(T=x),ie===d&&++oe===s&&(L=x),(de=le.nextSibling)!==null)break;le=ie,ie=le.parentNode}le=de}i=T===-1||L===-1?null:{start:T,end:L}}else i=null}i=i||{start:0,end:0}}else i=null;for(ou={focusedElem:e,selectionRange:i},Oo=!1,pe=n;pe!==null;)if(n=pe,e=n.child,(n.subtreeFlags&1028)!==0&&e!==null)e.return=n,pe=e;else for(;pe!==null;){n=pe;try{var me=n.alternate;if((n.flags&1024)!==0)switch(n.tag){case 0:case 11:case 15:break;case 1:if(me!==null){var ve=me.memoizedProps,be=me.memoizedState,W=n.stateNode,D=W.getSnapshotBeforeUpdate(n.elementType===n.type?ve:$t(n.type,ve),be);W.__reactInternalSnapshotBeforeUpdate=D}break;case 3:var Y=n.stateNode.containerInfo;Y.nodeType===1?Y.textContent="":Y.nodeType===9&&Y.documentElement&&Y.removeChild(Y.documentElement);break;case 5:case 6:case 4:case 17:break;default:throw Error(o(163))}}catch(ue){Be(n,n.return,ue)}if(e=n.sibling,e!==null){e.return=n.return,pe=e;break}pe=n.return}return me=ad,ad=!1,me}function Ui(e,n,i){var s=n.updateQueue;if(s=s!==null?s.lastEffect:null,s!==null){var a=s=s.next;do{if((a.tag&e)===e){var d=a.destroy;a.destroy=void 0,d!==void 0&&Yu(n,i,d)}a=a.next}while(a!==s)}}function xs(e,n){if(n=n.updateQueue,n=n!==null?n.lastEffect:null,n!==null){var i=n=n.next;do{if((i.tag&e)===e){var s=i.create;i.destroy=s()}i=i.next}while(i!==n)}}function Xu(e){var n=e.ref;if(n!==null){var i=e.stateNode;switch(e.tag){case 5:e=i;break;default:e=i}typeof n=="function"?n(e):n.current=e}}function cd(e){var n=e.alternate;n!==null&&(e.alternate=null,cd(n)),e.child=null,e.deletions=null,e.sibling=null,e.tag===5&&(n=e.stateNode,n!==null&&(delete n[Zt],delete n[Li],delete n[au],delete n[Vm],delete n[Bm])),e.stateNode=null,e.return=null,e.dependencies=null,e.memoizedProps=null,e.memoizedState=null,e.pendingProps=null,e.stateNode=null,e.updateQueue=null}function fd(e){return e.tag===5||e.tag===3||e.tag===4}function dd(e){e:for(;;){for(;e.sibling===null;){if(e.return===null||fd(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;e.tag!==5&&e.tag!==6&&e.tag!==18;){if(e.flags&2||e.child===null||e.tag===4)continue e;e.child.return=e,e=e.child}if(!(e.flags&2))return e.stateNode}}function Qu(e,n,i){var s=e.tag;if(s===5||s===6)e=e.stateNode,n?i.nodeType===8?i.parentNode.insertBefore(e,n):i.insertBefore(e,n):(i.nodeType===8?(n=i.parentNode,n.insertBefore(e,i)):(n=i,n.appendChild(e)),i=i._reactRootContainer,i!=null||n.onclick!==null||(n.onclick=Ko));else if(s!==4&&(e=e.child,e!==null))for(Qu(e,n,i),e=e.sibling;e!==null;)Qu(e,n,i),e=e.sibling}function Gu(e,n,i){var s=e.tag;if(s===5||s===6)e=e.stateNode,n?i.insertBefore(e,n):i.appendChild(e);else if(s!==4&&(e=e.child,e!==null))for(Gu(e,n,i),e=e.sibling;e!==null;)Gu(e,n,i),e=e.sibling}var Ze=null,Dt=!1;function Rn(e,n,i){for(i=i.child;i!==null;)hd(e,n,i),i=i.sibling}function hd(e,n,i){if(vt&&typeof vt.onCommitFiberUnmount=="function")try{vt.onCommitFiberUnmount(kr,i)}catch{}switch(i.tag){case 5:ot||Yr(i,n);case 6:var s=Ze,a=Dt;Ze=null,Rn(e,n,i),Ze=s,Dt=a,Ze!==null&&(Dt?(e=Ze,i=i.stateNode,e.nodeType===8?e.parentNode.removeChild(i):e.removeChild(i)):Ze.removeChild(i.stateNode));break;case 18:Ze!==null&&(Dt?(e=Ze,i=i.stateNode,e.nodeType===8?uu(e.parentNode,i):e.nodeType===1&&uu(e,i),_i(e)):uu(Ze,i.stateNode));break;case 4:s=Ze,a=Dt,Ze=i.stateNode.containerInfo,Dt=!0,Rn(e,n,i),Ze=s,Dt=a;break;case 0:case 11:case 14:case 15:if(!ot&&(s=i.updateQueue,s!==null&&(s=s.lastEffect,s!==null))){a=s=s.next;do{var d=a,x=d.destroy;d=d.tag,x!==void 0&&((d&2)!==0||(d&4)!==0)&&Yu(i,n,x),a=a.next}while(a!==s)}Rn(e,n,i);break;case 1:if(!ot&&(Yr(i,n),s=i.stateNode,typeof s.componentWillUnmount=="function"))try{s.props=i.memoizedProps,s.state=i.memoizedState,s.componentWillUnmount()}catch(T){Be(i,n,T)}Rn(e,n,i);break;case 21:Rn(e,n,i);break;case 22:i.mode&1?(ot=(s=ot)||i.memoizedState!==null,Rn(e,n,i),ot=s):Rn(e,n,i);break;default:Rn(e,n,i)}}function pd(e){var n=e.updateQueue;if(n!==null){e.updateQueue=null;var i=e.stateNode;i===null&&(i=e.stateNode=new i0),n.forEach(function(s){var a=p0.bind(null,e,s);i.has(s)||(i.add(s),s.then(a,a))})}}function Ot(e,n){var i=n.deletions;if(i!==null)for(var s=0;sa&&(a=x),s&=~d}if(s=a,s=Oe()-s,s=(120>s?120:480>s?480:1080>s?1080:1920>s?1920:3e3>s?3e3:4320>s?4320:1960*l0(s/1960))-s,10e?16:e,$n===null)var s=!1;else{if(e=$n,$n=null,ks=0,(Ie&6)!==0)throw Error(o(331));var a=Ie;for(Ie|=4,pe=e.current;pe!==null;){var d=pe,x=d.child;if((pe.flags&16)!==0){var T=d.deletions;if(T!==null){for(var L=0;LOe()-Zu?ur(e,0):qu|=i),pt(e,n)}function Md(e,n){n===0&&((e.mode&1)===0?n=1:(n=Cr,Cr<<=1,(Cr&130023424)===0&&(Cr=4194304)));var i=lt();e=hn(e,n),e!==null&&(Zn(e,n,i),pt(e,i))}function h0(e){var n=e.memoizedState,i=0;n!==null&&(i=n.retryLane),Md(e,i)}function p0(e,n){var i=0;switch(e.tag){case 13:var s=e.stateNode,a=e.memoizedState;a!==null&&(i=a.retryLane);break;case 19:s=e.stateNode;break;default:throw Error(o(314))}s!==null&&s.delete(n),Md(e,i)}var Pd;Pd=function(e,n,i){if(e!==null)if(e.memoizedProps!==n.pendingProps||ct.current)dt=!0;else{if((e.lanes&i)===0&&(n.flags&128)===0)return dt=!1,t0(e,n,i);dt=(e.flags&131072)!==0}else dt=!1,De&&(n.flags&1048576)!==0&&lf(n,ns,n.index);switch(n.lanes=0,n.tag){case 2:var s=n.type;ys(e,n),e=n.pendingProps;var a=Dr(n,nt.current);br(n,i),a=Iu(null,n,s,e,a,i);var d=Tu();return n.flags|=1,typeof a=="object"&&a!==null&&typeof a.render=="function"&&a.$$typeof===void 0?(n.tag=1,n.memoizedState=null,n.updateQueue=null,ft(s)?(d=!0,Jo(n)):d=!1,n.memoizedState=a.state!==null&&a.state!==void 0?a.state:null,_u(n),a.updater=gs,n.stateNode=a,a._reactInternals=n,$u(n,s,e,i),n=Hu(null,n,s,!0,d,i)):(n.tag=0,De&&d&&du(n),st(null,n,a,i),n=n.child),n;case 16:s=n.elementType;e:{switch(ys(e,n),e=n.pendingProps,a=s._init,s=a(s._payload),n.type=s,a=n.tag=m0(s),e=$t(s,e),a){case 0:n=Fu(null,n,s,e,i);break e;case 1:n=ed(null,n,s,e,i);break e;case 11:n=Gf(null,n,s,e,i);break e;case 14:n=Kf(null,n,s,$t(s.type,e),i);break e}throw Error(o(306,s,""))}return n;case 0:return s=n.type,a=n.pendingProps,a=n.elementType===s?a:$t(s,a),Fu(e,n,s,a,i);case 1:return s=n.type,a=n.pendingProps,a=n.elementType===s?a:$t(s,a),ed(e,n,s,a,i);case 3:e:{if(td(n),e===null)throw Error(o(387));s=n.pendingProps,d=n.memoizedState,a=d.element,mf(e,n),us(n,s,null,i);var x=n.memoizedState;if(s=x.element,d.isDehydrated)if(d={element:s,isDehydrated:!1,cache:x.cache,pendingSuspenseBoundaries:x.pendingSuspenseBoundaries,transitions:x.transitions},n.updateQueue.baseState=d,n.memoizedState=d,n.flags&256){a=Wr(Error(o(423)),n),n=nd(e,n,s,i,a);break e}else if(s!==a){a=Wr(Error(o(424)),n),n=nd(e,n,s,i,a);break e}else for(_t=Pn(n.stateNode.containerInfo.firstChild),St=n,De=!0,At=null,i=pf(n,null,s,i),n.child=i;i;)i.flags=i.flags&-3|4096,i=i.sibling;else{if(Hr(),s===a){n=gn(e,n,i);break e}st(e,n,s,i)}n=n.child}return n;case 5:return xf(n),e===null&&gu(n),s=n.type,a=n.pendingProps,d=e!==null?e.memoizedProps:null,x=a.children,su(s,a)?x=null:d!==null&&su(s,d)&&(n.flags|=32),Jf(e,n),st(e,n,x,i),n.child;case 6:return e===null&&gu(n),null;case 13:return rd(e,n,i);case 4:return Eu(n,n.stateNode.containerInfo),s=n.pendingProps,e===null?n.child=Vr(n,null,s,i):st(e,n,s,i),n.child;case 11:return s=n.type,a=n.pendingProps,a=n.elementType===s?a:$t(s,a),Gf(e,n,s,a,i);case 7:return st(e,n,n.pendingProps,i),n.child;case 8:return st(e,n,n.pendingProps.children,i),n.child;case 12:return st(e,n,n.pendingProps.children,i),n.child;case 10:e:{if(s=n.type._context,a=n.pendingProps,d=n.memoizedProps,x=a.value,Le(os,s._currentValue),s._currentValue=x,d!==null)if(Rt(d.value,x)){if(d.children===a.children&&!ct.current){n=gn(e,n,i);break e}}else for(d=n.child,d!==null&&(d.return=n);d!==null;){var T=d.dependencies;if(T!==null){x=d.child;for(var L=T.firstContext;L!==null;){if(L.context===s){if(d.tag===1){L=pn(-1,i&-i),L.tag=2;var q=d.updateQueue;if(q!==null){q=q.shared;var oe=q.pending;oe===null?L.next=L:(L.next=oe.next,oe.next=L),q.pending=L}}d.lanes|=i,L=d.alternate,L!==null&&(L.lanes|=i),wu(d.return,i,n),T.lanes|=i;break}L=L.next}}else if(d.tag===10)x=d.type===n.type?null:d.child;else if(d.tag===18){if(x=d.return,x===null)throw Error(o(341));x.lanes|=i,T=x.alternate,T!==null&&(T.lanes|=i),wu(x,i,n),x=d.sibling}else x=d.child;if(x!==null)x.return=d;else for(x=d;x!==null;){if(x===n){x=null;break}if(d=x.sibling,d!==null){d.return=x.return,x=d;break}x=x.return}d=x}st(e,n,a.children,i),n=n.child}return n;case 9:return a=n.type,s=n.pendingProps.children,br(n,i),a=Tt(a),s=s(a),n.flags|=1,st(e,n,s,i),n.child;case 14:return s=n.type,a=$t(s,n.pendingProps),a=$t(s.type,a),Kf(e,n,s,a,i);case 15:return qf(e,n,n.type,n.pendingProps,i);case 17:return s=n.type,a=n.pendingProps,a=n.elementType===s?a:$t(s,a),ys(e,n),n.tag=1,ft(s)?(e=!0,Jo(n)):e=!1,br(n,i),Bf(n,s,a),$u(n,s,a,i),Hu(null,n,s,!0,e,i);case 19:return od(e,n,i);case 22:return Zf(e,n,i)}throw Error(o(156,n.tag))};function Id(e,n){return Io(e,n)}function g0(e,n,i,s){this.tag=e,this.key=i,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=n,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=s,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function Lt(e,n,i,s){return new g0(e,n,i,s)}function sa(e){return e=e.prototype,!(!e||!e.isReactComponent)}function m0(e){if(typeof e=="function")return sa(e)?1:0;if(e!=null){if(e=e.$$typeof,e===ee)return 11;if(e===U)return 14}return 2}function Fn(e,n){var i=e.alternate;return i===null?(i=Lt(e.tag,n,e.key,e.mode),i.elementType=e.elementType,i.type=e.type,i.stateNode=e.stateNode,i.alternate=e,e.alternate=i):(i.pendingProps=n,i.type=e.type,i.flags=0,i.subtreeFlags=0,i.deletions=null),i.flags=e.flags&14680064,i.childLanes=e.childLanes,i.lanes=e.lanes,i.child=e.child,i.memoizedProps=e.memoizedProps,i.memoizedState=e.memoizedState,i.updateQueue=e.updateQueue,n=e.dependencies,i.dependencies=n===null?null:{lanes:n.lanes,firstContext:n.firstContext},i.sibling=e.sibling,i.index=e.index,i.ref=e.ref,i}function Ps(e,n,i,s,a,d){var x=2;if(s=e,typeof e=="function")sa(e)&&(x=1);else if(typeof e=="string")x=5;else e:switch(e){case V:return cr(i.children,a,d,n);case X:x=8,a|=8;break;case G:return e=Lt(12,i,n,a|2),e.elementType=G,e.lanes=d,e;case J:return e=Lt(13,i,n,a),e.elementType=J,e.lanes=d,e;case C:return e=Lt(19,i,n,a),e.elementType=C,e.lanes=d,e;case B:return Is(i,a,d,n);default:if(typeof e=="object"&&e!==null)switch(e.$$typeof){case te:x=10;break e;case Z:x=9;break e;case ee:x=11;break e;case U:x=14;break e;case H:x=16,s=null;break e}throw Error(o(130,e==null?e:typeof e,""))}return n=Lt(x,i,n,a),n.elementType=e,n.type=s,n.lanes=d,n}function cr(e,n,i,s){return e=Lt(7,e,s,n),e.lanes=i,e}function Is(e,n,i,s){return e=Lt(22,e,s,n),e.elementType=B,e.lanes=i,e.stateNode={isHidden:!1},e}function la(e,n,i){return e=Lt(6,e,null,n),e.lanes=i,e}function ua(e,n,i){return n=Lt(4,e.children!==null?e.children:[],e.key,n),n.lanes=i,n.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},n}function y0(e,n,i,s,a){this.tag=n,this.containerInfo=e,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.callbackNode=this.pendingContext=this.context=null,this.callbackPriority=0,this.eventTimes=qn(0),this.expirationTimes=qn(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=qn(0),this.identifierPrefix=s,this.onRecoverableError=a,this.mutableSourceEagerHydrationData=null}function aa(e,n,i,s,a,d,x,T,L){return e=new y0(e,n,i,T,L),n===1?(n=1,d===!0&&(n|=8)):n=0,d=Lt(3,null,null,n),e.current=d,d.stateNode=e,d.memoizedState={element:s,isDehydrated:i,cache:null,transitions:null,pendingSuspenseBoundaries:null},_u(d),e}function v0(e,n,i){var s=3"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(t)}catch(r){console.error(r)}}return t(),ga.exports=T0(),ga.exports}var bd;function z0(){if(bd)return $s;bd=1;var t=ep();return $s.createRoot=t.createRoot,$s.hydrateRoot=t.hydrateRoot,$s}var j0=z0();async function Ht(t,r){const o=await fetch(t,{...r,headers:{"Content-Type":"application/json",...(r==null?void 0:r.headers)||{}}});if(!o.ok){const l=await o.text();throw new Error(l||o.statusText)}return o.json()}const Vt={health:()=>Ht("/api/health"),settings:()=>Ht("/api/settings"),saveSettings:t=>Ht("/api/settings",{method:"PUT",body:JSON.stringify(t)}),repos:()=>Ht("/api/repos"),index:(t,r=!0)=>Ht("/api/index",{method:"POST",body:JSON.stringify({repo_path:t,incremental:r})}),indexStatus:t=>Ht(`/api/index?repo_path=${encodeURIComponent(t)}`),architecture:t=>Ht(`/api/architecture?repo_path=${encodeURIComponent(t)}`),review:(t,r,o,l=!0)=>Ht("/api/review",{method:"POST",body:JSON.stringify({repo_path:t,base:r,head:o||null,reindex:l,incremental:!0})}),graph:(t,r="full")=>Ht(`/api/graph?repo_path=${encodeURIComponent(t)}&scope=${r}`),prs:(t,r,o="open")=>Ht("/api/prs",{method:"POST",body:JSON.stringify({provider:t,repo:r,state:o})}),residual:t=>Ht("/api/ai/residual",{method:"POST",body:JSON.stringify({review:t})})};function We(t){if(typeof t=="string"||typeof t=="number")return""+t;let r="";if(Array.isArray(t))for(let o=0,l;o{}};function al(){for(var t=0,r=arguments.length,o={},l;t=0&&(l=o.slice(u+1),o=o.slice(0,u)),o&&!r.hasOwnProperty(o))throw new Error("unknown type: "+o);return{type:o,name:l}})}Ys.prototype=al.prototype={constructor:Ys,on:function(t,r){var o=this._,l=R0(t+"",o),u,c=-1,f=l.length;if(arguments.length<2){for(;++c0)for(var o=new Array(u),l=0,u,c;l=0&&(r=t.slice(0,o))!=="xmlns"&&(t=t.slice(o+1)),Wd.hasOwnProperty(r)?{space:Wd[r],local:t}:t}function $0(t){return function(){var r=this.ownerDocument,o=this.namespaceURI;return o===ja&&r.documentElement.namespaceURI===ja?r.createElement(t):r.createElementNS(o,t)}}function D0(t){return function(){return this.ownerDocument.createElementNS(t.space,t.local)}}function tp(t){var r=cl(t);return(r.local?D0:$0)(r)}function O0(){}function Xa(t){return t==null?O0:function(){return this.querySelector(t)}}function F0(t){typeof t!="function"&&(t=Xa(t));for(var r=this._groups,o=r.length,l=new Array(o),u=0;u=_&&(_=j+1);!(b=N[_])&&++_=0;)(f=l[u])&&(c&&f.compareDocumentPosition(c)^4&&c.parentNode.insertBefore(f,c),c=f);return this}function cy(t){t||(t=fy);function r(v,g){return v&&g?t(v.__data__,g.__data__):!v-!g}for(var o=this._groups,l=o.length,u=new Array(l),c=0;cr?1:t>=r?0:NaN}function dy(){var t=arguments[0];return arguments[0]=this,t.apply(null,arguments),this}function hy(){return Array.from(this)}function py(){for(var t=this._groups,r=0,o=t.length;r1?this.each((r==null?Ny:typeof r=="function"?My:Cy)(t,r,o??"")):ei(this.node(),t)}function ei(t,r){return t.style.getPropertyValue(r)||sp(t).getComputedStyle(t,null).getPropertyValue(r)}function Iy(t){return function(){delete this[t]}}function Ty(t,r){return function(){this[t]=r}}function zy(t,r){return function(){var o=r.apply(this,arguments);o==null?delete this[t]:this[t]=o}}function jy(t,r){return arguments.length>1?this.each((r==null?Iy:typeof r=="function"?zy:Ty)(t,r)):this.node()[t]}function lp(t){return t.trim().split(/^|\s+/)}function Qa(t){return t.classList||new up(t)}function up(t){this._node=t,this._names=lp(t.getAttribute("class")||"")}up.prototype={add:function(t){var r=this._names.indexOf(t);r<0&&(this._names.push(t),this._node.setAttribute("class",this._names.join(" ")))},remove:function(t){var r=this._names.indexOf(t);r>=0&&(this._names.splice(r,1),this._node.setAttribute("class",this._names.join(" ")))},contains:function(t){return this._names.indexOf(t)>=0}};function ap(t,r){for(var o=Qa(t),l=-1,u=r.length;++l=0&&(o=r.slice(l+1),r=r.slice(0,l)),{type:r,name:o}})}function sv(t){return function(){var r=this.__on;if(r){for(var o=0,l=-1,u=r.length,c;o()=>t;function La(t,{sourceEvent:r,subject:o,target:l,identifier:u,active:c,x:f,y:h,dx:p,dy:y,dispatch:m}){Object.defineProperties(this,{type:{value:t,enumerable:!0,configurable:!0},sourceEvent:{value:r,enumerable:!0,configurable:!0},subject:{value:o,enumerable:!0,configurable:!0},target:{value:l,enumerable:!0,configurable:!0},identifier:{value:u,enumerable:!0,configurable:!0},active:{value:c,enumerable:!0,configurable:!0},x:{value:f,enumerable:!0,configurable:!0},y:{value:h,enumerable:!0,configurable:!0},dx:{value:p,enumerable:!0,configurable:!0},dy:{value:y,enumerable:!0,configurable:!0},_:{value:m}})}La.prototype.on=function(){var t=this._.on.apply(this._,arguments);return t===this._?this:t};function mv(t){return!t.ctrlKey&&!t.button}function yv(){return this.parentNode}function vv(t,r){return r??{x:t.x,y:t.y}}function xv(){return navigator.maxTouchPoints||"ontouchstart"in this}function gp(){var t=mv,r=yv,o=vv,l=xv,u={},c=al("start","drag","end"),f=0,h,p,y,m,v=0;function g(I){I.on("mousedown.drag",w).filter(l).on("touchstart.drag",N).on("touchmove.drag",E,gv).on("touchend.drag touchcancel.drag",j).style("touch-action","none").style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}function w(I,b){if(!(m||!t.call(this,I,b))){var $=_(this,r.call(this,I,b),I,b,"mouse");$&&(kt(I.view).on("mousemove.drag",S,no).on("mouseup.drag",P,no),hp(I.view),va(I),y=!1,h=I.clientX,p=I.clientY,$("start",I))}}function S(I){if(Zr(I),!y){var b=I.clientX-h,$=I.clientY-p;y=b*b+$*$>v}u.mouse("drag",I)}function P(I){kt(I.view).on("mousemove.drag mouseup.drag",null),pp(I.view,y),Zr(I),u.mouse("end",I)}function N(I,b){if(t.call(this,I,b)){var $=I.changedTouches,V=r.call(this,I,b),X=$.length,G,te;for(G=0;G>8&15|r>>4&240,r>>4&15|r&240,(r&15)<<4|r&15,1):o===8?Os(r>>24&255,r>>16&255,r>>8&255,(r&255)/255):o===4?Os(r>>12&15|r>>8&240,r>>8&15|r>>4&240,r>>4&15|r&240,((r&15)<<4|r&15)/255):null):(r=Sv.exec(t))?new mt(r[1],r[2],r[3],1):(r=_v.exec(t))?new mt(r[1]*255/100,r[2]*255/100,r[3]*255/100,1):(r=Ev.exec(t))?Os(r[1],r[2],r[3],r[4]):(r=kv.exec(t))?Os(r[1]*255/100,r[2]*255/100,r[3]*255/100,r[4]):(r=Nv.exec(t))?Zd(r[1],r[2]/100,r[3]/100,1):(r=Cv.exec(t))?Zd(r[1],r[2]/100,r[3]/100,r[4]):Yd.hasOwnProperty(t)?Gd(Yd[t]):t==="transparent"?new mt(NaN,NaN,NaN,0):null}function Gd(t){return new mt(t>>16&255,t>>8&255,t&255,1)}function Os(t,r,o,l){return l<=0&&(t=r=o=NaN),new mt(t,r,o,l)}function Iv(t){return t instanceof po||(t=gr(t)),t?(t=t.rgb(),new mt(t.r,t.g,t.b,t.opacity)):new mt}function Ra(t,r,o,l){return arguments.length===1?Iv(t):new mt(t,r,o,l??1)}function mt(t,r,o,l){this.r=+t,this.g=+r,this.b=+o,this.opacity=+l}Ga(mt,Ra,mp(po,{brighter(t){return t=t==null?Zs:Math.pow(Zs,t),new mt(this.r*t,this.g*t,this.b*t,this.opacity)},darker(t){return t=t==null?ro:Math.pow(ro,t),new mt(this.r*t,this.g*t,this.b*t,this.opacity)},rgb(){return this},clamp(){return new mt(hr(this.r),hr(this.g),hr(this.b),Js(this.opacity))},displayable(){return-.5<=this.r&&this.r<255.5&&-.5<=this.g&&this.g<255.5&&-.5<=this.b&&this.b<255.5&&0<=this.opacity&&this.opacity<=1},hex:Kd,formatHex:Kd,formatHex8:Tv,formatRgb:qd,toString:qd}));function Kd(){return`#${dr(this.r)}${dr(this.g)}${dr(this.b)}`}function Tv(){return`#${dr(this.r)}${dr(this.g)}${dr(this.b)}${dr((isNaN(this.opacity)?1:this.opacity)*255)}`}function qd(){const t=Js(this.opacity);return`${t===1?"rgb(":"rgba("}${hr(this.r)}, ${hr(this.g)}, ${hr(this.b)}${t===1?")":`, ${t})`}`}function Js(t){return isNaN(t)?1:Math.max(0,Math.min(1,t))}function hr(t){return Math.max(0,Math.min(255,Math.round(t)||0))}function dr(t){return t=hr(t),(t<16?"0":"")+t.toString(16)}function Zd(t,r,o,l){return l<=0?t=r=o=NaN:o<=0||o>=1?t=r=NaN:r<=0&&(t=NaN),new bt(t,r,o,l)}function yp(t){if(t instanceof bt)return new bt(t.h,t.s,t.l,t.opacity);if(t instanceof po||(t=gr(t)),!t)return new bt;if(t instanceof bt)return t;t=t.rgb();var r=t.r/255,o=t.g/255,l=t.b/255,u=Math.min(r,o,l),c=Math.max(r,o,l),f=NaN,h=c-u,p=(c+u)/2;return h?(r===c?f=(o-l)/h+(o0&&p<1?0:f,new bt(f,h,p,t.opacity)}function zv(t,r,o,l){return arguments.length===1?yp(t):new bt(t,r,o,l??1)}function bt(t,r,o,l){this.h=+t,this.s=+r,this.l=+o,this.opacity=+l}Ga(bt,zv,mp(po,{brighter(t){return t=t==null?Zs:Math.pow(Zs,t),new bt(this.h,this.s,this.l*t,this.opacity)},darker(t){return t=t==null?ro:Math.pow(ro,t),new bt(this.h,this.s,this.l*t,this.opacity)},rgb(){var t=this.h%360+(this.h<0)*360,r=isNaN(t)||isNaN(this.s)?0:this.s,o=this.l,l=o+(o<.5?o:1-o)*r,u=2*o-l;return new mt(xa(t>=240?t-240:t+120,u,l),xa(t,u,l),xa(t<120?t+240:t-120,u,l),this.opacity)},clamp(){return new bt(Jd(this.h),Fs(this.s),Fs(this.l),Js(this.opacity))},displayable(){return(0<=this.s&&this.s<=1||isNaN(this.s))&&0<=this.l&&this.l<=1&&0<=this.opacity&&this.opacity<=1},formatHsl(){const t=Js(this.opacity);return`${t===1?"hsl(":"hsla("}${Jd(this.h)}, ${Fs(this.s)*100}%, ${Fs(this.l)*100}%${t===1?")":`, ${t})`}`}}));function Jd(t){return t=(t||0)%360,t<0?t+360:t}function Fs(t){return Math.max(0,Math.min(1,t||0))}function xa(t,r,o){return(t<60?r+(o-r)*t/60:t<180?o:t<240?r+(o-r)*(240-t)/60:r)*255}const Ka=t=>()=>t;function jv(t,r){return function(o){return t+o*r}}function Lv(t,r,o){return t=Math.pow(t,o),r=Math.pow(r,o)-t,o=1/o,function(l){return Math.pow(t+l*r,o)}}function Rv(t){return(t=+t)==1?vp:function(r,o){return o-r?Lv(r,o,t):Ka(isNaN(r)?o:r)}}function vp(t,r){var o=r-t;return o?jv(t,o):Ka(isNaN(t)?r:t)}const el=(function t(r){var o=Rv(r);function l(u,c){var f=o((u=Ra(u)).r,(c=Ra(c)).r),h=o(u.g,c.g),p=o(u.b,c.b),y=vp(u.opacity,c.opacity);return function(m){return u.r=f(m),u.g=h(m),u.b=p(m),u.opacity=y(m),u+""}}return l.gamma=t,l})(1);function Av(t,r){r||(r=[]);var o=t?Math.min(r.length,t.length):0,l=r.slice(),u;return function(c){for(u=0;uo&&(c=r.slice(o,c),h[f]?h[f]+=c:h[++f]=c),(l=l[0])===(u=u[0])?h[f]?h[f]+=u:h[++f]=u:(h[++f]=null,p.push({i:f,x:nn(l,u)})),o=wa.lastIndex;return o180?m+=360:m-y>180&&(y+=360),g.push({i:v.push(u(v)+"rotate(",null,l)-2,x:nn(y,m)})):m&&v.push(u(v)+"rotate("+m+l)}function h(y,m,v,g){y!==m?g.push({i:v.push(u(v)+"skewX(",null,l)-2,x:nn(y,m)}):m&&v.push(u(v)+"skewX("+m+l)}function p(y,m,v,g,w,S){if(y!==v||m!==g){var P=w.push(u(w)+"scale(",null,",",null,")");S.push({i:P-4,x:nn(y,v)},{i:P-2,x:nn(m,g)})}else(v!==1||g!==1)&&w.push(u(w)+"scale("+v+","+g+")")}return function(y,m){var v=[],g=[];return y=t(y),m=t(m),c(y.translateX,y.translateY,m.translateX,m.translateY,v,g),f(y.rotate,m.rotate,v,g),h(y.skewX,m.skewX,v,g),p(y.scaleX,y.scaleY,m.scaleX,m.scaleY,v,g),y=m=null,function(w){for(var S=-1,P=g.length,N;++S=0&&t._call.call(void 0,r),t=t._next;--ti}function nh(){mr=(nl=oo.now())+fl,ti=Zi=0;try{Kv()}finally{ti=0,Zv(),mr=0}}function qv(){var t=oo.now(),r=t-nl;r>_p&&(fl-=r,nl=t)}function Zv(){for(var t,r=tl,o,l=1/0;r;)r._call?(l>r._time&&(l=r._time),t=r,r=r._next):(o=r._next,r._next=null,r=t?t._next=o:tl=o);Ji=t,Da(l)}function Da(t){if(!ti){Zi&&(Zi=clearTimeout(Zi));var r=t-mr;r>24?(t<1/0&&(Zi=setTimeout(nh,t-oo.now()-fl)),Ki&&(Ki=clearInterval(Ki))):(Ki||(nl=oo.now(),Ki=setInterval(qv,_p)),ti=1,Ep(nh))}}function rh(t,r,o){var l=new rl;return r=r==null?0:+r,l.restart(u=>{l.stop(),t(u+r)},r,o),l}var Jv=al("start","end","cancel","interrupt"),ex=[],Np=0,ih=1,Oa=2,Qs=3,oh=4,Fa=5,Gs=6;function dl(t,r,o,l,u,c){var f=t.__transition;if(!f)t.__transition={};else if(o in f)return;tx(t,o,{name:r,index:l,group:u,on:Jv,tween:ex,time:c.time,delay:c.delay,duration:c.duration,ease:c.ease,timer:null,state:Np})}function Za(t,r){var o=Xt(t,r);if(o.state>Np)throw new Error("too late; already scheduled");return o}function on(t,r){var o=Xt(t,r);if(o.state>Qs)throw new Error("too late; already running");return o}function Xt(t,r){var o=t.__transition;if(!o||!(o=o[r]))throw new Error("transition not found");return o}function tx(t,r,o){var l=t.__transition,u;l[r]=o,o.timer=kp(c,0,o.time);function c(y){o.state=ih,o.timer.restart(f,o.delay,o.time),o.delay<=y&&f(y-o.delay)}function f(y){var m,v,g,w;if(o.state!==ih)return p();for(m in l)if(w=l[m],w.name===o.name){if(w.state===Qs)return rh(f);w.state===oh?(w.state=Gs,w.timer.stop(),w.on.call("interrupt",t,t.__data__,w.index,w.group),delete l[m]):+mOa&&l.state=0&&(r=r.slice(0,o)),!r||r==="start"})}function zx(t,r,o){var l,u,c=Tx(r)?Za:on;return function(){var f=c(this,t),h=f.on;h!==l&&(u=(l=h).copy()).on(r,o),f.on=u}}function jx(t,r){var o=this._id;return arguments.length<2?Xt(this.node(),o).on.on(t):this.each(zx(o,t,r))}function Lx(t){return function(){var r=this.parentNode;for(var o in this.__transition)if(+o!==t)return;r&&r.removeChild(this)}}function Rx(){return this.on("end.remove",Lx(this._id))}function Ax(t){var r=this._name,o=this._id;typeof t!="function"&&(t=Xa(t));for(var l=this._groups,u=l.length,c=new Array(u),f=0;f()=>t;function sw(t,{sourceEvent:r,target:o,transform:l,dispatch:u}){Object.defineProperties(this,{type:{value:t,enumerable:!0,configurable:!0},sourceEvent:{value:r,enumerable:!0,configurable:!0},target:{value:o,enumerable:!0,configurable:!0},transform:{value:l,enumerable:!0,configurable:!0},_:{value:u}})}function vn(t,r,o){this.k=t,this.x=r,this.y=o}vn.prototype={constructor:vn,scale:function(t){return t===1?this:new vn(this.k*t,this.x,this.y)},translate:function(t,r){return t===0&r===0?this:new vn(this.k,this.x+this.k*t,this.y+this.k*r)},apply:function(t){return[t[0]*this.k+this.x,t[1]*this.k+this.y]},applyX:function(t){return t*this.k+this.x},applyY:function(t){return t*this.k+this.y},invert:function(t){return[(t[0]-this.x)/this.k,(t[1]-this.y)/this.k]},invertX:function(t){return(t-this.x)/this.k},invertY:function(t){return(t-this.y)/this.k},rescaleX:function(t){return t.copy().domain(t.range().map(this.invertX,this).map(t.invert,t))},rescaleY:function(t){return t.copy().domain(t.range().map(this.invertY,this).map(t.invert,t))},toString:function(){return"translate("+this.x+","+this.y+") scale("+this.k+")"}};var hl=new vn(1,0,0);Ip.prototype=vn.prototype;function Ip(t){for(;!t.__zoom;)if(!(t=t.parentNode))return hl;return t.__zoom}function Sa(t){t.stopImmediatePropagation()}function qi(t){t.preventDefault(),t.stopImmediatePropagation()}function lw(t){return(!t.ctrlKey||t.type==="wheel")&&!t.button}function uw(){var t=this;return t instanceof SVGElement?(t=t.ownerSVGElement||t,t.hasAttribute("viewBox")?(t=t.viewBox.baseVal,[[t.x,t.y],[t.x+t.width,t.y+t.height]]):[[0,0],[t.width.baseVal.value,t.height.baseVal.value]]):[[0,0],[t.clientWidth,t.clientHeight]]}function sh(){return this.__zoom||hl}function aw(t){return-t.deltaY*(t.deltaMode===1?.05:t.deltaMode?1:.002)*(t.ctrlKey?10:1)}function cw(){return navigator.maxTouchPoints||"ontouchstart"in this}function fw(t,r,o){var l=t.invertX(r[0][0])-o[0][0],u=t.invertX(r[1][0])-o[1][0],c=t.invertY(r[0][1])-o[0][1],f=t.invertY(r[1][1])-o[1][1];return t.translate(u>l?(l+u)/2:Math.min(0,l)||Math.max(0,u),f>c?(c+f)/2:Math.min(0,c)||Math.max(0,f))}function Tp(){var t=lw,r=uw,o=fw,l=aw,u=cw,c=[0,1/0],f=[[-1/0,-1/0],[1/0,1/0]],h=250,p=Xs,y=al("start","zoom","end"),m,v,g,w=500,S=150,P=0,N=10;function E(C){C.property("__zoom",sh).on("wheel.zoom",X,{passive:!1}).on("mousedown.zoom",G).on("dblclick.zoom",te).filter(u).on("touchstart.zoom",Z).on("touchmove.zoom",ee).on("touchend.zoom touchcancel.zoom",J).style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}E.transform=function(C,U,H,B){var A=C.selection?C.selection():C;A.property("__zoom",sh),C!==A?b(C,U,H,B):A.interrupt().each(function(){$(this,arguments).event(B).start().zoom(null,typeof U=="function"?U.apply(this,arguments):U).end()})},E.scaleBy=function(C,U,H,B){E.scaleTo(C,function(){var A=this.__zoom.k,R=typeof U=="function"?U.apply(this,arguments):U;return A*R},H,B)},E.scaleTo=function(C,U,H,B){E.transform(C,function(){var A=r.apply(this,arguments),R=this.__zoom,O=H==null?I(A):typeof H=="function"?H.apply(this,arguments):H,M=R.invert(O),z=typeof U=="function"?U.apply(this,arguments):U;return o(_(j(R,z),O,M),A,f)},H,B)},E.translateBy=function(C,U,H,B){E.transform(C,function(){return o(this.__zoom.translate(typeof U=="function"?U.apply(this,arguments):U,typeof H=="function"?H.apply(this,arguments):H),r.apply(this,arguments),f)},null,B)},E.translateTo=function(C,U,H,B,A){E.transform(C,function(){var R=r.apply(this,arguments),O=this.__zoom,M=B==null?I(R):typeof B=="function"?B.apply(this,arguments):B;return o(hl.translate(M[0],M[1]).scale(O.k).translate(typeof U=="function"?-U.apply(this,arguments):-U,typeof H=="function"?-H.apply(this,arguments):-H),R,f)},B,A)};function j(C,U){return U=Math.max(c[0],Math.min(c[1],U)),U===C.k?C:new vn(U,C.x,C.y)}function _(C,U,H){var B=U[0]-H[0]*C.k,A=U[1]-H[1]*C.k;return B===C.x&&A===C.y?C:new vn(C.k,B,A)}function I(C){return[(+C[0][0]+ +C[1][0])/2,(+C[0][1]+ +C[1][1])/2]}function b(C,U,H,B){C.on("start.zoom",function(){$(this,arguments).event(B).start()}).on("interrupt.zoom end.zoom",function(){$(this,arguments).event(B).end()}).tween("zoom",function(){var A=this,R=arguments,O=$(A,R).event(B),M=r.apply(A,R),z=H==null?I(M):typeof H=="function"?H.apply(A,R):H,ne=Math.max(M[1][0]-M[0][0],M[1][1]-M[0][1]),re=A.__zoom,ae=typeof U=="function"?U.apply(A,R):U,fe=p(re.invert(z).concat(ne/re.k),ae.invert(z).concat(ne/ae.k));return function(ce){if(ce===1)ce=ae;else{var K=fe(ce),se=ne/K[2];ce=new vn(se,z[0]-K[0]*se,z[1]-K[1]*se)}O.zoom(null,ce)}})}function $(C,U,H){return!H&&C.__zooming||new V(C,U)}function V(C,U){this.that=C,this.args=U,this.active=0,this.sourceEvent=null,this.extent=r.apply(C,U),this.taps=0}V.prototype={event:function(C){return C&&(this.sourceEvent=C),this},start:function(){return++this.active===1&&(this.that.__zooming=this,this.emit("start")),this},zoom:function(C,U){return this.mouse&&C!=="mouse"&&(this.mouse[1]=U.invert(this.mouse[0])),this.touch0&&C!=="touch"&&(this.touch0[1]=U.invert(this.touch0[0])),this.touch1&&C!=="touch"&&(this.touch1[1]=U.invert(this.touch1[0])),this.that.__zoom=U,this.emit("zoom"),this},end:function(){return--this.active===0&&(delete this.that.__zooming,this.emit("end")),this},emit:function(C){var U=kt(this.that).datum();y.call(C,this.that,new sw(C,{sourceEvent:this.sourceEvent,target:E,transform:this.that.__zoom,dispatch:y}),U)}};function X(C,...U){if(!t.apply(this,arguments))return;var H=$(this,U).event(C),B=this.__zoom,A=Math.max(c[0],Math.min(c[1],B.k*Math.pow(2,l.apply(this,arguments)))),R=Bt(C);if(H.wheel)(H.mouse[0][0]!==R[0]||H.mouse[0][1]!==R[1])&&(H.mouse[1]=B.invert(H.mouse[0]=R)),clearTimeout(H.wheel);else{if(B.k===A)return;H.mouse=[R,B.invert(R)],Ks(this),H.start()}qi(C),H.wheel=setTimeout(O,S),H.zoom("mouse",o(_(j(B,A),H.mouse[0],H.mouse[1]),H.extent,f));function O(){H.wheel=null,H.end()}}function G(C,...U){if(g||!t.apply(this,arguments))return;var H=C.currentTarget,B=$(this,U,!0).event(C),A=kt(C.view).on("mousemove.zoom",z,!0).on("mouseup.zoom",ne,!0),R=Bt(C,H),O=C.clientX,M=C.clientY;hp(C.view),Sa(C),B.mouse=[R,this.__zoom.invert(R)],Ks(this),B.start();function z(re){if(qi(re),!B.moved){var ae=re.clientX-O,fe=re.clientY-M;B.moved=ae*ae+fe*fe>P}B.event(re).zoom("mouse",o(_(B.that.__zoom,B.mouse[0]=Bt(re,H),B.mouse[1]),B.extent,f))}function ne(re){A.on("mousemove.zoom mouseup.zoom",null),pp(re.view,B.moved),qi(re),B.event(re).end()}}function te(C,...U){if(t.apply(this,arguments)){var H=this.__zoom,B=Bt(C.changedTouches?C.changedTouches[0]:C,this),A=H.invert(B),R=H.k*(C.shiftKey?.5:2),O=o(_(j(H,R),B,A),r.apply(this,U),f);qi(C),h>0?kt(this).transition().duration(h).call(b,O,B,C):kt(this).call(E.transform,O,B,C)}}function Z(C,...U){if(t.apply(this,arguments)){var H=C.touches,B=H.length,A=$(this,U,C.changedTouches.length===B).event(C),R,O,M,z;for(Sa(C),O=0;O`Seems like you have not used ${t==="svelte"?"SvelteFlowProvider":"ReactFlowProvider"} as an ancestor. Help: https://${t}flow.dev/error#001`,error002:()=>"It looks like you've created a new nodeTypes or edgeTypes object. If this wasn't on purpose please define the nodeTypes/edgeTypes outside of the component or memoize them.",error003:t=>`Node type "${t}" not found. Using fallback type "default".`,error004:()=>"The parent container needs a width and a height to render the graph.",error005:()=>"Only child nodes can use a parent extent.",error006:()=>"Can't create edge. An edge needs a source and a target.",error007:t=>`The old edge with id=${t} does not exist.`,error009:t=>`Marker type "${t}" doesn't exist.`,error008:(t,{id:r,sourceHandle:o,targetHandle:l})=>`Couldn't create edge for ${t} handle id: "${t==="source"?o:l}", edge id: ${r}.`,error010:()=>"Handle: No node id found. Make sure to only use a Handle inside a custom Node.",error011:t=>`Edge type "${t}" not found. Using fallback type "default".`,error012:t=>`Node with id "${t}" does not exist, it may have been removed. This can happen when a node is deleted before the "onNodeClick" handler is called.`,error013:(t="react")=>`It seems that you haven't loaded the styles. Please import '@xyflow/${t}/dist/style.css' or base.css to make sure everything is working properly.`,error014:()=>"useNodeConnections: No node ID found. Call useNodeConnections inside a custom Node or provide a node ID.",error015:()=>"It seems that you are trying to drag a node that is not initialized. Please use onNodesChange as explained in the docs.",error016:t=>`Edge with id "${t}" does not exist, it may have been removed. This can happen when an edge is deleted before the "onEdgeClick" handler is called.`},so=[[Number.NEGATIVE_INFINITY,Number.NEGATIVE_INFINITY],[Number.POSITIVE_INFINITY,Number.POSITIVE_INFINITY]],zp=["Enter"," ","Escape"],jp={"node.a11yDescription.default":"Press enter or space to select a node. Press delete to remove it and escape to cancel.","node.a11yDescription.keyboardDisabled":"Press enter or space to select a node. You can then use the arrow keys to move the node around. Press delete to remove it and escape to cancel.","node.a11yDescription.ariaLiveMessage":({direction:t,x:r,y:o})=>`Moved selected node ${t}. New position, x: ${r}, y: ${o}`,"edge.a11yDescription.default":"Press enter or space to select an edge. You can then press delete to remove it or escape to cancel.","controls.ariaLabel":"Control Panel","controls.zoomIn.ariaLabel":"Zoom In","controls.zoomOut.ariaLabel":"Zoom Out","controls.fitView.ariaLabel":"Fit View","controls.interactive.ariaLabel":"Toggle Interactivity","minimap.ariaLabel":"Mini Map","handle.ariaLabel":"Handle"};var ni;(function(t){t.Strict="strict",t.Loose="loose"})(ni||(ni={}));var pr;(function(t){t.Free="free",t.Vertical="vertical",t.Horizontal="horizontal"})(pr||(pr={}));var lo;(function(t){t.Partial="partial",t.Full="full"})(lo||(lo={}));const Lp={inProgress:!1,isValid:null,from:null,fromHandle:null,fromPosition:null,fromNode:null,to:null,toHandle:null,toPosition:null,toNode:null,pointer:null};var Un;(function(t){t.Bezier="default",t.Straight="straight",t.Step="step",t.SmoothStep="smoothstep",t.SimpleBezier="simplebezier"})(Un||(Un={}));var il;(function(t){t.Arrow="arrow",t.ArrowClosed="arrowclosed"})(il||(il={}));var _e;(function(t){t.Left="left",t.Top="top",t.Right="right",t.Bottom="bottom"})(_e||(_e={}));const lh={[_e.Left]:_e.Right,[_e.Right]:_e.Left,[_e.Top]:_e.Bottom,[_e.Bottom]:_e.Top};function Rp(t){return t===null?null:t?"valid":"invalid"}const Ap=t=>!!t&&typeof t=="object"&&"id"in t&&"source"in t&&"target"in t,dw=t=>!!t&&typeof t=="object"&&"id"in t&&"position"in t&&!("source"in t)&&!("target"in t),ec=t=>!!t&&typeof t=="object"&&"id"in t&&"internals"in t&&!("source"in t)&&!("target"in t),go=(t,r=[0,0])=>{const{width:o,height:l}=Qt(t),u=t.origin??r,c=o*u[0],f=l*u[1];return{x:t.position.x-c,y:t.position.y-f}},hw=(t,r={nodeOrigin:[0,0]})=>{if(t.length===0)return{x:0,y:0,width:0,height:0};let o=!1;const l=t.reduce((u,c)=>{const f=typeof c=="string";let h=!r.nodeLookup&&!f?c:void 0;return r.nodeLookup&&(h=f?r.nodeLookup.get(c):ec(c)?c:r.nodeLookup.get(c.id)),h?(o=!0,pl(u,ol(h,r.nodeOrigin))):u},{x:1/0,y:1/0,x2:-1/0,y2:-1/0});return o?gl(l):{x:0,y:0,width:0,height:0}},mo=(t,r={})=>{let o={x:1/0,y:1/0,x2:-1/0,y2:-1/0},l=!1;return t.forEach(u=>{(r.filter===void 0||r.filter(u))&&(o=pl(o,ol(u)),l=!0)}),l?gl(o):{x:0,y:0,width:0,height:0}},tc=(t,r,[o,l,u]=[0,0,1],c=!1,f=!1)=>{const h=(r.x-o)/u,p=(r.y-l)/u,y=r.width/u,m=r.height/u,v=[];for(const g of t.values()){const{measured:w,selectable:S=!0,hidden:P=!1}=g;if(f&&!S||P)continue;const N=w.width??g.width??g.initialWidth??0,E=w.height??g.height??g.initialHeight??0,{x:j,y:_}=g.internals.positionAbsolute,I=Fp(h,p,y,m,j,_,N,E),b=N*E,$=c&&I>0;(!g.internals.handleBounds||$||I>=b||g.dragging)&&v.push(g)}return v},pw=(t,r)=>{const o=new Set;return t.forEach(l=>{o.add(l.id)}),r.filter(l=>o.has(l.source)||o.has(l.target))};function gw(t,r){const o=new Map,l=r!=null&&r.nodes?new Set(r.nodes.map(u=>u.id)):null;return t.forEach(u=>{let c;if(r!=null&&r.includeHiddenNodes){const{width:f,height:h}=Qt(u);c=f>0&&h>0}else c=!!(u.measured.width&&u.measured.height&&!u.hidden);c&&(!l||l.has(u.id))&&o.set(u.id,u)}),o}async function mw({nodes:t,width:r,height:o,panZoom:l,minZoom:u,maxZoom:c},f){if(t.size===0)return!0;const h=gw(t,f),p=mo(h),y=rc(p,r,o,(f==null?void 0:f.minZoom)??u,(f==null?void 0:f.maxZoom)??c,(f==null?void 0:f.padding)??.1);return await l.setViewport(y,{duration:f==null?void 0:f.duration,ease:f==null?void 0:f.ease,interpolate:f==null?void 0:f.interpolate}),!0}function $p({nodeId:t,nextPosition:r,nodeLookup:o,nodeOrigin:l=[0,0],nodeExtent:u,onError:c}){const f=o.get(t),h=f.parentId?o.get(f.parentId):void 0,{x:p,y}=h?h.internals.positionAbsolute:{x:0,y:0},m=f.origin??l;let v=f.extent||u;if(f.extent==="parent"&&!f.expandParent)if(!h)c==null||c("005",Yt.error005());else{const{width:w,height:S}=Qt(h);w&&S&&(v=[[p,y],[p+w,y+S]])}else h&&vr(f.extent)&&(v=[[f.extent[0][0]+p,f.extent[0][1]+y],[f.extent[1][0]+p,f.extent[1][1]+y]]);const g=vr(v)?yr(r,v,f.measured):r;return(f.measured.width===void 0||f.measured.height===void 0)&&(c==null||c("015",Yt.error015())),{position:{x:g.x-p+(f.measured.width??0)*m[0],y:g.y-y+(f.measured.height??0)*m[1]},positionAbsolute:g}}async function yw({nodesToRemove:t=[],edgesToRemove:r=[],nodes:o,edges:l,onBeforeDelete:u}){const c=new Set(t.map(g=>g.id)),f=[];for(const g of o){if(g.deletable===!1)continue;const w=c.has(g.id),S=!w&&g.parentId&&f.find(P=>P.id===g.parentId);(w||S)&&f.push(g)}const h=new Set(r.map(g=>g.id)),p=l.filter(g=>g.deletable!==!1),m=pw(f,p);for(const g of p)h.has(g.id)&&!m.find(S=>S.id===g.id)&&m.push(g);if(!u)return{edges:m,nodes:f};const v=await u({nodes:f,edges:m});return typeof v=="boolean"?v?{edges:m,nodes:f}:{edges:[],nodes:[]}:v}const ri=(t,r=0,o=1)=>Math.min(Math.max(t,r),o),yr=(t={x:0,y:0},r,o)=>({x:ri(t.x,r[0][0],r[1][0]-((o==null?void 0:o.width)??0)),y:ri(t.y,r[0][1],r[1][1]-((o==null?void 0:o.height)??0))});function Dp(t,r,o){const{width:l,height:u}=Qt(o),{x:c,y:f}=o.internals.positionAbsolute;return yr(t,[[c,f],[c+l,f+u]],r)}const uh=(t,r,o)=>to?-ri(Math.abs(t-o),1,r)/r:0,nc=(t,r,o=15,l=40)=>{const u=uh(t.x,l,r.width-l)*o,c=uh(t.y,l,r.height-l)*o;return[u,c]},pl=(t,r)=>({x:Math.min(t.x,r.x),y:Math.min(t.y,r.y),x2:Math.max(t.x2,r.x2),y2:Math.max(t.y2,r.y2)}),Ha=({x:t,y:r,width:o,height:l})=>({x:t,y:r,x2:t+o,y2:r+l}),gl=({x:t,y:r,x2:o,y2:l})=>({x:t,y:r,width:o-t,height:l-r}),uo=(t,r=[0,0])=>{var u,c;const{x:o,y:l}=ec(t)?t.internals.positionAbsolute:go(t,r);return{x:o,y:l,width:((u=t.measured)==null?void 0:u.width)??t.width??t.initialWidth??0,height:((c=t.measured)==null?void 0:c.height)??t.height??t.initialHeight??0}},ol=(t,r=[0,0])=>{var u,c;const{x:o,y:l}=ec(t)?t.internals.positionAbsolute:go(t,r);return{x:o,y:l,x2:o+(((u=t.measured)==null?void 0:u.width)??t.width??t.initialWidth??0),y2:l+(((c=t.measured)==null?void 0:c.height)??t.height??t.initialHeight??0)}},Op=(t,r)=>gl(pl(Ha(t),Ha(r))),Fp=(t,r,o,l,u,c,f,h)=>{const p=Math.max(0,Math.min(t+o,u+f)-Math.max(t,u)),y=Math.max(0,Math.min(r+l,c+h)-Math.max(r,c));return Math.ceil(p*y)},sl=(t,r)=>Fp(t.x,t.y,t.width,t.height,r.x,r.y,r.width,r.height),ah=t=>Ut(t.width)&&Ut(t.height)&&Ut(t.x)&&Ut(t.y),Ut=t=>!isNaN(t)&&isFinite(t),Hp=(t,r)=>(o,l)=>{},yo=(t,r=[1,1])=>({x:r[0]*Math.round(t.x/r[0]),y:r[1]*Math.round(t.y/r[1])}),vo=({x:t,y:r},[o,l,u],c=!1,f=[1,1])=>{const h={x:(t-o)/u,y:(r-l)/u};return c?yo(h,f):h},ii=({x:t,y:r},[o,l,u])=>({x:t*u+o,y:r*u+l});function Kr(t,r){if(typeof t=="number")return Math.floor((r-r/(1+t))*.5);if(typeof t=="string"&&t.endsWith("px")){const o=parseFloat(t);if(!Number.isNaN(o))return Math.floor(o)}if(typeof t=="string"&&t.endsWith("%")){const o=parseFloat(t);if(!Number.isNaN(o))return Math.floor(r*o*.01)}return console.error(`The padding value "${t}" is invalid. Please provide a number or a string with a valid unit (px or %).`),0}function vw(t,r,o){if(typeof t=="string"||typeof t=="number"){const l=Kr(t,o),u=Kr(t,r);return{top:l,right:u,bottom:l,left:u,x:u*2,y:l*2}}if(typeof t=="object"){const l=Kr(t.top??t.y??0,o),u=Kr(t.bottom??t.y??0,o),c=Kr(t.left??t.x??0,r),f=Kr(t.right??t.x??0,r);return{top:l,right:f,bottom:u,left:c,x:c+f,y:l+u}}return{top:0,right:0,bottom:0,left:0,x:0,y:0}}function xw(t,r,o,l,u,c){const{x:f,y:h}=ii(t,[r,o,l]),{x:p,y}=ii({x:t.x+t.width,y:t.y+t.height},[r,o,l]),m=u-p,v=c-y;return{left:Math.floor(f),top:Math.floor(h),right:Math.floor(m),bottom:Math.floor(v)}}const rc=(t,r,o,l,u,c)=>{const f=vw(c,r,o),h=(r-f.x)/t.width,p=(o-f.y)/t.height,y=Math.min(h,p),m=ri(y,l,u),v=t.x+t.width/2,g=t.y+t.height/2,w=r/2-v*m,S=o/2-g*m,P=xw(t,w,S,m,r,o),N={left:Math.min(P.left-f.left,0),top:Math.min(P.top-f.top,0),right:Math.min(P.right-f.right,0),bottom:Math.min(P.bottom-f.bottom,0)};return{x:w-N.left+N.right,y:S-N.top+N.bottom,zoom:m}},ao=()=>{var t;return typeof navigator<"u"&&((t=navigator==null?void 0:navigator.userAgent)==null?void 0:t.indexOf("Mac"))>=0};function vr(t){return t!=null&&t!=="parent"}function Qt(t){var r,o;return{width:((r=t.measured)==null?void 0:r.width)??t.width??t.initialWidth??0,height:((o=t.measured)==null?void 0:o.height)??t.height??t.initialHeight??0}}function Vp(t){var r,o;return(((r=t.measured)==null?void 0:r.width)??t.width??t.initialWidth)!==void 0&&(((o=t.measured)==null?void 0:o.height)??t.height??t.initialHeight)!==void 0}function Bp(t,r={width:0,height:0},o,l,u){const c={...t},f=l.get(o);if(f){const h=f.origin||u;c.x+=f.internals.positionAbsolute.x-(r.width??0)*h[0],c.y+=f.internals.positionAbsolute.y-(r.height??0)*h[1]}return c}function ch(t,r){if(t.size!==r.size)return!1;for(const o of t)if(!r.has(o))return!1;return!0}function ww(){let t,r;return{promise:new Promise((l,u)=>{t=l,r=u}),resolve:t,reject:r}}function Sw(t){return{...jp,...t||{}}}function to(t,{snapGrid:r=[0,0],snapToGrid:o=!1,transform:l,containerBounds:u}){const{x:c,y:f}=Wt(t),h=vo({x:c-((u==null?void 0:u.left)??0),y:f-((u==null?void 0:u.top)??0)},l),{x:p,y}=o?yo(h,r):h;return{xSnapped:p,ySnapped:y,...h}}const ic=t=>({width:t.offsetWidth,height:t.offsetHeight}),bp=t=>{var r;return((r=t==null?void 0:t.getRootNode)==null?void 0:r.call(t))||(window==null?void 0:window.document)},_w=["INPUT","SELECT","TEXTAREA"];function Up(t){var l,u;const r=((u=(l=t.composedPath)==null?void 0:l.call(t))==null?void 0:u[0])||t.target;return(r==null?void 0:r.nodeType)!==1?!1:_w.includes(r.nodeName)||r.hasAttribute("contenteditable")||!!r.closest(".nokey")}const Wp=t=>"clientX"in t,Wt=(t,r)=>{var c,f;const o=Wp(t),l=o?t.clientX:(c=t.touches)==null?void 0:c[0].clientX,u=o?t.clientY:(f=t.touches)==null?void 0:f[0].clientY;return{x:l-((r==null?void 0:r.left)??0),y:u-((r==null?void 0:r.top)??0)}},fh=(t,r,o,l,u)=>{const c=r.querySelectorAll(`.${t}`);return!c||!c.length?null:Array.from(c).map(f=>{const h=f.getBoundingClientRect();return{id:f.getAttribute("data-handleid"),type:t,nodeId:u,position:f.getAttribute("data-handlepos"),x:(h.left-o.left)/l,y:(h.top-o.top)/l,...ic(f)}})};function Yp({sourceX:t,sourceY:r,targetX:o,targetY:l,sourceControlX:u,sourceControlY:c,targetControlX:f,targetControlY:h}){const p=t*.125+u*.375+f*.375+o*.125,y=r*.125+c*.375+h*.375+l*.125,m=Math.abs(p-t),v=Math.abs(y-r);return[p,y,m,v]}function Bs(t,r){return t>=0?.5*t:r*25*Math.sqrt(-t)}function dh({pos:t,x1:r,y1:o,x2:l,y2:u,c}){switch(t){case _e.Left:return[r-Bs(r-l,c),o];case _e.Right:return[r+Bs(l-r,c),o];case _e.Top:return[r,o-Bs(o-u,c)];case _e.Bottom:return[r,o+Bs(u-o,c)]}}function Xp({sourceX:t,sourceY:r,sourcePosition:o=_e.Bottom,targetX:l,targetY:u,targetPosition:c=_e.Top,curvature:f=.25}){const[h,p]=dh({pos:o,x1:t,y1:r,x2:l,y2:u,c:f}),[y,m]=dh({pos:c,x1:l,y1:u,x2:t,y2:r,c:f}),[v,g,w,S]=Yp({sourceX:t,sourceY:r,targetX:l,targetY:u,sourceControlX:h,sourceControlY:p,targetControlX:y,targetControlY:m});return[`M${t},${r} C${h},${p} ${y},${m} ${l},${u}`,v,g,w,S]}function Qp({sourceX:t,sourceY:r,targetX:o,targetY:l}){const u=Math.abs(o-t)/2,c=o0}const Nw=({source:t,sourceHandle:r,target:o,targetHandle:l})=>`xy-edge__${t}${r||""}-${o}${l||""}`,Cw=(t,r)=>r.some(o=>o.source===t.source&&o.target===t.target&&(o.sourceHandle===t.sourceHandle||!o.sourceHandle&&!t.sourceHandle)&&(o.targetHandle===t.targetHandle||!o.targetHandle&&!t.targetHandle)),Mw=(t,r,o={})=>{var c;if(!t.source||!t.target)return(c=o.onError)==null||c.call(o,"006",Yt.error006()),r;const l=o.getEdgeId||Nw;let u;return Ap(t)?u={...t}:u={...t,id:l(t)},Cw(u,r)?r:(u.sourceHandle===null&&delete u.sourceHandle,u.targetHandle===null&&delete u.targetHandle,r.concat(u))};function Gp({sourceX:t,sourceY:r,targetX:o,targetY:l}){const[u,c,f,h]=Qp({sourceX:t,sourceY:r,targetX:o,targetY:l});return[`M ${t},${r}L ${o},${l}`,u,c,f,h]}const hh={[_e.Left]:{x:-1,y:0},[_e.Right]:{x:1,y:0},[_e.Top]:{x:0,y:-1},[_e.Bottom]:{x:0,y:1}},Pw=({source:t,sourcePosition:r=_e.Bottom,target:o})=>r===_e.Left||r===_e.Right?t.xMath.sqrt(Math.pow(r.x-t.x,2)+Math.pow(r.y-t.y,2));function Iw({source:t,sourcePosition:r=_e.Bottom,target:o,targetPosition:l=_e.Top,center:u,offset:c,stepPosition:f}){const h=hh[r],p=hh[l],y={x:t.x+h.x*c,y:t.y+h.y*c},m={x:o.x+p.x*c,y:o.y+p.y*c},v=Pw({source:y,sourcePosition:r,target:m}),g=v.x!==0?"x":"y",w=v[g];let S=[],P,N;const E={x:0,y:0},j={x:0,y:0},[,,_,I]=Qp({sourceX:t.x,sourceY:t.y,targetX:o.x,targetY:o.y});if(h[g]*p[g]===-1){g==="x"?(P=u.x??y.x+(m.x-y.x)*f,N=u.y??(y.y+m.y)/2):(P=u.x??(y.x+m.x)/2,N=u.y??y.y+(m.y-y.y)*f);const X=[{x:P,y:y.y},{x:P,y:m.y}],G=[{x:y.x,y:N},{x:m.x,y:N}];h[g]===w?S=g==="x"?X:G:S=g==="x"?G:X}else{const X=[{x:y.x,y:m.y}],G=[{x:m.x,y:y.y}];if(g==="x"?S=h.x===w?G:X:S=h.y===w?X:G,r===l){const C=Math.abs(t[g]-o[g]);if(C<=c){const U=Math.min(c-1,c-C);h[g]===w?E[g]=(y[g]>t[g]?-1:1)*U:j[g]=(m[g]>o[g]?-1:1)*U}}if(r!==l){const C=g==="x"?"y":"x",U=h[g]===p[C],H=y[C]>m[C],B=y[C]=J?(P=(te.x+Z.x)/2,N=S[0].y):(P=S[0].x,N=(te.y+Z.y)/2)}const b={x:y.x+E.x,y:y.y+E.y},$={x:m.x+j.x,y:m.y+j.y};return[[t,...b.x!==S[0].x||b.y!==S[0].y?[b]:[],...S,...$.x!==S[S.length-1].x||$.y!==S[S.length-1].y?[$]:[],o],P,N,_,I]}function Tw(t,r,o,l){const u=Math.min(ph(t,r)/2,ph(r,o)/2,l),{x:c,y:f}=r;if(t.x===c&&c===o.x||t.y===f&&f===o.y)return`L${c} ${f}`;if(t.y===f){const y=t.xo.id===r):t[0])||null}function Ba(t,r){return t?typeof t=="string"?t:`${r?`${r}__`:""}${Object.keys(t).sort().map(l=>`${l}=${t[l]}`).join("&")}`:""}function jw(t,{id:r,defaultColor:o,defaultMarkerStart:l,defaultMarkerEnd:u}){const c=new Set;return t.reduce((f,h)=>([h.markerStart||l,h.markerEnd||u].forEach(p=>{if(p&&typeof p=="object"){const y=Ba(p,r);c.has(y)||(f.push({id:y,color:p.color||o,...p}),c.add(y))}}),f),[]).sort((f,h)=>f.id.localeCompare(h.id))}const Kp=1e3,Lw=10,oc={nodeOrigin:[0,0],nodeExtent:so,elevateNodesOnSelect:!0,zIndexMode:"basic",defaults:{}},Rw={...oc,checkEquality:!0};function sc(t,r){const o={...t};for(const l in r)r[l]!==void 0&&(o[l]=r[l]);return o}function Aw(t,r,o){const l=sc(oc,o);for(const u of t.values())if(u.parentId)uc(u,t,r,l);else{const c=go(u,l.nodeOrigin),f=vr(u.extent)?u.extent:l.nodeExtent,h=yr(c,f,Qt(u));u.internals.positionAbsolute=h}}function $w(t,r){if(!t.handles)return t.measured?r==null?void 0:r.internals.handleBounds:void 0;const o=[],l=[];for(const u of t.handles){const c={id:u.id,width:u.width??1,height:u.height??1,nodeId:t.id,x:u.x,y:u.y,position:u.position,type:u.type};u.type==="source"?o.push(c):u.type==="target"&&l.push(c)}return{source:o,target:l}}function lc(t){return t==="manual"}function ba(t,r,o,l={}){var m,v;const u=sc(Rw,l),c={i:0},f=new Map(r),h=u!=null&&u.elevateNodesOnSelect&&!lc(u.zIndexMode)?Kp:0;let p=t.length>0,y=!1;r.clear(),o.clear();for(const g of t){let w=f.get(g.id);if(u.checkEquality&&g===(w==null?void 0:w.internals.userNode))r.set(g.id,w);else{const S=go(g,u.nodeOrigin),P=vr(g.extent)?g.extent:u.nodeExtent,N=yr(S,P,Qt(g));w={...u.defaults,...g,measured:{width:(m=g.measured)==null?void 0:m.width,height:(v=g.measured)==null?void 0:v.height},internals:{positionAbsolute:N,handleBounds:$w(g,w),z:qp(g,h,u.zIndexMode),userNode:g}},r.set(g.id,w)}(w.measured===void 0||w.measured.width===void 0||w.measured.height===void 0)&&!w.hidden&&(p=!1),g.parentId&&uc(w,r,o,l,c),y||(y=g.selected??!1)}return{nodesInitialized:p,hasSelectedNodes:y}}function Dw(t,r){if(!t.parentId)return;const o=r.get(t.parentId);o?o.set(t.id,t):r.set(t.parentId,new Map([[t.id,t]]))}function uc(t,r,o,l,u){const{elevateNodesOnSelect:c,nodeOrigin:f,nodeExtent:h,zIndexMode:p}=sc(oc,l),y=t.parentId,m=r.get(y);if(!m){console.warn(`Parent node ${y} not found. Please make sure that parent nodes are in front of their child nodes in the nodes array.`);return}Dw(t,o),u&&!m.parentId&&m.internals.rootParentIndex===void 0&&p==="auto"&&(m.internals.rootParentIndex=++u.i,m.internals.z=m.internals.z+u.i*Lw),u&&m.internals.rootParentIndex!==void 0&&(u.i=m.internals.rootParentIndex);const v=c&&!lc(p)?Kp:0,{x:g,y:w,z:S}=Ow(t,m,f,h,v,p),{positionAbsolute:P}=t.internals,N=g!==P.x||w!==P.y;(N||S!==t.internals.z)&&r.set(t.id,{...t,internals:{...t.internals,positionAbsolute:N?{x:g,y:w}:P,z:S}})}function qp(t,r,o){const l=Ut(t.zIndex)?t.zIndex:0;return lc(o)?l:l+(t.selected?r:0)}function Ow(t,r,o,l,u,c){const{x:f,y:h}=r.internals.positionAbsolute,p=Qt(t),y=go(t,o),m=vr(t.extent)?yr(y,t.extent,p):y;let v=yr({x:f+m.x,y:h+m.y},l,p);t.extent==="parent"&&(v=Dp(v,p,r));const g=qp(t,u,c),w=r.internals.z??0;return{x:v.x,y:v.y,z:w>=g?w+1:g}}function ac(t,r,o,l=[0,0]){var f;const u=[],c=new Map;for(const h of t){const p=r.get(h.parentId);if(!p)continue;const y=((f=c.get(h.parentId))==null?void 0:f.expandedRect)??uo(p),m=Op(y,h.rect);c.set(h.parentId,{expandedRect:m,parent:p})}return c.size>0&&c.forEach(({expandedRect:h,parent:p},y)=>{var _;const m=p.internals.positionAbsolute,v=Qt(p),g=p.origin??l,w=h.x0||S>0||E||j)&&(u.push({id:y,type:"position",position:{x:p.position.x-w+E,y:p.position.y-S+j}}),(_=o.get(y))==null||_.forEach(I=>{t.some(b=>b.id===I.id)||u.push({id:I.id,type:"position",position:{x:I.position.x+w,y:I.position.y+S}})})),(v.width0){const w=ac(g,r,o,u);y.push(...w)}return{changes:y,updatedInternals:p}}async function Hw({delta:t,panZoom:r,transform:o,translateExtent:l,width:u,height:c}){if(!r||!t.x&&!t.y)return!1;const f=await r.setViewportConstrained({x:o[0]+t.x,y:o[1]+t.y,zoom:o[2]},[[0,0],[u,c]],l);return!!f&&(f.x!==o[0]||f.y!==o[1]||f.k!==o[2])}function vh(t,r,o,l,u,c){let f=u;const h=l.get(f)||new Map;l.set(f,h.set(o,r)),f=`${u}-${t}`;const p=l.get(f)||new Map;if(l.set(f,p.set(o,r)),c){f=`${u}-${t}-${c}`;const y=l.get(f)||new Map;l.set(f,y.set(o,r))}}function Zp(t,r,o){t.clear(),r.clear();for(const l of o){const{source:u,target:c,sourceHandle:f=null,targetHandle:h=null}=l,p={edgeId:l.id,source:u,target:c,sourceHandle:f,targetHandle:h},y=`${u}-${f}--${c}-${h}`,m=`${c}-${h}--${u}-${f}`;vh("source",p,m,t,u,f),vh("target",p,y,t,c,h),r.set(l.id,l)}}function Jp(t,r){if(!t.parentId)return!1;const o=r.get(t.parentId);return o?o.selected?!0:Jp(o,r):!1}function xh(t,r,o){var u;let l=t;do{if((u=l==null?void 0:l.matches)!=null&&u.call(l,r))return!0;if(l===o)return!1;l=l==null?void 0:l.parentElement}while(l);return!1}function Vw(t,r,o,l){const u=new Map;for(const[c,f]of t)if((f.selected||f.id===l)&&(!f.parentId||!Jp(f,t))&&(f.draggable||r&&typeof f.draggable>"u")){const h=t.get(c);h&&u.set(c,{id:c,position:h.position||{x:0,y:0},distance:{x:o.x-h.internals.positionAbsolute.x,y:o.y-h.internals.positionAbsolute.y},extent:h.extent,parentId:h.parentId,origin:h.origin,expandParent:h.expandParent,internals:{positionAbsolute:h.internals.positionAbsolute||{x:0,y:0}},measured:{width:h.measured.width??0,height:h.measured.height??0}})}return u}function _a({nodeId:t,dragItems:r,nodeLookup:o,dragging:l=!0}){var f,h,p;const u=[];for(const[y,m]of r){const v=(f=o.get(y))==null?void 0:f.internals.userNode;v&&u.push({...v,position:m.position,dragging:l})}if(!t)return[u[0],u];const c=(h=o.get(t))==null?void 0:h.internals.userNode;return[c?{...c,position:((p=r.get(t))==null?void 0:p.position)||c.position,dragging:l}:u[0],u]}function Bw({dragItems:t,snapGrid:r,x:o,y:l}){const u=t.values().next().value;if(!u)return null;const c={x:o-u.distance.x,y:l-u.distance.y},f=yo(c,r);return{x:f.x-c.x,y:f.y-c.y}}function bw({onNodeMouseDown:t,getStoreItems:r,onDragStart:o,onDrag:l,onDragStop:u}){let c={x:null,y:null},f=0,h=new Map,p=!1,y={x:0,y:0},m=null,v=!1,g=null,w=!1,S=!1,P=null;function N({noDragClassName:j,handleSelector:_,domNode:I,isSelectable:b,nodeId:$,nodeClickDistance:V=0}){g=kt(I);function X({x:ee,y:J}){const{nodeLookup:C,nodeExtent:U,snapGrid:H,snapToGrid:B,nodeOrigin:A,onNodeDrag:R,onSelectionDrag:O,onError:M,updateNodePositions:z}=r();c={x:ee,y:J};let ne=!1;const re=h.size>1,ae=re&&U?Ha(mo(h)):null,fe=re&&B?Bw({dragItems:h,snapGrid:H,x:ee,y:J}):null;for(const[ce,K]of h){if(!C.has(ce))continue;let se={x:ee-K.distance.x,y:J-K.distance.y};B&&(se=fe?{x:Math.round(se.x+fe.x),y:Math.round(se.y+fe.y)}:yo(se,H));let he=null;if(re&&U&&!K.extent&&ae){const{positionAbsolute:ge}=K.internals,Ce=ge.x-ae.x+U[0][0],F=ge.x+K.measured.width-ae.x2+U[1][0],ye=ge.y-ae.y+U[0][1],Pe=ge.y+K.measured.height-ae.y2+U[1][1];he=[[Ce,ye],[F,Pe]]}const{position:Se,positionAbsolute:xe}=$p({nodeId:ce,nextPosition:se,nodeLookup:C,nodeExtent:he||U,nodeOrigin:A,onError:M});ne=ne||K.position.x!==Se.x||K.position.y!==Se.y,K.position=Se,K.internals.positionAbsolute=xe}if(S=S||ne,!!ne&&(z(h,!0),P&&(l||R||!$&&O))){const[ce,K]=_a({nodeId:$,dragItems:h,nodeLookup:C});l==null||l(P,h,ce,K),R==null||R(P,ce,K),$||O==null||O(P,K)}}async function G(){if(!m)return;const{transform:ee,panBy:J,autoPanSpeed:C,autoPanOnNodeDrag:U}=r();if(!U){p=!1,cancelAnimationFrame(f);return}const[H,B]=nc(y,m,C);(H!==0||B!==0)&&(c.x=(c.x??0)-H/ee[2],c.y=(c.y??0)-B/ee[2],await J({x:H,y:B})&&X(c)),f=requestAnimationFrame(G)}function te(ee){var re;const{nodeLookup:J,multiSelectionActive:C,nodesDraggable:U,transform:H,snapGrid:B,snapToGrid:A,selectNodesOnDrag:R,onNodeDragStart:O,onSelectionDragStart:M,unselectNodesAndEdges:z}=r();v=!0,(!R||!b)&&!C&&$&&((re=J.get($))!=null&&re.selected||z()),b&&R&&$&&(t==null||t($));const ne=to(ee.sourceEvent,{transform:H,snapGrid:B,snapToGrid:A,containerBounds:m});if(c=ne,h=Vw(J,U,ne,$),h.size>0&&(o||O||!$&&M)){const[ae,fe]=_a({nodeId:$,dragItems:h,nodeLookup:J});o==null||o(ee.sourceEvent,h,ae,fe),O==null||O(ee.sourceEvent,ae,fe),$||M==null||M(ee.sourceEvent,fe)}}const Z=gp().clickDistance(V).on("start",ee=>{const{domNode:J,nodeDragThreshold:C,transform:U,snapGrid:H,snapToGrid:B}=r();m=(J==null?void 0:J.getBoundingClientRect())||null,w=!1,S=!1,P=ee.sourceEvent,C===0&&te(ee),c=to(ee.sourceEvent,{transform:U,snapGrid:H,snapToGrid:B,containerBounds:m}),y=Wt(ee.sourceEvent,m)}).on("drag",ee=>{const{autoPanOnNodeDrag:J,transform:C,snapGrid:U,snapToGrid:H,nodeDragThreshold:B,nodeLookup:A}=r(),R=to(ee.sourceEvent,{transform:C,snapGrid:U,snapToGrid:H,containerBounds:m});if(P=ee.sourceEvent,(ee.sourceEvent.type==="touchmove"&&ee.sourceEvent.touches.length>1||$&&!A.has($))&&(w=!0),!w){if(!p&&J&&v&&(p=!0,G()),!v){const O=Wt(ee.sourceEvent,m),M=O.x-y.x,z=O.y-y.y;Math.sqrt(M*M+z*z)>B&&te(ee)}(c.x!==R.xSnapped||c.y!==R.ySnapped)&&h&&v&&(y=Wt(ee.sourceEvent,m),X(R))}}).on("end",ee=>{if(!v||w){w&&h.size>0&&r().updateNodePositions(h,!1);return}if(p=!1,v=!1,cancelAnimationFrame(f),h.size>0){const{nodeLookup:J,updateNodePositions:C,onNodeDragStop:U,onSelectionDragStop:H}=r();if(S&&(C(h,!1),S=!1),u||U||!$&&H){const[B,A]=_a({nodeId:$,dragItems:h,nodeLookup:J,dragging:!1});u==null||u(ee.sourceEvent,h,B,A),U==null||U(ee.sourceEvent,B,A),$||H==null||H(ee.sourceEvent,A)}}}).filter(ee=>{const J=ee.target;return!ee.button&&(!j||!xh(J,`.${j}`,I))&&(!_||xh(J,_,I))});g.call(Z)}function E(){g==null||g.on(".drag",null)}return{update:N,destroy:E}}function Uw(t,r,o){const l=[],u={x:t.x-o,y:t.y-o,width:o*2,height:o*2};for(const c of r.values())sl(u,uo(c))>0&&l.push(c);return l}const Ww=250;function Yw(t,r,o,l){var h,p;let u=[],c=1/0;const f=Uw(t,o,r+Ww);for(const y of f){const m=[...((h=y.internals.handleBounds)==null?void 0:h.source)??[],...((p=y.internals.handleBounds)==null?void 0:p.target)??[]];for(const v of m){if(l.nodeId===v.nodeId&&l.type===v.type&&l.id===v.id)continue;const{x:g,y:w}=xr(y,v,v.position,!0),S=Math.sqrt(Math.pow(g-t.x,2)+Math.pow(w-t.y,2));S>r||(S1){const y=l.type==="source"?"target":"source";return u.find(m=>m.type===y)??u[0]}return u[0]}function eg(t,r,o,l,u,c=!1){var y,m,v;const f=l.get(t);if(!f)return null;const h=u==="strict"?(y=f.internals.handleBounds)==null?void 0:y[r]:[...((m=f.internals.handleBounds)==null?void 0:m.source)??[],...((v=f.internals.handleBounds)==null?void 0:v.target)??[]],p=(o?h==null?void 0:h.find(g=>g.id===o):h==null?void 0:h[0])??null;return p&&c?{...p,...xr(f,p,p.position,!0)}:p}function tg(t,r){return t||(r!=null&&r.classList.contains("target")?"target":r!=null&&r.classList.contains("source")?"source":null)}function Xw(t,r){let o=null;return r?o=!0:t&&!r&&(o=!1),o}const ng=()=>!0;function Qw(t,{connectionMode:r,connectionRadius:o,handleId:l,nodeId:u,edgeUpdaterType:c,isTarget:f,domNode:h,nodeLookup:p,lib:y,autoPanOnConnect:m,flowId:v,panBy:g,cancelConnection:w,onConnectStart:S,onConnect:P,onConnectEnd:N,isValidConnection:E=ng,onReconnectEnd:j,updateConnection:_,getTransform:I,getFromHandle:b,autoPanSpeed:$,dragThreshold:V=1,handleDomNode:X}){const G=bp(t.target);let te=0,Z;const{x:ee,y:J}=Wt(t),C=tg(c,X),U=h==null?void 0:h.getBoundingClientRect();let H=!1;if(!U||!C)return;const B=eg(u,C,l,p,r);if(!B)return;let A=Wt(t,U),R=!1,O=null,M=!1,z=null;function ne(){if(!m||!U)return;const[Se,xe]=nc(A,U,$);g({x:Se,y:xe}),te=requestAnimationFrame(ne)}const re={...B,nodeId:u,type:C,position:B.position},ae=p.get(u);let ce={inProgress:!0,isValid:null,from:xr(ae,re,_e.Left,!0),fromHandle:re,fromPosition:re.position,fromNode:ae,to:A,toHandle:null,toPosition:lh[re.position],toNode:null,pointer:A};function K(){H=!0,_(ce),S==null||S(t,{nodeId:u,handleId:l,handleType:C})}V===0&&K();function se(Se){if(!H){const{x:Pe,y:Qe}=Wt(Se),ut=Pe-ee,et=Qe-J;if(!(ut*ut+et*et>V*V))return;K()}if(!b()||!re){he(Se);return}const xe=I();A=Wt(Se,U),Z=Yw(vo(A,xe,!1,[1,1]),o,p,re),R||(ne(),R=!0);const ge=rg(Se,{handle:Z,connectionMode:r,fromNodeId:u,fromHandleId:l,fromType:f?"target":"source",isValidConnection:E,doc:G,lib:y,flowId:v,nodeLookup:p});z=ge.handleDomNode,O=ge.connection,M=Xw(!!Z,ge.isValid);const Ce=p.get(u),F=Ce?xr(Ce,re,_e.Left,!0):ce.from,ye={...ce,from:F,isValid:M,to:ge.toHandle&&M?ii({x:ge.toHandle.x,y:ge.toHandle.y},xe):A,toHandle:ge.toHandle,toPosition:M&&ge.toHandle?ge.toHandle.position:lh[re.position],toNode:ge.toHandle?p.get(ge.toHandle.nodeId):null,pointer:A};_(ye),ce=ye}function he(Se){if(!("touches"in Se&&Se.touches.length>0)){if(H){(Z||z)&&O&&M&&(P==null||P(O));const{inProgress:xe,...ge}=ce,Ce={...ge,toPosition:ce.toHandle?ce.toPosition:null};N==null||N(Se,Ce),c&&(j==null||j(Se,Ce))}w(),cancelAnimationFrame(te),R=!1,M=!1,O=null,z=null,G.removeEventListener("mousemove",se),G.removeEventListener("mouseup",he),G.removeEventListener("touchmove",se),G.removeEventListener("touchend",he)}}G.addEventListener("mousemove",se),G.addEventListener("mouseup",he),G.addEventListener("touchmove",se),G.addEventListener("touchend",he)}function rg(t,{handle:r,connectionMode:o,fromNodeId:l,fromHandleId:u,fromType:c,doc:f,lib:h,flowId:p,isValidConnection:y=ng,nodeLookup:m}){const v=c==="target",g=r?f.querySelector(`.${h}-flow__handle[data-id="${p}-${r==null?void 0:r.nodeId}-${r==null?void 0:r.id}-${r==null?void 0:r.type}"]`):null,{x:w,y:S}=Wt(t),P=f.elementFromPoint(w,S),N=P!=null&&P.classList.contains(`${h}-flow__handle`)?P:g,E={handleDomNode:N,isValid:!1,connection:null,toHandle:null};if(N){const j=tg(void 0,N),_=N.getAttribute("data-nodeid"),I=N.getAttribute("data-handleid"),b=N.classList.contains("connectable"),$=N.classList.contains("connectableend");if(!_||!j)return E;const V={source:v?_:l,sourceHandle:v?I:u,target:v?l:_,targetHandle:v?u:I};E.connection=V;const G=b&&$&&(o===ni.Strict?v&&j==="source"||!v&&j==="target":_!==l||I!==u);E.isValid=G&&y(V),E.toHandle=eg(_,j,I,m,o,!0)}return E}const Ua={onPointerDown:Qw,isValid:rg};function Gw({domNode:t,panZoom:r,getTransform:o,getViewScale:l}){const u=kt(t);function c({translateExtent:h,width:p,height:y,zoomStep:m=1,pannable:v=!0,zoomable:g=!0,inversePan:w=!1}){const S=_=>{if(_.sourceEvent.type!=="wheel"||!r)return;const I=o(),b=_.sourceEvent.ctrlKey&&ao()?10:1,$=-_.sourceEvent.deltaY*(_.sourceEvent.deltaMode===1?.05:_.sourceEvent.deltaMode?1:.002)*m,V=I[2]*Math.pow(2,$*b);r.scaleTo(V)};let P=[0,0];const N=_=>{(_.sourceEvent.type==="mousedown"||_.sourceEvent.type==="touchstart")&&(P=[_.sourceEvent.clientX??_.sourceEvent.touches[0].clientX,_.sourceEvent.clientY??_.sourceEvent.touches[0].clientY])},E=_=>{const I=o();if(_.sourceEvent.type!=="mousemove"&&_.sourceEvent.type!=="touchmove"||!r)return;const b=[_.sourceEvent.clientX??_.sourceEvent.touches[0].clientX,_.sourceEvent.clientY??_.sourceEvent.touches[0].clientY],$=[b[0]-P[0],b[1]-P[1]];P=b;const V=l()*Math.max(I[2],Math.log(I[2]))*(w?-1:1),X={x:I[0]-$[0]*V,y:I[1]-$[1]*V},G=[[0,0],[p,y]];r.setViewportConstrained({x:X.x,y:X.y,zoom:I[2]},G,h)},j=Tp().on("start",N).on("zoom",v?E:null).on("zoom.wheel",g?S:null);u.call(j,{})}function f(){u.on("zoom",null)}return{update:c,destroy:f,pointer:Bt}}const ml=t=>({x:t.x,y:t.y,zoom:t.k}),Ea=({x:t,y:r,zoom:o})=>hl.translate(t,r).scale(o),bn=(t,r)=>t.target.closest(`.${r}`),ig=(t,r)=>r===2&&Array.isArray(t)&&t.includes(2),Kw=t=>((t*=2)<=1?t*t*t:(t-=2)*t*t+2)/2,ka=(t,r=0,o=Kw,l=()=>{})=>{const u=typeof r=="number"&&r>0;return u||l(),u?t.transition().duration(r).ease(o).on("end",l):t},og=t=>{const r=t.ctrlKey&&ao()?10:1;return-t.deltaY*(t.deltaMode===1?.05:t.deltaMode?1:.002)*r};function qw({zoomPanValues:t,noWheelClassName:r,d3Selection:o,d3Zoom:l,panOnScrollMode:u,panOnScrollSpeed:c,zoomOnPinch:f,onPanZoomStart:h,onPanZoom:p,onPanZoomEnd:y}){return m=>{if(bn(m,r))return m.ctrlKey&&m.preventDefault(),!1;m.preventDefault(),m.stopImmediatePropagation();const v=o.property("__zoom").k||1;if(m.ctrlKey&&f){const N=Bt(m),E=og(m),j=v*Math.pow(2,E);l.scaleTo(o,j,N,m);return}const g=m.deltaMode===1?20:1;let w=u===pr.Vertical?0:m.deltaX*g,S=u===pr.Horizontal?0:m.deltaY*g;!ao()&&m.shiftKey&&u!==pr.Vertical&&(w=m.deltaY*g,S=0),l.translateBy(o,-(w/v)*c,-(S/v)*c,{internal:!0});const P=ml(o.property("__zoom"));clearTimeout(t.panScrollTimeout),t.isPanScrolling?p==null||p(m,P):(t.isPanScrolling=!0,h==null||h(m,P)),t.panScrollTimeout=setTimeout(()=>{y==null||y(m,P),t.isPanScrolling=!1},150)}}function Zw({noWheelClassName:t,preventScrolling:r,d3ZoomHandler:o}){return function(l,u){const c=l.type==="wheel",f=!r&&c&&!l.ctrlKey,h=bn(l,t);if(l.ctrlKey&&c&&h&&l.preventDefault(),f||h)return null;l.preventDefault(),o.call(this,l,u)}}function Jw({zoomPanValues:t,onDraggingChange:r,onPanZoomStart:o}){return l=>{var c,f,h;if((c=l.sourceEvent)!=null&&c.internal)return;const u=ml(l.transform);t.mouseButton=((f=l.sourceEvent)==null?void 0:f.button)||0,t.isZoomingOrPanning=!0,t.prevViewport=u,((h=l.sourceEvent)==null?void 0:h.type)==="mousedown"&&r(!0),o&&(o==null||o(l.sourceEvent,u))}}function e1({zoomPanValues:t,panOnDrag:r,onPaneContextMenu:o,onTransformChange:l,onPanZoom:u}){return c=>{var f,h;t.usedRightMouseButton=!!(o&&ig(r,t.mouseButton??0)),(f=c.sourceEvent)!=null&&f.sync||l([c.transform.x,c.transform.y,c.transform.k]),u&&!((h=c.sourceEvent)!=null&&h.internal)&&(u==null||u(c.sourceEvent,ml(c.transform)))}}function t1({zoomPanValues:t,panOnDrag:r,panOnScroll:o,onDraggingChange:l,onPanZoomEnd:u,onPaneContextMenu:c}){return f=>{var h;if(!((h=f.sourceEvent)!=null&&h.internal)&&(t.isZoomingOrPanning=!1,c&&ig(r,t.mouseButton??0)&&!t.usedRightMouseButton&&f.sourceEvent&&c(f.sourceEvent),t.usedRightMouseButton=!1,l(!1),u)){const p=ml(f.transform);t.prevViewport=p,clearTimeout(t.timerId),t.timerId=setTimeout(()=>{u==null||u(f.sourceEvent,p)},o?150:0)}}}function n1({panActivationKeyPressed:t,zoomActivationKeyPressed:r,zoomOnScroll:o,zoomOnPinch:l,panOnDrag:u,panOnScroll:c,zoomOnDoubleClick:f,userSelectionActive:h,noWheelClassName:p,noPanClassName:y,lib:m,connectionInProgress:v}){return g=>{var E;const w=r||o,S=l&&g.ctrlKey,P=g.type==="wheel";if(g.button===1&&g.type==="mousedown"&&(bn(g,`${m}-flow__node`)||bn(g,`${m}-flow__edge`)||bn(g,`${m}-flow__selection`)||bn(g,`${m}-flow__nodesselection`)))return!0;if(!u&&!w&&!c&&!f&&!l||h||v&&!P||bn(g,p)&&P||bn(g,y)&&(!P||c&&P&&!r)||!l&&g.ctrlKey&&P)return!1;if(!l&&g.type==="touchstart"&&((E=g.touches)==null?void 0:E.length)>1)return g.preventDefault(),!1;if(!w&&!c&&!S&&P||!u&&(g.type==="mousedown"||g.type==="touchstart")||Array.isArray(u)&&!u.includes(g.button)&&g.type==="mousedown")return!1;const N=Array.isArray(u)&&u.includes(g.button)||!g.button||g.button<=1;return(!g.ctrlKey||P||t)&&N}}function r1({domNode:t,minZoom:r,maxZoom:o,translateExtent:l,viewport:u,onPanZoom:c,onPanZoomStart:f,onPanZoomEnd:h,onDraggingChange:p}){const y={isZoomingOrPanning:!1,usedRightMouseButton:!1,prevViewport:{},mouseButton:0,timerId:void 0,panScrollTimeout:void 0,isPanScrolling:!1},m=t.getBoundingClientRect();let v=[[0,0],[m.width,m.height]];const g=typeof ResizeObserver<"u"?new ResizeObserver(J=>{const C=J[0];C&&(v=[[0,0],[C.contentRect.width,C.contentRect.height]])}):null;g==null||g.observe(t);const w=Tp().extent(()=>v).scaleExtent([r,o]).translateExtent(l),S=kt(t).call(w);I({x:u.x,y:u.y,zoom:ri(u.zoom,r,o)},[[0,0],[m.width,m.height]],l);const P=S.on("wheel.zoom"),N=S.on("dblclick.zoom");w.wheelDelta(og);async function E(J,C){return S?new Promise(U=>{w==null||w.interpolate((C==null?void 0:C.interpolate)==="linear"?eo:Xs).transform(ka(S,C==null?void 0:C.duration,C==null?void 0:C.ease,()=>U(!0)),J)}):!1}function j({noWheelClassName:J,noPanClassName:C,onPaneContextMenu:U,userSelectionActive:H,panOnScroll:B,panOnDrag:A,panOnScrollMode:R,panOnScrollSpeed:O,preventScrolling:M,zoomOnPinch:z,zoomOnScroll:ne,zoomOnDoubleClick:re,panActivationKeyPressed:ae=!1,zoomActivationKeyPressed:fe,lib:ce,onTransformChange:K,connectionInProgress:se,paneClickDistance:he,selectionOnDrag:Se}){H&&!y.isZoomingOrPanning&&_();const xe=B&&!fe&&!H;w.clickDistance(Se?1/0:!Ut(he)||he<0?0:he);const ge=xe?qw({zoomPanValues:y,noWheelClassName:J,d3Selection:S,d3Zoom:w,panOnScrollMode:R,panOnScrollSpeed:O,zoomOnPinch:z,onPanZoomStart:f,onPanZoom:c,onPanZoomEnd:h}):Zw({noWheelClassName:J,preventScrolling:M,d3ZoomHandler:P});S.on("wheel.zoom",ge,{passive:!1});const Ce=Jw({zoomPanValues:y,onDraggingChange:p,onPanZoomStart:f});w.on("start",Ce);const F=e1({zoomPanValues:y,panOnDrag:A,onPaneContextMenu:!!U,onPanZoom:c,onTransformChange:K});w.on("zoom",F);const ye=t1({zoomPanValues:y,panOnDrag:A,panOnScroll:B,onPaneContextMenu:U,onPanZoomEnd:h,onDraggingChange:p});w.on("end",ye);const Pe=n1({panActivationKeyPressed:ae,zoomActivationKeyPressed:fe,panOnDrag:A,zoomOnScroll:ne,panOnScroll:B,zoomOnDoubleClick:re,zoomOnPinch:z,userSelectionActive:H,noPanClassName:C,noWheelClassName:J,lib:ce,connectionInProgress:se});w.filter(Pe),re?S.on("dblclick.zoom",N):S.on("dblclick.zoom",null)}function _(){w.on("zoom",null)}async function I(J,C,U){const H=Ea(J),B=w==null?void 0:w.constrain()(H,C,U);return B&&await E(B),B}async function b(J,C){const U=Ea(J);return await E(U,C),U}function $(J){if(S){const C=Ea(J),U=S.property("__zoom");(U.k!==J.zoom||U.x!==J.x||U.y!==J.y)&&(w==null||w.transform(S,C,null,{sync:!0}))}}function V(){const J=S?Ip(S.node()):{x:0,y:0,k:1};return{x:J.x,y:J.y,zoom:J.k}}async function X(J,C){return S?new Promise(U=>{w==null||w.interpolate((C==null?void 0:C.interpolate)==="linear"?eo:Xs).scaleTo(ka(S,C==null?void 0:C.duration,C==null?void 0:C.ease,()=>U(!0)),J)}):!1}async function G(J,C){return S?new Promise(U=>{w==null||w.interpolate((C==null?void 0:C.interpolate)==="linear"?eo:Xs).scaleBy(ka(S,C==null?void 0:C.duration,C==null?void 0:C.ease,()=>U(!0)),J)}):!1}function te(J){w==null||w.scaleExtent(J)}function Z(J){w==null||w.translateExtent(J)}function ee(J){const C=!Ut(J)||J<0?0:J;w==null||w.clickDistance(C)}return{update:j,destroy:_,setViewport:b,setViewportConstrained:I,getViewport:V,scaleTo:X,scaleBy:G,setScaleExtent:te,setTranslateExtent:Z,syncViewport:$,setClickDistance:ee}}var oi;(function(t){t.Line="line",t.Handle="handle"})(oi||(oi={}));function i1({width:t,prevWidth:r,height:o,prevHeight:l,affectsX:u,affectsY:c}){const f=t-r,h=o-l,p=[f>0?1:f<0?-1:0,h>0?1:h<0?-1:0];return f&&u&&(p[0]=p[0]*-1),h&&c&&(p[1]=p[1]*-1),p}function wh(t){const r=t.includes("right")||t.includes("left"),o=t.includes("bottom")||t.includes("top"),l=t.includes("left"),u=t.includes("top");return{isHorizontal:r,isVertical:o,affectsX:l,affectsY:u}}function Vn(t,r){return Math.max(0,r-t)}function Bn(t,r){return Math.max(0,t-r)}function bs(t,r,o){return Math.max(0,r-t,t-o)}function Sh(t,r){return t?!r:r}function o1(t,r,o,l,u,c,f,h){let{affectsX:p,affectsY:y}=r;const{isHorizontal:m,isVertical:v}=r,g=m&&v,{xSnapped:w,ySnapped:S}=o,{minWidth:P,maxWidth:N,minHeight:E,maxHeight:j}=l,{x:_,y:I,width:b,height:$,aspectRatio:V}=t;let X=Math.floor(m?w-t.pointerX:0),G=Math.floor(v?S-t.pointerY:0);const te=b+(p?-X:X),Z=$+(y?-G:G),ee=-c[0]*b,J=-c[1]*$;let C=bs(te,P,N),U=bs(Z,E,j);if(f){let A=0,R=0;p&&X<0?A=Vn(_+X+ee,f[0][0]):!p&&X>0&&(A=Bn(_+te+ee,f[1][0])),y&&G<0?R=Vn(I+G+J,f[0][1]):!y&&G>0&&(R=Bn(I+Z+J,f[1][1])),C=Math.max(C,A),U=Math.max(U,R)}if(h){let A=0,R=0;p&&X>0?A=Bn(_+X,h[0][0]):!p&&X<0&&(A=Vn(_+te,h[1][0])),y&&G>0?R=Bn(I+G,h[0][1]):!y&&G<0&&(R=Vn(I+Z,h[1][1])),C=Math.max(C,A),U=Math.max(U,R)}if(u){if(m){const A=bs(te/V,E,j)*V;if(C=Math.max(C,A),f){let R=0;!p&&!y||p&&!y&&g?R=Bn(I+J+te/V,f[1][1])*V:R=Vn(I+J+(p?X:-X)/V,f[0][1])*V,C=Math.max(C,R)}if(h){let R=0;!p&&!y||p&&!y&&g?R=Vn(I+te/V,h[1][1])*V:R=Bn(I+(p?X:-X)/V,h[0][1])*V,C=Math.max(C,R)}}if(v){const A=bs(Z*V,P,N)/V;if(U=Math.max(U,A),f){let R=0;!p&&!y||y&&!p&&g?R=Bn(_+Z*V+ee,f[1][0])/V:R=Vn(_+(y?G:-G)*V+ee,f[0][0])/V,U=Math.max(U,R)}if(h){let R=0;!p&&!y||y&&!p&&g?R=Vn(_+Z*V,h[1][0])/V:R=Bn(_+(y?G:-G)*V,h[0][0])/V,U=Math.max(U,R)}}}G=G+(G<0?U:-U),X=X+(X<0?C:-C),u&&(g?te>Z*V?G=(Sh(p,y)?-X:X)/V:X=(Sh(p,y)?-G:G)*V:m?(G=X/V,y=p):(X=G*V,p=y));const H=p?_+X:_,B=y?I+G:I;return{width:b+(p?-X:X),height:$+(y?-G:G),x:c[0]*X*(p?-1:1)+H,y:c[1]*G*(y?-1:1)+B}}const sg={width:0,height:0,x:0,y:0},s1={...sg,pointerX:0,pointerY:0,aspectRatio:1};function l1(t,r,o){const l=r.position.x+t.position.x,u=r.position.y+t.position.y,c=t.measured.width??0,f=t.measured.height??0,h=o[0]*c,p=o[1]*f;return[[l-h,u-p],[l+c-h,u+f-p]]}function u1({domNode:t,nodeId:r,getStoreItems:o,onChange:l,onEnd:u}){const c=kt(t);let f={controlDirection:wh("bottom-right"),boundaries:{minWidth:0,minHeight:0,maxWidth:Number.MAX_VALUE,maxHeight:Number.MAX_VALUE},resizeDirection:void 0,keepAspectRatio:!1};function h({controlPosition:y,boundaries:m,keepAspectRatio:v,resizeDirection:g,onResizeStart:w,onResize:S,onResizeEnd:P,shouldResize:N}){let E={...sg},j={...s1};f={boundaries:m,resizeDirection:g,keepAspectRatio:v,controlDirection:wh(y)};let _,I=null,b=[],$,V,X,G=!1;const te=gp().on("start",Z=>{const{nodeLookup:ee,transform:J,snapGrid:C,snapToGrid:U,nodeOrigin:H,paneDomNode:B}=o();if(_=ee.get(r),!_)return;I=(B==null?void 0:B.getBoundingClientRect())??null;const{xSnapped:A,ySnapped:R}=to(Z.sourceEvent,{transform:J,snapGrid:C,snapToGrid:U,containerBounds:I});E={width:_.measured.width??0,height:_.measured.height??0,x:_.position.x??0,y:_.position.y??0},j={...E,pointerX:A,pointerY:R,aspectRatio:E.width/E.height},$=void 0,V=vr(_.extent)?_.extent:void 0,_.parentId&&(_.extent==="parent"||_.expandParent)&&($=ee.get(_.parentId)),$&&_.extent==="parent"&&(V=[[0,0],[$.measured.width,$.measured.height]]),b=[],X=void 0;for(const[O,M]of ee)if(M.parentId===r&&(b.push({id:O,position:{...M.position},extent:M.extent}),M.extent==="parent"||M.expandParent)){const z=l1(M,_,M.origin??H);X?X=[[Math.min(z[0][0],X[0][0]),Math.min(z[0][1],X[0][1])],[Math.max(z[1][0],X[1][0]),Math.max(z[1][1],X[1][1])]]:X=z}w==null||w(Z,{...E})}).on("drag",Z=>{const{transform:ee,snapGrid:J,snapToGrid:C,nodeOrigin:U}=o(),H=to(Z.sourceEvent,{transform:ee,snapGrid:J,snapToGrid:C,containerBounds:I}),B=[];if(!_)return;const{x:A,y:R,width:O,height:M}=E,z={},ne=_.origin??U,{width:re,height:ae,x:fe,y:ce}=o1(j,f.controlDirection,H,f.boundaries,f.keepAspectRatio,ne,V,X),K=re!==O,se=ae!==M,he=fe!==A&&K,Se=ce!==R&&se;if(!he&&!Se&&!K&&!se)return;if((he||Se||ne[0]===1||ne[1]===1)&&(z.x=he?fe:E.x,z.y=Se?ce:E.y,E.x=z.x,E.y=z.y,b.length>0)){const F=fe-A,ye=ce-R;for(const Pe of b)Pe.position={x:Pe.position.x-F+ne[0]*(re-O),y:Pe.position.y-ye+ne[1]*(ae-M)},B.push(Pe)}if((K||se)&&(z.width=K&&(!f.resizeDirection||f.resizeDirection==="horizontal")?re:E.width,z.height=se&&(!f.resizeDirection||f.resizeDirection==="vertical")?ae:E.height,E.width=z.width,E.height=z.height),$&&_.expandParent){const F=ne[0]*(z.width??0);z.x&&z.x{G&&(P==null||P(Z,{...E}),u==null||u({...E}),G=!1)});c.call(te)}function p(){c.on(".drag",null)}return{update:h,destroy:p}}var Na={exports:{}},Ca={},Ma={exports:{}},Pa={};/** + * @license React + * use-sync-external-store-shim.production.js + * + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var _h;function a1(){if(_h)return Pa;_h=1;var t=fo();function r(v,g){return v===g&&(v!==0||1/v===1/g)||v!==v&&g!==g}var o=typeof Object.is=="function"?Object.is:r,l=t.useState,u=t.useEffect,c=t.useLayoutEffect,f=t.useDebugValue;function h(v,g){var w=g(),S=l({inst:{value:w,getSnapshot:g}}),P=S[0].inst,N=S[1];return c(function(){P.value=w,P.getSnapshot=g,p(P)&&N({inst:P})},[v,w,g]),u(function(){return p(P)&&N({inst:P}),v(function(){p(P)&&N({inst:P})})},[v]),f(w),w}function p(v){var g=v.getSnapshot;v=v.value;try{var w=g();return!o(v,w)}catch{return!0}}function y(v,g){return g()}var m=typeof window>"u"||typeof window.document>"u"||typeof window.document.createElement>"u"?y:h;return Pa.useSyncExternalStore=t.useSyncExternalStore!==void 0?t.useSyncExternalStore:m,Pa}var Eh;function c1(){return Eh||(Eh=1,Ma.exports=a1()),Ma.exports}/** + * @license React + * use-sync-external-store-shim/with-selector.production.js + * + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var kh;function f1(){if(kh)return Ca;kh=1;var t=fo(),r=c1();function o(y,m){return y===m&&(y!==0||1/y===1/m)||y!==y&&m!==m}var l=typeof Object.is=="function"?Object.is:o,u=r.useSyncExternalStore,c=t.useRef,f=t.useEffect,h=t.useMemo,p=t.useDebugValue;return Ca.useSyncExternalStoreWithSelector=function(y,m,v,g,w){var S=c(null);if(S.current===null){var P={hasValue:!1,value:null};S.current=P}else P=S.current;S=h(function(){function E($){if(!j){if(j=!0,_=$,$=g($),w!==void 0&&P.hasValue){var V=P.value;if(w(V,$))return I=V}return I=$}if(V=I,l(_,$))return V;var X=g($);return w!==void 0&&w(V,X)?(_=$,V):(_=$,I=X)}var j=!1,_,I,b=v===void 0?null:v;return[function(){return E(m())},b===null?void 0:function(){return E(b())}]},[m,v,g,w]);var N=u(y,S[0],S[1]);return f(function(){P.hasValue=!0,P.value=N},[N]),p(N),N},Ca}var Nh;function d1(){return Nh||(Nh=1,Na.exports=f1()),Na.exports}var h1=d1();const p1=Jh(h1),g1={},Ch=t=>{let r;const o=new Set,l=(m,v)=>{const g=typeof m=="function"?m(r):m;if(!Object.is(g,r)){const w=r;r=v??(typeof g!="object"||g===null)?g:Object.assign({},r,g),o.forEach(S=>S(r,w))}},u=()=>r,p={setState:l,getState:u,getInitialState:()=>y,subscribe:m=>(o.add(m),()=>o.delete(m)),destroy:()=>{(g1?"production":void 0)!=="production"&&console.warn("[DEPRECATED] The `destroy` method will be unsupported in a future version. Instead use unsubscribe function returned by subscribe. Everything will be garbage-collected if store is garbage-collected."),o.clear()}},y=r=t(l,u,p);return p},m1=t=>t?Ch(t):Ch,{useDebugValue:y1}=M0,{useSyncExternalStoreWithSelector:v1}=p1,x1=t=>t;function lg(t,r=x1,o){const l=v1(t.subscribe,t.getState,t.getServerState||t.getInitialState,r,o);return y1(l),l}const Mh=(t,r)=>{const o=m1(t),l=(u,c=r)=>lg(o,u,c);return Object.assign(l,o),l},w1=(t,r)=>t?Mh(t,r):Mh;function Ve(t,r){if(Object.is(t,r))return!0;if(typeof t!="object"||t===null||typeof r!="object"||r===null)return!1;if(t instanceof Map&&r instanceof Map){if(t.size!==r.size)return!1;for(const[l,u]of t)if(!Object.is(u,r.get(l)))return!1;return!0}if(t instanceof Set&&r instanceof Set){if(t.size!==r.size)return!1;for(const l of t)if(!r.has(l))return!1;return!0}const o=Object.keys(t);if(o.length!==Object.keys(r).length)return!1;for(const l of o)if(!Object.prototype.hasOwnProperty.call(r,l)||!Object.is(t[l],r[l]))return!1;return!0}ep();const yl=Q.createContext(null),S1=yl.Provider,ug=Yt.error001("react");function Te(t,r){const o=Q.useContext(yl);if(o===null)throw new Error(ug);return lg(o,t,r)}function $e(){const t=Q.useContext(yl);if(t===null)throw new Error(ug);return Q.useMemo(()=>({getState:t.getState,setState:t.setState,subscribe:t.subscribe}),[t])}const Ph={display:"none"},_1={position:"absolute",width:1,height:1,margin:-1,border:0,padding:0,overflow:"hidden",clip:"rect(0px, 0px, 0px, 0px)",clipPath:"inset(100%)"},ag="react-flow__node-desc",cg="react-flow__edge-desc",E1="react-flow__aria-live",k1=t=>t.ariaLiveMessage,N1=t=>t.ariaLabelConfig;function C1({rfId:t}){const r=Te(k1);return k.jsx("div",{id:`${E1}-${t}`,"aria-live":"assertive","aria-atomic":"true",style:_1,children:r})}function M1({rfId:t,disableKeyboardA11y:r}){const o=Te(N1);return k.jsxs(k.Fragment,{children:[k.jsx("div",{id:`${ag}-${t}`,style:Ph,children:r?o["node.a11yDescription.default"]:o["node.a11yDescription.keyboardDisabled"]}),k.jsx("div",{id:`${cg}-${t}`,style:Ph,children:o["edge.a11yDescription.default"]}),!r&&k.jsx(C1,{rfId:t})]})}const vl=Q.forwardRef(({position:t="top-left",children:r,className:o,style:l,...u},c)=>{const f=`${t}`.split("-");return k.jsx("div",{className:We(["react-flow__panel",o,...f]),style:l,ref:c,...u,children:r})});vl.displayName="Panel";const Ih="https://reactflow.dev?utm_source=attribution";function P1({proOptions:t,position:r="bottom-right"}){return t!=null&&t.hideAttribution?null:k.jsx(vl,{position:r,className:"react-flow__attribution","data-message":`Please only hide this attribution when you are subscribed to React Flow Pro: ${Ih}`,children:k.jsx("a",{href:Ih,target:"_blank",rel:"noopener noreferrer","aria-label":"React Flow attribution",children:"React Flow"})})}const I1=t=>{const r=[],o=[];for(const[,l]of t.nodeLookup)l.selected&&r.push(l.internals.userNode);for(const[,l]of t.edgeLookup)l.selected&&o.push(l);return{selectedNodes:r,selectedEdges:o}},Us=t=>t.id;function T1(t,r){return Ve(t.selectedNodes.map(Us),r.selectedNodes.map(Us))&&Ve(t.selectedEdges.map(Us),r.selectedEdges.map(Us))}function z1({onSelectionChange:t}){const r=$e(),{selectedNodes:o,selectedEdges:l}=Te(I1,T1);return Q.useEffect(()=>{const u={nodes:o,edges:l};t==null||t(u),r.getState().onSelectionChangeHandlers.forEach(c=>c(u))},[o,l,t]),null}const j1=t=>!!t.onSelectionChangeHandlers;function L1({onSelectionChange:t}){const r=Te(j1);return t||r?k.jsx(z1,{onSelectionChange:t}):null}const fg=[0,0],R1={x:0,y:0,zoom:1},A1=["nodes","edges","defaultNodes","defaultEdges","onConnect","onConnectStart","onConnectEnd","onClickConnectStart","onClickConnectEnd","nodesDraggable","autoPanOnNodeFocus","nodesConnectable","nodesFocusable","edgesFocusable","edgesReconnectable","elevateNodesOnSelect","elevateEdgesOnSelect","minZoom","maxZoom","nodeExtent","onNodesChange","onEdgesChange","elementsSelectable","connectionMode","snapGrid","snapToGrid","translateExtent","connectOnClick","defaultEdgeOptions","fitView","fitViewOptions","onNodesDelete","onEdgesDelete","onDelete","onNodeDrag","onNodeDragStart","onNodeDragStop","onSelectionDrag","onSelectionDragStart","onSelectionDragStop","onMoveStart","onMove","onMoveEnd","noPanClassName","nodeOrigin","autoPanOnConnect","autoPanOnNodeDrag","onError","connectionRadius","isValidConnection","selectNodesOnDrag","nodeDragThreshold","connectionDragThreshold","onBeforeDelete","debug","autoPanSpeed","ariaLabelConfig","zIndexMode"],Th=[...A1,"rfId"],$1=t=>({setNodes:t.setNodes,setEdges:t.setEdges,setMinZoom:t.setMinZoom,setMaxZoom:t.setMaxZoom,setTranslateExtent:t.setTranslateExtent,setNodeExtent:t.setNodeExtent,reset:t.reset,setDefaultNodesAndEdges:t.setDefaultNodesAndEdges}),zh={translateExtent:so,nodeOrigin:fg,minZoom:.5,maxZoom:2,elementsSelectable:!0,noPanClassName:"nopan",rfId:"1"};function D1(t){const{setNodes:r,setEdges:o,setMinZoom:l,setMaxZoom:u,setTranslateExtent:c,setNodeExtent:f,reset:h,setDefaultNodesAndEdges:p}=Te($1,Ve),y=$e();Q.useEffect(()=>(p(t.defaultNodes,t.defaultEdges),()=>{m.current=zh,h()}),[]);const m=Q.useRef(zh);return Q.useEffect(()=>{for(const v of Th){const g=t[v],w=m.current[v];g!==w&&(typeof t[v]>"u"||(v==="nodes"?r(g):v==="edges"?o(g):v==="minZoom"?l(g):v==="maxZoom"?u(g):v==="translateExtent"?c(g):v==="nodeExtent"?f(g):v==="ariaLabelConfig"?y.setState({ariaLabelConfig:Sw(g)}):v==="fitView"?y.setState({fitViewQueued:g}):v==="fitViewOptions"?y.setState({fitViewOptions:g}):y.setState({[v]:g})))}m.current=t},Th.map(v=>t[v])),null}function jh(){return typeof window>"u"||!window.matchMedia?null:window.matchMedia("(prefers-color-scheme: dark)")}function O1(t){var l;const[r,o]=Q.useState(t==="system"?null:t);return Q.useEffect(()=>{if(t!=="system"){o(t);return}const u=jh(),c=()=>o(u!=null&&u.matches?"dark":"light");return c(),u==null||u.addEventListener("change",c),()=>{u==null||u.removeEventListener("change",c)}},[t]),r!==null?r:(l=jh())!=null&&l.matches?"dark":"light"}const Lh=typeof document<"u"?document:null;function co(t=null,r={target:Lh,actInsideInputWithModifier:!0}){const[o,l]=Q.useState(!1),u=Q.useRef(!1),c=Q.useRef(new Set([])),[f,h]=Q.useMemo(()=>{if(t!==null){const y=(Array.isArray(t)?t:[t]).filter(v=>typeof v=="string").map(v=>v.replace(/\+/g,` +`).replace(` + +`,` ++`).split(` +`)),m=y.reduce((v,g)=>v.concat(...g),[]);return[y,m]}return[[],[]]},[t]);return Q.useEffect(()=>{const p=(r==null?void 0:r.target)??Lh,y=(r==null?void 0:r.actInsideInputWithModifier)??!0;if(t!==null){const m=w=>{var N,E;if(u.current=w.ctrlKey||w.metaKey||w.shiftKey||w.altKey,(!u.current||u.current&&!y)&&Up(w))return!1;const P=Ah(w.code,h);if(c.current.add(w[P]),Rh(f,c.current,!1)){const j=((E=(N=w.composedPath)==null?void 0:N.call(w))==null?void 0:E[0])||w.target,_=(j==null?void 0:j.nodeName)==="BUTTON"||(j==null?void 0:j.nodeName)==="A";r.preventDefault!==!1&&(u.current||!_)&&w.preventDefault(),l(!0)}},v=w=>{const S=Ah(w.code,h);Rh(f,c.current,!0)?(l(!1),c.current.clear()):c.current.delete(w[S]),w.key==="Meta"&&c.current.clear(),u.current=!1},g=()=>{c.current.clear(),l(!1)};return p==null||p.addEventListener("keydown",m),p==null||p.addEventListener("keyup",v),window.addEventListener("blur",g),window.addEventListener("contextmenu",g),()=>{p==null||p.removeEventListener("keydown",m),p==null||p.removeEventListener("keyup",v),window.removeEventListener("blur",g),window.removeEventListener("contextmenu",g)}}},[t,l]),o}function Rh(t,r,o){return t.filter(l=>o||l.length===r.size).some(l=>l.every(u=>r.has(u)))}function Ah(t,r){return r.includes(t)?"code":"key"}const F1=()=>{const t=$e();return Q.useMemo(()=>({zoomIn:async r=>{const{panZoom:o}=t.getState();return o?o.scaleBy(1.2,r):!1},zoomOut:async r=>{const{panZoom:o}=t.getState();return o?o.scaleBy(1/1.2,r):!1},zoomTo:async(r,o)=>{const{panZoom:l}=t.getState();return l?l.scaleTo(r,o):!1},getZoom:()=>t.getState().transform[2],setViewport:async(r,o)=>{const{transform:[l,u,c],panZoom:f}=t.getState();return f?(await f.setViewport({x:r.x??l,y:r.y??u,zoom:r.zoom??c},o),!0):!1},getViewport:()=>{const[r,o,l]=t.getState().transform;return{x:r,y:o,zoom:l}},setCenter:async(r,o,l)=>t.getState().setCenter(r,o,l),fitBounds:async(r,o)=>{const{width:l,height:u,minZoom:c,maxZoom:f,panZoom:h}=t.getState(),p=rc(r,l,u,c,f,(o==null?void 0:o.padding)??.1);return h?(await h.setViewport(p,{duration:o==null?void 0:o.duration,ease:o==null?void 0:o.ease,interpolate:o==null?void 0:o.interpolate}),!0):!1},screenToFlowPosition:(r,o={})=>{const{transform:l,snapGrid:u,snapToGrid:c,domNode:f}=t.getState();if(!f)return r;const{x:h,y:p}=f.getBoundingClientRect(),y={x:r.x-h,y:r.y-p},m=o.snapGrid??u,v=o.snapToGrid??c;return vo(y,l,v,m)},flowToScreenPosition:r=>{const{transform:o,domNode:l}=t.getState();if(!l)return r;const{x:u,y:c}=l.getBoundingClientRect(),f=ii(r,o);return{x:f.x+u,y:f.y+c}}}),[])};function dg(t,r){const o=[],l=new Map,u=[];for(const c of t)if(c.type==="add"){u.push(c);continue}else if(c.type==="remove"||c.type==="replace")l.set(c.id,[c]);else{const f=l.get(c.id);f?f.push(c):l.set(c.id,[c])}for(const c of r){const f=l.get(c.id);if(!f){o.push(c);continue}if(f[0].type==="remove")continue;if(f[0].type==="replace"){o.push({...f[0].item});continue}const h={...c};for(const p of f)H1(p,h);o.push(h)}return u.length&&u.forEach(c=>{c.index!==void 0?o.splice(c.index,0,{...c.item}):o.push({...c.item})}),o}function H1(t,r){switch(t.type){case"select":{r.selected=t.selected;break}case"position":{typeof t.position<"u"&&(r.position=t.position),typeof t.dragging<"u"&&(r.dragging=t.dragging);break}case"dimensions":{typeof t.dimensions<"u"&&(r.measured={...t.dimensions},t.setAttributes&&((t.setAttributes===!0||t.setAttributes==="width")&&(r.width=t.dimensions.width),(t.setAttributes===!0||t.setAttributes==="height")&&(r.height=t.dimensions.height))),typeof t.resizing=="boolean"&&(r.resizing=t.resizing);break}}}function V1(t,r){return dg(t,r)}function B1(t,r){return dg(t,r)}function fr(t,r){return{id:t,type:"select",selected:r}}function qr(t,r=new Set,o=!1){const l=[];for(const[u,c]of t){const f=r.has(u);!(c.selected===void 0&&!f)&&c.selected!==f&&(o&&(c.selected=f),l.push(fr(c.id,f)))}return l}function $h({items:t=[],lookup:r}){var u;const o=[],l=new Map(t.map(c=>[c.id,c]));for(const[c,f]of t.entries()){const h=r.get(f.id),p=((u=h==null?void 0:h.internals)==null?void 0:u.userNode)??h;p!==void 0&&p!==f&&o.push({id:f.id,item:f,type:"replace"}),p===void 0&&o.push({item:f,type:"add",index:c})}for(const[c]of r)l.get(c)===void 0&&o.push({id:c,type:"remove"});return o}function Dh(t){return{id:t.id,type:"remove"}}const b1=Hp();function U1(t,r,o={}){return Mw(t,r,{...o,onError:o.onError??b1})}const Oh=t=>dw(t),W1=t=>Ap(t);function hg(t){return Q.forwardRef(t)}const pg=typeof window<"u"?Q.useLayoutEffect:Q.useEffect;function Fh(t){const[r,o]=Q.useState(BigInt(0)),[l]=Q.useState(()=>Y1(()=>o(u=>u+BigInt(1))));return pg(()=>{const u=l.get();u.length&&(t(u),l.reset())},[r]),l}function Y1(t){let r=[];return{get:()=>r,reset:()=>{r=[]},push:o=>{r.push(o),t()}}}const gg=Q.createContext(null);function X1({children:t}){const r=$e(),o=Q.useCallback(h=>{const{nodes:p=[],setNodes:y,hasDefaultNodes:m,onNodesChange:v,nodeLookup:g,fitViewQueued:w,onNodesChangeMiddlewareMap:S}=r.getState();let P=p;for(const E of h)P=typeof E=="function"?E(P):E;let N=$h({items:P,lookup:g});for(const E of S.values())N=E(N);m&&y(P),N.length>0?v==null||v(N):w&&window.requestAnimationFrame(()=>{const{fitViewQueued:E,nodes:j,setNodes:_}=r.getState();E&&_(j)})},[]),l=Fh(o),u=Q.useCallback(h=>{const{edges:p=[],setEdges:y,hasDefaultEdges:m,onEdgesChange:v,edgeLookup:g}=r.getState();let w=p;for(const S of h)w=typeof S=="function"?S(w):S;m?y(w):v&&v($h({items:w,lookup:g}))},[]),c=Fh(u),f=Q.useMemo(()=>({nodeQueue:l,edgeQueue:c}),[]);return k.jsx(gg.Provider,{value:f,children:t})}function Q1(){const t=Q.useContext(gg);if(!t)throw new Error("useBatchContext must be used within a BatchProvider");return t}const G1=t=>!!t.panZoom;function cc(){const t=F1(),r=$e(),o=Q1(),l=Te(G1),u=Q.useMemo(()=>{const c=v=>r.getState().nodeLookup.get(v),f=v=>{o.nodeQueue.push(v)},h=v=>{o.edgeQueue.push(v)},p=v=>{var E,j;const{nodeLookup:g,nodeOrigin:w}=r.getState(),S=Oh(v)?v:g.get(v.id),P=S.parentId?Bp(S.position,S.measured,S.parentId,g,w):S.position,N={...S,position:P,width:((E=S.measured)==null?void 0:E.width)??S.width,height:((j=S.measured)==null?void 0:j.height)??S.height};return uo(N)},y=(v,g,w={replace:!1})=>{f(S=>S.map(P=>{if(P.id===v){const N=typeof g=="function"?g(P):g;return w.replace&&Oh(N)?N:{...P,...N}}return P}))},m=(v,g,w={replace:!1})=>{h(S=>S.map(P=>{if(P.id===v){const N=typeof g=="function"?g(P):g;return w.replace&&W1(N)?N:{...P,...N}}return P}))};return{getNodes:()=>r.getState().nodes.map(v=>({...v})),getNode:v=>{var g;return(g=c(v))==null?void 0:g.internals.userNode},getInternalNode:c,getEdges:()=>{const{edges:v=[]}=r.getState();return v.map(g=>({...g}))},getEdge:v=>r.getState().edgeLookup.get(v),setNodes:f,setEdges:h,addNodes:v=>{const g=Array.isArray(v)?v:[v];o.nodeQueue.push(w=>[...w,...g])},addEdges:v=>{const g=Array.isArray(v)?v:[v];o.edgeQueue.push(w=>[...w,...g])},toObject:()=>{const{nodes:v=[],edges:g=[],transform:w}=r.getState(),[S,P,N]=w;return{nodes:v.map(E=>({...E})),edges:g.map(E=>({...E})),viewport:{x:S,y:P,zoom:N}}},deleteElements:async({nodes:v=[],edges:g=[]})=>{const{nodes:w,edges:S,onNodesDelete:P,onEdgesDelete:N,triggerNodeChanges:E,triggerEdgeChanges:j,onDelete:_,onBeforeDelete:I}=r.getState(),{nodes:b,edges:$}=await yw({nodesToRemove:v,edgesToRemove:g,nodes:w,edges:S,onBeforeDelete:I}),V=$.length>0,X=b.length>0;if(V){const G=$.map(Dh);N==null||N($),j(G)}if(X){const G=b.map(Dh);P==null||P(b),E(G)}return(X||V)&&(_==null||_({nodes:b,edges:$})),{deletedNodes:b,deletedEdges:$}},getIntersectingNodes:(v,g=!0,w)=>{const S=ah(v),P=S?v:p(v),N=w!==void 0;return P?(w||r.getState().nodes).filter(E=>{const j=r.getState().nodeLookup.get(E.id);if(j&&!S&&(E.id===v.id||!j.internals.positionAbsolute))return!1;const _=uo(N?E:j),I=sl(_,P);return g&&I>0||I>=_.width*_.height||I>=P.width*P.height}):[]},isNodeIntersecting:(v,g,w=!0)=>{const P=ah(v)?v:p(v);if(!P)return!1;const N=sl(P,g);return w&&N>0||N>=g.width*g.height||N>=P.width*P.height},updateNode:y,updateNodeData:(v,g,w={replace:!1})=>{y(v,S=>{const P=typeof g=="function"?g(S):g;return w.replace?{...S,data:P}:{...S,data:{...S.data,...P}}},w)},updateEdge:m,updateEdgeData:(v,g,w={replace:!1})=>{m(v,S=>{const P=typeof g=="function"?g(S):g;return w.replace?{...S,data:P}:{...S,data:{...S.data,...P}}},w)},getNodesBounds:v=>{const{nodeLookup:g,nodeOrigin:w}=r.getState();return hw(v,{nodeLookup:g,nodeOrigin:w})},getHandleConnections:({type:v,id:g,nodeId:w})=>{var S;return Array.from(((S=r.getState().connectionLookup.get(`${w}-${v}${g?`-${g}`:""}`))==null?void 0:S.values())??[])},getNodeConnections:({type:v,handleId:g,nodeId:w})=>{var S;return Array.from(((S=r.getState().connectionLookup.get(`${w}${v?g?`-${v}-${g}`:`-${v}`:""}`))==null?void 0:S.values())??[])},fitView:async v=>{const g=r.getState().fitViewResolver??ww();return r.setState({fitViewQueued:!0,fitViewOptions:v,fitViewResolver:g}),o.nodeQueue.push(w=>[...w]),g.promise}}},[]);return Q.useMemo(()=>({...u,...t,viewportInitialized:l}),[l])}const Hh=t=>t.selected,K1=typeof window<"u"?window:void 0;function q1({deleteKeyCode:t,multiSelectionKeyCode:r}){const o=$e(),{deleteElements:l}=cc(),u=co(t,{actInsideInputWithModifier:!1}),c=co(r,{target:K1});Q.useEffect(()=>{if(u){const{edges:f,nodes:h}=o.getState();l({nodes:h.filter(Hh),edges:f.filter(Hh)}),o.setState({nodesSelectionActive:!1})}},[u]),Q.useEffect(()=>{o.setState({multiSelectionActive:c})},[c])}function Z1(t){const r=$e();Q.useEffect(()=>{const o=()=>{var u,c,f,h;if(!t.current||!(((c=(u=t.current).checkVisibility)==null?void 0:c.call(u))??!0))return!1;const l=ic(t.current);(l.height===0||l.width===0)&&((h=(f=r.getState()).onError)==null||h.call(f,"004",Yt.error004())),r.setState({width:l.width||500,height:l.height||500})};if(t.current){o(),window.addEventListener("resize",o);const l=new ResizeObserver(()=>o());return l.observe(t.current),()=>{window.removeEventListener("resize",o),l&&t.current&&l.unobserve(t.current)}}},[])}const xl={position:"absolute",width:"100%",height:"100%",top:0,left:0},J1=t=>({userSelectionActive:t.userSelectionActive,lib:t.lib,connectionInProgress:t.connection.inProgress});function eS({onPaneContextMenu:t,zoomOnScroll:r=!0,zoomOnPinch:o=!0,panOnScroll:l=!1,panActivationKeyPressed:u,panOnScrollSpeed:c=.5,panOnScrollMode:f=pr.Free,zoomOnDoubleClick:h=!0,panOnDrag:p=!0,defaultViewport:y,translateExtent:m,minZoom:v,maxZoom:g,zoomActivationKeyCode:w,preventScrolling:S=!0,children:P,noWheelClassName:N,noPanClassName:E,onViewportChange:j,isControlledViewport:_,paneClickDistance:I,selectionOnDrag:b}){const $=$e(),V=Q.useRef(null),{userSelectionActive:X,lib:G,connectionInProgress:te}=Te(J1,Ve),Z=co(w),ee=Q.useRef();Z1(V);const J=Q.useCallback(C=>{j==null||j({x:C[0],y:C[1],zoom:C[2]}),_||$.setState({transform:C})},[j,_]);return Q.useEffect(()=>{if(V.current){ee.current=r1({domNode:V.current,minZoom:v,maxZoom:g,translateExtent:m,viewport:y,onDraggingChange:B=>$.setState(A=>A.paneDragging===B?A:{paneDragging:B}),onPanZoomStart:(B,A)=>{const{onViewportChangeStart:R,onMoveStart:O}=$.getState();O==null||O(B,A),R==null||R(A)},onPanZoom:(B,A)=>{const{onViewportChange:R,onMove:O}=$.getState();O==null||O(B,A),R==null||R(A)},onPanZoomEnd:(B,A)=>{const{onViewportChangeEnd:R,onMoveEnd:O}=$.getState();O==null||O(B,A),R==null||R(A)}});const{x:C,y:U,zoom:H}=ee.current.getViewport();return $.setState({panZoom:ee.current,transform:[C,U,H],domNode:V.current.closest(".react-flow")}),()=>{var B;(B=ee.current)==null||B.destroy()}}},[]),Q.useEffect(()=>{var C;(C=ee.current)==null||C.update({onPaneContextMenu:t,zoomOnScroll:r,zoomOnPinch:o,panOnScroll:l,panActivationKeyPressed:u,panOnScrollSpeed:c,panOnScrollMode:f,zoomOnDoubleClick:h,panOnDrag:p,zoomActivationKeyPressed:Z,preventScrolling:S,noPanClassName:E,userSelectionActive:X,noWheelClassName:N,lib:G,onTransformChange:J,connectionInProgress:te,selectionOnDrag:b,paneClickDistance:I})},[t,r,o,l,u,c,f,h,p,Z,S,E,X,N,G,J,te,b,I]),k.jsx("div",{className:"react-flow__renderer",ref:V,style:xl,children:P})}const tS=t=>({userSelectionActive:t.userSelectionActive,userSelectionRect:t.userSelectionRect});function nS(){const{userSelectionActive:t,userSelectionRect:r}=Te(tS,Ve);return t&&r?k.jsx("div",{className:"react-flow__selection react-flow__container",style:{width:r.width,height:r.height,transform:`translate(${r.x}px, ${r.y}px)`}}):null}const Ia=(t,r)=>o=>{o.target===r.current&&(t==null||t(o))},rS=t=>({userSelectionActive:t.userSelectionActive,elementsSelectable:t.elementsSelectable,dragging:t.paneDragging,panBy:t.panBy,autoPanSpeed:t.autoPanSpeed});function iS({isSelecting:t,selectionKeyPressed:r,selectionMode:o=lo.Full,panOnDrag:l,autoPanOnSelection:u,paneClickDistance:c,selectionOnDrag:f,onSelectionStart:h,onSelectionEnd:p,onPaneClick:y,onPaneContextMenu:m,onPaneScroll:v,onPaneMouseEnter:g,onPaneMouseMove:w,onPaneMouseLeave:S,children:P}){const N=Q.useRef(0),E=$e(),{userSelectionActive:j,elementsSelectable:_,dragging:I,panBy:b,autoPanSpeed:$}=Te(rS,Ve),V=_&&(t||j),X=Q.useRef(null),G=Q.useRef(),te=Q.useRef(new Set),Z=Q.useRef(new Set),ee=Q.useRef(!1),J=Q.useRef(!1),C=Q.useRef({x:0,y:0}),U=Q.useRef(!1),H=K=>{if(J.current||ee.current||E.getState().connection.inProgress){J.current=!1,ee.current=!1;return}y==null||y(K),E.getState().resetSelectedElements(),E.setState({nodesSelectionActive:!1})},B=K=>{if(Array.isArray(l)&&(l!=null&&l.includes(2))){K.preventDefault();return}m==null||m(K)},A=v?K=>v(K):void 0,R=K=>{J.current&&(K.stopPropagation(),J.current=!1)},O=K=>{var Pe,Qe;if(K.pointerType==="touch"&&l!==!1&&!r)return;const{domNode:se,transform:he}=E.getState();if(G.current=se==null?void 0:se.getBoundingClientRect(),!G.current)return;const Se=K.target===X.current;if(!Se&&!!K.target.closest(".nokey")||!t||!(f&&Se||r)||K.button!==0||!K.isPrimary)return;(Qe=(Pe=K.target)==null?void 0:Pe.setPointerCapture)==null||Qe.call(Pe,K.pointerId),J.current=!1;const{x:Ce,y:F}=Wt(K.nativeEvent,G.current),ye=vo({x:Ce,y:F},he);E.setState({userSelectionRect:{width:0,height:0,startX:ye.x,startY:ye.y,x:Ce,y:F}}),Se||(K.stopPropagation(),K.preventDefault())};function M(K,se){const{userSelectionRect:he}=E.getState();if(!he)return;const{transform:Se,nodeLookup:xe,edgeLookup:ge,connectionLookup:Ce,triggerNodeChanges:F,triggerEdgeChanges:ye,defaultEdgeOptions:Pe}=E.getState(),Qe={x:he.startX,y:he.startY},{x:ut,y:et}=ii(Qe,Se),tt={startX:Qe.x,startY:Qe.y,x:Kat.id)),Z.current=new Set;const Kt=(Pe==null?void 0:Pe.selectable)??!0;for(const at of te.current){const Ct=Ce.get(at);if(Ct)for(const{edgeId:yt}of Ct.values()){const Mt=ge.get(yt);Mt&&(Mt.selectable??Kt)&&Z.current.add(yt)}}if(!ch(sn,te.current)){const at=qr(xe,te.current,!0);F(at)}if(!ch(Gt,Z.current)){const at=qr(ge,Z.current);ye(at)}E.setState({userSelectionRect:tt,userSelectionActive:!0,nodesSelectionActive:!1})}function z(){if(!u||!G.current)return;const[K,se]=nc(C.current,G.current,$);b({x:K,y:se}).then(he=>{if(!J.current||!he){N.current=requestAnimationFrame(z);return}const{x:Se,y:xe}=C.current;M(Se,xe),N.current=requestAnimationFrame(z)})}const ne=()=>{cancelAnimationFrame(N.current),N.current=0,U.current=!1};Q.useEffect(()=>()=>ne(),[]);const re=K=>{const{userSelectionRect:se,transform:he,resetSelectedElements:Se}=E.getState();if(!G.current||!se)return;const{x:xe,y:ge}=Wt(K.nativeEvent,G.current);C.current={x:xe,y:ge};const Ce=ii({x:se.startX,y:se.startY},he);if(!J.current){const F=r?0:c;if(Math.hypot(xe-Ce.x,ge-Ce.y)<=F)return;Se(),h==null||h(K)}J.current=!0,U.current||(z(),U.current=!0),M(xe,ge)},ae=K=>{var se,he;if(!V){K.target===X.current&&E.getState().connection.inProgress&&(ee.current=!0);return}K.button===0&&((he=(se=K.target)==null?void 0:se.releasePointerCapture)==null||he.call(se,K.pointerId),!j&&K.target===X.current&&E.getState().userSelectionRect&&(H==null||H(K)),E.setState({userSelectionActive:!1,userSelectionRect:null}),J.current&&(p==null||p(K),E.setState({nodesSelectionActive:te.current.size>0})),ne())},fe=K=>{var se,he;(he=(se=K.target)==null?void 0:se.releasePointerCapture)==null||he.call(se,K.pointerId),ne()},ce=l===!0||Array.isArray(l)&&l.includes(0);return k.jsxs("div",{className:We(["react-flow__pane",{draggable:ce,dragging:I,selection:t}]),onClick:V?void 0:Ia(H,X),onContextMenu:Ia(B,X),onWheel:Ia(A,X),onPointerEnter:V?void 0:g,onPointerMove:V?re:w,onPointerUp:ae,onPointerCancel:V?fe:void 0,onPointerDownCapture:V?O:void 0,onClickCapture:V?R:void 0,onPointerLeave:S,ref:X,style:xl,children:[P,k.jsx(nS,{})]})}function Wa({id:t,store:r,unselect:o=!1,nodeRef:l}){const{addSelectedNodes:u,unselectNodesAndEdges:c,multiSelectionActive:f,nodeLookup:h,onError:p}=r.getState(),y=h.get(t);if(!y){p==null||p("012",Yt.error012(t));return}r.setState({nodesSelectionActive:!1}),y.selected?(o||y.selected&&f)&&(c({nodes:[y],edges:[]}),requestAnimationFrame(()=>{var m;return(m=l==null?void 0:l.current)==null?void 0:m.blur()})):u([t])}function mg({nodeRef:t,disabled:r=!1,noDragClassName:o,handleSelector:l,nodeId:u,isSelectable:c,nodeClickDistance:f}){const h=$e(),[p,y]=Q.useState(!1),m=Q.useRef();return Q.useEffect(()=>{if(!r)return m.current=bw({getStoreItems:()=>h.getState(),onNodeMouseDown:v=>{Wa({id:v,store:h,nodeRef:t})},onDragStart:()=>{y(!0)},onDragStop:()=>{y(!1)}}),()=>{var v;(v=m.current)==null||v.destroy(),m.current=void 0}},[r,h,t]),Q.useEffect(()=>{r||!t.current||!m.current||m.current.update({noDragClassName:o,handleSelector:l,domNode:t.current,isSelectable:c,nodeId:u,nodeClickDistance:f})},[o,l,r,c,t,u,f]),p}const oS=t=>r=>r.selected&&(r.draggable||t&&typeof r.draggable>"u");function yg(){const t=$e();return Q.useCallback(o=>{const{nodeExtent:l,snapToGrid:u,snapGrid:c,nodesDraggable:f,onError:h,updateNodePositions:p,nodeLookup:y,nodeOrigin:m}=t.getState(),v=new Map,g=oS(f),w=u?c[0]:5,S=u?c[1]:5,P=o.direction.x*w*o.factor,N=o.direction.y*S*o.factor;for(const[,E]of y){if(!g(E))continue;let j={x:E.internals.positionAbsolute.x+P,y:E.internals.positionAbsolute.y+N};u&&(j=yo(j,c));const{position:_,positionAbsolute:I}=$p({nodeId:E.id,nextPosition:j,nodeLookup:y,nodeExtent:l,nodeOrigin:m,onError:h});E.position=_,E.internals.positionAbsolute=I,v.set(E.id,E)}p(v)},[])}const fc=Q.createContext(null),sS=fc.Provider;fc.Consumer;const vg=()=>Q.useContext(fc),lS=t=>({connectOnClick:t.connectOnClick,noPanClassName:t.noPanClassName,rfId:t.rfId}),xg=Q.createContext(null);function uS({children:t}){const r=Te(lS,Ve);return k.jsx(xg.Provider,{value:r,children:t})}function aS(){const t=Q.useContext(xg);if(!t)throw new Error("useHandleConfig must be used within a HandleConfigProvider");return t}const cS={connectingFrom:!1,connectingTo:!1,clickConnecting:!1,isPossibleEndHandle:!0,connectionInProcess:!1,clickConnectionInProcess:!1,valid:!1},fS=(t,r,o)=>l=>{const{connectionClickStartHandle:u,connectionMode:c,connection:f}=l,{fromHandle:h,toHandle:p,isValid:y}=f;if(!h&&!u)return cS;const m=(p==null?void 0:p.nodeId)===t&&(p==null?void 0:p.id)===r&&(p==null?void 0:p.type)===o;return{connectingFrom:(h==null?void 0:h.nodeId)===t&&(h==null?void 0:h.id)===r&&(h==null?void 0:h.type)===o,connectingTo:m,clickConnecting:(u==null?void 0:u.nodeId)===t&&(u==null?void 0:u.id)===r&&(u==null?void 0:u.type)===o,isPossibleEndHandle:c===ni.Strict?(h==null?void 0:h.type)!==o:t!==(h==null?void 0:h.nodeId)||r!==(h==null?void 0:h.id),connectionInProcess:!!h,clickConnectionInProcess:!!u,valid:m&&y}};function dS({type:t="source",position:r=_e.Top,isValidConnection:o,isConnectable:l=!0,isConnectableStart:u=!0,isConnectableEnd:c=!0,id:f,onConnect:h,children:p,className:y,onMouseDown:m,onTouchStart:v,...g},w){var U,H;const S=f||null,P=t==="target",N=$e(),E=vg(),{connectOnClick:j,noPanClassName:_,rfId:I}=aS(),{connectingFrom:b,connectingTo:$,clickConnecting:V,isPossibleEndHandle:X,connectionInProcess:G,clickConnectionInProcess:te,valid:Z}=Te(fS(E,S,t),Ve);E||(H=(U=N.getState()).onError)==null||H.call(U,"010",Yt.error010());const ee=B=>{const{defaultEdgeOptions:A,onConnect:R,hasDefaultEdges:O}=N.getState(),M={...A,...B};if(O){const{edges:z,setEdges:ne,onError:re}=N.getState();ne(U1(M,z,{onError:re}))}R==null||R(M),h==null||h(M)},J=B=>{if(!E)return;const A=Wp(B.nativeEvent);if(u&&(A&&B.button===0||!A)){const R=N.getState();Ua.onPointerDown(B.nativeEvent,{handleDomNode:B.currentTarget,autoPanOnConnect:R.autoPanOnConnect,connectionMode:R.connectionMode,connectionRadius:R.connectionRadius,domNode:R.domNode,nodeLookup:R.nodeLookup,lib:R.lib,isTarget:P,handleId:S,nodeId:E,flowId:R.rfId,panBy:R.panBy,cancelConnection:R.cancelConnection,onConnectStart:R.onConnectStart,onConnectEnd:(...O)=>{var M,z;return(z=(M=N.getState()).onConnectEnd)==null?void 0:z.call(M,...O)},updateConnection:R.updateConnection,onConnect:ee,isValidConnection:o||((...O)=>{var M,z;return((z=(M=N.getState()).isValidConnection)==null?void 0:z.call(M,...O))??!0}),getTransform:()=>N.getState().transform,getFromHandle:()=>N.getState().connection.fromHandle,autoPanSpeed:R.autoPanSpeed,dragThreshold:R.connectionDragThreshold})}A?m==null||m(B):v==null||v(B)},C=B=>{const{onClickConnectStart:A,onClickConnectEnd:R,connectionClickStartHandle:O,connectionMode:M,isValidConnection:z,lib:ne,rfId:re,nodeLookup:ae,connection:fe}=N.getState();if(!E||!O&&!u)return;if(!O){A==null||A(B.nativeEvent,{nodeId:E,handleId:S,handleType:t}),N.setState({connectionClickStartHandle:{nodeId:E,type:t,id:S}});return}const ce=bp(B.target),K=o||z,{connection:se,isValid:he}=Ua.isValid(B.nativeEvent,{handle:{nodeId:E,id:S,type:t},connectionMode:M,fromNodeId:O.nodeId,fromHandleId:O.id||null,fromType:O.type,isValidConnection:K,flowId:re,doc:ce,lib:ne,nodeLookup:ae});he&&se&&ee(se);const Se=structuredClone(fe);delete Se.inProgress,Se.toPosition=Se.toHandle?Se.toHandle.position:null,R==null||R(B,Se),N.setState({connectionClickStartHandle:null})};return k.jsx("div",{"data-handleid":S,"data-nodeid":E,"data-handlepos":r,"data-id":`${I}-${E}-${S}-${t}`,className:We(["react-flow__handle",`react-flow__handle-${r}`,"nodrag",_,y,{source:!P,target:P,connectable:l,connectablestart:u,connectableend:c,clickconnecting:V,connectingfrom:b,connectingto:$,valid:Z,connectionindicator:l&&(!G||X)&&(G||te?c:u)}]),onMouseDown:J,onTouchStart:J,onClick:j?C:void 0,ref:w,...g,children:p})}const ll=Q.memo(hg(dS));function hS({data:t,isConnectable:r,sourcePosition:o=_e.Bottom}){return k.jsxs(k.Fragment,{children:[t==null?void 0:t.label,k.jsx(ll,{type:"source",position:o,isConnectable:r})]})}function pS({data:t,isConnectable:r,targetPosition:o=_e.Top,sourcePosition:l=_e.Bottom}){return k.jsxs(k.Fragment,{children:[k.jsx(ll,{type:"target",position:o,isConnectable:r}),t==null?void 0:t.label,k.jsx(ll,{type:"source",position:l,isConnectable:r})]})}function gS(){return null}function mS({data:t,isConnectable:r,targetPosition:o=_e.Top}){return k.jsxs(k.Fragment,{children:[k.jsx(ll,{type:"target",position:o,isConnectable:r}),t==null?void 0:t.label]})}const ul={ArrowUp:{x:0,y:-1},ArrowDown:{x:0,y:1},ArrowLeft:{x:-1,y:0},ArrowRight:{x:1,y:0}},Vh={input:hS,default:pS,output:mS,group:gS};function yS(t){var r,o,l,u;return t.internals.handleBounds===void 0?{width:t.width??t.initialWidth??((r=t.style)==null?void 0:r.width),height:t.height??t.initialHeight??((o=t.style)==null?void 0:o.height)}:{width:t.width??((l=t.style)==null?void 0:l.width),height:t.height??((u=t.style)==null?void 0:u.height)}}const vS=t=>{const{width:r,height:o,x:l,y:u}=mo(t.nodeLookup,{filter:c=>!!c.selected});return{width:Ut(r)?r:null,height:Ut(o)?o:null,userSelectionActive:t.userSelectionActive,transformString:`translate(${t.transform[0]}px,${t.transform[1]}px) scale(${t.transform[2]}) translate(${l}px,${u}px)`}};function xS({onSelectionContextMenu:t,noPanClassName:r,disableKeyboardA11y:o}){const l=$e(),{width:u,height:c,transformString:f,userSelectionActive:h}=Te(vS,Ve),p=yg(),y=Q.useRef(null);Q.useEffect(()=>{var w;o||(w=y.current)==null||w.focus({preventScroll:!0})},[o]);const m=!h&&u!==null&&c!==null;if(mg({nodeRef:y,disabled:!m}),!m)return null;const v=t?w=>{const S=l.getState().nodes.filter(P=>P.selected);t(w,S)}:void 0,g=w=>{Object.prototype.hasOwnProperty.call(ul,w.key)&&(w.preventDefault(),p({direction:ul[w.key],factor:w.shiftKey?4:1}))};return k.jsx("div",{className:We(["react-flow__nodesselection","react-flow__container",r]),style:{transform:f},children:k.jsx("div",{ref:y,className:"react-flow__nodesselection-rect",onContextMenu:v,tabIndex:o?void 0:-1,onKeyDown:o?void 0:g,style:{width:u,height:c}})})}const Bh=typeof window<"u"?window:void 0,wS=t=>({nodesSelectionActive:t.nodesSelectionActive,userSelectionActive:t.userSelectionActive});function wg({children:t,onPaneClick:r,onPaneMouseEnter:o,onPaneMouseMove:l,onPaneMouseLeave:u,onPaneContextMenu:c,onPaneScroll:f,paneClickDistance:h,deleteKeyCode:p,selectionKeyCode:y,selectionOnDrag:m,selectionMode:v,onSelectionStart:g,onSelectionEnd:w,multiSelectionKeyCode:S,panActivationKeyCode:P,zoomActivationKeyCode:N,elementsSelectable:E,zoomOnScroll:j,zoomOnPinch:_,panOnScroll:I,panOnScrollSpeed:b,panOnScrollMode:$,zoomOnDoubleClick:V,panOnDrag:X,autoPanOnSelection:G,defaultViewport:te,translateExtent:Z,minZoom:ee,maxZoom:J,preventScrolling:C,onSelectionContextMenu:U,noWheelClassName:H,noPanClassName:B,disableKeyboardA11y:A,onViewportChange:R,isControlledViewport:O}){const{nodesSelectionActive:M,userSelectionActive:z}=Te(wS,Ve),ne=co(y,{target:Bh}),re=co(P,{target:Bh}),ae=re||X,fe=re||I,ce=m&&ae!==!0,K=ne||z||ce;return q1({deleteKeyCode:p,multiSelectionKeyCode:S}),k.jsx(eS,{onPaneContextMenu:c,elementsSelectable:E,zoomOnScroll:j,zoomOnPinch:_,panOnScroll:fe,panActivationKeyPressed:re,panOnScrollSpeed:b,panOnScrollMode:$,zoomOnDoubleClick:V,panOnDrag:!ne&&ae,defaultViewport:te,translateExtent:Z,minZoom:ee,maxZoom:J,zoomActivationKeyCode:N,preventScrolling:C,noWheelClassName:H,noPanClassName:B,onViewportChange:R,isControlledViewport:O,paneClickDistance:h,selectionOnDrag:ce,children:k.jsxs(iS,{onSelectionStart:g,onSelectionEnd:w,onPaneClick:r,onPaneMouseEnter:o,onPaneMouseMove:l,onPaneMouseLeave:u,onPaneContextMenu:c,onPaneScroll:f,panOnDrag:ae,autoPanOnSelection:G,isSelecting:!!K,selectionMode:v,selectionKeyPressed:ne,paneClickDistance:h,selectionOnDrag:ce,children:[t,M&&k.jsx(xS,{onSelectionContextMenu:U,noPanClassName:B,disableKeyboardA11y:A})]})})}wg.displayName="FlowRenderer";const SS=Q.memo(wg),_S=t=>r=>t?tc(r.nodeLookup,{x:0,y:0,width:r.width,height:r.height},r.transform,!0).map(o=>o.id):Array.from(r.nodeLookup.keys());function ES(t){return Te(Q.useCallback(_S(t),[t]),Ve)}const kS=t=>t.updateNodeInternals;function NS(){const t=Te(kS),[r]=Q.useState(()=>typeof ResizeObserver>"u"?null:new ResizeObserver(o=>{const l=new Map;o.forEach(u=>{const c=u.target.getAttribute("data-id");l.set(c,{id:c,nodeElement:u.target,force:!0})}),t(l)}));return Q.useEffect(()=>()=>{r==null||r.disconnect()},[r]),r}function CS({node:t,nodeType:r,hasDimensions:o,resizeObserver:l}){const u=$e(),c=Q.useRef(null),f=Q.useRef(null),h=Q.useRef(t.sourcePosition),p=Q.useRef(t.targetPosition),y=Q.useRef(r),m=o&&!!t.internals.handleBounds;return Q.useEffect(()=>{c.current&&!t.hidden&&(!m||f.current!==c.current)&&(f.current&&(l==null||l.unobserve(f.current)),l==null||l.observe(c.current),f.current=c.current)},[m,t.hidden]),Q.useEffect(()=>()=>{f.current&&(l==null||l.unobserve(f.current),f.current=null)},[]),Q.useEffect(()=>{if(c.current){const v=y.current!==r,g=h.current!==t.sourcePosition,w=p.current!==t.targetPosition;(v||g||w)&&(y.current=r,h.current=t.sourcePosition,p.current=t.targetPosition,u.getState().updateNodeInternals(new Map([[t.id,{id:t.id,nodeElement:c.current,force:!0}]])))}},[t.id,r,t.sourcePosition,t.targetPosition]),c}function MS({id:t,onClick:r,onMouseEnter:o,onMouseMove:l,onMouseLeave:u,onContextMenu:c,onDoubleClick:f,nodesDraggable:h,elementsSelectable:p,nodesConnectable:y,nodesFocusable:m,resizeObserver:v,noDragClassName:g,noPanClassName:w,disableKeyboardA11y:S,rfId:P,nodeTypes:N,nodeClickDistance:E,onError:j}){const{node:_,internals:I,isParent:b}=Te(K=>{const se=K.nodeLookup.get(t),he=K.parentLookup.has(t);return{node:se,internals:se.internals,isParent:he}},Ve);let $=_.type||"default",V=(N==null?void 0:N[$])||Vh[$];V===void 0&&(j==null||j("003",Yt.error003($)),$="default",V=(N==null?void 0:N.default)||Vh.default);const X=!!(_.draggable||h&&typeof _.draggable>"u"),G=!!(_.selectable||p&&typeof _.selectable>"u"),te=!!(_.connectable||y&&typeof _.connectable>"u"),Z=!!(_.focusable||m&&typeof _.focusable>"u"),ee=$e(),J=Vp(_),C=CS({node:_,nodeType:$,hasDimensions:J,resizeObserver:v}),U=mg({nodeRef:C,disabled:_.hidden||!X,noDragClassName:g,handleSelector:_.dragHandle,nodeId:t,isSelectable:G,nodeClickDistance:E}),H=yg();if(_.hidden)return null;const B=Qt(_),A=yS(_),R=G||X||r||o||l||u,O=o?K=>o(K,{...I.userNode}):void 0,M=l?K=>l(K,{...I.userNode}):void 0,z=u?K=>u(K,{...I.userNode}):void 0,ne=c?K=>c(K,{...I.userNode}):void 0,re=f?K=>f(K,{...I.userNode}):void 0,ae=K=>{const{selectNodesOnDrag:se,nodeDragThreshold:he}=ee.getState();G&&(!se||!X||he>0)&&Wa({id:t,store:ee,nodeRef:C}),r&&r(K,{...I.userNode})},fe=K=>{if(!(Up(K.nativeEvent)||S)){if(zp.includes(K.key)&&G){const se=K.key==="Escape";Wa({id:t,store:ee,unselect:se,nodeRef:C})}else if(X&&_.selected&&Object.prototype.hasOwnProperty.call(ul,K.key)){K.preventDefault();const{ariaLabelConfig:se}=ee.getState();ee.setState({ariaLiveMessage:se["node.a11yDescription.ariaLiveMessage"]({direction:K.key.replace("Arrow","").toLowerCase(),x:~~I.positionAbsolute.x,y:~~I.positionAbsolute.y})}),H({direction:ul[K.key],factor:K.shiftKey?4:1})}}},ce=()=>{var Ce;if(S||!((Ce=C.current)!=null&&Ce.matches(":focus-visible")))return;const{transform:K,width:se,height:he,autoPanOnNodeFocus:Se,setCenter:xe}=ee.getState();if(!Se)return;tc(new Map([[t,_]]),{x:0,y:0,width:se,height:he},K,!0).length>0||xe(_.position.x+B.width/2,_.position.y+B.height/2,{zoom:K[2]})};return k.jsx("div",{className:We(["react-flow__node",`react-flow__node-${$}`,{[w]:X},_.className,{selected:_.selected,selectable:G,parent:b,draggable:X,dragging:U}]),ref:C,style:{zIndex:I.z,transform:`translate(${I.positionAbsolute.x}px,${I.positionAbsolute.y}px)`,pointerEvents:R?"all":"none",visibility:J?"visible":"hidden",..._.style,...A},"data-id":t,"data-testid":`rf__node-${t}`,onMouseEnter:O,onMouseMove:M,onMouseLeave:z,onContextMenu:ne,onClick:ae,onDoubleClick:re,onKeyDown:Z?fe:void 0,tabIndex:Z?0:void 0,onFocus:Z?ce:void 0,role:_.ariaRole??(Z?"group":void 0),"aria-roledescription":"node","aria-describedby":S?void 0:`${ag}-${P}`,"aria-label":_.ariaLabel,..._.domAttributes,children:k.jsx(sS,{value:t,children:k.jsx(V,{id:t,data:_.data,type:$,positionAbsoluteX:I.positionAbsolute.x,positionAbsoluteY:I.positionAbsolute.y,selected:_.selected??!1,selectable:G,draggable:X,deletable:_.deletable??!0,isConnectable:te,sourcePosition:_.sourcePosition,targetPosition:_.targetPosition,dragging:U,dragHandle:_.dragHandle,zIndex:I.z,parentId:_.parentId,...B})})})}var PS=Q.memo(MS);const IS=t=>({nodesConnectable:t.nodesConnectable,nodesFocusable:t.nodesFocusable,elementsSelectable:t.elementsSelectable,onError:t.onError});function Sg(t){const{nodesConnectable:r,nodesFocusable:o,elementsSelectable:l,onError:u}=Te(IS,Ve),c=ES(t.onlyRenderVisibleElements),f=NS();return k.jsx("div",{className:"react-flow__nodes",style:xl,children:c.map(h=>k.jsx(PS,{id:h,nodeTypes:t.nodeTypes,nodeExtent:t.nodeExtent,onClick:t.onNodeClick,onMouseEnter:t.onNodeMouseEnter,onMouseMove:t.onNodeMouseMove,onMouseLeave:t.onNodeMouseLeave,onContextMenu:t.onNodeContextMenu,onDoubleClick:t.onNodeDoubleClick,noDragClassName:t.noDragClassName,noPanClassName:t.noPanClassName,rfId:t.rfId,disableKeyboardA11y:t.disableKeyboardA11y,resizeObserver:f,nodesDraggable:t.nodesDraggable??!0,nodesConnectable:r,nodesFocusable:o,elementsSelectable:l,nodeClickDistance:t.nodeClickDistance,onError:u},h))})}Sg.displayName="NodeRenderer";const TS=Q.memo(Sg);function zS(t){return Te(Q.useCallback(o=>{if(!t)return o.edges.map(u=>u.id);const l=[];if(o.width&&o.height)for(const u of o.edges){const c=o.nodeLookup.get(u.source),f=o.nodeLookup.get(u.target);c&&f&&kw({sourceNode:c,targetNode:f,width:o.width,height:o.height,transform:o.transform})&&l.push(u.id)}return l},[t]),Ve)}const jS=({color:t="none",strokeWidth:r=1})=>{const o={strokeWidth:r,...t&&{stroke:t}};return k.jsx("polyline",{className:"arrow",style:o,strokeLinecap:"round",fill:"none",strokeLinejoin:"round",points:"-5,-4 0,0 -5,4"})},LS=({color:t="none",strokeWidth:r=1})=>{const o={strokeWidth:r,...t&&{stroke:t,fill:t}};return k.jsx("polyline",{className:"arrowclosed",style:o,strokeLinecap:"round",strokeLinejoin:"round",points:"-5,-4 0,0 -5,4 -5,-4"})},bh={[il.Arrow]:jS,[il.ArrowClosed]:LS};function RS(t){const r=$e();return Q.useMemo(()=>{var u,c;return Object.prototype.hasOwnProperty.call(bh,t)?bh[t]:((c=(u=r.getState()).onError)==null||c.call(u,"009",Yt.error009(t)),null)},[t])}const AS=({id:t,type:r,color:o,width:l=12.5,height:u=12.5,markerUnits:c="strokeWidth",strokeWidth:f,orient:h="auto-start-reverse"})=>{const p=RS(r);return p?k.jsx("marker",{className:"react-flow__arrowhead",id:t,markerWidth:`${l}`,markerHeight:`${u}`,viewBox:"-10 -10 20 20",markerUnits:c,orient:h,refX:"0",refY:"0",children:k.jsx(p,{color:o,strokeWidth:f})}):null},_g=({defaultColor:t,rfId:r})=>{const o=Te(c=>c.edges),l=Te(c=>c.defaultEdgeOptions),u=Q.useMemo(()=>jw(o,{id:r,defaultColor:t,defaultMarkerStart:l==null?void 0:l.markerStart,defaultMarkerEnd:l==null?void 0:l.markerEnd}),[o,l,r,t]);return u.length?k.jsx("svg",{className:"react-flow__marker","aria-hidden":"true",children:k.jsx("defs",{children:u.map(c=>k.jsx(AS,{id:c.id,type:c.type,color:c.color,width:c.width,height:c.height,markerUnits:c.markerUnits,strokeWidth:c.strokeWidth,orient:c.orient},c.id))})}):null};_g.displayName="MarkerDefinitions";var $S=Q.memo(_g);function Eg({x:t,y:r,label:o,labelStyle:l,labelShowBg:u=!0,labelBgStyle:c,labelBgPadding:f=[2,4],labelBgBorderRadius:h=2,children:p,className:y,...m}){const[v,g]=Q.useState({x:1,y:0,width:0,height:0}),w=We(["react-flow__edge-textwrapper",y]),S=Q.useRef(null);return Q.useEffect(()=>{if(S.current){const P=S.current.getBBox();g({x:P.x,y:P.y,width:P.width,height:P.height})}},[o]),o?k.jsxs("g",{transform:`translate(${t-v.width/2} ${r-v.height/2})`,className:w,visibility:v.width?"visible":"hidden",...m,children:[u&&k.jsx("rect",{width:v.width+2*f[0],x:-f[0],y:-f[1],height:v.height+2*f[1],className:"react-flow__edge-textbg",style:c,rx:h,ry:h}),k.jsx("text",{className:"react-flow__edge-text",y:v.height/2,dy:"0.3em",ref:S,style:l,children:o}),p]}):null}Eg.displayName="EdgeText";const DS=Q.memo(Eg);function wl({path:t,labelX:r,labelY:o,label:l,labelStyle:u,labelShowBg:c,labelBgStyle:f,labelBgPadding:h,labelBgBorderRadius:p,interactionWidth:y=20,...m}){return k.jsxs(k.Fragment,{children:[k.jsx("path",{...m,d:t,fill:"none",className:We(["react-flow__edge-path",m.className])}),y?k.jsx("path",{d:t,fill:"none",strokeOpacity:0,strokeWidth:y,className:"react-flow__edge-interaction"}):null,l&&Ut(r)&&Ut(o)?k.jsx(DS,{x:r,y:o,label:l,labelStyle:u,labelShowBg:c,labelBgStyle:f,labelBgPadding:h,labelBgBorderRadius:p}):null]})}function Uh({pos:t,x1:r,y1:o,x2:l,y2:u}){return t===_e.Left||t===_e.Right?[.5*(r+l),o]:[r,.5*(o+u)]}function kg({sourceX:t,sourceY:r,sourcePosition:o=_e.Bottom,targetX:l,targetY:u,targetPosition:c=_e.Top}){const[f,h]=Uh({pos:o,x1:t,y1:r,x2:l,y2:u}),[p,y]=Uh({pos:c,x1:l,y1:u,x2:t,y2:r}),[m,v,g,w]=Yp({sourceX:t,sourceY:r,targetX:l,targetY:u,sourceControlX:f,sourceControlY:h,targetControlX:p,targetControlY:y});return[`M${t},${r} C${f},${h} ${p},${y} ${l},${u}`,m,v,g,w]}function Ng(t){return Q.memo(({id:r,sourceX:o,sourceY:l,targetX:u,targetY:c,sourcePosition:f,targetPosition:h,label:p,labelStyle:y,labelShowBg:m,labelBgStyle:v,labelBgPadding:g,labelBgBorderRadius:w,style:S,markerEnd:P,markerStart:N,interactionWidth:E})=>{const[j,_,I]=kg({sourceX:o,sourceY:l,sourcePosition:f,targetX:u,targetY:c,targetPosition:h}),b=t.isInternal?void 0:r;return k.jsx(wl,{id:b,path:j,labelX:_,labelY:I,label:p,labelStyle:y,labelShowBg:m,labelBgStyle:v,labelBgPadding:g,labelBgBorderRadius:w,style:S,markerEnd:P,markerStart:N,interactionWidth:E})})}const OS=Ng({isInternal:!1}),Cg=Ng({isInternal:!0});OS.displayName="SimpleBezierEdge";Cg.displayName="SimpleBezierEdgeInternal";function Mg(t){return Q.memo(({id:r,sourceX:o,sourceY:l,targetX:u,targetY:c,label:f,labelStyle:h,labelShowBg:p,labelBgStyle:y,labelBgPadding:m,labelBgBorderRadius:v,style:g,sourcePosition:w=_e.Bottom,targetPosition:S=_e.Top,markerEnd:P,markerStart:N,pathOptions:E,interactionWidth:j})=>{const[_,I,b]=Va({sourceX:o,sourceY:l,sourcePosition:w,targetX:u,targetY:c,targetPosition:S,borderRadius:E==null?void 0:E.borderRadius,offset:E==null?void 0:E.offset,stepPosition:E==null?void 0:E.stepPosition}),$=t.isInternal?void 0:r;return k.jsx(wl,{id:$,path:_,labelX:I,labelY:b,label:f,labelStyle:h,labelShowBg:p,labelBgStyle:y,labelBgPadding:m,labelBgBorderRadius:v,style:g,markerEnd:P,markerStart:N,interactionWidth:j})})}const Pg=Mg({isInternal:!1}),Ig=Mg({isInternal:!0});Pg.displayName="SmoothStepEdge";Ig.displayName="SmoothStepEdgeInternal";function Tg(t){return Q.memo(({id:r,...o})=>{var u;const l=t.isInternal?void 0:r;return k.jsx(Pg,{...o,id:l,pathOptions:Q.useMemo(()=>{var c;return{borderRadius:0,offset:(c=o.pathOptions)==null?void 0:c.offset}},[(u=o.pathOptions)==null?void 0:u.offset])})})}const FS=Tg({isInternal:!1}),zg=Tg({isInternal:!0});FS.displayName="StepEdge";zg.displayName="StepEdgeInternal";function jg(t){return Q.memo(({id:r,sourceX:o,sourceY:l,targetX:u,targetY:c,label:f,labelStyle:h,labelShowBg:p,labelBgStyle:y,labelBgPadding:m,labelBgBorderRadius:v,style:g,markerEnd:w,markerStart:S,interactionWidth:P})=>{const[N,E,j]=Gp({sourceX:o,sourceY:l,targetX:u,targetY:c}),_=t.isInternal?void 0:r;return k.jsx(wl,{id:_,path:N,labelX:E,labelY:j,label:f,labelStyle:h,labelShowBg:p,labelBgStyle:y,labelBgPadding:m,labelBgBorderRadius:v,style:g,markerEnd:w,markerStart:S,interactionWidth:P})})}const HS=jg({isInternal:!1}),Lg=jg({isInternal:!0});HS.displayName="StraightEdge";Lg.displayName="StraightEdgeInternal";function Rg(t){return Q.memo(({id:r,sourceX:o,sourceY:l,targetX:u,targetY:c,sourcePosition:f=_e.Bottom,targetPosition:h=_e.Top,label:p,labelStyle:y,labelShowBg:m,labelBgStyle:v,labelBgPadding:g,labelBgBorderRadius:w,style:S,markerEnd:P,markerStart:N,pathOptions:E,interactionWidth:j})=>{const[_,I,b]=Xp({sourceX:o,sourceY:l,sourcePosition:f,targetX:u,targetY:c,targetPosition:h,curvature:E==null?void 0:E.curvature}),$=t.isInternal?void 0:r;return k.jsx(wl,{id:$,path:_,labelX:I,labelY:b,label:p,labelStyle:y,labelShowBg:m,labelBgStyle:v,labelBgPadding:g,labelBgBorderRadius:w,style:S,markerEnd:P,markerStart:N,interactionWidth:j})})}const VS=Rg({isInternal:!1}),Ag=Rg({isInternal:!0});VS.displayName="BezierEdge";Ag.displayName="BezierEdgeInternal";const Wh={default:Ag,straight:Lg,step:zg,smoothstep:Ig,simplebezier:Cg},Yh={sourceX:null,sourceY:null,targetX:null,targetY:null,sourcePosition:null,targetPosition:null,zIndex:void 0},BS=(t,r,o)=>o===_e.Left?t-r:o===_e.Right?t+r:t,bS=(t,r,o)=>o===_e.Top?t-r:o===_e.Bottom?t+r:t,Xh="react-flow__edgeupdater";function Qh({position:t,centerX:r,centerY:o,radius:l=10,onMouseDown:u,onMouseEnter:c,onMouseOut:f,type:h}){return k.jsx("circle",{onMouseDown:u,onMouseEnter:c,onMouseOut:f,className:We([Xh,`${Xh}-${h}`]),cx:BS(r,l,t),cy:bS(o,l,t),r:l,stroke:"transparent",fill:"transparent"})}function US({isReconnectable:t,reconnectRadius:r,edge:o,sourceX:l,sourceY:u,targetX:c,targetY:f,sourcePosition:h,targetPosition:p,onReconnect:y,onReconnectStart:m,onReconnectEnd:v,setReconnecting:g,setUpdateHover:w}){const S=$e(),P=(I,b)=>{if(I.button!==0)return;const{autoPanOnConnect:$,domNode:V,connectionMode:X,connectionRadius:G,lib:te,onConnectStart:Z,cancelConnection:ee,nodeLookup:J,rfId:C,panBy:U,updateConnection:H}=S.getState(),B=b.type==="target",A=(M,z)=>{g(!1),v==null||v(M,o,b.type,z)},R=M=>y==null?void 0:y(o,M),O=(M,z)=>{g(!0),m==null||m(I,o,b.type),Z==null||Z(M,z)};Ua.onPointerDown(I.nativeEvent,{autoPanOnConnect:$,connectionMode:X,connectionRadius:G,domNode:V,handleId:b.id,nodeId:b.nodeId,nodeLookup:J,isTarget:B,edgeUpdaterType:b.type,lib:te,flowId:C,cancelConnection:ee,panBy:U,isValidConnection:(...M)=>{var z,ne;return((ne=(z=S.getState()).isValidConnection)==null?void 0:ne.call(z,...M))??!0},onConnect:R,onConnectStart:O,onConnectEnd:(...M)=>{var z,ne;return(ne=(z=S.getState()).onConnectEnd)==null?void 0:ne.call(z,...M)},onReconnectEnd:A,updateConnection:H,getTransform:()=>S.getState().transform,getFromHandle:()=>S.getState().connection.fromHandle,dragThreshold:S.getState().connectionDragThreshold,handleDomNode:I.currentTarget})},N=I=>P(I,{nodeId:o.target,id:o.targetHandle??null,type:"target"}),E=I=>P(I,{nodeId:o.source,id:o.sourceHandle??null,type:"source"}),j=()=>w(!0),_=()=>w(!1);return k.jsxs(k.Fragment,{children:[(t===!0||t==="source")&&k.jsx(Qh,{position:h,centerX:l,centerY:u,radius:r,onMouseDown:N,onMouseEnter:j,onMouseOut:_,type:"source"}),(t===!0||t==="target")&&k.jsx(Qh,{position:p,centerX:c,centerY:f,radius:r,onMouseDown:E,onMouseEnter:j,onMouseOut:_,type:"target"})]})}function WS({id:t,edgesFocusable:r,edgesReconnectable:o,elementsSelectable:l,onClick:u,onDoubleClick:c,onContextMenu:f,onMouseEnter:h,onMouseMove:p,onMouseLeave:y,reconnectRadius:m,onReconnect:v,onReconnectStart:g,onReconnectEnd:w,rfId:S,edgeTypes:P,noPanClassName:N,onError:E,disableKeyboardA11y:j}){let _=Te(xe=>xe.edgeLookup.get(t));const I=Te(xe=>xe.defaultEdgeOptions);_=I?{...I,..._}:_;let b=_.type||"default",$=(P==null?void 0:P[b])||Wh[b];$===void 0&&(E==null||E("011",Yt.error011(b)),b="default",$=(P==null?void 0:P.default)||Wh.default);const V=!!(_.focusable||r&&typeof _.focusable>"u"),X=typeof v<"u"&&(_.reconnectable||o&&typeof _.reconnectable>"u"),G=!!(_.selectable||l&&typeof _.selectable>"u"),te=Q.useRef(null),[Z,ee]=Q.useState(!1),[J,C]=Q.useState(!1),U=$e(),{zIndex:H=_.zIndex,sourceX:B,sourceY:A,targetX:R,targetY:O,sourcePosition:M,targetPosition:z}=Te(Q.useCallback(xe=>{const ge=xe.nodeLookup.get(_.source),Ce=xe.nodeLookup.get(_.target);if(!ge||!Ce)return Yh;const F=zw({id:t,sourceNode:ge,targetNode:Ce,sourceHandle:_.sourceHandle||null,targetHandle:_.targetHandle||null,connectionMode:xe.connectionMode,onError:E}),ye=Ew({selected:_.selected,zIndex:_.zIndex,sourceNode:ge,targetNode:Ce,elevateOnSelect:xe.elevateEdgesOnSelect,zIndexMode:xe.zIndexMode});return{...F||Yh,zIndex:ye}},[_.source,_.target,_.sourceHandle,_.targetHandle,_.selected,_.zIndex,E]),Ve),ne=Q.useMemo(()=>_.markerStart?`url('#${Ba(_.markerStart,S)}')`:void 0,[_.markerStart,S]),re=Q.useMemo(()=>_.markerEnd?`url('#${Ba(_.markerEnd,S)}')`:void 0,[_.markerEnd,S]);if(_.hidden||B===null||A===null||R===null||O===null)return null;const ae=xe=>{var ye;const{addSelectedEdges:ge,unselectNodesAndEdges:Ce,multiSelectionActive:F}=U.getState();G&&(U.setState({nodesSelectionActive:!1}),_.selected&&F?(Ce({nodes:[],edges:[_]}),(ye=te.current)==null||ye.blur()):ge([t])),u&&u(xe,_)},fe=c?xe=>{c(xe,{..._})}:void 0,ce=f?xe=>{f(xe,{..._})}:void 0,K=h?xe=>{h(xe,{..._})}:void 0,se=p?xe=>{p(xe,{..._})}:void 0,he=y?xe=>{y(xe,{..._})}:void 0,Se=xe=>{var ge;if(!j&&zp.includes(xe.key)&&G){const{unselectNodesAndEdges:Ce,addSelectedEdges:F}=U.getState();xe.key==="Escape"?((ge=te.current)==null||ge.blur(),Ce({edges:[_]})):F([t])}};return k.jsx("svg",{style:{zIndex:H},children:k.jsxs("g",{className:We(["react-flow__edge",`react-flow__edge-${b}`,_.className,N,{selected:_.selected,animated:_.animated,inactive:!G&&!u,updating:Z,selectable:G}]),onClick:ae,onDoubleClick:fe,onContextMenu:ce,onMouseEnter:K,onMouseMove:se,onMouseLeave:he,onKeyDown:V?Se:void 0,tabIndex:V?0:void 0,role:_.ariaRole??(V?"group":"img"),"aria-roledescription":"edge","data-id":t,"data-testid":`rf__edge-${t}`,"aria-label":_.ariaLabel===null?void 0:_.ariaLabel||`Edge from ${_.source} to ${_.target}`,"aria-describedby":V?`${cg}-${S}`:void 0,ref:te,..._.domAttributes,children:[!J&&k.jsx($,{id:t,source:_.source,target:_.target,type:_.type,selected:_.selected,animated:_.animated,selectable:G,deletable:_.deletable??!0,label:_.label,labelStyle:_.labelStyle,labelShowBg:_.labelShowBg,labelBgStyle:_.labelBgStyle,labelBgPadding:_.labelBgPadding,labelBgBorderRadius:_.labelBgBorderRadius,sourceX:B,sourceY:A,targetX:R,targetY:O,sourcePosition:M,targetPosition:z,data:_.data,style:_.style,sourceHandleId:_.sourceHandle,targetHandleId:_.targetHandle,markerStart:ne,markerEnd:re,pathOptions:"pathOptions"in _?_.pathOptions:void 0,interactionWidth:_.interactionWidth}),X&&k.jsx(US,{edge:_,isReconnectable:X,reconnectRadius:m,onReconnect:v,onReconnectStart:g,onReconnectEnd:w,sourceX:B,sourceY:A,targetX:R,targetY:O,sourcePosition:M,targetPosition:z,setUpdateHover:ee,setReconnecting:C})]})})}var YS=Q.memo(WS);const XS=t=>({edgesFocusable:t.edgesFocusable,edgesReconnectable:t.edgesReconnectable,elementsSelectable:t.elementsSelectable,connectionMode:t.connectionMode,onError:t.onError});function $g({defaultMarkerColor:t,onlyRenderVisibleElements:r,rfId:o,edgeTypes:l,noPanClassName:u,onReconnect:c,onEdgeContextMenu:f,onEdgeMouseEnter:h,onEdgeMouseMove:p,onEdgeMouseLeave:y,onEdgeClick:m,reconnectRadius:v,onEdgeDoubleClick:g,onReconnectStart:w,onReconnectEnd:S,disableKeyboardA11y:P}){const{edgesFocusable:N,edgesReconnectable:E,elementsSelectable:j,onError:_}=Te(XS,Ve),I=zS(r);return k.jsxs("div",{className:"react-flow__edges",children:[k.jsx($S,{defaultColor:t,rfId:o}),I.map(b=>k.jsx(YS,{id:b,edgesFocusable:N,edgesReconnectable:E,elementsSelectable:j,noPanClassName:u,onReconnect:c,onContextMenu:f,onMouseEnter:h,onMouseMove:p,onMouseLeave:y,onClick:m,reconnectRadius:v,onDoubleClick:g,onReconnectStart:w,onReconnectEnd:S,rfId:o,onError:_,edgeTypes:l,disableKeyboardA11y:P},b))]})}$g.displayName="EdgeRenderer";const QS=Q.memo($g),Gh=t=>`translate(${t[0]}px,${t[1]}px) scale(${t[2]})`;function GS({children:t}){const r=$e(),o=Q.useRef(null),[l]=Q.useState(()=>r.getState().transform);return pg(()=>{let u=null;const c=()=>{const f=r.getState().transform;u&&f[0]===u[0]&&f[1]===u[1]&&f[2]===u[2]||(u=f,o.current&&(o.current.style.transform=Gh(f)))};return c(),r.subscribe(c)},[r]),k.jsx("div",{ref:o,className:"react-flow__viewport xyflow__viewport react-flow__container",style:{transform:Gh(l)},children:t})}function KS(t){const r=cc(),o=Q.useRef(!1);Q.useEffect(()=>{!o.current&&r.viewportInitialized&&t&&(setTimeout(()=>t(r),1),o.current=!0)},[t,r.viewportInitialized])}const qS=t=>{var r;return(r=t.panZoom)==null?void 0:r.syncViewport};function ZS(t){const r=Te(qS),o=$e();return Q.useEffect(()=>{t&&(r==null||r(t),o.setState({transform:[t.x,t.y,t.zoom]}))},[t,r]),null}function JS(t){return t.connection.inProgress?{...t.connection,to:vo(t.connection.to,t.transform)}:{...t.connection}}function e_(t){return JS}function t_(t){const r=e_();return Te(r,Ve)}const n_=t=>({nodesConnectable:t.nodesConnectable,isValid:t.connection.isValid,inProgress:t.connection.inProgress,width:t.width,height:t.height});function r_({containerStyle:t,style:r,type:o,component:l}){const{nodesConnectable:u,width:c,height:f,isValid:h,inProgress:p}=Te(n_,Ve);return!(c&&u&&p)?null:k.jsx("svg",{style:t,width:c,height:f,className:"react-flow__connectionline react-flow__container",children:k.jsx("g",{className:We(["react-flow__connection",Rp(h)]),children:k.jsx(Dg,{style:r,type:o,CustomComponent:l,isValid:h})})})}const Dg=({style:t,type:r=Un.Bezier,CustomComponent:o,isValid:l})=>{const{inProgress:u,from:c,fromNode:f,fromHandle:h,fromPosition:p,to:y,toNode:m,toHandle:v,toPosition:g,pointer:w}=t_();if(!u)return;if(o)return k.jsx(o,{connectionLineType:r,connectionLineStyle:t,fromNode:f,fromHandle:h,fromX:c.x,fromY:c.y,toX:y.x,toY:y.y,fromPosition:p,toPosition:g,connectionStatus:Rp(l),toNode:m,toHandle:v,pointer:w});let S="";const P={sourceX:c.x,sourceY:c.y,sourcePosition:p,targetX:y.x,targetY:y.y,targetPosition:g};switch(r){case Un.Bezier:[S]=Xp(P);break;case Un.SimpleBezier:[S]=kg(P);break;case Un.Step:[S]=Va({...P,borderRadius:0});break;case Un.SmoothStep:[S]=Va(P);break;default:[S]=Gp(P)}return k.jsx("path",{d:S,fill:"none",className:"react-flow__connection-path",style:t})};Dg.displayName="ConnectionLine";const i_={};function Kh(t=i_){Q.useRef(t),$e(),Q.useEffect(()=>{},[t])}function o_(){$e(),Q.useRef(!1),Q.useEffect(()=>{},[])}function Og({nodeTypes:t,edgeTypes:r,onInit:o,onNodeClick:l,onEdgeClick:u,onNodeDoubleClick:c,onEdgeDoubleClick:f,onNodeMouseEnter:h,onNodeMouseMove:p,onNodeMouseLeave:y,onNodeContextMenu:m,onSelectionContextMenu:v,onSelectionStart:g,onSelectionEnd:w,connectionLineType:S,connectionLineStyle:P,connectionLineComponent:N,connectionLineContainerStyle:E,selectionKeyCode:j,selectionOnDrag:_,selectionMode:I,multiSelectionKeyCode:b,panActivationKeyCode:$,zoomActivationKeyCode:V,deleteKeyCode:X,onlyRenderVisibleElements:G,elementsSelectable:te,defaultViewport:Z,translateExtent:ee,minZoom:J,maxZoom:C,preventScrolling:U,defaultMarkerColor:H,zoomOnScroll:B,zoomOnPinch:A,panOnScroll:R,panOnScrollSpeed:O,panOnScrollMode:M,zoomOnDoubleClick:z,panOnDrag:ne,autoPanOnSelection:re,onPaneClick:ae,onPaneMouseEnter:fe,onPaneMouseMove:ce,onPaneMouseLeave:K,onPaneScroll:se,onPaneContextMenu:he,paneClickDistance:Se,nodeClickDistance:xe,onEdgeContextMenu:ge,onEdgeMouseEnter:Ce,onEdgeMouseMove:F,onEdgeMouseLeave:ye,reconnectRadius:Pe,onReconnect:Qe,onReconnectStart:ut,onReconnectEnd:et,noDragClassName:tt,noWheelClassName:sn,noPanClassName:Gt,disableKeyboardA11y:Kt,nodeExtent:at,rfId:Ct,viewport:yt,onViewportChange:Mt,nodesDraggable:wr}){return Kh(t),Kh(r),o_(),KS(o),ZS(yt),k.jsx(SS,{onPaneClick:ae,onPaneMouseEnter:fe,onPaneMouseMove:ce,onPaneMouseLeave:K,onPaneContextMenu:he,onPaneScroll:se,paneClickDistance:Se,deleteKeyCode:X,selectionKeyCode:j,selectionOnDrag:_,selectionMode:I,onSelectionStart:g,onSelectionEnd:w,multiSelectionKeyCode:b,panActivationKeyCode:$,zoomActivationKeyCode:V,elementsSelectable:te,zoomOnScroll:B,zoomOnPinch:A,zoomOnDoubleClick:z,panOnScroll:R,panOnScrollSpeed:O,panOnScrollMode:M,panOnDrag:ne,autoPanOnSelection:re,defaultViewport:Z,translateExtent:ee,minZoom:J,maxZoom:C,onSelectionContextMenu:v,preventScrolling:U,noDragClassName:tt,noWheelClassName:sn,noPanClassName:Gt,disableKeyboardA11y:Kt,onViewportChange:Mt,isControlledViewport:!!yt,children:k.jsxs(GS,{children:[k.jsx(QS,{edgeTypes:r,onEdgeClick:u,onEdgeDoubleClick:f,onReconnect:Qe,onReconnectStart:ut,onReconnectEnd:et,onlyRenderVisibleElements:G,onEdgeContextMenu:ge,onEdgeMouseEnter:Ce,onEdgeMouseMove:F,onEdgeMouseLeave:ye,reconnectRadius:Pe,defaultMarkerColor:H,noPanClassName:Gt,disableKeyboardA11y:Kt,rfId:Ct}),k.jsx(r_,{style:P,type:S,component:N,containerStyle:E}),k.jsx("div",{className:"react-flow__edgelabel-renderer"}),k.jsx(TS,{nodeTypes:t,onNodeClick:l,onNodeDoubleClick:c,onNodeMouseEnter:h,onNodeMouseMove:p,onNodeMouseLeave:y,onNodeContextMenu:m,nodeClickDistance:xe,onlyRenderVisibleElements:G,noPanClassName:Gt,noDragClassName:tt,disableKeyboardA11y:Kt,nodeExtent:at,rfId:Ct,nodesDraggable:wr}),k.jsx("div",{className:"react-flow__viewport-portal"})]})})}Og.displayName="GraphView";const s_=Q.memo(Og),l_=Hp(),qh=({nodes:t,edges:r,defaultNodes:o,defaultEdges:l,width:u,height:c,fitView:f,fitViewOptions:h,minZoom:p=.5,maxZoom:y=2,nodeOrigin:m,nodeExtent:v,zIndexMode:g="basic"}={})=>{const w=new Map,S=new Map,P=new Map,N=new Map,E=l??r??[],j=o??t??[],_=m??[0,0],I=v??so;Zp(P,N,E);const{nodesInitialized:b}=ba(j,w,S,{nodeOrigin:_,nodeExtent:I,zIndexMode:g});let $=[0,0,1];if(f&&u&&c){const V=mo(w,{filter:Z=>!!((Z.width||Z.initialWidth)&&(Z.height||Z.initialHeight))}),{x:X,y:G,zoom:te}=rc(V,u,c,p,y,(h==null?void 0:h.padding)??.1);$=[X,G,te]}return{rfId:"1",width:u??0,height:c??0,transform:$,nodes:j,nodesInitialized:b,nodeLookup:w,parentLookup:S,edges:E,edgeLookup:N,connectionLookup:P,onNodesChange:null,onEdgesChange:null,hasDefaultNodes:o!==void 0,hasDefaultEdges:l!==void 0,panZoom:null,minZoom:p,maxZoom:y,translateExtent:so,nodeExtent:I,nodesSelectionActive:!1,userSelectionActive:!1,userSelectionRect:null,connectionMode:ni.Strict,domNode:null,paneDragging:!1,noPanClassName:"nopan",nodeOrigin:_,nodeDragThreshold:1,connectionDragThreshold:1,snapGrid:[15,15],snapToGrid:!1,nodesDraggable:!0,nodesConnectable:!0,nodesFocusable:!0,edgesFocusable:!0,edgesReconnectable:!0,elementsSelectable:!0,elevateNodesOnSelect:!0,elevateEdgesOnSelect:!0,selectNodesOnDrag:!0,multiSelectionActive:!1,fitViewQueued:f??!1,fitViewOptions:h,fitViewResolver:null,connection:{...Lp},connectionClickStartHandle:null,connectOnClick:!0,ariaLiveMessage:"",autoPanOnConnect:!0,autoPanOnNodeDrag:!0,autoPanOnNodeFocus:!0,autoPanSpeed:15,connectionRadius:20,onError:l_,isValidConnection:void 0,onSelectionChangeHandlers:[],lib:"react",debug:!1,ariaLabelConfig:jp,zIndexMode:g,onNodesChangeMiddlewareMap:new Map,onEdgesChangeMiddlewareMap:new Map}},u_=({nodes:t,edges:r,defaultNodes:o,defaultEdges:l,width:u,height:c,fitView:f,fitViewOptions:h,minZoom:p,maxZoom:y,nodeOrigin:m,nodeExtent:v,zIndexMode:g})=>w1((w,S)=>{async function P(){const{nodeLookup:N,panZoom:E,fitViewOptions:j,fitViewResolver:_,width:I,height:b,minZoom:$,maxZoom:V}=S();E&&(await mw({nodes:N,width:I,height:b,panZoom:E,minZoom:$,maxZoom:V},j),_==null||_.resolve(!0),w({fitViewResolver:null}))}return{...qh({nodes:t,edges:r,width:u,height:c,fitView:f,fitViewOptions:h,minZoom:p,maxZoom:y,nodeOrigin:m,nodeExtent:v,defaultNodes:o,defaultEdges:l,zIndexMode:g}),setNodes:N=>{const{nodeLookup:E,parentLookup:j,nodeOrigin:_,nodeExtent:I,elevateNodesOnSelect:b,fitViewQueued:$,zIndexMode:V,nodesSelectionActive:X}=S(),{nodesInitialized:G,hasSelectedNodes:te}=ba(N,E,j,{nodeOrigin:_,nodeExtent:I,elevateNodesOnSelect:b,checkEquality:!0,zIndexMode:V}),Z=X&&te;$&&G?(P(),w({nodes:N,nodesInitialized:G,fitViewQueued:!1,fitViewOptions:void 0,nodesSelectionActive:Z})):w({nodes:N,nodesInitialized:G,nodesSelectionActive:Z})},setEdges:N=>{const{connectionLookup:E,edgeLookup:j}=S();Zp(E,j,N),w({edges:N})},setDefaultNodesAndEdges:(N,E)=>{if(N){const{setNodes:j}=S();j(N),w({hasDefaultNodes:!0})}if(E){const{setEdges:j}=S();j(E),w({hasDefaultEdges:!0})}},updateNodeInternals:N=>{const{triggerNodeChanges:E,nodeLookup:j,parentLookup:_,domNode:I,nodeOrigin:b,nodeExtent:$,debug:V,fitViewQueued:X,zIndexMode:G}=S(),{changes:te,updatedInternals:Z}=Fw(N,j,_,I,b,$,G);Z&&(Aw(j,_,{nodeOrigin:b,nodeExtent:$,zIndexMode:G}),X?(P(),w({fitViewQueued:!1,fitViewOptions:void 0})):w({}),(te==null?void 0:te.length)>0&&(V&&console.log("React Flow: trigger node changes",te),E==null||E(te)))},updateNodePositions:(N,E=!1)=>{const j=[];let _=[];const{nodeLookup:I,triggerNodeChanges:b,connection:$,updateConnection:V,onNodesChangeMiddlewareMap:X}=S();for(const[G,te]of N){const Z=I.get(G),ee=!!(Z!=null&&Z.expandParent&&(Z!=null&&Z.parentId)&&(te!=null&&te.position)),J={id:G,type:"position",position:ee?{x:Math.max(0,te.position.x),y:Math.max(0,te.position.y)}:te.position,dragging:E};if(Z&&$.inProgress&&$.fromNode.id===Z.id){const C=xr(Z,$.fromHandle,_e.Left,!0);V({...$,from:C})}ee&&Z.parentId&&j.push({id:G,parentId:Z.parentId,rect:{...te.internals.positionAbsolute,width:te.measured.width??0,height:te.measured.height??0}}),_.push(J)}if(j.length>0){const{parentLookup:G,nodeOrigin:te}=S(),Z=ac(j,I,G,te);_.push(...Z)}for(const G of X.values())_=G(_);b(_)},triggerNodeChanges:N=>{const{onNodesChange:E,setNodes:j,nodes:_,hasDefaultNodes:I,debug:b}=S();if(N!=null&&N.length){if(I){const $=V1(N,_);j($)}b&&console.log("React Flow: trigger node changes",N),E==null||E(N)}},triggerEdgeChanges:N=>{const{onEdgesChange:E,setEdges:j,edges:_,hasDefaultEdges:I,debug:b}=S();if(N!=null&&N.length){if(I){const $=B1(N,_);j($)}b&&console.log("React Flow: trigger edge changes",N),E==null||E(N)}},addSelectedNodes:N=>{const{multiSelectionActive:E,edgeLookup:j,nodeLookup:_,triggerNodeChanges:I,triggerEdgeChanges:b}=S();if(E){const $=N.map(V=>fr(V,!0));I($);return}I(qr(_,new Set([...N]),!0)),b(qr(j))},addSelectedEdges:N=>{const{multiSelectionActive:E,edgeLookup:j,nodeLookup:_,triggerNodeChanges:I,triggerEdgeChanges:b}=S();if(E){const $=N.map(V=>fr(V,!0));b($);return}b(qr(j,new Set([...N]))),I(qr(_,new Set,!0))},unselectNodesAndEdges:({nodes:N,edges:E}={})=>{const{edges:j,nodes:_,nodeLookup:I,triggerNodeChanges:b,triggerEdgeChanges:$}=S(),V=N||_,X=E||j,G=[];for(const Z of V){if(!Z.selected)continue;const ee=I.get(Z.id);ee&&(ee.selected=!1),G.push(fr(Z.id,!1))}const te=[];for(const Z of X)Z.selected&&te.push(fr(Z.id,!1));b(G),$(te)},setMinZoom:N=>{const{panZoom:E,maxZoom:j}=S();E==null||E.setScaleExtent([N,j]),w({minZoom:N})},setMaxZoom:N=>{const{panZoom:E,minZoom:j}=S();E==null||E.setScaleExtent([j,N]),w({maxZoom:N})},setTranslateExtent:N=>{var E;(E=S().panZoom)==null||E.setTranslateExtent(N),w({translateExtent:N})},resetSelectedElements:()=>{const{edges:N,nodes:E,triggerNodeChanges:j,triggerEdgeChanges:_,elementsSelectable:I}=S();if(!I)return;const b=E.reduce((V,X)=>X.selected?[...V,fr(X.id,!1)]:V,[]),$=N.reduce((V,X)=>X.selected?[...V,fr(X.id,!1)]:V,[]);j(b),_($)},setNodeExtent:N=>{const{nodes:E,nodeLookup:j,parentLookup:_,nodeOrigin:I,elevateNodesOnSelect:b,nodeExtent:$,zIndexMode:V}=S();N[0][0]===$[0][0]&&N[0][1]===$[0][1]&&N[1][0]===$[1][0]&&N[1][1]===$[1][1]||(ba(E,j,_,{nodeOrigin:I,nodeExtent:N,elevateNodesOnSelect:b,checkEquality:!1,zIndexMode:V}),w({nodeExtent:N}))},panBy:N=>{const{transform:E,width:j,height:_,panZoom:I,translateExtent:b}=S();return Hw({delta:N,panZoom:I,transform:E,translateExtent:b,width:j,height:_})},setCenter:async(N,E,j)=>{const{width:_,height:I,maxZoom:b,panZoom:$}=S();if(!$)return!1;const V=typeof(j==null?void 0:j.zoom)<"u"?j.zoom:b;return await $.setViewport({x:_/2-N*V,y:I/2-E*V,zoom:V},{duration:j==null?void 0:j.duration,ease:j==null?void 0:j.ease,interpolate:j==null?void 0:j.interpolate}),!0},cancelConnection:()=>{w({connection:{...Lp}})},updateConnection:N=>{w({connection:N})},reset:()=>w({...qh()})}},Object.is);function Fg({initialNodes:t,initialEdges:r,defaultNodes:o,defaultEdges:l,initialWidth:u,initialHeight:c,initialMinZoom:f,initialMaxZoom:h,initialFitViewOptions:p,fitView:y,nodeOrigin:m,nodeExtent:v,zIndexMode:g,children:w}){const[S]=Q.useState(()=>u_({nodes:t,edges:r,defaultNodes:o,defaultEdges:l,width:u,height:c,fitView:y,minZoom:f,maxZoom:h,fitViewOptions:p,nodeOrigin:m,nodeExtent:v,zIndexMode:g}));return k.jsx(S1,{value:S,children:k.jsx(X1,{children:k.jsx(uS,{children:w})})})}function a_({children:t,nodes:r,edges:o,defaultNodes:l,defaultEdges:u,width:c,height:f,fitView:h,fitViewOptions:p,minZoom:y,maxZoom:m,nodeOrigin:v,nodeExtent:g,zIndexMode:w}){return Q.useContext(yl)?k.jsx(k.Fragment,{children:t}):k.jsx(Fg,{initialNodes:r,initialEdges:o,defaultNodes:l,defaultEdges:u,initialWidth:c,initialHeight:f,fitView:h,initialFitViewOptions:p,initialMinZoom:y,initialMaxZoom:m,nodeOrigin:v,nodeExtent:g,zIndexMode:w,children:t})}const c_={width:"100%",height:"100%",overflow:"hidden",position:"relative",zIndex:0};function f_({nodes:t,edges:r,defaultNodes:o,defaultEdges:l,className:u,nodeTypes:c,edgeTypes:f,onNodeClick:h,onEdgeClick:p,onInit:y,onMove:m,onMoveStart:v,onMoveEnd:g,onConnect:w,onConnectStart:S,onConnectEnd:P,onClickConnectStart:N,onClickConnectEnd:E,onNodeMouseEnter:j,onNodeMouseMove:_,onNodeMouseLeave:I,onNodeContextMenu:b,onNodeDoubleClick:$,onNodeDragStart:V,onNodeDrag:X,onNodeDragStop:G,onNodesDelete:te,onEdgesDelete:Z,onDelete:ee,onSelectionChange:J,onSelectionDragStart:C,onSelectionDrag:U,onSelectionDragStop:H,onSelectionContextMenu:B,onSelectionStart:A,onSelectionEnd:R,onBeforeDelete:O,connectionMode:M,connectionLineType:z=Un.Bezier,connectionLineStyle:ne,connectionLineComponent:re,connectionLineContainerStyle:ae,deleteKeyCode:fe="Backspace",selectionKeyCode:ce="Shift",selectionOnDrag:K=!1,selectionMode:se=lo.Full,panActivationKeyCode:he="Space",multiSelectionKeyCode:Se=ao()?"Meta":"Control",zoomActivationKeyCode:xe=ao()?"Meta":"Control",snapToGrid:ge,snapGrid:Ce,onlyRenderVisibleElements:F=!1,selectNodesOnDrag:ye,nodesDraggable:Pe,autoPanOnNodeFocus:Qe,nodesConnectable:ut,nodesFocusable:et,nodeOrigin:tt=fg,edgesFocusable:sn,edgesReconnectable:Gt,elementsSelectable:Kt=!0,defaultViewport:at=R1,minZoom:Ct=.5,maxZoom:yt=2,translateExtent:Mt=so,preventScrolling:wr=!0,nodeExtent:ln,defaultMarkerColor:Yn="#b1b1b7",zoomOnScroll:Sl=!0,zoomOnPinch:xo=!0,panOnScroll:wo=!1,panOnScrollSpeed:_l=.5,panOnScrollMode:si=pr.Free,zoomOnDoubleClick:li=!0,panOnDrag:ui=!0,onPaneClick:ai,onPaneMouseEnter:ci,onPaneMouseMove:wn,onPaneMouseLeave:Sn,onPaneScroll:So,onPaneContextMenu:_o,paneClickDistance:Eo=1,nodeClickDistance:ko=0,children:No,onReconnect:fi,onReconnectStart:Co,onReconnectEnd:Xn,onEdgeContextMenu:di,onEdgeDoubleClick:Qn,onEdgeMouseEnter:El,onEdgeMouseMove:Gn,onEdgeMouseLeave:Sr,reconnectRadius:_r=10,onNodesChange:hi,onEdgesChange:kl,noDragClassName:Nl="nodrag",noWheelClassName:Cl="nowheel",noPanClassName:qt="nopan",fitView:pi,fitViewOptions:gi,connectOnClick:Ml,attributionPosition:Mo,proOptions:Po,defaultEdgeOptions:Io,elevateNodesOnSelect:To=!0,elevateEdgesOnSelect:Pl=!1,disableKeyboardA11y:zo=!1,autoPanOnConnect:Oe,autoPanOnNodeDrag:Il,autoPanOnSelection:mi=!0,autoPanSpeed:jo,connectionRadius:Er,isValidConnection:Tl,onError:Lo,style:kr,id:vt,nodeDragThreshold:zl,connectionDragThreshold:xt,viewport:jl,onViewportChange:Ll,width:Rl,height:Nr,colorMode:Cr="light",debug:Kn,onScroll:un,ariaLabelConfig:Al,zIndexMode:Ro="basic",...yi},Ao){const qn=vt||"1",Zn=O1(Cr),$l=Q.useCallback(Mr=>{Mr.currentTarget.scrollTo({top:0,left:0,behavior:"instant"}),un==null||un(Mr)},[un]);return k.jsx("div",{"data-testid":"rf__wrapper",...yi,onScroll:$l,style:{...kr,...c_},ref:Ao,className:We(["react-flow",u,Zn]),id:vt,role:"application",children:k.jsxs(a_,{nodes:t,edges:r,width:Rl,height:Nr,fitView:pi,fitViewOptions:gi,minZoom:Ct,maxZoom:yt,nodeOrigin:tt,nodeExtent:ln,zIndexMode:Ro,children:[k.jsx(D1,{nodes:t,edges:r,defaultNodes:o,defaultEdges:l,onConnect:w,onConnectStart:S,onConnectEnd:P,onClickConnectStart:N,onClickConnectEnd:E,nodesDraggable:Pe,autoPanOnNodeFocus:Qe,nodesConnectable:ut,nodesFocusable:et,edgesFocusable:sn,edgesReconnectable:Gt,elementsSelectable:Kt,elevateNodesOnSelect:To,elevateEdgesOnSelect:Pl,minZoom:Ct,maxZoom:yt,nodeExtent:ln,onNodesChange:hi,onEdgesChange:kl,snapToGrid:ge,snapGrid:Ce,connectionMode:M,translateExtent:Mt,connectOnClick:Ml,defaultEdgeOptions:Io,fitView:pi,fitViewOptions:gi,onNodesDelete:te,onEdgesDelete:Z,onDelete:ee,onNodeDragStart:V,onNodeDrag:X,onNodeDragStop:G,onSelectionDrag:U,onSelectionDragStart:C,onSelectionDragStop:H,onMove:m,onMoveStart:v,onMoveEnd:g,noPanClassName:qt,nodeOrigin:tt,rfId:qn,autoPanOnConnect:Oe,autoPanOnNodeDrag:Il,autoPanSpeed:jo,onError:Lo,connectionRadius:Er,isValidConnection:Tl,selectNodesOnDrag:ye,nodeDragThreshold:zl,connectionDragThreshold:xt,onBeforeDelete:O,debug:Kn,ariaLabelConfig:Al,zIndexMode:Ro}),k.jsx(s_,{onInit:y,onNodeClick:h,onEdgeClick:p,onNodeMouseEnter:j,onNodeMouseMove:_,onNodeMouseLeave:I,onNodeContextMenu:b,onNodeDoubleClick:$,nodeTypes:c,edgeTypes:f,connectionLineType:z,connectionLineStyle:ne,connectionLineComponent:re,connectionLineContainerStyle:ae,selectionKeyCode:ce,selectionOnDrag:K,selectionMode:se,deleteKeyCode:fe,multiSelectionKeyCode:Se,panActivationKeyCode:he,zoomActivationKeyCode:xe,onlyRenderVisibleElements:F,defaultViewport:at,translateExtent:Mt,minZoom:Ct,maxZoom:yt,preventScrolling:wr,zoomOnScroll:Sl,zoomOnPinch:xo,zoomOnDoubleClick:li,panOnScroll:wo,panOnScrollSpeed:_l,panOnScrollMode:si,panOnDrag:ui,autoPanOnSelection:mi,onPaneClick:ai,onPaneMouseEnter:ci,onPaneMouseMove:wn,onPaneMouseLeave:Sn,onPaneScroll:So,onPaneContextMenu:_o,paneClickDistance:Eo,nodeClickDistance:ko,onSelectionContextMenu:B,onSelectionStart:A,onSelectionEnd:R,onReconnect:fi,onReconnectStart:Co,onReconnectEnd:Xn,onEdgeContextMenu:di,onEdgeDoubleClick:Qn,onEdgeMouseEnter:El,onEdgeMouseMove:Gn,onEdgeMouseLeave:Sr,reconnectRadius:_r,defaultMarkerColor:Yn,noDragClassName:Nl,noWheelClassName:Cl,noPanClassName:qt,rfId:qn,disableKeyboardA11y:zo,nodeExtent:ln,viewport:jl,onViewportChange:Ll,nodesDraggable:Pe}),k.jsx(L1,{onSelectionChange:J}),No,k.jsx(P1,{proOptions:Po,position:Mo}),k.jsx(M1,{rfId:qn,disableKeyboardA11y:zo})]})})}var d_=hg(f_);function h_({dimensions:t,lineWidth:r,variant:o,className:l}){return k.jsx("path",{strokeWidth:r,d:`M${t[0]/2} 0 V${t[1]} M0 ${t[1]/2} H${t[0]}`,className:We(["react-flow__background-pattern",o,l])})}function p_({radius:t,className:r}){return k.jsx("circle",{cx:t,cy:t,r:t,className:We(["react-flow__background-pattern","dots",r])})}var Wn;(function(t){t.Lines="lines",t.Dots="dots",t.Cross="cross"})(Wn||(Wn={}));const g_={[Wn.Dots]:1,[Wn.Lines]:1,[Wn.Cross]:6},m_=t=>({transform:t.transform,patternId:`pattern-${t.rfId}`});function Hg({id:t,variant:r=Wn.Dots,gap:o=20,size:l,lineWidth:u=1,offset:c=0,color:f,bgColor:h,style:p,className:y,patternClassName:m}){const v=Q.useRef(null),{transform:g,patternId:w}=Te(m_,Ve),S=l||g_[r],P=r===Wn.Dots,N=r===Wn.Cross,E=Array.isArray(o)?o:[o,o],j=[E[0]*g[2]||1,E[1]*g[2]||1],_=S*g[2],I=Array.isArray(c)?c:[c,c],b=N?[_,_]:j,$=[I[0]*g[2]+b[0]/2,I[1]*g[2]+b[1]/2],V=`${w}${t||""}`;return k.jsxs("svg",{className:We(["react-flow__background",y]),style:{...p,...xl,"--xy-background-color-props":h,"--xy-background-pattern-color-props":f},ref:v,"data-testid":"rf__background",children:[k.jsx("pattern",{id:V,x:g[0]%j[0],y:g[1]%j[1],width:j[0],height:j[1],patternUnits:"userSpaceOnUse",patternTransform:`translate(-${$[0]},-${$[1]})`,children:P?k.jsx(p_,{radius:_/2,className:m}):k.jsx(h_,{dimensions:b,lineWidth:u,variant:r,className:m})}),k.jsx("rect",{x:"0",y:"0",width:"100%",height:"100%",fill:`url(#${V})`})]})}Hg.displayName="Background";const y_=Q.memo(Hg);function v_(){return k.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 32 32",children:k.jsx("path",{d:"M32 18.133H18.133V32h-4.266V18.133H0v-4.266h13.867V0h4.266v13.867H32z"})})}function x_(){return k.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 32 5",children:k.jsx("path",{d:"M0 0h32v4.2H0z"})})}function w_(){return k.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 32 30",children:k.jsx("path",{d:"M3.692 4.63c0-.53.4-.938.939-.938h5.215V0H4.708C2.13 0 0 2.054 0 4.63v5.216h3.692V4.631zM27.354 0h-5.2v3.692h5.17c.53 0 .984.4.984.939v5.215H32V4.631A4.624 4.624 0 0027.354 0zm.954 24.83c0 .532-.4.94-.939.94h-5.215v3.768h5.215c2.577 0 4.631-2.13 4.631-4.707v-5.139h-3.692v5.139zm-23.677.94c-.531 0-.939-.4-.939-.94v-5.138H0v5.139c0 2.577 2.13 4.707 4.708 4.707h5.138V25.77H4.631z"})})}function S_(){return k.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 25 32",children:k.jsx("path",{d:"M21.333 10.667H19.81V7.619C19.81 3.429 16.38 0 12.19 0 8 0 4.571 3.429 4.571 7.619v3.048H3.048A3.056 3.056 0 000 13.714v15.238A3.056 3.056 0 003.048 32h18.285a3.056 3.056 0 003.048-3.048V13.714a3.056 3.056 0 00-3.048-3.047zM12.19 24.533a3.056 3.056 0 01-3.047-3.047 3.056 3.056 0 013.047-3.048 3.056 3.056 0 013.048 3.048 3.056 3.056 0 01-3.048 3.047zm4.724-13.866H7.467V7.619c0-2.59 2.133-4.724 4.723-4.724 2.591 0 4.724 2.133 4.724 4.724v3.048z"})})}function __(){return k.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 25 32",children:k.jsx("path",{d:"M21.333 10.667H19.81V7.619C19.81 3.429 16.38 0 12.19 0c-4.114 1.828-1.37 2.133.305 2.438 1.676.305 4.42 2.59 4.42 5.181v3.048H3.047A3.056 3.056 0 000 13.714v15.238A3.056 3.056 0 003.048 32h18.285a3.056 3.056 0 003.048-3.048V13.714a3.056 3.056 0 00-3.048-3.047zM12.19 24.533a3.056 3.056 0 01-3.047-3.047 3.056 3.056 0 013.047-3.048 3.056 3.056 0 013.048 3.048 3.056 3.056 0 01-3.048 3.047z"})})}function Ws({children:t,className:r,...o}){return k.jsx("button",{type:"button",className:We(["react-flow__controls-button",r]),...o,children:t})}const E_=t=>({isInteractive:t.nodesDraggable||t.nodesConnectable||t.elementsSelectable,minZoomReached:t.transform[2]<=t.minZoom,maxZoomReached:t.transform[2]>=t.maxZoom,ariaLabelConfig:t.ariaLabelConfig});function Vg({style:t,showZoom:r=!0,showFitView:o=!0,showInteractive:l=!0,fitViewOptions:u,onZoomIn:c,onZoomOut:f,onFitView:h,onInteractiveChange:p,className:y,children:m,position:v="bottom-left",orientation:g="vertical","aria-label":w}){const S=$e(),{isInteractive:P,minZoomReached:N,maxZoomReached:E,ariaLabelConfig:j}=Te(E_,Ve),{zoomIn:_,zoomOut:I,fitView:b}=cc(),$=()=>{_(),c==null||c()},V=()=>{I(),f==null||f()},X=()=>{b(u),h==null||h()},G=()=>{S.setState({nodesDraggable:!P,nodesConnectable:!P,elementsSelectable:!P}),p==null||p(!P)},te=g==="horizontal"?"horizontal":"vertical";return k.jsxs(vl,{className:We(["react-flow__controls",te,y]),position:v,style:t,"data-testid":"rf__controls","aria-label":w??j["controls.ariaLabel"],children:[r&&k.jsxs(k.Fragment,{children:[k.jsx(Ws,{onClick:$,className:"react-flow__controls-zoomin",title:j["controls.zoomIn.ariaLabel"],"aria-label":j["controls.zoomIn.ariaLabel"],disabled:E,children:k.jsx(v_,{})}),k.jsx(Ws,{onClick:V,className:"react-flow__controls-zoomout",title:j["controls.zoomOut.ariaLabel"],"aria-label":j["controls.zoomOut.ariaLabel"],disabled:N,children:k.jsx(x_,{})})]}),o&&k.jsx(Ws,{className:"react-flow__controls-fitview",onClick:X,title:j["controls.fitView.ariaLabel"],"aria-label":j["controls.fitView.ariaLabel"],children:k.jsx(w_,{})}),l&&k.jsx(Ws,{className:"react-flow__controls-interactive",onClick:G,title:j["controls.interactive.ariaLabel"],"aria-label":j["controls.interactive.ariaLabel"],children:P?k.jsx(__,{}):k.jsx(S_,{})}),m]})}Vg.displayName="Controls";const k_=Q.memo(Vg);function N_({id:t,x:r,y:o,width:l,height:u,style:c,color:f,strokeColor:h,strokeWidth:p,className:y,borderRadius:m,shapeRendering:v,selected:g,onClick:w}){const{background:S,backgroundColor:P}=c||{},N=f||S||P;return k.jsx("rect",{className:We(["react-flow__minimap-node",{selected:g},y]),x:r,y:o,rx:m,ry:m,width:l,height:u,style:{fill:N,stroke:h,strokeWidth:p},shapeRendering:v,onClick:w?E=>w(E,t):void 0})}const C_=Q.memo(N_),M_=t=>t.nodes.map(r=>r.id),Ta=t=>t instanceof Function?t:()=>t;function P_({nodeStrokeColor:t,nodeColor:r,nodeClassName:o="",nodeBorderRadius:l=5,nodeStrokeWidth:u,nodeComponent:c=C_,onClick:f}){const h=Te(M_,Ve),p=Ta(r),y=Ta(t),m=Ta(o),v=typeof window>"u"||window.chrome?"crispEdges":"geometricPrecision";return k.jsx(k.Fragment,{children:h.map(g=>k.jsx(T_,{id:g,nodeColorFunc:p,nodeStrokeColorFunc:y,nodeClassNameFunc:m,nodeBorderRadius:l,nodeStrokeWidth:u,NodeComponent:c,onClick:f,shapeRendering:v},g))})}function I_({id:t,nodeColorFunc:r,nodeStrokeColorFunc:o,nodeClassNameFunc:l,nodeBorderRadius:u,nodeStrokeWidth:c,shapeRendering:f,NodeComponent:h,onClick:p}){const{node:y,x:m,y:v,width:g,height:w}=Te(S=>{const P=S.nodeLookup.get(t);if(!P)return{node:void 0,x:0,y:0,width:0,height:0};const N=P.internals.userNode,{x:E,y:j}=P.internals.positionAbsolute,{width:_,height:I}=Qt(N);return{node:N,x:E,y:j,width:_,height:I}},Ve);return!y||y.hidden||!Vp(y)?null:k.jsx(h,{x:m,y:v,width:g,height:w,style:y.style,selected:!!y.selected,className:l(y),color:r(y),borderRadius:u,strokeColor:o(y),strokeWidth:c,shapeRendering:f,onClick:p,id:y.id})}const T_=Q.memo(I_);var z_=Q.memo(P_);const j_=200,L_=150,R_=t=>!t.hidden,A_=t=>{const r={x:-t.transform[0]/t.transform[2],y:-t.transform[1]/t.transform[2],width:t.width/t.transform[2],height:t.height/t.transform[2]};return{viewBB:r,boundingRect:t.nodeLookup.size>0?Op(mo(t.nodeLookup,{filter:R_}),r):r,rfId:t.rfId,panZoom:t.panZoom,translateExtent:t.translateExtent,flowWidth:t.width,flowHeight:t.height,ariaLabelConfig:t.ariaLabelConfig}},Zh=(t,r)=>t.x===r.x&&t.y===r.y&&t.width===r.width&&t.height===r.height,$_=(t,r)=>Zh(t.viewBB,r.viewBB)&&Zh(t.boundingRect,r.boundingRect)&&t.rfId===r.rfId&&t.panZoom===r.panZoom&&t.translateExtent===r.translateExtent&&t.flowWidth===r.flowWidth&&t.flowHeight===r.flowHeight&&t.ariaLabelConfig===r.ariaLabelConfig,D_="react-flow__minimap-desc";function Bg({style:t,className:r,nodeStrokeColor:o,nodeColor:l,nodeClassName:u="",nodeBorderRadius:c=5,nodeStrokeWidth:f,nodeComponent:h,bgColor:p,maskColor:y,maskStrokeColor:m,maskStrokeWidth:v,position:g="bottom-right",onClick:w,onNodeClick:S,pannable:P=!1,zoomable:N=!1,ariaLabel:E,inversePan:j,zoomStep:_=1,offsetScale:I=5}){const b=$e(),$=Q.useRef(null),{boundingRect:V,viewBB:X,rfId:G,panZoom:te,translateExtent:Z,flowWidth:ee,flowHeight:J,ariaLabelConfig:C}=Te(A_,$_),U=(t==null?void 0:t.width)??j_,H=(t==null?void 0:t.height)??L_,B=V.width/U,A=V.height/H,R=Math.max(B,A),O=R*U,M=R*H,z=I*R,ne=V.x-(O-V.width)/2-z,re=V.y-(M-V.height)/2-z,ae=O+z*2,fe=M+z*2,ce=`${D_}-${G}`,K=Q.useRef(0),se=Q.useRef();K.current=R,Q.useEffect(()=>{if($.current&&te)return se.current=Gw({domNode:$.current,panZoom:te,getTransform:()=>b.getState().transform,getViewScale:()=>K.current}),()=>{var ge;(ge=se.current)==null||ge.destroy()}},[te]),Q.useEffect(()=>{var ge;(ge=se.current)==null||ge.update({translateExtent:Z,width:ee,height:J,inversePan:j,pannable:P,zoomStep:_,zoomable:N})},[P,N,j,_,Z,ee,J]);const he=w?ge=>{var ye;const[Ce,F]=((ye=se.current)==null?void 0:ye.pointer(ge))||[0,0];w(ge,{x:Ce,y:F})}:void 0,Se=S?Q.useCallback((ge,Ce)=>{const F=b.getState().nodeLookup.get(Ce).internals.userNode;S(ge,F)},[]):void 0,xe=E??C["minimap.ariaLabel"];return k.jsx(vl,{position:g,style:{...t,"--xy-minimap-background-color-props":typeof p=="string"?p:void 0,"--xy-minimap-mask-background-color-props":typeof y=="string"?y:void 0,"--xy-minimap-mask-stroke-color-props":typeof m=="string"?m:void 0,"--xy-minimap-mask-stroke-width-props":typeof v=="number"?v*R:void 0,"--xy-minimap-node-background-color-props":typeof l=="string"?l:void 0,"--xy-minimap-node-stroke-color-props":typeof o=="string"?o:void 0,"--xy-minimap-node-stroke-width-props":typeof f=="number"?f:void 0},className:We(["react-flow__minimap",r]),"data-testid":"rf__minimap",children:k.jsxs("svg",{width:U,height:H,viewBox:`${ne} ${re} ${ae} ${fe}`,className:"react-flow__minimap-svg",role:"img","aria-labelledby":ce,ref:$,onClick:he,children:[xe&&k.jsx("title",{id:ce,children:xe}),k.jsx(z_,{onClick:Se,nodeColor:l,nodeStrokeColor:o,nodeBorderRadius:c,nodeClassName:u,nodeStrokeWidth:f,nodeComponent:h}),k.jsx("path",{className:"react-flow__minimap-mask",d:`M${ne-z},${re-z}h${ae+z*2}v${fe+z*2}h${-ae-z*2}z + M${X.x},${X.y}h${X.width}v${X.height}h${-X.width}z`,fillRule:"evenodd",pointerEvents:"none"})]})})}Bg.displayName="MiniMap";const O_=Q.memo(Bg),F_=t=>r=>t?`${Math.max(1/r.transform[2],1)}`:void 0,H_={[oi.Line]:"right",[oi.Handle]:"bottom-right"};function V_({nodeId:t,position:r,variant:o=oi.Handle,className:l,style:u=void 0,children:c,color:f,minWidth:h=10,minHeight:p=10,maxWidth:y=Number.MAX_VALUE,maxHeight:m=Number.MAX_VALUE,keepAspectRatio:v=!1,resizeDirection:g,autoScale:w=!0,shouldResize:S,onResizeStart:P,onResize:N,onResizeEnd:E}){const j=vg(),_=typeof t=="string"?t:j,I=$e(),b=Q.useRef(null),$=o===oi.Handle,V=Te(Q.useCallback(F_($&&w),[$,w]),Ve),X=Q.useRef(null),G=r??H_[o];Q.useEffect(()=>{if(!(!b.current||!_))return X.current||(X.current=u1({domNode:b.current,nodeId:_,getStoreItems:()=>{const{nodeLookup:Z,transform:ee,snapGrid:J,snapToGrid:C,nodeOrigin:U,domNode:H}=I.getState();return{nodeLookup:Z,transform:ee,snapGrid:J,snapToGrid:C,nodeOrigin:U,paneDomNode:H}},onChange:(Z,ee)=>{const{triggerNodeChanges:J,nodeLookup:C,parentLookup:U,nodeOrigin:H}=I.getState(),B=[],A={x:Z.x,y:Z.y},R=C.get(_);if(R&&R.expandParent&&R.parentId){const O=R.origin??H,M=Z.width??R.measured.width??0,z=Z.height??R.measured.height??0,ne={id:R.id,parentId:R.parentId,rect:{width:M,height:z,...Bp({x:Z.x??R.position.x,y:Z.y??R.position.y},{width:M,height:z},R.parentId,C,O)}},re=ac([ne],C,U,H);B.push(...re),A.x=Z.x?Math.max(O[0]*M,Z.x):void 0,A.y=Z.y?Math.max(O[1]*z,Z.y):void 0}if(A.x!==void 0&&A.y!==void 0){const O={id:_,type:"position",position:{...A}};B.push(O)}if(Z.width!==void 0&&Z.height!==void 0){const M={id:_,type:"dimensions",resizing:!0,setAttributes:g?g==="horizontal"?"width":"height":!0,dimensions:{width:Z.width,height:Z.height}};B.push(M)}for(const O of ee){const M={...O,type:"position"};B.push(M)}J(B)},onEnd:({width:Z,height:ee})=>{const J={id:_,type:"dimensions",resizing:!1,dimensions:{width:Z,height:ee}};I.getState().triggerNodeChanges([J])}})),X.current.update({controlPosition:G,boundaries:{minWidth:h,minHeight:p,maxWidth:y,maxHeight:m},keepAspectRatio:v,resizeDirection:g,onResizeStart:P,onResize:N,onResizeEnd:E,shouldResize:S}),()=>{var Z;(Z=X.current)==null||Z.destroy()}},[G,h,p,y,m,v,P,N,E,S]);const te=G.split("-");return k.jsx("div",{className:We(["react-flow__resize-control","nodrag",...te,o,l]),ref:b,style:{...u,scale:V,...f&&{[$?"backgroundColor":"borderColor"]:f}},children:c})}Q.memo(V_);const B_={"arch.context":0,"django.app":0,"django.route":1,"django.url_name":1,"django.view":2,"django.viewset_action":2,"django.permission":2,"django.serializer":3,"django.serializer_field":4,"django.service":4,"django.model":5,"django.field":6,"django.relation":6,"django.task":7,"django.receiver":7,"django.signal":7,"django.test":7,"django.migration_op":7,"django.admin":7,"openapi.path":8,"react.api_client":9,"react.query_key":10,"react.hook":10,"react.feature":10,"react.route":11,"react.page":11,"react.component":12,"react.form_schema":13,"react.test":13,"react.context":12};function b_(t){return B_[t]??8}function U_(t){const r=new Map;for(const l of t){const u=b_(l.type),c=r.get(u)??[];c.push(l),r.set(u,c)}const o=new Map;for(const[l,u]of r)u.sort((c,f)=>c.name.localeCompare(f.name)),u.forEach((c,f)=>{o.set(c.id,{x:l*240,y:f*92})});return o}const W_={cheap:"var(--edge-cheap)",expensive:"var(--edge-expensive)",critical:"var(--edge-critical)"};function Y_({data:t}){return k.jsxs("div",{className:"lp-node",children:[k.jsx("div",{className:"t",children:t.type.split(".").pop()}),k.jsx("div",{className:"n",children:t.name})]})}const X_={load:Y_};function za({nodes:t,edges:r}){const o=U_(t),l=t.map(c=>({id:c.id,type:"load",position:o.get(c.id)??{x:0,y:0},data:{name:c.name,type:c.type,file:c.file_path}})),u=r.filter(c=>t.some(f=>f.id===c.src)&&t.some(f=>f.id===c.dst)).map(c=>({id:c.id,source:c.src,target:c.dst,animated:c.weight==="critical",style:{stroke:W_[c.weight]||"var(--edge-cheap)",strokeWidth:c.weight==="critical"?2.4:1.2,strokeDasharray:c.confidence<.8?"6 4":void 0},label:c.type.replaceAll("_"," "),labelStyle:{fill:"var(--muted)",fontSize:9}}));return k.jsx(Fg,{children:k.jsxs(d_,{nodes:l,edges:u,nodeTypes:X_,fitView:!0,minZoom:.2,"data-testid":"impact-graph",children:[k.jsx(y_,{}),k.jsx(O_,{pannable:!0,zoomable:!0}),k.jsx(k_,{})]})})}const Ya=[{id:"obsidian",label:"Obsidian",group:"dark"},{id:"nord",label:"Nord",group:"dark"},{id:"solarized-dark",label:"Solarized Dark",group:"dark"},{id:"forest",label:"Forest",group:"dark"},{id:"rose",label:"Rose Pine",group:"dark"},{id:"amber",label:"Midnight Amber",group:"dark"},{id:"volcano",label:"Volcano",group:"dark"},{id:"lavender",label:"Lavender",group:"dark"},{id:"paper",label:"Paper",group:"light"},{id:"solarized-light",label:"Solarized Light",group:"light"},{id:"seafoam",label:"Seafoam",group:"light"},{id:"high-contrast",label:"High Contrast",group:"light"}],Q_="obsidian",bg="loadpath.theme";function G_(t){return Ya.some(r=>r.id===t)}function Ug(){try{const t=localStorage.getItem(bg)||"";if(G_(t))return t}catch{}return Q_}function Wg(t){document.documentElement.dataset.theme=t;try{localStorage.setItem(bg,t)}catch{}}function K_(){var K,se,he,Se,xe,ge,Ce;const[t,r]=Q.useState("review"),[o,l]=Q.useState(localStorage.getItem("loadpath.repo")||""),[u,c]=Q.useState("HEAD~1"),[f,h]=Q.useState("HEAD"),[p,y]=Q.useState(null),[m,v]=Q.useState(null),[g,w]=Q.useState([]),[S,P]=Q.useState("review"),[N,E]=Q.useState(""),[j,_]=Q.useState(""),[I,b]=Q.useState({}),[$,V]=Q.useState([]),[X,G]=Q.useState(""),[te,Z]=Q.useState("github"),[ee,J]=Q.useState(""),[C,U]=Q.useState(Ug),H=Q.useRef(o);H.current=o;const B=F=>{U(F),Wg(F)};Q.useEffect(()=>{Vt.settings().then(b).catch(()=>{}),Vt.repos().then(F=>w(F.repos)).catch(()=>{})},[]),Q.useEffect(()=>{if(t!=="architecture"||!o)return;const F=o;let ye=!1;return Vt.architecture(F).then(Pe=>{!ye&&H.current===F&&v(Pe)}).catch(()=>{}),()=>{ye=!0}},[t,o]);const A=F=>{l(F),localStorage.setItem("loadpath.repo",F)},R=async(F=o)=>{if(!F)return null;const ye=await Vt.architecture(F);return H.current===F&&v(ye),ye},O=async()=>{E(""),_("Tracing load path…"),A(o);try{const F=await Vt.review(o,u,f,!0);y(F),P("review"),r("review"),await Vt.repos().then(ye=>w(ye.repos)).catch(()=>{}),await R(o)}catch(F){E(F instanceof Error?F.message:String(F))}finally{_("")}},M=async(F=!0)=>{E(""),_(F?"Indexing…":"Full reindex…"),A(o);try{await Vt.index(o,F);const ye=await R(o);await Vt.repos().then(Pe=>w(Pe.repos)).catch(()=>{}),ye!=null&&ye.indexed&&(P("architecture"),r("architecture"))}catch(ye){E(ye instanceof Error?ye.message:String(ye))}finally{_("")}},z=async()=>{E(""),_("Fetching pull requests…");try{const F=await Vt.prs(te,X);V(F.pull_requests)}catch(F){E(F instanceof Error?F.message:String(F))}finally{_("")}},ne=async F=>{F.preventDefault();const ye=new FormData(F.currentTarget),Pe={github_token:String(ye.get("github_token")||""),bitbucket_token:String(ye.get("bitbucket_token")||""),bitbucket_username:String(ye.get("bitbucket_username")||""),ai_provider:String(ye.get("ai_provider")||"none"),ai_api_key:String(ye.get("ai_api_key")||""),ai_model:String(ye.get("ai_model")||""),ai_base_url:String(ye.get("ai_base_url")||""),workspaces:g.length?g.map(Qe=>({path:Qe.path,name:Qe.name})):o?[{path:o,name:o.split(/[\\/]/).pop()}]:[]};b(await Vt.saveSettings(Pe))},re=async()=>{if(p){_("Residual analysis…");try{const F=await Vt.residual(p);J(F.note)}catch(F){E(F instanceof Error?F.message:String(F))}finally{_("")}}},ae=Q.useMemo(()=>S==="architecture"?(m==null?void 0:m.nodes)??[]:(p==null?void 0:p.nodes)??[],[S,m,p]),fe=Q.useMemo(()=>S==="architecture"?(m==null?void 0:m.edges)??[]:(p==null?void 0:p.edges)??[],[S,m,p]),ce=p!=null&&p.index?`${p.index.counts.nodes} nodes / ${p.index.counts.edges} edges · ${p.index.incremental?"incremental":"full"}`:m!=null&&m.indexed?`${m.counts.nodes} nodes / ${m.counts.edges} edges indexed`:"Not indexed";return k.jsxs("div",{className:"app",children:[k.jsxs("nav",{className:"rail","data-testid":"rail",children:[k.jsx("div",{className:"brand",children:"Loadpath"}),k.jsx("button",{"data-testid":"tab-review",className:t==="review"?"active":"",onClick:()=>r("review"),children:"Review"}),k.jsx("button",{"data-testid":"tab-architecture",className:t==="architecture"?"active":"",onClick:()=>r("architecture"),children:"Architecture"}),k.jsx("button",{"data-testid":"tab-graph",className:t==="graph"?"active":"",onClick:()=>r("graph"),children:"Impact graph"}),k.jsx("button",{"data-testid":"tab-prs",className:t==="prs"?"active":"",onClick:()=>r("prs"),children:"Pull requests"}),k.jsx("button",{"data-testid":"tab-settings",className:t==="settings"?"active":"",onClick:()=>r("settings"),children:"Settings"}),k.jsxs("div",{className:"theme-pick",children:[k.jsx("label",{htmlFor:"theme-select",children:"Theme"}),k.jsx("select",{id:"theme-select","data-testid":"theme-select",value:C,onChange:F=>B(F.target.value),children:Ya.map(F=>k.jsx("option",{value:F.id,children:F.label},F.id))})]}),k.jsx("div",{style:{flex:1}}),k.jsx("div",{className:"muted",children:j||ce})]}),k.jsxs("div",{className:"main",children:[k.jsxs("div",{className:"topbar","data-testid":"topbar",children:[g.length>0?k.jsxs("select",{"data-testid":"workspace-select",value:g.some(F=>F.path===o)?o:"",onChange:F=>{F.target.value&&A(F.target.value)},children:[k.jsx("option",{value:"",children:"Indexed repos…"}),g.map(F=>k.jsxs("option",{value:F.path,children:[F.name,F.indexed?` (${F.counts.nodes})`:""]},F.path))]}):null,k.jsx("input",{"data-testid":"repo-path",className:"path",placeholder:"Local monorepo path",value:o,onChange:F=>l(F.target.value)}),k.jsx("input",{"data-testid":"base-ref",value:u,onChange:F=>c(F.target.value),placeholder:"base"}),k.jsx("input",{"data-testid":"head-ref",value:f,onChange:F=>h(F.target.value),placeholder:"head"}),k.jsx("button",{"data-testid":"btn-index",onClick:()=>M(!0),children:"Index"}),k.jsx("button",{"data-testid":"btn-review",className:"btn primary",onClick:O,children:"Review"})]}),N?k.jsx("div",{className:"error",children:N}):null,t==="review"&&k.jsxs("div",{className:"content","data-testid":"review-layout",children:[k.jsx("aside",{className:"brief","data-testid":"brief",children:p?k.jsxs(k.Fragment,{children:[k.jsxs("div",{className:`level ${p.confidence.level}`,children:[p.confidence.level.toUpperCase()," — ",p.title]}),p.low_risk?k.jsx("span",{className:"chip",children:"loadpath:low-risk"}):null,p.change_kinds.map(F=>k.jsx("span",{className:"chip",children:F.replaceAll("_"," ")},F)),k.jsx("pre",{className:"headline",children:p.headline}),p.index?k.jsxs(k.Fragment,{children:[k.jsx("div",{className:"kicker",children:"Index"}),k.jsxs("div",{className:"muted",children:["Walked ",p.index.counts.nodes," nodes / ",p.index.counts.edges," edges",p.index.reindexed?" after an incremental refresh":" from the existing index","."]})]}):null,k.jsx("div",{className:"kicker",children:"Read this"}),p.read_order.map(F=>k.jsxs("div",{children:[k.jsx("span",{className:"file",children:F.path}),k.jsx("div",{className:"muted",children:F.why})]},F.path)),k.jsx("div",{className:"kicker",children:"Clusters"}),p.clusters.map(F=>k.jsxs("div",{className:"muted",children:[k.jsx("strong",{children:F.title})," — ",F.files.join(", ")]},F.id)),k.jsx("div",{className:"kicker",children:"Architecture"}),p.findings.filter(F=>!F.waived).length===0?k.jsx("div",{className:"muted",children:p.architecture_note}):p.findings.filter(F=>!F.waived).map(F=>k.jsxs("div",{className:"muted",children:[k.jsx("span",{className:`chip ${F.severity}`,children:F.severity}),F.message]},F.rule+F.message)),k.jsx("div",{className:"kicker",children:"Residual (AI only here)"}),p.residuals.map(F=>k.jsx("div",{className:"muted",children:F},F)),(se=(K=p.evolution)==null?void 0:K.notes)!=null&&se.length||(Se=(he=p.evolution)==null?void 0:he.hotspots)!=null&&Se.some(F=>F.commits)?k.jsxs(k.Fragment,{children:[k.jsx("div",{className:"kicker",children:"Churn & coupling"}),(((xe=p.evolution)==null?void 0:xe.notes)||[]).map(F=>k.jsx("div",{className:"muted",children:F},F)),(((ge=p.evolution)==null?void 0:ge.hotspots)||[]).filter(F=>F.commits).slice(0,6).map(F=>k.jsxs("div",{className:"muted",children:[k.jsx("span",{className:"file",children:F.path})," — ",F.commits," commits, bus factor ",F.bus_factor]},F.path))]}):null,k.jsx("button",{className:"btn",onClick:re,style:{marginTop:12},children:"Ask configured model"}),ee?k.jsx("pre",{className:"headline",children:ee}):null,k.jsx("div",{className:"kicker",children:"Reviewers"}),k.jsx("div",{className:"muted",children:p.suggested_reviewers.join(", ")||"—"})]}):k.jsxs("p",{className:"muted",children:["Index a Django + React monorepo with ",k.jsx("code",{children:"loadpath.yml"}),", inspect architecture, then review a git range against that graph."]})}),k.jsx("div",{className:"graph-wrap","data-testid":"review-graph",children:p?k.jsx(za,{nodes:p.nodes,edges:p.edges}):null})]}),t==="architecture"&&k.jsxs("div",{className:"content","data-testid":"architecture-panel",children:[k.jsx("aside",{className:"brief","data-testid":"architecture-brief",children:m!=null&&m.indexed?k.jsxs(k.Fragment,{children:[k.jsxs("div",{className:"level high",children:["INDEXED — ",m.counts.nodes," nodes"]}),k.jsxs("span",{className:"chip",children:[m.counts.edges," edges"]}),m.has_config?k.jsx("span",{className:"chip",children:"loadpath.yml"}):null,k.jsxs("div",{className:"muted",style:{marginTop:8},children:[m.indexed_at?`Last index ${m.indexed_at}`:"Indexed",m.incremental?" · incremental":" · full"]}),k.jsx("div",{className:"kicker",children:"Bounded contexts"}),Object.values(m.contexts).map(F=>k.jsxs("div",{className:"muted",children:[k.jsx("strong",{children:F.name})," — ",(F.django_apps||[]).join(", ")||"no apps"," ·"," ",(F.owners||[]).join(", ")||"unowned"]},F.name)),k.jsx("div",{className:"kicker",children:"Rules"}),(m.rules||[]).map(F=>k.jsx("div",{className:"muted",children:F},F)),k.jsx("div",{className:"kicker",children:"Findings on the indexed graph"}),m.findings.filter(F=>!F.waived).length===0?k.jsx("div",{className:"muted",children:"No architecture rule hits on the full graph."}):m.findings.filter(F=>!F.waived).map(F=>k.jsxs("div",{className:"muted",children:[k.jsx("span",{className:`chip ${F.severity}`,children:F.severity}),F.message]},F.rule+F.message)),k.jsx("div",{className:"kicker",children:"Types"}),k.jsx("div",{className:"muted",children:Object.entries(m.type_counts||{}).sort((F,ye)=>ye[1]-F[1]).slice(0,12).map(([F,ye])=>`${F.split(".").pop()} ${ye}`).join(" · ")}),k.jsx("button",{className:"btn",style:{marginTop:12},onClick:()=>M(!1),"data-testid":"btn-full-reindex",children:"Full reindex"}),k.jsx("button",{className:"btn primary",style:{marginTop:8},onClick:O,children:"Review against this index"})]}):k.jsx("p",{className:"muted","data-testid":"architecture-empty",children:"Index this repo to build the architecture graph. Review then walks that same graph for a git range — it does not start from a hunk list."})}),k.jsx("div",{className:"graph-wrap","data-testid":"architecture-graph",children:m!=null&&m.indexed?k.jsx(za,{nodes:m.nodes,edges:m.edges}):null})]}),t==="graph"&&k.jsxs("div",{className:"graph-wrap","data-testid":"graph-full",style:{height:"100%",display:"flex",flexDirection:"column"},children:[k.jsxs("div",{className:"graph-modes",children:[k.jsx("button",{"data-testid":"graph-mode-review",className:S==="review"?"active":"",onClick:()=>P("review"),children:"This review"}),k.jsx("button",{"data-testid":"graph-mode-architecture",className:S==="architecture"?"active":"",onClick:()=>P("architecture"),children:"Indexed architecture"})]}),ae.length?k.jsx("div",{style:{flex:1,minHeight:0},children:k.jsx(za,{nodes:ae,edges:fe})}):k.jsx("p",{className:"muted",children:"Index the repo or run a review first."})]}),t==="prs"&&k.jsxs("div",{className:"pr-list","data-testid":"pr-list",children:[k.jsxs("div",{className:"topbar",style:{border:0,padding:0,marginBottom:12},children:[k.jsxs("select",{"data-testid":"pr-provider",value:te,onChange:F=>Z(F.target.value),children:[k.jsx("option",{value:"github",children:"GitHub"}),k.jsx("option",{value:"bitbucket",children:"Bitbucket"})]}),k.jsx("input",{"data-testid":"pr-repo",className:"path",placeholder:"owner/repo",value:X,onChange:F=>G(F.target.value)}),k.jsx("button",{"data-testid":"btn-list-prs",onClick:z,children:"List PRs"})]}),$.map(F=>k.jsxs("article",{className:"pr","data-testid":`pr-${F.number}`,children:[k.jsxs("h3",{children:["#",F.number," ",F.title]}),k.jsxs("div",{className:"muted",children:[F.author," · ",F.source_branch," → ",F.target_branch," · ",F.provider]}),k.jsxs("a",{href:F.url,target:"_blank",rel:"noreferrer",children:["Open on ",F.provider]}),k.jsx("div",{children:k.jsx("button",{className:"btn",onClick:()=>{c(F.target_branch),h(F.source_branch),r("review")},children:"Review this branch range"})})]},`${F.provider}-${F.number}`))]}),t==="settings"&&k.jsxs("form",{className:"settings","data-testid":"settings-form",onSubmit:ne,children:[k.jsx("h1",{children:"Keys & providers"}),k.jsx("p",{className:"muted",children:"Tokens stay on this machine in ~/.loadpath/settings.json. GitHub and Bitbucket power the PR list. Indexed repos are remembered as workspaces. AI is used only for residual uncertainty the graph could not close."}),k.jsx("h1",{children:"Theme"}),k.jsx("p",{className:"muted",children:"Appearance is local to this browser. Pick a palette that matches how you review."}),k.jsx("div",{className:"theme-grid","data-testid":"theme-grid",children:Ya.map(F=>k.jsxs("button",{type:"button",className:C===F.id?"theme-swatch active":"theme-swatch","data-testid":`theme-${F.id}`,onClick:()=>B(F.id),children:[k.jsx("div",{className:"name",children:F.label}),k.jsx("div",{className:"group",children:F.group})]},F.id))}),k.jsx("label",{children:"GitHub token"}),k.jsx("input",{name:"github_token",type:"password",placeholder:"ghp_…"}),k.jsx("label",{children:"Bitbucket token"}),k.jsx("input",{name:"bitbucket_token",type:"password"}),k.jsx("label",{children:"Bitbucket username (app passwords)"}),k.jsx("input",{name:"bitbucket_username",defaultValue:String(I.bitbucket_username||"")}),k.jsx("label",{children:"AI provider"}),k.jsxs("select",{name:"ai_provider",defaultValue:String(((Ce=I.ai)==null?void 0:Ce.provider)||"none"),children:[k.jsx("option",{value:"none",children:"none (graph only)"}),k.jsx("option",{value:"anthropic",children:"Anthropic"}),k.jsx("option",{value:"openai",children:"OpenAI"}),k.jsx("option",{value:"grok",children:"Grok / xAI"}),k.jsx("option",{value:"deepseek",children:"DeepSeek"}),k.jsx("option",{value:"cursor",children:"Cursor-compatible (OpenAI protocol)"}),k.jsx("option",{value:"ollama",children:"Ollama local"})]}),k.jsx("label",{children:"AI API key"}),k.jsx("input",{name:"ai_api_key",type:"password"}),k.jsx("label",{children:"Model"}),k.jsx("input",{name:"ai_model",placeholder:"optional override"}),k.jsx("label",{children:"Base URL"}),k.jsx("input",{name:"ai_base_url",placeholder:"optional, OpenAI-compatible"}),k.jsx("button",{className:"btn primary",type:"submit",children:"Save"})]})]})]})}Wg(Ug());j0.createRoot(document.getElementById("root")).render(k.jsx(Q.StrictMode,{children:k.jsx(K_,{})})); diff --git a/src/loadpath/static/index.html b/src/loadpath/static/index.html index ce9e10a..e4a821f 100644 --- a/src/loadpath/static/index.html +++ b/src/loadpath/static/index.html @@ -7,8 +7,8 @@ - - + +
diff --git a/tests/e2e/test_ui_screenshots.py b/tests/e2e/test_ui_screenshots.py index 25994a1..0908fef 100644 --- a/tests/e2e/test_ui_screenshots.py +++ b/tests/e2e/test_ui_screenshots.py @@ -136,9 +136,15 @@ def test_ui_review_graph_prs_settings(live_app, tmp_path: Path): page.get_by_test_id("tab-settings").click() page.get_by_test_id("settings-form").wait_for() page.locator('select[name="ai_provider"]').select_option("grok") + page.get_by_test_id("theme-grid").wait_for() + page.get_by_test_id("theme-paper").click() + page.wait_for_function("document.documentElement.dataset.theme === 'paper'") page.wait_for_timeout(200) page.screenshot(path=str(dest / "settings.png"), full_page=False) + page.get_by_test_id("theme-select").select_option("nord") + page.wait_for_function("document.documentElement.dataset.theme === 'nord'") + for name in ("architecture.png", "review.png", "graph.png", "pull-requests.png", "settings.png"): assert (dest / name).stat().st_size > 1000 finally: diff --git a/tests/unit/test_architecture_rules.py b/tests/unit/test_architecture_rules.py index eed8251..bd6176f 100644 --- a/tests/unit/test_architecture_rules.py +++ b/tests/unit/test_architecture_rules.py @@ -54,3 +54,49 @@ def test_react_feature_calling_other_context_api(tmp_path: Path): ] assert hits, [f.message for f in findings] store.close() + + +def test_nplusone_rule_on_fixture_service(tmp_path: Path): + store = index_repo(FIXTURE, db_path=tmp_path / "g.sqlite3", incremental=False) + findings = evaluate(store, load_config(FIXTURE)) + hits = [f for f in findings if f.rule == "queryset_nplusone" and not f.waived] + assert hits + assert any("account" in f.message for f in hits) + store.close() + + +def test_cascade_across_contexts_is_warning(tmp_path: Path): + import shutil + + root = tmp_path / "repo" + shutil.copytree(FIXTURE, root) + models = root / "backend/billing/models.py" + models.write_text( + models.read_text().replace( + 'account = models.ForeignKey("accounts.UserProfile", null=True, on_delete=models.SET_NULL)', + 'account = models.ForeignKey("accounts.UserProfile", null=True, on_delete=models.CASCADE)', + ) + ) + store = index_repo(root, db_path=tmp_path / "g.sqlite3", incremental=False) + findings = evaluate(store, load_config(root)) + hits = [f for f in findings if f.rule == "cascade_crosses_context" and not f.waived] + assert hits, [f.message for f in findings] + store.close() + + +def test_migration_blast_radius_for_remove_field(tmp_path: Path): + import shutil + + root = tmp_path / "repo" + shutil.copytree(FIXTURE, root) + (root / "backend/billing/migrations/0002_remove_total.py").write_text( + "from django.db import migrations\n\n" + "class Migration(migrations.Migration):\n" + " operations = [migrations.RemoveField(model_name='Invoice', name='total')]\n" + ) + store = index_repo(root, db_path=tmp_path / "g.sqlite3", incremental=False) + findings = evaluate(store, load_config(root)) + hits = [f for f in findings if f.rule == "migration_blast_radius" and not f.waived] + assert hits + assert any("total" in f.message for f in hits) + store.close() diff --git a/tests/unit/test_django_extractors.py b/tests/unit/test_django_extractors.py index 204dff8..510a8a0 100644 --- a/tests/unit/test_django_extractors.py +++ b/tests/unit/test_django_extractors.py @@ -264,3 +264,37 @@ class Meta: g = extract_django_file("backend/billing/serializers.py", src, _cfg()) ser = next(n for n in g.nodes if n.type is NodeType.SERIALIZER) assert ser.extra.get("queryset_in_serializer") is True + + +def test_nplusone_related_access_in_loop(): + src = """ +from billing.models import Invoice + +def overdue_account_emails(): + names = [] + for invoice in Invoice.objects.filter(status="open"): + names.append(invoice.account.email) + return names +""" + g = extract_django_file("backend/billing/services.py", src, _cfg()) + svc = next(n for n in g.nodes if n.name == "overdue_account_emails") + hits = svc.extra.get("nplusone") or [] + assert hits + assert hits[0]["kind"] == "select_related" + assert "account" in hits[0]["accessed"] + assert "select_related" in hits[0]["suggested_fix"] + + +def test_nplusone_silent_when_select_related(): + src = """ +from billing.models import Invoice + +def overdue_account_emails(): + names = [] + for invoice in Invoice.objects.filter(status="open").select_related("account"): + names.append(invoice.account.email) + return names +""" + g = extract_django_file("backend/billing/services.py", src, _cfg()) + svc = next(n for n in g.nodes if n.name == "overdue_account_emails") + assert not svc.extra.get("nplusone") diff --git a/tests/unit/test_evolution.py b/tests/unit/test_evolution.py new file mode 100644 index 0000000..e4aa8cb --- /dev/null +++ b/tests/unit/test_evolution.py @@ -0,0 +1,39 @@ +from __future__ import annotations + +from pathlib import Path + +from loadpath.review.engine import run_review +from tests.conftest import change_serializer_total, copy_fixture, git_commit_all, git_init_with_main + + +def test_evolution_hotspot_and_cross_context_coupling(tmp_path: Path): + repo = copy_fixture(tmp_path) + git_init_with_main(repo) + views = repo / "backend/billing/views.py" + identity = repo / "backend/accounts/models.py" + for i in range(6): + views.write_text(views.read_text() + f"\n# churn {i}\n") + identity.write_text(identity.read_text() + f"\n# churn {i}\n") + git_commit_all(repo, f"churn {i}") + change_serializer_total(repo) + git_commit_all(repo, "tighten Invoice.total contract") + + review = run_review(repo, base="HEAD~1", head="HEAD") + evo = review["evolution"] + assert evo["commits_sampled"] >= 7 + hot = [h for h in evo["hotspots"] if h["path"].endswith("billing/views.py")] + assert hot + assert hot[0]["commits"] >= 5 + assert hot[0]["bus_factor"] == 1 + assert any("hotspot" in n or "silo" in n for n in evo["notes"]) + coupled = evo["change_coupling"] + assert any(c.get("cross_context") for c in coupled) or any( + "accounts/models.py" in f"{c['a']} {c['b']}" for c in coupled + ) + md = review.get("markdown") or "" + # engine does not attach markdown; render in the test + from loadpath.review.render import render_markdown + + text = render_markdown(review) + assert "Churn" in text + assert "views.py" in text or evo["notes"] diff --git a/ui/src/App.tsx b/ui/src/App.tsx index f3e781f..d019788 100644 --- a/ui/src/App.tsx +++ b/ui/src/App.tsx @@ -1,6 +1,7 @@ import { useEffect, useMemo, useRef, useState } from "react"; import { api } from "./api"; import { ImpactGraph } from "./ImpactGraph"; +import { THEMES, applyTheme, readTheme, type ThemeId } from "./themes"; import type { ArchitectureReport, IndexedRepo, PullRequest, Review } from "./types"; type Tab = "review" | "architecture" | "graph" | "prs" | "settings"; @@ -22,9 +23,15 @@ export function App() { const [scmRepo, setScmRepo] = useState(""); const [provider, setProvider] = useState("github"); const [aiNote, setAiNote] = useState(""); + const [theme, setTheme] = useState(readTheme); const repoRef = useRef(repo); repoRef.current = repo; + const persistTheme = (id: ThemeId) => { + setTheme(id); + applyTheme(id); + }; + useEffect(() => { api.settings().then(setSettings).catch(() => undefined); api.repos().then((r) => setRepos(r.repos)).catch(() => undefined); @@ -178,6 +185,21 @@ export function App() { +
+ + +
{busy || indexLine}
@@ -274,6 +296,24 @@ export function App() { {r}
))} + {(review.evolution?.notes?.length || review.evolution?.hotspots?.some((h) => h.commits)) ? ( + <> +
Churn & coupling
+ {(review.evolution?.notes || []).map((note) => ( +
+ {note} +
+ ))} + {(review.evolution?.hotspots || []) + .filter((h) => h.commits) + .slice(0, 6) + .map((h) => ( +
+ {h.path} — {h.commits} commits, bus factor {h.bus_factor} +
+ ))} + + ) : null} @@ -445,6 +485,22 @@ export function App() { Tokens stay on this machine in ~/.loadpath/settings.json. GitHub and Bitbucket power the PR list. Indexed repos are remembered as workspaces. AI is used only for residual uncertainty the graph could not close.

+

Theme

+

Appearance is local to this browser. Pick a palette that matches how you review.

+
+ {THEMES.map((t) => ( + + ))} +
diff --git a/ui/src/ImpactGraph.tsx b/ui/src/ImpactGraph.tsx index 56bc856..40d712c 100644 --- a/ui/src/ImpactGraph.tsx +++ b/ui/src/ImpactGraph.tsx @@ -3,9 +3,9 @@ import "@xyflow/react/dist/style.css"; import { layoutNodes, type GraphEdge, type GraphNode } from "./types"; const WEIGHT_COLOR: Record = { - cheap: "#4a5568", - expensive: "#f4a261", - critical: "#e85d04", + cheap: "var(--edge-cheap)", + expensive: "var(--edge-expensive)", + critical: "var(--edge-critical)", }; function LoadNode({ data }: { data: { name: string; type: string } }) { @@ -35,12 +35,12 @@ export function ImpactGraph({ nodes, edges }: { nodes: GraphNode[]; edges: Graph target: e.dst, animated: e.weight === "critical", style: { - stroke: WEIGHT_COLOR[e.weight] || "#4a5568", + stroke: WEIGHT_COLOR[e.weight] || "var(--edge-cheap)", strokeWidth: e.weight === "critical" ? 2.4 : 1.2, strokeDasharray: e.confidence < 0.8 ? "6 4" : undefined, }, label: e.type.replaceAll("_", " "), - labelStyle: { fill: "#8b9bb0", fontSize: 9 }, + labelStyle: { fill: "var(--muted)", fontSize: 9 }, })); return ( diff --git a/ui/src/main.tsx b/ui/src/main.tsx index 9891129..ff0470e 100644 --- a/ui/src/main.tsx +++ b/ui/src/main.tsx @@ -1,8 +1,11 @@ import { StrictMode } from "react"; import { createRoot } from "react-dom/client"; import { App } from "./App"; +import { applyTheme, readTheme } from "./themes"; import "./styles.css"; +applyTheme(readTheme()); + createRoot(document.getElementById("root")!).render( diff --git a/ui/src/styles.css b/ui/src/styles.css index 923ac4d..453fb92 100644 --- a/ui/src/styles.css +++ b/ui/src/styles.css @@ -1,4 +1,4 @@ -:root { +:root, [data-theme="obsidian"] { --bg: #070b10; --bg-2: #0d141c; --surface: #121a24; @@ -10,7 +10,342 @@ --low: #e76f51; --critical: #e85d04; --accent: #4cc9f0; + --rail-from: #0b1219; + --rail-to: #070b10; + --rail-active: #15202c; + --btn: #173044; + --btn-line: #24506c; + --btn-primary: #134e4a; + --btn-primary-line: #2a9d8f; + --node-bg: #101822; + --node-line: #2a3d52; + --graph-bg: #070b10; + --graph-grid: rgba(42, 80, 120, 0.09); + --edge-cheap: #4a5568; + --edge-expensive: #f4a261; + --edge-critical: #e85d04; + --shadow: rgba(76, 201, 240, 0.08); } + +[data-theme="nord"] { + --bg: #2e3440; + --bg-2: #3b4252; + --surface: #434c5e; + --line: #4c566a; + --ink: #eceff4; + --muted: #d8dee9; + --high: #a3be8c; + --medium: #ebcb8b; + --low: #bf616a; + --critical: #d08770; + --accent: #88c0d0; + --rail-from: #3b4252; + --rail-to: #2e3440; + --rail-active: #4c566a; + --btn: #434c5e; + --btn-line: #81a1c1; + --btn-primary: #5e81ac; + --btn-primary-line: #88c0d0; + --node-bg: #3b4252; + --node-line: #81a1c1; + --graph-bg: #2e3440; + --graph-grid: rgba(136, 192, 208, 0.12); + --edge-cheap: #4c566a; + --edge-expensive: #d08770; + --edge-critical: #bf616a; + --shadow: rgba(136, 192, 208, 0.12); +} + +[data-theme="solarized-dark"] { + --bg: #002b36; + --bg-2: #073642; + --surface: #0a3944; + --line: #16444f; + --ink: #eee8d5; + --muted: #93a1a1; + --high: #859900; + --medium: #b58900; + --low: #dc322f; + --critical: #cb4b16; + --accent: #2aa198; + --rail-from: #073642; + --rail-to: #002b36; + --rail-active: #16444f; + --btn: #073642; + --btn-line: #268bd2; + --btn-primary: #0a4a42; + --btn-primary-line: #2aa198; + --node-bg: #073642; + --node-line: #268bd2; + --graph-bg: #002b36; + --graph-grid: rgba(42, 161, 152, 0.12); + --edge-cheap: #586e75; + --edge-expensive: #cb4b16; + --edge-critical: #dc322f; + --shadow: rgba(42, 161, 152, 0.12); +} + +[data-theme="forest"] { + --bg: #0e1510; + --bg-2: #152019; + --surface: #1b2a20; + --line: #2c4334; + --ink: #e4f0e6; + --muted: #8eaa96; + --high: #6ab04c; + --medium: #c8a951; + --low: #e17055; + --critical: #d35400; + --accent: #7bed9f; + --rail-from: #152019; + --rail-to: #0e1510; + --rail-active: #1f3326; + --btn: #1f3326; + --btn-line: #3d6b4f; + --btn-primary: #1e4d32; + --btn-primary-line: #6ab04c; + --node-bg: #16241b; + --node-line: #3d6b4f; + --graph-bg: #0e1510; + --graph-grid: rgba(123, 237, 159, 0.1); + --edge-cheap: #3d6b4f; + --edge-expensive: #c8a951; + --edge-critical: #d35400; + --shadow: rgba(123, 237, 159, 0.1); +} + +[data-theme="rose"] { + --bg: #191724; + --bg-2: #1f1d2e; + --surface: #26233a; + --line: #403d52; + --ink: #e0def4; + --muted: #908caa; + --high: #9ccfd8; + --medium: #f6c177; + --low: #eb6f92; + --critical: #eb6f92; + --accent: #c4a7e7; + --rail-from: #1f1d2e; + --rail-to: #191724; + --rail-active: #26233a; + --btn: #26233a; + --btn-line: #c4a7e7; + --btn-primary: #3a2f4d; + --btn-primary-line: #c4a7e7; + --node-bg: #1f1d2e; + --node-line: #524f67; + --graph-bg: #191724; + --graph-grid: rgba(196, 167, 231, 0.12); + --edge-cheap: #524f67; + --edge-expensive: #f6c177; + --edge-critical: #eb6f92; + --shadow: rgba(196, 167, 231, 0.12); +} + +[data-theme="amber"] { + --bg: #120e0a; + --bg-2: #1c1610; + --surface: #261e16; + --line: #3d2f22; + --ink: #f4e6d0; + --muted: #b59a78; + --high: #c4d6a0; + --medium: #e9b44c; + --low: #d8572a; + --critical: #c0392b; + --accent: #f0a05a; + --rail-from: #1c1610; + --rail-to: #120e0a; + --rail-active: #2b2218; + --btn: #2b2218; + --btn-line: #8a5a2b; + --btn-primary: #4a3418; + --btn-primary-line: #f0a05a; + --node-bg: #1c1610; + --node-line: #8a5a2b; + --graph-bg: #120e0a; + --graph-grid: rgba(240, 160, 90, 0.12); + --edge-cheap: #5c4a38; + --edge-expensive: #e9b44c; + --edge-critical: #d8572a; + --shadow: rgba(240, 160, 90, 0.12); +} + +[data-theme="volcano"] { + --bg: #14090a; + --bg-2: #1e0e10; + --surface: #2a1416; + --line: #4a2226; + --ink: #fde8e4; + --muted: #c48b86; + --high: #7bed9f; + --medium: #f6c90e; + --low: #ff6b6b; + --critical: #ff3b3b; + --accent: #ff7b54; + --rail-from: #1e0e10; + --rail-to: #14090a; + --rail-active: #32181b; + --btn: #32181b; + --btn-line: #ff7b54; + --btn-primary: #5a1f18; + --btn-primary-line: #ff7b54; + --node-bg: #1e0e10; + --node-line: #7a3330; + --graph-bg: #14090a; + --graph-grid: rgba(255, 123, 84, 0.12); + --edge-cheap: #5a3330; + --edge-expensive: #ff7b54; + --edge-critical: #ff3b3b; + --shadow: rgba(255, 123, 84, 0.14); +} + +[data-theme="lavender"] { + --bg: #12101c; + --bg-2: #1a1730; + --surface: #221e3c; + --line: #3b3560; + --ink: #efeaff; + --muted: #b3a7d6; + --high: #80ffdb; + --medium: #ffd166; + --low: #ff6b9d; + --critical: #ff4d6d; + --accent: #c77dff; + --rail-from: #1a1730; + --rail-to: #12101c; + --rail-active: #2a2550; + --btn: #2a2550; + --btn-line: #c77dff; + --btn-primary: #3d2a66; + --btn-primary-line: #c77dff; + --node-bg: #1a1730; + --node-line: #5a4d8a; + --graph-bg: #12101c; + --graph-grid: rgba(199, 125, 255, 0.12); + --edge-cheap: #5a4d8a; + --edge-expensive: #ffd166; + --edge-critical: #ff4d6d; + --shadow: rgba(199, 125, 255, 0.14); +} + +[data-theme="paper"] { + --bg: #f6f1e8; + --bg-2: #efe6d6; + --surface: #fffaf2; + --line: #d9cbb6; + --ink: #2b241c; + --muted: #6f6456; + --high: #2a7a4b; + --medium: #b5811a; + --low: #c0392b; + --critical: #a93226; + --accent: #1d6a7a; + --rail-from: #efe6d6; + --rail-to: #e7dcc8; + --rail-active: #e2d3bb; + --btn: #fffaf2; + --btn-line: #c9b79a; + --btn-primary: #d7eee0; + --btn-primary-line: #2a7a4b; + --node-bg: #fffaf2; + --node-line: #c9b79a; + --graph-bg: #f6f1e8; + --graph-grid: rgba(29, 106, 122, 0.1); + --edge-cheap: #b7a48c; + --edge-expensive: #c0392b; + --edge-critical: #a93226; + --shadow: rgba(43, 36, 28, 0.08); +} + +[data-theme="solarized-light"] { + --bg: #fdf6e3; + --bg-2: #eee8d5; + --surface: #f5efdc; + --line: #d6cba9; + --ink: #657b83; + --muted: #93a1a1; + --high: #859900; + --medium: #b58900; + --low: #dc322f; + --critical: #cb4b16; + --accent: #268bd2; + --rail-from: #eee8d5; + --rail-to: #e6dfc8; + --rail-active: #e0d9c0; + --btn: #fdf6e3; + --btn-line: #93a1a1; + --btn-primary: #e8efc8; + --btn-primary-line: #859900; + --node-bg: #fdf6e3; + --node-line: #93a1a1; + --graph-bg: #fdf6e3; + --graph-grid: rgba(38, 139, 210, 0.12); + --edge-cheap: #93a1a1; + --edge-expensive: #cb4b16; + --edge-critical: #dc322f; + --shadow: rgba(101, 123, 131, 0.1); +} + +[data-theme="seafoam"] { + --bg: #eef7f4; + --bg-2: #dff0ea; + --surface: #ffffff; + --line: #b7d5cc; + --ink: #17332c; + --muted: #4d7268; + --high: #1b8a5a; + --medium: #c48a14; + --low: #c44536; + --critical: #9b2d22; + --accent: #1d9a8a; + --rail-from: #dff0ea; + --rail-to: #cfe6de; + --rail-active: #c4ddd4; + --btn: #ffffff; + --btn-line: #8fbfb2; + --btn-primary: #d4f0e4; + --btn-primary-line: #1b8a5a; + --node-bg: #ffffff; + --node-line: #8fbfb2; + --graph-bg: #eef7f4; + --graph-grid: rgba(29, 154, 138, 0.12); + --edge-cheap: #8fbfb2; + --edge-expensive: #c48a14; + --edge-critical: #c44536; + --shadow: rgba(23, 51, 44, 0.08); +} + +[data-theme="high-contrast"] { + --bg: #ffffff; + --bg-2: #f2f2f2; + --surface: #ffffff; + --line: #111111; + --ink: #000000; + --muted: #222222; + --high: #007a33; + --medium: #8a5a00; + --low: #b00000; + --critical: #9b0000; + --accent: #0033cc; + --rail-from: #f2f2f2; + --rail-to: #e6e6e6; + --rail-active: #d9d9d9; + --btn: #ffffff; + --btn-line: #000000; + --btn-primary: #d9f2e3; + --btn-primary-line: #007a33; + --node-bg: #ffffff; + --node-line: #000000; + --graph-bg: #ffffff; + --graph-grid: rgba(0, 0, 0, 0.12); + --edge-cheap: #444444; + --edge-expensive: #8a5a00; + --edge-critical: #b00000; + --shadow: rgba(0, 0, 0, 0.12); +} + * { box-sizing: border-box; } html, body, #root { height: 100%; margin: 0; } body { @@ -29,7 +364,7 @@ button, input, select, textarea { } .rail { border-right: 1px solid var(--line); - background: linear-gradient(180deg, #0b1219, #070b10); + background: linear-gradient(180deg, var(--rail-from), var(--rail-to)); padding: 20px 14px; display: flex; flex-direction: column; @@ -53,9 +388,27 @@ button, input, select, textarea { cursor: pointer; } .rail button.active, .tab.active { - background: #15202c; + background: var(--rail-active); color: var(--ink); } +.theme-pick { + margin-top: 10px; + display: grid; + gap: 4px; +} +.theme-pick label { + font-size: 10px; + letter-spacing: 0.08em; + text-transform: uppercase; + color: var(--muted); +} +.theme-pick select { + background: var(--surface); + border: 1px solid var(--line); + border-radius: 6px; + padding: 6px 8px; + width: 100%; +} .main { display: flex; flex-direction: column; min-width: 0; } .topbar { display: flex; @@ -74,28 +427,39 @@ button, input, select, textarea { } .topbar input.path { flex: 1; } .topbar button, .btn { - background: #173044; - border: 1px solid #24506c; + background: var(--btn); + border: 1px solid var(--btn-line); border-radius: 6px; padding: 8px 12px; cursor: pointer; } -.btn.primary { background: #134e4a; border-color: #2a9d8f; } +.btn.primary { background: var(--btn-primary); border-color: var(--btn-primary-line); } .content { flex: 1; min-height: 0; display: grid; grid-template-columns: 420px 1fr; } .brief { overflow: auto; border-right: 1px solid var(--line); padding: 18px; - background: radial-gradient(circle at 0 0, rgba(76, 201, 240, 0.05), transparent 40%), var(--bg); + background: radial-gradient(circle at 0 0, color-mix(in srgb, var(--accent) 8%, transparent), transparent 40%), var(--bg); } .graph-wrap { position: relative; min-height: 0; } .graph-wrap .react-flow { - background-color: #070b10; + background-color: var(--graph-bg); background-image: - linear-gradient(rgba(42, 80, 120, 0.09) 1px, transparent 1px), - linear-gradient(90deg, rgba(42, 80, 120, 0.09) 1px, transparent 1px); + linear-gradient(var(--graph-grid) 1px, transparent 1px), + linear-gradient(90deg, var(--graph-grid) 1px, transparent 1px); background-size: 24px 24px; } +.react-flow__minimap { + background: var(--surface) !important; +} +.react-flow__controls { + box-shadow: none !important; +} +.react-flow__controls-button { + background: var(--surface) !important; + border-bottom: 1px solid var(--line) !important; + fill: var(--ink) !important; +} h1 { font-size: 18px; margin: 0 0 6px; } .level { font-family: "IBM Plex Mono", monospace; font-weight: 600; } .level.high { color: var(--high); } @@ -112,6 +476,7 @@ h1 { font-size: 18px; margin: 0 0 6px; } color: var(--muted); } .chip.blocker { color: var(--low); border-color: var(--low); } +.chip.warning { color: var(--medium); border-color: var(--medium); } .file { font-family: "IBM Plex Mono", monospace; font-size: 12px; color: var(--accent); } .muted { color: var(--muted); font-size: 13px; line-height: 1.45; } .error { color: var(--low); padding: 8px 16px; } @@ -124,7 +489,7 @@ h1 { font-size: 18px; margin: 0 0 6px; } margin-bottom: 10px; } .pr h3 { margin: 0 0 4px; font-size: 14px; } -.settings { padding: 24px; max-width: 640px; display: grid; gap: 10px; } +.settings { padding: 24px; max-width: 720px; display: grid; gap: 10px; } .settings label { font-size: 12px; color: var(--muted); } .settings input, .settings select { background: var(--surface); @@ -133,6 +498,25 @@ h1 { font-size: 18px; margin: 0 0 6px; } padding: 8px 10px; width: 100%; } +.theme-grid { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(140px, 1fr)); + gap: 8px; +} +.theme-swatch { + border: 1px solid var(--line); + background: var(--surface); + border-radius: 8px; + padding: 10px; + text-align: left; + cursor: pointer; +} +.theme-swatch.active { + border-color: var(--accent); + box-shadow: 0 0 0 1px var(--accent); +} +.theme-swatch .name { font-size: 13px; font-weight: 600; } +.theme-swatch .group { font-size: 11px; color: var(--muted); } .headline { white-space: pre-wrap; font-family: "IBM Plex Mono", monospace; font-size: 12px; color: var(--muted); } .graph-modes { display: flex; @@ -150,17 +534,17 @@ h1 { font-size: 18px; margin: 0 0 6px; } cursor: pointer; } .graph-modes button.active { - background: #15202c; + background: var(--rail-active); color: var(--ink); - border-color: #2a9d8f; + border-color: var(--btn-primary-line); } .lp-node { padding: 8px 10px; border-radius: 8px; - border: 1px solid #2a3d52; - background: #101822; + border: 1px solid var(--node-line); + background: var(--node-bg); min-width: 150px; - box-shadow: 0 0 0 1px rgba(76, 201, 240, 0.08); + box-shadow: 0 0 0 1px var(--shadow); } .lp-node .t { font-size: 10px; color: var(--muted); text-transform: uppercase; letter-spacing: 0.08em; } .lp-node .n { font-size: 13px; font-weight: 600; } diff --git a/ui/src/themes.test.ts b/ui/src/themes.test.ts new file mode 100644 index 0000000..769b01f --- /dev/null +++ b/ui/src/themes.test.ts @@ -0,0 +1,13 @@ +import { describe, expect, it } from "vitest"; +import { THEMES, isThemeId } from "./themes"; + +describe("themes", () => { + it("ships a dozen named palettes", () => { + expect(THEMES.length).toBeGreaterThanOrEqual(12); + expect(THEMES.some((t) => t.id === "obsidian")).toBe(true); + expect(THEMES.some((t) => t.group === "light")).toBe(true); + expect(THEMES.some((t) => t.group === "dark")).toBe(true); + expect(isThemeId("nord")).toBe(true); + expect(isThemeId("not-a-theme")).toBe(false); + }); +}); diff --git a/ui/src/themes.ts b/ui/src/themes.ts new file mode 100644 index 0000000..85760ac --- /dev/null +++ b/ui/src/themes.ts @@ -0,0 +1,56 @@ +export type ThemeId = + | "obsidian" + | "paper" + | "nord" + | "solarized-dark" + | "solarized-light" + | "forest" + | "rose" + | "high-contrast" + | "amber" + | "seafoam" + | "volcano" + | "lavender"; + +export type Theme = { id: ThemeId; label: string; group: "dark" | "light" }; + +export const THEMES: Theme[] = [ + { id: "obsidian", label: "Obsidian", group: "dark" }, + { id: "nord", label: "Nord", group: "dark" }, + { id: "solarized-dark", label: "Solarized Dark", group: "dark" }, + { id: "forest", label: "Forest", group: "dark" }, + { id: "rose", label: "Rose Pine", group: "dark" }, + { id: "amber", label: "Midnight Amber", group: "dark" }, + { id: "volcano", label: "Volcano", group: "dark" }, + { id: "lavender", label: "Lavender", group: "dark" }, + { id: "paper", label: "Paper", group: "light" }, + { id: "solarized-light", label: "Solarized Light", group: "light" }, + { id: "seafoam", label: "Seafoam", group: "light" }, + { id: "high-contrast", label: "High Contrast", group: "light" }, +]; + +export const DEFAULT_THEME: ThemeId = "obsidian"; +const STORAGE_KEY = "loadpath.theme"; + +export function isThemeId(value: string): value is ThemeId { + return THEMES.some((t) => t.id === value); +} + +export function readTheme(): ThemeId { + try { + const stored = localStorage.getItem(STORAGE_KEY) || ""; + if (isThemeId(stored)) return stored; + } catch { + /* ignore */ + } + return DEFAULT_THEME; +} + +export function applyTheme(id: ThemeId) { + document.documentElement.dataset.theme = id; + try { + localStorage.setItem(STORAGE_KEY, id); + } catch { + /* ignore */ + } +} diff --git a/ui/src/types.ts b/ui/src/types.ts index c74b1ca..aed1dfe 100644 --- a/ui/src/types.ts +++ b/ui/src/types.ts @@ -51,6 +51,11 @@ export type Review = { sinks: { id: string; type: string; name: string }[]; tests_note: string; architecture_note: string; + evolution?: { + hotspots: { path: string; commits: number; bus_factor: number; complexity?: number }[]; + change_coupling: { a: string; b: string; together: number; cross_context?: boolean }[]; + notes: string[]; + }; nodes: GraphNode[]; edges: GraphEdge[]; markdown?: string; From 70c0b5d9e47b0aee58a906c0f9d477a80f58d497 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Fri, 14 Aug 2026 22:55:14 +0000 Subject: [PATCH 2/2] Fix adversarial review findings on ORM, churn, and themes Correct CASCADE blast wording (delete parent, not child), stop N+1 false positives from substring markers and post-loop bindings, resolve migration blast radius through surviving serializer HAS_FIELD edges, and score cyclomatic complexity on changed functions only. Also clear select_related(None)/prefetch_related(None) in source order and apply the stored theme before first paint. Co-authored-by: Damon --- src/loadpath/architecture/rules.py | 92 ++++++++++++++++++---- src/loadpath/extractors/django.py | 42 ++++++---- src/loadpath/orm/nplusone.py | 108 ++++++++++++++++++-------- src/loadpath/review/evolution.py | 43 ++++++---- src/loadpath/static/index.html | 8 ++ tests/unit/test_architecture_rules.py | 23 ++++++ tests/unit/test_django_extractors.py | 42 ++++++++++ tests/unit/test_evolution.py | 46 +++++++++++ ui/index.html | 8 ++ 9 files changed, 331 insertions(+), 81 deletions(-) diff --git a/src/loadpath/architecture/rules.py b/src/loadpath/architecture/rules.py index 8c895d4..e692614 100644 --- a/src/loadpath/architecture/rules.py +++ b/src/loadpath/architecture/rules.py @@ -340,12 +340,12 @@ def _cascade_crosses_context(store: GraphStore, config: LoadpathConfig) -> list[ rule="cascade_crosses_context", severity=RuleSeverity.WARNING, message=( - f"{field['qualified_name']} CASCADE-deletes {target.get('qualified_name')} " - f"across {sctx} → {dctx}" + f"Deleting {target.get('qualified_name')} ({dctx}) CASCADE-deletes " + f"{src_model} via {field['name']} ({sctx})" ), node_id=field["id"], file_path=field.get("file_path"), - extra={"other_context": dctx, "on_delete": "CASCADE"}, + extra={"target_context": dctx, "on_delete": "CASCADE"}, ) ) return out @@ -353,27 +353,35 @@ def _cascade_crosses_context(store: GraphStore, config: LoadpathConfig) -> list[ def _migration_blast_radius(store: GraphStore) -> list[Finding]: out: list[Finding] = [] - refs = {n["id"]: n for n in store.nodes([NodeType.FIELD, NodeType.MODEL, NodeType.SERIALIZER_FIELD])} for op in store.nodes([NodeType.MIGRATION_OP]): extra = op.get("extra") or {} kind = extra.get("op") if kind not in {"RemoveField", "DeleteModel"}: continue args = extra.get("args") or [] - targets: list[str] = [] app = extra.get("app") or "" - if kind == "RemoveField" and len(args) >= 2: - targets.append(f"{app}.{args[0]}.{args[1]}") - elif kind == "DeleteModel" and args: - targets.append(f"{app}.{args[0]}") - still = [ - node - for node in refs.values() - if (node.get("qualified_name") or "").lower() in {t.lower() for t in targets} - ] - if not still: + still: list[dict] = [] + if kind == "RemoveField": + model = extra.get("model_name") or (args[0] if args else None) + field = extra.get("field_name") or (args[1] if len(args) > 1 else None) + if not model or not field: + continue + still.extend(_remaining_field_refs(store, app, model, field)) + else: + model = extra.get("model_name") or extra.get("name") or (args[0] if args else None) + if not model: + continue + still.extend(_remaining_model_refs(store, app, model)) + seen: set[str] = set() + uniq: list[dict] = [] + for node in still: + if node["id"] in seen: + continue + seen.add(node["id"]) + uniq.append(node) + if not uniq: continue - names = ", ".join(sorted({n["qualified_name"] for n in still})[:6]) + names = ", ".join(sorted({n["qualified_name"] for n in uniq})[:6]) out.append( Finding( rule="migration_blast_radius", @@ -381,7 +389,57 @@ def _migration_blast_radius(store: GraphStore) -> list[Finding]: message=f"{op['name']} still referenced by {names}", node_id=op["id"], file_path=op.get("file_path"), - extra={"op": kind, "still": [n["id"] for n in still[:8]]}, + extra={"op": kind, "still": [n["id"] for n in uniq[:8]]}, ) ) return out + + +def _qnames(store: GraphStore, ntype: NodeType, qname: str) -> list[dict]: + want = qname.lower() + return [n for n in store.nodes([ntype]) if (n.get("qualified_name") or "").lower() == want] + + +def _ids_for(store: GraphStore, ntype: NodeType, qname: str) -> set[str]: + ids = {node_id(ntype, qname)} + ids.update(n["id"] for n in _qnames(store, ntype, qname)) + return ids + + +def _remaining_field_refs(store: GraphStore, app: str, model: str, field: str) -> list[dict]: + still = list(_qnames(store, NodeType.FIELD, f"{app}.{model}.{field}")) + model_ids = _ids_for(store, NodeType.MODEL, f"{app}.{model}") + serializer_ids: set[str] = set() + want_model = f"{app}.{model}".lower() + for edge in store.edges(): + if edge["type"] != EdgeType.SERIALIZES.value: + continue + dst = (edge.get("dst") or "").lower() + if edge["dst"] in model_ids or dst.endswith(":" + want_model): + serializer_ids.add(edge["src"]) + for edge in store.edges(): + if edge["type"] != EdgeType.HAS_FIELD.value or edge["src"] not in serializer_ids: + continue + child = store.get_node(edge["dst"]) + if child and child.get("name") == field: + still.append(child) + return still + + +def _remaining_model_refs(store: GraphStore, app: str, model: str) -> list[dict]: + still = list(_qnames(store, NodeType.MODEL, f"{app}.{model}")) + model_ids = _ids_for(store, NodeType.MODEL, f"{app}.{model}") + want = f"{app}.{model}".lower() + for edge in store.edges(): + dst = (edge.get("dst") or "").lower() + if edge["dst"] not in model_ids and not dst.endswith(":" + want): + continue + if edge["type"] in { + EdgeType.SERIALIZES.value, + EdgeType.QUERIES_MODEL.value, + EdgeType.RELATES_TO.value, + }: + src = store.get_node(edge["src"]) + if src: + still.append(src) + return still diff --git a/src/loadpath/extractors/django.py b/src/loadpath/extractors/django.py index 6df8b7d..85b33e1 100644 --- a/src/loadpath/extractors/django.py +++ b/src/loadpath/extractors/django.py @@ -927,14 +927,23 @@ def extract_migrations(rel_path: str, source: str, config: LoadpathConfig) -> Ex s = _const_str(a) or _name(a) if s: args_repr.append(s) - for kw in node.keywords: - if kw.arg in {"name", "model_name"}: - s = _const_str(kw.value) or _name(kw.value) - if s: - args_repr.append(s) - label = f"{short}({', '.join(args_repr[:3])})" + kw: dict[str, str] = {} + for keyword in node.keywords: + if not keyword.arg: + continue + s = _const_str(keyword.value) or _name(keyword.value) + if s: + kw[keyword.arg] = s + extra = {"op": short, "app": app, "args": args_repr, **kw} + if short == "RemoveField": + extra["model_name"] = kw.get("model_name") or (args_repr[0] if args_repr else None) + extra["field_name"] = kw.get("name") or (args_repr[1] if len(args_repr) > 1 else None) + elif short == "DeleteModel": + extra["model_name"] = kw.get("name") or (args_repr[0] if args_repr else None) + label_bits = [extra.get("model_name") or "", extra.get("field_name") or ""] + label_bits = [b for b in label_bits if b] or args_repr[:3] + label = f"{short}({', '.join(label_bits)})" qname = f"{app}.{Path(rel_path).stem}.{label}" - extra = {"op": short, "app": app, "args": args_repr} n = Node( id=node_id(NodeType.MIGRATION_OP, qname), type=NodeType.MIGRATION_OP, @@ -955,16 +964,17 @@ def extract_migrations(rel_path: str, source: str, config: LoadpathConfig) -> Ex extra={"op": short}, ) ) - if short == "RemoveField" and args_repr: - model = args_repr[0] - field = args_repr[1] if len(args_repr) > 1 else "?" - graph.edges.append( - Edge( - src=n.id, - dst=node_id(NodeType.FIELD, f"{app}.{model}.{field}"), - type=EdgeType.DESTRUCTIVE_MIGRATION, + if short == "RemoveField": + model = extra.get("model_name") + field = extra.get("field_name") + if model and field: + graph.edges.append( + Edge( + src=n.id, + dst=node_id(NodeType.FIELD, f"{app}.{model}.{field}"), + type=EdgeType.DESTRUCTIVE_MIGRATION, + ) ) - ) return graph diff --git a/src/loadpath/orm/nplusone.py b/src/loadpath/orm/nplusone.py index 2e5d4e4..9b58d02 100644 --- a/src/loadpath/orm/nplusone.py +++ b/src/loadpath/orm/nplusone.py @@ -14,21 +14,14 @@ import ast from dataclasses import dataclass, field -from loadpath.types import ExtractedGraph - -QS_MARKERS = ( - "objects", - "filter", - "exclude", - "all", - "select_related", - "prefetch_related", - "get_queryset", - "annotate", - "only", - "defer", -) -PREFETCH_HINTS = {"all", "filter", "exclude", "count", "exists"} +from loadpath.types import ExtractedGraph, NodeType + +PREFERRED_OWNERS = { + NodeType.VIEW, + NodeType.SERVICE, + NodeType.MANAGEMENT_COMMAND, + NodeType.TASK, +} @dataclass @@ -60,9 +53,8 @@ def apply_nplusone(graph: ExtractedGraph, tree: ast.AST) -> list[NPlusOne]: findings = scan_nplusone(tree) if not findings: return [] - by_name = {n.name: n for n in graph.nodes} for item in findings: - owner = by_name.get(item.owner or "") + owner = _owner_node(graph, item.owner) if owner is None: continue bucket = list(owner.extra.get("nplusone") or []) @@ -71,16 +63,54 @@ def apply_nplusone(graph: ExtractedGraph, tree: ast.AST) -> list[NPlusOne]: return findings +def _owner_node(graph: ExtractedGraph, name: str | None): + if not name: + return None + candidates = [n for n in graph.nodes if n.name == name] + return next((n for n in candidates if n.type in PREFERRED_OWNERS), None) or ( + candidates[0] if candidates else None + ) + + def scan_nplusone(tree: ast.AST) -> list[NPlusOne]: findings: list[NPlusOne] = [] def visit_function(fn: ast.FunctionDef | ast.AsyncFunctionDef, owner: str) -> None: bindings: dict[str, ast.AST] = {} - for stmt in fn.body: - _bind(stmt, bindings) - for child in ast.walk(fn): - if isinstance(child, ast.For): - _scan_for(child, bindings, owner, findings) + + def walk_stmts(stmts: list[ast.stmt]) -> None: + for stmt in stmts: + if isinstance(stmt, (ast.FunctionDef, ast.AsyncFunctionDef)): + visit_function(stmt, stmt.name) + continue + if isinstance(stmt, ast.ClassDef): + continue + if isinstance(stmt, ast.For): + _scan_for(stmt, bindings, owner, findings) + walk_stmts(stmt.body) + walk_stmts(stmt.orelse) + continue + if isinstance(stmt, ast.If): + walk_stmts(stmt.body) + walk_stmts(stmt.orelse) + continue + if isinstance(stmt, ast.While): + walk_stmts(stmt.body) + walk_stmts(stmt.orelse) + continue + if isinstance(stmt, ast.With): + walk_stmts(stmt.body) + continue + if isinstance(stmt, ast.Try): + walk_stmts(stmt.body) + for handler in stmt.handlers: + walk_stmts(handler.body) + walk_stmts(stmt.orelse) + walk_stmts(stmt.finalbody) + continue + _bind(stmt, bindings) + + walk_stmts(list(fn.body)) if not isinstance(tree, ast.Module): return findings @@ -101,11 +131,6 @@ def _bind(stmt: ast.AST, bindings: dict[str, ast.AST]) -> None: bindings[target.id] = stmt.value elif isinstance(stmt, ast.AnnAssign) and isinstance(stmt.target, ast.Name) and stmt.value is not None: bindings[stmt.target.id] = stmt.value - elif isinstance(stmt, (ast.If, ast.For, ast.With, ast.Try, ast.While)): - for child in ast.iter_child_nodes(stmt): - if isinstance(child, (ast.FunctionDef, ast.AsyncFunctionDef, ast.ClassDef)): - continue - _bind(child, bindings) def _scan_for(node: ast.For, bindings: dict[str, ast.AST], owner: str, findings: list[NPlusOne]) -> None: @@ -168,19 +193,33 @@ def _scan_for(node: ast.For, bindings: dict[str, ast.AST], owner: str, findings: def _queryset_shape(node: ast.AST) -> tuple[str, set[str], set[str], bool]: text = _unparse(node) blob = text.replace(" ", "") - looks = any(m in blob for m in QS_MARKERS) or ".objects." in blob + looks = ( + ".objects." in blob + or "get_queryset(" in blob + or ".select_related(" in blob + or ".prefetch_related(" in blob + or ".all()" in blob + or ".filter(" in blob + or ".exclude(" in blob + or ".annotate(" in blob + ) selects: set[str] = set() prefetches: set[str] = set() - for call in _call_chain(node): + for call in reversed(_call_chain(node)): short = _call_name(call) args = [a for a in (_const_str(a) for a in call.args) if a] + cleared = bool(call.args) and isinstance(call.args[0], ast.Constant) and call.args[0].value is None if short == "select_related": - if args: + if cleared: + selects.clear() + elif args: selects.update(a.split("__")[0] for a in args) else: selects.add("*") elif short == "prefetch_related": - if args: + if cleared: + prefetches.clear() + elif args: prefetches.update(a.split("__")[0] for a in args) else: prefetches.add("*") @@ -197,13 +236,16 @@ def _related_access(node: ast.AST, loop_var: str) -> tuple[str | None, str]: if isinstance(node, ast.Call) and isinstance(node.func, ast.Attribute): short = node.func.attr root, fields = _attr_root(node.func.value) - if root == loop_var and fields and short in PREFETCH_HINTS: - return "prefetch_related", fields[0] + if root == loop_var and fields and short in {"all", "filter", "exclude", "count", "exists"}: + if not fields[0].startswith("_"): + return "prefetch_related", fields[0] if isinstance(node, ast.Attribute): root, fields = _attr_root(node) if root != loop_var or not fields: return None, "" first = fields[0] + if first.startswith("_"): + return None, "" if first.endswith("_set"): return "prefetch_related", first if len(fields) >= 2: diff --git a/src/loadpath/review/evolution.py b/src/loadpath/review/evolution.py index b5a4a6a..7dde1f8 100644 --- a/src/loadpath/review/evolution.py +++ b/src/loadpath/review/evolution.py @@ -148,8 +148,9 @@ def _git_commits(repo_root: Path, limit: int) -> list[dict]: ], text=True, stderr=subprocess.DEVNULL, + timeout=30, ) - except (subprocess.CalledProcessError, FileNotFoundError): + except (subprocess.CalledProcessError, FileNotFoundError, subprocess.TimeoutExpired): return [] commits: list[dict] = [] current: dict | None = None @@ -181,25 +182,37 @@ def _complexity_for_diff(repo_root: Path, diff: DiffSet) -> dict[str, int]: continue score = 0 for node in ast.walk(tree): - if isinstance(node, (ast.FunctionDef, ast.AsyncFunctionDef, ast.ClassDef)): - start = getattr(node, "lineno", 0) or 0 - end = getattr(node, "end_lineno", start) or start - if changed and not any(start <= ln <= end for ln in changed): - continue - score += _cyclomatic(node) - out[fd.path] = score + if not isinstance(node, (ast.FunctionDef, ast.AsyncFunctionDef)): + continue + start = getattr(node, "lineno", 0) or 0 + end = getattr(node, "end_lineno", start) or start + if changed and not any(start <= ln <= end for ln in changed): + continue + score += _cyclomatic(node) + if score: + out[fd.path] = score return out def _cyclomatic(node: ast.AST) -> int: n = 1 - for child in ast.walk(node): - if isinstance(child, (ast.If, ast.For, ast.AsyncFor, ast.While, ast.ExceptHandler, ast.With, ast.Assert)): - n += 1 - elif isinstance(child, ast.BoolOp): - n += max(0, len(child.values) - 1) - elif isinstance(child, ast.comprehension): - n += 1 + for child in ast.iter_child_nodes(node): + n += _cyclomatic_body(child) + return n + + +def _cyclomatic_body(node: ast.AST) -> int: + if isinstance(node, (ast.FunctionDef, ast.AsyncFunctionDef, ast.ClassDef)): + return 0 + n = 0 + if isinstance(node, (ast.If, ast.For, ast.AsyncFor, ast.While, ast.ExceptHandler, ast.With, ast.Assert)): + n += 1 + elif isinstance(node, ast.BoolOp): + n += max(0, len(node.values) - 1) + elif isinstance(node, ast.comprehension): + n += 1 + for child in ast.iter_child_nodes(node): + n += _cyclomatic_body(child) return n diff --git a/src/loadpath/static/index.html b/src/loadpath/static/index.html index e4a821f..9955b50 100644 --- a/src/loadpath/static/index.html +++ b/src/loadpath/static/index.html @@ -4,6 +4,14 @@ Loadpath + diff --git a/tests/unit/test_architecture_rules.py b/tests/unit/test_architecture_rules.py index bd6176f..e31b5f4 100644 --- a/tests/unit/test_architecture_rules.py +++ b/tests/unit/test_architecture_rules.py @@ -81,6 +81,7 @@ def test_cascade_across_contexts_is_warning(tmp_path: Path): findings = evaluate(store, load_config(root)) hits = [f for f in findings if f.rule == "cascade_crosses_context" and not f.waived] assert hits, [f.message for f in findings] + assert any("Deleting" in f.message and "UserProfile" in f.message for f in hits) store.close() @@ -94,6 +95,28 @@ def test_migration_blast_radius_for_remove_field(tmp_path: Path): "class Migration(migrations.Migration):\n" " operations = [migrations.RemoveField(model_name='Invoice', name='total')]\n" ) + models = root / "backend/billing/models.py" + models.write_text(models.read_text().replace(" total = models.DecimalField(max_digits=10, decimal_places=2)\n", "")) + store = index_repo(root, db_path=tmp_path / "g.sqlite3", incremental=False) + findings = evaluate(store, load_config(root)) + hits = [f for f in findings if f.rule == "migration_blast_radius" and not f.waived] + assert hits + assert any("InvoiceSerializer.total" in f.message or "total" in f.message for f in hits) + store.close() + + +def test_migration_blast_radius_keyword_order(tmp_path: Path): + import shutil + + root = tmp_path / "repo" + shutil.copytree(FIXTURE, root) + (root / "backend/billing/migrations/0002_remove_total.py").write_text( + "from django.db import migrations\n\n" + "class Migration(migrations.Migration):\n" + " operations = [migrations.RemoveField(name='total', model_name='Invoice')]\n" + ) + models = root / "backend/billing/models.py" + models.write_text(models.read_text().replace(" total = models.DecimalField(max_digits=10, decimal_places=2)\n", "")) store = index_repo(root, db_path=tmp_path / "g.sqlite3", incremental=False) findings = evaluate(store, load_config(root)) hits = [f for f in findings if f.rule == "migration_blast_radius" and not f.waived] diff --git a/tests/unit/test_django_extractors.py b/tests/unit/test_django_extractors.py index 510a8a0..2d62cc3 100644 --- a/tests/unit/test_django_extractors.py +++ b/tests/unit/test_django_extractors.py @@ -298,3 +298,45 @@ def overdue_account_emails(): g = extract_django_file("backend/billing/services.py", src, _cfg()) svc = next(n for n in g.nodes if n.name == "overdue_account_emails") assert not svc.extra.get("nplusone") + + +def test_nplusone_ignores_non_queryset_and_private_attrs(): + src = """ +def walk_cache(): + for invoice in fetch_all(): + print(invoice.account.email) + print(invoice._state.db) +""" + g = extract_django_file("backend/billing/services.py", src, _cfg()) + svc = next(n for n in g.nodes if n.name == "walk_cache") + assert not svc.extra.get("nplusone") + + +def test_nplusone_uses_binding_before_loop_only(): + src = """ +from billing.models import Invoice + +def overdue_account_emails(): + for invoice in qs: + names = invoice.account.email + qs = Invoice.objects.filter(status="open") + return names +""" + g = extract_django_file("backend/billing/services.py", src, _cfg()) + svc = next(n for n in g.nodes if n.name == "overdue_account_emails") + assert not svc.extra.get("nplusone") + + +def test_nplusone_select_related_none_clears_cover(): + src = """ +from billing.models import Invoice + +def overdue_account_emails(): + names = [] + for invoice in Invoice.objects.select_related("account").select_related(None): + names.append(invoice.account.email) + return names +""" + g = extract_django_file("backend/billing/services.py", src, _cfg()) + svc = next(n for n in g.nodes if n.name == "overdue_account_emails") + assert svc.extra.get("nplusone") diff --git a/tests/unit/test_evolution.py b/tests/unit/test_evolution.py index e4aa8cb..3545cc0 100644 --- a/tests/unit/test_evolution.py +++ b/tests/unit/test_evolution.py @@ -37,3 +37,49 @@ def test_evolution_hotspot_and_cross_context_coupling(tmp_path: Path): text = render_markdown(review) assert "Churn" in text assert "views.py" in text or evo["notes"] + + +def test_complexity_does_not_count_unchanged_sibling_methods(tmp_path: Path): + import subprocess + + from loadpath.review.diff import git_diff + from loadpath.review.evolution import _complexity_for_diff + + repo = tmp_path / "repo" + repo.mkdir() + subprocess.check_call(["git", "init", "-b", "main"], cwd=repo, stdout=subprocess.DEVNULL) + subprocess.check_call(["git", "config", "user.email", "loadpath@test"], cwd=repo) + subprocess.check_call(["git", "config", "user.name", "Loadpath Tests"], cwd=repo) + target = repo / "mod.py" + target.write_text( + "class Big:\n" + " def unchanged(self, a, b, c):\n" + " if a:\n" + " if b:\n" + " if c:\n" + " return 1\n" + " return 0\n" + " def changed(self):\n" + " return 1\n" + ) + subprocess.check_call(["git", "add", "-A"], cwd=repo) + subprocess.check_call(["git", "commit", "-m", "base"], cwd=repo, stdout=subprocess.DEVNULL) + target.write_text( + "class Big:\n" + " def unchanged(self, a, b, c):\n" + " if a:\n" + " if b:\n" + " if c:\n" + " return 1\n" + " return 0\n" + " def changed(self, flag):\n" + " if flag:\n" + " return 2\n" + " return 1\n" + ) + subprocess.check_call(["git", "add", "-A"], cwd=repo) + subprocess.check_call(["git", "commit", "-m", "touch changed"], cwd=repo, stdout=subprocess.DEVNULL) + diff = git_diff(repo, "HEAD~1", "HEAD") + scores = _complexity_for_diff(repo, diff) + # changed() has one if → ~2, not the sibling's three nested ifs + assert scores.get("mod.py", 0) < 6 diff --git a/ui/index.html b/ui/index.html index b325dab..6d6d9d9 100644 --- a/ui/index.html +++ b/ui/index.html @@ -4,6 +4,14 @@ Loadpath +