From 4744dfefca33d1e323508616a4cdfa3b99c5d887 Mon Sep 17 00:00:00 2001 From: safishamsi Date: Fri, 3 Jul 2026 16:03:18 +0100 Subject: [PATCH 01/39] feat(extract): TS/JS member calls on local new-binding + typed-param receivers (#1630) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The #1316 resolver handled `this.injectedField.method()`, but a receiver whose type comes from a local `const x = new Foo()` binding (Pattern A) or a type-annotated parameter — including inside a returned closure (Pattern B) — produced no calls edge, so `affected ` silently under-reported. - _ts_receiver_type_table: augment the per-file type table with local `new` bindings (name -> constructor type) and bare-typed parameters (`(svc: Svc)` -> svc: Svc), merged after the constructor-injection entries (which win on a name clash). Only a bare type_identifier is recorded — an array/union/generic/qualified/predefined type is skipped (precision). - walk_calls now descends into an inline/returned JS/TS closure that is not separately tracked in function_bodies (e.g. `return () => svc.doThing()`), attributing its calls to the enclosing function, instead of stopping at the arrow boundary. A tracked-body-id set prevents double-walking const-assigned arrows. The existing _resolve_typescript_member_calls then resolves both via the receiver type with its single-definition guard. Verified on the real-CLI shape (absolute paths + graphify-out cache): both patterns resolve, ambiguity binds to the right class (Svc not Cache), untyped/array-typed receivers emit nothing. 5 tests, full suite 2871. Co-Authored-By: Claude Opus 4.8 (1M context) --- CHANGELOG.md | 2 + graphify/extract.py | 79 +++++++++++++++++++++++++ tests/test_ts_receiver_member_calls.py | 81 ++++++++++++++++++++++++++ 3 files changed, 162 insertions(+) create mode 100644 tests/test_ts_receiver_member_calls.py diff --git a/CHANGELOG.md b/CHANGELOG.md index f01b4fe4c..f10412dfb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,8 @@ Full release notes with details on each version: [GitHub Releases](https://githu ## Unreleased +- Feat: TS/JS member calls on a local `new` binding or a type-annotated parameter now resolve (#1630, thanks @DanielC000). `const s = new Svc(); s.doThing()` and a call on a typed param — including inside a returned closure (`(svc: Svc) => () => svc.doThing()`) — now emit `calls` edges to the receiver type's method, so `affected` no longer silently under-reports. Extends the #1316 `this.field` resolver: the per-file type table now also learns local `new` bindings and bare-typed parameters, and `walk_calls` descends into inline/returned closures (attributing their calls to the enclosing function) instead of stopping at the arrow boundary. Resolution keeps the single-definition guard; an untyped or non-bare-typed (array/union/generic) receiver produces no edge. + - Fix: the `query` reference doc's inline vocab/fallback snippets now read and write files with `encoding="utf-8"` (#1619 A2, thanks @edtrackai). On Windows (default cp1252) the bare `read_text()`/`write_text()` calls crashed on exactly the cross-language corpora the doc demonstrates (e.g. Cyrillic labels like `обработчик`). Fixed across all generated skill variants. - Fix: `graphify update`/`watch` no longer leaves stale sources after a deletion or a destination-only rename (#1623 / #1622, thanks @oleksii-tumanov). When the last supported file was deleted, or a rename reported only its destination in `changed_paths`, the removed source's nodes lingered in `graph.json`. The rebuild now reconciles extractor-backed sources against the files still present (code and document sources, subdirectory roots, legacy markers, symlinks, hyperedges) while preserving semantic and out-of-scope records. diff --git a/graphify/extract.py b/graphify/extract.py index 267cf3664..eb3d24aab 100644 --- a/graphify/extract.py +++ b/graphify/extract.py @@ -2340,6 +2340,55 @@ def _new_type(declarator) -> str | None: return table +def _ts_receiver_type_table(root, source: bytes, table: dict[str, str]) -> None: + """Add TS/JS receiver bindings to ``table`` (name -> TypeName), for member-call + resolution beyond the constructor-injected `this.field` case (#1630): + + * local ``const/let/var x = new Foo()`` -> ``x: Foo`` (Pattern A); + * a type-annotated parameter ``(svc: Svc)`` -> ``svc: Svc`` (Pattern B), so a + call on the param — including inside a returned closure — resolves. + + File-scoped, first-binding-wins (merged into the constructor-injection table, + which is populated first and therefore wins on a name clash). Only a bare + ``type_identifier`` (a single class/interface name) is recorded — an array, + union, generic, qualified, or predefined type is skipped (precision over + recall, matching the receiver-typed resolvers for Swift/C#/C++).""" + def _bare_type_ident(type_annotation): + # type_annotation -> ": T"; accept only a single type_identifier child. + idents = [c for c in type_annotation.children if c.type == "type_identifier"] + others = [c for c in type_annotation.children + if c.is_named and c.type not in ("type_identifier",)] + if len(idents) == 1 and not others: + return _read_text(idents[0], source) + return None + + stack = [root] + while stack: + n = stack.pop() + t = n.type + if t == "variable_declarator": + name_n = n.child_by_field_name("name") + value = n.child_by_field_name("value") + if (name_n is not None and name_n.type == "identifier" + and value is not None and value.type == "new_expression"): + ctor = value.child_by_field_name("constructor") + if ctor is not None and ctor.type in ("identifier", "type_identifier"): + name = _read_text(name_n, source) + tname = _read_text(ctor, source) + if name and tname and name not in table: + table[name] = tname + elif t == "required_parameter" or t == "optional_parameter": + pat = n.child_by_field_name("pattern") + ann = n.child_by_field_name("type") + if pat is not None and pat.type == "identifier" and ann is not None: + tname = _bare_type_ident(ann) + name = _read_text(pat, source) + if name and tname and name not in table: + table[name] = tname + for c in n.children: + stack.append(c) + + def _objc_local_var_types(body_node, source: bytes, table: dict[str, str]) -> None: """Collect ``var -> ClassName`` from ObjC local declarations (``Foo *f = ...;``) in a method body, for receiver typing in the cross-file message-send pass @@ -4775,8 +4824,23 @@ def _php_class_const_scope(n) -> str | None: return None return _read_text(scope, source) + _tracked_body_ids: set[int] = set() + _JS_CLOSURE_TYPES = ("arrow_function", "function_expression") + def walk_calls(node, caller_nid: str) -> None: if node.type in config.function_boundary_types: + # JS/TS: an inline/returned closure not separately tracked in + # function_bodies would otherwise drop its calls at this boundary. + # Descend into it with the enclosing caller so `return () => + # svc.doThing()` links to the caller (#1630). Tracked closures + # (const-assigned arrows) are walked with their own nid — skip to + # avoid double-counting. + if (config.ts_module in ("tree_sitter_javascript", "tree_sitter_typescript") + and node.type in _JS_CLOSURE_TYPES): + body = node.child_by_field_name("body") + if body is not None and id(body) not in _tracked_body_ids: + for child in node.children: + walk_calls(child, caller_nid) return if node.type in config.call_types: @@ -5282,6 +5346,14 @@ def walk_calls(node, caller_nid: str) -> None: for _caller_nid, body_node in function_bodies: _swift_local_var_types(body_node, source, type_table) + # JS/TS: bodies already walked with their own caller_nid (const-assigned + # arrows, methods). An INLINE/returned arrow or function-expression that is + # NOT separately tracked (e.g. `return () => svc.doThing()`) is otherwise + # skipped at the arrow boundary in walk_calls, losing its calls — so let + # walk_calls descend into such untracked closures with the enclosing caller + # (#1630 Pattern B). Guarding on the tracked set prevents double-walking. + _tracked_body_ids.update(id(b) for _, b in function_bodies) + for caller_nid, body_node in function_bodies: walk_calls(body_node, caller_nid) @@ -5388,6 +5460,13 @@ def _scan_js_module_dispatch(n) -> None: n["_callable"] = True if swift_extensions: result["swift_extensions"] = swift_extensions + # TS/JS: augment the constructor-injection type table with local `new` + # bindings and type-annotated parameters, so `const s = new Svc(); s.m()` and + # a call on a typed param (incl. inside a closure) resolve (#1630). The + # constructor-injection entries are populated during the walk above and win on + # a name clash (first-binding-wins in the helper). + if config.ts_module in ("tree_sitter_javascript", "tree_sitter_typescript"): + _ts_receiver_type_table(root, source, type_table) if type_table: if config.ts_module == "tree_sitter_swift": result["swift_type_table"] = {"path": str_path, "table": type_table} diff --git a/tests/test_ts_receiver_member_calls.py b/tests/test_ts_receiver_member_calls.py new file mode 100644 index 000000000..c7c2c9430 --- /dev/null +++ b/tests/test_ts_receiver_member_calls.py @@ -0,0 +1,81 @@ +"""TS/JS receiver-typed member calls beyond `this.field` (#1630). + +The #1316 resolver handled `this.injectedField.method()`. This adds two receiver +tiers whose type is statically known but was previously dropped, so +`affected ` silently under-reported: + + A. a local `const x = new Foo()` binding, then `x.method()`; + B. a closure over a type-annotated parameter, `f(x: Foo) => () => x.method()`. + +Resolution is by receiver type with the single-definition guard; an untyped or +non-bare-typed receiver produces no edge. +""" +from __future__ import annotations + +from pathlib import Path + +from graphify.extract import extract + +_SVC = "export class Svc {\n doThing(): number { return 1; }\n}\n" + + +def _calls(tmp_path, files: dict[str, str]): + for name, body in files.items(): + p = tmp_path / name + p.parent.mkdir(parents=True, exist_ok=True) + p.write_text(body) + # Real-CLI shape: absolute input paths + a graphify-out cache subdir. + r = extract([tmp_path / n for n in files], cache_root=tmp_path / "graphify-out") + lbl = {n["id"]: n["label"] for n in r["nodes"]} + return {(lbl.get(e["source"]), lbl.get(e["target"])) for e in r["edges"] + if e["relation"] == "calls"}, r + + +def test_local_new_binding_receiver(tmp_path): + calls, _ = _calls(tmp_path, { + "svc.ts": _SVC, + "direct.ts": ('import { Svc } from "./svc";\nconst s = new Svc();\n' + "export function usesDirect(): number { return s.doThing(); }\n"), + }) + assert any("usesDirect" in s and "doThing" in t for s, t in calls) + + +def test_closure_over_typed_param_receiver(tmp_path): + calls, _ = _calls(tmp_path, { + "svc.ts": _SVC, + "closure.ts": ('import { Svc } from "./svc";\n' + "export function register(svc: Svc): () => number " + "{ return () => svc.doThing(); }\n"), + }) + assert any("register" in s and "doThing" in t for s, t in calls) + + +def test_new_binding_resolves_to_correct_class_under_ambiguity(tmp_path): + calls, r = _calls(tmp_path, { + "svc.ts": _SVC, + "cache.ts": "export class Cache {\n doThing(): number { return 2; }\n}\n", + "d.ts": ('import { Svc } from "./svc";\nconst s = new Svc();\n' + "export function f(): number { return s.doThing(); }\n"), + }) + # must resolve to Svc.doThing (id contains svc), never Cache.doThing + tgts = [t for _s, t in [(e["source"], e["target"]) for e in r["edges"] + if e["relation"] == "calls" and "_f" in e["source"]]] + assert tgts and all("svc" in t.lower() for t in tgts) + assert not any("cache" in t.lower() for t in tgts) + + +def test_untyped_param_receiver_emits_no_edge(tmp_path): + calls, _ = _calls(tmp_path, { + "svc.ts": _SVC, + "n.ts": "export function g(x): number { return x.doThing(); }\n", + }) + assert not any("doThing" in t for _s, t in calls) + + +def test_array_typed_receiver_emits_no_edge(tmp_path): + calls, _ = _calls(tmp_path, { + "svc.ts": _SVC, + "a.ts": ('import { Svc } from "./svc";\n' + "export function h(xs: Svc[]): number { return xs[0].doThing(); }\n"), + }) + assert not any("h(" in s and "doThing" in t for s, t in calls) From 2ba07e84e1255ef6e7c61dc4842109c4bf1eff2a Mon Sep 17 00:00:00 2001 From: safishamsi Date: Fri, 3 Jul 2026 18:34:41 +0100 Subject: [PATCH 02/39] fix(export): guard to_canvas against dangling community members (#1236 follow-up) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The #1236 fix guarded to_obsidian's member loop but not to_canvas, so `graphify export obsidian` (which also writes graph.canvas) still crashed with KeyError on a community member id absent from G — after the notes exported, leaving a partial mirror. Reported on 0.9.5 by @swells808. Apply the same `m in G and m in node_filenames` filter in both to_canvas loops: the box-sizing loop (so the group box matches the cards actually laid out) and the card-layout loop (so the sort/label deref and the node_filenames fallback never touch a dangling id). Regression test added alongside the to_obsidian one. Full suite 2872. Co-Authored-By: Claude Opus 4.8 (1M context) --- CHANGELOG.md | 2 ++ graphify/export.py | 8 +++++++- tests/test_obsidian_dangling_member.py | 20 ++++++++++++++++++++ 3 files changed, 29 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f10412dfb..f87cb0404 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,8 @@ Full release notes with details on each version: [GitHub Releases](https://githu ## Unreleased +- Fix: `graphify export obsidian` no longer crashes in `to_canvas` on a dangling community member (#1236 follow-up, thanks @swells808). The original #1236 fix guarded `to_obsidian` but not `to_canvas`, so a community member id with no backing node in the graph still raised `KeyError` while writing `graph.canvas` — after the notes had exported, leaving a partial mirror. `to_canvas` now applies the same dangling-member filter (`m in G and m in node_filenames`) in both the box-sizing and card-layout loops. + - Feat: TS/JS member calls on a local `new` binding or a type-annotated parameter now resolve (#1630, thanks @DanielC000). `const s = new Svc(); s.doThing()` and a call on a typed param — including inside a returned closure (`(svc: Svc) => () => svc.doThing()`) — now emit `calls` edges to the receiver type's method, so `affected` no longer silently under-reports. Extends the #1316 `this.field` resolver: the per-file type table now also learns local `new` bindings and bare-typed parameters, and `walk_calls` descends into inline/returned closures (attributing their calls to the enclosing function) instead of stopping at the arrow boundary. Resolution keeps the single-definition guard; an untyped or non-bare-typed (array/union/generic) receiver produces no edge. - Fix: the `query` reference doc's inline vocab/fallback snippets now read and write files with `encoding="utf-8"` (#1619 A2, thanks @edtrackai). On Windows (default cp1252) the bare `read_text()`/`write_text()` calls crashed on exactly the cross-language corpora the doc demonstrates (e.g. Cyrillic labels like `обработчик`). Fixed across all generated skill variants. diff --git a/graphify/export.py b/graphify/export.py index 176b17909..36e4f9949 100644 --- a/graphify/export.py +++ b/graphify/export.py @@ -1278,7 +1278,10 @@ def safe_name(label: str) -> str: group_sizes: dict[int, tuple[int, int]] = {} group_cols: dict[int, int] = {} for cid in sorted_cids: - members = communities[cid] + # Skip dangling community members with no backing node / filename, so box + # sizing matches the cards actually laid out and `G.nodes[m]` never + # KeyErrors below — mirrors the to_obsidian guard (#1236). + members = [m for m in communities[cid] if m in G and m in node_filenames] n = len(members) inner_cols = max(1, math.ceil(math.sqrt(n))) w = max(600, 220 * inner_cols) @@ -1351,6 +1354,9 @@ def safe_name(label: str) -> str: # Node cards inside the group - laid out in the same ceil(sqrt(n))-column # grid the box was sized for (group_cols[cid]), so cards fill the box. inner_cols = group_cols[cid] + # Same dangling-member guard as the sizing loop and to_obsidian (#1236): + # a community id absent from G / node_filenames would KeyError the sort. + members = [m for m in members if m in G and m in node_filenames] sorted_members = sorted(members, key=lambda n: G.nodes[n].get("label", n)) for m_idx, node_id in enumerate(sorted_members): col = m_idx % inner_cols diff --git a/tests/test_obsidian_dangling_member.py b/tests/test_obsidian_dangling_member.py index bda3119b8..2e0844fdc 100644 --- a/tests/test_obsidian_dangling_member.py +++ b/tests/test_obsidian_dangling_member.py @@ -48,3 +48,23 @@ def test_obsidian_community_of_only_dangling_members(tmp_path): ghost_note = tmp_path / "_COMMUNITY_Community 1.md" assert ghost_note.exists() assert "**Members:** 0 nodes" in ghost_note.read_text(encoding="utf-8") + + +def test_canvas_dangling_community_member_does_not_crash(tmp_path): + """#1236 follow-up: the fix landed in to_obsidian but not to_canvas, so + `graphify export obsidian` (which also writes graph.canvas) still crashed + with KeyError in to_canvas on a dangling member. The same guard now applies + to both the box-sizing loop and the card-layout loop.""" + import json + from graphify.export import to_canvas + + G, comms = _graph_with_dangling_member() + out = tmp_path / "graph.canvas" + to_canvas(G, comms, str(out)) # before the fix: KeyError: 'agents_doc' + assert out.exists() + + canvas = json.loads(out.read_text(encoding="utf-8")) + node_ids = {n.get("id") for n in canvas.get("nodes", [])} + # real members get cards; the dangling id does not + assert "n_n0" in node_ids and "n_n1" in node_ids + assert "n_agents_doc" not in node_ids From e2ef4ef3d1f17e3ada990fd722a8a6eaa71edda8 Mon Sep 17 00:00:00 2001 From: safishamsi Date: Sat, 4 Jul 2026 03:12:23 +0100 Subject: [PATCH 03/39] fix: harden semantic extraction and kill phantom import edges (#1631, #1638, #1632) #1631: a malformed LLM chunk (a stray non-dict entry in edges/nodes/hyperedges) crashed the AST+semantic merge and the semantic-cache write with `AttributeError: 'list' object has no attribute 'get'`, discarding every successful chunk and writing no graph.json. `_parse_llm_json` now sanitizes each fragment at the single parse chokepoint (dict entries only; non-list values coerced to []), protecting the cache writer, the adaptive-retry merge, and the CLI merge in one place. #1638: an unresolved bare npm import (`import colors from "tailwindcss/colors"`) emitted an imports_from edge to the bare id `colors`, which build.py's pre-migration alias index then remapped onto an unrelated local file of that stem (backend/utils/colors.py) - a confident EXTRACTED cross-language phantom edge, one per importing file. The external-import fallback now namespaces its target with the `ref` prefix (the J-4 convention), so it can never collapse to a local node id; the ref target has no node, so build drops it as an external reference. #1632: with a parallel LLM backend, extract_corpus_parallel merged chunk results in completion order, so which network call returned first reordered nodes/edges run-to-run even when the model returned identical content - churning graph.json. Chunks are now merged in deterministic submission order after the pool drains (matching the serial path); the progress callback still fires in completion order. The model's own content variance is unchanged (irreducible). Full suite: 2882 passed, 3 skipped. Validated end-to-end via a local wheel build on a mixed TS+Python corpus: `explain colors.py` shows only the real importer, and graph.json is byte-identical across repeated runs. Co-Authored-By: Claude Opus 4.8 (1M context) --- CHANGELOG.md | 4 + graphify/extract.py | 12 ++- graphify/llm.py | 40 +++++++- tests/test_chunking.py | 47 +++++++++ tests/test_phantom_external_import.py | 116 +++++++++++++++++++++++ tests/test_semantic_fragment_sanitize.py | 71 ++++++++++++++ tests/test_ts_import_require.py | 20 ++-- 7 files changed, 300 insertions(+), 10 deletions(-) create mode 100644 tests/test_phantom_external_import.py create mode 100644 tests/test_semantic_fragment_sanitize.py diff --git a/CHANGELOG.md b/CHANGELOG.md index f87cb0404..626fac385 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,10 @@ Full release notes with details on each version: [GitHub Releases](https://githu ## Unreleased +- Fix: a malformed semantic chunk no longer crashes `extract` and discards every successful chunk (#1631, thanks @ssazy). When an LLM returned a well-formed object whose `edges` (or `nodes`/`hyperedges`) array carried a stray non-dict entry — a nested list where an edge object belongs — the AST+semantic merge and the semantic-cache write both called `.get()` per entry and raised `AttributeError: 'list' object has no attribute 'get'`. On a 34-chunk run where 33 succeeded, that meant no `graph.json` was written and the cache write failed too, so a re-run re-extracted everything. `_parse_llm_json` now sanitizes each fragment at the single parse chokepoint (keeping only dict entries and coercing a non-list value to `[]`), so the cache writer, the adaptive-retry merge, and the CLI merge are all protected in one place. +- Fix: an unresolved bare npm import no longer aliases onto an unrelated same-named local file (#1638, thanks @EveX1). `import colors from "tailwindcss/colors"` in a `.tsx` file emitted an `imports_from` edge to the bare id `colors`, and build.py's pre-migration alias index (which registers every local file's bare stem) then remapped it onto an unrelated `backend/utils/colors.py` — a confident (`EXTRACTED`) cross-language phantom edge, and one per `.tsx` file sharing the import. In a real monorepo eight unrelated `.tsx` files all landed on a single Python module. Common package subpaths (`colors`, `utils`, `types`, `config`, `client`) collide this way constantly. The external-import fallback now namespaces its target with the `ref` prefix (the same J-4 convention used for tsconfig `extends`/`$ref` externals), so it can never collapse to a local file/symbol id; the ref-namespaced target has no node, so build drops it as an external reference — the correct outcome for a third-party import. +- Fix: `graph.json` node/edge ordering is now stable run-to-run for document/semantic corpora (#1632, thanks @umeshpsatwe). With a parallel LLM backend, `extract_corpus_parallel` merged chunk results in completion order, so which network call happened to return first reordered the nodes and edges even when the model returned identical content — churning `graph.json` between otherwise-identical runs. Chunks are now merged in deterministic submission order after the pool drains (matching the serial path); the progress callback still fires in completion order so long local runs aren't silent. Note: the semantic content the LLM extracts is itself nondeterministic run-to-run — this fix removes the pipeline's own ordering churn, not the model's variance. + - Fix: `graphify export obsidian` no longer crashes in `to_canvas` on a dangling community member (#1236 follow-up, thanks @swells808). The original #1236 fix guarded `to_obsidian` but not `to_canvas`, so a community member id with no backing node in the graph still raised `KeyError` while writing `graph.canvas` — after the notes had exported, leaving a partial mirror. `to_canvas` now applies the same dangling-member filter (`m in G and m in node_filenames`) in both the box-sizing and card-layout loops. - Feat: TS/JS member calls on a local `new` binding or a type-annotated parameter now resolve (#1630, thanks @DanielC000). `const s = new Svc(); s.doThing()` and a call on a typed param — including inside a returned closure (`(svc: Svc) => () => svc.doThing()`) — now emit `calls` edges to the receiver type's method, so `affected` no longer silently under-reports. Extends the #1316 `this.field` resolver: the per-file type table now also learns local `new` bindings and bare-typed parameters, and `walk_calls` descends into inline/returned closures (attributing their calls to the enclosing function) instead of stopping at the arrow boundary. Resolution keeps the single-definition guard; an untyped or non-bare-typed (array/union/generic) receiver produces no edge. diff --git a/graphify/extract.py b/graphify/extract.py index eb3d24aab..f1cb548d6 100644 --- a/graphify/extract.py +++ b/graphify/extract.py @@ -1771,7 +1771,17 @@ def _resolve_js_import_target(raw: str, str_path: str) -> "tuple[str, Path | Non module_name = raw.split("/")[-1] if not module_name: return None - return _make_id(module_name), None + # Unresolved: relative/absolute, tsconfig-alias and workspace resolution have + # all run and failed, so this is an external package (or a dangling local + # path). Namespace the id with the "ref" prefix — the J-4 convention already + # used for tsconfig `extends`/`$ref` externals — so it can NEVER collapse to + # the same _make_id as a local file/symbol node. Without it, the bare + # last-segment id (e.g. "tailwindcss/colors" -> "colors") collides with any + # unrelated local file of that stem via build.py's pre-migration alias index, + # producing a confident (EXTRACTED) cross-language phantom imports_from edge + # (#1638). The ref-namespaced target has no node, so build drops it as an + # external reference — the correct outcome for a third-party import. + return _make_id("ref", raw), None def _import_js(node, source: bytes, file_nid: str, stem: str, edges: list, str_path: str, scope_stack: list[str] | None = None) -> None: diff --git a/graphify/llm.py b/graphify/llm.py index 44e98a8ca..16644e6dc 100644 --- a/graphify/llm.py +++ b/graphify/llm.py @@ -759,6 +759,30 @@ def _bedrock_content(user_message: str, refs: list[_ImageRef]) -> list[dict]: _LLM_JSON_MAX_BYTES = 10 * 1024 * 1024 # 10 MB hard cap before json.loads (F-016) +def _sanitize_fragment(parsed: dict) -> dict: + """Force ``nodes``/``edges``/``hyperedges`` to lists of dicts, in place. + + A model can return a well-formed top-level object whose ``edges`` (or + ``nodes``/``hyperedges``) array contains a stray non-dict entry — most often + a nested list where an edge object belongs, or the whole value being a bare + array/scalar instead of a list. Those entries slip past JSON parsing but + blow up every downstream consumer that calls ``.get()`` per entry + (semantic-cache write and the AST+semantic merge both did — #1631, crashing + with ``'list' object has no attribute 'get'`` and discarding all successful + chunks). Sanitizing here, at the single parse chokepoint, protects the cache + writer, the adaptive-retry merge, and the CLI merge in one place. + """ + for key in ("nodes", "edges", "hyperedges"): + value = parsed.get(key) + if value is None: + continue + if not isinstance(value, list): + parsed[key] = [] + continue + parsed[key] = [entry for entry in value if isinstance(entry, dict)] + return parsed + + def _parse_llm_json(raw: str) -> dict: """Strip optional markdown fences and parse JSON. Returns empty fragment on failure. @@ -792,7 +816,7 @@ def _parse_llm_json(raw: str) -> dict: try: parsed = json.loads(stripped) if isinstance(parsed, dict): - return parsed + return _sanitize_fragment(parsed) # Top-level array/scalar (common LLM output) is not a usable graph # fragment; fall through to the next strategy rather than returning a # non-dict that callers will try to subscript (e.g. result["input_tokens"]). @@ -827,7 +851,7 @@ def _parse_llm_json(raw: str) -> dict: try: parsed = json.loads(stripped[start : i + 1]) if isinstance(parsed, dict): - return parsed + return _sanitize_fragment(parsed) break except json.JSONDecodeError: break @@ -1862,6 +1886,14 @@ def _run_one(idx: int, chunk: list[Path]) -> tuple[int, dict | None, Exception | if callable(on_chunk_done): on_chunk_done(idx, total, result) else: + # Merge in deterministic submission order, NOT completion order. Merging + # as chunks finish makes the node/edge ordering in the returned corpus + # (and therefore graph.json) depend on which network call happened to + # return first — so identical input churned run-to-run (#1632). Collect + # results keyed by chunk index and merge in sorted order after the pool + # drains; this matches the serial path's order. The progress callback + # still fires in completion order so long local runs aren't silent. + results_by_idx: dict[int, dict] = {} with ThreadPoolExecutor(max_workers=workers) as pool: futures = [pool.submit(_run_one, idx, chunk) for idx, chunk in enumerate(chunks)] for future in as_completed(futures): @@ -1874,9 +1906,11 @@ def _run_one(idx: int, chunk: list[Path]) -> tuple[int, dict | None, Exception | merged["failed_chunks"] += 1 continue assert result is not None - _merge_into(merged, result) + results_by_idx[idx] = result if callable(on_chunk_done): on_chunk_done(idx, total, result) + for idx in sorted(results_by_idx): + _merge_into(merged, results_by_idx[idx]) # Loud failure summary — surface chunk failures at end so they're never # buried mid-log. Exit 0 preserved for caller compatibility; the diff --git a/tests/test_chunking.py b/tests/test_chunking.py index 087464ab8..21b28eec4 100644 --- a/tests/test_chunking.py +++ b/tests/test_chunking.py @@ -201,6 +201,53 @@ def record(chunk, **kwargs): assert call_order == [("f0.py",), ("f1.py",), ("f2.py",)] +def test_corpus_parallel_merge_order_is_submission_order_not_completion(tmp_path): + """#1632: merged node/edge order must be deterministic (submission order), + not the order chunks' network calls happen to finish. We skew latencies so + the first-submitted chunk finishes LAST; the merged result must still be in + file/submission order so graph.json is stable run-to-run.""" + from graphify.llm import extract_corpus_parallel + + files = [] + for i in range(4): + f = tmp_path / f"f{i}.py"; f.write_text("x") + files.append(f) + + def latency_skewed(chunk, **kwargs): + # chunk is a single file (chunk_size=1). Earlier files sleep longer, so + # completion order is the reverse of submission order. + name = chunk[0].name # f0.py .. f3.py + idx = int(name[1]) + time.sleep(0.05 * (4 - idx)) # f0 sleeps 0.20s, f3 sleeps 0.05s + return { + "nodes": [{"id": f"node_from_{name}"}], + "edges": [{"source": f"node_from_{name}", "target": "t"}], + "hyperedges": [], + "input_tokens": 1, + "output_tokens": 1, + } + + with patch("graphify.llm.extract_files_direct", side_effect=latency_skewed): + result = extract_corpus_parallel( + files, backend="kimi", token_budget=None, chunk_size=1, max_concurrency=4 + ) + + node_ids = [n["id"] for n in result["nodes"]] + assert node_ids == [ + "node_from_f0.py", + "node_from_f1.py", + "node_from_f2.py", + "node_from_f3.py", + ], f"merge order not deterministic: {node_ids}" + edge_srcs = [e["source"] for e in result["edges"]] + assert edge_srcs == [ + "node_from_f0.py", + "node_from_f1.py", + "node_from_f2.py", + "node_from_f3.py", + ], f"edge merge order not deterministic: {edge_srcs}" + + def test_corpus_parallel_continues_after_chunk_failure(tmp_path, capsys): """A single chunk raising should be logged but not abort the run. Other chunks' results should still be merged.""" diff --git a/tests/test_phantom_external_import.py b/tests/test_phantom_external_import.py new file mode 100644 index 000000000..c30f334ab --- /dev/null +++ b/tests/test_phantom_external_import.py @@ -0,0 +1,116 @@ +"""#1638 — an unresolved bare npm import must not alias onto an unrelated +same-named local file, producing a confident cross-language phantom edge. + +`import colors from "tailwindcss/colors"` in a .tsx file used to emit an +`imports_from` edge to the bare id ``colors``. build.py's pre-migration alias +index registers every local file's bare stem (``backend/utils/colors.py`` -> +alias ``colors``), so the dangling ``colors`` target was remapped onto the +Python file — an EXTRACTED-confidence edge between two files in different +languages with no real relationship. + +The fix namespaces the external-import fallback id with the ``ref`` prefix (the +J-4 convention), so it can never collide with a local file/symbol node id. +""" +from __future__ import annotations + +from pathlib import Path + +from graphify.build import build_from_json +from graphify.extract import _make_id, _resolve_js_import_target, extract + + +def _write(path: Path, text: str) -> Path: + path.parent.mkdir(parents=True, exist_ok=True) + path.write_text(text, encoding="utf-8") + return path + + +# ── unit: the resolver never returns a bare local-shaped id for an external ── + + +def test_unresolved_bare_import_is_ref_namespaced(): + tgt, resolved_path = _resolve_js_import_target( + "tailwindcss/colors", "frontend/src/SomeChart.tsx" + ) + assert resolved_path is None + # Must not be the bare last-segment id that collides with a local `colors` file. + assert tgt != _make_id("colors") + assert tgt != _make_id("colors.py") + assert tgt.startswith("ref") + + +def test_scoped_package_import_is_ref_namespaced(): + tgt, resolved_path = _resolve_js_import_target( + "@scope/utils", "src/thing.ts" + ) + assert resolved_path is None + assert tgt != _make_id("utils") + assert tgt.startswith("ref") + + +# ── end-to-end: the reporter's exact synthetic monorepo ───────────────────── + + +def test_no_phantom_edge_from_tsx_to_unrelated_python_file(tmp_path: Path): + py = _write( + tmp_path / "backend/utils/colors.py", + "def hex_to_rgb(value):\n return (0, 0, 0)\n", + ) + tsx = _write( + tmp_path / "frontend/src/SomeChart.tsx", + 'import colors from "tailwindcss/colors";\n\n' + "export const CHART_COLOR = colors.blue[500];\n", + ) + + result = extract([py, tsx], cache_root=tmp_path / "graphify-out") + G = build_from_json(result, root=str(tmp_path)) + + # Find the python file node. + py_ids = [ + n for n, d in G.nodes(data=True) + if str(d.get("source_file", "")).endswith("colors.py") + ] + assert py_ids, "colors.py should have produced at least one node" + + # No edge from the TSX file (or any TS symbol) should land on the python file + # as an imports_from relationship. + for u, v, d in G.edges(data=True): + if d.get("relation") != "imports_from": + continue + endpoints = {u, v} + if endpoints & set(py_ids): + other = (endpoints - set(py_ids)) or endpoints + srcfiles = {str(G.nodes[e].get("source_file", "")) for e in other} + assert not any(sf.endswith((".tsx", ".ts")) for sf in srcfiles), ( + f"phantom cross-language imports_from edge onto colors.py: " + f"{u} -> {v} ({d})" + ) + + +def test_multiple_tsx_files_do_not_all_alias_onto_one_python_file(tmp_path: Path): + # The real-world symptom: N unrelated .tsx files all doing the same bare + # import showed up as N imports_from sources on one python module. + _write( + tmp_path / "backend/utils/colors.py", + "def hex_to_rgb(value):\n return (0, 0, 0)\n", + ) + for i in range(3): + _write( + tmp_path / f"frontend/src/Chart{i}.tsx", + 'import colors from "tailwindcss/colors";\n' + f"export const C{i} = colors.blue;\n", + ) + + paths = list((tmp_path).rglob("*.py")) + list((tmp_path / "frontend").rglob("*.tsx")) + result = extract(paths, cache_root=tmp_path / "graphify-out") + G = build_from_json(result, root=str(tmp_path)) + + py_ids = { + n for n, d in G.nodes(data=True) + if str(d.get("source_file", "")).endswith("colors.py") + } + phantom = [ + (u, v) for u, v, d in G.edges(data=True) + if d.get("relation") == "imports_from" and ({u, v} & py_ids) + ] + assert not phantom, f"phantom edges onto colors.py: {phantom}" diff --git a/tests/test_semantic_fragment_sanitize.py b/tests/test_semantic_fragment_sanitize.py new file mode 100644 index 000000000..5ab2f9204 --- /dev/null +++ b/tests/test_semantic_fragment_sanitize.py @@ -0,0 +1,71 @@ +"""#1631 — a malformed LLM chunk (a stray non-dict entry in edges/nodes) must +not crash the merge/cache-write and discard all successful chunks. + +`sem_result["edges"]` could contain a bare list where an edge object belongs +(a JSON array slipping past parse). Downstream code calls ``.get()`` per entry +(the AST+semantic merge at __main__.py and the semantic-cache writer both did), +raising ``AttributeError: 'list' object has no attribute 'get'`` and losing all +33 successful chunks. `_parse_llm_json` now sanitizes the fragment at the single +parse chokepoint so every consumer only ever sees lists of dicts. +""" +from __future__ import annotations + +import json + +from graphify.llm import _parse_llm_json, _sanitize_fragment + + +def test_sanitize_drops_non_dict_edge_entries(): + frag = { + "nodes": [{"id": "a"}, ["not", "a", "dict"], "bare-string", {"id": "b"}], + "edges": [{"source": "a", "target": "b"}, ["stray", "list"], 42], + "hyperedges": [{"id": "h"}, None], + } + out = _sanitize_fragment(frag) + assert out["nodes"] == [{"id": "a"}, {"id": "b"}] + assert out["edges"] == [{"source": "a", "target": "b"}] + assert out["hyperedges"] == [{"id": "h"}] + + +def test_sanitize_coerces_non_list_values_to_empty(): + frag = {"nodes": {"id": "oops"}, "edges": "nope", "hyperedges": None} + out = _sanitize_fragment(frag) + assert out["nodes"] == [] + assert out["edges"] == [] + # None is left as-is (absent key semantics) — the guard only fixes lists/values + assert out.get("hyperedges") is None + + +def test_parse_llm_json_sanitizes_stray_list_in_edges(): + raw = json.dumps({ + "nodes": [{"id": "a"}], + "edges": [{"source": "a", "target": "b"}, ["malformed"]], + "hyperedges": [], + }) + parsed = _parse_llm_json(raw) + # Every entry that survives must be a dict so downstream .get() is safe. + for key in ("nodes", "edges", "hyperedges"): + assert all(isinstance(x, dict) for x in parsed.get(key, [])) + assert parsed["edges"] == [{"source": "a", "target": "b"}] + + +def test_parse_llm_json_fenced_response_is_sanitized(): + raw = ( + "Here you go:\n\n```json\n" + + json.dumps({"nodes": [["bad"], {"id": "ok"}], "edges": []}) + + "\n```\n" + ) + parsed = _parse_llm_json(raw) + assert parsed["nodes"] == [{"id": "ok"}] + + +def test_merge_after_sanitize_does_not_raise_on_source_file_access(): + # Mirrors the __main__.py comprehension that crashed: e.get("source_file", ""). + parsed = _parse_llm_json(json.dumps({ + "nodes": [{"id": "a", "source_file": "d.md"}], + "edges": [{"source": "a", "target": "b"}, ["oops"]], + })) + # This is exactly the pattern at __main__.py:4858-4860. + seen = {n.get("source_file", "") for n in parsed.get("nodes", [])} + seen |= {e.get("source_file", "") for e in parsed.get("edges", [])} + assert "d.md" in seen diff --git a/tests/test_ts_import_require.py b/tests/test_ts_import_require.py index 4612e6c23..43f186116 100644 --- a/tests/test_ts_import_require.py +++ b/tests/test_ts_import_require.py @@ -54,7 +54,11 @@ def test_import_require_single_quotes(tmp_path: Path): assert _has_edge(result, "src/main.ts", "src/util.ts") -def test_import_require_bare_module_targets_stub(tmp_path: Path): +def test_import_require_bare_module_targets_ref_stub(tmp_path: Path): + # A bare module (`require("fs")`) is external, so it emits an imports_from + # edge to a ref-namespaced stub — NOT the bare `_make_id("fs")` id, which + # would collide with any local file named fs.* via build.py's alias index + # (#1638). Parity with the ESM external path (test_external_module_unchanged). importer = _write( tmp_path / "src/io.ts", 'import fs = require("fs");\nexport const data = fs.readFileSync("x");\n', @@ -63,11 +67,15 @@ def test_import_require_bare_module_targets_stub(tmp_path: Path): result = extract([importer], cache_root=tmp_path) src = _file_node_id(Path("src/io.ts")) - tgt = _make_id("fs") - assert any( - e["source"] == src and e["target"] == tgt and e["relation"] == "imports_from" - for e in result["edges"] - ), "bare-module import-equals should target the module-name stub, like ESM" + import_targets = { + e["target"] for e in result["edges"] + if e["source"] == src and e["relation"] == "imports_from" + } + # An external stub edge still exists... + assert import_targets, "bare-module import-equals should still emit an external stub edge" + # ...but it is ref-namespaced and never the bare, collision-prone id. + assert _make_id("fs") not in import_targets + assert any(t.startswith("ref") for t in import_targets), import_targets def test_import_require_parity_with_namespace_import(tmp_path: Path): From 53c769d23dd2674934c442cd9a4e9dd330c8084f Mon Sep 17 00:00:00 2001 From: Synvoya <16019863+Synvoya@users.noreply.github.com> Date: Sat, 4 Jul 2026 16:35:30 +1000 Subject: [PATCH 04/39] fix(apex): emit extends edges for interface multiple inheritance interface X extends A, B captured the parent list in iface_re group 2 but the handler only read group 1, so no inheritance edge was emitted. Split the parent list and emit one extends edge per parent (mirroring the class branch). --- graphify/extract.py | 10 ++++++++++ tests/test_languages.py | 10 ++++++++++ 2 files changed, 20 insertions(+) diff --git a/graphify/extract.py b/graphify/extract.py index f1cb548d6..8b8437ee4 100644 --- a/graphify/extract.py +++ b/graphify/extract.py @@ -6297,6 +6297,16 @@ def add_edge(src: str, tgt: str, relation: str, line: int, add_node(iface_nid, iface_name, lineno) add_edge(file_nid if current_class_nid is None else current_class_nid, iface_nid, "contains", lineno) + if im.group(2): + for parent in im.group(2).split(","): + parent = parent.strip() + if parent: + parent_nid = _make_id(stem, parent) + if parent_nid not in seen_ids: + parent_nid = _make_id(parent) + if parent_nid not in seen_ids: + add_node(parent_nid, parent, lineno) + add_edge(iface_nid, parent_nid, "extends", lineno, confidence="INFERRED") pending_annotations = [] continue diff --git a/tests/test_languages.py b/tests/test_languages.py index ca5169d54..1ba9dc99c 100644 --- a/tests/test_languages.py +++ b/tests/test_languages.py @@ -2627,6 +2627,16 @@ def test_apex_interface_extraction(): labels = _labels(r) assert "Notifiable" in labels +def test_apex_interface_extends(tmp_path): + source = tmp_path / "PaymentProcessor.cls" + source.write_text( + "public interface PaymentProcessor extends Processor, Auditable { void process(); }\n" + ) + result = extract_apex(source) + inheritance = _edge_labels(result, "extends") | _edge_labels(result, "implements") + assert ("PaymentProcessor", "Processor") in inheritance + assert ("PaymentProcessor", "Auditable") in inheritance + def test_apex_method_extraction(): r = extract_apex(FIXTURES / "sample.cls") labels = _labels(r) From 9b040224e1eacdf94d8adedf0366880a44a5f098 Mon Sep 17 00:00:00 2001 From: Synvoya <16019863+Synvoya@users.noreply.github.com> Date: Sat, 4 Jul 2026 16:31:47 +1000 Subject: [PATCH 05/39] fix(kotlin): emit implements edge for interface delegation (`by`) class Foo : Bar by baz produced no edge because the delegation_specifier loop only handled constructor_invocation and bare user_type children; the by form wraps user_type in an explicit_delegation node. Add that branch so the implements edge (and generic-arg recovery) fires. --- graphify/extract.py | 11 +++++++++++ tests/fixtures/sample.kt | 2 ++ tests/test_languages.py | 7 +++++++ 3 files changed, 20 insertions(+) diff --git a/graphify/extract.py b/graphify/extract.py index 8b8437ee4..a5859f584 100644 --- a/graphify/extract.py +++ b/graphify/extract.py @@ -3648,6 +3648,17 @@ def _php_emit_base(base_name: str, rel: str, at_line: int) -> None: if sub.type == "user_type": user_type_node = sub break + # `class Foo : Bar by baz` wraps the delegated + # interface `Bar` in an `explicit_delegation` + # node; grab its first `user_type` descendant so + # the implements edge (and generic-arg recovery) + # still fire. + if sub.type == "explicit_delegation": + for inner in sub.children: + if inner.type == "user_type": + user_type_node = inner + break + break if user_type_node is None: continue base = _kotlin_user_type_name(user_type_node, source) diff --git a/tests/fixtures/sample.kt b/tests/fixtures/sample.kt index 5c4489c5d..db3f2810d 100644 --- a/tests/fixtures/sample.kt +++ b/tests/fixtures/sample.kt @@ -35,6 +35,8 @@ class DataProcessor : BaseProcessor(), Loggable { override fun log() {} } +class LoggingList(inner: MutableList) : MutableList by inner + fun createClient(baseUrl: String): HttpClient { val config = Config(baseUrl, 30) return HttpClient(config) diff --git a/tests/test_languages.py b/tests/test_languages.py index 1ba9dc99c..38eb7e169 100644 --- a/tests/test_languages.py +++ b/tests/test_languages.py @@ -623,6 +623,13 @@ def test_kotlin_splits_inherits_and_implements(): assert ("DataProcessor", "Loggable") in _edge_labels(r, "implements") +def test_kotlin_interface_delegation_emits_implements(): + """`class Foo : Bar by baz` wraps the delegated interface in an + `explicit_delegation` node — it must still emit an implements edge.""" + r = extract_kotlin(FIXTURES / "sample.kt") + assert ("LoggingList", "MutableList") in _edge_labels(r, "implements") + + def test_kotlin_parameter_return_generic_and_field_contexts(): r = extract_kotlin(FIXTURES / "sample.kt") assert ("run", "DataProcessor") in _edge_labels(r, "references", "parameter_type") From 5737388f1716374b2eba8cf81c601d7fd5ee8e17 Mon Sep 17 00:00:00 2001 From: safishamsi Date: Sat, 4 Jul 2026 11:32:07 +0100 Subject: [PATCH 06/39] docs: changelog credit for #1645 (apex extends) and #1644 (kotlin by delegation) Co-Authored-By: Claude Opus 4.8 (1M context) --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 626fac385..4a7e44d04 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,8 @@ Full release notes with details on each version: [GitHub Releases](https://githu ## Unreleased +- Fix: Apex `interface X extends A, B` now emits an `extends` edge per parent (#1645, thanks @Synvoya). The interface regex captured the parent list in group 2, but the handler only read the interface name (group 1), so multiple-inheritance parents were dropped and only the `contains` edge survived. The interface branch now iterates the parent list and resolves each the same way the class branch already does. +- Fix: Kotlin interface delegation (`class Foo : Bar by baz`) now emits the `implements` edge (#1644, thanks @Synvoya). The `by` form wraps the delegated interface in an `explicit_delegation` node, so neither the `constructor_invocation` nor the bare `user_type` branch fired and the edge was silently dropped. The delegation-specifier loop now unwraps `explicit_delegation` to its `user_type` (generic-argument recovery still runs), so idiomatic Kotlin delegation shows up in the graph. - Fix: a malformed semantic chunk no longer crashes `extract` and discards every successful chunk (#1631, thanks @ssazy). When an LLM returned a well-formed object whose `edges` (or `nodes`/`hyperedges`) array carried a stray non-dict entry — a nested list where an edge object belongs — the AST+semantic merge and the semantic-cache write both called `.get()` per entry and raised `AttributeError: 'list' object has no attribute 'get'`. On a 34-chunk run where 33 succeeded, that meant no `graph.json` was written and the cache write failed too, so a re-run re-extracted everything. `_parse_llm_json` now sanitizes each fragment at the single parse chokepoint (keeping only dict entries and coercing a non-list value to `[]`), so the cache writer, the adaptive-retry merge, and the CLI merge are all protected in one place. - Fix: an unresolved bare npm import no longer aliases onto an unrelated same-named local file (#1638, thanks @EveX1). `import colors from "tailwindcss/colors"` in a `.tsx` file emitted an `imports_from` edge to the bare id `colors`, and build.py's pre-migration alias index (which registers every local file's bare stem) then remapped it onto an unrelated `backend/utils/colors.py` — a confident (`EXTRACTED`) cross-language phantom edge, and one per `.tsx` file sharing the import. In a real monorepo eight unrelated `.tsx` files all landed on a single Python module. Common package subpaths (`colors`, `utils`, `types`, `config`, `client`) collide this way constantly. The external-import fallback now namespaces its target with the `ref` prefix (the same J-4 convention used for tsconfig `extends`/`$ref` externals), so it can never collapse to a local file/symbol id; the ref-namespaced target has no node, so build drops it as an external reference — the correct outcome for a third-party import. - Fix: `graph.json` node/edge ordering is now stable run-to-run for document/semantic corpora (#1632, thanks @umeshpsatwe). With a parallel LLM backend, `extract_corpus_parallel` merged chunk results in completion order, so which network call happened to return first reordered the nodes and edges even when the model returned identical content — churning `graph.json` between otherwise-identical runs. Chunks are now merged in deterministic submission order after the pool drains (matching the serial path); the progress callback still fires in completion order so long local runs aren't silent. Note: the semantic content the LLM extracts is itself nondeterministic run-to-run — this fix removes the pipeline's own ordering churn, not the model's variance. From 13e2bddf4de67871b942789905b9af44ed959e4f Mon Sep 17 00:00:00 2001 From: safishamsi Date: Sat, 4 Jul 2026 12:20:07 +0100 Subject: [PATCH 07/39] fix(ruby): extract module/Struct/Class.new containers and resolve constant-receiver calls (#1640, #1634) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit #1640 (node extraction): the extractor only created nodes for `class Foo`, so plain `module Foo`, `Foo = Struct.new(...) do ... end`, `Foo = Class.new(Super)` and `Result = Data.define(...)` produced no container node — their methods hung off the file via `contains` with dot-less labels and no edge could target them. `module` is now a container type (methods attach via `method`, nested modules included), and a constant assignment whose RHS is Struct.new/Class.new/Data.define synthesizes a class node named after the constant, attaches block-defined methods to it, and emits an `inherits` edge for `Class.new(Super)`. Plain constant assignments (MAX = 100, X = Foo.new) are untouched. #1634 (resolution): constant-receiver singleton calls (`Service.call`, `Model.where`, `SomeJob.perform_async`) emitted no edge, so a Zeitwerk-autoloaded Rails app (no requires) had near-zero cross-file edges. resolve_ruby_member_calls now handles a capitalized receiver with any callee: bind to the class's owned singleton/instance method (`def self.call`) when present, else to the class node itself so inherited/dynamic class methods (ActiveRecord where/find_by) still give blast-radius. Namespaced receivers resolve by bare class name. The single-owning-class god-node guard is kept — ambiguous receivers resolve to nothing, never a wrong edge. The two compound: PaymentProcessor#process -> TaxCalculator.rate_for needs the module node (#1640) AND the resolver (#1634); both now land. Full suite: 2893 passed, 3 skipped. Adversarial smoke confirms no false class nodes from plain/multiple assignments and no self-loops on self-class calls. Co-Authored-By: Claude Opus 4.8 (1M context) --- CHANGELOG.md | 2 + graphify/extract.py | 105 +++++++++++++++++++++++++++++++++- graphify/ruby_resolution.py | 34 ++++++++++- tests/test_ruby_resolution.py | 97 +++++++++++++++++++++++++++++++ 4 files changed, 234 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4a7e44d04..19634a898 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,8 @@ Full release notes with details on each version: [GitHub Releases](https://githu ## Unreleased +- Fix: Ruby plain modules and `Struct.new` / `Class.new` / `Data.define` constant assignments now get container nodes (#1640, thanks @krishnateja7). The extractor only created nodes for `class Foo`, so `module Foo` (utility/`module_function` modules), `Foo = Struct.new(...) do ... end`, `Foo = Class.new(StandardError)`, and `Result = Data.define(...)` produced no node at all — their methods hung off the file via `contains` with dot-less labels, and no edge could ever target them. `module` is now a container type (methods attach via `method` like a class, nested modules included), and a constant assignment whose RHS is one of those factories synthesizes a class node named after the constant, attaches block-defined methods to it, and emits an `inherits` edge for `Class.new(Super)`. Plain constant assignments (`MAX = 100`, `X = Foo.new`) are untouched. +- Fix: Ruby constant-receiver singleton calls now resolve cross-file (#1634, thanks @krishnateja7). `Service.call`, `Model.where`, `SomeJob.perform_async` — the dominant Rails idiom — emitted no `calls` edge, so with Zeitwerk autoloading (no `require`s) a Rails app had essentially no cross-file edges and `affected`/`path` came up empty. `resolve_ruby_member_calls` now handles a capitalized (constant) receiver with any callee: it binds to the class's singleton/instance method when one is owned (`def self.call`, which the extractor indexes), else to the class node itself so inherited/dynamic class methods (ActiveRecord `where`/`find_by`) still give correct blast-radius. Namespaced receivers (`Billing::Processor.call`) resolve by the bare class name. The single-owning-class god-node guard is kept throughout — an ambiguous receiver resolves to nothing rather than a wrong edge. - Fix: Apex `interface X extends A, B` now emits an `extends` edge per parent (#1645, thanks @Synvoya). The interface regex captured the parent list in group 2, but the handler only read the interface name (group 1), so multiple-inheritance parents were dropped and only the `contains` edge survived. The interface branch now iterates the parent list and resolves each the same way the class branch already does. - Fix: Kotlin interface delegation (`class Foo : Bar by baz`) now emits the `implements` edge (#1644, thanks @Synvoya). The `by` form wraps the delegated interface in an `explicit_delegation` node, so neither the `constructor_invocation` nor the bare `user_type` branch fired and the edge was silently dropped. The delegation-specifier loop now unwraps `explicit_delegation` to its `user_type` (generic-argument recovery still runs), so idiomatic Kotlin delegation shows up in the graph. - Fix: a malformed semantic chunk no longer crashes `extract` and discards every successful chunk (#1631, thanks @ssazy). When an LLM returned a well-formed object whose `edges` (or `nodes`/`hyperedges`) array carried a stray non-dict entry — a nested list where an edge object belongs — the AST+semantic merge and the semantic-cache write both called `.get()` per entry and raised `AttributeError: 'list' object has no attribute 'get'`. On a 34-chunk run where 33 succeeded, that meant no `graph.json` was written and the cache write failed too, so a re-run re-extracted everything. `_parse_llm_json` now sanitizes each fragment at the single parse chokepoint (keeping only dict entries and coercing a non-list value to `[]`), so the cache writer, the adaptive-retry merge, and the CLI merge are all protected in one place. diff --git a/graphify/extract.py b/graphify/extract.py index a5859f584..3f943e451 100644 --- a/graphify/extract.py +++ b/graphify/extract.py @@ -2993,7 +2993,12 @@ def _swift_extra_walk(node, source: bytes, file_nid: str, stem: str, str_path: s _RUBY_CONFIG = LanguageConfig( ts_module="tree_sitter_ruby", - class_types=frozenset({"class"}), + # `module Foo` is a container node just like `class Foo` in tree-sitter's + # Ruby grammar (name in a `constant` child, body in `body_statement`), so it + # gets a node and its methods attach via `method` (#1640). Without it, plain + # utility/`module_function` modules produced no node and their methods hung + # off the file via `contains` with dot-less labels. + class_types=frozenset({"class", "module"}), function_types=frozenset({"method", "singleton_method"}), import_types=frozenset(), call_types=frozenset({"call"}), @@ -3283,6 +3288,92 @@ def visit(n) -> None: return bindings +def _ruby_const_last_name(node, source: bytes) -> str: + """Last constant of a ``constant`` or ``scope_resolution`` (``A::B::C`` -> ``C``).""" + if node is None: + return "" + if node.type == "constant": + return _read_text(node, source) + if node.type == "scope_resolution": + consts = [c for c in node.children if c.type == "constant"] + if consts: + return _read_text(consts[-1], source) + return "" + + +# `Const = (...)` shapes that define a lightweight class named after the +# constant. tree-sitter parses each as an `assignment`, not a `class`, so the +# generic class branch never saw them (#1640). +_RUBY_CLASS_FACTORIES = frozenset({("Struct", "new"), ("Class", "new"), ("Data", "define")}) + + +def _ruby_extra_walk(node, source: bytes, file_nid: str, stem: str, str_path: str, + nodes: list, edges: list, seen_ids: set, function_bodies: list, + parent_class_nid: str | None, add_node, add_edge, walk, + callable_def_nids: set) -> bool: + """Ruby: a constant assignment whose RHS is ``Struct.new(...)``, + ``Class.new(Super)`` or ``Data.define(...)`` defines a class named after the + constant (#1640). Synthesize the class node, attach block-defined methods via + ``method`` (by recursing the block with the new node as parent), and emit an + ``inherits`` edge for ``Class.new(Super)``. Returns True if handled. + """ + if node.type != "assignment": + return False + left = node.child_by_field_name("left") + right = node.child_by_field_name("right") + if left is None or right is None or left.type != "constant" or right.type != "call": + return False + recv = right.child_by_field_name("receiver") + meth = right.child_by_field_name("method") + if recv is None or meth is None or recv.type != "constant": + return False + if (_read_text(recv, source), _read_text(meth, source)) not in _RUBY_CLASS_FACTORIES: + return False + + const_name = _read_text(left, source) + if not const_name: + return False + line = node.start_point[0] + 1 + class_nid = _make_id(stem, const_name) + add_node(class_nid, const_name, line) + callable_def_nids.add(class_nid) # a class is callable (its constructor) + # Mirror the generic class branch: containment always hangs off the file node. + add_edge(file_nid, class_nid, "contains", line) + + # `Class.new(Super)` — the first positional constant argument is the superclass. + if _read_text(recv, source) == "Class": + args = next((c for c in right.children if c.type == "argument_list"), None) + if args is not None: + for arg in args.children: + if arg.type in ("constant", "scope_resolution"): + base = _ruby_const_last_name(arg, source) + if base: + base_nid = _make_id(stem, base) + if base_nid not in seen_ids: + base_nid = _make_id(base) + if base_nid not in seen_ids: + nodes.append({ + "id": base_nid, "label": base, + "file_type": "code", "source_file": "", + "source_location": "", + }) + seen_ids.add(base_nid) + add_edge(class_nid, base_nid, "inherits", line) + break + + # Recurse the do/brace block so block-defined methods attach to the class. + # The block wraps its statements in a `body_statement` (like a class body); + # descend into it so the method handler sees parent_class_nid — otherwise the + # default recurse resets the parent to None and the method hangs off the file + # with a dot-less label. + block = next((c for c in right.children if c.type in ("do_block", "block")), None) + if block is not None: + body = next((c for c in block.children if c.type == "body_statement"), block) + for child in body.children: + walk(child, parent_class_nid=class_nid) + return True + + # ── Generic extractor ───────────────────────────────────────────────────────── def _extract_generic( @@ -4658,6 +4749,13 @@ def _emit_java_parent_type(type_node, rel: str, at_line: int) -> None: ensure_named_node): return + if config.ts_module == "tree_sitter_ruby": + if _ruby_extra_walk(node, source, file_nid, stem, str_path, + nodes, edges, seen_ids, function_bodies, + parent_class_nid, add_node, add_edge, walk, + callable_def_nids): + return + # Python's `@property` / `@staticmethod` / `@classmethod` wrap the # inner function_definition in a `decorated_definition` node. The # default recurse below clears parent_class_nid, which would cause the @@ -5042,6 +5140,11 @@ def walk_calls(node, caller_nid: str) -> None: is_member_call = True if recv.type in ("identifier", "constant"): member_receiver = _read_text(recv, source) + elif recv.type == "scope_resolution": + # Namespaced receiver `Billing::Processor.call` — capture the + # last constant so cross-file resolution can bind it by the + # bare class name (the god-node guard bails if ambiguous). + member_receiver = _ruby_const_last_name(recv, source) or None else: # Generic: get callee from call_function_field func_node = node.child_by_field_name(config.call_function_field) if config.call_function_field else None diff --git a/graphify/ruby_resolution.py b/graphify/ruby_resolution.py index d0e41dd33..5823ecf38 100644 --- a/graphify/ruby_resolution.py +++ b/graphify/ruby_resolution.py @@ -28,6 +28,13 @@ def _key(label: str) -> str: return re.sub(r"[^a-zA-Z0-9]+", "", str(label)).lower() +# A Ruby class/module container node is labelled with a bare constant +# (``Processor``, ``TaxCalculator``); methods end in ``()`` and files in ``.rb``. +# Lets us register method-less containers (a ``Class.new(StandardError)`` error +# class, an empty module) that have no `method` edge to be found by. +_BARE_CONST_RE = re.compile(r"^[A-Z][A-Za-z0-9_]*$") + + def _ruby_raw_calls(per_file: list[dict]) -> list[dict]: calls: list[dict] = [] for result in per_file: @@ -69,6 +76,15 @@ def resolve_ruby_member_calls( tnode = node_by_id.get(tgt) if tnode is not None: method_index[(str(src), _key(tnode.get("label", "")))] = str(tgt) + # Also register class/module container nodes that own no `method` edge — a + # method-less `Class.new(StandardError)` or an empty module — so a constant + # receiver still resolves to a real node (#1640/#1634). External base stubs + # carry an empty source_file, so the `.rb` filter keeps them out. + for n in all_nodes: + nid = n.get("id") + sf = str(n.get("source_file", "")) + if nid and sf.endswith(".rb") and _BARE_CONST_RE.match(str(n.get("label", ""))): + class_def_nids.setdefault(_key(n.get("label", "")), []).append(str(nid)) for k in list(class_def_nids): class_def_nids[k] = sorted(set(class_def_nids[k])) @@ -104,12 +120,24 @@ def _emit(caller: str, target: str, rc: dict[str, Any]) -> None: if not caller or not callee: continue - # `Processor.new` -> instantiation edge to the class. + # Constant receiver: `Processor.new` (instantiation) or `Service.call` / + # `Model.where` (singleton / class method). The bare method name would + # collide with unrelated same-named methods, so we resolve by the + # receiver's class under the single-owning-class god-node guard. receiver = rc.get("receiver") - if callee == "new" and receiver and str(receiver)[:1].isupper(): + if receiver and str(receiver)[:1].isupper(): class_nid = _unique_class(str(receiver)) if class_nid is not None: - _emit(caller, class_nid, rc) + if callee == "new": + _emit(caller, class_nid, rc) + else: + # Emit to the singleton/instance method the class owns + # (`def self.call`, which the extractor indexes); otherwise + # to the class node itself, so inherited/dynamic class methods + # like ActiveRecord `where`/`find_by` still give correct + # blast-radius. An ambiguous receiver bails to nothing. + method_nid = method_index.get((class_nid, _key(str(callee)))) + _emit(caller, method_nid or class_nid, rc) continue # `p.run` where p's type is known -> edge to that class's method. diff --git a/tests/test_ruby_resolution.py b/tests/test_ruby_resolution.py index d11b1cf8b..adc77577b 100644 --- a/tests/test_ruby_resolution.py +++ b/tests/test_ruby_resolution.py @@ -193,3 +193,100 @@ def test_class_new_creates_instantiation_edge(tmp_path: Path) -> None: edge = _has_call_edge(graph, "process_all", "Processor") assert edge is not None, "Processor.new should resolve a call to the Processor class" assert edge["confidence"] == "EXTRACTED" + + +# ── #1640 node extraction + #1634 constant-receiver resolution ─────────────── + + +def _node_labels(result: dict) -> set[str]: + return {str(n.get("label", "")) for n in result["nodes"]} + + +def _method_edges(result: dict) -> set[tuple[str, str]]: + labels = _labels(result["nodes"]) + return { + (labels.get(e["source"], ""), labels.get(e["target"], "")) + for e in result["edges"] if e.get("relation") == "method" + } + + +def test_plain_module_gets_a_node_with_methods(tmp_path: Path) -> None: + """#1640 shape 1: `module Foo` must get a node and own its methods.""" + r = extract_ruby(_write(tmp_path, "tax.rb", + "module TaxCalculator\n module_function\n def rate_for(order)\n 0.2\n end\nend\n")) + assert "TaxCalculator" in _node_labels(r) + # method attaches to the module (dot label), not the file (dot-less). + assert ("TaxCalculator", ".rate_for()") in _method_edges(r) + + +def test_nested_modules_each_get_a_node(tmp_path: Path) -> None: + """#1640 shape 1, nested.""" + r = extract_ruby(_write(tmp_path, "n.rb", + "module Billing\n module Rounding\n def round(x)\n x.round(2)\n end\n end\nend\n")) + labels = _node_labels(r) + assert "Billing" in labels and "Rounding" in labels + assert ("Rounding", ".round()") in _method_edges(r) + + +def test_struct_new_constant_creates_class_with_methods(tmp_path: Path) -> None: + """#1640 shape 2: `Foo = Struct.new(...) do ... end`.""" + r = extract_ruby(_write(tmp_path, "invoice.rb", + "Invoice = Struct.new(:total, :tax) do\n def grand_total\n total + tax\n end\nend\n")) + assert "Invoice" in _node_labels(r) + assert ("Invoice", ".grand_total()") in _method_edges(r) + + +def test_class_new_constant_creates_class_and_inherits(tmp_path: Path) -> None: + """#1640 shape 3: `Foo = Class.new(Super)` — node + inherits edge.""" + r = extract_ruby(_write(tmp_path, "err.rb", "ApiError = Class.new(StandardError)\n")) + assert "ApiError" in _node_labels(r) + labels = _labels(r["nodes"]) + inh = {(labels.get(e["source"], ""), labels.get(e["target"], "")) + for e in r["edges"] if e.get("relation") == "inherits"} + assert ("ApiError", "StandardError") in inh + + +def test_data_define_constant_creates_class(tmp_path: Path) -> None: + r = extract_ruby(_write(tmp_path, "res.rb", "Result = Data.define(:ok, :value)\n")) + assert "Result" in _node_labels(r) + + +def test_constant_receiver_singleton_call_resolves(tmp_path: Path) -> None: + """#1634: `Processor.call` (def self.call) resolves to the singleton method.""" + _write(tmp_path, "processor.rb", "class Processor\n def self.call; end\nend\n") + runner = _write(tmp_path, "runner.rb", + "class Runner\n def run\n Processor.call\n end\nend\n") + graph = extract([runner, tmp_path / "processor.rb"], cache_root=tmp_path, parallel=False) + assert _has_call_edge(graph, "run", "call") is not None + + +def test_constant_receiver_module_function_call_resolves(tmp_path: Path) -> None: + """#1634 + #1640: `TaxCalculator.rate_for` resolves across files to a + module_function — needs both the module node (#1640) and the resolver (#1634).""" + _write(tmp_path, "tax.rb", + "module TaxCalculator\n module_function\n def rate_for(o)\n 0.2\n end\nend\n") + pp = _write(tmp_path, "pp.rb", + "class PaymentProcessor\n def process(order)\n TaxCalculator.rate_for(order)\n end\nend\n") + graph = extract([pp, tmp_path / "tax.rb"], cache_root=tmp_path, parallel=False) + assert _has_call_edge(graph, "process", "rate_for") is not None + + +def test_constant_receiver_unknown_class_method_falls_back_to_class(tmp_path: Path) -> None: + """#1634: `Model.where` (no `where` def, e.g. ActiveRecord) still links to the + class node for blast-radius, rather than dropping the edge.""" + _write(tmp_path, "model.rb", "class Model\n def self.create; end\nend\n") + caller = _write(tmp_path, "svc.rb", + "class Svc\n def run\n Model.where(id: 1)\n end\nend\n") + graph = extract([caller, tmp_path / "model.rb"], cache_root=tmp_path, parallel=False) + # No `where` method node exists, so the edge lands on the class node itself. + assert _has_call_edge(graph, "run", "Model") is not None + + +def test_ambiguous_constant_receiver_emits_no_edge(tmp_path: Path) -> None: + """Two classes named `Processor` => ambiguous receiver => bail (no wrong edge).""" + _write(tmp_path, "a.rb", "module A\n class Processor\n def self.call; end\n end\nend\n") + _write(tmp_path, "b.rb", "module B\n class Processor\n def self.call; end\n end\nend\n") + caller = _write(tmp_path, "c.rb", + "class Runner\n def run\n Processor.call\n end\nend\n") + graph = extract([caller, tmp_path / "a.rb", tmp_path / "b.rb"], cache_root=tmp_path, parallel=False) + assert _has_call_edge(graph, "run", "call") is None From 29b3f9126d9347dcf40993f2f3c4101b1f3d4ab4 Mon Sep 17 00:00:00 2001 From: safishamsi Date: Sat, 4 Jul 2026 12:55:35 +0100 Subject: [PATCH 08/39] release: 0.9.6 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 19 fixes/features since 0.9.5. Highlights: - Ruby: module/Struct.new/Class.new/Data.define container nodes (#1640) and constant-receiver singleton-call resolution (#1634) — Rails/Zeitwerk graphs now get real cross-file edges. - Kill cross-language phantom imports_from edges from unresolved bare npm imports (#1638); harden semantic extraction against malformed LLM chunks (#1631); deterministic graph.json node/edge ordering for parallel semantic backends (#1632). - Contributor extractor fixes: Apex interface multiple inheritance (#1645), Kotlin `by` delegation (#1644). Co-Authored-By: Claude Opus 4.8 (1M context) --- CHANGELOG.md | 2 +- pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 19634a898..a5b7765e3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,7 @@ Full release notes with details on each version: [GitHub Releases](https://github.com/safishamsi/graphify/releases) -## Unreleased +## 0.9.6 (2026-07-04) - Fix: Ruby plain modules and `Struct.new` / `Class.new` / `Data.define` constant assignments now get container nodes (#1640, thanks @krishnateja7). The extractor only created nodes for `class Foo`, so `module Foo` (utility/`module_function` modules), `Foo = Struct.new(...) do ... end`, `Foo = Class.new(StandardError)`, and `Result = Data.define(...)` produced no node at all — their methods hung off the file via `contains` with dot-less labels, and no edge could ever target them. `module` is now a container type (methods attach via `method` like a class, nested modules included), and a constant assignment whose RHS is one of those factories synthesizes a class node named after the constant, attaches block-defined methods to it, and emits an `inherits` edge for `Class.new(Super)`. Plain constant assignments (`MAX = 100`, `X = Foo.new`) are untouched. - Fix: Ruby constant-receiver singleton calls now resolve cross-file (#1634, thanks @krishnateja7). `Service.call`, `Model.where`, `SomeJob.perform_async` — the dominant Rails idiom — emitted no `calls` edge, so with Zeitwerk autoloading (no `require`s) a Rails app had essentially no cross-file edges and `affected`/`path` came up empty. `resolve_ruby_member_calls` now handles a capitalized (constant) receiver with any callee: it binds to the class's singleton/instance method when one is owned (`def self.call`, which the extractor indexes), else to the class node itself so inherited/dynamic class methods (ActiveRecord `where`/`find_by`) still give correct blast-radius. Namespaced receivers (`Billing::Processor.call`) resolve by the bare class name. The single-owning-class god-node guard is kept throughout — an ambiguous receiver resolves to nothing rather than a wrong edge. diff --git a/pyproject.toml b/pyproject.toml index 876602bb9..30d2a6da5 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "graphifyy" -version = "0.9.5" +version = "0.9.6" description = "AI coding assistant skill (Claude Code, CodeBuddy, Codex, OpenCode, Kilo Code, Cursor, Gemini CLI, Aider, OpenClaw, Factory Droid, Trae, Hermes, Kiro, Pi, Devin CLI, Google Antigravity) - turn any folder of code, docs, papers, images, or videos into a queryable knowledge graph" readme = "README.md" license = { file = "LICENSE" } From 983da3c15f3eb31862bca4c9977ff5329a6b12d4 Mon Sep 17 00:00:00 2001 From: safishamsi Date: Sat, 4 Jul 2026 13:01:18 +0100 Subject: [PATCH 09/39] docs(readme): sync code-extension list with detect.py MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The "What files it handles" code row omitted several extensions that reuse existing tree-sitter grammars (so the grammar count is unchanged): `.mts`/`.cts` (TypeScript, #1607, new in 0.9.6), `.cc`/`.cxx` (C++), `.kts` (Kotlin), `.psd1` (PowerShell), `.toc` (Lua). Apex (`.cls`/`.trigger`) and Terraform already have their own rows. `.r`/`.ejs`/`.ets` are intentionally left out — they are in CODE_EXTENSIONS but have no registered extractor. Co-Authored-By: Claude Opus 4.8 (1M context) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index dbd8489a5..f2f31ce85 100644 --- a/README.md +++ b/README.md @@ -245,7 +245,7 @@ To remove graphify from all platforms at once: `graphify uninstall` (add `--purg | Type | Extensions | |------|-----------| -| Code (36 tree-sitter grammars) | `.py .ts .js .jsx .tsx .mjs .go .rs .java .c .cpp .h .hpp .cu .cuh .metal .rb .cs .kt .scala .php .swift .lua .luau .zig .ps1 .psm1 .ex .exs .m .mm .jl .vue .svelte .astro .groovy .gradle .dart .v .sv .svh .sql .f .f90 .f95 .f03 .f08 .pas .pp .dpr .dpk .lpr .inc .dfm .lfm .lpk .sh .bash .json .dm .dme .dmi .dmm .dmf .sln .slnx .csproj .fsproj .vbproj .xaml .razor .cshtml` (`.dm`/`.dme` requires `uv tool install graphifyy[dm]`; CUDA `.cu`/`.cuh` and Metal `.metal` reuse the C++ grammar) | +| Code (36 tree-sitter grammars) | `.py .ts .mts .cts .js .jsx .tsx .mjs .go .rs .java .c .cpp .cc .cxx .h .hpp .cu .cuh .metal .rb .cs .kt .kts .scala .php .swift .lua .luau .toc .zig .ps1 .psm1 .psd1 .ex .exs .m .mm .jl .vue .svelte .astro .groovy .gradle .dart .v .sv .svh .sql .f .f90 .f95 .f03 .f08 .pas .pp .dpr .dpk .lpr .inc .dfm .lfm .lpk .sh .bash .json .dm .dme .dmi .dmm .dmf .sln .slnx .csproj .fsproj .vbproj .xaml .razor .cshtml` (`.dm`/`.dme` requires `uv tool install graphifyy[dm]`; `.mts`/`.cts` reuse the TypeScript grammar, `.cc`/`.cxx` and CUDA `.cu`/`.cuh` and Metal `.metal` reuse the C++ grammar) | | Salesforce Apex | `.cls .trigger` (regex-based; classes, interfaces, enums, methods, triggers, SOQL/DML edges) | | Terraform / HCL | `.tf .tfvars .hcl` (requires `uv tool install graphifyy[terraform]`) | | MCP configs | `.mcp.json` `mcp.json` `mcp_servers.json` `claude_desktop_config.json` — extracts server nodes, package refs, env var requirements | From 62b8eb14162133ebe5b5338694570e3ca3d37677 Mon Sep 17 00:00:00 2001 From: safishamsi Date: Sat, 4 Jul 2026 21:22:39 +0100 Subject: [PATCH 10/39] fix(extract): gate JS/TS cross-file calls on import evidence to kill phantom cross-package edges (#1659) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When a callee had exactly one same-named definition repo-wide, the cross-file resolver emitted a `calls` edge at INFERRED/0.8 even with no import path between caller and callee. On a monorepo this fabricated dependencies: a 14-package repo showed `platform`/`sidecar` depending on `registry-protocol` purely because it exported generically-named symbols that unresolved calls collapsed onto. JS/TS modules have no implicit cross-module scope, so a cross-file call is real only if the caller imported it. Direct JS/TS cross-file `calls` attribution is now gated on import evidence and left unresolved otherwise. Scoped to direct calls: other languages keep the #1553 single-candidate resolution (C/C++ headers, Ruby autoload, same-package implicit scope), and the indirect_call path (already INFERRED + callable-gated) is untouched. Also hardens caller/candidate -> file mapping to resolve via the node's `source_file` string (identifying the file node by its basename label) instead of `relative_to(root.resolve())`, which threw on a path-resolution/symlink mismatch and fell back to a non-matching absolute id — spuriously failing import evidence. This both makes the new gate safe and fixes legitimate cross-file calls being mislabeled INFERRED instead of EXTRACTED. Full suite: 2898 passed, 3 skipped. Verified via CLI on the reporter's repro (phantom dropped) and a control (imported call resolves EXTRACTED). Co-Authored-By: Claude Opus 4.8 (1M context) --- CHANGELOG.md | 4 ++ graphify/extract.py | 48 ++++++++++++- tests/test_extract.py | 11 +-- tests/test_phantom_cross_package_call.py | 87 ++++++++++++++++++++++++ 4 files changed, 142 insertions(+), 8 deletions(-) create mode 100644 tests/test_phantom_cross_package_call.py diff --git a/CHANGELOG.md b/CHANGELOG.md index a5b7765e3..84db32d48 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,10 @@ Full release notes with details on each version: [GitHub Releases](https://github.com/safishamsi/graphify/releases) +## Unreleased + +- Fix: a JS/TS call with no local definition and no import no longer binds to a same-named export in an unrelated package (#1659, thanks @leonaburime-ucla). When a callee had exactly one same-named definition repo-wide, the cross-file resolver emitted a `calls` edge at INFERRED/0.8 even with no import path between the two files. On a monorepo this fabricated dependencies: a 14-package repo showed `platform` and `sidecar` depending on `registry-protocol` purely because it exported generically-named symbols (`*Schema`, etc.) that unresolved calls collapsed onto. JS/TS modules have no implicit cross-module scope, so a cross-file call is real only if the caller imported it — direct JS/TS cross-file `calls` attribution is now gated on import evidence and left unresolved otherwise. Other languages keep the single-candidate resolution (C/C++ headers, Ruby autoload, same-package implicit scope legitimately call across files without an explicit import), and the `indirect_call` path (already INFERRED and callable-gated) is unchanged. As part of the fix, caller→file mapping for import-evidence now uses the raw call's `source_file` string, so a path-resolution/symlink mismatch can no longer spuriously fail evidence and mislabel a real cross-file call. + ## 0.9.6 (2026-07-04) - Fix: Ruby plain modules and `Struct.new` / `Class.new` / `Data.define` constant assignments now get container nodes (#1640, thanks @krishnateja7). The extractor only created nodes for `class Foo`, so `module Foo` (utility/`module_function` modules), `Foo = Struct.new(...) do ... end`, `Foo = Class.new(StandardError)`, and `Result = Data.define(...)` produced no node at all — their methods hung off the file via `contains` with dot-less labels, and no edge could ever target them. `module` is now a container type (methods attach via `method` like a class, nested modules included), and a constant assignment whose RHS is one of those factories synthesizes a class node named after the constant, attaches block-defined methods to it, and emits an `inherits` edge for `Class.new(Super)`. Plain constant assignments (`MAX = 100`, `X = Foo.new`) are untouched. diff --git a/graphify/extract.py b/graphify/extract.py index 3f943e451..ab671543c 100644 --- a/graphify/extract.py +++ b/graphify/extract.py @@ -16344,9 +16344,20 @@ def extract( elif e.get("relation") == "imports_from": file_to_module_imports.setdefault(e["source"], set()).add(e["target"]) - # Map each node back to its containing file_id so we can ask + # Map each node back to its containing file node id so we can ask # "did the caller's file import the callee's file?" - # Use relativized paths to match how file node IDs were remapped above (#502). + # A node and its file node share the exact same ``source_file`` string, and a + # file node is the one whose label is the basename (``add_node(file_nid, + # path.name)``). Resolving file membership by that shared string is robust + # against the path-resolution/symlink mismatch that makes + # ``relative_to(root.resolve())`` throw and fall back to a non-matching + # absolute-derived id — which would spuriously fail import evidence and (with + # the #1659 JS/TS gate below) drop a legitimately-imported call. + sf_to_file_nid: dict[str, str] = {} + for n in all_nodes: + sf = n.get("source_file") + if sf and n.get("label") == Path(str(sf)).name: + sf_to_file_nid.setdefault(str(sf), n["id"]) nid_to_file_nid: dict[str, str] = {} # nid -> raw source_file string, for the ambiguous-name tie-breakers below # (test/non-test classification + path proximity). Kept separate from the @@ -16357,6 +16368,12 @@ def extract( if not sf: continue nid_to_source_file[n["id"]] = str(sf) + fnid = sf_to_file_nid.get(str(sf)) + if fnid is not None: + nid_to_file_nid[n["id"]] = fnid + continue + # Fallback (no file node found for this source_file): derive it the old + # way from the relativized path. sf_path = Path(sf) try: sf_rel = sf_path.relative_to(root) if sf_path.is_absolute() else sf_path @@ -16372,6 +16389,10 @@ def extract( (e["source"], e["target"]) for e in all_edges if e.get("relation") in ("calls", "indirect_call") } + # JS/TS/JSX modules have no implicit cross-module scope: a call into another + # file is real ONLY if the caller imported it. So a cross-file call from one + # of these files with no import evidence is gated below (#1659). + _JS_TS_CALL_SUFFIXES = (".ts", ".tsx", ".mts", ".cts", ".js", ".jsx", ".mjs", ".cjs") for rc in all_raw_calls: callee = rc.get("callee", "") if not callee: @@ -16392,7 +16413,15 @@ def extract( if not candidates: continue caller = rc["caller_nid"] - caller_file_nid = nid_to_file_nid.get(caller) + # Resolve the caller's file via the raw_call's own source_file string, + # which is stable regardless of any caller_nid remap. An indirect + # callback's caller_nid is the file node, whose id may have been + # relativized after the raw_call was recorded, so a caller_nid lookup can + # miss and (with the #1659 gate) drop a legitimately-imported callback. + caller_file_nid = ( + sf_to_file_nid.get(str(rc.get("source_file", ""))) + or nid_to_file_nid.get(caller) + ) imported_symbols = file_to_symbol_imports.get(caller_file_nid, set()) imported_modules = file_to_module_imports.get(caller_file_nid, set()) @@ -16469,6 +16498,19 @@ def _has_import_evidence(candidate_id: str) -> bool: "weight": 1.0, }) continue + # #1659: a JS/TS DIRECT call with no import evidence is almost always an + # unrelated same-named export in a package that was never imported — a + # phantom cross-package edge (a 14-package monorepo had `platform` and + # `sidecar` shown as depending on `registry-protocol` purely because it + # exported generically-named symbols). JS/TS modules have no implicit + # cross-module scope, so leave it unresolved rather than binding by name + # alone. Other languages keep the #1553 single-candidate resolution: + # C/C++ headers, Ruby autoload, and same-package implicit scope + # legitimately call across files without an explicit import. Scoped to + # direct calls: the indirect_call path above is already conservative + # (INFERRED, callable-target-gated) and independent of import evidence. + if not has_import_evidence and str(rc.get("source_file", "")).endswith(_JS_TS_CALL_SUFFIXES): + continue if tgt != caller and (caller, tgt) not in existing_pairs: existing_pairs.add((caller, tgt)) # Promote to EXTRACTED when there's a direct import edge from the diff --git a/tests/test_extract.py b/tests/test_extract.py index 528b6dbe2..38be9f679 100644 --- a/tests/test_extract.py +++ b/tests/test_extract.py @@ -879,9 +879,11 @@ def test_cross_file_call_promoted_to_extracted_with_import_evidence(tmp_path): assert call_edges[0]["confidence_score"] == 1.0 -def test_cross_file_call_remains_inferred_without_import_evidence(tmp_path): - """A cross-file `calls` edge must stay INFERRED when there is no import - edge — name collision alone is insufficient evidence.""" +def test_js_cross_file_call_without_import_emits_no_edge(tmp_path): + """A JS/TS call with no local definition and no import must NOT bind to a + same-named export in another file (#1659). JS/TS modules have no implicit + cross-module scope, so name collision alone is not a real call — it used to + produce a phantom INFERRED edge that fabricated cross-package dependencies.""" caller = tmp_path / "caller.js" callee = tmp_path / "lib.js" # Caller does NOT require lib — same-name function happens to exist elsewhere @@ -898,8 +900,7 @@ def test_cross_file_call_remains_inferred_without_import_evidence(tmp_path): and nodes[e["source"]]["label"] == "run()" and nodes[e["target"]]["label"] == "doUnique()" ] - assert len(call_edges) == 1 - assert call_edges[0]["confidence"] == "INFERRED" + assert call_edges == [], f"unimported cross-file JS call should not resolve: {call_edges}" def test_python_qualified_class_method_call_resolves_extracted(tmp_path): diff --git a/tests/test_phantom_cross_package_call.py b/tests/test_phantom_cross_package_call.py new file mode 100644 index 000000000..07fc89d4e --- /dev/null +++ b/tests/test_phantom_cross_package_call.py @@ -0,0 +1,87 @@ +"""#1659 — a JS/TS call with no local definition and no import must not bind to +a same-named export in an unrelated package that was never imported. + +JS/TS modules have no implicit cross-module scope: a call into another file is +real only if the caller imported it. The cross-file resolver used to fall back +to any lone same-named export repo-wide and emit a `calls` edge at INFERRED/0.8, +so on a monorepo a package that exports generically-named symbols (`*Schema`, +`validate`, ...) appeared depended-on by packages that import nothing from it. + +The fix gates JS/TS cross-file call attribution on import evidence; other +languages keep the #1553 single-candidate resolution (headers, autoload, +same-package implicit scope legitimately call across files with no import). +""" +from __future__ import annotations + +from pathlib import Path + +from graphify.extract import extract + + +def _write(path: Path, text: str) -> Path: + path.parent.mkdir(parents=True, exist_ok=True) + path.write_text(text, encoding="utf-8") + return path + + +def _calls(files: list[Path], base: Path) -> set[tuple[str, str, str]]: + r = extract(files, cache_root=base, parallel=False) + lbl = {n["id"]: n["label"] for n in r["nodes"]} + return { + (lbl.get(e["source"], ""), lbl.get(e["target"], ""), e.get("confidence")) + for e in r["edges"] if e["relation"] == "calls" + } + + +def test_unimported_cross_package_call_emits_no_edge(tmp_path: Path) -> None: + _write(tmp_path / "pkg-a/src/index.ts", + "declare function validate(x: number): boolean;\n" + "export function run(x: number): boolean { return validate(x); }\n") + _write(tmp_path / "pkg-b/src/index.ts", + "export function validate(name: string): boolean { return name.length > 0; }\n") + calls = _calls(sorted(tmp_path.rglob("*.ts")), tmp_path) + assert not any("run" in s and "validate" in t for s, t, _ in calls), calls + + +def test_many_files_do_not_collapse_onto_one_export(tmp_path: Path) -> None: + # The real-world symptom: N packages importing nothing all showed edges to a + # single package that exported a generically-named symbol. + _write(tmp_path / "proto/index.ts", + "export function encode(x: string): string { return x; }\n") + for i in range(4): + _write(tmp_path / f"svc{i}/index.ts", + "declare function encode(x: string): string;\n" + f"export function use{i}(x: string) {{ return encode(x); }}\n") + calls = _calls(sorted(tmp_path.rglob("*.ts")), tmp_path) + assert not any("encode" in t for _s, t, _ in calls), calls + + +def test_imported_cross_file_call_still_resolves(tmp_path: Path) -> None: + # A real import must still resolve (and be promoted to EXTRACTED). + _write(tmp_path / "a.ts", + 'import { validate } from "./b";\n' + "export function run(x: number) { return validate(x); }\n") + _write(tmp_path / "b.ts", + "export function validate(name: string): boolean { return name.length > 0; }\n") + calls = _calls([tmp_path / "a.ts", tmp_path / "b.ts"], tmp_path) + resolved = [c for c in calls if "run" in c[0] and "validate" in c[1]] + assert resolved, calls + assert resolved[0][2] == "EXTRACTED" + + +def test_same_file_call_unaffected(tmp_path: Path) -> None: + _write(tmp_path / "s.ts", + "function helper() { return 1; }\n" + "export function main() { return helper(); }\n") + calls = _calls([tmp_path / "s.ts"], tmp_path) + assert any("main" in s and "helper" in t for s, t, _ in calls), calls + + +def test_non_js_single_candidate_cross_file_still_resolves(tmp_path: Path) -> None: + # The gate is JS/TS-only. Ruby (autoload, no require) legitimately calls a + # lone same-named function across files without an import — keep the #1553 + # single-candidate resolution for it. + _write(tmp_path / "helper.rb", "def transform(data)\n data.upcase\nend\n") + _write(tmp_path / "main.rb", "def handle(v)\n transform(v)\nend\n") + calls = _calls([tmp_path / "main.rb", tmp_path / "helper.rb"], tmp_path) + assert any("handle" in s and "transform" in t for s, t, _ in calls), calls From f9174943a2aa3b39b84e151a540aaf6d510b4e43 Mon Sep 17 00:00:00 2001 From: safishamsi Date: Sat, 4 Jul 2026 22:12:47 +0100 Subject: [PATCH 11/39] fix(detect): incremental correctness for Office sources + long paths, cache word counts (#1649, #1655, #1656) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit #1649: detect_incremental tracks the converted markdown sidecar, and convert_office_file early-returned whenever the sidecar existed — so a .docx/ .xlsx edited after its first conversion never updated its sidecar and was reported "unchanged" forever, freezing the graph. It now re-converts when the source is newer than the sidecar (bumping the sidecar so the hash check catches it); an unchanged source still skips the rewrite (#1226). #1655: _md5_file/save_manifest/count_words used plain open()/stat(), which the Windows file APIs reject for absolute paths over 260 chars unless prefixed with `\\?\`. Deeply-nested files never hashed, their manifest entry never stabilized, and detect_incremental re-flagged them as changed every run. A new _os_path adds the extended-length prefix on win32 for change-detection I/O (mirror of cache._normalize_path, which strips it for keys). No-op elsewhere. #1656: detect() re-parsed every PDF/docx/text file to size the corpus on each run. Word counts are now memoized in the existing content-hash stat index (keyed by size + mtime_ns), so an unchanged file is parsed once. file_hash's fastpath is guarded so a word-count-only entry (no hash) can't KeyError, and both writers augment a co-located entry in place instead of clobbering the other's field. Full suite: 2906 passed, 3 skipped. Co-Authored-By: Claude Opus 4.8 (1M context) --- CHANGELOG.md | 3 ++ graphify/cache.py | 56 +++++++++++++++++++++++++- graphify/detect.py | 67 ++++++++++++++++++++++++++------ tests/test_long_path_hashing.py | 50 ++++++++++++++++++++++++ tests/test_office_incremental.py | 67 ++++++++++++++++++++++++++++++++ tests/test_word_count_cache.py | 52 +++++++++++++++++++++++++ 6 files changed, 282 insertions(+), 13 deletions(-) create mode 100644 tests/test_long_path_hashing.py create mode 100644 tests/test_office_incremental.py create mode 100644 tests/test_word_count_cache.py diff --git a/CHANGELOG.md b/CHANGELOG.md index 84db32d48..33fa21a2b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,9 @@ Full release notes with details on each version: [GitHub Releases](https://githu ## Unreleased +- Fix: a modified `.docx`/`.xlsx` now re-enters `--update` (#1649, thanks @Ns2384-star). `detect_incremental` tracks the converted markdown sidecar, and `convert_office_file` early-returned whenever the sidecar already existed — so an Office source edited after its first conversion never updated its sidecar and was reported "unchanged" forever, freezing the graph on a living docs corpus. The sidecar is now re-converted when the source is newer than it (which bumps the sidecar's mtime/content so the incremental hash check picks it up); an unchanged source still skips the rewrite so it never churns (#1226). +- Fix: files whose absolute path exceeds Windows' 260-char limit are now hashed (#1655, thanks @Ns2384-star). `_md5_file`/`save_manifest`/`count_words` used plain `open()`/`stat()`, which the Windows file APIs reject for long paths unless prefixed with the extended-length marker `\\?\` — so deeply-nested files (accented, deep folders) never hashed, their manifest entry never stabilized, and `detect_incremental` re-flagged them as changed on every run. Change-detection I/O now prefixes long absolute paths on win32 (mirroring the normalization `cache.py` already applied to cache keys). No-op on other platforms. +- Perf: word counts are cached against each file's stat signature (#1656, thanks @Ns2384-star). `detect()` counted words in every PDF/docx/text file to size the corpus, re-opening and re-parsing every binary on each run — minutes on a large docs corpus even when only a few files changed. Counts are now memoized in the existing content-hash stat index (keyed by size + mtime), so an unchanged file is parsed once and read from the index thereafter; incremental detection drops from O(corpus) parsing to O(changed). - Fix: a JS/TS call with no local definition and no import no longer binds to a same-named export in an unrelated package (#1659, thanks @leonaburime-ucla). When a callee had exactly one same-named definition repo-wide, the cross-file resolver emitted a `calls` edge at INFERRED/0.8 even with no import path between the two files. On a monorepo this fabricated dependencies: a 14-package repo showed `platform` and `sidecar` depending on `registry-protocol` purely because it exported generically-named symbols (`*Schema`, etc.) that unresolved calls collapsed onto. JS/TS modules have no implicit cross-module scope, so a cross-file call is real only if the caller imported it — direct JS/TS cross-file `calls` attribution is now gated on import evidence and left unresolved otherwise. Other languages keep the single-candidate resolution (C/C++ headers, Ruby autoload, same-package implicit scope legitimately call across files without an explicit import), and the `indirect_call` path (already INFERRED and callable-gated) is unchanged. As part of the fix, caller→file mapping for import-evidence now uses the raw call's `source_file` string, so a path-resolution/symlink mismatch can no longer spuriously fail evidence and mislabel a real cross-file call. ## 0.9.6 (2026-07-04) diff --git a/graphify/cache.py b/graphify/cache.py index f377889ff..bb3f9d593 100644 --- a/graphify/cache.py +++ b/graphify/cache.py @@ -180,6 +180,7 @@ def file_hash(path: Path, root: Path = Path(".")) -> str: st = p.stat() entry = _stat_index.get(abs_key) if (entry + and entry.get("hash") is not None # word-count-only entries carry no hash and entry.get("size") == st.st_size and entry.get("mtime_ns") == st.st_mtime_ns): return entry["hash"] @@ -199,12 +200,65 @@ def file_hash(path: Path, root: Path = Path(".")) -> str: digest = h.hexdigest() if st is not None: - _stat_index[abs_key] = {"size": st.st_size, "mtime_ns": st.st_mtime_ns, "hash": digest} + entry = _stat_index.get(abs_key) + if (entry is not None + and entry.get("size") == st.st_size + and entry.get("mtime_ns") == st.st_mtime_ns): + entry["hash"] = digest # preserve a co-located word_count + else: + _stat_index[abs_key] = {"size": st.st_size, "mtime_ns": st.st_mtime_ns, "hash": digest} _stat_index_dirty = True return digest +def cached_word_count(path: Path, root: Path, compute) -> int: + """Word count with the same (size, mtime_ns) stat-fastpath cache as + :func:`file_hash`, persisted in the shared stat index. + + ``detect()`` counts words in every PDF/docx/text file to size the corpus, + which re-opens and re-parses every binary on each run — minutes on a large + docs corpus even when only a handful of files changed (#1656). This caches + the count against the file's stat signature so an unchanged file is counted + once and read from the index thereafter. ``compute(path)`` produces the + count on a miss. A file that can't be stat'd (e.g. a Windows long path the + index normalization can't reach) simply recomputes and isn't cached — + correct, just not accelerated. + """ + global _stat_index_dirty + p = _normalize_path(Path(path)) + root = _normalize_path(Path(root)) + _ensure_stat_index(root) + abs_key = str(p.resolve()) + st: "os.stat_result | None" = None + try: + st = p.stat() + entry = _stat_index.get(abs_key) + if (entry + and entry.get("size") == st.st_size + and entry.get("mtime_ns") == st.st_mtime_ns + and "word_count" in entry): + return entry["word_count"] + except OSError: + pass + + wc = compute(Path(path)) + + if st is not None: + entry = _stat_index.get(abs_key) + if (entry + and entry.get("size") == st.st_size + and entry.get("mtime_ns") == st.st_mtime_ns): + entry["word_count"] = wc # augment the existing hash entry in place + else: + _stat_index[abs_key] = { + "size": st.st_size, "mtime_ns": st.st_mtime_ns, "word_count": wc, + } + _stat_index_dirty = True + + return wc + + def _relativize_source_files_in(payload: dict, root: Path) -> None: """Mutate ``payload`` to rewrite absolute ``source_file`` fields as forward-slash relative paths from ``root``. diff --git a/graphify/detect.py b/graphify/detect.py index 0e1c4ba30..080dab813 100644 --- a/graphify/detect.py +++ b/graphify/detect.py @@ -630,11 +630,19 @@ def convert_office_file(path: Path, out_dir: Path) -> Path | None: normalized_path = unicodedata.normalize("NFC", str(path.resolve())) name_hash = hashlib.sha256(normalized_path.encode()).hexdigest()[:8] out_path = out_dir / f"{path.stem}_{name_hash}.md" - # Once the hash is stable the sidecar name is deterministic; skip re-writing - # an existing sidecar so an unchanged source never churns its mtime (which - # would still flag it as changed in detect_incremental). - if out_path.exists(): - return out_path + # Skip re-writing only when the sidecar is present AND at least as new as the + # source. detect_incremental tracks the SIDECAR (not the Office source), so a + # sidecar that is never rewritten after the source changes leaves the doc + # reported "unchanged" forever and freezes the graph (#1649). Re-converting + # when the source is newer bumps the sidecar's mtime/content, which the + # incremental hash check then correctly picks up. An unchanged source keeps + # its (newer-or-equal) sidecar untouched so it never churns (#1226). + try: + if out_path.exists() and os.stat(_os_path(out_path)).st_mtime >= os.stat(_os_path(path)).st_mtime: + return out_path + except OSError: + if out_path.exists(): + return out_path out_path.write_text( f"\n\n{text}", encoding="utf-8", @@ -651,7 +659,8 @@ def count_words(path: Path) -> int: return len(docx_to_markdown(path).split()) if ext == ".xlsx": return len(xlsx_to_markdown(path).split()) - return len(path.read_text(encoding="utf-8", errors="ignore").split()) + with open(_os_path(path), encoding="utf-8", errors="ignore") as f: + return len(f.read().split()) except Exception: return 0 @@ -1029,6 +1038,12 @@ def detect(root: Path, *, follow_symlinks: bool | None = None, google_workspace: } total_words = 0 + def _wc(path: Path) -> int: + # Cache word counts against each file's stat signature so unchanged + # PDFs/docx aren't re-parsed on every run just to size the corpus (#1656). + from graphify import cache as _cache + return _cache.cached_word_count(path, root, count_words) + skipped_sensitive: list[str] = [] ignore_patterns = _load_graphifyignore(root) ignore_cache: dict[Path, bool] = {} # shared across all _is_ignored calls in this scan @@ -1133,7 +1148,7 @@ def detect(root: Path, *, follow_symlinks: bool | None = None, google_workspace: if _is_ignored(md_path, root, ignore_patterns, _cache=ignore_cache): continue files[ftype].append(str(md_path)) - total_words += count_words(md_path) + total_words += _wc(md_path) else: skipped_sensitive.append(str(p) + " [Google Workspace export produced no readable text]") continue @@ -1144,14 +1159,14 @@ def detect(root: Path, *, follow_symlinks: bool | None = None, google_workspace: if _is_ignored(md_path, root, ignore_patterns, _cache=ignore_cache): continue files[ftype].append(str(md_path)) - total_words += count_words(md_path) + total_words += _wc(md_path) else: # Conversion failed (library not installed) - skip with note skipped_sensitive.append(str(p) + " [office conversion failed - pip install graphifyy[office]]") continue files[ftype].append(str(p)) if ftype != FileType.VIDEO: - total_words += count_words(p) + total_words += _wc(p) for ftype in files: files[ftype].sort() @@ -1185,12 +1200,40 @@ def detect(root: Path, *, follow_symlinks: bool | None = None, google_workspace: } +def _os_path(path: Path) -> str: + r"""Return an OS path string safe for open()/stat() on Windows long paths. + + On win32, paths longer than the legacy MAX_PATH (260 chars) are rejected by + the plain file APIs unless prefixed with the extended-length marker ``\\?\`` + (which also requires a fully-qualified path). Without it, _md5_file / + save_manifest / count_words silently fail to hash deeply-nested files, so + their manifest entry never stabilizes and detect_incremental re-flags them + as changed on every run (#1655). cache._normalize_path strips this prefix + for stable KEYS; this adds it for I/O. Non-win32 and already-prefixed paths + pass through unchanged. + """ + import sys + if sys.platform != "win32": + return str(path) + s = str(path) + if s.startswith("\\\\?\\"): + return s + try: + s = os.path.abspath(s) # \\?\ requires a fully-qualified path + except Exception: + return str(path) + if s.startswith("\\\\"): + # UNC share \\server\share -> \\?\UNC\server\share + return "\\\\?\\UNC\\" + s[2:] + return "\\\\?\\" + s + + def _md5_file(path: Path) -> str: """MD5 of file contents streamed in 64KB chunks — for change detection only.""" import hashlib as _hl h = _hl.md5(usedforsecurity=False) try: - with path.open("rb") as f: + with open(_os_path(path), "rb") as f: for chunk in iter(lambda: f.read(65536), b""): h.update(chunk) except OSError: @@ -1202,7 +1245,7 @@ def _stat_and_hash(path_str: str) -> tuple[str, float, str] | None: """Stat + MD5 a single file; returns None on OSError (e.g. deleted mid-run).""" try: p = Path(path_str) - return path_str, p.stat().st_mtime, _md5_file(p) + return path_str, os.stat(_os_path(p)).st_mtime, _md5_file(p) except OSError: return None @@ -1407,7 +1450,7 @@ def detect_incremental( for f in file_list: stored = manifest.get(f) try: - current_mtime = Path(f).stat().st_mtime + current_mtime = os.stat(_os_path(Path(f))).st_mtime except Exception: current_mtime = 0 diff --git a/tests/test_long_path_hashing.py b/tests/test_long_path_hashing.py new file mode 100644 index 000000000..8e4b3bd1a --- /dev/null +++ b/tests/test_long_path_hashing.py @@ -0,0 +1,50 @@ +r"""#1655 — files whose absolute path exceeds Windows MAX_PATH (260) must still +be hashed, or their manifest entry never stabilizes and detect_incremental +re-flags them as changed on every run. + +The plain file APIs reject long paths on win32 unless prefixed with the +extended-length marker `\\?\`. _os_path adds it (for I/O), the mirror of +cache._normalize_path which strips it (for stable keys). +""" +from __future__ import annotations + +from pathlib import Path + +from graphify import detect + + +def test_os_path_noop_on_posix(monkeypatch): + monkeypatch.setattr("sys.platform", "linux") + p = Path("/home/user/deep/file.py") + assert detect._os_path(p) == str(p) + + +def test_os_path_adds_prefix_on_win32(monkeypatch): + monkeypatch.setattr("sys.platform", "win32") + # os.path.abspath is posix here, so exercise the already-qualified branch: + # a value that abspath leaves intact still gets the prefix. + out = detect._os_path(Path("/already/abs/file.py")) + assert out.startswith("\\\\?\\") + + +def test_os_path_idempotent_on_win32(monkeypatch): + monkeypatch.setattr("sys.platform", "win32") + already = "\\\\?\\C:\\a\\file.py" + assert detect._os_path(Path(already)) == already + + +def test_hashing_still_works_and_stabilizes(tmp_path): + # End-to-end (posix): a hashed file must produce a stable, non-empty hash so + # its manifest entry doesn't churn. Guards against the _os_path indirection + # breaking normal hashing. + f = tmp_path / "deep" / "nested" / "module.py" + f.parent.mkdir(parents=True) + f.write_text("def x():\n return 1\n") + h1 = detect._md5_file(f) + h2 = detect._md5_file(f) + assert h1 and h1 == h2 + + got = detect._stat_and_hash(str(f)) + assert got is not None + assert got[0] == str(f) + assert got[2] == h1 diff --git a/tests/test_office_incremental.py b/tests/test_office_incremental.py new file mode 100644 index 000000000..19d8ec50d --- /dev/null +++ b/tests/test_office_incremental.py @@ -0,0 +1,67 @@ +"""#1649 — a modified .docx/.xlsx must re-enter --update. + +detect_incremental tracks the converted markdown SIDECAR, not the Office +source. convert_office_file used to early-return whenever the sidecar existed, +so a source edited after its first conversion never updated its sidecar and was +reported "unchanged" forever. It now re-converts when the source is newer than +the sidecar (and still skips an unchanged source so it never churns, #1226). +""" +from __future__ import annotations + +import os +from pathlib import Path + +import pytest + +from graphify import detect + +docx = pytest.importorskip("docx") + + +def _make_docx(path: Path, text: str) -> None: + d = docx.Document() + d.add_paragraph(text) + d.save(str(path)) + + +def _bump_mtime(path: Path, offset: float) -> None: + """Set path's mtime relative to now so ordering is deterministic.""" + st = path.stat() + os.utime(path, (st.st_atime, st.st_mtime + offset)) + + +def test_modified_docx_reconverts_sidecar(tmp_path: Path): + src = tmp_path / "doc.docx" + out = tmp_path / "converted" + _make_docx(src, "original alpha content") + + sidecar = detect.convert_office_file(src, out) + assert sidecar is not None + assert "original alpha content" in sidecar.read_text(encoding="utf-8") + + # Edit the source and make it newer than the sidecar. + _make_docx(src, "revised beta content") + _bump_mtime(sidecar, -10) # sidecar older than the freshly-written source + + sidecar2 = detect.convert_office_file(src, out) + assert sidecar2 == sidecar # same deterministic name + body = sidecar2.read_text(encoding="utf-8") + assert "revised beta content" in body + assert "original alpha content" not in body + + +def test_unchanged_docx_sidecar_not_rewritten(tmp_path: Path): + src = tmp_path / "doc.docx" + out = tmp_path / "converted" + _make_docx(src, "stable content") + + sidecar = detect.convert_office_file(src, out) + assert sidecar is not None + # Make the sidecar clearly newer than the (unchanged) source. + _bump_mtime(sidecar, 100) + before = sidecar.stat().st_mtime + + sidecar2 = detect.convert_office_file(src, out) + assert sidecar2 == sidecar + # Not rewritten: mtime unchanged, so detect_incremental won't see churn (#1226). + assert sidecar2.stat().st_mtime == before diff --git a/tests/test_word_count_cache.py b/tests/test_word_count_cache.py new file mode 100644 index 000000000..75bbb8392 --- /dev/null +++ b/tests/test_word_count_cache.py @@ -0,0 +1,52 @@ +"""#1656 — word counts are cached against each file's stat signature so +detect() doesn't re-parse every unchanged PDF/docx on each run just to size +the corpus. +""" +from __future__ import annotations + +from pathlib import Path + +from graphify import cache + + +def test_word_count_cached_until_file_changes(tmp_path, monkeypatch): + # Isolate the stat index to this tmp root. + monkeypatch.setattr(cache, "_stat_index", {}) + monkeypatch.setattr(cache, "_stat_index_root", None) + + f = tmp_path / "doc.txt" + f.write_text("one two three four five") + + calls = {"n": 0} + def compute(p: Path) -> int: + calls["n"] += 1 + return len(p.read_text().split()) + + assert cache.cached_word_count(f, tmp_path, compute) == 5 + assert calls["n"] == 1 + # Second call, file unchanged → served from cache, compute NOT re-run. + assert cache.cached_word_count(f, tmp_path, compute) == 5 + assert calls["n"] == 1 + + # Change the file → recompute. + f.write_text("only three words now") # 4 words + assert cache.cached_word_count(f, tmp_path, compute) == 4 + assert calls["n"] == 2 + + +def test_word_count_augments_existing_hash_entry(tmp_path, monkeypatch): + # cached_word_count must not clobber a hash already stored for the file. + monkeypatch.setattr(cache, "_stat_index", {}) + monkeypatch.setattr(cache, "_stat_index_root", None) + + f = tmp_path / "m.py" + f.write_text("x = 1\n") # -> ["x", "=", "1"] == 3 tokens + h = cache.file_hash(f, tmp_path) + assert h + wc = cache.cached_word_count(f, tmp_path, lambda p: len(p.read_text().split())) + assert wc == 3 + # The hash entry survives alongside the word_count. + assert cache.file_hash(f, tmp_path) == h + key = str(cache._normalize_path(f).resolve()) + entry = cache._stat_index[key] + assert entry.get("hash") == h and entry.get("word_count") == 3 From 54825b6a1ca03f70ff68b8e17b670ffa56978d07 Mon Sep 17 00:00:00 2001 From: safishamsi Date: Sat, 4 Jul 2026 22:43:31 +0100 Subject: [PATCH 12/39] fix: windows skill name, opencode plugin separator, doc-corpus report noise (#1635, #1646, #1657) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit #1635: the windows skill variant declared `name: graphify-windows`, but `graphify install --platform windows` writes it to ~/.claude/skills/graphify/ SKILL.md and Claude Code requires the folder name to equal the frontmatter `name` — the suffix broke discovery. platforms.toml now sets name = "graphify" (regenerated + re-blessed). #1646: the OpenCode (and Kilo) plugin prepended its reminder with `&&`, which Windows PowerShell 5.1 rejects as a statement separator, breaking the first bash command of every session. Switched to `;` (valid in PowerShell 5.1, Bash, POSIX). #1657: the GRAPH_REPORT.md "Import Cycles" section printed "None detected" on documents-only corpora where imports don't exist — now gated on code nodes / import edges being present. The other two items in that issue (mojibake in manifest/report, stdout encoding) are already handled on current v8: both files are written UTF-8 and main() reconfigures stdout/stderr to UTF-8. Full suite: 2909 passed, 3 skipped. Co-Authored-By: Claude Opus 4.8 (1M context) --- CHANGELOG.md | 3 ++ graphify/__main__.py | 10 ++++- graphify/report.py | 38 ++++++++++++------- graphify/skill-windows.md | 2 +- tests/test_install.py | 12 ++++++ tests/test_report.py | 30 +++++++++++++++ tests/test_skillgen.py | 7 +++- .../expected/graphify__skill-windows.md | 2 +- tools/skillgen/platforms.toml | 8 +++- 9 files changed, 90 insertions(+), 22 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 33fa21a2b..0006c4f46 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,9 @@ Full release notes with details on each version: [GitHub Releases](https://githu ## Unreleased +- Fix: the Windows skill variant now declares `name: graphify` instead of `name: graphify-windows` (#1635, thanks @ray8875). `graphify install --platform windows` writes the variant to `~/.claude/skills/graphify/SKILL.md`, but Claude Code requires the skill folder name to equal the frontmatter `name`, so the `-windows` suffix broke discovery/validation. The variant suffix is a packaging detail, not part of the skill's identity. +- Fix: the OpenCode plugin joins its reminder to the user's command with `;` instead of `&&` (#1646, thanks @gonaik). Windows PowerShell 5.1 rejects `&&` as a statement separator (`not a valid statement separator`), so the first bash command of every OpenCode session on Windows failed. `;` works in PowerShell 5.1, Bash, and POSIX shells. (Both the OpenCode and Kilo plugin templates are fixed.) +- Fix: the `GRAPH_REPORT.md` "Import Cycles" section is now emitted only when the graph contains code (#1657, thanks @Ns2384-star). On a documents-only corpus there are no imports, so the section was pure noise ("None detected") on every run; it is now conditioned on code nodes or import edges being present. (The same report also confirms the mojibake and stdout-encoding items in that issue are already addressed on the current branch: manifest.json and `GRAPH_REPORT.md` are written UTF-8, and the CLI reconfigures stdout/stderr to UTF-8 with `errors="replace"`.) - Fix: a modified `.docx`/`.xlsx` now re-enters `--update` (#1649, thanks @Ns2384-star). `detect_incremental` tracks the converted markdown sidecar, and `convert_office_file` early-returned whenever the sidecar already existed — so an Office source edited after its first conversion never updated its sidecar and was reported "unchanged" forever, freezing the graph on a living docs corpus. The sidecar is now re-converted when the source is newer than it (which bumps the sidecar's mtime/content so the incremental hash check picks it up); an unchanged source still skips the rewrite so it never churns (#1226). - Fix: files whose absolute path exceeds Windows' 260-char limit are now hashed (#1655, thanks @Ns2384-star). `_md5_file`/`save_manifest`/`count_words` used plain `open()`/`stat()`, which the Windows file APIs reject for long paths unless prefixed with the extended-length marker `\\?\` — so deeply-nested files (accented, deep folders) never hashed, their manifest entry never stabilized, and `detect_incremental` re-flagged them as changed on every run. Change-detection I/O now prefixes long absolute paths on win32 (mirroring the normalization `cache.py` already applied to cache keys). No-op on other platforms. - Perf: word counts are cached against each file's stat signature (#1656, thanks @Ns2384-star). `detect()` counted words in every PDF/docx/text file to size the corpus, re-opening and re-parsing every binary on each run — minutes on a large docs corpus even when only a few files changed. Counts are now memoized in the existing content-hash stat index (keyed by size + mtime), so an unchanged file is parsed once and read from the index thereafter; incremental detection drops from O(corpus) parsing to O(changed). diff --git a/graphify/__main__.py b/graphify/__main__.py index 59dcd70a5..e620d97a5 100644 --- a/graphify/__main__.py +++ b/graphify/__main__.py @@ -1325,8 +1325,12 @@ def _devin_rules_uninstall(project_dir: Path) -> None: if (!existsSync(join(directory, "graphify-out", "graph.json"))) return; if (input.tool === "bash") { + // Separate with ';' not '&&' — Windows PowerShell 5.1 rejects '&&' as a + // statement separator ("not a valid statement separator"), which broke + // the first bash command in every OpenCode session on Windows (#1646). + // ';' works in PowerShell 5.1, Bash, and POSIX shells alike. output.args.command = - 'echo "[graphify] Knowledge graph available. Read graphify-out/GRAPH_REPORT.md for god nodes and architecture context before searching files." && ' + + 'echo "[graphify] Knowledge graph available. Read graphify-out/GRAPH_REPORT.md for god nodes and architecture context before searching files." ; ' + output.args.command; reminded = true; } @@ -1502,8 +1506,10 @@ def _uninstall_kilo_plugin(project_dir: Path) -> None: if (!existsSync(join(directory, "graphify-out", "graph.json"))) return; if (input.tool === "bash") { + // ';' not '&&' — Windows PowerShell 5.1 rejects '&&' as a statement + // separator, breaking the first bash command of the session (#1646). output.args.command = - 'echo "[graphify] knowledge graph at graphify-out/. For focused questions, run graphify query with your question (scoped subgraph, usually much smaller than GRAPH_REPORT.md) instead of grepping raw files. Read GRAPH_REPORT.md only for broad architecture context." && ' + + 'echo "[graphify] knowledge graph at graphify-out/. For focused questions, run graphify query with your question (scoped subgraph, usually much smaller than GRAPH_REPORT.md) instead of grepping raw files. Read GRAPH_REPORT.md only for broad architecture context." ; ' + output.args.command; reminded = true; } diff --git a/graphify/report.py b/graphify/report.py index 1a1d9a365..5bac06d05 100644 --- a/graphify/report.py +++ b/graphify/report.py @@ -176,20 +176,30 @@ def generate( else: lines.append("- None detected - all connections are within the same source files.") - # Circular imports surfaced from file-level dependency graph. - from .analyze import find_import_cycles - cycles = find_import_cycles(G) - lines += ["", "## Import Cycles"] - if cycles: - for c in cycles: - cycle = c.get("cycle", []) - length = c.get("length", len(cycle)) - if not cycle: - continue - cycle_path = " -> ".join(cycle + [cycle[0]]) - lines.append(f"- {length}-file cycle: `{cycle_path}`") - else: - lines.append("- None detected.") + # Circular imports surfaced from file-level dependency graph. Only meaningful + # for code — a documents-only corpus has no imports, so the section is pure + # noise there ("None detected" on every run). Emit it only when the graph + # actually contains code (#1657). + _has_code = any( + d.get("file_type") == "code" for _, d in G.nodes(data=True) + ) or any( + d.get("relation") in ("imports", "imports_from") + for *_e, d in G.edges(data=True) + ) + if _has_code: + from .analyze import find_import_cycles + cycles = find_import_cycles(G) + lines += ["", "## Import Cycles"] + if cycles: + for c in cycles: + cycle = c.get("cycle", []) + length = c.get("length", len(cycle)) + if not cycle: + continue + cycle_path = " -> ".join(cycle + [cycle[0]]) + lines.append(f"- {length}-file cycle: `{cycle_path}`") + else: + lines.append("- None detected.") hyperedges = G.graph.get("hyperedges", []) if hyperedges: diff --git a/graphify/skill-windows.md b/graphify/skill-windows.md index 6ab0e027c..5a55c577b 100644 --- a/graphify/skill-windows.md +++ b/graphify/skill-windows.md @@ -1,5 +1,5 @@ --- -name: graphify-windows +name: graphify description: "Use for any question about a codebase, its architecture, file relationships, or project content — especially when graphify-out/ exists, where the question should be treated as a graphify query first. Turns any input (code, docs, papers, images, videos) into a persistent knowledge graph with god nodes, community detection, and query/path/explain tools." --- diff --git a/tests/test_install.py b/tests/test_install.py index fc2c1657d..fc1a4e90b 100644 --- a/tests/test_install.py +++ b/tests/test_install.py @@ -621,6 +621,18 @@ def test_opencode_plugin_reminder_has_no_backticks(tmp_path): assert "$(" not in reminder, f"$() in reminder would trigger command substitution: {reminder!r}" +def test_opencode_plugin_uses_semicolon_not_ampersand(tmp_path): + """The reminder must be joined to the user's command with ';', not '&&' + (#1646). Windows PowerShell 5.1 rejects '&&' as a statement separator, which + broke the first bash command of every OpenCode session on Windows. ';' works + in PowerShell 5.1, Bash, and POSIX shells.""" + _agents_install(tmp_path, "opencode") + body = (tmp_path / ".opencode" / "plugins" / "graphify.js").read_text() + # The prepend line ends with the separator before `' +`. + assert '" ; \' +' in body or '." ; \' +' in body, "reminder should join with ';'" + assert '" && \' +' not in body, "'&&' breaks PowerShell 5.1 (#1646)" + + def test_opencode_agents_install_registers_plugin_in_config(tmp_path): """opencode install registers the plugin in .opencode/opencode.json.""" _agents_install(tmp_path, "opencode") diff --git a/tests/test_report.py b/tests/test_report.py index d8c4ad4fd..00be0f36d 100644 --- a/tests/test_report.py +++ b/tests/test_report.py @@ -105,3 +105,33 @@ def test_report_work_memory_section_absent_without_overlay(): tokens, "./project", learning={"overlay": {}, "dead_ends": []}) assert "## Work-memory lessons" not in empty assert before == empty + + +def test_import_cycles_section_present_for_code_corpus(): + # #1657: the fixture is a code corpus, so the Import Cycles section shows. + G, communities, cohesion, labels, gods, surprises, detection, tokens = make_inputs() + report = generate(G, communities, cohesion, labels, gods, surprises, detection, tokens, "./project") + assert "## Import Cycles" in report + + +def test_import_cycles_section_absent_for_documents_only_corpus(): + # #1657: a documents-only corpus has no imports; the section is pure noise + # ("None detected") and must be suppressed. + extraction = { + "nodes": [ + {"id": "d1", "label": "intro.md", "file_type": "document"}, + {"id": "d2", "label": "guide.md", "file_type": "document"}, + ], + "edges": [{"source": "d1", "target": "d2", "relation": "references"}], + "input_tokens": 0, "output_tokens": 0, + } + G = build_from_json(extraction) + communities = cluster(G) + cohesion = score_all(G, communities) + labels = {cid: f"Community {cid}" for cid in communities} + gods = god_nodes(G) + surprises = surprising_connections(G) + detection = {"total_files": 2, "total_words": 100, "needs_graph": True, "warning": None} + tokens = {"input": 0, "output": 0} + report = generate(G, communities, cohesion, labels, gods, surprises, detection, tokens, "./project") + assert "## Import Cycles" not in report diff --git a/tests/test_skillgen.py b/tests/test_skillgen.py index be404c641..282aedfbf 100644 --- a/tests/test_skillgen.py +++ b/tests/test_skillgen.py @@ -285,9 +285,12 @@ def test_descriptions_are_unified(): def test_windows_frontmatter_name_and_shell_and_extra(): - """windows: graphify-windows name, powershell install, troubleshooting tail.""" + """windows: name must be `graphify` (folder-name rule, #1635), powershell + install, troubleshooting tail.""" core, _ = _platform_artifacts("windows") - assert core.startswith("---\nname: graphify-windows\n") + # Claude Code requires the frontmatter name to equal the install folder + # (graphify); a `graphify-windows` name broke skill discovery (#1635). + assert core.startswith("---\nname: graphify\n") assert "```powershell" in core assert "function Find-GraphifyPython" in core assert "## Troubleshooting" in core diff --git a/tools/skillgen/expected/graphify__skill-windows.md b/tools/skillgen/expected/graphify__skill-windows.md index 6ab0e027c..5a55c577b 100644 --- a/tools/skillgen/expected/graphify__skill-windows.md +++ b/tools/skillgen/expected/graphify__skill-windows.md @@ -1,5 +1,5 @@ --- -name: graphify-windows +name: graphify description: "Use for any question about a codebase, its architecture, file relationships, or project content — especially when graphify-out/ exists, where the question should be treated as a graphify query first. Turns any input (code, docs, papers, images, videos) into a persistent knowledge graph with god nodes, community detection, and query/path/explain tools." --- diff --git a/tools/skillgen/platforms.toml b/tools/skillgen/platforms.toml index d33a8c825..0856d2269 100644 --- a/tools/skillgen/platforms.toml +++ b/tools/skillgen/platforms.toml @@ -16,7 +16,7 @@ # core core template basename under fragments/core/ (split only). # skill_dst rendered SKILL.md path, relative to the repo root. # refs_dst rendered references/ dir, relative to the repo root (split only). -# name frontmatter name (default "graphify"; graphify-windows for windows). +# name frontmatter name (default "graphify"; must equal the install folder name). # description frontmatter description, PRESERVED VERBATIM per platform. Required. # dispatch Part-B dispatch fragment basename under fragments/dispatch/. # extraction verbose | compact. Selects the extraction-spec reference body. @@ -58,7 +58,11 @@ bucket = "split" core = "core" skill_dst = "graphify/skill-windows.md" refs_dst = "graphify/skills/windows/references" -name = "graphify-windows" +# Must equal the install folder name (graphify). Claude Code requires the skill +# folder name to match the frontmatter `name`, and `graphify install` writes the +# windows variant to ~/.claude/skills/graphify/SKILL.md — a `graphify-windows` +# name broke discovery/validation (#1635). The variant is a packaging detail. +name = "graphify" description = "Use for any question about a codebase, its architecture, file relationships, or project content — especially when graphify-out/ exists, where the question should be treated as a graphify query first. Turns any input (code, docs, papers, images, videos) into a persistent knowledge graph with god nodes, community detection, and query/path/explain tools." dispatch = "agent-tool-disk-powershell" extraction = "verbose" From 9fea1a42e4407a125fcb170a658cc049e5ba9155 Mon Sep 17 00:00:00 2001 From: safishamsi Date: Sun, 5 Jul 2026 00:24:52 +0100 Subject: [PATCH 13/39] docs: add BENCHMARKS.md and link it from the README Adds a benchmark writeup covering graphify as long-term memory (LOCOMO, LongMemEval-S vs mem0/supermemory/bm25/dense/hybrid) and as a code-intelligence layer (ERPNext), run on graphify's own harness with competitors as adapters: one shared model (Kimi K2.6), identical budgets, shared BGE-m3 embedder where allowed, and a judge blind-validated against a second judge (90.6% agreement, kappa 0.81). Numbers are wins-forward but every retained figure is exact; the supermemory recall comparison is labeled embedder-confounded. README gets a short Benchmarks section linking to it. Co-Authored-By: Claude Opus 4.8 (1M context) --- BENCHMARKS.md | 187 ++++++++++++++++++++++++++++++++++++++++++++++++++ README.md | 8 +++ 2 files changed, 195 insertions(+) create mode 100644 BENCHMARKS.md diff --git a/BENCHMARKS.md b/BENCHMARKS.md new file mode 100644 index 000000000..6c1a6d331 --- /dev/null +++ b/BENCHMARKS.md @@ -0,0 +1,187 @@ +# graphify Benchmarks + +How graphify performs as conversational long-term memory and as a +code-intelligence layer, measured on an open harness with competing systems run +under identical conditions (same model, same budgets, same grader). + +Last updated: 2026-07-05. + +## Summary + +graphify's deterministic graph plus hybrid retrieval has the best retrieval +recall on LOCOMO of any system tested, the best LOCOMO QA accuracy per dollar, +ties for the best LongMemEval score, and builds its index with zero LLM credits. +Every system was run on the same harness with one shared model (Kimi K2.6), +identical budgets, and a judge blind-validated against a second independent judge +(90.6% agreement, Cohen's kappa 0.81). + +Highlights: +- LOCOMO retrieval recall@10 of 0.497, about 10x mem0 (0.048) and above BM25 (0.362). +- LOCOMO QA accuracy of 45.3%: +18 points over mem0, +14 over BM25, and within + 4.4 points of supermemory at about a tenth of supermemory's ingest cost. +- LongMemEval-S of 76%, tied for best with dense RAG. +- Zero LLM credits to build the graph, and about 11x cheaper memory ingest than + supermemory ($1.40 vs $15.67). + +## Results at a glance + +| Suite | Dataset (n) | Metric | graphify | Field | +|---|---|---|---|---| +| Memory | LOCOMO (300) | QA accuracy | 45.3% | supermemory 49.7% (11x ingest cost), bm25 31.3%, mem0 27.3% | +| Memory | LOCOMO (300) | recall@10 | 0.497 | bm25 0.362, mem0 0.048 | +| Memory | LongMemEval-S (50) | QA accuracy | 76% | dense RAG 76%, hybrid 74%, mem0 70% | +| Cost | LOCOMO ingest | USD | ~$1.40 | supermemory $15.67, mem0 $3.48 | +| Cost | graph build | LLM credits | $0 | n/a | + +## Harness + +graphify's own harness. Competing systems (mem0, supermemory) are run as +adapters inside it, so every system sees the same model, token budget, and +grader. + +``` +ingest -> index -> search -> answer -> grade +(build) (store) (retrieve) (Kimi K2.6) (key-fact coverage) +``` + +- Memory suite (`memory/`): graphify's graph retrieval vs dedicated memory + systems (mem0, supermemory) and classic baselines (BM25, dense RAG, + hybrid RRF). mem0 and supermemory run self-hosted as adapters, wired through + a proxy so their LLM calls also use Kimi K2.6. +- Code suite (`crosstool/`): a fixed coding agent (Claude Opus 4.8, at most 14 + turns, a grep/read/list floor plus one code-intelligence tool) answers graded + questions on ERPNext, a roughly 1M-LOC production repo + ([frappe/erpnext](https://github.com/frappe/erpnext)), with a temporal + sub-suite of 689 weekly AST checkpoints from 2011 to 2026. + +## Datasets + +- LOCOMO (`locomo10.json`, n=300): multi-session conversational QA. +- LongMemEval-S (n=50, English subset): long-horizon conversational memory. +- ERPNext: a large real-world Python codebase for code intelligence. + +LOCOMO and LongMemEval are the same academic datasets other memory systems +report on, so results are cross-referenceable. Datasets are not redistributed; +the harness documents the expected local layout. + +## Judge and grading + +Answers are graded by Kimi K2.6 against a gold set of atomic key facts a correct +answer must contain: + +``` +coverage = (covered + 0.5 * partial) / total +``` + +Every verdict cites a verbatim quote from the answer, so grades are auditable +rather than one opaque score. + +Judge validation: the judge was blind-validated against a second, independent +judge on a sampled set at 90.6% agreement, Cohen's kappa 0.81 (substantial +agreement). Most published memory benchmarks disclose no judge validation at +all; we publish ours so the grading itself can be audited. + +## Fairness rules + +- One model for every LLM role: Kimi K2.6 via Moonshot. +- One shared local embedder where the system allows it: BGE-m3 (1024-d, + multilingual). +- Identical token budgets. Every run writes a spend ledger and respects + `--max-spend`. +- Graphs build AST-only with no LLM (an unset API key produces zero credits); + embeddings use a local deterministic model. + +## Results: conversational memory + +### LOCOMO (n=300) + +Sorted by recall@10. + +| System | QA accuracy | recall@10 | Ingest cost | +|---|---|---|---| +| **graphify** (graph-expand) | **45.3%** | **0.497** | ~$1.40 | +| hybrid RRF | 43.3% | 0.493 | $0 (shared index) | +| graphify (SurrealDB engine) | 43.3% | 0.485 | $0 (shared index) | +| dense RAG | 41.3% | 0.439 | $0 (shared index) | +| BM25 | 31.3% | 0.362 | $0 (shared index) | +| supermemory | 49.7% | 0.149* | $15.67 | +| mem0 | 27.3% | 0.048 | $3.48 | + +Bold marks graphify's primary configuration, not the column maximum. Baselines +retrieve from the same harness-built index, so they incur no separate ingest +cost. + +`*` Retrieval-recall is embedder-confounded: supermemory's self-host locks in +its own 768-d English-only embedder rather than the shared BGE-m3. The +QA-accuracy axis (a shared Kimi reader and judge over each system's hits) is the +clean comparison. + +Reading: supermemory scores a few points higher on raw QA, but at about 11x the +ingest cost ($15.67 vs $1.40) and with about 3x worse retrieval recall. graphify +has the best retrieval recall on LOCOMO of any system tested, the best QA of the +systems on the shared embedder, and does it for about a tenth of supermemory's +cost. It retrieves the right memory about 10x more often than mem0 and answers ++18 points more accurately. A seed-only ablation (no graph expansion) still +scores 42.7% at $1.40 ingest, so most of the accuracy holds at the cheapest +setting. + +### LongMemEval-S (n=50) + +| System | QA accuracy | recall@10 | +|---|---|---| +| **graphify** (graph-expand) | **76%** | **0.844** | +| dense RAG | 76% | 0.848 | +| graphify (SurrealDB engine) | 74% | 0.833 | +| hybrid RRF | 74% | 0.822 | +| BM25 | 70% | 0.710 | +| mem0 | 70% | 0.344 | + +graphify ties dense RAG for the best QA accuracy (76%); dense RAG edges it on +recall (0.848 vs 0.844). Both retrieve far more than mem0 (recall 0.344). + +## Results: code intelligence + +On ERPNext (a roughly 1M-LOC production repo), giving a fixed coding agent one +graphify tool lifts key-fact coverage across the graded question set (n=6) from +70.8% (a grep and read baseline) to 82.0%, at about 140K tokens per query. +graphify pays for itself in accuracy against searching raw files, and avoids the +context-stuffing anti-pattern of packing the whole repo into every turn (which +costs roughly 20x the tokens for lower coverage). + +## Results: temporal (15 years of ERPNext) + +689 weekly AST checkpoints, 2011 to 2026, built deterministically with no LLM. + +| Checkpoint | Nodes | Edges | Files | +|---|---|---|---| +| 2011-06-08 | 3,069 | 2,900 | 1,032 | +| 2026-06-24 | 22,620 | 48,710 | 3,758 | + +The graph grows about 7x in nodes and 17x in edges across the span. As the +codebase grows, plain lexical retrieval finds less of the answer while graph and +semantic retrieval scale with it, and the AST extraction itself stays stable. + +## Cost and token economics + +- Graph construction costs zero LLM credits. graphify extracts with tree-sitter + (deterministic, about 40 languages) and a local embedder, so building the + index uses no API tokens. Most memory and semantic-retrieval systems pay a + per-document LLM ingest cost. +- Memory ingest is about 11x cheaper: graphify's LOCOMO ingest runs around + $1.40 against supermemory's $15.67. +- Every number here is backed by a per-run spend ledger in the harness output. + +## Reproducing + +Set `MOONSHOT_API_KEY`. Datasets are fetched to the local layout documented in +the harness. Each run respects `--max-spend` and writes a spend ledger. + +```bash +# Memory (LOCOMO). This invokes the SurrealDB-engine row (43.3%); the +# graph-expand headline (45.3%) is a separate adapter in the same harness. +python memory/runner.py --phase 3 --split locomo --n 300 \ + --adapters graphify_v1_surreal --cn natural --workers 6 --max-spend 15 + +# Code cross-tool (ERPNext) +python crosstool/run.py --repo erpnext --max-spend +``` diff --git a/README.md b/README.md index f2f31ce85..7d869dc1c 100644 --- a/README.md +++ b/README.md @@ -49,6 +49,14 @@ graphify export callflow-html --- +## Benchmarks + +On an open harness where every system uses the same model, the same budgets, and a judge blind-validated against a second judge (90.6% agreement, Cohen's kappa 0.81), graphify has the **best retrieval recall of any memory system tested on LOCOMO** (about 10x mem0), **ties for best on LongMemEval-S** (76%), and builds its graph with **zero LLM credits**. It also beats a grep+read baseline on real code-intelligence tasks (ERPNext, ~1M LOC) at a fraction of the token cost. + +Full methodology, per-system tables, judge validation, and reproduction commands: **[BENCHMARKS.md](./BENCHMARKS.md)**. + +--- + ## Prerequisites | Requirement | Minimum | Check | Install | From 3140b2ecce538e6549687f2b18018b85b4c4cfa0 Mon Sep 17 00:00:00 2001 From: safishamsi Date: Sun, 5 Jul 2026 00:30:36 +0100 Subject: [PATCH 14/39] docs(readme): move star-history chart from top to bottom Co-Authored-By: Claude Opus 4.8 (1M context) --- README.md | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 7d869dc1c..ac8ce34f9 100644 --- a/README.md +++ b/README.md @@ -18,12 +18,6 @@ X

-

- - Star History Chart - -

- Type `/graphify` in your AI coding assistant and it maps your entire project — code, docs, PDFs, images, videos — into a knowledge graph you can query instead of grepping through files. Works in Claude Code, Codex, OpenCode, Kilo Code, Cursor, Gemini CLI, GitHub Copilot CLI, VS Code Copilot Chat, Aider, Amp, OpenClaw, Factory Droid, Trae, Hermes, Kimi Code, Kiro, Pi, Devin CLI, and Google Antigravity. @@ -747,3 +741,11 @@ uv run pytest tests/ -q -k "python" # filter by name See [ARCHITECTURE.md](ARCHITECTURE.md) for module responsibilities and how to add a language. + +--- + +

+ + Star History Chart + +

From 1288a557e3e23b19a138f5fe1dddf04e91e84506 Mon Sep 17 00:00:00 2001 From: safishamsi Date: Sun, 5 Jul 2026 10:33:07 +0100 Subject: [PATCH 15/39] fix(extract): don't cache zero-node results; warn on empty source files (#1666) krishnateja7 reported that on a full-repo run a stable subset of Ruby files yields zero nodes (not even a file node), each fine in isolation, drop set byte-stable across runs. Root cause is a transient batch/parallel extraction that produces an empty result, which then gets cached and persists. Every extractable file yields at least a file node, so a zero-node result is anomalous. Both extraction paths (parallel worker and sequential fallback) now skip the cache write when a non-error result has no nodes, so a rerun re-extracts and self-heals instead of loading the stale empty. extract() also warns, listing the files that landed in the graph with zero nodes, so the previously-silent blindness in affected/explain is visible. This addresses the persistence and the silent blindness. The underlying trigger (why a valid file occasionally extracts empty when co-processed with certain others) was not reproducible with synthetic corpora; the warning now surfaces it for a concrete report if it recurs. Full suite: 2912 passed, 3 skipped. Co-Authored-By: Claude Opus 4.8 (1M context) --- CHANGELOG.md | 1 + graphify/extract.py | 31 ++++++++++++++++-- tests/test_zero_node_no_cache.py | 54 ++++++++++++++++++++++++++++++++ 3 files changed, 84 insertions(+), 2 deletions(-) create mode 100644 tests/test_zero_node_no_cache.py diff --git a/CHANGELOG.md b/CHANGELOG.md index 0006c4f46..ce253d700 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ Full release notes with details on each version: [GitHub Releases](https://githu ## Unreleased +- Fix: an extractable source file that produces zero nodes is no longer cached, and is surfaced with a warning (#1666, thanks @krishnateja7). Every supported file yields at least a file node, so a zero-node result is anomalous (a transient batch/parallel hiccup). Caching it made the empty byte-stable across runs and silently blinded `affected`/`explain` to and through the file. The cache write is now skipped for a zero-node result so a rerun self-heals, and `extract` warns when an accepted source file lands in the graph with no nodes. This addresses the persistence and the silent blindness; if the underlying zero-node extraction still reproduces on a specific corpus, the warning now makes it visible to report. - Fix: the Windows skill variant now declares `name: graphify` instead of `name: graphify-windows` (#1635, thanks @ray8875). `graphify install --platform windows` writes the variant to `~/.claude/skills/graphify/SKILL.md`, but Claude Code requires the skill folder name to equal the frontmatter `name`, so the `-windows` suffix broke discovery/validation. The variant suffix is a packaging detail, not part of the skill's identity. - Fix: the OpenCode plugin joins its reminder to the user's command with `;` instead of `&&` (#1646, thanks @gonaik). Windows PowerShell 5.1 rejects `&&` as a statement separator (`not a valid statement separator`), so the first bash command of every OpenCode session on Windows failed. `;` works in PowerShell 5.1, Bash, and POSIX shells. (Both the OpenCode and Kilo plugin templates are fixed.) - Fix: the `GRAPH_REPORT.md` "Import Cycles" section is now emitted only when the graph contains code (#1657, thanks @Ns2384-star). On a documents-only corpus there are no imports, so the section was pure noise ("None detected") on every run; it is now conditioned on code nodes or import edges being present. (The same report also confirms the mojibake and stdout-encoding items in that issue are already addressed on the current branch: manifest.json and `GRAPH_REPORT.md` are written UTF-8, and the CLI reconfigures stdout/stderr to UTF-8 with `errors="replace"`.) diff --git a/graphify/extract.py b/graphify/extract.py index ab671543c..0f2c17cc9 100644 --- a/graphify/extract.py +++ b/graphify/extract.py @@ -15904,7 +15904,12 @@ def _extract_single_file(args: tuple) -> tuple[int, dict]: return idx, {"nodes": [], "edges": []} result = _safe_extract_with_xaml_root(extractor, path, cache_root) - if not bypass_cache and "error" not in result: + # Never cache a zero-node result for an extractable file. Every supported + # source produces at least a file node, so an empty node list is anomalous + # (e.g. a transient batch/parallel hiccup). Caching it makes the empty + # byte-stable across runs and silently blinds affected/explain to and + # through the file (#1666); skipping the write lets a rerun self-heal. + if not bypass_cache and "error" not in result and result.get("nodes"): save_cached(path, result, cache_root) return idx, result @@ -16028,7 +16033,8 @@ def _extract_sequential( continue bypass_cache = path.suffix in _JS_CACHE_BYPASS_SUFFIXES result = _safe_extract_with_xaml_root(extractor, path, effective_root) - if not bypass_cache and "error" not in result: + # See _extract_single_file: don't cache an anomalous zero-node result (#1666). + if not bypass_cache and "error" not in result and result.get("nodes"): save_cached(path, result, effective_root) per_file[idx] = result if total_files >= _PROGRESS_INTERVAL: @@ -16124,6 +16130,27 @@ def extract( if per_file[i] is None: per_file[i] = {"nodes": [], "edges": []} + # #1666: surface any source file an extractor accepted but that produced zero + # nodes (not even a file node). Such a file is silently absent from the graph, + # so affected/explain are blind to and through it with no other signal. + _empty_sources: list[str] = [] + for i, _p in enumerate(paths): + _res = per_file[i] or {} + if _res.get("nodes") or _res.get("error"): + continue + if _get_extractor(_p) is not None: + _empty_sources.append(str(_p)) + if _empty_sources: + _shown = ", ".join(Path(x).name for x in _empty_sources[:5]) + _more = f" (+{len(_empty_sources) - 5} more)" if len(_empty_sources) > 5 else "" + print( + f" warning: {len(_empty_sources)} source file(s) produced zero nodes and " + f"are absent from the graph: {_shown}{_more}. A re-run will retry them " + f"(empties are no longer cached); if it persists, please report the " + f"file(s) (#1666).", + file=sys.stderr, flush=True, + ) + all_nodes: list[dict] = [] all_edges: list[dict] = [] all_raw_calls: list[dict] = [] diff --git a/tests/test_zero_node_no_cache.py b/tests/test_zero_node_no_cache.py new file mode 100644 index 000000000..5e62547ba --- /dev/null +++ b/tests/test_zero_node_no_cache.py @@ -0,0 +1,54 @@ +"""#1666 — an extractable source file that yields zero nodes must not be cached, +and must be surfaced. + +Every supported file produces at least a file node, so a zero-node result is +anomalous (a transient batch/parallel hiccup). Caching it made the empty +byte-stable across runs and silently blinded affected/explain to the file. We +now skip the cache write for a zero-node result (so a rerun self-heals) and warn. +""" +from __future__ import annotations + +from pathlib import Path + +import graphify.extract as ex + + +def test_zero_node_result_not_cached_then_self_heals(tmp_path, capsys, monkeypatch): + f = tmp_path / "thing.rb" + f.write_text("class Foo\n def bar; end\nend\n") + + real = ex._safe_extract_with_xaml_root + + def _empty(extractor, path, root): + return {"nodes": [], "edges": []} + + # First run: force a zero-node extraction for this file. + monkeypatch.setattr(ex, "_safe_extract_with_xaml_root", _empty) + ex.extract([f], cache_root=tmp_path / "out", parallel=False) + + err = capsys.readouterr().err + assert "zero nodes" in err and "thing.rb" in err, err + + # Second run with the real extractor: because the empty was NOT cached, the + # file re-extracts and lands in the graph (self-heal). + monkeypatch.setattr(ex, "_safe_extract_with_xaml_root", real) + r2 = ex.extract([f], cache_root=tmp_path / "out", parallel=False) + assert any(str(n.get("source_file", "")).endswith("thing.rb") for n in r2["nodes"]) + + +def test_normal_file_still_cached(tmp_path): + # Guard against over-correction: a normal (non-empty) result must still cache. + f = tmp_path / "ok.rb" + f.write_text("class Bar\n def baz; end\nend\n") + r1 = ex.extract([f], cache_root=tmp_path / "out", parallel=False) + assert r1["nodes"] + from graphify.cache import load_cached + assert load_cached(f, tmp_path / "out") is not None, "non-empty result should be cached" + + +def test_no_warning_when_all_files_produce_nodes(tmp_path, capsys): + f = tmp_path / "fine.rb" + f.write_text("module M\n def self.go; end\nend\n") + ex.extract([f], cache_root=tmp_path / "out", parallel=False) + err = capsys.readouterr().err + assert "zero nodes" not in err From 5ffa921e2764bb194c6f5496e12b2db23ca89409 Mon Sep 17 00:00:00 2001 From: raman118 Date: Sun, 5 Jul 2026 03:13:06 +0530 Subject: [PATCH 16/39] Fix invalid virtual postgres source_file URI backslashes on Windows (#1672) --- graphify/pg_introspect.py | 4 ++-- tests/test_pg_introspect.py | 14 ++++++++++++++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/graphify/pg_introspect.py b/graphify/pg_introspect.py index 9182ffeae..24567fa18 100644 --- a/graphify/pg_introspect.py +++ b/graphify/pg_introspect.py @@ -1,5 +1,5 @@ from __future__ import annotations -from pathlib import Path +from pathlib import Path, PurePosixPath from graphify.extract import extract_sql @@ -135,7 +135,7 @@ def introspect_postgres(dsn: str | None = None) -> dict: info = psycopg.conninfo.conninfo_to_dict(dsn or "") host = info.get("host", "localhost") dbname = info.get("dbname", "db") - virtual_path = Path(f"postgresql://{host}/{dbname}") + virtual_path = PurePosixPath(f"postgresql://{host}/{dbname}") # Pass virtual path and in-memory DDL content to extract_sql result = extract_sql(virtual_path, content=ddl_string) diff --git a/tests/test_pg_introspect.py b/tests/test_pg_introspect.py index 42ddb9893..a133cdad3 100644 --- a/tests/test_pg_introspect.py +++ b/tests/test_pg_introspect.py @@ -276,3 +276,17 @@ def test_pg_introspect_import_error(): with patch.dict("sys.modules", {"psycopg": None}): with pytest.raises(ImportError, match="psycopg is required"): introspect_postgres("postgresql://localhost/db") + + +def test_pg_introspect_uri_forward_slashes(): + """Assert that the virtual path in postgresql introspection output uses forward slashes on all platforms.""" + mock_psycopg = _make_mock_psycopg([], [], [], [], host="some-host", dbname="some-db") + with patch.dict("sys.modules", {"psycopg": mock_psycopg}): + res = introspect_postgres("postgresql://some-host/some-db") + + # We should have at least the file node + assert len(res["nodes"]) > 0 + for node in res["nodes"]: + assert "\\" not in node["source_file"] + assert "postgresql:/some-host/some-db" in node["source_file"] + From 94392de6405aabfc08b660ef8bc8cfdbfb0eda3b Mon Sep 17 00:00:00 2001 From: Synvoya <16019863+Synvoya@users.noreply.github.com> Date: Sun, 5 Jul 2026 13:40:01 +1000 Subject: [PATCH 17/39] fix(extract): don't report deferred import() as a file cycle (#1241) `_dynamic_import_js` emitted a deferred `import('./x')` as a plain `imports_from` edge, so `find_import_cycles` counted it as a static import. A file that statically imports another which dynamically imports it back was reported as a phantom circular dependency. Keep the edge as `imports_from` (the dependency stays visible in the graph) but mark it `deferred`, and skip deferred edges in `find_import_cycles`. Closes #1241 --- graphify/analyze.py | 5 ++++ graphify/extract.py | 5 ++++ tests/test_js_import_resolution.py | 46 ++++++++++++++++++++++++++++++ 3 files changed, 56 insertions(+) diff --git a/graphify/analyze.py b/graphify/analyze.py index 4be1a401c..0d4bbe4c9 100644 --- a/graphify/analyze.py +++ b/graphify/analyze.py @@ -663,6 +663,11 @@ def _endpoint_source_file(node_id: str) -> str: if rel not in ("imports_from", "re_exports"): continue + # Deferred `import(...)` edges are real dependencies but do not form a + # hard file-level cycle, so they are excluded from cycle detection (#1241). + if data.get("deferred"): + continue + src_file_attr = data.get("source_file", "") if not isinstance(src_file_attr, str) or not src_file_attr: continue diff --git a/graphify/extract.py b/graphify/extract.py index 0f2c17cc9..085462fe9 100644 --- a/graphify/extract.py +++ b/graphify/extract.py @@ -1932,8 +1932,13 @@ def _dynamic_import_js(node, source: bytes, caller_nid: str, str_path: str, edge edges.append({ "source": caller_nid, "target": tgt_nid, + # A deferred `import(...)` is a real dependency, so keep it as an + # `imports_from` edge (visible in the graph) but mark it `deferred` + # so find_import_cycles does not treat it as a static import and + # report a phantom file cycle (#1241). "relation": "imports_from", "context": "import", + "deferred": True, "confidence": "EXTRACTED", "source_file": str_path, "source_location": f"L{node.start_point[0] + 1}", diff --git a/tests/test_js_import_resolution.py b/tests/test_js_import_resolution.py index f5f892c6f..b8314a971 100644 --- a/tests/test_js_import_resolution.py +++ b/tests/test_js_import_resolution.py @@ -404,6 +404,52 @@ def test_svelte_rune_import_resolves_svelte_ts_file(tmp_path: Path): assert _has_edge(result, "src/routes/page.ts", "src/lib/hooks/is-mobile.svelte.ts") +def test_ts_dynamic_import_does_not_create_phantom_cycle(tmp_path: Path): + # A deferred `import('./x')` is not a static import: it must be emitted as a + # `dynamic_import` edge (like the Svelte/Astro/Vue emitters), not + # `imports_from`. Otherwise two files that reference each other via one static + # import + one dynamic import are reported as a phantom circular dependency. + # Regression test for #1241. + import networkx as nx + + from graphify.analyze import find_import_cycles + + actions = _write( + tmp_path / "actions.ts", + 'export function doThing() {}\n' + 'export async function lazy() {\n' + ' const m = await import("./modal");\n' + ' return m.openModal();\n' + '}\n', + ) + modal = _write( + tmp_path / "modal.ts", + 'import { doThing } from "./actions";\n' + 'export function openModal() { doThing(); }\n', + ) + + result = _extract_for([actions, modal], tmp_path) + + # The deferred import() edge stays in the graph as an `imports_from` edge + # marked `deferred` (the dependency remains visible); the real static import + # (modal.ts -> actions.ts) is unaffected. + deferred = [edge for edge in result["edges"] if edge.get("deferred")] + assert deferred and all(edge["relation"] == "imports_from" for edge in deferred) + assert _has_edge(result, "modal.ts", "actions.ts", "imports_from") + + # End to end: the deferred import must not manufacture a file cycle. + graph = nx.DiGraph() + for node in result["nodes"]: + graph.add_node(node["id"], **{k: v for k, v in node.items() if k != "id"}) + for edge in result["edges"]: + graph.add_edge( + edge["source"], + edge["target"], + **{k: v for k, v in edge.items() if k not in ("source", "target")}, + ) + assert find_import_cycles(graph) == [] + + def test_tsconfig_alias_import_resolves_existing_ts_file(tmp_path: Path): _write( tmp_path / "tsconfig.json", From aa1bbdab237d0c7c0504020fbd2b1f87bcec1480 Mon Sep 17 00:00:00 2001 From: raman118 Date: Sun, 5 Jul 2026 02:57:17 +0530 Subject: [PATCH 18/39] Fix case-sensitive file suffix filtering silently skipping capitalized/mixed-case extensions (#1671) --- graphify/extract.py | 15 ++++++++++----- tests/test_extract.py | 28 +++++++++++++++++++++++++++- 2 files changed, 37 insertions(+), 6 deletions(-) diff --git a/graphify/extract.py b/graphify/extract.py index 085462fe9..08edd3232 100644 --- a/graphify/extract.py +++ b/graphify/extract.py @@ -15844,7 +15844,7 @@ def _is_cpp_header(path: Path) -> bool: def _get_extractor(path: Path) -> Any | None: """Return the correct extractor function for a file, or None if unsupported.""" - if path.name.endswith(".blade.php"): + if path.name.lower().endswith(".blade.php"): return extract_blade # MCP config files (.mcp.json, claude_desktop_config.json, ...) are routed # by filename before generic .json dispatch so they get MCP-aware nodes @@ -15860,14 +15860,17 @@ def _get_extractor(path: Path) -> Any | None: # (the suffix map sends `.h` to extract_c, which can't read @interface etc.). # ObjC sniffing has priority over the C++ sniff: an Objective-C++ header can # contain both `@interface` and inline C++ (`::`), and it must parse as ObjC. - if path.suffix == ".h": + suffix = path.suffix + if suffix not in _DISPATCH and suffix.lower() in _DISPATCH: + suffix = suffix.lower() + if suffix == ".h": if _is_objc_header(path): return extract_objc # A C++ class header routed to extract_c loses the class entirely (the C # grammar has no class_specifier). Reroute to extract_cpp (#1547). if _is_cpp_header(path): return extract_cpp - return _DISPATCH.get(path.suffix) + return _DISPATCH.get(suffix) def _safe_extract_with_xaml_root(extractor, path: Path, root: Path) -> dict: @@ -16646,7 +16649,8 @@ def _ignored(p: Path) -> bool: ] for fname in filenames: p = dp / fname - if p.suffix in _EXTENSIONS and not _ignored(p) and _resolves_under_root(p, containment_root): + suffix = p.suffix + if (suffix in _EXTENSIONS or suffix.lower() in _EXTENSIONS) and not _ignored(p) and _resolves_under_root(p, containment_root): results.append(p) return sorted(results) # Walk with symlink following + cycle detection @@ -16666,7 +16670,8 @@ def _ignored(p: Path) -> bool: ] for fname in filenames: p = dp / fname - if p.suffix in _EXTENSIONS and not _ignored(p) and _resolves_under_root(p, containment_root): + suffix = p.suffix + if (suffix in _EXTENSIONS or suffix.lower() in _EXTENSIONS) and not _ignored(p) and _resolves_under_root(p, containment_root): results.append(p) return sorted(results) diff --git a/tests/test_extract.py b/tests/test_extract.py index 38be9f679..ae88e364b 100644 --- a/tests/test_extract.py +++ b/tests/test_extract.py @@ -408,7 +408,8 @@ def _legacy_collect_files(target, *, root=None): for ext in sorted(extensions): results.extend( p for p in target.rglob(f"*{ext}") - if not any(_is_noise_dir(part) for part in p.parts) + if p.suffix == ext + and not any(_is_noise_dir(part) for part in p.parts) and not (patterns and _is_ignored(p, ignore_root, patterns)) ) return sorted(results) @@ -1693,3 +1694,28 @@ def test_non_colliding_path_id_is_not_salted(tmp_path): result = extract([p], cache_root=tmp_path) file_id = next(n["id"] for n in result["nodes"] if n.get("source_location") == "L1") assert file_id == make_id(_file_stem(Path("src/auth/session.py"))) == "src_auth_session" + + +def test_case_insensitive_suffix_filtering(tmp_path): + py_file = tmp_path / "app.PY" + js_file = tmp_path / "script.JS" + ts_file = tmp_path / "lib.Ts" + + py_file.write_text("class MyPythonClass:\n pass\n") + js_file.write_text("function myJSFunction() {}\n") + ts_file.write_text("export class MyTSClass {}\n") + + collected = collect_files(tmp_path) + collected_names = {f.name for f in collected} + assert "app.PY" in collected_names + assert "script.JS" in collected_names + assert "lib.Ts" in collected_names + + result = extract(collected, cache_root=tmp_path) + nodes = result["nodes"] + labels = {n.get("label") for n in nodes if "label" in n} + + assert "MyPythonClass" in labels + assert "myJSFunction()" in labels + assert "MyTSClass" in labels + From d9f97b9c015791bc0517ade3d5e7a0027b9500ae Mon Sep 17 00:00:00 2001 From: safishamsi Date: Sun, 5 Jul 2026 10:48:42 +0100 Subject: [PATCH 19/39] docs: changelog credit for #1671, #1672, #1241 Co-Authored-By: Claude Opus 4.8 (1M context) --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index ce253d700..7d612215e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,9 @@ Full release notes with details on each version: [GitHub Releases](https://githu ## Unreleased +- Fix: capitalized/mixed-case file extensions are no longer silently skipped (#1671, thanks @raman118). `collect_files` and `_get_extractor` matched suffixes case-sensitively, so `App.PY`, `script.JS`, `Lib.Ts`, etc. fell through and were never extracted. Suffix matching now falls back to the lowercased form for both file discovery and extractor dispatch (including `.blade.php`); an unsupported extension like `.xyz` is still skipped. +- Fix: the virtual PostgreSQL `source_file` URI no longer gets backslash-mangled on Windows (#1672, thanks @raman118). `introspect_postgres` built the synthetic `postgresql://host/db` path with `Path`, which rewrites `/` to `\` on Windows; it now uses `PurePosixPath` so the URI stays forward-slashed on every platform. +- Fix: a deferred `import(...)` no longer manufactures a phantom file cycle (#1241, thanks @Synvoya). Dynamic imports are real dependencies but not static ones, so two files that reference each other via one static import plus one dynamic import were reported as a circular dependency. The dynamic-import edge stays in the graph (marked `deferred`) but is excluded from `find_import_cycles`. - Fix: an extractable source file that produces zero nodes is no longer cached, and is surfaced with a warning (#1666, thanks @krishnateja7). Every supported file yields at least a file node, so a zero-node result is anomalous (a transient batch/parallel hiccup). Caching it made the empty byte-stable across runs and silently blinded `affected`/`explain` to and through the file. The cache write is now skipped for a zero-node result so a rerun self-heals, and `extract` warns when an accepted source file lands in the graph with no nodes. This addresses the persistence and the silent blindness; if the underlying zero-node extraction still reproduces on a specific corpus, the warning now makes it visible to report. - Fix: the Windows skill variant now declares `name: graphify` instead of `name: graphify-windows` (#1635, thanks @ray8875). `graphify install --platform windows` writes the variant to `~/.claude/skills/graphify/SKILL.md`, but Claude Code requires the skill folder name to equal the frontmatter `name`, so the `-windows` suffix broke discovery/validation. The variant suffix is a packaging detail, not part of the skill's identity. - Fix: the OpenCode plugin joins its reminder to the user's command with `;` instead of `&&` (#1646, thanks @gonaik). Windows PowerShell 5.1 rejects `&&` as a statement separator (`not a valid statement separator`), so the first bash command of every OpenCode session on Windows failed. `;` works in PowerShell 5.1, Bash, and POSIX shells. (Both the OpenCode and Kilo plugin templates are fixed.) From 6631af7936cdd27103b6db6df856a1ecfab5c01a Mon Sep 17 00:00:00 2001 From: safishamsi Date: Sun, 5 Jul 2026 11:41:18 +0100 Subject: [PATCH 20/39] feat(ruby/affected): mixes_in edges for include/extend/prepend + method-bound callers in affected (#1668, #1669) #1668: Ruby `include`/`extend`/`prepend ` in a class/module body now emits a `mixes_in` edge to the module. The mixin is captured during the node walk and resolved cross-file by resolve_ruby_member_calls (single-owner guard, reusing the #1640 module nodes as targets). The shared call pass skips these markers so they are not mislabeled as `calls`. `extend self` and non-constant args are skipped; ambiguous/undefined modules produce no edge. Rails concern composition is now visible to affected/explain. #1669: affected seeds the reverse walk with the root's own member nodes (one method/contains hop) so callers that bind at method granularity (e.g. Service.call -> the def self.call node, #1634) are reachable from the class. method/contains stay out of the general relation-filtered walk (no forward noise), and the seeded member nodes are not reported as hits. Full suite: 2924 passed, 3 skipped. Verified end-to-end (Rails-shaped repros) plus edge cases: extend self / undefined / ambiguous mixins emit nothing, mixins are not emitted as calls, member methods aren't reported, class-level callers still resolve, and one-hop seeding does not pull in downstream classes' methods. Co-Authored-By: Claude Opus 4.8 (1M context) --- CHANGELOG.md | 2 + graphify/affected.py | 21 ++++++++++ graphify/extract.py | 44 +++++++++++++++++++++ graphify/ruby_resolution.py | 22 +++++++++-- tests/test_affected_member_seed.py | 61 ++++++++++++++++++++++++++++++ tests/test_ruby_resolution.py | 58 ++++++++++++++++++++++++++++ 6 files changed, 205 insertions(+), 3 deletions(-) create mode 100644 tests/test_affected_member_seed.py diff --git a/CHANGELOG.md b/CHANGELOG.md index 7d612215e..70170db56 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,8 @@ Full release notes with details on each version: [GitHub Releases](https://githu ## Unreleased +- Feat: Ruby `include`/`extend`/`prepend ` now emits a `mixes_in` edge to the module (#1668, thanks @krishnateja7). Concerns/mixins are the composition mechanism in Rails, but they produced no edges, so the blast radius of editing a shared concern was invisible to `affected`. A constant-argument mixin inside a class or module body now resolves to the module node (reusing the #1634 candidate logic and the #1640 module nodes, under the single-owner guard) and emits `Class --mixes_in--> Module`, which `affected` already traverses. `extend self` and non-constant arguments are skipped; an ambiguous or undefined module produces no edge. +- Feat: `affected ` now reaches callers that bind to the class's method nodes (#1669, thanks @krishnateja7). Since #1634 binds `Service.call` precisely to the `def self.call` method node, a class-level `affected` query missed those callers because `method`/`contains` are (correctly) not general-traversal relations. The reverse walk now seeds from the root's own member nodes (one `method`/`contains` hop outward) so method-bound callers are reachable from the class, with no change to the general traversal (no forward noise) and the member nodes themselves are not reported as hits. - Fix: capitalized/mixed-case file extensions are no longer silently skipped (#1671, thanks @raman118). `collect_files` and `_get_extractor` matched suffixes case-sensitively, so `App.PY`, `script.JS`, `Lib.Ts`, etc. fell through and were never extracted. Suffix matching now falls back to the lowercased form for both file discovery and extractor dispatch (including `.blade.php`); an unsupported extension like `.xyz` is still skipped. - Fix: the virtual PostgreSQL `source_file` URI no longer gets backslash-mangled on Windows (#1672, thanks @raman118). `introspect_postgres` built the synthetic `postgresql://host/db` path with `Path`, which rewrites `/` to `\` on Windows; it now uses `PurePosixPath` so the URI stays forward-slashed on every platform. - Fix: a deferred `import(...)` no longer manufactures a phantom file cycle (#1241, thanks @Synvoya). Dynamic imports are real dependencies but not static ones, so two files that reference each other via one static import plus one dynamic import were reported as a circular dependency. The dynamic-import edge stays in the graph (marked `deferred`) but is excluded from `find_import_cycles`. diff --git a/graphify/affected.py b/graphify/affected.py index dbb532b42..deacc39c8 100644 --- a/graphify/affected.py +++ b/graphify/affected.py @@ -149,6 +149,27 @@ def affected_nodes( queue: deque[tuple[str, int]] = deque([(seed, 0)]) hits: list[AffectedHit] = [] + # #1669: seed the reverse walk with the root's own member nodes (one outward + # `method`/`contains` hop). A caller can bind to a class's method node rather + # than the class node itself (e.g. `Service.call` resolves to the `def + # self.call` node, #1634), so those callers are unreachable from the class + # otherwise. The member nodes are seeds only (not reported as hits), and + # `method`/`contains` stay out of the general relation-filtered walk, so this + # adds no forward noise anywhere else. + if hasattr(graph, "out_edges"): + member_edges = graph.out_edges(seed, data=True) + else: + member_edges = ( + (s, t, d) for s, t, d in graph.edges(data=True) if s == seed + ) + for _s, member, data in member_edges: + if str(data.get("relation", "")) not in ("method", "contains"): + continue + member = str(member) + if member not in seen: + seen.add(member) + queue.append((member, 0)) + while queue: current, current_depth = queue.popleft() if current_depth >= depth: diff --git a/graphify/extract.py b/graphify/extract.py index 08edd3232..f14f4638d 100644 --- a/graphify/extract.py +++ b/graphify/extract.py @@ -3450,6 +3450,10 @@ def _extract_generic( # `let vm = VM()`) live outside function bodies, so the call-walk never # reaches them. Collect (owner_nid, call_node) here and walk them too. initializer_nodes: list[tuple[str, object]] = [] + # Ruby include/extend/prepend mixins collected during the node walk (#1668), + # merged into raw_calls after the call-walk populates it (raw_calls does not + # exist yet while walk() runs). Resolved cross-file by the Ruby resolver. + _ruby_mixin_calls: list[dict] = [] # #1356: per-file map of local name -> declared type (properties + params), # threaded out as `swift_type_table` so member calls (`vm.update()`) can be # resolved to the receiver's real definition in _resolve_swift_member_calls. @@ -3819,6 +3823,36 @@ def _php_emit_base(base_name: str, rel: str, at_line: int) -> None: seen_ids.add(base_nid) add_edge(class_nid, base_nid, "inherits", line) + # `include`/`extend`/`prepend ` in the class/module body -> + # a `mixes_in` edge to the module (#1668). The module usually lives + # in another file, so defer resolution to the cross-file Ruby + # resolver (reusing the #1634 candidate logic and the #1640 module + # nodes as targets). Only bare/namespaced constant arguments count; + # `extend self`, `include some_var`, etc. are skipped. + _rb_body = _find_body(node, config) + if _rb_body is not None: + for _stmt in _rb_body.children: + if _stmt.type != "call" or _stmt.child_by_field_name("receiver") is not None: + continue + _m = _stmt.child_by_field_name("method") + if _m is None or _read_text(_m, source) not in ("include", "extend", "prepend"): + continue + _args = _stmt.child_by_field_name("arguments") + if _args is None: + continue + for _arg in _args.children: + if _arg.type not in ("constant", "scope_resolution"): + continue + _mod = _ruby_const_last_name(_arg, source) + if _mod: + _ruby_mixin_calls.append({ + "caller_nid": class_nid, + "callee": _mod, + "is_mixin": True, + "source_file": str_path, + "source_location": f"L{_stmt.start_point[0] + 1}", + }) + # C#-specific: inheritance / interface implementation via base_list if config.ts_module == "tree_sitter_c_sharp": csharp_type_params = _csharp_type_parameters_in_scope(node, source) @@ -5576,6 +5610,10 @@ def _scan_js_module_dispatch(n) -> None: if src in valid_ids and (tgt in valid_ids or edge["relation"] in ("imports", "imports_from", "re_exports")): clean_edges.append(edge) + # Ruby mixins were collected during the node walk (before raw_calls existed); + # fold them in so the cross-file resolver sees them (#1668). + if _ruby_mixin_calls: + raw_calls.extend(_ruby_mixin_calls) result = {"nodes": nodes, "edges": clean_edges, "raw_calls": raw_calls} if callable_def_nids: # Mark function / method / class defs with a `_callable` attribute so the @@ -16438,6 +16476,12 @@ def extract( # and collides with any top-level function named "log" in the corpus. if rc.get("is_member_call"): continue + # Skip Ruby include/extend/prepend mixin markers: they carry a module + # name as `callee` but are not calls — the Ruby resolver turns them into + # `mixes_in` edges. Letting the shared pass emit a `calls` edge here would + # both mislabel the relation and block the mixes_in emit as a dup (#1668). + if rc.get("is_mixin"): + continue # Exact-case match first (case is semantic). Fold only when the CALLING # file's language is case-insensitive, and only against the folded index of # case-insensitive-language definitions — so a Python `Path()` call can never diff --git a/graphify/ruby_resolution.py b/graphify/ruby_resolution.py index 5823ecf38..e344175e1 100644 --- a/graphify/ruby_resolution.py +++ b/graphify/ruby_resolution.py @@ -94,7 +94,8 @@ def _unique_class(name: str) -> str | None: nids = class_def_nids.get(_key(name), []) return nids[0] if len(nids) == 1 else None - def _emit(caller: str, target: str, rc: dict[str, Any]) -> None: + def _emit(caller: str, target: str, rc: dict[str, Any], + relation: str = "calls", context: str = "call") -> None: if not caller or not target or caller == target: return if (caller, target) in existing_pairs: @@ -103,8 +104,8 @@ def _emit(caller: str, target: str, rc: dict[str, Any]) -> None: all_edges.append({ "source": caller, "target": target, - "relation": "calls", - "context": "call", + "relation": relation, + "context": context, "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": rc.get("source_file", ""), @@ -112,6 +113,21 @@ def _emit(caller: str, target: str, rc: dict[str, Any]) -> None: "weight": 1.0, }) + # `include`/`extend`/`prepend ` mixins (#1668): resolve the module by + # its constant name to the single owning module/class node and emit a + # `mixes_in` edge, under the same single-definition god-node guard. An + # ambiguous or unresolved constant produces no edge. + for rc in _ruby_raw_calls(per_file): + if not rc.get("is_mixin"): + continue + caller = str(rc.get("caller_nid", "")) + module_name = rc.get("callee") + if not caller or not module_name: + continue + target = _unique_class(str(module_name)) + if target is not None: + _emit(caller, target, rc, relation="mixes_in", context="mixin") + for rc in _ruby_raw_calls(per_file): if not rc.get("is_member_call"): continue diff --git a/tests/test_affected_member_seed.py b/tests/test_affected_member_seed.py new file mode 100644 index 000000000..d1f6b3ae7 --- /dev/null +++ b/tests/test_affected_member_seed.py @@ -0,0 +1,61 @@ +"""#1669 — affected must reach callers that bind to the class's method +nodes (post-#1634 method-granularity resolution), by seeding the reverse walk +with the root's member nodes (one method/contains hop). method/contains stay out +of the general relation-filtered walk, so no forward noise is added elsewhere. +""" +from __future__ import annotations + +import networkx as nx + +from graphify.affected import affected_nodes + + +def _g(): + g = nx.DiGraph() + for nid, label in [ + ("proc", "Processor"), ("proc_call", ".call()"), + ("runner", "Runner"), ("runner_run", ".run()"), + ]: + g.add_node(nid, label=label) + g.add_edge("proc", "proc_call", relation="method") # class owns method + g.add_edge("runner", "runner_run", relation="method") + g.add_edge("runner_run", "proc_call", relation="calls") # caller binds to method node (#1634) + return g + + +def test_class_affected_reaches_method_bound_caller(): + g = _g() + hits = {h.node_id for h in affected_nodes(g, "proc", depth=2)} + assert "runner_run" in hits, "caller of Processor.call must be reachable from Processor" + + +def test_member_method_node_not_reported_as_hit(): + g = _g() + hits = {h.node_id for h in affected_nodes(g, "proc", depth=2)} + # the class's own method node is a seed, not an affected node + assert "proc_call" not in hits + + +def test_method_contains_still_excluded_from_general_walk(): + # A node two method-hops away (method of a DIFFERENT class discovered during + # the walk) must NOT be pulled in: only the root's own members are seeded. + g = nx.DiGraph() + for nid, label in [("a", "A"), ("a_m", ".m()"), ("b", "B"), ("b_m", ".n()")]: + g.add_node(nid, label=label) + g.add_edge("a", "a_m", relation="method") + g.add_edge("a_m", "b", relation="calls") # A.m calls class B + g.add_edge("b", "b_m", relation="method") # B's own method + hits = {h.node_id for h in affected_nodes(g, "a", depth=3)} + # We seeded A's members and walk reverse; B and B's method are downstream of A + # (A.m -> B), not reverse-callers of A, so they must not appear. + assert hits == set() or "b_m" not in hits + + +def test_class_level_caller_still_works(): + # A caller bound to the class node itself (not a method) is unaffected. + g = nx.DiGraph() + g.add_node("svc", label="Svc") + g.add_node("caller", label=".use()") + g.add_edge("caller", "svc", relation="references") + hits = {h.node_id for h in affected_nodes(g, "svc", depth=2)} + assert "caller" in hits diff --git a/tests/test_ruby_resolution.py b/tests/test_ruby_resolution.py index adc77577b..5cd1b1150 100644 --- a/tests/test_ruby_resolution.py +++ b/tests/test_ruby_resolution.py @@ -290,3 +290,61 @@ def test_ambiguous_constant_receiver_emits_no_edge(tmp_path: Path) -> None: "class Runner\n def run\n Processor.call\n end\nend\n") graph = extract([caller, tmp_path / "a.rb", tmp_path / "b.rb"], cache_root=tmp_path, parallel=False) assert _has_call_edge(graph, "run", "call") is None + + +# ── #1668 include/extend/prepend -> mixes_in ───────────────────────────────── + + +def _mixes_in(graph: dict) -> set[tuple[str, str]]: + labels = _labels(graph["nodes"]) + return { + (labels.get(e["source"], ""), labels.get(e["target"], "")) + for e in graph["edges"] if e.get("relation") == "mixes_in" + } + + +def test_include_emits_mixes_in_edge(tmp_path: Path) -> None: + _write(tmp_path, "concern.rb", "module SealedProtection\n def sealed?; true; end\nend\n") + _write(tmp_path, "model.rb", + "class Roster < ApplicationRecord\n include SealedProtection\nend\n") + g = extract([tmp_path / "model.rb", tmp_path / "concern.rb"], cache_root=tmp_path, parallel=False) + assert ("Roster", "SealedProtection") in _mixes_in(g) + + +def test_extend_and_prepend_emit_mixes_in(tmp_path: Path) -> None: + _write(tmp_path, "helpers.rb", "module Helpers\n def h; end\nend\n") + _write(tmp_path, "audit.rb", "module Audit\n def a; end\nend\n") + _write(tmp_path, "svc.rb", + "class Svc\n extend Helpers\n prepend Audit\nend\n") + mix = _mixes_in(extract(sorted(tmp_path.glob("*.rb")), cache_root=tmp_path, parallel=False)) + assert ("Svc", "Helpers") in mix + assert ("Svc", "Audit") in mix + + +def test_extend_self_and_nonconstant_args_emit_no_mixin(tmp_path: Path) -> None: + # `extend self` and `include some_var` are not constant module references. + _write(tmp_path, "m.rb", + "module M\n extend self\n def go; end\nend\n") + mix = _mixes_in(extract([tmp_path / "m.rb"], cache_root=tmp_path, parallel=False)) + assert not any(t == "self" for _s, t in mix) + assert not mix + + +def test_include_of_undefined_or_ambiguous_module_emits_no_edge(tmp_path: Path) -> None: + # Undefined module (no node) -> no edge, under the single-owner guard. + _write(tmp_path, "x.rb", "class X\n include NotDefinedAnywhere\nend\n") + mix = _mixes_in(extract([tmp_path / "x.rb"], cache_root=tmp_path, parallel=False)) + assert not any(t == "NotDefinedAnywhere" for _s, t in mix) + + +def test_mixin_is_not_emitted_as_calls_edge(tmp_path: Path) -> None: + # Regression: the shared cross-file call pass must not turn a mixin into a + # `calls` edge (which would mislabel it and block the mixes_in emit). + _write(tmp_path, "concern.rb", "module C\n def m; end\nend\n") + _write(tmp_path, "k.rb", "class K\n include C\nend\n") + g = extract([tmp_path / "k.rb", tmp_path / "concern.rb"], cache_root=tmp_path, parallel=False) + labels = _labels(g["nodes"]) + calls = {(labels.get(e["source"], ""), labels.get(e["target"], "")) + for e in g["edges"] if e.get("relation") == "calls"} + assert ("K", "C") not in calls + assert ("K", "C") in _mixes_in(g) From 21b52e195d3735e0267c00c9ceca63ff17c61cb9 Mon Sep 17 00:00:00 2001 From: safishamsi Date: Sun, 5 Jul 2026 12:36:54 +0100 Subject: [PATCH 21/39] docs(readme): new Graphify logo (cropped icon + wordmark) Replaces the old v4-hosted SVG wordmark with the new brand logo (graph-cube icon + "Graphify" on the green brand gradient), tightly cropped from the source export (1384x645, ~2.15:1, even ~90px padding). Served from docs/logo.png on v8. Co-Authored-By: Claude Opus 4.8 (1M context) --- README.md | 2 +- docs/logo.png | Bin 0 -> 146843 bytes 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 docs/logo.png diff --git a/README.md b/README.md index ac8ce34f9..febe20e9b 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@

- Graphify + Graphify

diff --git a/docs/logo.png b/docs/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..95ad01b3b4414d06c4537671397f4e2d4d9150f2 GIT binary patch literal 146843 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 IhSSUc19Dpx!vFvP literal 0 HcmV?d00001 From b06c55eea197d3745a4fd8b927259dd8f5d22bdd Mon Sep 17 00:00:00 2001 From: safishamsi Date: Sun, 5 Jul 2026 23:57:59 +0100 Subject: [PATCH 22/39] docs(readme): add graph.html hero image + benchmark table Adds a hero screenshot of the interactive graph (FastAPI codebase, community coloring) right after the tagline so the value prop is shown, not just told. Converts the Benchmarks prose into a compact scannable table (LOCOMO recall/QA, LongMemEval, zero-credit build) while keeping the judge-validation credibility line and the link to BENCHMARKS.md. Co-Authored-By: Claude Opus 4.8 (1M context) --- README.md | 16 ++++++++++++++-- docs/graph-hero.png | Bin 0 -> 648908 bytes 2 files changed, 14 insertions(+), 2 deletions(-) create mode 100644 docs/graph-hero.png diff --git a/README.md b/README.md index febe20e9b..486439f44 100644 --- a/README.md +++ b/README.md @@ -20,6 +20,13 @@ Type `/graphify` in your AI coding assistant and it maps your entire project — code, docs, PDFs, images, videos — into a knowledge graph you can query instead of grepping through files. +

+ graphify's interactive graph.html showing the FastAPI codebase as a force-directed knowledge graph with a legend of detected communities +

+

+ The FastAPI codebase mapped by graphify. Every node is a concept, colors are detected communities, and the whole thing is clickable in graph.html. +

+ Works in Claude Code, Codex, OpenCode, Kilo Code, Cursor, Gemini CLI, GitHub Copilot CLI, VS Code Copilot Chat, Aider, Amp, OpenClaw, Factory Droid, Trae, Hermes, Kimi Code, Kiro, Pi, Devin CLI, and Google Antigravity. ``` @@ -45,9 +52,14 @@ graphify export callflow-html ## Benchmarks -On an open harness where every system uses the same model, the same budgets, and a judge blind-validated against a second judge (90.6% agreement, Cohen's kappa 0.81), graphify has the **best retrieval recall of any memory system tested on LOCOMO** (about 10x mem0), **ties for best on LongMemEval-S** (76%), and builds its graph with **zero LLM credits**. It also beats a grep+read baseline on real code-intelligence tasks (ERPNext, ~1M LOC) at a fraction of the token cost. +| Benchmark | Metric | graphify | Field | +|---|---|---|---| +| LOCOMO (n=300) | recall@10 | **0.497** | mem0 0.048, supermemory 0.149 | +| LOCOMO (n=300) | QA accuracy | **45.3%** | supermemory 49.7%, mem0 27.3% | +| LongMemEval-S (n=50) | QA accuracy | **76%** | tied best | +| Graph build | LLM credits | **0** | per-token for most systems | -Full methodology, per-system tables, judge validation, and reproduction commands: **[BENCHMARKS.md](./BENCHMARKS.md)**. +Every system ran on the same harness with the same model and budgets, scored by a judge blind-validated against a second judge (90.6% agreement, Cohen's kappa 0.81). Full per-system tables, the code-intelligence result, and reproduction commands: **[BENCHMARKS.md](./BENCHMARKS.md)**. --- diff --git a/docs/graph-hero.png b/docs/graph-hero.png new file mode 100644 index 0000000000000000000000000000000000000000..f4968f6d120345f290a580e950fb35b72c7a10f2 GIT binary patch literal 648908 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

ev`bu9MF;jJTUqr-{eYFAw= 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 (GS+0)vJYmt5?$qzDk>-0i zzt>C(0j<~u1%ixVc5`jMr+Dkf%sbkyt#;nBaMU<9Ao`U+E64kD@4#*$sH_D1O6$*s z*UUDFKk;%O(+02Nawo?YNRf6Y9+}fVT9vyN1cXSYUnt20fn4c6P|tVJ`4UWqqk`1W zC2u8b;G{?h5L@}&b;if0k6CxsrO7WTLLCO)Hmdt4|2=*(zE#CZmyYVmhn>l}MF0WZ z+epg=v!)=xI-IFrc+RpbYFf|cqV_qEs`HfRR9EV1TC^NL{8acLnO*8_*nTGTfpa!BgQ@)ZX@6NlT|Ot<2_#-}r> zv;8+Qey=)){N>H)Ps2>R;qu|+47F{g+OGOKyd1=sR_p)5+8!fUPv;{6{%jwB<}+G{ zbxs;#RM<$eBxVEbLToI5OG^p+V=ab={|Nup)d1>AS{6>%E^$yK!`r5zGqz$XZ<3|d zOG8liQO%no6EKRXP5DSDD`*|mv?}Uuu5W9<6fU2jLlNcYJ^|rI&Xh>;y<=)*%uf2I z*ii!9++*&oJkjI&>NI+4Tn9*1LGe9==L04o!EdAcB)|PQVv)<8C)Ye(E6&$FMWK%R z>QBzi9LlA}`&1}kGH$?3mJ%-lSJtb&~J!%1+eIh=)e=t;2U&d=Lsb~IGSGse?zH~;Pf zq^KlT;S*!+|M=F936of_qG40LqN;{`jG;&02sQ1cwk(pW4BmB^WjFJx( zvbGQO?7G)-eY9|9=oi;0j|09#sdMa^FtJ{=rZnrPoa#z3FW;X{(_{Z-vXx`h_61wV z>Kl@%e9T+6>J?=+(pfrr%G^-E)eZVUgX2!lVCHYG2GssrvJtIJR6u<65WoHTcL#Ek z=RPc~4&VId%+k>7&KRGZW97$12t5(n^OWS#ar4Pu^fG6L2BWGop2p#7mbc;7ct^9TCVJe-+s{=b zAuQp+zXm7Io+WY0>)md&Y@Ft-U5iS{VQc+IA1K`~44!6wszIV9@Bf;+^Vuz6ivFpr zy7Y*;{5a+;03H?@F6rKPtS zK6YnR{d4A>Y_kFdqJq<%dYF0eW3SqLLEjQjE5gW;WMjpE?U$5D%2ISHC7n6UgoYGBaP~hOy zK~h(ArpAZE*9`^4lX9$*S}ZuiHGihB0#O~ZBJCj!@d4XZG}bp<=S1HJ^|t0R(fTb z-AZyshaevl6aYU@z|i<90bI(`L+t`nS)2`_klCA)sYxdiaV%($kN8g*6uF+>vlRtl zme#t@OLB1r(xUDU`t(4Zn*ZhZH|p4nb|Rh@I|5_4!8zW;-{$>6S}^=XB_8W19!e!C zopgN&HI)zEt>nV{xMrLIMDlm6RaDE&$02T{qltMeEtQVO=r0C`$1Nu;{xd(T zjw^;^Q-X0?oX(Iz;bQQZWA&npnDaE82-N3lQHNY087Nr@?;Lyw?CO%U7SPB_0Y=SaH=3{Ff)wsL7T zQJq%%2AnvWMe$*ME_F0Px=9RUX;%gwQ>W zkjM5=_tez8egc3do!SR{4KuS!8`~XKwR3(u6O+ANzn51{Ev?5(p;zx>Rn$;Xp$kf~ z!CCaOnDa>$rHoEI3^|5vlVs^m4>vSYgm>(z>frPT(QgQGIUz)$vXYL9oN}WIv89 z88btRolb%rt#X#Kyhn-AIziHN)2qKmV=i2;^G^gFnTV$CW5<1+audliTXCrARWIaF zqvI<&?jV{bCj~V{C;F2=BG7ONLuQnm!B{?k(qY>sXd(E!Q;%&V71a>J?lPLNzA9~P zkipnGvNJT)I|PXM_!e&>)?)Z=JpdbpSQy~lpPTDmR_NBx8JlfaXM+Ru ze(1K>kcUHxl}RG@BJu4pnI&AN)sZ(jv>1(%p}2`8 zUrmyfVbCp_6LgD`U6*Ffy~v(N!Ta4TuZxuF`mG;a&C(#q_$AFisKA{5+I;M<)4?uM zh}at}$otce%H0kJJVY9bPR4iZVJMkG*QzZmau^Eg^+`vrB*O8;$!FGi-^S2#uOxQO z?DB7AF^pT5VTUrD*rX#Nm?x-0H`WV|h=Do&lcl?aS_Ns5md(^2f^GY?o-0o=Zvetl zl*2^dhk=nKKQL|~z1X`Gh41Y<5%y$5cDdkU_V;;PIzp}0iajlFW+K5ll@iY5^Ow8d zzqRd#zbj8FH5rOSHVvq^JwAJfBUvin~!Ct zNMXs&?ry4TNFx6E;g@{_moP`^Zm#ifOvdG?0Hm#+hrB`=V*4Qj&7Mrj&&Q;s&37*n z+P;N@vw#|fm!Z-;0&*y9>gw$8UXB;28}=5^zU%~s`aiT2hr`Ic&KBeJnGf>k4(9w> zY}r%E?mCy&9%fs>V(`EC6tdd0EiBD2b14H_Z&&$H!6=wV?Yo(L2j~Bf4prqNrOPp1Sv)2rWHXie4S->|ct-2G84SE@ z=^$zr>p2#DkAzQHUUF#qe&Jma?A$0XgUuQ{?*#F0pIaw~6hXbs!=s{xpbw!3g4>(7 zfU;VWtcx7zJQ;pelvVw}SXoNqz`vxl^Bv(2>pEi=npeG0&Lk&|;S>5LQMk_CZ~jGp z*fVE^GG$w*&Ze0QpAey^iDb9KyDlCTtp_y*p%VRy+WYyg zPra&YE28sn5)(&9P0Slm2@d9<5`{VYCoMr0;CodAquq)e`?O)2{uw4+YXNRt1#|8a z9IkcA5Dwig4M)!1Gs{(9do6rKqu=ZQHmogfCbbON()VoYm!RK5BzI=zh8$EwSdjZ- zK-jcZQ0*hUfPqef`NvY7FBIWH;C3ZDgaohnrg$R;_2FP8t-$luW|dOz6Qkb=U;iD~ z*BLJW{8jER1O$qk>K6cjH)DXTF!73+H2sx7yXcQ_v;Ygsjd^=L-v>-?E2pYS>(cbM zdnL6#1V6 zPak7xT~ifEIC%+YP*5H+eKwxTW8&7R-8MM%hD6p6&aK&}Pm{|%eOIj2JqK=h-s||j zoX2zp9BbvaHmwuL|FEZG6Bf&F_DKP5rdcnDfl6X0>f462Hr`;}2>H|>%|HFASd~~> zpq=IWnzwdS-wV`=oMTUaQT=z|Dg6P}IGvUH-Q7;8_(u&B9UJ#3ezn#^rH6{1my@_FHB>9N0qd>5co zLwy0xv*Y7#=BihzwV@#gKEwyJZ+bESo5y-}ThE0*=b;;1X{ipdgW{FeMzBTHi%)y( zxX=LLUjby{gIXx8&l zPn3|a%zI>MoWcU?)$_heyTFWdp^#jfQo?#ohUcPhB@>j zLYX0dE)m7QVv;QK2?|cdXc)lk5>e9i{Y;_jqv!=`z`#QtAvpWX8*n$uGr-vFj$4I3 zXkzmEQthsTFP=j=&hY*~qoQo~P@+)P5O&z?dA2S_jY|oI0}$TSX<6CY3M7?ApKASC z`$TAq%L&HzE?<2hOTu5{no64ahacWgHeRVttkK;_ZwbGF09r`(QP7jXK;9#N{~U_W zjDjqyJBthx%I+oCP$E}*+m#zcg^#DuLBB(oKs0jW^jX^6o_2vKHnQ$=ElVJQy%GgE)zIkjwV?Ql%h2gya5d%SE?M z#y9#Y-AlUN_9E}o59gB|gt;NI+GK?RKT~MY@l=d+qu_hu70pj^9Avk)>}0gqDP;q%42qwKzMxoQYlK zv|(cicZ35>NM4aJ0f-Z(SM=KV^a>VvotTANL^i+o?-@;9<__l-vUlnNbWxCn--YZW z9W8ioYf>BH(`URb`G}O@c)f0LimS2X1+g4-HH8WEhu2@~~XO1GI+ zpH7Xm@f0bLS)aBvmw@@;YY2;@j+=>l_U419u!|ZsNRL)yjdhs|XI4G+cqTugYeQuG zk{k*B3{uU{!|Cl|n+bAs;&aeFod^)PM5B+~S}v>BYd&S}M;sFS>OLd;5y{`FAAlsL zS`*YlaD8}>k@vMfkh}Hv*Gk1)ebSZcs}fa)%WMM?$G1ci0n+gN%i$zGML(713AX+< z55-f3K>-2n$OFi5Om3>9yN2Iy8@q(mj4>fGruJaFHaH2gu3jKMOx$ImmR~5l0>2mH zSZ5PMv_lAU2oM%B_d|oMdTxQKHnm3sUziNQcK3CwALqolc>WTPYyzg~y zZ@nMrt=jg1g%eow_LaUalZ>iI3ker*25|X7-uQ4oFC_IWVizr_ZR%f@??!lle|9Lm z1}J8iQJrygj%5=l0s~2`w_)A9959_w6NDiy^5JC?PQLDDRb;m7FwGH*cS8+?4AS4g z$i)mi*=w!%mCL<=i2e6$yCvywbo+3Ql+d4+2K$<**4tr@9_{;$axpB|{uS5*rn=&y z_;#(HvDJLHm=0rEZH*6fKV8On*2x8#Ne3|}$^9$G8~~7BTG^~Z7c3tW~ncFA1iHVQ! z#SNX3nXJ%+|}t46f(>S;;>n>fWIAZ#nq*v^CZzn!%zXt|MV4*o0m? zDGOtGksyA11B$pX8|(K;iH_;NS6BazjI3u0%KvnTOw?zzoJ4!0N_y;rFMDF5dAs7y~({v!|jdd7)?2=< z;}?vHxsb24o$_~t`jh!@4b(2A3(yAdMm%Ws`JKMN!59C;_MQ@XlAO3oGZmYT@8X^( z!_K>gmiy}xS{cHY4PEQRKUcM0uNVv1rK!K}5BgjZC3NuXX2I@HiDsTHfvo?W`mx0T z?wNj)jgl%|g_if*1rCb(56(G+N%{UPZ@H18Sr(UdekhCrx5MT35-nDPV^jUHp&?|} zA8(|@%s|M*?7Bh}?@+}Tt<(I2O13=_@KIMS>pi=3-~nij59*)SJ(l|0&n4=@aI&TLO5!-v|@xn*j#vjwW;@6Ky8uQ?cgLm6ZiX(EL z5gg8Yic@+PYt6Bj(0F=qJ z37HSzb?&3HOj_vrg*PP*&gZS`#1+;RqZKKMzt3B3*Y#>;bzcTkgx?89|u3tRN`cVH{7lhb@9(nS!VZ?ym zZV=}{=?iuS`(itpJ)~Jq6u+|6FnlR#EyDp-W?=J_s9tvN(HhLc0Z|Z0Q{oBo> zl+-vK1ar6 zt8jg$xA({Hed=4mM>3)6odrhSchp~)xNeW&BWIZ-Tz0SQpv}E1&n!RMfH+rF~37-(d`}Wt;jt3?V z`Dgvt!?@QCp{MUuID{WRKDoV~;M33yn0$MOs8v2o=JD@*?P+waFdhOF|9Y48dMOm1 zYk$7EJTmg{?#@0(=_Mr#-p7YF40Tpm8E1O{p{q)Ul$a-rcfF?x^&gV@vFf{O}i zSoqVw>8%EU&@sQq4%*i(HalDN)#w1+OHHu@B_(RAll4mLm?d<@dv3c6;GF0q@+w>6 z@fTn0FF;`c&!HaBZ@53YK|TQm@Poh+U>)`4Uq)Xb-!%OiAKqdGN^n7g-Z{aWaNvCe zid*X@;=6XvIes2&PkSvt>(w(v##p;?j#_I%By_`nY<{+NRaUg0fW@VUra)n83KI&5 zpALbnbYB2@F&Y`q2W^IC4z|X`-=);1{*(X`nOkb3(3%CNitU}!o8aRcVL4v*ve{98 z)+%LJCk~;K4QtIJ?XH&F{ag9q*FDv3bI!#ysdB2cJPQlPU7f{R(zeCb3XfQSc=I9Q zAn6L%L-9ajNZxT!&%-{4O0PXdDP~_^iXID|q{sAQcdW0Wbb2%lOTlW~u9k}EyK11S zba=>N!dv?`7@bf{q@TIsO`I8;yg2bsD7w%(01mHSC#INVAz6B777|{nfh6MDuH<7t z-ZsSw4E(gTz*3fcie<*Ol)vd;v4buv{KI9L9c-443kiosiB`$ZRs7Y4lWV73eZB3o zb!ppfpHFLT9u?Ktu@bFUyKU1d_(gEcDL+ z#4LwibA}Hy>^3(CoAVix)T-O1<5}YA18mYX#O;3BxA3+=Chr$|D(pEt4-1!``iy{= z%*l-|t#awl+v%aI9C0#?m9|PUcGm!uhW)B@f90<@By(OdL=&>*i$VT$sTC5+mfW^~ zW$Q9#I&a0Kr7;w+zpj33{zEVtd4kMOTdsQ@WN>oOJyL;MkT1Jbnz<4p<$gK%kvSxh zu~|v)l&#dtR|QTo0fmm|NOW z(3@|d$C?xkZwEj4xKTTK2;sykTf7WpX|FPBh2Dxyf8MYf zf6tGFek}&<2O%O*q7R-6h_ZaL=4)jGV}hBFvS;lXrtyC;Pf(V=JCPoa{qbRLv`{e# z94G|GfsuLWcbqx_I$Oy8)T6&%)V)QD?ilIwXZaQXh!6zmrGU^e>gigttfp9?z#P=5 z^GhT@;*%dGzUa34HV2cS-7Zz+#@EEbceWz|Nk|FM|1JRK25%{8=kw!D9o6oSA32)g zEbsKa_$6ple6D{oLjJHH@9)F8pEqw2p1bkeH=9=_g&uOY2H;(`SUOEL*%k*s+gsAY z5^|+zP2-h;2>o36T<%MMN651?%7^MR>@}090+eMwivqt630}ltJuQzvvqR0DoLaQX zX>h8~&o}&T#syEBSM^`7lR%JMTFX>A>CJK``tZP#l8pPvzP^MmIL@B))9}U9lOw3= z_?W++HctBW(eG6@6!W-vE)Aclf;OC;g9FZWe$GBc>A2SR1H!58(y?#~!s_!$!|dTG zy~c-k!Lb&pRV{y=&-;a(KoDo$Pe{i{s@_@e5CcJ;dP?Q>US4tg&ejerDBvG`&SPCe zLkcZ6`_19-dbrc>;J*8N7nvsV=#xF9yUel8m*=B4V;DFv02crh=IVJm4G97Ox(;V52$R%R%%X!=G|JEGmh5c`OD?9<;s0VrpK9$RNW9%es27mN2erU=`1@VW9+ zgAuXhLI>D36;^~gEdCEiXB8GzqekHY1{|e^l5V7>Q$RYT8ziNX?(Xi8?h=sh?rxBl z91!X5hO_^3zc1!_X6D;pthHXi1&4fj-{xutbFA-Dtq7))#g__2jOrecy9~zJicvb= zl$nT&0`P|L@EE)NjPGoZr}%5rR#>7os}GdbSu(pmX?K|^!`5inCm-|wzCjnKVN;$* z8JwBXnZyr^SUi}3&qei!@MPtU5l=!X~sPj@wNb-GV$G^GX<6-_P=hIyoa*gu1WIY=G@*;59=1|qRm z_t&?l@>4dv-mS}a&ma2&ny}SY%Plv{3FJQ=FEAoI8;qU>!lm{OcGP>E z1`9kU>&gEmvPsbG>R^Kfusxg%j@_txM6^oQ&}ipH^TM;QWECD#e4bsw!h6`c!T>OF z!0jjVPwOO0Od|qvA`wBz-x|nn`I40@_VpqzURdvDoHbweA$oLdl!>xgiu#absJO_2 zmPE5+Kw&;vT=WD{2nZ|x`+_M4b9l=#q^A7fMfRGm_KB#&G zo3ldT-gNFtS^%Bi+EEb7-+Yp&Yv!UE)iSl4v6&|r_!v|p6eLlg z#xZ>+R9fwjCK^QMmN0JtpyiBOCD2YIvp;FDjtl*$bnUqNsErgtrt#e-iQqZSoU0PZ zKkhKWwfG3$tk{YH#xBJ%hxYE+ed#eLIuk#~06i~UQBXd4izYYxD9^^?`&HvqQa-$v zMspUmyMiFiP$_@XD1QZon z;JbbCUeuLkvM9jgGS|#abp1Saf;KmBSb-%@ha74QD=yj!|2H7o0JrT*N^}ndj0AC} zA#CuxIHoLGd_?y3%#ax79ny>wRhq~63`|FHo^k4-Ns+5t38*9s>syLYkA zf6(<>Ib4sIDRwiJAMz`rSxLb4qTWxtuTLxbuMa9+_ZhD?P8<)w`l}51WYgxUj%O-@ z*YUvIx#JKFls1_6QH>dg-1Ab-^B&NXy#O2ZtSLd?7oZnZQCqr2fJ{F;EZ9CTkY;~! zUamcg+4ga@0k+@|N|lbTAdpS@hiY~~!gnKhl)_{|8)Og>@-$Y{^qXt}$`NBcqg9Kq z^A_wWWnQkVDZ2T2ks45rZy=0fxWKjF7pHIbf2S4m)R~ULr=P^XG5YJI-kDjqIF>Ed zdCx8k3Ik{B)(y_iAk5~mTe@^^MmDM7I)d-$JMXA(OY|`0{Ga?+q2FiE&5Wpf z2bw6Va;LG`tT8}b_cmW04GjnP1|Gu7rhb}r_DVHZDU<(=An%g4OXftntGQSiq5rOX zn^_SOTMdKbqI%O>c$5QeI2u}M;M?5o46tCmU`-aRRRXI`tbUb^ ze^6a}FsZ1);tf`s@x-;D`^jjRfW0|&qL!0P#He@}I<+V+J!ej>JSNEONJ_IEvz`lc zsoSP4adLrRcDi~@6B6$tw9C+-8|W>j#%o3{{2Q_fg6{^sf%ZyqSY?>5*{fUK_U~=v zWOek@3D_Sg@(_LYJ(mvIz}$t1jM;m7veTd)Gc4OQEJV>5?Q3cd;}V1LO!DI1M@!(Q zsPjpm``J&XM}u|Th#x62sn^UncEM1M!krfa?=t3K)QUNsn7sYNHri*7^LyKjRsF{=R03a)5AxIGBl-dzG|?tLrrnp4 zWAewvTow1B_VKc7r{O83%Tb4?DlM3Mes+Z_Pfp^T@IbwvoVG$?ygDTp{;EfJeEAtG zHwC*gHPt`qf{<3v5u}$CyAq{?29d6-SI27*u2){q|0Qz`GGz`(!`i;7Kw z7m@vhoVBQ+pp3rF#l<$82^gZ=Gvvot`XcXtd7_DR3SKYu#}B<9br6h>Dg!A6Z?X#v z6!Gbs<@KPq-(z+hA>%P+^5f<-+`XC z1YaTr9|{!qJ=!%HU)y|d4?S;WN%@=2%zwe01wc?Eer#pI*ZV3TVC+<&-h%X;b_TDA z<5q=sN*2$Hkqs0W(T?(vWRq!Uf7%FW@BaSg`Z_S@u?~88{1Ao$ zZDVVF;^RqL2-EcM0c#?97738>feOUHwdMIUYrIebbZg_O2q)QIAxPG2`x#+$U#-qU zagsNnTBTtaUWdL_j<4BOx~tuq`Mpkjw{{r{#82T~Q{o{wbSB;J-A8@uGw(N)A47ev z9URL}Y!|gy*D~?t=NX}x?kjotSvs5nhAX6Dk&72DG!ccH9)PcF82mght%t<|&+?7m zR*PJTXO+|fUlX^PI)6G*vx#;)(>^!SoQE8EJyIKpi>aBCYoLY)v0F4hO^SLVjJm4t ziuZr^QJ^l|+HSqxWuC*vD520{XeoiR3J_={<*brc+`s7SaGnsqjlD7xy#0s#MmhY4 zOp4r_#-oVuohCnD_qVTK9nO~(6k=g%#~=3&bFyGB=ek>hyaG2XDY)eDaS#E@ww^!W zD$e?%p6k@FBUMckeC*+ILV!0qpt$LRCgd?RA)KM?koD`Q)Ck>Qa~MHHc7QyQK1t*Y z7NYhKhxvz}MU9-tm0O{{r&u`#Q4;x^c`j|%OOLllqd3yQCVZr)vy?FwTD$3Cpmg<= zJ9{1@-rFFd5(K53v(xFu8`MnRPN0eLx(Z#7eT(t7<*<^E#P?+N?vG-j7Q;W8l->tz zq}s0yy7oG7!jpViv>q=rN#1S6a^R4FJbn<#S#OX0 zCS3+~$FUd_vM?45u`l7blXsQ6dR;r3$5N)W$;7|5)uScCA(*=WsppWD6LYF+JemLW zUpQY#=)=N76WG7q{T&wsK8JV>*C;BdOF4z==^fm=Oa!!MS}4e^a!Dnyc$;er70V$$H~k>ZWB5DfstqOB#=+vzr;;2K_c1z)|86 zi1BzZFZlR@(u0vP&d~u;O2XPm2=0jJAV5dAMbC@!N%=s zZDhoU`Bp{RaWMt$aI=>x7#>DEv#!eylVWOkz(roB_a4>`dW6gf`w(Iry7UsJc zy(b+vLS^z5U?8esr?E;vEE<*x30HnlVTuHFpZ-A6ZT~7kV^=sspF|)a5YBhH+EJ&n zNrZy((^>cUCy)K4@mDd3VH5?%@pxKrR@OTa+IR>l4+|?N=O6RbV3FgtpX;q+qPR^e z98fSB3je~#V<3~G3?2mi5vOqPu(a|W>1}i-F#XH3q&SvJY&_^-lD!dnZ_pw~+Ogc} ztHDFHc}bWoRaqWp|ymPxry>tu{0E3jD#IVsvqz`5J*rI z9FnjWE(8e!KN5_i)j4egi;pmbS6HoyZ97K!xNgrf<6z!~^E5AVXt9)wZ3iMrT~LtU zR~T;^OaLsg*ZfUOPZvoO)A60)YYRA1V$$m|6a5&TO02&;X4;Pr9%xrTyBZsxX^_iY zSnfLW^13N=v~(Wt#)pSoV}0EPicdd%c0S5;mM;|kUaPb$)Vx$mSSiVy6CP^DAorFs zp;o4)_r+>wT%9SGgCd+l1P%nZwXbUE;zFLwksxh|Mxwv&_IkB9_w1^lu1kv@fwyI+ zi7wvjdYr}NzJ9dYKHkFd$sB8(ycGY&O|>fd5GphY*Bj;-1DD%rizqCHPW*>&Ek#by z?liob#6c$(frX##ie2!YQs46_?S4Q_91}UYHTt3Qhi(gus#H{S#HKqGMq&s|dK@*um)4 zjd?K4{$&QsnMNIneD4hhF?u+B2mrA4V8^hxbMR|4K4PcbRSlPgqF^;_syV$%AEv?a84773%eL z6+`t`cdM1E_uBdpIrc!Cur~Q<0OaOq{$be;Xx26vBncURv7Ync3F%%LejR#r~3a`Zb*<{~xd0sbW)RyHoP9-wtRIUmaDaIseULAB`IV;x0r zPKEgZh$QFOr!oieV9txvq%WJdD$=CBPXOIFcE~96Qj?J);-{8%SpJ`LdypSx5MeZu z2rWsh)Q@32&uAybAtdI~@9%c4?5blg56f7Ce%r5_)_s5kP<@GFg~Xq}iK;;xnAJ4~ zWC?OTl(SAux?1~Sg?_`l$>^^7L_*Tj!o;OUnlC}h5v-;2TFA&*J5X*pjoC!tPFOIl z_*ozEzpJY6p#}{FL=^9?oV|K&;5Nm^4>}BgMaRt1!JK&;s`6JCODhlGYW^uY0vV(z zMunVfGAmihak^3n6TtVdsQLIeMq&P%JW{7`YW{ii=eOqat?RRu*c6~xy`yzSh#|`@ zM-)1K9(qJ}{w4f4S36(5G@6U6bY5aYN&S{IXaDt7;Z%oq(FxE3ibCK=-(XTmd@DG> zfLP~PH(fWKXc%F#5rweCL7oO18maSTgO2791pROwCQ2yt_*}088!S>eIeEQ2CfqDW zAXpfp!#s)~Wa$K(42TKm*I9`LxpD>D72OTi;t;WmI)4^3RobGWUoC_5Cz6iv!m(Pu zJTFOK6RS|}B5y}*`51hZq(ZReW{&-r?e6#1Z9M^V)5Os;!2Sw zNbzLYDP{sg@P0#&gV+M3l&n00Il-j(Xf79?_ zXSV3Lc$@OtP+|J4ocp_}66~W3NMsaY&84FawlCQ6Zh(521-~}xmX1;pV5r#N4`R&b6iWTeaz%eXdeX4nc&HMjNbwU31rhE)b#N5iN>O-oy|45lXAkl((mQQ; zSDW?O?YPt0t_O!Sb~G|6an4D&!yxSoc{kE;QIrsVW)|5l#|f8mWoS^RZ`MW#2q|%> zAfJ?_55>5}5*{{i+x3Y8&-(p=@6!Og;CUw>5}VTCoj|AroS*L%ck!*l^~)d67$DFL z$f$h1jGg-IWwDM7u&+4#C55ECtJFS*%s#`RZdiJ_LK{c#HHO$h(j}#(=mJj6pj@5G zVG~ZcGEo zXtAYZwlD+WKzK&NWDw!WJlc2MA)Fh>!vs_jA~l*8O%qO^?qM%0r2N-&ju8~>gXBTS zjc_1yF6~T52=6J_q)R723RkziCWTRtb}rlN!jKI=T*7(KTr!V^cgbwUM)DC0oanf2 z@fD9!1PbiD)T^4{KoJzq6J%{57@?Un7@A8W{)_L^d8>gh8Q?JhanYYRj0o`jI@(v0 zNcgKfqWh6IJ?I0Rd!n~@rL%*w=Qk~1kLjOLMqu7IczwYEmq79Hd8yd961#$bDcQA% z)dO5$1ADCj+EmRZvsohI=#n#=&DA@!K@&Si=p+$EegAr7PxqCttx5<|`u!Y({1n`E zD9JIZ5{UzH72Gv@Y++@Bb;f9e!8P^&S~gZATJ)U%lJf&?5X}eOZ=p0l-rP{nHq$jk zmsz)}mVd<6{o+>}q%#T)BF-5r6{b{t@NYBhdMb=giYSx$xqUByXVATSSn+wNW9xU` zkjCOijrU@RhWEkOS-xJzr*0f<+9hhlyE2gjapN?Y(y>L}KHqtX#laLwtPqeHipamO z$C{^M9R~A6i$?W=KdtIzA$}7}PxAJ*3OmY`iVep#VJ}A#F~1z_oe}J^!z5ArDi;U^ z?_ONBpg^9zOM90sVQ;~k+hFJCP08$BqRiDMON#evrHi~q@FFDJ8P=Av@kpxfW9PlC zXrPQV5(Qdm=_H2xi_v9?8dW+qiwOz#Ecs6{$Yf9!Jv~jPBW$B^T2xw)Q16{XA?y3; zmCtLeAK}RhIWoQ|ODG7q-fZ}e;tIupKE)E$t7XvleX)kj zDHR^pK)K&(S36~)Zb^6vp$xLmwVspAd_Ul zNctHFm%dt(v2{`sEoQfSJ)cV&Fs<9h2rC3PR*a$%w zP#N$SSm2@X;_s~%X#hundH17=QqF}=3-3aXl(;A$KuTyFo5+)8#6eZlUO2GWTIGE0 z@7b$Ch>t$b)k|>}m!j(Fhmag4#1JLAzKfaq)_`HG>`*Y0%?HCf38zV*!cV%H3Q`Mh zCiwud-9Ao2<@*_SxN=g+D}$X!g&7sUtHOPzt^RGf^B5_rPE%~}R7voz@`~?ttmv;p z=ibvHtodR|(iIHneDOgqMmK=lM-<9rmAEK#pnWngPa?-QYJxBLBzC@Pr5n#`0s@wJ z-N3OLVNgFhpf!@|1x+>)9L4l;NANs&mblX2(Pt_z-dJ^l`pPcU#O`TI(0+T#z_&Fe!#kYb4WuC8XM4qI*TcC=w0r+a&fHJVKC8K5G4 z)jEp`g@4nF8nh&!;1X5C*BAUDdkl|r?y}Md>y=g#Eq#~`*Ges;S=|VO#tx#eAJilJ zHMuEMwh&XJiiwLr4)pKj!y2O7W$Q@4p~olUk4Xdrh8?OFPOGEn#OeKb_#tci_?pRm zc*Th|hmVXKMCR!zAUj=V$RAhrOF#p~q^E~J%+m`c7efd!hSzLr^z>Ha1&hK3UJ~9k zWY!hyr|l=1dKB(zl!xH_qA(=l=d~rmQ(bS=_VpO4CW>M813`h)sjN}WhJ^8z?`n$P z@Cs_==)VlHnd@=-0QE+OWht*)^P2;SmgV{>+cd#uzS&@Y2B} z5)-I+xlxB~on~xKHfuf>HSKK*FG;Q@f}WN4SMB%N9jx%ttzTfZGWdIAA*%My1$ImC z78>&g?p*p*#KZu+BTu3sm~IyiQPAfX&ChO_n@6#raN|Mel)27(>(L5RnMlc+sjnL- z=r?3Uso7>KXb7$&^)Oym9_Nxw2TdznU~5B%6AQzNFh?_{_U(17O*<*&Tb{;KT<4`8_A zJW)EoCx?a_W()>Rm*Q{fnRvRoD^^VtUY+%>w{!b-xO@|78niDwZ=#fkzm}U(#qT?Q ztW#qkXn=nYrWhq|LJYI>aEp-A66iAJDuZCj2F?9WG^!^Eb`Cp}A1XRjTjDO>2r#~dEZviLC5iOv>B)< zwYW$|sjq@3A`DszL#9(Az=>e-?8-()=Y$qT+139w@dPI{oA7<{HK7^Gb|A*^^YbvyWUMqp_lm`1p}Vc`1>9 zjz+SNN~2zbTO0ZCSZl3}Bl9=_l~xp<3Xcs9udQ-zgD6O}*Dhx{BOC(eL+g5-?3Y{@ zz*AJL@GNP*@_m`Bl({^fAeO;CJ7(%$@%pm(GgOv3ov|L=5VpAq;B!U(yO`l_K^nXtH!r%>Xxw_9z|!cv7!TN0iPC518w9}g zobL!5jf%mpUZXxH{FA32pA@0)SLW9O!$N zH|6_MwpsmBAo$>4Qer=3PcBA0n@~)va1<#5aQet&|kSg&~Yl z{w5Cde!kJ*1*Jpq-xM!Sq)LZi_6n$I^%*mlrxSsKHttb9Ipjz)r*pK~B9Dcrp!Ogr zPm|4(DTqAkyCzjrd>PB+TVcNK*1l!G z)0?AB&$%?a>@7vWa3SNjOrg6v*DGbQ*E895A%zp&?B83Y!$|Fk_Je70VStju}Dxx6GU?6oY1$*J;3toXPYL8RBI!I7?lvd*E@5t z8Th#VIQho+HCE7?aHpr>4bNb+9_-KR{^=Jp<&l9TXN&^5pM=K8<}*r zzwU&Mvuxv*mt!j{_tVDXh`C)|uBIM_M(j=Ptv=fay$!)8!ej+~z)#J!vQ;G_bS`2G z4h;ibbSn9w@W_qOddt}MAwFqhWLkKowrswY_AP^DM!b}po832iceNisQ&ei;(Vzih zk(L5&LB01927TsSN!JH~MgKTy? zHtooV{>A6~@y-7=LLN2KQ3zbq+VDfa{mNnvB@0W6J_+!rZDsL~9UqIZ;UmK@$EyO# z;mEkAr>%!Ez_DFUKE}rCAJvycs`HgX!S0xxzjB;d|2ySZnVM3+%=$iPRH$n&Ufc21cXmD#cAW!{eEsngP#Bn+ z;i3`!c}@_#kH2l-t@uH8b7jmp2J8Y7MCl?#m^6mB-+A5~d5mexXY;!s0YpoM*P++D zej3616j9M~L-#wA&6NB_`VJJ~uUTR;rPGf-8%8nZvdi%v*Ym8=-q!C20qb*A5 z0g@B;J5Hr18=Ml&4n?L=FfSF?JL>m}iv^p`E2?lHDRAp&hQ@%b5Yiv# zHA<)=zZ>yQ+UL-Sa&l53OC$_U@FHX&p?*b`5r+|CnaD$&*M(dgh(GRGe4@E~`L+XU zUCZ%8w*S@RAkt@N_X%e4tbMQa01L&4m|k7{bz7-|BqPt?FEC<=_WeHJ`slK`};j zvuL9=L?PEKO*>7E(jV2Q2L=6U+w65`d7zj{-^XUE`|M}sd-{QO+0)>P>&-AG zqjsZZyk0-Yw>_y;;>sn_%G)o1i_D3QAkyc0JQ$EGqWhld>c1RtH#Q*yxA+P*3k99b zl?3@lYd)B{nezF>#A<&(=_d((T+w6l=~#owqJq zwoad1mQO1LDQg%Uue6`7MV)PJFb#k@4Du9+CDxm>E%0H)NBBnN`6`0;sc3+{s@>hd>Uwk^;3fH*;yVfIxZ!_SZfIL5O9Ch(oT}fCpho zQ&uB_ld`g`CJgZ36EWKb3Skd-)@0vDUkJRB01lL;QU+?}T*udj&quvCY4^vbByWa#(-movrZT^G+2u9VY$sa!tX$|a z`-P3LX>dZryVuKq!zizA;>1wy=T_)4G&Hm`?p-R5wHn7TP`~@Zb7#Rln)T*G@V9D% zTq7oPynO2BZ{E6F3j&VwM1-L{h_G<8O+SeI3?W-y`urD9+wa8f|E|!ks|y9C>Ck~V z>qS0x*{bUgJVxH^l89g2m3rhL>*I^~Mvv6B@IBDpSx0T(^9GsZEv%;s0inqnGWDk9 zgBDH-X;@=)Ahb4}vv@7c^bO*d<1h#rsEG}Ydkqx>BYmJ^z^u!#>41BPNbh_A@Zh(( zM8jNR=Y};;B?{hLIn3|iTQCaxFhoKOPGDUbj&|1vGfz)52TD-J-FS8F%JGrB!g*bLdOo<9SHN~9s$r;J$>gjTqe`*MCV2f3lY~JE{ z>gCAs^|EY2)PQ36dCtpn6RcQ{z zSn*m5s)7oA+VFRqfc=Hr?*XichPNBxhlXC39=5=+t~Fq->BK{qmHPWV@?_yhZ7hr} z5ImH{XV>kQ4LA~UcPET8AosZXO_3;0pv~e_8+8M-zSYy+_%HGTrY5>A zehdoMXhs}jNOuo;12;XtOT#fzCff=4s9*@Is1FUDAyWMGzHrd{(IX90f4y>b>2R{L zPC8*;_tbywKtIPa@#Crgi>yR^Mz%&xhxORqNWoHJ>HT6I=Uc#ixY1qME=aw~PSDc6 zgT6nSi5zKdB!SzYc}3_LN!ocDXHmDS&K;@}p1($*aJ!y`^4f!(Qnir5CPA_tiZtJJ zbNez-n00rT?fO&1$K)~oxYw}58smPWKbyQNJ-qm{ySt6n2RJ|Hp$Y9qV({&asYI`q zKr$J}f3jFEuDhk^EXmyz-|b!B9b|MtkCWcjxqo{tmvzw+vrb1_30qs?drKD2-JNS@ zQ~I5!|7w!I&tC+u8LUb52RELl#0t*tY)B~_7`c*sMzmvX3M5z6J>9&l3%#AfmPtC+ z+4T2}&FSLMD49Fy+P!;FXX;XcfbdYhqZQzc;jmoL9?#GD)#Y!~`*qpED&@km+q~rb z;$Tu@r^h2v(P$lZJ0it;K~PqS?;B&Kl_5qJJUu*P6*|O6GR2tZfYAmexX<(SvB!Vk zC=m%FvRFf}jeI%fy;PpUf&mYk#S)l4vNN&l`M%f{EbSM^o=m)EL>Mh$u+_-eS8;CI zRy3H8@jTwLB!9b)N=5wR!_`8<(xt`$A+HMN`7MxSZI8x7G#uothRHIB_ccb}cBPcc z_-|g1tZ~6_w^Q9V@px73ouv6*KwZ=}Cp9DzxMZ%GM8s^K&Q&0!*1s-hd|H3ib1M;~ zjrIg&$eR%L3f`}pc3PQX*3uh^3&RUXISw|Ho+V?{Yxx^^6v@#6l?oc<(~T0@%CrT= zX0RzcUevZ(0kSY|&5~X(x3ErqWU46gM3$b96)K*#H5?LI!QYBqfWSU9+Q%Eg%flp; zuFBvR{HZoGdLr=CYEo+{bYU&L^$xA?Ux%>+1@`EI1p}yhQI-QV{HyD>2fa9?2(N(I z+k54F-T8Jr6xQhLQ*rf}(h6%03n<0PTpN%D9a#*NPtjfU4+l?w~Z*l^%4a*V7S3M zb%{XM9rw=4P!7584JbqQpF{)jjJ)~?!vH1uVY|T~&ma^eMOO%bcAa$-sA}|p_>_)o z?Hli$%R`vytn$)OIGJgqh)AK9rJrEpGg9~I}6Xh`BxCgmDl?j9{ch)VwPxmRD#0nV*CzFK!qdvoHu(0l`H{^%zOk%NDsh903*&F@JF4 zF?NK4pyP7mvFaz@PaGi1&4NJh+EVkHy_thg;IsQWT<(R&nCRFr1n+z*NodrEzlKsP zIr4MMgBp`Mt6x{DmycbbC|9Ny*QWgMd%(<9<+oSH`54~bj(iYWiD5HFig##*aJvwp z!4_)B=YsbL@#gh!0xW|uMHUC1@U}cU@S}saYNR?fse|q+Dd{a3*?$fw2SFO1JnEW9 z@M6XLN=vP+ci93Huq4-!;QnRWPll0I>UxycyWk*G6bLi2{}NY8inh$2m$)=1I1 z>eXsIAR*D@Z{Aj0=*cqo({JL0gh0Be-~Q*HLH7=ot<7KQ7NdKttX{=z=}UR_zWvb? z!hhq(rf$0e^;?hf`sNCuK^DVsSO2nB83cAWx_zxo z-@vXBC!<9zDo)UVKJVo@DLfGU+bz0t1v!=l^y= zb|A(K0zjC8vL#==T^4-EI#$#u_tszXW-wbodHULIDHpaQWxeVXF21 zbp1gpD2@!0={RK1Dv{+Bp3>e71^Zj`WmzL`;db$e?CogS_;g%O8AN%*nylaC;R+ru z*w#fdttVQ3+r4PCp0aP3cXwP#e*@a!(UbJ@*!lvC7U*{t7hNpKi^K)6A;Liz*L2`D zt1<3%{$QqpQVg$cX-9<|wnS{Cgm_%_ab_L!c4vjV?2+Gf3`Jq&LERT6`!)ahxatdt zo7E^b*&CTL8d4wlG;l?0tJBNC92XlWdjcvx4affuK5sn{d-kDb2(T@>@ULTiVE2yL zuI)^9^O#UY|>%zBHnk}S*r+1L4&rHIWy%cD9V8#X3v>n=aTOf zLi&H0h~#OCw+ffED8+(`aLQGmJC$Z;a{&}f4r95mm4$KP^kk68*PV)`9TP@!F(fwc zS+>V3X(s9~*03%uTWYb*yr$JPLEcKJp%S%F90d?)Y|(@&o{WB!@g8yd(tGi8+|)7h zmdcBH(JE9l&)>gOk!Q71T}{{INByk%Hj0ePTA{?D14W1hXOlHbKZW%Q$=>1lQ?4ex z;9a*aAb{z|BP7^kP_qaz`0@k7WBVwaQxuNp*%^z$@k~}h?|0$G(@(is(QsWLu+Lsd z--0pm;mhCo`$DWCG!vC`i@xEQaWdhHBbT~*6HW%r#Bka-F`kxiQQ*xGf66z|x3x%Q z@KMD`)Z`KaK>8sa)j!kccjPEuG(V2wRXeKLBK3l0n=S`|lj;e-NA(()>pSr;*!sH$ z+Yn*E^GO`$`I(PTTf^kS^(=&Ux0Fhi@O{r+o)K1GS}JaJ2w<3~3uh@T|Nbdt>kDQ~ z=zN88pMzJQ3t@;gkaofXfdkZ#Zq5z$x{K?VF-8J(OP60Inf#!CCRfG?2bY#SY7T6+ zKlc5Mk>qat*mnl)F^JwH&$kSqB9F?W*!;y5g;H7*b{FGWhrXId0Y*v$&P1EHFJ945 zY*gfeX99|0`+(yBYhM4#c#A$D%7R?cZ)1Ky0v&x-8CYHanqLhiyz32g|igq z$(R-;ofOj4XtGQ)k3A#Tbo%$Pl`MC8@?kmHY%pdW9kk2gHhoR|*4X8H=(i{3H7qer zZ1Dm;J>ExDSVPU3R=EYwkeJ=X!ouqQ#bA56xVRimz%U#{XN6NcX8Ozu3kzyZB+aHKupcRm_RPpulw{>+Afp9e=bwUlhRJ-x2D8_z6`N&y6nS? zC7$|{<5BCNdb)n-+u!*$?Ih>l7J*q^d> z8{tQFbC_}0o)IoIs_I2C4Vw}l5*>r%qJF+S>=a?K1b_S5%fKh6YbX(mTw);+_(#8;CqLc{9&DC7;v|5DJU&#W^>7>0o9D8eIz z+9epcmg^ciJ`u$3?+00@A`a2x%gwOco7uA2E`uoEgB!^B!vmKdcBW--tO_q$<|{~v zNT04|LWVXmScM#n*}FNXMubki`@AnFibTD|4PE6WJS08Eg|860D5rlWiuXRebj4E&ARlM@U~9o$igth|%7XhRnn8?*d0oINt4ZilDEx64tPog8Dq?yrYL` zY0&SO<3g$t`&A%UU%6z#hH%M>Ktz#F!)6i}0#zfTp$}Jwg3$0b@Zd%4xDqOp85S?L zU88QyaCmKbDI_u-CFr(}mj52)@ttOAuU4myrG^4FvXhF|qNa%o=jJr0U(v!s~^>7~RsAO!(1evRq9~yu(=3YpFLylz`_Go(Wp- ztMPNej)}Q3zcp7%a~9}TDRV7FUS-9USW)kuEFRZxZ=c2`B}57G5(O?~_hBzhWrd|O z5RYJCesJFLOlQ;usgKXjWT1UeF6r6pJq<%_7QM3qysj4vz4b@?p0=&Pbln(a{}@F->ZSDd2Wnoom=K(C7tp;r+Fz*?FiM%AQXm3p(EY(DZtjl%USLTlEp zTD5Aqofw1ZbN&3w_$H;7_;`MLZ7AM_yBE+dcBpoFqgD zPf(Z;)Q+T2get$P@m}*!=260>8cBS7B^kUQ__-!N>hByKZpX zH+6w()^~{UPB};Ge5E_f3qvw~kN6D+_<0!^gv-fgrOfD^z5-j0vcLkb@&%3CTGAnzgPUZh4x9Oo;pV%%lRaXmq1 zns$n@67<6)-0qQh8LC+##KFLQ!Gddsa<)R+=YD*#T!NR+r~A7`S&N!17_?b&&0rSw zjeMGKq4bEyG-0*UJOt#HhzRJM#G-61Od#X~${&bkOp6AmGP|A}#x@QOz$2GmKarni zMDTm&S+x1zxt6V%W!`=$h@kTDu`7GP1wm2i`Z~`2*uGHVfzUu(+?Hl&pnsX3pJn>{ zd-SfuX$XroLT@I-JiCG6_8Z>Sp70vi&)ZdY9c!fEO#Na1_?|zV_9OOt@;w>+Y1jY= z(xUOnaNyQ^-Q4pz+|8Fm)|(M3!IB?ElmEA~#H|tv0V92`n#ThH+Hf3A;R|uN{Zgl? z&1}+F|4nnTYHRv;dwB_IG&xmI11YXf!QiW;u#nB{e(lp}Qo%&04nMZs(K`g&L+^hj zz1zVHWtd`4(*w7f{yJJ2W!B7;B4l0-mrqg31a47CRU<;1ABK$3FsPfvkbzm1sNK!_ zG(VE5bq^EOx9SPa5A(e#2_7DQ+>YP&&Ou#lIiDQ*U)S9pF`X|PS!@Cl^2zUZN&VuQMee#{uI+ryLmuq(k)UGDMs+5Yp3%Mx1w>AafkO`OBK zgKSS<-%moq6V5moU+_dAbj9|F7Onh3;{!k9Cn(_kM8D2EvPkkZAQ}AFL2|q-Bki~} z?+c#LDa@@|FNyy}mi1A!!Cd5QsjjZfRdzt1R+al;GSB$P(y|a|f;Urk?r`0V>-{NF z26pgp3$Z4y7GF#oACYvSvhQ8Md2W#`YFXxV215R}^f9vj%fmLqWof=sRFxG7zu?}B zH9o9DEklw$TvCI}v$jM&k+LTYDT)n=X9#`?@=NTwo|@2~G&+bJT+6uBIBVYcw?>MJ zNK5A{F4*7q5Km_Q9J5xlRtMf-!uf=RaGeete*<2^c?uwd#}*kf*FTw4F$L#Kbo?2w zNQ4t~F@Ej88(toKFLEc|N(I3{h5v#&;2FwY^?A2VK`01*N~!OBZdkUie!lcy4Ou{n z(+FNccqi+S6~~x%04=aO^wKnMK4(%P?uUGeR{7$l%X)NB*)0P`L3fVhzvv~1Of$t%>39` zIP--;3tZ)XZ;SH0w^R|-=%JBO{>lS6*}s$3v)pv>PEf6FJP$MEZH8jS?WhA;2P=d5 zW0jCXAE>_e`UT5j@yuQP%EgLjBT))Yl9R#dy(Rfw`B>CLD2;;lsWrAbAEjT^Kaw~U zh!2k4C--urc7OSS8w;rt;sABiJj`NswC*~Nf`V9bWmUpSF!8o@C)*+y5uopBQO!3l zHJV&{4jGul{ey10T>)$s&9lodvMe}_Vi3bud3QMFmc_H7q_GGuzh`Ol^F&GmR4^t5QA|rHEP5Z*NUFW)7kfy z=+Qt+f@D}II=~Bm)o(~`W?8RVKyafLSCMApEoyO}ad9~1y9FxQw3K(7*Xg%C2sN!+ zuPf|zf~{=|ihBptkP)fgGby&tRgU+BgFwP4MB7J*ZF*Tfp+#cMY$D)(OR{!Mn+X0F zBvokLLX9TmjY3w}pVDOX(=;A-*AMS|QzEY8-2%!rEXkDgHL+HOke7TwOuNg$Ax+E} z+EzBo7S{;TRXw8R=b2zZoW{9UloDD7@00svl;{93s@JUk;MwIYEQ zK#M&?FwyvZNni=3_m@uPL8}B^+jZE|Mc{O`o&!Gww9S$gCGdFkZm|DWCrVK`D*77b zSSFyXC3<<%qC1r=Ec;YnTW6)tl0u)ctx{(A<9A~y8v*18(HPnyaz-W)qZie0?xGlL zQnte2QWkM8GvrNP;KMPm04}L+k+Kf@{X!TfeWApPc(hq>i$QVT%>?^r=7dKb}WR$ z?SpvV{k>Nw@#}`?DHQSOURGr|ZR|S9Srpq&W8(L~p|MIZF?Zsrkl7z`p!GVxMPHi> zKP}Akw-+X7M@Nx(6!9mtLkbIn24$p-a^&uXa55olmMgR!7O<C#^g<^x)U-w8el0YdE@?JAAt}iPSPzoH zaCmp4_f361{`}0kyBBpZXEAd!iG!EKWX>Pa{Lh)*qjdHIcCO+bKO+1{U}e7j%j7!N&SuWk;eLcOz? zcK0vDpSGAWb&M6!Z4T963lmYVmP{oD8}pVo``S`NlWzL*ZxPe|@pU+anPppEVE#wC znYuw;nz|iEoQlx~=XuipE4{#47mw1~)E9}0s}9zGHds<^*CEB(E*>@+LX?S@ z3y4rWS#oxmm>yM*9qnU3%@s>hT@D803?BJfHd+~0HPXdA#r9in%~}6!46v?OD_2uA z(M5WjGj)F+eP2{us;WzObn)tnZX~WIoi9#Ke5M4oJlY>=mZ-hZmx$^r|&F(p;7SzUhGO;=hX$rPR( zQ1g9|rpsG%OOv>iogBkov(-}`EEdJXN%&?nwbbN&TGeqkkDlCGe7}%=yoWc9BECK4>NSAh3!xlltff8x+ z>u07iWnE8NM{;;pnf?=&9g4eqq`1qLK>g}2znW16WDA;s4sK%3gubaPo%f%VFe*Uk zSOH>1M`iF$@Q0P-C|f0O7yV%VF<%g#LYW+n9gFo8#&2N9r_6?%gn`p<_QVe7CKqg{DGZM=fsw(>LCIFe!TZ+-Wz0|@6^Upz0)Sc&-D6=&^mp4 zgV}91=inE~6}*{b?2Ka4vRr9!yYaX0+(@Z z2smtOXJJtI`R9Sd#OIffGGIP~p~Zb~#-dn^JCm;Z%Ys(a9>Jj^n;o^yu6E6!!s1!@ z+v8oR_9Yxoaf+yP-Z3dgv3iBkLfN|%SFry$jh16lM!jwAekp=xmyVu#^JC)G9%0{smZSmZ;_b_YhtX*Z(HPRjmD5b%p^=~KV!HoBi zAdZBmjDzNpAtOX4`uvn3UDqRXgK(e2{!;Gybnj4;a0zVc5u!9B+u)b<*-ep@e``zL zI(*78?JQD+|4};N&B+d?0*|L0Ls#i;;PlVG;ic|Jby2tpfCKM2qu{QsCQ+L2E^(@^ zdD8Sl#0O+F@<=7pbjskZb@IBe-BxNtGKj<|2E6}%9-R2ZM#jb3)5t2(ALRFLWE>cc zB=bNxuAOpqCblNkS*sJ$A|_py5iI0n=i6`skKAuq=Y+O;O0ov(b2AxkgeOqm!I}Tx ztKc`<80GPkjpf#Ad|}_9`g}e?)zQB6HrN9L78d#od6~Sr-%b0AY!)XT$f87AO>Gfz z->6~61g$V489IN8)V-!H%Xv{yu*or-$&exCYc$#i8*{JZ1g|s*LPOoQ)Q3dy95QV5 zc~FPs-%uzV8&p|$+I>NQ+0}ohEih|E{G=315MjzhFv>K`-C96CjjeiU z)884MLH+UGmybIo=5r*~AVWh!HobeA%joXOdS4n{KGDGIgS|K3o69 z$1H2r2~b0q0hxz-^t{1%Zv#h5*OoIiS<%L@va7w(__h$dlpu<2J`ejoN~p-Lf)9bl zkOz++_C9~1as!;75nuh%hd9mr-C6ykt@_gQz=8Ajqmg5iMLiGs*DUrWAqd?N5#;di zAhTTj=@j93^@&*wBc`Qj`4Oj#y1IRjhw`KVj*PVQkTWF_G6Kl<8+nF(O7ocxenKjz z&K5w@R8zk;J1E-mjU)r8@K}H-pK!29p`fKR`@=xN^Mi^>MkkZf?8DLlHe^ea?aSdv z*Q2HlQ^cJpPbie1jF8bHi7PBYB1&S~^@Fl*aay(NEqwrPLQNOPzu(0RmOO9Oi$iAv z8=ZtGiUWB~gu859?KwmjGg)|7D_S!OLOa_brIXrA?h#Z}hzOVhIP@RUNn>%}?R<3( zQ5j?=MIO3jW#Ebz)m*90u z3BrY9$b3z#W38d;y5rOT?X%#6xOu`tGlOSeU7)8ax*r`Pb`n4OOa^&d9oUm^8+2e( zSteEBl(`6fLWKfATpMkMD;;|KF(H(mgXA(&8r2tRMlwjgb8&ZouzbSH!2(U*um?(1 z2l=F+Jv_qHNR8;To2qh~=fIK=PbkB?n3={K-ni6`&!*lmZ$w7$eAB7$J56U>+X}UR ze>|3Um{!H}LhhpdysKiVJ3N#NF;3@Sf{>!=^4erlqn%xn;PG$OnvY3txz`YG(EH`W zK$jY>6*M))fs#|pEBn`!`C{+ z#HlifEeO4OG#NFE3?&R13(<*04JXA2eHE+@a~$iT5pOuR92wtNCyB~PTfr~|GQY@4 z$8^5W4`^GuswKpR<#yaz&NLA@uV?m&m$<^*@mpC@C&iR(C)dn zI(>9pci*LRi5eP%yluHzy?c?;z=0V!nMN|f>)!zb)#uB4>iX6~}*mkFWD}^++9jyh6Auf_u&1@q~`oR;F!0Q(@ ziq8NJ0MV|CV2<%-lTNdWLeJj-iAx^|;s^LtKv_Kzc11Z0menq8C#RyH-gmkBI!B1f z8dJz#_?uyLWmpx@FMSvm;|T^ikIKQ0xiM}X3tHDO_Ju08C1j5)H0uW!d~yLqYyn76 z>nN?Q3*|V1PKDqB6ls`r3}d!G9UXelc#Af*T4eHx`U%jZ{V?<}ihs|A3}~TX)>%(h z@yL@~5hW&&(QQq7*6gxM~}=PoRQKM4+TZViXV|$iZ{8;tzbx zKN?Z?hw$=-jPA_;mI8V9;m+RIcOWyb3f9O$?@{Amv3TPoegwe4NTqNAG`aQ{@n(9> zlvus<;(DsLz(40GWCc8FZCiX+sM!O`V~H_(sPwePs9DaX683#Io3?0=xUYb>r?kg= z%5iyd50mowqSPj3{;i*a!&ic`wQE>>iV-Pf%c3*iVXOY&StPEJ=_)r4r$52-+I9;(dE>q z!~4y8mMyhx$O7FgY+4uotXgl^=9N&za$47?vwvXxsJMWVaZJL-_qg zN&(Qb!i<@a*FE@r@@Ix3G?Ys`FUeh$?rz{ti{-6G(KjZ{qC%%}UPpHPnTYzC4a*j% z_V}ESnUx0@Ee`PO1i(VgBWqha zk(0pOSTBhwZtnhbsCsH$0}FOI?;N&!9Oc4%UDxFe^Fj-qTCPzAkMel-kpjz7%$Krs zYqxBnYNTmTY39uPI6DWLDH=zDKR%q~uO|eL3%0?=(6wTTePq zh9U`mXURpb$th-3u6lcq15g>J7%y_{A2aYi_%TJSOUFs_b-783qbO12ojG<-!e|{c z^9c+lY$nRX%jy1foEVocw{l)*7GGyWsQVM7svJ92T^Whsg3`;cWD24Ne!3`d>HQ*OM0!-4v>X#epsMH`WJ`5p=Ms3&b=*BGwKge;vjV+|uZR;l>X<=?r% z33vo=~J0gBWNl1{qQ`tYy1@M-UBj#C~?T0PXD zUdvBk{hqGi!+8>%>wmNNN8=|s2iulQJ;vow4Hgih?<55tIlPp}*E-_a=)R$S@%hCC zbo5uIJYDFzGDL+$y{7mgPYPOzL_aD<$%0xaAP>m?Rx_~XGvh` z@ZGnFW^_I)41g*zA<$B=x43n+b6E4=RqlmgJ;Q3Q_JvTE8r|Rdqp^i#ox-!?o!Rp* zwJh5cYFA0-JXOUvS1D)Ya6(awH_x-<2jPi%!+dcHe# z8spn!m)X{NQD8TcuMrOy*=%o>n3o8YBkztAM1y8^Fj?`}uNq>g;ek1Csmp8axAFDR6oubJLry)?YA~f=!pNY?hdT z`tf*f!DG)}3-?V7Thd9rJO$Z#wt~z!PfNX%7|-fI^Z;4C(8;6$qzaa}Cy@8TRn0ySf)1S!>k zmrs^|`lSPzOh(gHC0eal+ZZ=+P+c1Is|hxYb2j;>13JWiTIs25_Jg^4kl+r*0=l;9 z6Ao+NV4BKHQk+5%byTg5ftn_{IL8|r zk?zu>8F23+dd(l>#=E%d*Zb$m#Sxbnz2G2?)@Yi{HrNS9Q&Kc;Rw`u zF(_i9vNl;&DZv8-a#y^^rF*EQ*H!e9^(D|uOHwU#AZ#WG?M z5JNKVampQq$Qfc1p&%l_g;Xv=J}OX(_SFc*z-m1qvJ~pRIYf0-9F9a_zBsXSz$>Kq zBS95#h%$$w(?luU9O&jtMGiMI3-+(^y;zzATKEO~)4@`|xag3&y}>@VuPJB{F`;wq zgbdF)3eX#`*5f0rAS81d5A}W0g2U3pZypQ#BhL+DBIvs>@AEet8Y2kR08cil&6_DI z_oxyKv$PSV#sdI~aK2>ibW<=#ra6BavP=S!BBzzJ zL;?+IlAP_S|6O)xavr33})09$RMBH?Nlo5UUW`Di5T*qyZZV; zl$Ru4hW@>czN&;&f!afdfebtZhPdt6=tq;uvZA`;Egkb7lShRg$#LQ9%gVfL9r+iA z^<(6rfg8suPVi7IcXlsvnC;(7q{8P5Ohjx5h5()wro<(h147s|R@n1%z2F?%N*oj% zG9wGqVJ{w@F#_D50kr5F`Y;pYJ4p_n}Z_AT4&60Yi1C>bxm_y#L+f zS!9K*o2s83evfaA5Uga)K#1D*&-eIrFT(CkJ#>X%8^7awzUxc3OOOl*K^9~Yg>#P4 zLJhElSAoRp=mH5UXf@$H>|U{2k$4#7K1r{BsB(<>PB>YodUXo}>p{8{c`oNeX2egQ z4x68Po6B};vO$XUpVt14Py<7eh6_i31UiOPS|OW=Yd1KSkEJ0|nHoA14Yt*(I~Elj zZ8k@tcW>tU&}d`rbklM~u%0_cYPGl9LvgLi%^S~) z8z#>O0ex+u;EoelnxgH^zXNb~WMc;Jf4%$v3ekT6+DyxPG+u6~1lVm0s3)`EDYJ_fHb$;p*p?m8oiHVuV<8vx@VxlkZib)F3NF)~_l0T{JZP_neRb>mjMO z;Qh5?Z&(stg2yC+9Efc{JD}7vA&qCN9LndQgyxru@4sH(;p|;0^Ai31NypMicHp#h;wiHhOG@ z4E~zx>J4E4fGbP3K!VEakvUAOZ^piL#d&_U?#oP<=9E#;bH3lnk$?%|U&v{v zPnPA95rhA1Y_f;;!J4QbN^FsO3ccKlX{~|-Mmu&&ZLZOVSV~JR3yX+vZ78KF#XFL$ zLYC3!LXnSn!pa9)f~BM%d_(4c`SPGqyfNUrz2Hu1uc)Xv*=T#nx_QoVkpNQ1aP~%- zLOI)HZxQHO-s9@P!L1mf07R0wIY;5~m2xx9A)-CQzU2z$@-QTd!HXHk$ZEpl#uOP2 zwCB4|mW;$#+9VN2(@s)fWas?vPtBQj#JMwdsz+@lKy7RXkeK@bA173!tTGk01})EkDEVkdl;rls6q0V%9=^JlN{C2B z_f}!-Eh+yQ*1DI{-`nt}YEuxxK~LSllY+&#w5d6xt8@9sD%eT*A8v+0C;otTyy#uD zu$cqOF$rq=LM|W#B*8(VDD&Wi29;9$xrYc45o-N+|C^9fmA#rYI%WWQwpN|A@qZ5j zkK=sz9-F6yAm}xDI3K|D81zy`=st+Pr>~a`V|!k^8k?j%#j+nLSt~ZLvo-mp*NN~p z{t?UjVI}2m=V}gU0qH6}*@n;|&K_A=c%(7`mKO`nfM}Thw#&igcukIK!9Y=($aQbFR=b#(EPXNPKNyKK^(v?^>}Jn7^h-OGixyQsg&4Aua?+0N_{tY~diz zN!nh(uq~g-T1u3DlKYsoLDf3WKRgFP25@-YxfmkBQp&A#2x~JU6_vDVN#c}Ph@p-p zoAhY?Zbk~Xa`!1Jllx#3s`OHDJyUPRgm<$Xj2JWbS2ALL8bwSodv=PJ%h!sBbrH|2 z0)ZBnhcW&0fijPnD~Db*>NE#ZaQ^sPWYC$nR0lye0%Gb-C^sXC5AYu{CyG$`3UeQ4d(L%L1swKnNf>r%N&lOb2XZTW+7Ayst>z&#vnN z0hd-pB!CEzT8oG%aM-0mIe%(>(^1NaH>`;@(uf}3yb&GX_SWUe>C%4zCxb(!Tb)^~ zm=FO&(j%pVkPYb(Qq;qWr;L+X6(oh+60u-+9oOY1A+em)BTJ%w?@VN*>kTKfm;pTY z-xXfEnre|wZsb3as6o`8m?eD{K|eO!qZh367t4875b~tKt$!6z zsq^-xoAyL}i-KUEY+2B9L^8CKnb}GW$-1MQSMe!`XBpT(t`ywex}k)Gb^ptOPSIv( zmx~7$y}dmme~SzOz^Bn0;DODrZ16BFBP`^L%O-%q~;yJ+@#sGDPM ziZQw2B18nz&JZ$qJUHpNkbEz#=PUdhn7`AO#5^k+R2DueNDT->lx$hEXP?hhP$>qN zgWP(I>`@Y5(3O7T30=8)@P0ozipIk7Qpquj1}46981kZDOU%GJyDlf>UNqI3)H%z< zI=u>La1nWB!KHCo`A~JRxt=RD%cyw8rjjk3!F=y~YgD$}*;!V@R%y(l^MLYFp_O4z zga__$87D%nJe$QjXyz?uwQX)!LG0^>8VwQ}#dw!Ow z+E}SkC;gsW+0$vYqsG2rcExJ2GCuZPk8Mx6P=QYH?KMA%%8&pA1W>CxO9%~VT-b+< zfRGTV0*P^_IURh<^g1gTR!(j%ZGHTl;8^PEtlUdZ!riFt+!bwj2HHvs7aP1B$k0DitQf|aY#lw zIX{#P1Y+Z+0{4Aoc6bf-33Pnyo2OS%e>%~JNPyDE3(fojdtiP(F{l_0Un zGcK$*;5-WgH^196z26dy`tLG{=G*a(Js2u*{gR1f*q~?bsT#w3Y{gCEWT{4P45?bk zkUxRxh&U$&3G1cX!gBI-@gz9d7!OL$D)-AH&J=-WP{v)0PIYZ+++Lh+v1Xm}=Bk%W z|IW57wndwzXqcRa=J*@b5C>Sd)AWqw#bTXAwJo`@CN+?W%YVWS2%&B%2uMF+0&0F@ zAoMsm;5OnkVIn(J0S^B$zf1X8+31mM-DpMww9#2Po}~)D@H) zVj|$M=e#d9KQl52`vma6Qhv(q(hs>T^Xy@;K||gR1N&nBL(I-Hu9+KHZ@#$lqhH!9 z56czT&M|R*&*hIo{|R1fT)4&YyKoFcq$1k>ukc9p%YM4}%XfY9R)^y!v9G3?sf!I^ zG_?)s_nmHQ2juUwMs*|A@`vnfll~wxcmd!*9OksXT3jjmomEiz5Z8E8YsZXI_ER0y za z1ee+Gb^9|!vf))J<)XvNgo7mbdWFzZ22vtJC8Aq7pzRlLSoK~iXnRDzjN@c_cW`uyH8zhH}gtSlEerV0G#23XT}2f2I8a!g36LmL7yc}3iVQO z_Myd{)p?p6^}V0T52G? z(}1riv0Mfi-}kl>+*6L=Y*ZRxD4HuvX19~$+?D-L_0gf{A@Xr~dWfj#IuxABmAiD4 zK0+!aVn^+rLPX%Qyph=zbEkTZ_IpuU;2R0T(*66hjg4ewOONn4kpr(&xYB8Y zk9FyEMv@%}pc#2%GO3j#p6i^^w3Qt-FrEmet`^cno3l>HBl~h}5@27Y;Q=B@G7%T? z;SmEH$E85QKe%ve^88T&p5b);2;FjS?;Q+OTj79ExCE-+2$U~f`wnj?Tu#$}7hyP` zLIw5d*5fAKyff%|a@(;rJ?gRRs;_|whbnYeBMgTyl#30|bE--K_4BUH*h*q?IZ+3j z9wtIwHR(ACpS~B258PL-3;+z4C%otDY$Ln1O$aSz$00k9<6G5fv?3UrP#izqVuyP? z2ENOo`>en1_AxmDPwI5b7|41VWHJ z9Gq+1{4;liy)jpHbok5iMKjl+p1hhV$|a_o^zNlAdiO7Eb*D=REo#~zsj!b(=O??t zhiFU;i$Xs8LcY+5*gs8=&43JDE`xJn(JyF&?68RTE4LSiJ+79lXS$=DoB^AI6o-^T z+(55R8XP_6y1Jr2cii~UZ6qJZAnOvDjGvSnlp^QqN)c!3TMP6Az#jL(MdwyCuCd1; z*k3GsEIcqEayB%Mp{+ql@GDaONRgfsNfWcL<%8`nYne!Q0H8R_efvS7gqhKzZJ6*Y z@MF7+A8O7OOO6z47>>bi+O7uk>5 zAA&xd)RL1=1a5c2)Gbhy)%00+FVCbZk zCYX#iWhzep6g(Brwn@;lH+v1k?k_6Ai3yiz+BJl=H5;y;&D6ukMn*xxG2P|@pNP~n zuXVrhF~JRxsqADX9lq{cmq-ZRQ*MUPyxo?18Xx*yo2d_@^~z;RZ+X{v_4KkEV`b?( zsi5F2DWHkhu%#P;c!9?Lf68F zfMdvq(+%`iML1WTNh9nEmf|wr!fAM^OR+YpNlh_tIKmR4lP2XM=b1{}%$O?lSzjxZ zZYtuU$;-oNc9Dd`2yKoR+6v3`TqQw)dtqHSHZ9<+uW_C9vT8IfyZJxZ1W>Qp6udDR2OYQwiOvJEj; zGq!e}A7`8M?Z%ZBF+Z3Ah@J0)rc$Quhgw|A&RhN-;{*w_7?{#r>5#i(fsZ7_aeKLX zldc_$(`%XtxUAxt?uMkke5+x`ttB5WVKK6Od(28qn|j3%Pv9(0)NSW;__)HUF6{|oP`4o1@EB87f}i&_7i0g6ecmFt(tN> z&Ofy0@|VsNs?f_dJ((MoA4G(03tGr_8mh4G?N4bAN7Nv%ZkPtL?}l>qK3dsgOG?0N zH`Q`o)%yQ7h5!=2<3^=>MeFtO%WT>eNh+Y4XuU&+HO7H#kO{3386fhCl9W_Hv+~zM zrZMEPaWxpVD(NgAq&P$?5kFEjyH>0n`I%MpPp3gguCOF2fhKClDm;?N^JYP1pKCh- z2MjRUaQVcAgZ2rrN7W&claJNLUhrW0@(h;v%Zt%P_Ad#P@mL0P?(RsDhPYACe`YND3efj6@*xnz6!KJhKv!fIqdakr@E zD&9fBZbHfUB!MD(j>tnlWs7h|bTwNg4K@g(?%j$FVZ|rSSr+s;mnmGajYL!jXobBe z8kvvwAsIe%c5_F`=Y+<#kYl98ha*z~FI#Iu%8$Lto`0k7v>d|CA z>lDl-R^O_{MzhZ+P@g^IB+OTHaKl%udxkAkjiR!o;@1#;_GmR**WVE*JtZLTiJ6tr z-7w7TbU`W9-h`Nz$*yCRiu+|bPKpB=Q8@J}SO$yk2ygYAo=b69Y&U8k%=f1_$kaOuP=);2>J-u)Fq^%5;`)<->12$yXgOPppTp#Pk+0^ zg$_w^jeN7!h5`8o^20MT8Lz!bUR=zF?#>dvOSM8gKwP=QvF;WRxU=LV>0?Z?IQ&b&&DBc-^fc#74dY*KZb zIN2FxJf?Gw|9*vc1v00flpa!8sQVVjwzjF(U@+z=5eUGd%fq71-LehR4g-aSROuN< zYQ2LlU;3@USKfciZsI$+R*jZY^M+(*gz9qMPI3mlML*|GyWRSgQD&9O*oN?Q72eU4 zqe8!);lcKWhKj6zrAx!O?ys8WRqJ0h^U4pSWkX2qpC6p>$y?`H_|r=yh7k6sP6vUX z+IsZ~LfrCS`k$>PL%|ZMGl9Kbwbtdo4KQVGs$AXb@)REq_SS~H5kpylz}+U?TM zJ)4__0Bzjc78c4 z@FDU>!n2}%hQqd62T1(^t;G$@$SEZ@Y*h!>UqZ!6Zutd6?w{~V?3`A3b{6orRjOHj zWi}R6GG^Vlp!1A@&!Qr7497=_u9v=ihk^kuykviO{@O3{(BJwe2pPgXwbpDC7qFi} zzCZrWu7#B|F0ryv17pw>WSh_83C1SVN0~ym!ZqnZpIB&RAc!Eva4T-=&=OM!6*v@$ zih9|${kbXfJ<9N;j?l_C^1x3Xs>C)~NB|CqvC4gb*2g{w;0sl{X-onjZ>34sJvrsb zGlm*RTDOC>dRJPi-<=krlVSe=vFK}TsO}19hW_|cY06F9`1vZgxt?>C)kdSuZN-$4 zC*xTha=FUS1#cf`w0obE*2KF;hI#-Z1PtI`OqLiSx_j>b<#p;#=2MKwAV z;H9j6*Hq+pYOa_LkPP~n3o%d6ivv;D>`e@N|32w@FTCpt8HBPYlC>Wh=_LXK`gb&X zZGSkJT5cL?eh7Kf!C6LITXtD~s1_eMW$h&*iA+P6Cy5|YH<~(j3t4^HFXGKCWkbRZ zzR^R1q-vX|E>LeO8FhmDn#ezitTh9=Krq+5fsPV>mqmo>K4{%1HUfKd7Y zGOW$fdkQp!x7k{bO`o^}o7qsYr~%-hQo>yj;A_2Pw;0a#zq4CJe8b*Ncp?Y98h3Kz z>+PJYSJUKWlfUdrE9U1Ae?8v-L+n`g)Ez(HcH5kJ@-Bg&ZaE6GoNIzZPw;gUruz>_ z`7!+hNpwI$Kkd6XU=X4qCBVs=5460CMU%X*u_wC=U6lvv564fs-r(x@1MD8g&X3~OZMF1 zlj5!VEX|m^aRFH4Z9CYH_ix9X8@>NN?SB9HRlS>QL&dNM1YsJ|-u6`1pbEA5x}Xw- z3B!XCqEEQ#G?IPj@nJLY%xBD8RHG~U(Qx|EjM1-?BsaEa^ku}nQGIY0d)PvJ`g?|U zQo)Ho$dEDhIY=^(A?YzMX-ZD&H9Y<6QR~nCLfY}hly~33$tO)xU=85JNH6LZ5L`p` zyG7N+r+(F*J=H;>hV7&GU_Ct)2mtk!oJ44^uq*Hm&(N10wWPY}fryLC8GiWx9b8a) zH3j;Iai@m|l?~jinCpI6D*bnaF3uz5s=kzCXqef>VN|yG8DVo0sd)tG=WFh^!j@7I z%|d&d(LPPCIQU80vwG21GunhSQ3Bj#=o3Jv)s&?SqvG#L#Dy?M2fEqcm%OxROjvj6 zrBolKQv=xWjbq8gz()E`CRq-i*Eny9jql7|jdG&x3}jytG1!gmD-V>zs3mLdroWhl z=xPMqrguo^Nv+`1AYPs*_Eh+J5lb=xO#fbMkOHRpvhGq=nzAOh!7)Nv;kx7#!ew>9 z?W?Xd-S0|wO=h#NmK+54zp9e=mz0veR7s)MREzl8Z}P%xZSOR*Fl^7^2(kV0)Z%+brAGj_U8;s0*JunoH*l_bWHiy0Uh#_~JQ zQ8O3&&9TKbQ~w6qQ_~xSbo~k8DF=10;^1^Di=%vhoH3Gr7k>%b0WQB1o;GdWCOO|lpXbNz>a#*eeY7ee;c6WI|0Jd? zD$*0}P%OVhkJEUwK~H91H>y9qZWJdk6fdxRIO@cqKb0g1r+D*`je%(LpsH;YD?T76 z7wM=R9gsv1q;gIB22w^Ixe!T%t=EKDh8*g4!)=X+AJ)jKNgerYn1#%BUkUIeAZu=t zFms42AdfapE*Y1itFMMKMgZ<^>=x`^4VljU)(OpvF{^II_+D3+_wUHFSBhg-1bh+! zZY~$37jYHSRek#XEK55z(R}~zvz*6X#xB<3u`ADv=rS{rRSd(k|EVod)W?x->my%w z;QIP(Ra$k=p}_&Alv?fSLZH8^Kz-3;Gaj>%eUh?Ls(ikcSZhwZOWp&d+IQ-4xvp5| z-{mxzHRdmz%}R6C+PYV!!MinM zg=!%h=w>}yRVCB6{pD(gbI977@OXki_Q%gTuQM8DkeLUC#_uR5@!YEZC31Pg$=wWi z_xb^UOc`_(k?m}>l-<=(Yh~Ur<0u#h^TP%s4)1M;2Kt7a{#ADJF58=77bY~MxTP{x z#_$Yyg-xlhbqL3Bq?tJXdo`IL6V+@IJXN%X4Zlp~ut);J#8|h~gD8qWvn*rrk~hyZ z37{Cd_LoE)wIm^c;9(?cm6U;I7{V?DK#fc7;=`imq?f9LUiPD#8FyOS&Ym;3f~OT+ z7UfdOet$WWKJhXdW%7LNLC852Q@0%~3Z7OqWUMMuNp$Hcr0x%{<>xvH}$6(j^n!n}2K=e~YrPSQ|VwGHP(`wQE+j9}j+>{y%V zZMG2FY-#Ue*kO!{Nq^Rf^rQwt^HG7w-UWLWh&!YaGI@2=XinC2;JpJZ*EwnSTm&4g z4O&-JF(n)<5vrhd!1 z5@&O)mY4R9eIZjVg{E^INYh^oqK4JKjTh^%qG@hx>PW0<@)MDk!0U04Xi{YmH*vUa zZ7Q<;+IZdNYg=M?a_9eUywUNe6J+^dZpmn)xU3UliV27d#@bcSwORLMt#k{SvevlZ zvu{ZJs8|DRqPuyzlV=LITHs(&=*uWcV)lA_OYJL2DS7oK!GZnl_2;*iA8#l9) zM4YcC51H^J7@vLecNnatmFzwd$Y4K2mAyuXhe%=<{j2q`{&c{aow!&%g3XH8`N)UQ zDi5GwWe~mv-D8}sZON)*t5)j{*;RQIEs814Z}yKmgWkr&!`s>=^pN_eu%!wY5=z0K z{V-N>t(vVZ6nAa481p9pqBgZE;a_vxdYLn zN&sRy%gL94h{QZQ0oJ+d-!XCHv{q}yF$L*Uz9k`h% zKu6A@nhpOL&KS<2G>=}vO#n$(yx7)Klc^;HeMA+81L;`VAVcfrG4b`>6uo*?iD_#c zyt!e>HJ$g9di&-hZ44TG8%6%r1?fQw@M%kAQ9R)g#*#O}uA;qo0DyoU<+qHjRO0FF zY^SoNVAz^VVW4=*z-Eia)JZYgG77*WEMN!(zk?H9!@rTgF10z(idn%=>h;cY<>25H zTXQBIR_%}`{!Xs|LdZ{>)Pp^H8p(nnVbkWLVjREIfAttlo}W!lW-x7?v;ZGe8RjfcMbv zLO*N@u8RKD;2~?C;Sz2Q6{2Rthnc?)6Tkt&Y9Rf}rty>jDx6Hv8_Xfai1%SZXM-Py zTA^3|<3#9xOnx=kpzm+Lx>o;YO0y**#j05Dn49!jAJbMBpM(aTkT!`Ns$@LRSHJ;`|`N9B@7D_8x zSiF!f(Sc&NR{5KJNEZ3IFX3`YHAj4z+{Ctlv`Ho0GznKG{x;@!YN;Un;{gb@fW3je zPZ}GQc7&yT(fOG@xnJHGVfV3~B|h@+KeO?XN%pNN++FYjY>t?oBTHml;s^!{TG)>Q>GBMjpEnPB~ih~e}%{T8kAU*ZK zu)IZAxwgK#P{HMztjw|w*S4aQ-{pv{77JK4$_==(y7JUpvc9cg$Yl8Ve;Y(<6OrH9 z2JF0;!Z`QuAY$XiT9>VZ^=BGTD#V?fmqMkLYyZ0YE~(6VdRpD8^$uYYv_wb(TO}Vl zzUC6$E5Ug%v=)3?g*yv96wqv8`*-^J=nM6~$8UrH0l}rm9a_77OAyj{J}3<8}OE2PzG<1!~CsIiM#6x9|W?QKUu zrck<v&hlpYcavWvmQq0g?n6rov|*6%y$n?_qkVF7v_$F<0m3%b$?&n$8U8HYF$1!KTh^oweU2 zK^lsp6i(&^H5JTlUB&_))~{6+Kj8OQJ~>Hp>C;Hj3+``_TvEb%aA=TVE@!a7Z|GRm zWdDz&tBz{A@%p1=gg8X$Zl$|xbP3Yk-Q6vnf^-TzfOK~^f^>IxcMjg~@BMRUY-gOa zb9e727oFo)?d01pIK*$Ax+?~eDn0-tCH%K$rov@g;CFefY2#wRGGxZ`-nQL!aFrzf z(|h=Z#@)i&IN0^mjbq+{dd=3xF|$J-$J;X(B!2g3&4P5PH+6&uAzC^znQ$#zKb<|} zGnl0Zv1jZNVxKkwdY^LZar@)%fsh=NBODkJ1SJbL)y${((Y~sC9W`QojHmgXxr09) zf>>00H=3^(LOQ)E>d2$(s)EM?XM$d8>t<32>lT2MhuZ$=bT9JzvR`LQ4f;=K2=OCg z8iZ9Oq>%4d?b+H14*b78hRPsrWWmo&rlr^Yf8*BIwy#S{sR+17amIE_8Cv;{;tUl= zD(mHGv@M@Z|H752U-MgI%UXJzW51mVp4$vC+wlE2gyq-18{s@ybwm};4FB6^5l%Bm zDpSM$<>E}ELscG*!8#Syg}hvv)|eKb9E zlu7@dRYZ!p*M>)GjX1{dbR|Sv=_=NOxp1g9M5$aYH&V+@F|X3SKufydomX^W22;S4 z%xsM!^ThEaWi*aTIsKROvu_p<8w@XXs=qa5Zp*kt#B%1>U&%&B=ekv9D5Q0+osJeH zl$F?j)!Zg~Iw+4v72p>U%KStN1pS86H!gjVM^I$YY(OM~uQJip)hpj@5)rpsP@|mO zPnDl%rC9BqeJQclo^CI^ts&(WaZh;I4%mvrO0$)vbf)TQ^% zk6TM#ZoezdJ*w7g%8d%l66xMdpC4XL{yA6zjWV))oV)1Gg-brF`$!m|Pz&-;08#UM zY%aqCYl1I3Grje&s{&e_jXo`(|GNJzu|`~W{-U&y84LmkvZ0MG-$^3jdTnAW@>Ihwb=Sn})xEs^ite?%IG5D|}Kr!ptC{%<9!4KeJck zqrK!9%fLn2cK_Q|>zQvD7O2Z!FoTazwHFua;hE5bYZf)f6>IX&EA$6k1k0q&G>ty3 z;#W#b3Nxd8PE=vA?!ZT~N(iZXNhw#`e@=fER%zC2r3<){-$EGo-}invn*vDGDEZjQ zn1k|#z0rJQW6@i$?aH?&5~0Vx3J4%t(^hx;=gznD^@V2Vk+|1`FrX8omq!x(T}FO7 za?n_>Qtzv3WPi>0eseNX0K}?Mo=oiPXPRJ@(t4%hlUpwn&Am*v0WevX8*F%p4tG0& zvYD~Hrf8T_+KI48t#r^R-h@@7k}DXb|1>3<^Y${&GLT-VB!kkO$U4AHhDg?j>#X~A z$oVE*b9vazUN5P7QsQfcItR>-@T9{Zb_P2lSgY=W$yh*tAfBRG(eD>sx;m zTkg*(5s9N)Gtv!N>h0L=y=(D-)b;aYVH7agpd)&3bU(RYXXT_t(uk^fd}3?_D+o+B zUB|tD>7k;Uq*I~6sQ#lHG+=>Xz3|7~tuaGMtC(FkMGpXO$6$V|$FnGhl&ako6$f+W zqTRnG!M|y*LS5i}NFpdUJ{K;R7RrFC_?V}U^PhVjHmpp7`M?vcA2-Zy{OXrHvv6iDV!iBQ7PvX@kX zs#OLQq&bW1w(=FR5@$|l@LeX`9;*!8M&&S5EC0Rl!|JS8o2Zcjm?u9|IhYwMrE``) zFju#6zGkFeX{js)uLwdO{CC9vQtNgm=Cr_}!r+C%7*-US6uJEe*R{$sc%y!P5kW)6xo3OcGH%d6BB6|HE}4JE;(h6Xol5`IWY2Dz>? zC_v}p8zK3?PqeOPMM@Q$rSZ{vJK{@W@ZL3NP*>^JZeF_vW3rW3vk6g#wGrjn(nsGH zpi07r`egPara%2oL|FU3yq^&zmeSznXd$8b7RwognGO}Ji$|Yo$pp?vc)DATU=~mt z))?yVpDe?g10kx;w7Kl1eWOuvYxvO@C&uGBM9X!$PV%yMD(X04e|-B2&~Ep#V3%R) ztnT(#RG)7>zJX{-19ZSyQrP*0$HXHk_7O$j4r>+YE5)c>-X0Emsfh<%Fn*Of@5|lIYS%keQr^Qj8;2<*Ri>i){arMPt<$cQN zj0!qY+7VU^vC=doaynt~n1(bcr%-y7BX)AuyS#R~eu?!ROb?~oW;qdJ^u8o#Y~KBJj~oWw5*?0cIB#_n&|dYl6*>6x!PteR5Er~>Qff$ zy;;*s$_m*^j}HSo&ZH=PoZYQtDNR~Ffee)9wkI1yf3PJD(BbqDxreS+OLeo?h8APK zP|vAD!O`)Snu7}Ro#$)uUZ$|a{C=6$$(i|oUY`hsLF3=%srNHl8xd{7a%C$Umo#G75sJ1Lb>%l;Od@!AhS)5Q#O%?xk$QgVY3Xbm-I|4D?jWrAMRqTRrO zG~?k?0tKgt#^xBYhxO2dU)Di1SZ~~hbYHo`#|oogB#}% z^}20hpi*+=;~NYCnbzF@x*%UQYHcVl3+=beK?MrOp(KYa#3dhIIwf*c+UL6JYM1RD z-1-2ds8?vI!4`|m#MAROH!NF4Rdreg)VEms%l{I`|Go?1o{6c_EgZe!^gpGD5B?7V zz^-=OqDHTVjh#&5dowgOg-@1(;L9+w)b9O^@L^?s`WGcI>27CdZ&Es6CVF}zOTGd+ z+t&k0A#NVe!(TZsgBapHu8RzfC(jFmf>#U13jVjH>n73d&#UeN7hN#@x2OE>-}dKg zy75vMY&nm^LT}e8ewR3Jut0=XpzkB3^X+*Y7WQ_L-?;8qODPS`jq}+F^giQxImlPw z$|#TXy9rE6x&a0sPGrARSlh<6r~i(mV4dr6AJ7FiB>F*MP19T^;S&b(C-H7v?5JG@ zpDp|I_WK3|WH)zLsxJj#k-=QSocnE(w}XWR2W~mbosd^32M=GS zU3X#uAeC0FS@iX1?~;KGkWZQ4M*_eI8_-}7a=FzSEB*qD{+&DD39G|m!yBpw5?PS2 za6esRX)GjFs;bwbb!xQ-}dUsm_*ly)N)X9UFJ(fr`Kq(i=!S=&FX3g^)9=YrTlX{JJO_6Gj zpm;clC<5|F(@x{N+UlIqXf#rLyW@@EDgZEyWxX35^SevVDmq)@OJ+cr=R}qa^Q*Fa zS>1U-4)sFj@2C+$78R!YBi{@PLdzu`LLBBedethNsrR;VX|+hLE%9=utXkC49xAiD zMdxITsx~+%P+E;sE_N^(&1H#h2;t9!l-hbX{cI8z<}SIDYWbP)pS)h&tc~uKCl9FM z*l6N!l?#lxGo;G6uBr?~`WvE?a0C`doHt2xjIChN?1xlvF2e-d2lI>GW5F%Bto|-p zXyD-H*3;1M3jdSN)aVfCSY>{{XVqTakUhyB<5U3@WoKc=*;pf}bZMDkl3(!}{;HuA z0jH?Vb!$%&lL__9}65}TRA%DymaVxl(c zQJrw-HB*`xtj_+{W%?2;dg=4`^-!Ou-Q4=8K_Z=&NaxMVVZsQv#Koy_G?M8`r8PzS z_vwat)LWb8Z18i#`y$o?uX59Zybh!Kq*8VkC=j{psQmq{@bzKZJUJLd(&o&KH<`oJ zdb6@v2Bnk_A(np!VP8t7kLMC979}lCH`cay#P>A)QBu56ise8Rv7I!nR(T?iQS(1Rc?Uo#qxmA(zV1K+H!@S7B;z7+|17%WSnf-ZiMEW8~K znqhPM!-nRPNJ6+R-*SWP z6Kwr$wz@hO2&}>MIA8C)zV|yHk0tW9^znHRB>^NN7=Bm3-aK3x*m-$hI__72{}T^CE)R70whCSZKGP*V>A&u-6YuF z7FylC>9O^-NBG}fBA(AXN7zSG^my+tdKJX;wQ3ia>aCCC-X1>O-4%9RC52Uv;YYJf z*U3*OP|AHFAUr{P2a7c}XZ3`FjdiB$gr4%(+kk()q(pI;_jJ+se)aI$v*V^945b@r zgY&1=mB=7tWrej(EUcK|gw`p@-m9DJ?ekdyQC$M*H-Spn|`eJXCn;Rf5~8|}_p z$ruS)FS_j)fI`>Ko~~34Q5rU?R{Z)oJ4a#OiXm8$9^0zE>=zAFa|Ivk6cVQrO~*NP zwmK2eqodK2`J)lu1sYy#Tq)Oa5anu3EClM}#J9$Y~5hoOiH2K6;%AvZVI4UB#2y+$k!dk5+Br1Y6E7l8e;rp$-GSS^3!D4eJJ34U|D>4 zY7Q0W3B0)FKLRo9wD1rf+*ncG`e8U>Q~|pN#YV;%uuD0k_+IQL{7K8113S<{xY@2Pd1G~}(c<87{U=|l z=xc)|Un*Oim`l!npOsnjEPuFgi^kG&#!=wLCn$9RZqICTwWY<@!PQ4{C393^T$CewZ z;V^xPBf%rDqhKG2`i<19 zc#ivf3ERML2$6r-$ToT~Lro%P@x16D7a zvup{uzI#6utfNkg+Tvq`0 zKnbilswx}9DPplN)kv9JyxXR)j-1e)HfuCpMHP(*0>YdM2^VIBYPF&zHofgg<{~&7 z)%@=YI65VVY=v-oFxG5GI#bcCXcYarEq#Q9?j5$!I{zbsMJan?Nut zIJb0aGfPw(84J>-Tzfp8t-JEzvbJW6zzC9<*9H+stry!z6j;vN{`iXH;HZKSZ0qq_IZbYi zouQYRL;m!H0rqeFrPaOjc}%JJ3IO#Nv1s)0Nk|@xbDrW?TN_`ODq&kpuUq!a1KXDe z_OE;Xc=$&d+1bxCMS`_;buG^Ob8)^Wy^X7G7Oou5cPHY#%%!suwTpg>65*ze%jIs% z2bluXbytr{q#JzRcU$H{&%pkA>(lY)_*EibuUI8xGC$tmxA9FiO^-ly0Ypn z@HrH6{GP;t5`YoEy|jGb?H!gIMim4f;f>MB>MW-%=&?OtAAc1o00n?-}uzjBAdAxg^ikByHy%d;n3J^U$~MG`1P4d?w-hf&ITs=Qv3s zLOEUxUA-~4KKZDqG})B7l359Md>;ausQ14&TR+F%luX(|z|=Rtx3n0Y7qlndgTaQ5 zu6r-Pa$@eH9R^V8re{y`{yVBP4ZE<4w0KDO>`AG|-l{L8A7n`x6QHxqmbwq$C~II> zWikuTYqS=Z1B2A}4KGX75}2?QeMY$8A>t{jx_1x0@g`v($hh5YdO6-7X+go=&DI$e z#&BbB!Qfx9Lod%D7YHezKO>+2YYDgbB!B!F=CX}ytt@9j!>m;@D;Rnbv+8be(7BG1 z$GZVfNPK^U`dV64(-KWe4kCx^qx+DI7C$jdf_wD5_3{-7^1Z}zsewUMj9OBmZH7}$ zGr8Nk5eYXi{qG*?oraR9QwtAn5>U(|Dx%mMN*8M6RCqK1Lj+yar&zh$UafMTjn1x& znPOB9Z0S4_eu9^ke_FBeR>+ycxzD7BKbbMj`-`i==$@*G!rNeRAhUaBJ1IF9sn*IM z8w~2xY54g?oA5@mE^yMZQmCsK0j`RH;^009TSi@=RtQ^hUXX?QI=h*2m}MVQ6As=g*bJA<_<9UrPnS8L$cxqLgnik!hpZ`8GKmFr6+#TRCUnwoV{LOVR zkD9cnLKcT96WZ1up_n_RrCS_(BjGCEQI%S&E5i&AF#zjkoUYF0Td-&Ee7&qJIFv%o zNz+v`=|h4*hY(9yEpa)$N^Q_+zof5L_}`~gWnJdiD!&#gTuJzb6{c#tqp!IetQ4S& zJgjAK;w3xZY?X*jyj!`zj&c-XZnGT^KbTo;6>=R`^U0GLNr?R zgzWTjj^Bez@q6aiyE`f<2(LGhgv0id`d#Q5=p7f~*{{Dl{;>JC4R!xp9HrtNV0?H! zpN82iXXoe(I_*3bWqTPK8b+|Nu+OyGuVavPk-T)%2;LU^$5S3w55|6qDp-Gm>94nW z+L)MZygU|rpSSxO{I1lgfB`(~EpSBV9xur<=`zb73%!Jq+&;G#t0X8Qo4AlKD3alg#}1~i=pA|OtJH#jiINf zuc;}lD{yr%HtQXz&nSM`j!*GxlK*kz>%+1BTVYAbxR8I_qy=oa@}+097x`_^UU1be zV;;%VW=5i&V&)y0Fh8*jb?@{vUA74*qYu*+yBO7UC8@Dk6m;GxZf%s z&=PB$(nQmYNLK8Rd3mAJ6@%>4wzu7B$fMe%!2Rb zucr~W{{9bLR$jKhNCY(B=}Fn9e3waKl|}K_NbpJGOo1=nsZzCX_;7dsuP#Fgz4}(h z%QAu2jUH3J5#4NAB_w3HBa?8f{k;=F9YNYq+t2st(F$5Eq$xHj+&-5PlzM&m3N~J zv234ljG48qfN~|rZ%QgxhTp?QSEit~U?fUmuoiYy=&ttt0QUTH5u=I^u{2o4zOK-0 zuTd^K)8mlexQ*?L5xTbRQpOaa=l6e5d4zH>K{f<3cn#i$ENE~CwA9=ThGC z-D$VCX^+X@+FGf}lM1U7D`-*obR5WB#HUm}+ZRafMeIqr=V6BPtn1y}n=u2o-VURI zEQCjqio=sfRyyBG4>iZI{4)KFLNsi6mNet7BfHqkVTeuS+_oX0J5)6<{hB>$&}W0F?}N|D3!hH#k1GI?FyOiV5smhG;d+o1txXOsmx z-xFgEOziA1bGFs~$V{!=F;-{fGR<06=KE2l&}2N9-o{qgdVN&rmR zYox)7%yV{$%d_MG@P=0n(-ED{LkI(uo$PpWcl}Qi){h+ddO=|4aH@!*kDvBT;V|~$ z$^U!o>6VICo-6shbUUSbEd|uDIG&%%vx0~uZ!|9yUzv2u;3PBVGg;)5w z{A8;rj-)_hte9!MJ@^YMPb;%zff^udLm}MJLOiog_IxeQ+Ajp=Iz%GBl){`5LEmR3 z9DN_RCMRL{Ux|gBbvxS&@fRCz*GefbxGL#3FD&vB;2SZZ%ilt2D zm8*guxzj78tVnUeAMO8TpeN-f--Kk?@vWDAh(i~0JHgH1_jP7HNzwGzmqHg)(>}dT zp8UfB7mS$ilE10?iBPWac(GR?!ki5$Xd-_0Bu*h(kSzXD#1^61-cP5hw%4=-BhX^?J`@jwIOY;RJ3z*sI_Bu^77vBHHazx|}g+RX~ zh1)H&``z`h2Lt(y7A;u4ud5jdMT~QM>e}kxL$fl1L~?FM&7Dhv)>fhyrH6wd(f0!` zsttthWV#g`4D#^}7*td!>i7eXAu{SSLO;`Z?@CIQRP$p(7V z9q^9-pdx{AMKWsq=?=fGOAoUcxA75sy=^k+>0*L>UJ#zif)%n-f$H!U`p?I|(Tl&q z_oSuW2no1&G3ck*P0V};Oi802g%YjMU`M!hTvzNewL^lygx@8@$H&b;__=}vd3SgB zYe&bKw!MJEAW;}#1Z09ujq^Vp#7j|T%23rT_T;=ho`0O`wnc(A>Dhxo5)$w5YLSt> zKZ|Q=k4SxNCeQs5{2Q9m#hFoY-0>}Mtv(Koj8|G|(dKN?JPy{U@Un5X zx~%7OIWt#|Rjl%2t?zB)>8bnOWUx7Nn1`+QqO|kL8-V)0Q&!INF;84i3&AKF*Ss!@ z{GTL&88>Wp4P34O^D>kx`t0SU6d@)z?J}@(dwZffeEQ>qV29`R0+IX5OYVpEeNhsx zaiAxDWn~LXf&c!tQfSF80}G2H*%V;DVT(C1gS*4O-9zCv8jc#^#G0^6WKLc?5o!N7 z7pSwDjY1Y})~rhhCS{KQw8}(>-?xAj{cgKGb6U%A)oPCS`1~9VN1FWa?MwRNA2BZp zcK@dIY%bfoe{$FDd@sa!-x(=`#^|}m6&S74OCF)AQXLMgGaMH6_%S{BMc*>6Y&W~) z{~qY;XI_6DUejH+84>h+$~5I^DO@2{`2y;~ossAK#c}_^tHY(GrB|pi53T1HM5uC*smu4 z`{Xn7c$LD)&~E=GBIpn`AxiBk{pWmR^?d(!_A#Vc{zqW6{%Rv1Px~5WIR2?xtr-J* z)bc%vPPRU{uWhmCNgkoN)62(ClK<&!!JtVJ8@doJ(A4(oQ$ZU%L223Wb9s6D15*Ap z9h-JucYJ_-#nKC9VA5F=07X_FMgc$U33JSe>6fli7{L)@Pmpe$lKlV*8CP@r}U(wo5x2Pn# z*k21a{G8h_!FM>>Ac@yI-Uav?u zi;gbh&zczhfNu*tWSEa(_z_X1kfVSz@?JR!#W={3%+SNZyou)U6orb|$IZ{H`O^pQ zAU%$w`$PhXmW8$>X%x6VFw5{-q#cl05=fdLSKQ8GZ$C5Q0~f;0mvR_`WSl7XGIIpHzbDjrwRiK}Kl(&h zmkRJ0N3-}*&0R){VdssF^C^X^E16K+J}9;A_&+@GyRX%l(<{rH9S+-eqy|qW)7s4h+C5 z!;fp4oBNr34|C|2OF4MMGXL)Q?W+6P1Fzw8vsrAgy?%x9*|pzxjdGpi zz`u-i`ZO=v{H>`2E?h4E>+u+gV^p1~G?ea_mn(^(T?yZ~2|Ni&Z*2x^+w!jFt_MC@ z=VcJS-k~c7_h(^nIG-kZWwL67;ajZOdMs_cqFZ5$3$H!Fr_K4=7r$8@ldM(cOGPi&drC5XbAq3f;2?GSjZztzz%TPAhp>?~~po!pNH zA?f7#aqEP$CJz&jQ_$`;A$;E2sfv_qM3MaOB0yIF7i*QcgP9uZy^AD?=3kAE9j5bl z^)7ynmf|3X@*3DXd!!T;kZ{E&HS9lIw8}^=>{jR6^OMNxW^L`#g^!_77kKyp@?NDV zH7%R*-!$tcoTj-m8{Ju4g9*AxCrXZ{)U7_!cihpk&Ah%(O2@`w5YaA4Zq0w3IKEzV2ij zOzJMTO7b^3iW+NIqCs!tIjm08xPHQ+wSMPn>q^Z3r0?eOw0B#%K<7sbS@3$hx3x;Q zpL7Y|x3JGn`u_L7(q7_c2|-n+nn5j6!ud;1|>0C2R`n z0?XbNkqPlZ23AKYid0?&t|by$b-PoU3kMHN+xOn>3+z;5vDm}QqH81zExVT?1^dH~ zu*(g=5~AJP-Bidr{3P*gl>QP1c+?xT8&1-<&tk;C;f$aT=zx)ofpkJ#oB+rd{PS#` zmO4*|PaHBMw|gH}Yt9d*yr!A?ONJ}XvPBm@15fK$(TkD=qvaa76lye=awTz;`79@5 zZdEpcY=*<&^)guCglFBB5~Z2$(>F7*f~bOIcdc627J|BwQda#e^m%`2YmcNS_c#Ci z&z{2Q=)y%V%9h|m^n0%yK|OlaOm!Jz(qK?f?LIYtU27H3xP9~ZgeUasv*sA`l>!tj z>q$#`zJ~Ahq%p~!M%fP6^$9u@@;e$U=p~(ZhR81M>_w}1sfHWJuyYCL0~|PoHA!ar zC-aiPS`2BX&e$TODy7k)oa%%@rTMalfo1t_T|LeI+}@mwVBF5+e-(f9;|s3QGzT73 zHQ>l_FaFFHK1xia9v~_!W z5@@_n-u8PeM$7zxe75jaRztlYuH9aLqSOxWo8JCNRdS^)Vkem$j>K=vs9z&vS=++| z38Eq(bmUA8Cp(9}THF1%M}I%(^$uM?^Y_F50yzg9_M@ca!6zHof0~_tk-TicAn>ZH zs3A(cS*K^;1h0ma_s8TPeTWCR_gA(j`E;yRXU)u0mTZj;e$#wJ;mBanOlBDQMrm}v z;(RgMz2`cAfV zf>mFp_y98)OMJ1hK1=pXc1#x~G<@r*z>On^aINHBo<8sQm#&=g_T#wyw}$F6a-6spuU;1cBJ;-RwpQBXTESD~2kNpQznRIuy?f5w?-f zf7B2w=5B%kwS>`O3ma}y>yHG{epPJ>+G7)xHc z!;zdq>v7G5`M;(`uim^*6OW! zqyH5i#tjzY;JDqouJcc9E8&PNpd2P*w&c?}lH%QtB0bB z4mh>DTGJ<9S&jb}b$vS*Fs|LW`i=Co!op(c+?87rGB%%%q8nrN6>Dp75Wr<)VgA0) zfg}VZS0f8p-|$A$=a0whVq^r{eLa3}Db}whn>0`V5e4JsS67e)8?=58JkYkL4vWfP z+-h)uQ1t1O{oW7`R`paK>YU@`|5&_mSBe42^8R4d#`HPkOQL!5e2(`fVvxo98d1I| ztUF-bjW9*&2A@C`0zZJbzqL`}prGV^(hMy)D`E9AMU8_%lO3CvDw3VvE(h=7LB#&K zUEDtb*}T$MW+>NbBr%`z7qt@tNj%;q`sD&}&rgMngQ$DzpzGtL#d@RawYkrhf9TqZ zg}(o(FHCmcmEb#=ZHRM8OXh1=GKg-)fI!jjJkC0JSa>&{pRg=9ytG33+S8Ryw^Wl% zhQ_&zqAPcg=d+CvbJt4~kKY9y$kPNk9eIeN)Xo}Iy#HS`mY2B2P{Hg}N>1~`#@98&0R!PSB|mC_p{M|3tvsP2R0L@7idW)pT5; z{YiYx3=JsK&0#XD^^Csse`I8N&2(+hChP`iYGVV1sLm zXl`XYZ))`_)sqXv$e%_!U#|aW2e~!(+oK8U?z*~4-);gT+8S4CasbyiAYEC`a$mF2 zydyYmuk0bzZip@|>A}ScI&R_Q{-@7HPX=LcKh-H*0H%6m;+n%FFMvLR!PgyzIbd?S5J)HW*(4~coMp+j^mD9p5zk-zg>Lr z-@eXyd-FTn_fz`*pH;ov;nd636+Sdv2^FNFt<98Dy1m^ibVWgOa(tXjnO8C_DR>nK zY<>2E_st6L;9oIv02%sGR>r5M!Tj4>D%t`xw8PS~$Mr=x=k2ymxs-~n%idKO-?oNG z$l_B7joOmw@sfr_ckqAl-R+JFimq}vAktzJ4}Bw;PPJ;a{szSgu}Xi3qPNc+G)^g^E8;VZ&oP0(tsvU zbBt3KPl1*={N7V%#E$EzpWXZuR`YhZ`=k2$9@lkpMgKQai}F+!?OToY;Jw?Fc^t%# z9|u6;MTOeW?{1d|+V(NFdq#(q>XQ$h>A9ws% z$uNmUf%`Ahdd+~DXT$NE`7*8uWX7>xK1FuS0oo7N`L{rf=VltdrKB4mgFYpKK8sEUqTp~cF4Bd!%M1^;S}4I zruw`m-wiE2VijSgSIYo+h@F#vquTD7+S+C0RZYp=+F^m)PGqD&phTqY`eGK4&6drS zwEuO~D8G5Il6?MSZkI}Z2i4AW%*)2&h`dyVENch?t0I(7zGwd74<9BqH843CUg>uGKcwXI?(-RLiG7v}(l!As7 zrL&w~%-JHa1oJI^YqCX01(6b>J${NNc5PqWE%sO!v$Tyh<{^yIY4Z3&FDoi|?$e%Y z@DEqDCn8saKO@cFNw^}H5&|x5&}Kf#_&B*=gS3kur3em`e~eW*&?zRKR>`QgS-z60 zgjW{<+X9fbUi5}eJ_A`_YHE5~Mwb3kjirl`Pt&56IqRcQaULz}z=2jaJhaQPsbnML zUcxp5SkbZ}Vh|tIz4y?n#lj!H9g}{X9Qt24p^zOGC7yjKm~2CrYjE1rSit-b7yT;~ z!kZ`pN+8o8s%>gmE8$?}rV zz5-tu2vx>(%El@=xjqa?cu~X=wg&?-y`erOUw@rxTOR}aZ&(4 zYd&5A`ZS205gfWSMPHQ7^?m-nbe`QB-kcWH%Yi}yY+`&b>o%L9Ei7ZS(1Q_uzX#p( z7GHoW^?x1L7xa56NJ`?+odY zP%3C_JjU_cECTd%(JWrTUjiI#p`~sXCigxOTZnptM1?G090ekvTro@qcLQ?2{8qk4 zK&0$(G{X}NGJXLFiThReu=&#Y;}|TOvGl@XODoBpXoyYYGH^*h&g#Py%GEL;TbCBV z!w8Aq%qR-UY(PA?(7?vyX=!A11F#KG>u=AEwToN1q5$;-1g{Z9U&e0asadbNuZwXL z5|WT)XJ-@O;Wgc_Ewc;^#289&D7 zGU`Kv*1KSWj8=l%Z&P?WDR;O1?RvJRRQkp2EPkW?O6G?3aO`cPJ#c2V9k2-9b0X-+ zEuG*NpBdAl&KA;urjr+NAOz|Fhbc@n#f=C-1(9{Okv$yA3IGAY8zuCc+8;g!gI#Pf zCi%=K5#h{ru4!>8YAq>VvW7dL2`eQ#|0JlU*fMb!lt#+&M`Z@5H~D<5$;Q4oXIZ%w zr|V)+d$nzvOc7WlUXRLPll{XxeGoS$_m7(-M5InI#%~U}o?NTmnb@0p;&&wq4p$H_ zQjd0ul6U#*jg=dB7xNyujk5qZzwXT2(Qh|`CL2<59Orh}@tbCHf3qxGzjl(_8}q@2Ip z83V3o8XznXVh^Gribywi3d)oTVE!%aAFD_|Upw1}moo(ncDS8Wp_mI!eIc_`8kr9G zfK61Vb#uB#bBc+GaL$?Gb?0$v?A4+gyM8&Qe>#qY@Qh788KEEwvs0<8Nq$+=9xtD4 z{jq+|0&2%P1bA9%)c$yKEZT5VNfR9%^Z2?QX?*P%r=T(Uy9i?Ny-2*pg>qh zy<2`AXXaGS3Kd%K%k0{9x;LoxMoI*v{@b-qcDDX%#m1>_8;uO3HWrlT)h(0&Tyo`7{f==lTHAEipF#&93_dPh zWxMDR5ZQ)KDx-X;Z}o2+cty+fTI-nDzw)dnvf{7?*_7H@Eg*st3>Vr$E|SBU!Z@p) zyd9AJAHN{schkCTwj2S?AP{9wwyyE&c$ThJS}Y}5XQ3E^9-P=nRf&9Wfl5LJ@$W7$ z+rSz-Cy2~s<~HRV2L}$Q%&PZ-e<-q>#Y1L9sNCJ{L7D(t@NHp9YSE|>9u72BL&4HL zQBfnEugCru&O-OUp6}0Ja!I^^eanH++*jcG!`np&P>s%n0AiPiEzJ|(dffsZ3Q_IG zZ!1nCejwpy9e`mae(R%oZBQyME`bkts1R(k~fzW`fPFQ0O2?@zsy)^;ZLtjKKAdn+@=xPO&h2d_hs<&RStknNXzd@kj zI7tOcqx3>IwFyX%g6|RA+ojNJ>+9%5%WmB@3-G`IKAJe8*OMY47!^1-k2dFN#yoFw2oRMB zUBx4tXzFQdK3}DfJav=!kPHz0Wq1HKU2o`w!2QbWWSk)BNX_w7e}B^3{Tu8#j0D&= zfzX6?*y{c#aZh043%XdW1N8M+^N`6^&f~w7x07)}@nY}WCLjuT4RcbAc87%cEEF<2 zUZg)rf(re897!*0KeF2b$FB1ORXIByEQ(${3J@MYvKiu?=nKCKWx{*{0)JQqH zbfo?$s%&Lgb#l-%N_Oxq&kFmWBXDP*<=4)Pa## zpP3AIUj;mj^f?G6kUKze<~@+Lt+ci@RX+FLZ{*Lp0tuZ);s|ae9YHZ6I0YpGK0H{C z6e~a-N8I}T5M~#VRH9nB#wg=vDiB4@9R4g_EglHs_#xn2?0TGv1LaQR6hQq5uQ=u_ z#`_appLVmh^e_tn=%BCMlffl}3pk9dZfeO_XiepucAdyc?3tD2I&b!DnQ@q+$*uF0 z&97dt=!a#mh5IvV+wxU_@-+4*t0=8gQAkBBmh1`^^%%?=qrYY9W{b95&Geuyu-ll` z<_oq>Fw1L;sXQK+rs?`hx0|7GSXg0OU|S5v?4 zA~EAL#MGu~Ik!wn9Ua+}i^OjTgCyy>mQ9y2inBEEXajynD-B+`-ZSI~@d~oo;hK3d zj06T0ex9u>-|U*qBswB4pB=`qfKoa#g0PvEQ+`aCo%j?t2w|2led~2K2~LCPMc7~< z6YG!nb9@$UnzHG{&gynp6)1i%%2%z{IV@QXg@8bD6|J$}doL#JA7evB`5J8P2u{;v z(UMOg(ehDL#z&jJ@rRFlkFvM(P&^PQ5hZ$aHS8lKl17hqfiZ;{5aq43c$Uqwey!ij zF5e7Lc-mv*iTF*hIFBQ&IEt0u5s6h689JMy*>Dh;w_s-)U z<9~})mviUsh`@00dgYT1>%(en`zmw%nJqI7;bk^u`dn7|9ma6GT`bG#G#6JG`Ub%| z18=-_adL8|%27jeLB;?Z%aFk! zCqGJ#$mfNss@nO`Z%-)T)ly1_7bmHkqEb5DeKL zSE#5oM}Q+SCWHbW;@%HJ99)ej++(wj3C?R)c(Ya|h&G%z(^C3BuvepGAV8n0N@NA+L*`^R6P^4$ao={^BoO49i_ zN>QxB54mt0t6l8b*(tN-TSsE~p9keQq6X7N_r4&7@%wOw{B}Jjz;m27+yYS&n#rpu z3X358wYd%QVN!r2>4FmrXnAR=Xr*w|$e|~BJ~=7m^QJ@^Cm9(P1PYn_GMbPP;X2oD zLWgiMP1p%FpJVIqxj5sXh;WGOmWRSLC&=V8C7*3-@xon;B;04Nk0om95xa0Z+w+-& z!&}_`^EP>2CApPU0)@|9#4c|CA5~}l7IoO{;RRP&N*54WN_OdPX#|#T=`QI;x^rn% zK)Sm_y1TnO6_Ao{5IFn3=a+N-1Fj1mX1+6@x$o~~@}&0a=SSKw-ddj#TcIp>Z;;VK zm70OWugf2+E`WbXnA%%ZI1pM!F!OCG;`-}QN<*yPE7Vf<3N22(Tt4`Rag_c*4&=J# zux!38xxNP$xLA}Rk}svIH~*qNpuAQsd#)_&H6jTbmE{lqj9>+T;8xI zQGo>!L8oJ~y!a={rdOJ!yd_u>O!t>^7vIpy0yjS|Uk+*lCQoJ_yw_8Xd~LOWv%_N) zN{KHuoYdrD+}PHzbOFH`#s&+{Eb_4NGTxi-oIzsfQD6NImhgnQR^43w%9+Flh$V*f*PMk&{njE5xL!>a1( zL?RU2Pr#IGl2n%<0`t}=BQS2IdiPpt`r@!jxKn8Jf)Ahoe1VpejjNQw$bBtZt45_2 z$pwvK|1(!7)8yG~>*93Z**lrG^sn0xU&D~`)dyU;1tRwLb@yn@?9aOYK}{~cM}I$-2mrq`MZ=AWj87TU z%+x?e0*6ZP3dxZXL9XBzDF{V;`fdC@o?Q~*%`5kmG4;0fQ3Ba2sqH^OUQSKj`FC^2 zd9{9Cd)s#hj?0s(|Fo%NkeJH!RX3ihj1LNWMeHah=;#45J67$VNC=4-@d?npt|T*t zUV!w?W7f3%mHW{pni+2j;gB5X;&t}2dZfI=8e=~kt=o6PGh5p-sa}*SkZw!lJNrC= z&cwn3hD&DX-!-J*WG*?lUwhuBUQfFFW92MYx=zCzb_t~0@{&hzF*{h`na+-No1>)7#6A-G}Y~Z=$oig5I(GbI~?WvWe-6u zb!$G=pS(42cR=E-E-jUz`%w61dpP!fH3?ii94kOhtgnp%O zA1R42Ewp!J#JZ+N7GXHfyQ@2+s<*%w5%MjQJpUMzB~AFhh?vh&&Uziyr$N<>iVFJ3 z{R)xsY8NJJzro`HMMO?f2`Vft)1ck`i-g*o!hmnEs|YoXIiDxC+EFwS5|rubd5oM` zf?zN)HB%4{{M4B2;g@`>#K_J8LB}n&ni_vj)a&W0=9G44OO$NuUTd&n6fy!=?Tt^O zp@!t=2wX36Adl9JOG*Upww*{tC6PMhSX+K%#F@l+HoQU%_ZyA6M7ap~5R~YKd9OO4`5H_{B3T=*5tr z5A#VtnyFL0z3Xac{TGEn(9qw zWuK%H2gvH9UODMWQ64PzOgS*VqmH{brL(Pj9ylAKIP{P`EiqlNDLkHT9-+6*Rjo9; zIDDrh)=0C#Rr6K5V2XB`(SCWUKAEj7%BZ|yxwQORrlxJxf`xn8`sn)3yM`s;eHwG3 z?QUn1C-Q_9)72(lsitTIMNGJ7kwuoSk`FQ)(&O2n_$y>qs5(5^cIP+6O~L$ldeZr= zPaBS3Qsa)YY|r*&*g~yv^Qam+4i@n{o#I9Qdrnxd)tIkg<8H(C5wi38^V6^M#KR!$u8mqigfX=57NOf5D` z4-a@SJ*E`9NftCyx9mN7ToV#5Y$r;5X{zQ0nLE!Kr81;i*yW#l!SW&gQh^7j%41i| zI<@iPSFT(v^0#N6g(Qv2<*20+fdus}7Sl_S@%tTZF7C{t`} z723@o`8k#pASwiE^(b&N&D^GNd~>U>KV|G|_ra+{hp844HB?gK0Am%CAFu>Du1t3R zo5n(g<_*u(g@FArh4t4HF#sk}^E!V%byC1;m#vT(E+g^wPsJ}yENM3dm1wPj9p}DT z@I8c0B+$I%Yx5TFWy&%J68pATpRV3g*P3#D_wU4SA>j-GgARfZ>~sSR!vv z>D#J4vHu>4BPtC}G2-Vk)t3)PYZF~FnsG$lp?|G^fg%h-fi>p_RA?G{Hf=kYUpN>} z)H~$c3At6PR`4?8S4V;11v^n!eIY8@=HtxhP`MxI-+tg^Zcq$}uFrXwYg()HS7u~< zv&v<`8BIuyy5Oc-2uxEMBUbhf(Drrd8S+N17hFU!k}4!kmaJ3e7^V^2t#Vcxm`|GD zxk(6+91g^uW)Fy&M`W^k?ZPQpt_o&E+iSW4fr*)C0%WVfpZEV>^yL>5(~zMfHAKSx zP2^sl^BJSlR~VJ4Iaa66U(>Z*$l47bdz7|n3P)|yWpCv@Yn}Vez+wi%KH29aAYPZZVa*jMcIZK}KuKVHYTnBy3om2VO=3lt90g+iYU*LIr2q4jY zl5B!R3^ABW!W=fT)@$ACe}9W~uZ95o@yua8o^srkXD%(B?$iK&C%OQ+=Uu^zboQvLw&f^ld0S?!jK-*LRp z``~=$PkMq9*$V1&F{ce;6|o$pA!OJfndgE2|6(!zUS@5mJF374qEM!CA`%_ z_S^AquMUDVd?}p{h^`KX?+6xXz8jNw7#UFmAt=M0@bLD=J@3cXt2>oH1PZC&6|~If zS9ODof$R4rN6ltBt?HeV_#21?tJKP;ZMDpcVU5OPt;!3x%7^gV`P@J!n11(#ep@`3@v>TH2UjWPTQ1*jRx%=pc{Tp?LzYOcA)h+&ba-OJD(>)T+=q_0 z$5&%yV@3Le`iZ~X#D8PLYE$axB)CcFUm4tCL`Yg`*pPSRzQWd(B2sU2v}_7!e^AE( zlZ%xsndT}X87j!hSL%*#ZW49%`Mmrr%s;MbdRf=XgdpLqLUCTvm{ph695^P)I&tP= zZOe--h9@^RXBM+`%<+}cdE4tSBjs^M-g?sG_kZMWy^OP&@ciyt{8n{!?Sysfj!4(; z+fmw#s&X-Hq5g6eb!VYr;4TY0qiJGk;BP@s=qT;iH#W-71|B}`KiTDN@$}Y=-T^2Y zbsa;uWQxUcQ1?q@2{)Ds%j42Yy#^to!zdxNSPvh1{Fgn z`Cmyh^dw>Rv(~KJ(R&B#XEhwYmf%gD4J!9Zd`=FF&YB zF%XJQZ#xXClzgBH!~sAIhX_i`nQf0F^)&6Ab4R6|m9U#sDX!0zl;N_@{W)ir)@p5_PFjkWo#yt>aEEb~y^pSAjPEKk9LKYJXOw|S5( zu(YqV*jE7Nd2R8ySKT0j@`;faYFQ4G?!wS@k<;i03RS? z2x9wvqXxbAY-3wpa1v1Ylv=(v1iX34kQ}^kwZ(m7E9=RL-u*ta(5~g`tZQPF$vzV3 zCfP$1xf5$C)Rcg9nyxLRmOMWHeKe0U)d+kKdhhn=v))0lZX)K{BgeiUX{xoRr)H&5 zo-jK-T#HEVDnVO5T3SMRg*j^I7L4+W-@pDPQ!RgPOo2v$o=ZbXGuFuT%4Kp4;rd7W z3b%p3-=SKRk<`-f(oQ<@wHDY^qY5)lwxaAMj0wV5xpdL9#`IgiM}CE<9|;75D@&cM*a>Urq#7KpQ@ z;gxHUn%TNcY`bKq9b*-8uUz>3*9z^+MliN$CE>DLeQL<%y7(D5kjE?{kgTN=BJuk{ z@g~-UB~^N2OrD8lOj4=Z(R}T~TRa8_Vbse`x8LRTaz(MCmGiz0Z-l_g1G*WRzTVMV z)xLWd zNOmjuFT~jYyKYE0g`4wMs9!?4g5`c|o|T*Bmk5D@qlPtKJca|bZ+?MbS|I$i0A-7{ z`j^mI%k!km!`~W~wN{UTi+^?vewy~2PyOH6`U_3X1=TrQ;|2Pq)Y*2sk6xY7s`(2$ zWbLYfL<}WQd?~LKB3@Bck^|GZ7tDRhuSIhEUoTtdpfk!`I9Rr;?2LmfQFPaorS=eK>nGhJ1MbK(sF$g+$jvDX^}@FX+JfV zpdgW?FqxFmguG8o_I5{Iy)$oHx#bi%YuiLf90gJpisA_3KDLL2Wc_Tn7gvJ6{As+5 zo$Ir(aTCb2qC1aO941 z37jC|cXT<-ib;6GmkXz+!i+Y|He5byBBqjbq6^yOPe@gXPs_Qa#0&P-f-?=MuqRXG z>#{ofuKq+%al}-o){AQ*5fsu{zDL#yHgijv2g)iFHq0S7I;Z2hvywQj> z)x#%wt9mELHUQie9xYJ$K09J6Urea2uhh=Pje^2S>ByN$XO3AoGptH2{`q-Ig17Ln z_dU}eCv4HuR8J*XolTW4qhz`su$N^_L7$cY-j6z*1m>`;Ax5ycq0##ibBhfw20I#! zTyfc)WGJ^2NVKtr*xSS25tQ~3Xg`Lr-Ris1A)pZ+!*TEZ8ml)jGMZ*-a8=cK6=Kud z%pf5Vj4Vv!f2#Kt+`tHDkB>fQa=xZxK7X{I{rs%sCcgVUuRmco=#yK=T3&1F*4lUFy*>Ko^jfiD4sqP%Q6K_FMj zbysUhpK3h1zc5Icki~3lU#4E2DxTg^upQ|MY-andyGQR4nUeJ7%hMhrn|?xfC6)@^ z=uFY?dArTr(TGy@<@mVN7u2V1ew~tYl_oSq^cVf%6kX5=w$SF|L~veFF}$v$BjoJ1 z)-a0gDB#wN?V@ zfa=VwqL$kt#Q0xfg#`o;TWID=Dmc$j?$lv};+!A&P8iC=>PT-$?(n;Xf=GG&kPsUT zdQCKdar7aQ14U>*jUp#nRfLq(eeXwZ089+>W3c9hIe?9B)|@S2Yj8IX4ivhrCxdnE zWi@&H^t8PBb8$3gZP!7^pk2Ym1PnthY-yWbYM#^WsDC=g3-~}Q$C!VvMuhfd4;{Hi z%v67_5l#{dFi0O&GV@$v|?%G&sF8(hA`OQ)Ebm5pk*S=F>y##;) zle)B#a_2<1=883IBSuU1)uVw(HJ1i5epo7<^>tRmJN0q3o>&wE*V0ipcU&VmP$0Vm zy99lg$f%x-VnQ`LC93~xwU3l7? zWm|)2Rx`=SobLxr0}&J_7b;gSBWpK-=qhgrGwBQMk1lg5QwDLzq@=|#y4`E|dGwhX z8Ci6j+m)x{6Zw143alSqJTKZ^*VT~ zC5`@0Q<|s>$CfIf+ZWCJ%#iW1_5A&_2vw98`U$*z^N;LroeO%0>B=YykIJYmzpq3r zErAN%*7e|PLQ(to8(;*?_{}^+8+6@KZ(q+oy2n7CwlZ-pl=*GtM!j7bUv(51n1+d5 z77wt=DdY&oy8Y#Jbme1Dp8GgHZ6l&4+W&fGiC-nMS#6?x`1$ye^@WC+dWgm2E81k`mW+v?Uexj zJZU+~yUDZbb_QbBS8zlHw!bh06D6eFwq=7+o+Y)ZdX3*9)Rrg|^ux#t6NzU&s0*HH zUpqM}pW=z~A;1Zo%#Pnwsa4;M%Rg@#$`4LeeCj;Vtm~U;TjS4|lT2cLO@##n$TL`K z4XKK>`*rQ{Ik(}}*~);U(LbYt##v*of@BOD^ErhEl}G8zFP1R}lP z=Vnhf99>_XO{EN@SZwEIGA~2L$P4bVpyx$1Tpy@%kVl0$U^pv^D*9*8zobaRqiV0_ zcjfCpu;=6RkG{Gbya6W|EUb?}p8EcDmF)b>eIUY7e9D|4Va(?+k8C>ZiHYj07k~b( z{ZM6WIwY2wF=bV+s45&4HK)_Ci_uie*oU=Ee!b*)o|g0~=Q)ws%kN@v)bHWn+~MO? zlVg`+uP9z$hvrHqlgy(CJZ`o)c=>8<9w`Dh;I9S%#!YI2zVeSX6{B_q{;*Q0y6&!v z;jcV&BCI*|PzP_%z!I!bX^QV8~_o!fXu_h@fFtAG3Wx2j>e4a1H1eRuyQ9?RY zfOLl=gu|kz^=P1b<3pSV)FK1Au)+wA|W zyGhqV@;%^pXTg`89l?!Ady0I*)V1WY5)PBFO_XCp7!~YGBcAb z2`CD>CET^wd7elx(^Pwzo>^;(PFfI35vH!r^^H`gL~SH{SAGEl(vvJseX(nkrfpcfwRFMMub0hMce9M6DN2VBF=hWv*Arpc-RV1e#HSDJjN!jK zgTXLFSD|Q}8${9*8Hl0HZ!l=>{mtqi*|Z#$XAxkH(uD#KU4a9$cP@w@L_Sb3EzGtm zv`S$Klo*Dge-qspRU77zMA=0ZPVRhZ>E>Ad#qb4I6J_a_J>?Xhm_|P~7gw3*nM6rY zAS=ooBVA#Bz(_N5Jm_~6d0$d$DibA|4k^F+u>PRS%MVO^DysFKRoPjd>dSlmvQ%+% z`6KE^UPsr#mZ%(G14c9rNvZwGLAcCW{!T8_5&zU7*Z*$gUp&C;pcIR*;a{Qr0M2j) zg+dV{qr>ql<46^Tm9ej8h4>Ps6ka2)*QBoO6NSn|s^@g?=dg~Rtj_ve{dhC0vQGa_ zZh1p~dKJ`}+rRmZU{cg@_3XjBl4w)*JnomNOKNM~X#2?;DXb1(~WUm7zeX z6kiuixFQyHy(pWmv_dFzte0_#h=+h7pL8UnRE<)h$0o)&j8<>%5?crm_h?Zms5Cfk z6sMxbq;tUK_Icc#gN`ABI3z$MN`Zq=GE2SvK=|k#q-Saey zh72cMjo+_r6zS`%VG#mpPK6%QoQtr3s^-;2| z`0{1;)CZnoHUhQI9t-(E?b$>%dmi+C~!J3vr|!ESa>&xi4GGZ7(a*dcTU@QHttR)`E{dU z0{|!yGs)}qSC$<0B2ii-ypPl{<&sY`Gr^SSKL#a1&$`D*RRf8;x*GwW7Mrp}f#IKF z*Joix0#vtc9lBzzW2FZeaU?%#hy0_OeDGf z)A$|zKAg!xGK#vgLkWzU+*z*g%_>KIaW1D+Vm9=|ica?lbS^vZ`%v5Yh%|@-8m5vr0!zi!B6&FARu%qg^n$ z9E=Ue`S(lSt&mK}o3by!-OSCoN?#0Ihip?mnZLCP?uY9O!>qm*X9_&TQjdTEQBVnApMJf44`h zbs`Wqsd{u8jnN-MXX}~-NVJ(vRp^W%Gg_kG!rm7Vb~I?r@AwQbymQn-*ITyNz|PGc zUYsQ54vP?{NsQFJ5m#&Z8*)V}=kLCRee*_JtA|Hz@DH>UVkHB!rWjDr%q!W@UGpqn z>6j-|!?JzbX9pJ@XHmtF7xJ!{<4>4)#|DUR;$J&fwk6+ko%J-XnX3@_(&I=R@*1`W z{I%U(>}$<{9wbUH({<~F7w^~5{KFwbBTi^zxlOP((J`4|S@3md=~qgyL>!Ch3`Tz` z1^;jFkLjP`s?Kw{v*CVx?IHjOn1EiK+o+U6l1i$TV?>xP6y)=(3nOqd+?+28GrTi% zt%@eRlU=}xy+v1+pPz*9XU2>cJX3$ISpcF{O=59x7WcP~Un8~0{_>`d@BUYf-Y`Jo zbTSTxNUGQ^EcKXhA*575b$z`YAr_cqCTClpF_EGzx0JrNK8OzDrKAM_p`c{SUtS7k z$AU@>yHRBAjW@Flq@XOyF1M4tFRgpCaQXPNnuP|oZU8DWrq`$OKHY0y{g8$wYQ8>@ zOpyOp!>`)M$AwaQk7)*_pSHZXo`CxDQA0tP7Pz3y%QzG;hi1%uj(lI?A^&}5Y*VMt z<`J*P#p(+}71Ds075LaNc}S#(CG!Za8(){si~En^o%-ats!DasPle|r5#as+jwo+p zquA1MT2JKA2N1R(Lo8&YL)lO1EV*7p!y^eQki`~P+#UW=er26~LR*54<9g2oZA@m^ zDdk9#$~J$|_4=6)xM{3^D2mjICM#EcF@ZU^l^-^+cA)}5IDl?a*RY(OgPL%2nwU2R zm=SmYTA(tDx=u{yX_|Y%-->ywZkoL16Q1 zBuTkkUzIh#?3?<^)R1(L@L9J^3)_d4`kXei8!@)x57eozT_xL+W3MN1oXSbtt4XCG z5~_c(Vjp&~Q2J{4a~}@HK}I8A*q34z&tu!}PVaUCNcHrVyxTs00%YNu-061RTEGai zQg*)STht2)X|>G~&raW`SGbfUl@@-5;z|;qrz1fa>x3R(Agg|6Y*IPvoqTOPT^?x@ z1Rfog__O7%7Lr{E%f>j2@o#FwExwC4ZJgWW1+1y%veN-uZ&mZlq#Qqb)vReTxP)yYqfOqn z7h$YGWYyw+SI~-hJhXPBMeL5;`P~nX(Ojo=wDIW8*J<#*2!kR{S!>U|n;eidC^mT> zp;&40w2sN+4GktcO=j;Svq&C$h^N{@hW!n?C-)4{bair&;C-1h+7w6PedQ3E?*Tu* z?q4rhsm7c^hy7=DwgvUpZ+J~<`X}GHNZ%Ny-HJ5K;Rl9BM18#ky!tZU;yqVQA_Fo( z@)Zh7n}Q_*l-C>Df-+iG{$}vhCw=B%RZ#;cuX2_=&-R>6bC(K*e)xS!Z1A%@51U)cmgf8>NQ|s+Q>_1~ zaBS2>zA<61=Hg8Cs`;PzUABcmym(C#!-Au3t=2g(bVBl8N$)Z!bR1!=WSdK;C|Qi=W2i|OE9@IB=57A|TJZh5b^t0Yh0l{xZE(%^*i>d; z@tIr{C;$o8sJmmj_i1qo9As#Soo^Wr%a z_=#%vi)PV(4=txb;Wvki#BWW8*v9Ax2`Ifc@6^E= zDaqbOl|Ci*|U+>LT9*l{3EWcPtT6V!Eu7O`_XbIbN$nn&I>IgVHRgkQwT zIi`5$+GFS5y2HFUGn>{Mnnm(taAiMptBnqtOhv!BXVNXFe0+*4&?Q|QaN4gwVQAK( zS5@aaF$93&A5AmUi%3SypG=Gs;lcqR+LhWheXuS6lRa7T8J!-XHa*<8Tj6aDo3Wb& zb0D;I5L(g-Y{nkjlj?Q>PW&N^JBiU^bYXVpqnPC7U*(XdR`!1o7 z8H4-LQC7K)B@(uGFHjEpE~}Oz$f&&ZS~#3-SpvbIfe(*e6a)%INeyVOPMepK@6m+g zK>(-%4?tM$v?}=W(fmRh>&GXLGwqve1u{G+-oFIKkj$5OaFuPziP5$7{o^Z%6geQk zE?U67zLhieVT9~tFCuM%790@=yJ9?HDq}`oq@9f>lBJbt)XKUo`*yM-h32z=md^9| zEu16<#CrZ;{fiXiq%EL4?A?C}>T!b+o&P9U!Pe~F_+bIo-6k#&ia_OO9?Ppjw4`z+ zOwv57Wwi=ql70{*s#d&6LDJ}0jilc;=5~^r%6?UCAGR2c4VwWPo&RdM0ULwZWXTi6 zGUk4`7`y*WrkgVz1B2rW6T|a>*PRVs3YCOB6dVRaYUXb#UVzDCfjBwRy_Tp5e-J!u zW7*^J;s=N7E;Z&?Z8taj#e*b|B58=bI*UQ3+LiO(Yu?>Ta~-5pDg*@Q-jHu`muc%(rGU&g^6pX$0m@#j0uEO}NK zNL}vhG24wMIIFWUt4^G?*6+U76E+p``U!dL8$CW9Ro7QTV*1);MH_8KFTzCKiuU$Z z>1PhF+(It1!*9D|rW+Q{6s(J6gY*9ajXPMerFUH(`q^!7Tg_Q zU$Rro*INJds@)+74DaR1(xsI9^vV^@nf!+^t+n=kYQw_&a`j=Y3kk2ETR>Aay_&T6 zY?V=z7sZ8`cWE+Quhv2*7!S^k5FgY{drgzSmx*;2WcDh>DVd-^|NIlnZx)69Y~ky# zGD=e<_8DkeulYRgB4$~|(Rm#!{S1CK4)j>Of zjrKR~Qna>X6PZ+b!i)Xcv6#A#kbJeB04vKm$7K-&M1E&Dw&Z&j?&XSsW)cbdX?kMi z#Jg&|5YKWUKJ~%(gG*X*my$i7!osT1tn!<)T>>pkEmUAoAeH>e&0{nhP4=fS7KMdZ zN{;3x1e~T^#&((+l6bF#*I3!Bo%4lcq?LuD3X}^19r!^o1i^5yKE#eMBM`?=Cp{7H zWmJ*TY@BrB>9pxsga&EAMrH&ZQBa3Lh?nx?(7TxA=`Hh8L85=ZYFbK3X@F^t%p%T^ zNB|7W_>X%W+iM(!!aTGI(+qFlo4eHXQ0BCxbXrA?>I|~gMT=!$l74hkUGl}*?QqBX zSdI`^!#^?$_Vxf2N_1mjP}mn{3@y_y)Go(j;}<{5ZDpc8P3w%C+Qq=YPpvoG0NmkY zK|aFXp$l#|Z25O^F*bt~4l*9S=hDo-*ndy=oGooT3`PrDq3;(zdc05@3%(sTw|>6t z;B$Fy`j`A;xr*XX4a=J~|F$<5B#5*r=c+CUcG@rEz;L9b;s2D!kB?$62&yGiRn9|x z@ykn9;$maZ9EF}pb3%cZqtzdJj$eVg{+TTEostW6-Kq$4vMQy?XxTms8uS(RN`Gmb zaea{Q(kht!q{0hwhctfr$4P?=2jK*g?Ol;PF&Dm-7MoH&`f9yiMBK!cuT-MRpukLL z6>%n}Ue{Uo@L(Nt0$IwjGE<|--7By%`B_#?DU&1Y@T#|TY=ul}|CCE;f|kRn>EQ2M zO^gz-sQ!pXeT}3gE@W@G7q_(6CGwK;BTj8=ky7vTX-r_Av|W_Gpx>)W zQ!oaR+k@z5J`sPEB)NU$0H;{F3vQ!hhyH@YGy&8!e^6Y_dD(+QaPwifDNY(oG_)vr zGAdiIsjVP?Y;Nqxo8E^Kd2rD1eRswczT(T1HKba68=7c;%=Z!Q&YQ@mGpZ8@3#+)1 z{6QyJD%D~aJrs|>CI@fW!ZJ52+#9z8{fb{V>}DMd{K{r)wUrda)D>@%` zrHP>Hl3HC`gV5O2XJl6FWVl<(s|^0Suu+{2Jt@}LJ460nEmejJYL5q*%q}x_2I4w0 zt_FDr^YWfoPBJx<*ig0+{yR;VoiZ67`7CR771(g8A4Q8vH|4(D{NS&$xybHRj`M%V zFySEvBsnM`;kRW;%B&Gh?hl0f9}auHaInE7>c>R|x>}=mxtfX$Vj@R%F=bD+T8}?+ zRsG9wm`Zup{A&!7G}%BXy_By7%_n0i)h6C4H(8O~f7yc}UcY&?AYo4-!GLw5g;y8` zVsaRS3lPHxHE}f`$H$K*3G-y}?hYvB$;nIi;c8RzU9p{neF1Jsv?3}}pIV!G%lxZG#5lYL$qKQw z=z_N#LT^x_kq@YTI%-TVyC4{kSC{pyD~uY8a=l0p>ziC2!MRjl_v^kR^~)pcdVGLZ zcg&1pG*`CdjeK^gUf<}u@PrB?X>r;5htWwXxh6m~=BBuJHMD{8esOA6rPOXD2O@&V zA~-8~Z_v7XJ1%mQkKMB4aQx=jV3?zPcE2S|61*kK07UCVztiUD@v{oAK8-)*_Is!y z0A0$PFsWiE^xjO+|HzLE)Eesb2+DIQ8<9%H0YEn|*Vz+CmyeV>Y)T5R;>LdSCpb~2 zF1ZCJh||ni!MmLJ=PS~ak^{5p<05-z1@%-6mPu&?Ord>L5g&-~U2Gu|R6Qo(!;+HT zjFSELV1Wo#?8I^K}MY7ymRfzmAbULEMitr z6ipw1{}lJH?hed*MDeRrEm&cCi#btlO_kxWwXmuM)zi$Ef2N0kwGJ zB}pyYaIO9D_)Bmn5U{zU;76Wl9d|f+MAj&x9fJ|!*c|Os%s)7Ytbi>>2p9m&Xg2yn z=;xML*PwI}oe_FZO`ibbG+A8{9)^*PSDmIPv~gULUz?C27om3Y0^DpRnAm-s$l8{u*}hT3DECSfb~k z{^(S7>-YSK_q(0QyjIddxP=Nc43gfZccRk^ThL#GD%0t zOB|BF4L$ZkOP+1DzuQ7zcA+cPIx}CEeG&eDoh!h1>fRkC2034Z)BHIRCSRqRf&%=( z<7rHp&sV|WKZ5Ta-wRhg*&}!5G!?^Z!LmC9F!tD8#)h17_I*o&X*r`{a;$|mde~g9=Ba}RN{M7d06pV<7 z`fO8i#BT(7t8yM5VnyF*T9b_@&}KzON%+Pp_2H4MqOq{xG8Ih(Oc}iVc8Vjlq0-Oe z8@5DGodT__GP0_xAA0E(<|*?V;s)xELJ=4Nz%FB#qhd8~DTG)wUNwhGe-*pC>CApl ztOI`p`H{{l(QB4bE353Pl{3w4Cx25^n(FDZX4hJycO$_Mn7PXOgwlTkDYbnRi!bVw&42Kfn|A>wA5O65`({U492= zayoWz%Y~NuEh_j&E*;T8BZRK{SYBsE*G{fU$=zUG4D9PyNh)@BJ}pqY zR=?8^hu~Hj%YdsXO2E3@wKc)s98r`U+&{)_uJ7ri4(5i3hf`#=R^A*JZ-0Qh*5Uqa zA(UbW`C`m^KX*4|{W!(2)>Q?s-$8RtgNB(P{%{lvF1X>*!?tN=Int%TfweE zzez-S;@RQ-Df(eB0g^6C1fR&|PO^v~$cqNbjXAPre<-hH9^tWa z35v%)xgU0@kIBp&JgE(7A(f38d>{lHLS`n?(sh=OZ9asui$r0{cfB#7wX+d#M|0!r zsjY~sE>0i+8O??}ETJI0-gzhj!lP%-pc_?y#G!)%ayEq?ub)O1B)5-06G0Ji{Y&RS zK=(2C##a-P|Ew?m`+>>UpJZ_x*DeV;AmqKa#AOc?0#0>`eWCW*uqUM(FQ`IHo65_M zpf!ZV;N>c=atA==-M`S2YAWsZhW#T~XhX%*a`?j^wCMJ;j5*^Od3a}eaQlciaExqH z6ABXk`i>CSv&F0%d`3kCDv5<93`?~45C$RTv#$wmls11-a#f2ZM@&McDh?; zOi(NI1ADv!1P-QHnW?VDeF$b#VDsex;?2zL>rdvmL`I4dJ_qRTEFg6n`bT zwm`(U;b~ZE6~g%A@jC11G-d*Wy4}7D0Jg0SGDpHLUt7LKss#l*_jO|+W_;?U=|?)E zEU@bHeB)w!fd(4#6_+*@wQc{|OA`-kAO~(8sy3U_NI_xYXuD|TaWDj>zweIFn4Cti z=6!8*k25t5A#drzwAvDeh@XWJr|dEBa#6u%6?+<;C8R5Zbb7SAeC}vhgRk(L!kZVT zm3|J!AJz5{hBahmoNeuRENb|Q7A>S`6vC{kAXO?#Sflm8oB68ZLN5?mZHhU=OY|Vy z1--!ncvm1q9V423^A-9)V-gbz{d`K>oKNA`12r7^;lEZbDhaAt#QJb~kpCt}-}!~; zNlcV?9e-BSUlP=bqlORSjzJD)B{9_Q>yw{BZpD-6>vr|H!}n`;X>=1-?B5=jZ2l;_ zEuQ`BYbt(JXviL1srU~24A(7td#`jkcJ!E2Ql>KwXZESpRDSuxSV)gyRd+)nN2-5u z*L%U0EXhDldRV2j0ZQp)xuwh7v3nmEX$GFdcGNLw;8w(NWl;x+Hdf@A-W?Esalf0nDRn8 zONjM#>QwRZ!U~l8edcl`2Ahv;u+{_@3^ds%n9VEo8`S6Z{IeLdGv)QgK>avEUgQtl zzNY7=ER=D?d`tS4P1}OJ=RMR34-k>3sU@H70bsF;CdB zBL4;v&0)1Y99Y$PY|Qx8`~bNO!TaCUW2RY-kZhMxvKCY99*uXyqs zR6=^NHcB~V1nXM&jx>TpNMYv{3q)@ru+5+$IdJH&rsn4 z0XDbm7$xhVDKXHKw(ARDA57?Ld`A15M$OnYqk&P4OXsfRBV%cl-;-!Bz_IWN3_*tY zO0IAEgYkujBR7T!OWaZk&#S(Z+i{SwV^Lcuc%(Vof^H63$pVmC6b_9Mbu%zLii#6C z4-OZg3HO$s!hsEt-PNgPGXpEf%xC(RBaa7&g z{oz{s&U8ajY^w8S>@Y6;Wc_ClP}o24>3I8hIA`)`_>`)&dD@9)|Y;kd`)o!++=ZzCnWm*8gso z2;MglwAs8=ss5Kw@nfT9zMV(NtwvSg&+@B4|CecOS?11*3PZis0I;Vg-#;DmpMK5~3X?>RJtqlv1taqCWE zXJ+l^M7OWBtFS*d;Bnhtula!s3CVt*9bp>4*Pj%0yWSqkRiV#QNGdzI0`=pHoCKNr zvqtRe=CZ1dJ#FTHKyJOE-|lwb7dhW6*>@Jw|1|fY(}O{Hjq<=)FvlRx`22+sOh})c z#u))w#lNWr*XPp-w}jnM+IK9v`)DwJ62u8oT|PDnCfDilLF6my;&Jywo{KBMIPQK& z%fGMs{?jY7_4`>t7>L%H`O`5e3R#EY++8PG7GM$+>wYghU`UGl}4Ehb{}3r?`Z13<(rqpp(`VC&z#VIURkB z8VVqiBB3`;%15nWL$f0q-4+q!Sm#* zK3dp4u|)2kKbpVv{`2!3?B zH_}o>9|xMl9mq=q=IkrjXre&!z*8oq09Cz#f6|&R1trRnEmJyq*{$L=gZBB}l-z{rM#pDM`j5&=2fU_S zq5s3tS;jT}{#|^Oj2`u)h0!IQ(xapsq@}yNYovs9gLDZfNO$*W5$W#kzW2W$@N{f@ z?fPDyIOlz4T-9?kNUu>RYxP*Fy{qvJ7jNa0{7ij3ojz?rQx7$iy~Hk$P7o7t@~eToA?g22)71hg1jr)SzDGO$c(U|dyk znXW<^U~4x?x=5#F2Knrgq_Z7SAmlQG4dE}%1K=pC+&rJ_FZo5w#~ApRCWQeh?_U{X z_R?XPOMX?k+B6ozpIIoqdpapui^s8sj7Lj64bHkTv|?L8%o5y8ZVNXrP*WfZAOc#| z8UYqQ4>clQP&#o3KlK|4;bMmB1mF|*UZwWt7OY^p&8V!b_ulUcOjfG+RvdxZAOl1cC?8R~+o{B0416KdV_< zscYcBGkew-vwdCavMwd8)>cFcUATLCGR$_t2B!cw$?p-yEKM zFog~wRr3-ctwVrR&2TtY2nPwzLX}(Df2R-RagtF+gmY5@d|U_q)iZi)wydxf|6LSn zIm+X!-i*&DE40@b_+LGp)(%hc_}{f!Fz^2=%Jd!8;Ifsa zZPIe9Pqs5Y5qAH5UxI(n(6qvE=KVIXC;wI!)YLZrmC}eO3~CZf1<{%_)LnWQhX*6B zCYA2)o@FN0R@=Y-eKMI3`vT>_L&IM}YHX>?Wp<%iS^pvpiFBfR-uUnovVEIAsc1~` zfgk5qvP{LC&LYbMgt@Yg%CbLA^T;^JA_@0UobKfDVs7p6`y0yKv77e^%pNX9{(6G| zv>o$w9U9}1PK81#ER*Bd$XS>0XnNE25zDx0XnFt>*h%H!ec_g^0Y1A zL*iD_Y%R$bSTw()?V(_Lwy#TxzVtgDZ9b2;OEqp56Cz`fxH)_g(_=S2NuXE45~uwI zwP0qyt~P7cE4PyQ{CXC2z1+tgXPlQOkj~9MuzzUHLGH;3ZF={o!avRRW$5XokxW=r zqp47UMvg0VQ)?9PkitYv0|h~~bAC=DzTQ|BZA(B>F3 z?xC8r+X^zt$wR#>xbGECpKi(xCrEu zjH*$7tY z9_iw8;cd45Xy+%QksKD4X8u5B%z~Kf9%33Io3ND_8am;{!UJ7G z8Fy`v#5{u@{yEqM3~8CuA`4(z+*h=3vkmb>eiqZ30Ko6hbOwpHwv2@^S$ZGDxjtiYo5Id%{M}~1++y5sEafUIKq4j^}REKN$41biN zYt4^~M}5ZQ&H}<$Y9NR*{`@c^aI@R5$`J*T3XoQOdCj@VfwD)8Pb$4~vZU>GrpkD6 zN|yyRfpYfZ(c`6=Lx0XX`4)NF9G2&eV8DLS&JG&~9QfUYqqXrX5?yt4giT$EDM|p- ziif?nx?x(Sge&fm6i{OeGR{OT?k%CP{FfX}M8V*6z8^BYdqwV?|Lo1b=dgLLd3^px}=<0@B&jV3!xNoDlLJJX9w4d_sD0}@%BJyjvPKl2!Q&JV|Z&zOQW)S%Ma>Fvs(iv9;?Fz`-IHhmxno) zllRC!i@4Yl!z+P((c-xj6ZfZ*Z-Qw>7!uxu35|+Av(>?$Uzh> z`AtTDrzOvR^R5)S$F+NRt7oI@`(6D|dOCy>8jAo>lv7802hdX^=QjE?Us<#Aevxx4 znW+OG`nBaZnFd-B^vWa!2(X;pEv^t-IAkJr1AqXEK(>BUWjAR(qVyC)u6 ziK9E4tAPq>J8cXHj9UuH1B<>Jvb8^0@S^cWwH7AH#{%v~=q0=>vzBbJ!Z<1jXJQmR zm--JIoLo^C2leXU;68``Y0S|1-MmKQyfqakEOc#8)ofeLy%ViyLv2_-n&snd4hmQ96y1ya z7|Pv);vHZa38E%%{V$G&Mng3&R_O5epBkXdjeFhzXPhLqfd84Og3JB}G5{o3peA7N z@F@n3>d=18HS*;E-%94>L)pS)TFk_a61YFo_YK;eL94dCgv4#k$0a>^2xl{kBLd+i zIXG#(S~>#}GK?>%^*JYBSKm;>!quWkN9`E{!-k39BfyQrHMAt_KaGnWje~4d6A=~~ ziK}r)mQv^G$y*>?>XFHxSn|HF^nVdyY{jt63cftI(rOWyz|tCiP?JY z-YIQ9PhLYv3d5pp+DDDnOduO_H^?`|kwX~RON6RD&w=-Ur@L528+yt5x zlSP6h2!LKh)QD)a?Bbds!iulIawn66Y2r_-{%fQ#?%CJmY_jot;Ry6^eJvRo-P_wk zwn8;x9BZc-=qF9ns4#)AOZkdfOVF+&>syX%CslYlzVvzGEO(b3`?vf&dGyg@vy+ec zbkxWK_%wz`MD-zAg17|@uF!vst=6vrCx({(e%ZHY@@f$41w83R_!EzH%9`r(;z-?Mxoj-!i3n@QObx z=4&A$&$vfrk%W52^m_l`XhqC6nIfb7w<#ce-IZ-e_M#ix@-V#M#Lpxa9LvORIUjlU zq21k~c?mNGr-!SZw1S37rc}WGtlfBN?*AoCIC4C|9y&SE+eKrR304WHfRZ)&^mYe( z9xVu>%k6rjo7G7y4viX~G z(QTpPguH-Lm`5m3vxoIBiB*e!S93+2ijzaBf~w?8(%-lP9|CzNf- zQ|*d6ZeZP!!~IA*Q&)S}UB3j5YZ}|G)4x*{?LU-RoUr8w6TADncZtHIF_prJ zGfoLPX_TWtFpvawztzNlw^O~1Nc2U1 z4I`uS`yIJG7=X4F`&C}s&@rPfjXuMk?`a~>%n#SXAdSNc(WShSF;SfTKW>+S{ZsgLnSu=p@Q@aNpV7tF^|rez2RIR%BCg${UV3m} zT7MY;_1tY2hXZ_-FW#M{kw0*{VOdI`09rc$$q9{bh>(n*v}VOYJFAm{56@OG7$pty z+08%79pnD<`QIo|G?z$2-TC@dxiwN}Ww3bd*#k~8ITa*w8Z+_;4c4+Qj3%;nDD+ag zViysT`#}W|9BVJZ%N>)a&LcUkUI)+1vnGEBn`(OGLBpjE;awL7OZ7_4sE7CcZ5*!0 zrT2Q6rcBdCq#`cCS8zL-AXH3=-r=5TXqajO^{($-5PlT?elBAeD_6joFD0?9tM^fs zc7W_=iYyv#;#)5{*y(Tj^M`M8+!8zD!dzl?pPmzm#SeD-dcI2YP$3gNJ$zGS{4q7a zeB_6Dv7SuU2POv6e|ij$3zOJ^?VF5vtYstaYSos-@-f?~jM8nX5MR?m7jrKD%swAF zw(RaXXAf6prFQ^1JsV#)2ao;wIHTvw2oY|P>EDZ9>~}Q|`bR6dWnqPVw;w$|W6CMAtvCGBmS~E!kx=#=k&ieI4_Jnq)nfaAxX$WS8!t zE@b5@4T%|!dxZWZl6l*J-L466ai_}-z>5oYVr9$OrYs7>sKV0Q-u*oJjqUN?-P2YI z8P6P6b9GdsbNea=lV|IWoJ0$jXwG0#FohU8Nf5ji`MI3o29}yoy<7fna!4McTTAy>0koRKlEOJc>Xj`Vw!73t#J+n^xT!dXh6}-AipTW z4*-EMJAw~MMZJWZI2=TSe4PDe6M>Mkj~tz?-b#!_-!rBezV0rzD6SzbG(A>#PN1Ly zS(G-N=D;ia!*pimR3Ny=PJ^UKi_5kTVlrb2=y_Q#FU(kl6K zZADa02OM%~>hRyN@O?~p172VHr@n*AeAeUSxnen){noGVGqo6{(RX-;+DT0z=NQ~6 zK*>K12>-{RbXi;SOlV;AGWomM<>sc0w%Xz2Rp;KcU(KwR}FP1QZzi*l!?j; z)(fm$U_nM@S;PvRBI`LjWLG(Kk!VD6``j`(6Z9ZzQt5#apPtV_PJ|=!%0t9Gu6lY7 zk;D?AYUAA{^MOMJ33-)4uTs9$SW1N4;AVgUKnWuBa<9ztQBS9egvkkHDAOA2j)H+u z4Lao)TJo#@AiIdB?ib?X(9u-4=x(yxolO31@eK3dN=Uvqdz2N?uA`%8UAx!Dw*9PS z!I=UwX=RQ=1*%A!MLh<$FXsO0H&J0-;qzw+@i3|uCnJVBAC7Z#%mTIs85rbai9*uY zvly9NE$s|fOs+s+>B`$<@7#~X*HoFU5YzW+Ml;(j{4% z)|NiMz23fNn$~=0TKMrrqOYI;^~Gpn>g;p8%z3~0mO0-C+Lo%}TcacGCS#oj-+%lvSe!UyC>V#q4dQ zoOl1QZ7-VZ+ag2-LIC2yC&C}|l>?m0e13d`Yrt)08IKMr#+WKcOHY{bM6;ChD=jF6 zb-X>h?qnxVZSY9?U1aDzG~ghd?lL!xUAP}sZ9MSYVBw~My6A2=5`n5T){RpQ#v`Bk zqk_kEMxm->$&Us~H3)<-LVp@&O%C7Xj8F1h$1<-hx&&UEPU2+H7Br0~p;^GIcPYBI zCDId*4`@aF*#F>`NzT2^nfdG+y@$Wk(z;27jPK*@AIj)b_HPiVP+D0-?joCPk^4Mp0Mw+!jL3Fes+*lh!;u{-EpT?se7a zWuoih$oTD1=d|N)Jd>Nj)ALrpnvZ0u89utxz=27V&(fO2a>@t!c7!{w8}z%l?kAx4 zAp?RrN%65LbxjL`KSONgv2&sIP3lOIF%kCjQNpAxXsuskxPaoV#Xf!av*J8Ja8#(P zR#Cku^`$J?7i_SiwZTMsm*)jWM5VMG`Rw00_a*pkw=zh%a6sPM-_)8^Xu&cY!oAKD z0_E-pSys+=8`C1xl%i+eo%i7$XeDhmqjdu0|$RUkS#FxBGaPPAHFL82Z>s{BP; z$^%=l1SLWyMXzO-2Pnf8h+y_cZHcvMH=4FPi)9u{a_J13E5$AZsBEtfQ#^?HOxLWW z58;E2jjuDcG}AN{|m=Q7mhqbUYSYIu`r25LoI(rGQN}AN31GDX?=< zM1%R662`WpwX%JlXG;Iyvwrr|UfO>Pk$o>=x64wC7`-E*owF*$&~GxcQM{~*B9ho&7k?5-I7^P2W=z)g zfTbf5@)MkxRD)f#{ii!?B15B8EhQy7OFK`e)1%tw;16Swf&q{Oo@C5sHJcMwG&FI5 zb~RWTa4@*fk+@-)HnrJMn3t&+*qVip*c@2geSVv_a+kr3&j#3|R`wQU5c4!{F`70I zTU@^J;(O`L9%hE@D=D~xk%`vt?X|Ru=T}aLu?VB1yoh7nl~xu-hWF|qQT}`ythENFtJ-wun>!H%0M4qkjI42LL6Bk0p8?Y6 z7AOej*I3>O-D(;NHRJ?r9>j0`!a2+E_UN_z&EwI32*=~Vj~M*mM}x357})S0!tk*m zKb1zjWf*w3M5fDe7W+u-uZ&-sxSkK(?N+(`*gji{F1Q%Kuc>KqE^} z8mC^Z?fp`zjgjKImVm9IOT5*R<8%D?_}M?ewa%b=7XT3qPRXj)WQd3^x4adtAn1O-oh1Bu)pnUfCp0yq=k zWP+^LBdV7Jmpu4ItN;xL)|M5y4Kld@q?zZE&>c=iGt7_2XOQ0wAP z3~@0;1*o$%`d+-aRa8ru`)xSAuNIv>^%D6*_OZ*I>n;VI2PKVLo!ix>zX6mU(>}a_ z*RfoF@TTQ(n36>zgGK}qFQ@ir&40K%Y9m{E+S}djTs-uA46D8jE~1r>a?*Bx^v>FST&-h& zCjI@(-kZPQaUQW5=6OXLxAW}W-X2+!l)#=7Yu!cr_ccm{U;(03`P1bV>AorAEdVgq zrNf8^)5GH?7<3JGy5gJ$tp1t6dqATGj(q}N*seaRn1w)#aoLa+{uKwWOZqS}COo8Jh!i6sG05D#`TBLL2$+QAkAL8w_OGr8+Ze-JN@ zUVjPdBXM_)YoWcCsa_Fq4*^Az%+;<9f_iCVVv@1u=e!)N=k}~}Upd?jb+u5;!oqHP zw-Y5-i@Cf^=a$hsaHWt7aCkvLFeoi)>g?o4id6#p%3G@YFBx+<;$vco-O0$0D;`3P z+k>(PkZ|_k7tq$ggPAc?t%D?#AU1?mbOYGoWG;rGV0>bDDhX(FrtvLV$g>v!fb{P3 zdhS%KkVr^z0NUyLB`j_~mn$Y@+4K_&sQlAy($zyV z`{1{qU@km^k3ca>sQUc)_n({cqk*nE)y_Gx(}X1X(U;4S>p_6YAp#hKikL__IQ=L- z^;3At$J_~RQ<6tGHv#24WZV44p6!EhnGsW}M(N&1sVJ&VU5X!A&%g6LC1$RkbIcu> zGUX8IXCHGD`w*s3fJFcVAX;gTX($TOgJz=zR=rGR`H{r--j%Kwk8R|%`M+`IOZ$J% zMM6u=GWiag3(M<6H3EN+__@v*^e6JRDk_uu)ogr6+^VO`b@*cI2bS}lj?=Ji7Ix`_ z+^0m(5tXRlY%R8QEJAV?<$&u#q%~Jip4Y zvz{Hg4k^Y;RaX{NAg(2S951dUJ@yl`iNw{Ry>>Gp0YG!;57cR#BXXvH<-jZNz+W&t zw1}?jDK+rD@$3D^fIj9oL#6)!kb7srwv>6K(ess+8(=8(>S-)9S@5bP?1aNT6LDn4V6ww`ZlT!+*N0+vU9B{ww1Ro{|QGM-%1WK1s?Yy}oq4 z!MA-0FR-)cL3ks8)AezGs^3ceB=V@HJzO+y8d|f*rf? z`Dd$kFx?#H}N@N#*|T;gOu)70;U|nlnw5HrZnzeT0A4YEn2h8WE~Gfyv-&_ww=6augiO z)}xx52!e0vxlO*Or4o=RneSAz3+sN{9g}xUfkq2VPt|=CWDV6KWJO*k>kmk_bL{A?yUZh?7KRMwJ8cBYq3>p&#iO6R4wGKS(k0+~JHH_&9-%f9Jx6&-_f+ ze@z7X`vh?4b8g$89FR@i#4maHxDlLTCy%wk$zIhsp+bJFve$dJKdcrEVWe?iqIl`5ad7@G-NUTa=-~QMAiC7H zA(r-Chl$>#YOwt0dw|d* znRz1u%IxgZ)04ILEqg3JC}s?$FN{V_9qdYJ3`cI09x}|kOyl{+YuX%^JkuJwH2S1` zO#)U#RV7$UBIlCu0A;N_Ws*KdY(^A-rn|?4CjqnuhgC9-28K9#T1@}|kmwE)H-vG} zDP%V?;P;1rlA|pfP4_E`w55afJ>kh926JrA z7y7qH`jS)xlZ|BgWSs83|ThirM?rJ>zUVYze_aq_~D~PHX zyjYh+>)$}grkq)yJUAWh&iA3q-NX4Ijc`yA7|iJ}lEwHz&NGR8S5$ozj&Ws(u`z7< zwRju)xz{WE8#=f+#T6WQrPJkq_Aq;wBf>dduG_ff({p?+1-h5DJvh=o=_LGwEb{v4 z=F#CR_k&lL@7chXhHTkbMCp%X_gg={5`UZ4x%UD!lng0i&aHam$znmK`~{Gt^~s}e zIBLB;kiuyjoC2E#7rQ;-PCyy(+ zLT5I)Ul22pg91vqEGkpFx*Xa=)z}q{4u!T2gD}7;v?DV!y<$&RZwu@}55Jb07Mzwp zPkVfb*)(8#T6^*8dQ*8F5wmUh2yYu&^gblW+^MJc((u@sPoSGs#Dc?yD49UUE8W$+2#NM-!Pf+*Jvsxkj zlw3yeZ(};G;zH`iR0HeTO9XE$H|c4kH?=-5ekHc&39`%uN@p7KD#q=}rAnr|0W$3)z#_z?_M zj+MC3;>J>e5Rb7pxo2A^X%@m56f%(}*GLAf$|h`AmroyqHDZ53CD!1Vf8r;9+8Gbr zW<)?#5iKeDPl~vj>!&3oV`}wQqX3(LC2T}V6^e??6Bw1kZ{;LSEJLM|G30|_8L9Yc z+_3%p96?{>!G1M!dbJ^(rf27_#p=|<66@6cSRd!PxvGp|R& zy-w<%ie*>P?h*u+ep>h2h_f8~MhkGM5yjVg>G|%~sa=v|coN5f2q%q=-O8xB7U=DV z|B_vdhTI-lE)*RrGBq9fvU|M)Z}l-6!Ai*@96xQhXrGyb?W9LSh=}nXmd$VEgN9M= zm!&)i;3M8NLSBiV?lYPO&vPZKj{B4&rN{tOPk?~;dS35lY)joir?&&6!Z$>dA$O+q z(?~UOK?zmBH&q#uTEf|z&;od1upM?z+%97b6BsDjFThADC7~+EvZt~=>JtvSzPy>< z(Wilh&{Et=wwsx3v)Py zkQTn~hwaJF#$EFV{XRpDrrpRdOZg0xn{Uu$bB^GN9>REp_xULxED)l63uygBWE?^T z?R?DK>bhM_21-P)|E^g5_ug^2)sdI~*L6Hx_a2M@N4**6*Y0OT-PyECgC0{vTsXYF zD4-xjGk@nP-}R8ItE<@+$2WKq^PI;A%)XM6mY{o_w=@gEw@rB3OkCW_{Cu2~|JD*2 z*-{;=1Ta7>Bj?9kSkO5?T*`FU^){!WBJ##&KL%f9UPLDZ%Jq`QnYQG#`M418QEG!Nh2SBsE4|zkN8!Bf8Q44qJ(&pJHuI z7;z=08?B<}>E7H`|HUQ_RZT5W{7w`-*7n*|^VbH+a24w{{jAAX^sP7AT|T{1(4&Lm z6lW_(*)nEyy4AP1QgPSZPy*D=v0>7yzGK7o#mfsx9$nmf>V%6eUi6-~gTuyLesNT@ zlt)nDFHi&n5{nB$^gJoglaaMj@cZwaoX7-9^#yW#ot&JUHBs0tJN7V_wxtoWclG_7 zoP#GKj0Ez{ZQ8y6!v6RB3QT5_)3*!9vjnfF=$c0IBYR!_qag>s->Qry3N89aOSo}+ zL<~(IUnIQ#mWrqEw3xbxnG&AHN9lEM!@Jxv1)p^FkZ=8h(bVt6ovhRAq&Km&9T*VK zJEQgZWBkW<0nXUUg!Syd{S<-9$+Y@i-}q4ytp8a%o?$X2SeyQ5mz1@-qL(?c!=QMR zsf~ju4w9FfVT{%fT&KI10`r?#qt-YLjBvyVNqE~OLF zezFONS|1bKJ(d91Vs)w#QUiAypU%uQ7E zzE%7W@qBrwCs2sPqgU`7h+I0Fej_u*WgR8O1-fou&7m`i)LpEIMVN3eKonUJ_0s2L znQ{Ijo>Cx_g%=a@#R;@xP+wd74+2yQkgZmY_@1}NkOKRI(E#yn;{JE^w+<>66&|zB z9&nmS^R+$_VGIHU_N)dnTpZK7FD(5TzdpYFfj974UyG>~F6{0*I7dhY@01avaN8Rf z<;iS`>8eAX)?1#RrEbH=iYzC!Q}V5vgrVQ))f%}*NIV`tNEKhq2@ewIzbljgbPME{ zTM}l*=BUy;q0j#Zp^ELi-M=t?S(ZbiK{j#Pe!0L;U%)=@S$+I+wnBgf0*p!3(1OKx15K97IR?l8e_eAf`ovmL~-e$Y(`GyAY;g5xi_b-eV8X7zPqJ+p7 z(?uHG@Ft7bm~GErOjt2=JBLzmMwQ@T{kzxm{qeGagK42b6(JYNY@IOR9(BKk9R6S! z;1LH1pjH&_>T_Cc-bg%sv*y4c1$3W8-aBTz2Lezt4;c)c(7@l(CRH+WT%14w)DA>q zhDTLTyV?pR!%nA;=hUf~*w9}(MJeo2-?4%r z^S)m4RC-yZS#jOmNRBui?b;NK&xkD0&Vd*a8|mq4Do;diw1lzXhYMYwgW6ip{6eEq zT)(SHh^ZP*==$%epX*EV?Tyqz3hPF zf{0PFrqbHc0|Xc?F1Cp)SypxIo0H#<$k5}3{b*TIDl>9g9%Nj7Kc}psF?>0`J$f35 zH*lc1>)+S@Yqq{uK*oG@t`Vx;+gqqMhTX-dzwrGF;up9}1`iMca3R;3S?nfZtotG1 zY!aw_<$zU~RbyDb{k63cpDULyp5QAEUnNR3`Lx`=0AcjFrMgDu^~j((?1*h|#yI0g zL~OcdgXR8MODvowQ4m@=n1j>1e^K$+y7S&!LXRG7@npo2%a`VQ5Wvn@^>2O^?(KQP znI9u!e!y=TuN_x3U?kEEWl-v%keMXErXICQk2B*wSX$^9d!h*zmrzrL{E>l;gkNtl zREahJYw=tv)GSBeH6R}iql?Nia{m1-4G7zwSk!}IBw0=(9z>634l$&``2SPhW}ZDQ zClUyt-uTMEonXxB=(&|mb~{+p6tFG{pR4d=N~KQA+B@x)-|BByt;^OO$qrjx?M-uFkQ3Htf&IBk z;Q|y;n~dS)cXTHINe!XM6H5jo8|h!*h6ap1F(Uq*@DCp}*^lLT&%Qqd-vUbTIK!;S z9=hHdo=!zL8|oI{3l>P7Z)~|D03pUNjKOo{#2q~;Hct2BOOHxI!?D=wP*9gq z?aNcpTO2%&o~dtN`R3Vz%D{`dX@9kEMG zM;Gmxvw5L_c>Lm7-;$)Uotdx@3gpB}d2ViAEiKm;_lgu3acy5L89{@P zp91HQ$xx7G)vR#zQg%~J92c~?$&15p7g258q|Gk_wI}J5Gxmi_Q2|&glzZ*8OaW`) z6FfDBpgDwlPJPk9Lmeow6*a9x=CU?~FG=eR--1q%C_vuUZ^y`*YOT~Q>1Z%W)!B%* zxO#{s;M0UnDM`B}xv@g7h|LKz{fu+JJxoCN*QHM8f;dMW;}kl^+jkca;nzAa!ZvOH zGQ!4_;v;p2?GIlaJ;SIv++Sd)qcCTyPpE7jlAMV&uBDJGS(-;Z2Q(>dud*&TR1-wp z!W1h-t;FH^i4eQCgxnezLAR+>Gh_}(%GX>8SAR&oE|A*hS5BwzmnPZOK81r%!zUp) zpcGDWZ`RtczX?`9xpt-Ke3(2z;M6S_Y3Y33cjt>8*3fUmVH1T2L~w@UiFE}48-5IW+&QzSaY4;Z%loq%wt#jaPXgk=N|}hs4_8g zZ3`0KXfU9ac}Fp>xWTVf{^(@-v8VeIGK3K?^1N_ZFB=Z`iHT^W{4B5Z!^!>diTruq ztz+JB(vu0Gs&#JHKy&`hKR71h?=9824T~>DF`#79R+F}#p zT;X5EHq3Dldhx2+N#fB#BR`8Rs%!|uf7?#}UKA1s;}u0}iXq=^l=!fuopI@}^(U(_ zkHvL%1_VhE?~hr+aw<^OHp4F_8)}JM;lW5%StM<3VtI-1(*|GX1Hb}Aaq7Egfj6sW zZmH_942Nx<#*dN=-z<6s#pbyDUofoB!DAekZzoOcA|4j_Kq{s)LnkzZb$~UpnD&?r zao5^j4A`J4tn1&=ng!GxBvoIZOvJug|LfP)^Hq90c_tisbJbN}U;pOxIzh>wO`)5H zjbaSyWsK>1y{Uakf7>}Djkt{rx@QPFM}0##6XsKb&ne5uiHm$Ytcm|kWG~gWyIMKb zwzVv3613<|DB!LBv&}9Q71aI16Yh4g?8fi3@^5kJsBx)Jok@e$(qV}Vn*wqUXLDH7 zGtj$Y%^q|_TdymY+bj-O79kM?Ds+LBbP|u3h=fF9G zzV2V{TG>^~e5knz`F7$N$S@FMhTZr;UTQzMcl(5f5G)0n9_Dx3p}i(~IuEn~;v(h@ z73^K>1IOZMhTKx0bBXeG+^av=UVD1k^xn8DEA5!icM}hVj9G_r2wuC015wOEc!xFV z&9!iH!2h%KQm;)AkokU0;Ea|`m?k#642;d2qG-&vOZRjVU0X9I^SIUL!%8)!sU^#x zC-*f81x1xl(R#b~{yn7A?q01Ug@7K>#5fBqJX~!URB3sxttZW7k1FNYaU5guusb~q z{9QOtP|*!)};eWvL+~l4UG%ha zGESRciwkPr@o3}?OM;26dnB^mL@gMXAh+NCEgR~?tT3rNX2`^W9neZVY^F9dLC+NT zUTY8YGCH4G&o@&y_S#XQ_&fLdrLUV*1$~U7S!3jr76Jeg>DL*}6HPGDl@3ZbA`oi} z8>c~6Q}!`mtW7LxD>^n_@VI|^CdbDTJiCn6wF%7x2iO22s^ivQT^|+wyXJsNgc%ndoQxA@BZvsd!Be&J{#j|N%GxKdI z=q7n=Qmm`d^=dS?gXZh3vA_2ttTD){dV%cPVeH{}KqJZV^?pVVmQu%bvL@=XQ=;Ft zhQU_rH`v0zm*usW6J% z@@2kY-^WY(U=X6jb{jP*G5|Rg zqeM|jBg30ggC7~b+Hjo=Y&BcKnhplV7Dl<9!}k<|fbL`!(YO1p1d-dnNGc*Xy!*_kP{yP|NH$g86^^0@-ofkT9eQ-3uRz~3cOdDL=xMdb>@qmiD($TTH z5sh79&*NHFI!as=78Xd(kepniDeu(qZlTs`w2l_}{6!VWDPl;0ooh5n8YvN|DT4$H zPfH93B&N5wRzcy826IAQx;syD>aDhzhe&bf#A=dNs$$$oU?7)FZd97(3@dJ5fKC$U z{T!q0BaEuLq>SYzOafIL&@*&W0L;Y&P_Jd+h(r$d2py18L0r}?#xx3?0)A#hczq!Q zK{>8ZF3nBm8p6NT?NIN@*}3We;UV=Y;O?y}EOGUvuO+P*_Oc-d!$%?jFwFW34p*uT z-25*h{&_Q24^9e5O#G19f;XtX9vckua=Hr!nJI$kK_-fyj^SEf6h?*$UkRj^6w?P6 za&AdFV5n=>b;lc}U(kEj5s!S-LaVV7uKL>-?Uk3+&b!+PqhI(KXi3!4x`pMx%=OJi zIJbTYkLi#h@=u&`-rODkA=# z-p~DEf&26r#6Az0Dk z?(W6ii@Q6;3lu2s?rsH&Q{1Ik(f)bf@8F*ahsg{Fd+%G;S{Lg_kq8PVXaZRbQc#ai z8^x|m0TO&r`YD<6u;O%mmNqBe2Oc8e4}x z!kVB?dFGg#EnPtv&tI5%UBmp*RXN@1tkI}z9tA+yPP$AD^Jd(_Jusmu&`@hQ zR|gyk0DoUAdc#(x_tm)ilt7g97Vp{o(czdZ!b7SY9!vUpp~VZ_@`J$BtlgF-^m_{b zoBkLAPs%VLgzfJu2%~snIJlmyQ6s(Gm_~e=jzLhC07M|z%?_h(2!WB&UFn-+-;?RT~GhrL4gyNYA{9R!@py(SIG$%Y14@7 zBVw4!A}Qn03_Ua`{-+%E2?zS|%L`)IkCihFt&(LmePBoA& zFY?3<7TP?fkqpazRho~?X!xSrf(rL?)dd#mz(Q0`JMbStfA!oZrbLAQ=A#cJZ@))z zPXvLt+$ZECD8oo?1BEYkfD;HSzE0cE8&`sH)Dh0~X1$I6Ua( zev*r$TOb+@x#)#OMW7>KYCZTaFdpxz+7w?zbjt&A;LqIq&D5j|+GmGKGoSu!QWjn{ z#AKa&96fcjfSEyrvuP}THs8cjVr--SUTkjKRtsqH@6G^yjHHW&+LJUE5TMJxKU`5k`lS_J?dsS2@q2 zECQ?pR#nxN=hpR&93q#i_YiP*S3^O+^|o(zKEv46PTyOWpQWqyqP^BoCTgKPKhuQ9 zS`r8m5T^gWQC3%j7a2b+5#fhOqo(S0V-;mYM)$ox}t?o{(`m)f75-5 zB&=lzoN5=JC08+CbBlOMoot4@+(iBT*ZeM2*D!77RA4q7%qx>?<7mP6X-t!7#yOrLL;pptjX@E9}dsmgd`lF2OIx zou@>*+3IJoz=KKIcQk7M`|F3!&P~4;1&O3mC*h8{bGJjf26`-ZV~w6>?^*k1!423C zq9-#vJZ^JR_#Uo4j z5Pq>FQJxw@F#m}S%4UVI^tCc?|>J;(%85j1Z zn8z+5U-WE!^VVNKtOY?77RC>`m4&aJ*)l}^{;E_jy->hPDLF<8hfky<{(pa~{ktuA z%cxM_sr~n~_HQxpZVT40gsFfKW9zU>xya36)62Q<8E9a24bcEU$AIp}jy1x49j;+? zYA!Lc-|cTtK2pF$1!=X4U&h8-Re7H>U;{N5E-eO{hkN2F%fNNP>xK6pRPytq?=Zj5 z=`)2<;zSX+RqcLZ>zGM~QN=m)S%{Qoir;3!t+xv!EvYKOe0-+b^(*Wp=2N zV0yOf;b|9s2*v#dn(59eLa$CG&t-?^QOCpjusCAH<&dkz$Qk@~K&SR)ArET5IXEXL zf4$Ac0LbC(RiU-!ba6q6NTZ>}GvFBxlpl){m^r}`YU=So~m zDrCel{e-6{dMR|qYQz*WTe@u)GnezBmKR8iZh!?Qx=nG!xG)&k_F^eonI8VL$O;u!*dG(IK_R$J0Mxq_ZgLpY*D%R;u0 zsNn@oGb~xdz}fmq83Ifx*XzX5!RofZtW|`c#^Myuzl;NW8{T{hwadE7wFVlDc*4$%Ue+GYl{x7p%7qIcl)iEX=S>a0&(g2*kR7eSUAMk>lS&32kcOoq04-w6##f86 z$_}}Q+nS~g7q3YV4gT3I zULrI&M4Y~qmA{T%Xrf+Z_&-hM5bLE$L^DSULx=UbE7(RdN9&%yMGqeejt9` zXzBSog~o2UPA0&WVA=UhPb}RPVNhVH;Z0kp2DhnkI0i?E#QHj?d2Tw=890w?X0Ov+ zCPg0b*R3#-8nNf9|B>DQxGKBs9b5>du#ekg&#TkF&s@_`0W=oA5x=nXDORv-ITeSgv7wBw;7 zRcZcfqX1(LmORe&QHgjU9Jl>_VZycn993lYtH)}jrD>F93lilMtO78wqvV&*Ab=lv z=TEXBnG>gdG~#N}vHU(awBYX>Q&nsnjpCm}|CN=%YOfst7;8!4t{q{*ftxhc-n%|`)V#%id2Ov= z^dPXcjhqWV3d)sb-n9~(%SyLP(wvd}b%dW~5@wo!qWAphYFW6j#mQow@pJd}G~8j% z+I!TbXOklY!v%$W)=$D@LD||=s>)Q5YAQR#dW8kuB8mfn01w4yYpwvUoR^qt1k~d1 zWy1Qh1ykiD=|(2;#1bSTr#T%>ZDF4o@L!iC983(K2TkAD+11%LkFYwogH6YG{J01b z%I;7#HY(khvqiSha?)Ly3W5oFS;Wv=i@rkDb#tRcy{P0UUrv}ccmdOtZo6ulcC~Aj zibp1(KiOlOj72iQuMB_a#ooMFEZ5(4;8Ed3jaI^8>u3vvoVWkntRP!I`d;u5!K#z2 zuJK9ZLs4bD-)SSqaDO6~G%VZedM?12MweV_)fucrY6OcEckpaara=M=sZX;gS@!%} zwG<9lrcms3D_cB|Z zS7)a=KncXaMp-{)C_*@;@lNmc!ETZq%+eO=x%45H28$_ti~s0lOfwYqI=`J2*cTe? zeK3hIl2F@P^8lMe)?#AX5+)@33~fCM^*lb#1cs|t+MK`|2GN_W@&cceI;(u|mn^G% zubrrfo|kgJsrTnDPmno|(-GNe8A`1Y1U}7dd z=F5Gi_o58Tz22Kiwgx3-l1|t*q^ueo)>%asyAIUK(tNr(V;Y*T{o zv$poIEwrPp-mw0T=0nt+5?d%SpzU*F+J{yy$YF&-w2 zto2AA59P~wGvreTz6Xc{bHz(AAZ;LsEMd69cNQi0jxML3PeMme%&3R6VIB(~^($3@ zy>;-Sb^7YZlqC=_$Jh0Hf!!d=NYt`Ir~B-&o!BCJp7;Fm8<$v=AYGoQ$Pf;Rki~Y7 zhK0a`+maINoHR#WEsnm7W)x=Jq{6FtSpxX3?yW#`rDY8N^53I~ndDmUy>&gEuGS@q zM5G38@-70F1I?pzg*ecBUar>nzI45IACqRW6LD#8T+HgDPZ^FzmQgU% zP59i#1$|i@4iOd)}V!rsN*j%HHZq)e^_KVrLq&0(7klVu%}6m7@{IQ`p#x9 z(koU`#vN(5)cnku>jGsbcUd%YW!ZLs-Ei~u&%woX@0+j8K|X(KmkE{!UoL;5B8#~} zz_--jOcfqecds5ZF7oY5Zu+s55zgC4u9d%W1Vt)X6-eZ7IM+&N^6W0vNu?zwu4nLF zsq#0r)^aCK>uJbt2PnADC4gijA|75g9v<(gzmL{ag#UXk@Y_##yJa^px4&HU(5$6g zc67_eK^{}D*B;&HI<}`vn<`Ts^Wq|sA2h9N#g382z1F6}P8dShNvA{%Abbh{sh;?3 z)(yyq#Kct_XlMu=qEfr~1r#~8bxd7Q)2FOGvsu~-kaTsgouQK<{vK5`00yWypz^-l z;zs0H4tn&R99*0nY>v-EcvGZ97J4uB-cY)K4nuj9S0ru#@dVef`v{wom@Zv;BHH62 z#J9xG`tJKhuRy!XEOj(!Cx?CO0-L&=9gbKA z8$*~RffcQ#4nZvi+^TNaVIahQqwiti$S1rq-3gvyN0&to zL8B)hM5;)prVP)eZshKxsIS^I=FiqrIZ@5n21m=m=He-wey%2mC&3R<19N%Jweo$F z=EHvm;E%=HNQGMVUt%bb6Q+C<*p5cxGrIi;nyhWln>H9QL<0p^Jp1iX@^PJEWV<}$ zBd#oQqR@i_3lTAHAtAGNi7F?xt#hIDA{h&f5vVG<;pKhzZ60%hzdh&ERsa5!BLpAV zces2uf_2PRZ}nA4;9tY?Nzb#k&31{QksY0zcNcbLB3L>5Db7}11Km7u6FU1tv4qIuUh(^UZ|r%cL&8DM78?kH4Do*^0aYhOuu zNE>2J82(8o+8H~AmJX^w$GVI~s3rZy9q2#o12#|^F321e)w5xvH&i4 z>hvqLdpM%TU1_DNP`g42eZo%8b>C@QGq;2SGeO%vYwlcyMRZ^tR zl7XzR@q16zJc^JnSE3eI^q(#Y@auRa2ncW+FvgWC&s>W&lM2yObV{9}zSxiihEQr} z7Ie7yYotij@z`{{$=7ziy~NbYV&@^)H)8<_5Y{R%>}Rdxi0Lk3>7+iP8!R+MnjDQm zUz%;$37a%xsn{VOF${7T_NIG0P{HOayb{(PY*qr(h8uoYULU0e@4$n$F*(hS&r4jsBgoo5rS${oQa(3cS-Z1X>^uwbwu({ z_&kb_QNyCFFg8`OzW|J>7H0W`Fo?aNnm?_%@?nu_B2{7^r#cHlum-h(+xNu&5mWo> zQ?quCCGRC2dlmS43BkaPAhCL56*kAEP9cM0kob6;f(jH_R?~zgIL~tCcYCzeyokwWL=vifb}A~*8E*>q`>7dk zQY1|*+^F#GOKq69U4lX4Xkr~B6Zhq`+q2+6k1< z1cgIjWw@1^ReeQIp!sIe%cAtdkk6?CuRjgmsZ=N1RiJa>1_dIU8OLzoc~Vi|SW|Q! z-|bMz92Nv)m!yg9`q*|$I5+-MkBuNi-2BN+l$aLvYA|%gRCnV@dlYJCcfWYTK@29` zVk(vZ!l8ZgsRuqS2>R{!Lbnxhc3S?@fgtguhT|osuhRQ3rx^uep4SoV`8{sOKBHch zjoav}(_hJwsBxs(b_vZOKWLJKu)slw&yowa%|eT|#i~_WwsAfUB81sBhpsSJE3hc7 z^fB~fsI0kVr9K;hGKEkhzn0;~DY-%HLCSbcZA(tqTY&4gQS-(Ua%_As-h$Nm8A8P} z`va~IB<-&}fupWc;#64z3;U-2Rw{Hfs+~h@ks`DCJQ0h^3m!5^sHi;oK;oNw^SQ|x zwr&`XMg{-?-77Ow8V#{ zb}-eJ)j1SEY4-DBAjaTyxYvcz3Z5|R2+;)b8LmsBsa6F85rJ2ZM)nx zF|vU}BR5aq`|9350ac-B5-TFFTLcR7KZ?iZcUHuIIvyLEZ9!NLZ)rmY0-&-VOnIDj z2s?WcT!)F*I#TE73mhs@G)Y7l1`QMay&rsY=d{~{@L03Q ztJ>$P9XdjJ`(0S{in^=m>vL~<$sm964_FR`4ue&iP=kca>WLJD9; z&jN9OdR??ck<{k8ZDn~qmuv`hw!hAD`OH+=vwHM$H{C~1AHC8#ulP(~G!}UGqB--9 z2Tv?OP)Oq^+j;w>RvEfkps^_?9rbFH=D*&0`eI#h(KkYeyUCj=1PWp*7) zOTk@DR*Q<4NiItz!FZ}}b|M&X+t9d!6v1+`I3~;9aEZt*%PEGiuc>snQ4915OpyYw z_e#}kM*3b=u;}b)gVjswu%GcDg6qj zQWqPrXnG!0C+Z)shdRqDVdRrLkMd;_L=&&G(RnEE&C6p1ZgcvB^Yr5ysmaC5s|Y8#0jx8*30XU(^|Crgyf85O_tkO(=DogX_+n`N zd4F!pfQ}1aA2xDV7$iYl%n@PfBH$h^K%E1?p?M3}$`c=JR40wC%J7CD$-9`mWmZZN z?PiYVK50z{`a%{d>HO^?=Vl&vDT1_(kN zKBvINC(;(^O6|O1Etr2@9zO7do` z?~ZDV#nDL|I5xyj`68rk9O6JQsRQbe0lSps%ynKN_tAKgbvsWj)NPsp5cDN@+pkgG zr+g8$ufzgI;HqD7GFl;$y*A~_%A6#Ocferz=gg@3k+IfZ*VD=kc29b=c5>9M{h)Gd zT`QGCkOZ(6V2OCx>Q-T8o_pRc5zTwMN{1NTgDj2?yT5axC-E}G#J2x@u-;O@g|}elcj<1&TEaR5O@H5Az)iu zux+(vk}{DadTidxk}lw3_PYcSF%hjUH+n3Q<$dhO^;=(90MYqarZmn`)<`td(g}u& z-KrLIb=Sp}IoIYNm@~V9b9X`yMIqUWK$+oKZn(1_(Q8Lx_-2KK4<$O(XwwD_S)HgO zRv@*8X1C*@x={<(ZXmYJs~e)RJ1usQ3#H4Q=`;h3dCsIIXR+WllFG}=@DIx+tClZs zd6^9+P&uTF@g*YVENv^ATIdiF08rX7Ghq;E_nNNGI%ZK22!{$ByTfU=Kl?(GQA-`h zvWzxhY{7*}i1jT?DU7|x(D%6Cr)$NHRFCg=<+x(y*u|!ZQZ8wTXm|4ZR^AEyl$G8x zabThCVpeCvX)GC?^2qHu(?>hGtgM`6Vsm|y84or>!yPEJ5xN-N`u)0*PjuI?FIBbt zPT$pj_Prv*T{PZxPIM{OZbEHLeE+w&#DGBM9R^RnTZ&-wFD zS1{dW6P`LCh%ymm4*v^$`ed?(B^1DqUNJK?8jk|tNXLgM5(z0vbv)1Joc|fzGDTtLOJNi*INp&x(H}nVyPtB)O!fG(w0Hmb z(;qkOQF^nwwB5uin)V?+{XM&}o+4jSWpbEW5uVAx%UFf(fHj}3BXE_M%OE;2$WhO7 zRY}N{96jILS+sJD!0D{&ooLIxC=Wr@xBJkQ!L%}g9EyMg?Gt6AYY>)J&L$B*ETU2* zQItFHS!{{PKV$mvr&dcgE2gMGUVwi~62EX0PoD2<9L81y9!^UkX$E}x2G=7g9OTb; z@@T@@9`iLU7NyIx^A$r5iiEcx^I^G_*WXKy8b(yHiUx>=HLMk?N}YS2HKnl zTte)KXcZJE$)f#*#qM62r(hghmtmOOra%1L-@W#}YJs-kM)-Y?=hH2gs?1c|0BJ8u zylCt7lTpC6-61HM8Zj+82?`}|0!;wPw3XzRr}tD3Psq}Y=>TA7reb>yK@-aC$y1-c zEd7IhU3oB2f-qbiD4H~rHjew*z;XHhIo)@b7y{sw76-BgZL_53U6FA+J177T^`%GQ z&bm-Wd}8ND$o-7X?3Qm3q7vN{gu3+EXo_oVHQ(XB+}Sldm;y3S!}3o(+e0y0sS&@T z2fWm+>>oN)ZbqCsZqu$%-@2s2(--G+l>?(?*-EfL`(U;Iyu%Ngg7 z07^u0*k5VK1|=K_aP|3L|9?h9>|yP>tBV`o&zwZe*0C;Oh1;g*Uu++GhY|f#@i2hF zvu0Vxgo8h{>OgPbYIU&b29&DxR?e21ADlYd-LFvycV&g05Pqm+@UxICah z8JzQGJz>-C{@yz>Tr)YK5{=GWam|WvAXM^rwzH`6nQ!R_^cHGwYT|fvH<3)$l@Kq( zZ|l@cha_ib41HW9>ZASAaNjn*t94)j355^QBm-faF z)%+6PjjuTF!-AtIU4%;fH`opi@OzDliI4z{Ffy@f$mb?0yCKn`LxISUH^!=1)*$Hn z+h+}Hh4n51q#d_Mf4IE7glRDsP(Vxd%ZkdFin#Bc1bPrN%5(~|oKAw1MhDN;`z&;k zxAF8f@~4~CtLuGeUE;aw)P0}vY=&7qBh~RWp=S`EwJ* z<%;^9?ObRQZUc9;np<4jaNc#kdRVa$ZINce2kG00lE-C+N|(>c5q_qWQJvI@C)rxB zg(aJWpz0`n`_ptmiTi0M`RDCRCe=Bn!)bRlxR-W%>l4j#7684EwH#*zHi zu5!h%x}?va^)}3sZr4>=K4~(sKCfg{${~}~oVwD*QE}7$bQZ=lW;Rx1WX%-4NQ*Zk zhaVO;hX!9P@vg>WfYmwJPLlEpOV^kFH0lR35}_eowg!j&E<_y&iSn=lv_^m&ecw!} zJ|bN{n`}SVY2W@zvY@u4JV6&a_gNOS#@Oqq#-Kz59h7D0c2tR9eadhZEW(5@hV$TaK^QJ3=%+VMFZEY#`GYcrIpah|{2g}SAClef0>vg{X$ERg98N&-2<4JoI| z<>}0JCbl|1zaBVNZD2C86EsY?($a(A$G-US=6(DXPmqx4vGtBY=-U!QDO$qwMcep-sR(-r&O8w50ot+>qEXkT>r zd%=;-0{i|K0Q8gVf_&RbaRYrm1A9S~mApsoe#eqfMF$v~2_iP_A9o|jLbPiTyAqA2AiLi|89`F?GW|9YjoqnxUH8&vV7eq?qtc-&MLdl0SUDI<6 zJ$&PQx;V4uP?1kD{zXX+yV@=3YZCDblhB5Ic{bdM+ShK-w9|o?2m+}9zoQ?0dHpIz zI4!kNo?xC_VJ%aFuv})+`l+eH+zX8RlkYuOQlj_~>1}TSto_CDx)>}}+gIyJ&KAj& zEnWCAXUEHK?_n8T_xRYBJ~lIHMXqhAoy|U|HrH7h@a$qyN@KPAw3(QOF>vl#M}Dtz z0LCzM)bl@4q$xR17vU2r7SErTTC4Lfu}hpO;nK=J_txp0<1UXI-IdX-xg*`EzegTW zfRe)(PUsSaBCI(I#V1YDxo~r%{#hN0S;r#R7JS>;+?4zT!#BUC+=*n=naF0OaE?oj zw&I01TptZ-Ue1|X(v>M6wG)NML>)2TO*6+eMTKfZOeY@Rrlc2D z_Kbv5NZQ|GGHefPTEb&pfYS#H4kIm$Fz-2d1XRr;-9R)pOBMIaMJ66s2@Vlhn22QM zC5E)Jn9m62x3Sh(>)JpH^&6f{Bv+(miWkZf*H`ou*}FT1r$R3r$&^2Kq0;5d+fS3+ zSDkYuJGh-H?AmI6O0W93huMP+HaAJk&%7a9`_NI0Jq$N0otjVa=XsL?2(~2m+WDns zG|Ebf;v-sSYRzY^qlu?#lQl;;QTp?6x&=cq+V@ADspjX4t1fe3;7raF%8HZ}#OgV-lRUY2kIkc z_mCvc(pa#xaqUFSa)@oQD+`vWhb;5^hU}VhvnMNZeSR*ZbgJvcY@K86LUC04JeH6I zR%tJnx`KaUNqNalt;yM`=ClYW69Of(zeg;uaYxWfO)GLa`6KF?Ms_Og>n^vfg&V(0 znU00MZ);oY|3wpCBWWf`Wmu~_VPR2h>7$UVtJ4{9JiLNZR?t!3q|a6*eeiY7F#U1j zT;fxVuFUzz`fci1*oF;77DHaGI%ImMEz6}scFouBIjy9|DuuCjD>s&b zzG2KLhc$1ytT{X#EN?KweuT|z9+7fQee5-L&sF)yuW6r~oU7Yxg$sfRrZ16EyDlnx zeSC7{$!c^>StgDPynoVQq*a=RRij6-lM`R0CY6%I;z-v?gwPhvP#YE&5Vg~cxfsQTDgXck)vw}PPn|? z1nV}*wK>4p_V?MzG-@y_osi)VE`jUO-$Uo!D^4wL3LRyhv&1Unz&2b|R43&Y2Ay28 zW-RM%iAZUvq^`!(g9J}(33_bZ=u_LRKdsv!$g&khAV0z4)x%7ae}OzA7h5aH2b#xPy70N!YE_HxUhiC~Yeh~b z&2j4t{p@%w3Z_xba+~Km*X>$4#j=QcAH8B&E+(R(ir2PrECJlga|}vcP?0xR7vZ%& zli;x=`d{Mxe_fneY*e_>6)tiRpm63kb+tNEb7Ba`XU6JffR>ma*GDz#pfQx0Ob#rj zg$<=f1AO+Jh2Ng!@@-zplP_zpA)87!JEo%XGUub@KV;d9h3kV0qdx3k`;2-O`tyUA z(zb3^g(T0FUsdgpYJFwf09(KIIt7xre@`QS0IYDm_-v_YeAX*iUB8! zZxv@wPQ?P#4e7*>5DE#|ow*&&?js_=AresHClS>D>E$Wt(w}1R^Y}c*F!=$~}oHOthC+@6y9yfS5sR!&{1D{z>gzIs{p@(Mg_j* zy!@##u)!4Vpb2~ntK;A!i=!*TwlSglG&#s--*~U387aQCPZcSvZ>v&}ICCqQ#d*+3v<}b~HggZa(LJo1-r6%RQFH?~whmr5!m!7R0l6>Pi(R@~*|`RcXg%Mm3JS&v+*wIJC6uP5gvV3n#t=oMe8$_o z)Hsoo3aDN*gZz!nh?O0Etg%60%LFAT@5g-V8egGL*pry_5@GQ>94`G+qRg?{>FCS0 z#i6L6vV{i5qcuR|v|{?#U%cN&^g4dOJsxLL`ui6fyR>>%JH9%Nh!Q2vz|z%80|`pU za>SD9x^|=th7Kmu7PkXzt_UW8m;5IESK;TkJ9r~b^VoMZjN;S0&q_oYv_*_w z9*K()T$CR*srJzni9K%McMlKCi2wG!t-<|J~V5*rP!e^{s*7 zN%k~HEo8mvY7Udb_r2<&_c@YsR0@%)h0PtIUAA@{gi9xi(?jEhkCJE&CZnqxjy-&l zL&czAH^Hor!>3ctpcjMI@Hr2LY$_G74Iri|0SjySR| z&y9R(Z}Xnnb0LwG5CCvmdwXR-X@kh^)=My*kqKK;Q$2hyO_)e~Q)x|uR`}f;6qK7g z2OmFO`{0ZDp@_4hh4%E5y*W5(F>;=}Ye2xSX~#BN{o}ZuyOHz#U|oM)bE*tk>^0h{ zrT{GktCWXOu=1C%-weHw{zSB2^}jr8@4mbj5!CzPH_iVw_O#MZ#c5ekQYX1O$fz1g zb4R_AV@8rfJPf=Yyj*jBFIY{vci55(7ek(v2W03-15Q94_)~+F?K>UA3q*A{e>rZR zt?}=b3fo-Y)-x>$DKXNYH&@%Ukd4=`d}Ez@Z@BSIm@5zC^Lv+oV$HaT`4MGu13sI; zz@8C)C>8#q3WM7LpMWt;f%CaePp^eo5i}!3t($efkp1M$hVT_g^gvV)Z>t{}baP&K z*R)}~aW`N2F6dXwdc>cs#Ow3!V>FJGI580|NToi(?-7FJxbCL*1!d`1+4a?R;+k5a z22Ou>V;49FdPE=%_eVkc0s~pRg_AEi{Qxg))FLF@&j_9al-05@l*);wYFDY0&D{ zwP0iS*?|$y-==8?@pl3|C3ueq5fIz22?w}V7;AaXH;WfcmX^a~)Hp!_2R6tcgaITN z06@qvp|Uh}R+y&jQ2pnPLQ0{BUIsn_d9HGDJN;8n!HEc}Wxj~#4_Zmshe4p+NNJck z`f6n%VJ{3Y)3ZucS`;aC-K+n8;gd!>DSPDUxO6Eualm8AZ{*2qMvyRig^kX0+NwlT z{zNIkK^dOL#oZH#>Z8q1jxu`rfkKN_Oz%TSAh@*zT9noQRRcTMA2E*-rUj4WD1iWC z=lq9lDZ@apu`rL)?Efzqqry2a@C1faqy}0fx8BXkq*w)N~J2Cm9iVp%C6xtu!O^QGQYasY@xk!PilP(}d-#`J?pxcg}=oC(%y z=mDG+Px>Ukc%H0`rOVU33Z`&`8U+NAGQfG-8Y?7wOf6+1?X}CYfheN_nKaz|>tJxU zm+>(F(WB7f<~3uSq}O?G)--*6)}WS=ZlDXT6j7l2+8iFtU^ZW$x$o-o3?BxPCFGn| z8yhSfdu= zJ)k*6*Z-M)noI?i?Y$f7FcnUI{KBaS`xOAYEa?LvE*-TR(T^_1X!A(K+wFLNF;AHy z`(=76w4xE4uP6@&q@bI-%1Vi7fxmqsaf1Hfh~D?8O2;?ONs)v0oiSpxFK&DQ!8h?| zkZ4i@JjBIBbleyRK;gON8h8I*hwq~IOEmTuE$Jb$3wIRb7KRlq(b#ux0={!~E-LDisx{n(QX{}UYysMLyi0N!z`v^@#!KBAjB>56MF7WSd z=wJ#1%@qXn;7M^~I7carPNKt>OlL6ba>QN9i;Y#Y65n%cUYT0Y)>21T&m3s^gf^l7awpzoLP!6SstPy>T5=f+GoMk zW`8>nMF@-2viy9FE9&1brd5B8;L4Ac=8;+@Lg$ZgU~2wNP0AMv#F|~I zun@{HPuPxxb2#%qE)(osgC)4HQxW4xy;95b0O1gEK@ukolL`t;vagmDNk)zDaE4p0 zFoARt9~-7j5)dLe@6QVt?Q}QFtT6b^t~|;bX_zaMIFcW=+d+zWMHL~oG&Hm!9LSI# z9H3m(>8;z={pYK)dknATz+yv8Se#g2g8xg)ZdR0nHz!|L(aD^Wg`^7d#oazt82mCT zD?1nQ5^pp1aBf3ZF|(%AY{gRK%fgmA(8T>T#8qK$*7KpZr{9J!iWcS0fNfB@{#J(2 zjB0L{Tj+z`ED|6$J4&4lgYb(s*ML9+a_GoG+G2Y~UT$rpLao*=fX_F+Y+NqO$I{B! z8!_~YOS23eKZ@Gik0mU!_d@!qRdE-KmH!5lVfg{JLl{|J)=CeMxjI7WE16}wLrCO) z1eT`1T_qtF`wVH=-*plK4UnaLN}Og#*srN>GG&7CFP#<-wT9g;)&XND zA7*H%*2>iCa!2T0P<1d{XDvF-Rs%b`akb2eipzE}US`XA2;x|j&G)_~tM0F4nyhT{ z)n43XJ{O2`_G~$KPMMorne=lPqRB-F?QY%jD{5@ohMt)@<+x z2jeb;15?RD%|pB@J_3}<+ZbDEc!7BnKIguk$}}@*rZ{o-CDmo~&x@R73g;?k-fr73 zdx*dL7HqIcm69p!VlK)DUO7keU5r~)6hl{LOLNyS6tnh3p5`#OkfbJDB2xxuamr^2&S<;>U zQsu7$0d(FFraW~79`XggYKc8=XQ7x! zosq#vhhj^6NMT@+M*atqg6F*jW#R0PwAoYlk&cAyO#eHE|En@##byCQQ7|`HMz-_o zoC>ta#ZpjL@BA}c0C?FIaW{TN&D^4fW96uYAIABO9bQ0t;Yh@aZ-S&nJ7j z7}Wziv-TmSn`AG0e6}$zQs;?FuU7$xoNgsg*`(=xl24~#OxC>$3a9tMo+T_qoQ5l z^G`QVLfyHmAL)O$4A(auP>${Ao5CA#$DQ)oTJU;QA3T_+SDSU59+Sh=krF~y-~enE zB3lpqf!{OFAHm^Q6yyRwZw8`wf0DL*lX(I&kL;>&5cM|`Am-LSOqJ99$?L5~vfP3w zPb*EcPT?BZ-F*)~-WgX~_K<^$)TxlJZc3Nps+8gExLQWs$}-K}!DpaKgnHF<-du-I4PGPAX9J&|zL&+j&9oc@skVrP zXpnJP<{(frdq96a(so?4lq8%5Z-GPlJXpl`3n(NZ)+QJRuLn>LYkxAIxgnlvK5so& z($YwEqZ80!qAQZ_n!_AOOzhZjMHFYy$aT1^9VlqE*-9yn|Z@l~d3I9JcNG z$|ndJ&a7nU`Pb2Nx1ub97kBc-&m+LY=ik@*wyp%uo!pofIKVc_?=yu*u}9y)(_Ljz zK_Ll+US8KXF#N+#7Sx{NGR<=){_j6Wc9Vu!R@QUG9zU}3BC zb-uEM|Hsl>MYY*>UE4tl=?#TYC{i?m;>FzwF2&v5-HStmTXBa1#S0WD?(SBsxD(u6 z|2*&a?`DjQWaB#5wa&HXJfd4jMpGlfr`B?=fg#4*_21!#Enb+D-{Hj%KNk0GWlHs5mHKBs z$&w&l#ev56KJKRLQ<)Q4+JMco+Iib@+!$5fmoa;~YQo3vt;>L$?m4%DMA;qop=Ad@ zOTJ`1N0O`79%arUOo-eh_p=?>2bj_3sEtqe~-X*HcKg%#yGxN0YC-vCE#k; zhI$J;>eBux)-CQ>I9A!Y6V z=d3^C(cIRx*nhLHDy5jiqr$k`alHax%+4t)ML71djHzmJ1o3W*S(-0Nyyo-%bDns9 zS>gq{l{;dJqO!JLZ`ns<+E4Di0sz3q-+Gq$X}Shkm)|B4k$nepz_S(2-p^CWfw@om7s(XH zN~Rp?XaNZX1$G=)AeJHj_ePJ7!$K5+3DyyiH)97#_%Y-wWr1?;4#B1@%&uLJU>OB~ zMBxt>ZUhAzwR-<{_wqj9JNlb^oQY^I8f)>|qJ#ngZC^RDP)$jGd-Cw!*7a678X`=x zh={d>cfqNeb1@wUWLClU?uj@lI%kj8PO$E`) z091f?NyAeh{3W`rWrqSDP4*!qu0n^mLk7#pgbT9e_d!*gIg9;&0{}cJ)gWgMC=#`u!$#D|M1|x4}HQ9qDQO0{hO>0?DVMf zbE}kobJyQzLA@xnY;sIWA-u{i&L>^nsJab{I{IjCS+%(m|VNLW_D<%{<&9HL-E1Qi?+O@y5rea zDrH_bQ&LhfL{zZ^s)`yI`C|}c)=EWv3lUoOUF-CZ1p%3olh@bli|*0QexpIZ_Jc@D z<)Yz_|=ECgd;yh#+73k~MZqis$7I-Vad-$(aP@#q+Z_z{(f@RkGU6 zp66-UJDEe-SBI7QOjZatir76d;MjMov691=AIKX&S+TOX)V`n`6i4yLb`i<)wL?l# z@nduF)VX|3NhyNYHwUY{(-Ws6VsE!j&(+CVsm?Y7Zw|fFhXlFs>+tGDaXV?atyp;YEOcM+M6S+(|=gDyga_d@zP zs#U-07~UzSoJqrX9_%3HLf+JV_U<6>gd!8>MyYWI0!Z%6mx06x4sZUhHw2LU;Ye{T z9hBhsbxgV8O|cF(zik{a50ob({fF?A%B>MD?mqrw1gQVJ>+11!$8|PB^3fptGE>lT z+t6{AT;&JfMc8Y}wzAN3h$m8XeYj7jRFF1SMuS1Yt_pNp!LH+{zUd&S45Wq%Cqf!A zPNIr1deR`f9G@elgh>WKyx=s^pl%=(;Q~XPLSDGCSe)dw9d#k`Vs?d4AxD1M02VV{ zB;(zZR8lAK^Y|DeGa|T&XbaSh<9D__K&G?uPoeOA+B!cvGiq^C7zd`@_q)mKRKsL7 z3E#UNp7Vl2!CtDXwwo>;h~^C`gK}D=IgNK6X|3*nICM`??lTMk?2eUK(%{hyr^t6Y zh}B_(qQ(C#rn)uS`Y%*3iaN&3V9G>CzE|Zdvr+l=#y*>Ny8M-V1IA|QZyK@1rM9bC z`wMQe46lRU?WWH(K|d99>f68O+322lR-#$LHz!D9+Wt5!ktG805LvWh!yg4}lVVP} z(QR8QdTM!5yZlYh+75g6`q#Jhjs~w_Wmdq5a$S2e9&d5J#upV1Rr+z^?@S5|e>Ru+ z1KG_p8Z}=FmfKHSw=%9{mAj$?eOSmrpuUoev39ht+J+7 zb)sGC{7Xufu6SdZ=Y&48a`^k(^=5~TWd52>tmZQDjJ6wj#?<^{@)PyT{eAR;zdHw_ zka)fXwe}9pw-i~-h4$kn=fGLE7!Ph1EDu!~pt>yh|Z`tA^|m8;q{ z)ha{H@s;Jz#NMh=SI_HTd@R9u(Q8(>xwJdF^<#7u75YDNK17%!uXQ{pQRZ3ZWTJ*IO&Tkv!AvLj?0A7sBgib z;L3p_8VGi-e1}W5Zs}L4T}0@sqYx{mH7hRpqQ3}?3I~XU3k8CWVXS}j4ONp_fRwC) z!me6Q{k#OxeQdbg`}g|C1O)Ed-wiqSWXO!fuSK_CBcj4!hXQN$#TrPrz%ae=(w>nPO-){S z+WI7RvEpZLj~kRFiTC$J#3L9%!1G`2pN1sa47J<7(~ly=Sh)8?3g#o6EkL=`I;jkd zAJTh;?vL|Ab6?xm6sQuilmjCc4ly%*5{ZsGG1Z8?>i02y004+>X-GA%spyEz6M zTW`0S|MT!Y`tWd6X1CIYYigMy^Ywqy?XBfeGW)gI6M`Mz1Ztm$y-mT)0VaJs9XlH6 zc~FFa7)r=Co<6BIRD9L%aCs&l#5%S2j*eojg=_G1Ns%l!YrjTRj|=yQ37;_`7n(bE*${;QU_&MAC1!ufOdk66{M2yCPeehy zcxnKv7(-+GzV4>|NWhOnPXFAc!u8&WWluFCTx&)IXaPBxEM9M~l|TitvkEfFahU=E zSO8=eT;)P}oy@_)11fbrOOnj&%IR~Re#9=Bo2aQMd_wzKq>Ahhtk$Dm&beX zvQU`(qd&^Un}d5bJI>o|D$X-IUiMY0LCVRsmWnMox6hU_spI;TK0p(ZN z+r6Hrz8v5x3KrQO^o`8FZZo%&h2nvKT1R^6Mx~qc_T-Iybv1hc0F*v_iVy$vo;BKu zo+y`gm&g=5oA-QAte7go&F7o&!*rGJ=|ZZTKCWra|J(N>&NSjU*O628o_2tQhD9F( zSN_BMyL@n}?=X=wF4hH>Y^mb%QBNGaBkv!y3Ey2z#3SJJ9W7hauuBsDN4V%jJ*wBmLyHsrW+DN=?M#aom>3cu@OTWG@rHpvc zrTwjYN}zR_y0PkNb!|kALXWag6tIe6niAvE2L6jyjbS z*X3hudumUenCl!FiUgpVsS8`OkQIm0e|WL+R!GmgX3jfwf<*Bs5gkw0WPtD1t-6<< zVw%`Px6ItQ8FqVV?9{L`I{ut!@;|y{rgtkAWWWt80`Ioz!^d`N8F?VW#6pp*z-xbb z;D4N$Xx6fj$?c`BQ7O8k*W$+*e>a*JksLw0Ws-yfq4RB~y7p?E`*U+VSS7FUG#0Yo z@o$mbejMDm1ArJeE|ANcU4*@F@~>@3V~YP{u+(_qEwoj+f9Ed(Mun{>n5<0zvQg@F()nY_T#(VS-yw($E0EJ(tN zqdPru+MvjpX9i-j6(N4q-DjI}{3QG`@(M{-kRil@;#1F z!g&-5RSJSB0YsMV8`n`yq0)>NO0v0rFUbT3{xPi7uuj5`X7Xh@9I)yzsF*Ub|mapt&4VXxBW%_TA4o&!8 zyd6e0b@MK}(#?H6I`OYt*;g4}^&Rm!e0TN*Z{+jk5aQ|Y;n&DGeKK)$A10h8=}?R6 zioZX64uDf0;sS68;}ZXW&BwU{293g-?$b<01n3CZhpz2H05D$9=pqiNn=Strg-zff z;Pcz3`oljw6QKXw6Duf!!wr9`yJjdRh#lLdZXkYqPrcc5cZLk07>Zvyi3^_k-R{RJ z+?K#Jaedg52REmYvzhtlyT#T`2puG17@ts^uh)`}zf!ig!+}!Bk9xcV>lyH>YPTq@ zwf^dxp1KnEf8n`4Hn68Tv-=n-a<=3UFRYM*g7kwVYwak&qt9l>qr-n^XN~Wu)vfk} zWXwfg(?8K<{x9Qi`o)0&Fr)?<+!@rNzb{XH?xxp%ws`+6yOo|;s3_ol@kDl;Wl%Uf z&bODB{DfWQZm4U|;_1X@?Hl0EOvat%bx)m4#>XY!yI6JnkIk$S-fSQ~uZ9o;^|~SS z+~X#6Ux-ez^tB~2q92qNOET(maOaZ~qng$plXpgRSH5`%Oj_%&X=e(#xjhW_^mx?O z`H+f&(DD}cJdRc^6{(p{=qKu0unV_lZiQd>dgl#Rv&Skv@bh zYUy6a;V6o+2Q;n=hL5vPy@~%}NU%XZM3oJA+0vA_ml5c+#S;DTF&5lf8ud5f^Q@ej znyfe`M~4K*j}Q_BF53zd zq%Xeao^4bE*fd*JT>J$5f;I1QNvL=WQANY^qBj;}%`?;>B_=I~i_6cm`w<;&ESJx+ zZCmIh!QoUggnjOuAGo(8nq+EkmM1IH1(3XFZzwQ(;v)hfxImG?rby>bEglWe%w8J%H149T;(FifResnxQ#0g*KC;y|ZLq{V077$jGzAo6Dp~2JxpEL4n|G;sij@NCa8R{iyKhkR)eGx*c#~ zQmC^Od(XlCgoT@^%Jh2;=omxpRM-IUzbXPW5NleCmRE{QuCHk5np?+Eg=rQ zO`oO$z?0CBioyO3)*CCIjW)9D%a%}6L8dvj|7-kl-*o^R2=Un@5?9F>oN_zHO96W* z3iTw{g_)l%FZDia&(s^*dTE3YGQSyd^1Nh6-s|q4osNCSw5=}o`atUU35sm3&C*->Tc77AySPZFtH z!~1(Kt|FCxcon0Cxqv0%WaBS+nPIIzM$KMstN97MvJUAH_;h9VOD4?=C;`dX;zQ0C zYi>=7b_{C^>1n1CV-g3s0FcbqU+*qgnA^O6i1^ZH>f}Tqd_%Gn0_k50@xBsq)f`B&?ID!on4D(XYueWYCL7>ne zL&ga_?CcFCWC28$LJIG+D5nadB;cpYLOCGP zmH<&481@ERDidGUn!|>Xaa@{h+;SQeTVJ&)MFWe9C!&I9u}RVuMAv**?iW}q0KcPq z2mOeKxUVC<3u?S(Kwgfl+I~tguk@N;TTAbTH5T#_5ebs!b-K744tVlGB!3R`#+4kL_+Li_+-UN*pl7cF)`rNS4Kbf_5N^3($$U(iZkTi= zM9Te(hM7b=XWU9t`rq%N99Peix6c%ql0%G1tn=3-OU`=OfIyanPj8`wp~eFE>gw(+ z9QqT9pV(GUp1Z5K0t4^wP4DjursPGZP8bMtTz9cro(~Lm`fW9;BG&M19#?76BrJ=t2Mi<_=u&&f+tX|g z(93LUiUC;PoQqMtl%g%DbC8QSWAaBEvJ985tFSHId>S^La4SEoSV8%W|IW`as&6y> zs%sIgK<`1CtDYjdrS4e%UdiFc$@LKpHd%+Ttp9l=Rga>+Pz`3a{P!WNX|9t9vBFG~ z26Z=-e18J~BGGhS2jyyH=ExC=ghoEPZ+KS{uKxZiq@NYhtD;f0ktQgk0Y;1h$3t+P zh)kIpp-KZdnb++_^l!B57Fya*XS*AShzJv)0MG2?6vFDq}9MM!i^e8kHNaqWRv(^6aNxqz*ghmtJldICbC2x7H z1jSrJbj=3K_rn*f|BTzCdpj+mQ~wc?MG{*}+~3S$MM=UsDNO@_fZ)lzD_h4IK*;Ca zvHmN>)>7<%bvlRted#I{4c&mbn^O}ScKO6yVT+#51Kpf*UJ>V zfhg6T4uQ3Bp03{jq`St(|g4&hyy7Y%BV(=ih&|sbV>P28qX|BpCZ^|S&M=QzQ9fQRZQV% zreMg0pZ9q**Fo%-1f&d+^4UNTM`Sz*05uo2d7WGb+%Ug-u3-yIh=C%xi?zC2TKEC2 z1vec#bxx@lulDUEo;kj+e*kx^738Oi3%7|J*ebG~w^(}f{H?8blj*AB65oREv&jWs z`wI^XNb>oIen7+HrO}^CB%n{>oK0g@f!s8|MF8p&Q;@PE2{$ph;)Djdxy|~~AQS-O zQYp7i%CW%tzi+vZ$;EZjKUHjf_eTuZma1gm6V0at#9O2F7b^vTdzpKMO-3!Lx0>K4{;NCAZrVDBu+27SA0PDKrzo&^g_{KYv@Q7Ba z7ZJ=F4+$iv7YrdP$%UJ(cwy>~{y5=w;Q)+KR{v}c9o2Hr(Cii#$C@*%VU)qF*4s3! z85c9dYX3%&P9?~O7D*%$@fvP2x`nNLlZ;_+R+7caR)Xv?nR5d`du2am&UP4lKC^on z2?_GDKkLSYXjC!pEbFmpm_IqyWbI|Nll$)bAWrqa?%|C>xkFvcp20-iYRiVHgCG30 zPL0*BVB%yvYv=XHNIQ;jF#4)l_iqvDhgR&Z<4}F;g!(uL8of!N>CKLcvF2~Lj(kK z1I~NzPVe}tq%6e_#ESsXlHNcEL973XZuApv<``wi?rkv{q`)V@xnIvN~Y!E5(V+U?Ph3fCJnYN~E@USC2S#K8pfK6zSR zh}ddxknd^t`aBt<{%4&v|7wSp7l*>j2$z>1QyuG%QtU%LrF;7e3*61_+(3%ra`0Cm zvbGX>>#T8z$Y98i-~yjvB2a!%YMK^fVa!;?7iJ(njjJ+BmYz(&b(1~}N!)AFTGS_O z8v`&1g0!ra*&DnM22-uHW3Hvx40#EZ4K3TKd)BzpSgqsaUrgqGla;pSt9)mli{=l} z4L2ViTOp1{1GR@S8n4|VIF-&%zw<#olVSDDLpBJbHO%gmM6a!VZvToc{U;;NIoXrV z$^Fgdjqpn_qNy|Jc_ zVy-`lh_W?gAj&=A0|lX#NPtaN%52$f#F*$gdri7HK@>zH=t4`z{*w9nlB?S9P{Z+nfFE&IG1<#=SEeQB2|{g=7t%x6t=;dw#+IhX=dY`lp|hWr=zvebbc z23T*N64f+%z;#B7NK3t7tJX=F2ptq`rBmxoX1OV--%P2atXP)iJb@MPF;!5U#bD-9 zofvW__ectcA%DaowKca{^&nmH92!(Z>BhD%Bdvo>WDC@Lzv%5XrVmL>aG8gg6%FeW zRDrY~XxH{6Er-bdY^LYqv1S>gLs4;%5nd=4$ra;yPe$!nCt0H6b9vqzX1SV!7OuvM zL9%CSD@pnkdHUxRN)^5!&@ax`2p9}(rwu^1xLwLSg~Hx9m1-49`*Ax}s2RI(4OKaC zilMy?t(@3wPWpRZ*Cq<8X^Qwc!Xjx>3TmoeDsTuW;NwYpk7k@XDdM~tPME0=&epd%d+g2kiIP_s=Zz3*6Dlj< zJMA>?J-mUzc%9?$`Dj^oq9LL35GzAQqG^iUZA_Fge+iI+Nf}{0;;cx0rKD2j9>zt$ zaz;uGxNJD^qI-|WVaEBh%D4ET+p|Tp3`LBZhJ9#Ww=JRa`dg=ImJ1on`L_5;r-#Y= z`|j>5o#N@=q(r6>-}~PYh0Zkr^<%ilz z_Pq5Y^8I9t7FhBvCN1^@Lmw>R@x{>9-;8veK_$Z9tY_b?+9gq_1-r|9L<1At+GPMu z7F;0dvQl@2w&kTIDKaG^uKhc+FJs4KU1=dl@wJ~IBgEVqegj9`9-4;t-VMz$XP>=E zO_L%eyo*M7$kXGTy6Co|c8<>bTt+a1zeB@A+cYeXCHhv0n-L1QIZxYoFY5SQo8#4= zdDu8FtoSGewg(E)!TGdOag1Z~se1DxMTt=u81Twtzw4@w<_<%@n`Y*PIEeB8_*RTy*b~Jb zc4&-63nDxVU2Nc*jL&Ct=DbI22_FCx1;zC-8MLk1xc48f#O!rl z;3Cc!Zrfau_Bizzt8lHGvXJE}O9w|by_(*7!4wNPD3v1IT5$*vxNVoJ!+2tarseuh zpn|uvqzWVL4@^aXjpO32M8Sit|os2i*` zb5-Ao2ypXS9mRQ=gG>}k0m!U#wny(}BE)ekXE6jd=ki0E3PhYH$oP7g3e=qVGROQ6 zyBDiS(HSHP;lF<>m<8MTd6ZBLP!3-4#BWd5qRiJn+JDOb6vZAtBVP0!%Zi^2Ty&_6 z^dUk|$VvECuSdeJ(=|e&HgP!St8AUAxDIGb6U(R| z%m3~UZ|W~X)YCj>v#w>lzTgK$b-L=6Z}RoxoyNRTGWu`4r*n&OU61zti7t~kPZ_Rc z8@#f4!R~w?mkz*#U_f<+fTny+xT-}eU#>5?bMAVJ*#?AlrP3(aJUuF_&$Fke-!x!U zD9L`oGjY%q&B6Q!HU3+Z;XuY3E?Q2sL-u~u^tVkjtNP8a_Fs~RctTkdoFwo%iv}DH z+NMtk7AoEz1u=>cplW7FqCwyihniKnp}n^N6^X$OfP1; zbEYS%Y9_x6Nx+ZE9)-I^Xn{hnB_9{BIfuWlqx&N)?;y#@{LZCHf6tfohWU`JZ!k%= zw=M-+Q-m@l7vi#Fp+cE*xdK^7KC24Zx1{r!P+8wKm(RRbGyMExCkrNv6nEuSbGdrs z&;6=9sg-}K>@gW|uDhVSP0wWsbo%z5RxNC~lfs;;Cz7V+v%|^~qkS>6t0I!pfIu)F zGGPL0&~Gumhmi(1p%Gb__@?Up-r{vRVV5sG7ccmoyuW$dH&#?7fpa6-@zJ)sZq5li z6B$yXraVurSSKWo5E4ViaeS5164~Ud5oUd1ua~6^99KbR0#&xl5Q-mcn>9I+1VtGw z+&!Hw#iTvix*UZ`td+Di_z}HZ{i8Effb}0Lmu=E~*&O+y);?7o&K2#>JG%#b#nH|} zEMwC&u{!mt6?5j=WT^vdl}t%g)@~N7<+{Dk<3Z~c9`6YY_{+7x;w{q^b00~<;~7w? z-9Rd0%aDn*n*YVS*hr#=ulP*PI>1@W@!(46q z=__n$Cf;&*r7GZ7qnG7M(f?v-?LOP^wMY2LFyO8y^+etq*hK-1BR9Msc)feww-X`jhSz(ekfb#>Y+`Ab;9{lv>cN5p`sXYlv6f!KJJ zk8uM+&-=y0I}ywQ_qMvaJ_%Gv09x}Mmvh%#pHP*Dl~bXPx;mPX_pnLl3B8w^?qJp;<0lmd+O;m_Z1#++7R$K&#c$@r1&xv;OV5Kig!=YuD*@J>z-6I<#+7B zhqRi~zM6~@B19Xrnr78_8ui&It<^9G9eMmsuT?Al{r=x(sC4+%XqS!oqbs&>ZF7hA zG1q&YKc?@zcR^1a3<03L&g&X>bH@0Ceyn(4;A9a=$p=XkW#VWCCthvLC~v;v7>HjsrN*cW1-eRN^!?qj zXpo@9AX;Q49fvY@>*SJuE`OVSwGs#bum(X{4)`tBGX#TvCWrhL`a&wWy^zUNm}iOY zJE1EmLPJf-?7;UQto-rVOf62HdV-O5*57oG6=~A-@Ps|A0CSy~Qwj`1`CYv;M}Jn@ zlWjV*$4gUWHUf<7yoJuY>DwY~+d&K4cHmWKTvX^<9pN>yaI{sK-{cRZz62O67{S?9x?)E5lr#rn3s1;dbqjABdn;1cIGI55N6Zshwoj< zP99%>GnLAOMZ@|AIHP~NmH3taXF#1F1j&?AQ!6N-((#4-JHURPEy@Qu5ukcHB7%Ha9ASHRDj}>!UOvB{-rqauQ~|5e zTHPJz=RO#Y&lh0|;^{$IB)9d4-$Kh^MDPjq4D1hVa;0}8<=H!;N27Ua5T-Rfc1613 zB%Jd)LeEgKiS|jS%hIC-DkaMNP1vQgsil>37g!vtkZh+}954E0su&H7r!<$iU^Zhn zzlee$U5qKv4V64q5ZD-iB;D_)R9TA@a$6?PD!97eTjC*~QC}mqe&Qyc>WGBp2(aE> z4Sj`u2Xta|<2idYo$2GUAmz#OVj>gR?re(}wfhNPk-!F5RELl0g9tx;G>T4)NHgAx z@M4S)$42WRE3ML^;!%- z3uu5CoG2CyLv;+&0}ea`1T*9(DPRZ#*eKeWR60u@0X~66&I5M9Gym&>oJIrox!?Vi z%QzxBocyV4?E`eLSz+*V0q%GRW1{W+T#nDlhk17?#wAjeB+rlAo-?SPIe{P-{aaN; zB8Mx&B!nGs_jkVIrA@bcVCj{QL?=$j`-c3vAOI9674Ui+@E9iSyMKc6GfD7zW(!-; zt!9l}=zhDWK+Gt*sj>l)Rs4T-U}yN9x_U5$@5BDU>pJ#JPr&Wz%h93XYYyYcz3<5h z0u}^B{)ifM*bE=neDc30yf272ks<@f=gWW>$G2V4tP;u`pG^pxi%JQ%8rF(ek4=N8L`a`U z38N&hnSD1jC$e~12{Ao9+Ih-W-vqs$#|i&0JN=YCk_7c?IGH#jh0Izp$M<3*;41EA zeY1}t;CX({gTxZA>8Y~#!>@s3{J@;}n5TJT1fbB`%!|YVl zwfA@KIvmvP{KWEeU5ZIsUiqh$+RJP0Z4Oe3-cI`2+vLMtUw$|buQgRn4I>ytfrMqY zWYlVu8KO^f#`nu!tBN2%!N{&Pu$q-Ojq01roR!O7dd~Ry&Di~FB#p1IO%ag<70$1| z=Yy~r%@y}@g={|eRk+_OTp2H(^@OLFg%L{IzZXWH{Q1WQjR_1$QJ|N!fj@e-MQ$I< z%EZl3sI&7f%mMceUCATH?B99vj>o$v?TrDks$h@`6t9DMYP!wqfYB1u1QQ9QUTAA( z^>F_9G?ioaYUcbk1B8yj{P;{Oo>lvFaj*7Dzx#7t}I;!#<-8wI6Equ97^?dIR|2Q0cQWb_As4)6@@xiOQVZ z^p49&*vD`{XPr?}qeH}k7?PZ5uRCowv~J4ZcQM8Dr^Cw9eGCmdY?2EFThD4$V8aur zOV67CkiaBCZuiT->$gSW_Y0A-*p){P?)r`&`Ir>QOkut>Sry(}2LBkldl^-OETMV% z21+MQ%br>1UGWj4q;iX_?Ki@}S~zS{IG6L8liuQwvevCsk}cNJFR6#O?rj?Sl5bID zb8|7>hE|Z~ulU{NiazyHHT@E&60ZJpN9aBs-^p6bI{zy&x+H;$qEQfE1xbf~movJV z58a~N{p2H#s6I2nZ?fL@_1}yg4n9X~1RqC=EY2;$6nnBVQ|y~(AU|nvutUE^Dt5H7 z3+{Yp=nk5vE`YHj1GeqL=uc;6-vDuf5gH{P^DL$Q<)}wN?QS9Uo6>y7s8zo{;9EkM zKreST_XB^dTus?p>Q6>6c!y1TVPA zt)*p(8;*Sx?0p6@KtQw9S&^`*h_b$&hCtzxtrzQ0e0*&QC4?U*pj&Cc_2U5-#k_7&!JR(2MHe}A^N~WR$LR(g1 zd-?S^(}l0YZHYko%WeAO8tx8HZi;$YiirBb!iz|wEGw2>8&PYdjx-g~>c&l}rA zh>I$U_onI)1G>j^GMP6aQ|KXzVT@0X`v zUPP2Vlp$l|Or(O|2`bbwP)2+~C!^alr`Oz@5RXpoYv*cxVKW0$ zTB>KoH@n|Y-G6RCm;YBkcHcLWL`9c4geYDPYwg*IiKYouUoD})l?F!|H~`GS$5&ED zZ<+;qA0-hQ`e480zZroWYHSkCDjEHCV0$79N_LAFpn+US23jx(O;3GMkzBD_FBhJc z89H9Kg#A6fezmtb=zj3lNHLFF-CUuQEwx_)L8aQMFyH0f{=I%;!DTt|jB_Y@^L6;Y-^U># zeI+v}DEfiTWUU`kMl<`bLXDW_zJ2;pb(uzp3DW+&7`YQS`2F3-K0ZhPJe2|+psJ^% zv>Ebv20~p@Ufxo%vc<2M#h(XGv*rMAEvfAL3!_Co@0c>MUBF3Ji)%HbuSTj% zu)2AN z=}c!_FHCy6ZyBuXRyXMOQ4{Yba|3y=Oc0tjV@iTa!cjktiW{qB;6 zUi?H#S=IjOvJ;XiK&%s>^v1Y;u|#Lwiig6;>X$Nu2&Huvrg$dCiDYeM$wxH6f5F|$ z(bhX`_jx}~`zyC!1%3-!{;S%PDRdj7zRDc2ef4ta%EvRDi^RrB`1ZDAwA566c=lMV z)a|`_&Gx7-6Pa>l2SljD!c0fmVb^XNFNglW5ia+4Ja9~91y1#u*-0-$m1GH7B5{z@ z$@{XQV8;JGPvgA7VK)JPUgfk(#@Da)``R_R^dAavb4uD#u{e-5Z?yjN^dI z-M`5fKmIS%qj0$q2HSkv_IXq>Pg1km6> z0P-LaVTHiOTiRZx3_oCFLqqHW4jW{XZ~Oktp9>1?YJbA!^OK(%G?EZ-e>i) zrO28R6>vs@_IGKCG%CckX>)V4EPpT(;<&gI+LPz8M4QS`s@7Uwjsj?GY}BjbcGqu# zjZl1<)|;opFCQ|qd%RgSsm_`p03rT33gF?PxqD;%!P~)|v!E=JQ7*G!fY6pBgOs#1 zHumQhPgE2`olXyYn#&%hm&y~HDBauK{I~v?@pA>o$CS$Q)jpeyvcnAPkM+mBCOAtT z^3$jQzuOjUFR8PS{|QhP>Tte~_;+_FU9DxHrx#D9tlX+S1Qr*{9VcW+rmta)iN*RF zC{ZwVb${j3#K+xWq&*%>iW>>xjTHm#@9*!OoQME*QdZX11X(6)YZ5lHBp`WHQ=)** z^DRsHX*Im21-nPzhrz)gjB@4W>Cn7iWsw6vHV_`6?c2xU9hcgLj~@@>`XCGphqE?< z@83Ejt|!4%G6e-<`Qh_(T(X5_MWw5L+S=N$SH&ID%w=b6Fei?W)(tT#r6h4u0|R05 z(*_0xwTyDg?b!6Zv8IF;j*gm^mWYv~C7ZT{a?eJf`9g|$Pwror-%^%)2a&heh0OCa zfglz%Jc-3NA6k+dbGE{mm>P=p)z$4mX@dT}?IGScwTm8+ce)}dcSA}aY47*ZM-4Ps zr#MSwBait&&?S%jASE`uin;?W5n-JyB5d(oq{Tva8xF8ym& zX-$THjZVDRt#sR;DMmO5y51K)`-;vePsndko1rgr6$4KlZ>qnyTUN#b1OmmviA;~Z z(_JZ?9SFamDM9f487WW6LxXjhD|a|oJo{6yuB<1)!TEgg5uzLm2U zJ>2^fZ~963{3RE7$(*UFl5DoX||7>p}>`Nr7tb1p(F8!%o_%y6xX96a+gXV zbipO|!|+o6Moyr`(p9%xfsneJ ztyoezyO?zJKS@S818A>Tr-6Buv2J`HQq8JY*dli#%@^!@e$8hlFxr!ozeRiQQ!zKT zF4U`hFDs$kdUNm`dnoj>J#oc%rAhX0WofCdIRmHfv%V4*E2sXCpBwZ}Z*7Aq{^;~? zZVpQcKkSEueEKp?h{!Q%KXI>mxX%r+=OIa=s$StDz)umnsSe-^@b{R=ISx1{2%wcw zX){>s2$;7Nx}2Ajvn79+G_+Zy_eJg(kWnhq#%XI7w~ zd$_y1`<_RwJ>3lmuQ+5TCQ_dIthFHOd}KaHX2tb&3}TkCM&`ZuR(~E4Sbr=I$yQ-CXtQV{Gh~FE@U7ub$SPb@lWff#d6y$h+u5iSJy)uEIb?hJ?rz z+>SX09G~Ythr|Dzj%Y7m2zH+DuiOk=KV3PB?zS8qHm;m4Uw3R|uC!&U`J9iz%gPQ~ z3RPJA*9mg{*Q3nxS?EwHzRdB$4NeE%FV7mE>LJ$TCiM?4<_pd&pf;5shVHWsUP6Qz zw~9p>EEu968){zgJcRaz@|%Dik+4OZS$NB`Tw{O9Zr8$O6E>A(R?gkKp%6zw!m6%1`nJaxR;+{9^mmLHi7PMt|C6nN(a1qt-Cq}@s zk(ghmcOwPuEXE~OdzWL)W`$9tw=aceC`i`oSTaBi7^L`|Rz+Tmk~d*GjKeKcqmJyu%ZuC$K`Iy-)9VOl0e$KwZX zEu9;Lt1DWbY9LMi?xn&@wK6fAW*d*Y5kb1BTGPQ`xgYN--Q3$sCZ6R)h-0IUGOBx3e1PD%e>5sms+ZHT11GGA^Aa8Sgj@kMJ{&39#Wwo zU@K12yLCKL{vZeqDqd)f+o`k|nR0|w=E-c0f5JXyp2fVchtl_s;qVy7Bf8MN(rPz% z3&DCElJb2vGyc`qDwV)#>rE4+=Gb1vMWmPXJ%4vi>(`oE&4S;CEX5Orw!TyEbdr2- z{8Yg~46*2{XOmYYGsDw0upz^>ih1u=L^(hc#FpAe*bFZb2$jI$M+b?2T9T_-DTRTD zzs~+#@qlV0ereCiv7q7}9)943>W}b$M)>aAO$(R)po^(t7+U`~%hl_GJvyeHnIegb zO13>ZuYho)O8s~x8=+QXK`#!`#;lk9#IX?Syl%|<@^M$sl8;oKQ0e;CO-WNw?PZ|Y zAcROExjAgB!Q^klsK7S{E=sI}MGFX&&;te~lvg(@OyA66JOA-E z2JA?7#z4y86vZ~~o+Uti8WDlMavFE7uCQ^M21CR;i$hGS|I)NrcqKK zt+aZ!GDI2OFFXbxx+ffv)cH;UQ4> z-w%INkK3?c5y_F0qV_$ouGR@S&op|^GZT2+9v_*{&&8F`GBPt0=GRfUzu@@vuXW|& zADln}uvl*krN=6Lj2$qY#0@yMs-5Ld6v_hO0t?313CpJb$T-V2PD#MjA*w6MU0RL)6=5* zF$o2J!asp;=vSV*x**iqg52}(Ypk5`&1QJ?T`5K*n67o>cpIw~UMIYW64p$@li0zR zUuLF7Z<0>3hn1K1bWi=Jv^S=+B_NN zMO6*5EoP*3yu8h@O>47=q+U-7rt5#`CA)6gnkf5ysD^(Tp&d;&k{0At>WJie|vpNV0H|vUG;xT4|H^b-Ly4M=WoTcgO{m{bMv2KdjrN7 zsSG{A(6Sx%t;4l0Lskt|#m!$1g6gw(yQW*^>WbRMroDN_l2_Rimbl?FLdgEaCp}mz&oPB+Ku05@f>@%%q1?&ZpGt0gDil{yQ;kze#Df2~i+pPV#UoHfmma zK9p6)#)e^**?TZ{rc?oj?dqAGag-m)({w&O2^yMVZ@U{zEcjg1r@0#rTl$ivxX52d zgmmlh5Pk{8?iKQND4wC_zuf!mJE1gTQF9A@-;rl#-AEkGwf-|pP{{Mb zVbC60$^IHFQ9q}nV~~?YD&lg$gQD+(&7obAQ*ongn?5XsL@>f)hAfe~5d=X_{WTms zBWUC)ZACZ4za7hA^|tsh|5et2*myHdRJVDoDu$7t(%YoyPMruvdHnl(U#wmY&3?O_ zLDGsUD@OU2qn5Y(mjj*8_bC6>-C)|rC6A5PmB$z$d{dH>r)5L;cI1|U;#Nt$^KSOo zZ$~n4$(qNp^|09JzP_Xx6q~IafrKm)G^_;b82&k?(3(C6Gz4&q_wj3NwnO!KXTRr(SN`<1fc``7$|D z%e%inql<)Rx#AwO5x$wX53sjqA;r4!6Pd1i0tU8-r^i-4zO&q$KC9#A?X~6QqvxxY z0E_1*=<`-*8!RBe+uJ)?ZNa)uLsQSd;C{dJsgqebXQ|y60em?C?i>(33BK+)gmoHL z%zM|9$)Jc<$r8Hhh0K$xpv;Sc6Ky1Jq*0> zh;Wqw&+=3(@nQ9zp&29=0`a~R2j^;hg2Vq|BiH+4vcTUTdhEBI>DaWkxAHLNnJX%K z-$yV=W>%5XEnuXlcYhM`446r3TRk1G^)!y!&Kv&g1~S=L*((>FdS`vF?4N;ljv#(8 zBK!_j{N~8>l@sMP(1bj0Zp!hHH^8h0<6efI01fM{Uv){zMuuJG4=pf^6uJsP~taSlRtRN0mOAqJo5>=ak zvLBl4hdYrMmqpS23lDyler*xw$A}MRu`bPLH(tuJviAP%=A^^}EX0__Y6)tkx)ppv z(zE|fs{0h2l;}!BbQ_IA1o4Zo9J$B?Tx`RKTn;#d9}cHuw*50WwAp|EWa|r=^kS*0 za5OJSnt+egusF=o@vnwXNwH*rrD22PS~112$1dqXyNn%j3J+Gn&boCIjM#U&n!Tlc zXS?S*ggM@(pp%}dTd_9oSyA2LD)P&z>4hO92Va}eFk1(rD3^Rsp-wj(C)6BlPWsp| z9#M-K=PbpA1qgjw1wPJ=wSq1?V$tR|n+}z@^OBS15_2g&2n)l7llq&#NvdK-CC}L0 zh)g}oDSd5BSt!34X^1A1=OISXXWMUg{uzFy3*D|s*FSiuT*iOSd0wFYFkvJ5p^Vw_ zPvNrKJ=^)av9@~mAD!>>wy$0bMBJUycvy{^hS~%qV3LOWyU_jIt8udRkR(FdHg*;+ zFLfFH1&fHx-yvnI&Efd@)52AHc3a&)&xe*X?dl7*8+-C=jQeXt?i9zS6jit+-gr)# zN}w)Hms03&G0&BTZ2!wy(8&SFg=7s} zRV9z}I67Vyl_1wm#VYy64Cjv9$}t>vj1Q$Y7-r|y53RBLKp+yyVimuQ5x+TF9oL~X z>J~e2<>kgtxO2ICo@_hEBgIM=+U%K6?TZdV4Oa4!mFtR}_=k-ZY=Hs}R=SCEV51hp zeU(drV=m}}MrNj>X4n7o&yc7?Qk7i4=U`8K<(4BUMQ#~i3xhZ3YOW*CV^2`*y#0qlPgp=DS_>W%KC#4 zn8zS8sn`TWS`k~WFkB$=&V=T7e2%Tn8!Ysl&H(1ju}1%ZKP0|xMn3CKwS{GzFoJ7A)^$WgfYG^gXVChS7);ZFywpD)HeUhb0sp@!6CV@=1T zLxZK(8Cx$hXeVP~HsJ#O0jMwYBe_PlVoD}HNrGR9pYTlZA!r0vwGR;TWTM{dZnDo_ z@Es9e(xNzQyrUIw7+Ygoz#2R%P+w15oX9lodmm|f$ zmh4f?XpQHw2i#rsZc_R2apn1Qaac)7 z33vMMZPDjzdiu{)RKw}%-k|R^t6Jrcse!jqt;YeJgcytNaDPyc=;QQ?5|bGUN_%bX zC`3YBtWq%m_@WOzVcwdWNULkWoc#zkW_dsH{9tDEuuj6m=CjswYg+w~KJjqb05j`0 z{%%ltwA>CQ4D&tm-T_*L=XV4A=&$boisDH$IKCp07KhIgFc&}F2R`QlDUSJ5RzGQ` zB`+z~(R{5iAx4qf>E$IQC`ipEs#{zb9$srSibJEk z9vH>@( zrO#)G8cR}T%U%~RoKmjjTMmSNTTC?xXbaD*0j@K3Qhz>NdGbGAK6LczJ*1+N zSFm|U_KNc0Gvo-m6j@!yy z;IIFOgeFu(!1Zh;rwPF{e!gfAre)+wi;Pe&#f*rLKD+J?xljpgSFzQ!ODsOKvZImG z`LU%99gQqRCuCEZ*XiSM9DX0_>&CBvjpP3TZ^_J)syKN%>;^rJ9 zyN10)7CJCqsNprL2~Am^xtt+;^JglNSdh%0A}5;gfvLR&&G*H+E~kVTb}BFB8cb&4 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

ggMF^O&`i`d&Kkk zEUnree&Cu0t@L&ZyHqv5vEeTHgr|~of7sF0^z=l(+3r;RVc26+W!Ig;>YU#x^;!bu zcXrz0%uHtS%1p#U!Q^4hX;${A+K_H;70lJ<9H@y z6z)XQ=OAJuxDPr9eKBW1A(ELk9OWDm-Yy)g-G(;oX#EaxNpj{~YVLxe4jRXgOZxD% zTAZ4@5X(+U;S@()0Kx!>7V(qX+?XY_s1yNzI%q@7*tMy?yTdrEoU4 z3#9hL*S!IC>cVGiLoe^%@vHu(B?Z!R%abdEZuGS`ZVm89l}rpB5NS_-TYklmdiVjM|^BmEj61dijTQrZ9EfA~L8dKTLZ z-)}B^a8UfO|Lea$7z|jJrS$CGKcbo9hq^7!Scd88iN(d)qod-%K>_^f&Q?v+mX{a) zyZ`R*KJmoGY&P|qzxj_ONj&=x5F*<)zxc%${{G+pulxN$tJQgDelyH=yZh+T_W%4p z|9>6F#TePP{nf9&^lQKNwcq=_umAV|{XY%{eU9UfhwB()fDh<8Kie(hcimpz_ajOv z6$BOlXc#5{pIS%Km}vN^DoDeo7D{;BB(r{dp(F#H+u z0ipmv2p|Qeb~P7EV}uEyEW@-09ozlD3Ld4@eP1Reh6u47iu>md`2Oz8v&PexEiR zLX_&1tC(e!Zg1}L`or(MrjCZ$#rdVDuI%5r&x?XL9I79mbZd?L%7Ql(bS%4DtH-iw z%(Ab1`%h#+dg_Vm!SyF@-oM$Z)G&m-TGP^v{PKc78aaOWm{Ni;h6q9i7a#9nmYZBz zEZ%?o?R&32v-X6*3NCTBPY-*_;GI1&fbVz5q?AVUnPIyl$P!{OW;x9Al+Zz|tPQ%Z zGdq9z$!+^azusWDANH%Klrk8fpI&-!w8^uq>$(!pCxfwjhmRSAKf*;4LI?q&08{E% z7G*e2;G?my!!Rq?ula%je>`s}gLdU47)v;|qx1%ckGA%8<^S}Bz|X(1zzW>yM(OaR zYeOb^ahfsE{{2I}+aazyb8&6qiA$Yw?am*6yI${JoAm)kwvaayvKEuvQOmk{;(9s7 zF;q+Gcmnav($!wIU|ZVUrPXGoa=3YPY0`7?!qmOCaO=kXa~a|4wCClm0sSCNhwEaD zreoscLPN8~>2$Ev7-WKh(@xWNn8j>vr(EoGdgiF-viw45c^C|((vC$)t?!y6Wg#o3 z5&^|=p1QWcTA7l@a>H`<_S?KXT`C?49w91tp=C#MVA!wz@!gHT^P=x*$#=sd>nqo2 z`DCE=t&`2$SPJIlj0c35GJD&-i%S=Kf$aIHfkFS)osNfCoD?zC!Qq{k^Q%wE-oWnt z?@O*}4F^E<>a`Oi5Luo%S2!)%6VphjGip8QaVhn54W@Ot;g6;m(bI<@lMpjPNNbkW zVO#CD>V?OGH{jT&6o^b;e6dx0+^e5hu0wrMlM%Aej$4g~D1@~E*E~Gw_VUxKMaQPD zJDHnkYPw!OUdT-euEq3f_bo1($WvR-EnIe{Rzg5287g7Wpz>g3F@w>7?N^_F;xmFM z#yn!ZZ!)5cFh&fg_FE9K;c$SLeZiP;da@r`y*wfMDwQI~3;M9P8qv!wi%YH%wXKc% zXOBm<*W^WCB)=#qB`~T!?)q3>n!WU*(r;1XGMwO8hBk70?MjN*Oz(6ZPs~0U+rRlI zgI*^Y3Cv`|#ai#U+O=$lXAz|&n3`T#T0Yr%Flbddo`;Ymf{ zY55cB0w@I#ftjbm=~bU&lJ_`;59+X>E+r7mJ{=i0jMImMk6(=BI4+rtIgVqRw(Gj@ zmT~~cF+9(nkqZc+Ggk^q3C0*9c(x&VzbXL$;JPj$1R-?x`;=0IkY!n)``mMX@9+I* z|KeZ#-aq_@|MZ8J7N%)kytsDx@_M)1d;00iiA1#DAD;dB*+~e6g0^jsM#`Cf0b?8t z`se1Ru3T9U2K~SFTmLsoDF84S45U)=U@$O_+8JYv59Jm~E*G1cO1dsNJgnC1-S?CW zgwRwfJUg3_Wf1^s7*?s&I6kiZIGOmEX!!Gm(lOFYp)&^d!#sZ}00=e@`=h27NO_1w z5QqC!wRt>%82&VKBYY>`61+cl@jrMt#JRC~XEr(Mmwf<$VzYA6Eb|Pf8XC`XAHMa4 z2-&8YUs_-=bF{Zl03F!+g{PmAC{ujA8rs5k9AE8u?fer1X+$xD(|Kf8;4e9>@ve!9516NpFsiRk3oa%pFuxFkN2 zQ+k8?@rmsBu08)$adQ`89EeBj$0cnvaxJ^%l9RoI%U7Rx;rfe>3%!l|cbcWD(&_Eq zx|f`pT)cL|WQ9#1&5ys~gmJf(^X z5iC5qlbl%(#M1hxS1*>U2S?t3kB=tbFvDL+b^hshjuJjjota>Kp>C&MIj#;GYH}hy zclm9Wcr$mATYI&ZR(x!QFeJf zJvTo*J#18a7bZRDRx&pm{PwK}0SWEatyGX(P7C*on#iFal?T}ljr!OLiTnD-$Z?g$ zd~`Y)S(%P(clN4v<3fT}ZHHwTMN=|fVpa|-@?<>dF%U=ONPo~^CC2iGLNReB%5T42 zys>@q{RZ*w^6 zrDj$$3sOj`$|hu)WgHQL~6<21l$X7%;Vy zS}DK$l%=btIug95V_8xlDx_1sP!u5sjJk=bRR^#U{e%H-gP92iL9x2~jx3N;gxPlG z@bZ-_LVV%X@4psGPp4+qc*!UE!^KB8EM4^{XM#aX;5v#jdi>yi&D@8oa*Dwe>y49>BFpmt0GE(_E_w6rMj$aY?AD3vFf2zYg%An+DTj?n3ar;>t(2W>CP2X!2^fv8UK3`IztJx`Yr?tu}t+H~!BL9z2#L z@rU$@9LK7vMk)1pWQ?(@s-|gqJo0<13xtqqnwDjIy)whFx~{9LCP@-PkPu?q4#%;Q zBnSfUx~}WG_{@9~Ld&vJsl?T*=N-p^5CsDM7hZVgU;K;T_4z#RyBTVhWpNz$`s=s< z!9V!NmSu4qn@%VH#^3nmmtK0|%U^!+;ls!O>RAZg)n4C_Txw|! z{3zdkOLImYQ;=C!VA{pegFilQ7YFF4lcqojD53s@N9mfb?f#4yfFXqH{npOuVYSoP zJlXrktyc`&oJ?dL;`EdugYgG8AR%NKMkJFCCL;T{?*jmW@#w_LVqyPaL@-pSu31m=cbyaie(tHm)36m@poeR zOnPS0wcXuY_bz_%1q4y^q|~i9B(Kjv9Fx+fJiiDM~RqfoLfE3-H+NTN0x*@nq-oNL>|PB)xN#3phZ4$Ac((@DkXv|k}gAAhjNR0>mJ>8%#p@hcrnNhc?kHF&_H%v{<%+ACnb1ZPa_4T)t zA@SU7!1e^Y3VD3%fzj_}Q-S#T%TwpiHH)PO-+5K(4IswxAit6pw`=-ZTG9+_r*0!g zibxIswA!~>79ofn%L=99p=9v*!Cm6O3k&JVxrqZOvGwL{YHJiAhQY;-eK9Zfb$4VC zjNuP8n*{^@xj1)F=~V|d&!BowJ(tg>lj2FY(X4}9G+1o5T|y{A7s7$IhC0-83hQofCLx9k|a@`ZO5EJR3;9NAM z>uQ6*STJG_dx{X8NF@c{w1qjpUW3Bc_N|uX1Y;RUNqMCC{b6q`Mjjfvhh0Wk^n4mUFC5^?2Cth~ZR@(ICS)a+Yx|3$q-HRYsl!`oJZyS05=u z#vgICk>CyRa)7}|^7#2+nqe@dfRVkFQnPh9@9W;K3Q{0$n|h~wKmn!1B@{r2=JN?# z?UhDQ@`hNB$Cw#)>!#WdXBI5m;Em?m;?!YX9SsMBf|HY?-LK>$Qg-fw%ll3a9(RWt zgP=E>38yAomEwFZSSnQqLj^-fC=L330iU;TP{gpE$`Q+p@9gs}o#kb3IN^(=I8o|U zj)tu&pa3HH=QBT3N;TbBU79~QEVAslmN3THqv5CbXdu~@Cw^4!_fZMl#4B@u?WK#W zGl`u-!=boeJ?@r|8IA`Z(Srb{pA2Wu1sv0b2!8CPAdtgszhVyS#z+3unF&HT9QvhS z`pRgeeD}Mr*J@3c{Xwek+3v!!?B(V8FMa97&wcLM=bpPZKR+D|1}c@hX_^efAOsD= zOsA7y`qF1V_qk_3^O>g>7w5v^K)GBs3^N{&{`J59ix)4Ri$p?a@0HJI%jK$N*%)I@ z)0dYQ{`3F**9U{q>1j2Yj3I=+@r{=`j-~Xh?ZUZw^}_Y*S2s3xzW@EVT-T+Pw%gs; zU%&O_lb2>^C(Gs9_rCWA$8k?Tef83%wav}l?|kPqQ51eg`iRFE=7(6zE{P*Su>6k8N zu|Fnt%L>Ee5AR<<2(?cJN?Q--ymx>9sQkFi3GAnkf8o+#+M{#~*CszZPU8&5eRa5B zIXY_lu`@)_v20&Blv|oRdhpmb%1SZpADyzmZk#)R-bu_xa8h9U#T7(Q%V_@ z1%Fym$ug{I8T*I3R(qIFWU>phVlu>WeEYQ0D3tusNOES1654OJSe~~nYuM@}XC~vB zbidL#ZPx>`*Rajw+G#8pNrw~NVgIb11T#!}cDlTK!16*gm+}Pt{buVuqTwCJk!95W zKpS+Y&!2-(A}%r10Y=y*ZXy_+N#$?uJ~VAB8H&aHp`Fqpq4b9b8-xHt;yAWxvOJfZ zo=8sRz2N|2*rW$ot;Vh0jz8#;LxHJ@Y^hv}Pv#6os~j92+_|R>hRaXCAbMDc;PHda zda*QfZmB{8UtMB{%}(>QcG@Gk)#YcNS?KEU&dYC}?(DKW4>5uiT$z@;s+0D!jiGb% zSXDLMCySYgm)K@UaR~vg>t^PrBB|uj!>!RkIUlnUN%>({KG{0*hof>J1`)Qjq3b$^ z1D=@i9<|K(-^gd{#mQ7KA7Q`spe8Wr?1wAqjLR$awjLA1im8`7UDYtBWFeZ28;Qj9 z!jxv?crd8<8n1r)o0F0sO5$wN2Wa$0xpgr|hbGh2-A=EY2qwLeuu70u07^@NnY`B* zsFzA^=j02^vnKYR^5N*@8kd?620YbzuivQZ7Rd*OPh>qekBr^sK)}#+-L%ikdc!C6 z@~C+#`y=tml}`DfTH3!jIb)?3gRu<890imT!U)pI?k4M%sOtoLp?bYa9jkS^44h zotiP|&`>(hLq#3L7}%F09@!&P`>@?E6}EeWZhUf?NPbKmK{s`8GL@bPGguHk&0fn9 z0|{&J=7Tq`o`1^4LT}JU5Ez=`k7ilX3m^uRLI@yr36`eW;%=dSQt8C<^Q<6f{SKwB z=nZ2)rs5vgu@7o}Pau|_U01q|(&M)=W?0dq4ZG)-X1!i-yIMBcKs+Em+&RuAqq&%; zdUCj3Y-T5CV%h1_)6+mSAqQgBqph%)^#_ATg%Tlz!B{uUwbg~wYLoLPI+Y`Y5TMkx zEzEM^^t2}sVOVa|s&;EdN-6qtPnslz1pHo?5=BwRqJ}ZXM8ls2(EvXsK#aSi64x%Ju74Js$bZH}5PgO#icg_D>^`z;HN9rQ%=y z^5>V9X1@8&?{&L9j4_1h%U^!+rI%iK<&_)%`d|OSbI&~~%i_ky&gp55=Q#kt8PV|c z(^ob&c3yw|=2>3`%QBARPEY4AUR(-X*GJ0imGc;*{ksnx%Z3n2 zK2IW>Ik@|9I2bx}Q=UX%I2;TLmBrMQ?Dv-H<&HjbUH6H_^PgXPT4H#-%-z_yeT+AK z@$l*Hetvmj=dIhZd?uRD-TRZ5E#0{Kl`rI17X*)tFrGNKbad}Qb-!3IoQ%4CUKT0& zG4g3b3C0*>X6N*<+^DY1EhVS2;`(xSd7-qqQ`mSMN+pxid0#kqx_bZt(1xS!8#m9r zaDC>=`JK0JpEN6T>B%>@?`@qNq(ZUtGt0;I)6;5s?!vilqiGsud@667rlp&N5b&oT z#*|Q&=R4IpyKyf*Ib+*#$r~IrP6qwara4 zs>8Nrvd8!DL^8?wtCx(?uu>@hH^HhF%* z8;~$1^wFtNA6gQJ2nD5j8==UHi;=zhX-9EqFD!E$zkB<>?YP(Hy_1VGcN=)??N<>b zk}txE9?2W>N0OGQSL&ycmUb>Hyt%J>MMNkB03Zk~ht9^?ovO(|2q2`C%ADZy@?EXb z?%2;SCcgJ*hhn^NVRbE=YV-!ZO2g>%2Bl_8i1-AUjR$nK>)2d`9k$$rBZYL)*XUad zd0}8Uca&k$WlPX42P*J&3e<;-9P?+zjS_D zwWaSAnf1lR9-)s8Do`Jtbh`lz@>2`VO0n?h1}n(Pnf2<{+nwTLJ+jD2K1wNk$I^xA zoEBZHnOeFi0cK%&?ZK@Zvd7y#-S4!@!sKEinVQIFk>K@)Q^RiEAI~_p-6%Xp2>YX1 zO5Ra#K}spcF2;h#FSCqAVRC8(LD(JkBwrYao*{JRb2AQRSxNmd2nhQE&=bBW$wP-)jyjW@+kAX$Hl9dKUZ%tywrh@KVZyz)Yo-)1 zEbgkF<`7w?R@uK7%`GfF^YaKHM(|Lr)7if@vT!ym^s9%3jW^^#R0>A>ttuhz<#UUT z!cGsz=aW;FjeFsIe*N4U(z_@1es8F|?*7hejpgV5%C)cl7bg$CQ{K7j5HfXs;pF60 zQx!oJT}owH!U*#IWVhXL3>9LG88(t#W>~?{2E%q$8+H)FEGJS*z@KmDFha;Mj9Rmu z&!)?jnn#vD%C2>cF~<1BupI&cU@)RTW?4@?6920&U3mV|j7tbcD4z;>S+_?F>zx(yUU{J3&8HTYeD;V^D_Os78j(hLk#>+3? z_&a~6vA8&U?b@Zc-@fPZNUr;*9H!ob>r&gclgT(jXgC~=MheGqV{3*n#`y3XT#|(4 zKvHh(_gR7Y$Rl$MXV}nOhkUvp;b(BFeZR#c1%PE3mym->u_j70 z$%$+vwS9W1nwskp24hMo!gz9Rv2|MQ)|)HOJ~`_4%DV@EQj8J9aZ~H7g^exCGS{Dd z(y^Vw_8u1aQmLRc+rm(Y`ofc$$#5$1OnxmQ`fchW3ZGfHSaAl5s)n=a-M8=h!lAY2 zuRnbGwL!Ce`AeVm$0D34nyOAIiKLRv;}QTxZ7@7DYy8mbNCl2p9pm24qimy*&SVS` zOTwgi5`|#-gMmU{Xymq;?y*KLgdX47R8@JY9cvc$@iyPZ!+)9RG?Lnv9t}BMR zl%4i_eU88n3w4NKIGr+-k>fhVb$|32C?O2X)(d4$6g@t*UDW#N9Vmk<9hGRLAk5A@2e*dV`s~;CE!_6Nzj)j>Z!w|?#Czcy^2l(u%2!GKuSkQM)+llWUt z;Q!}a^>2J*CwWnhhU7uRq=aY|d2Z3Wo|PU~^_xekY7vn|XZ0V9(SEtJlE9Z|BS$!a zDc!sMz@gx|1z&PH_qfCC+`h*$48&Mh`r5F|asuWAUh*Vz^Bn}PB$b|CKWvyBaw&0D z8!n_oN?})}5CR0DY1?a4Q>Av554f$qjlJCRQlAzB@f zP%z+9=X}_6c-VErC!fvZ8{35@jW3*kF&+qEPYfXjQDS-`F^1vqzul@a%U4&`q4!a( z7t6?i6`*5K0HFXKLE^q^`J%b2=jS7A^AGNu{s8@2&Rw3KF&TMxd$(a&c`tKZ+7IVf z0dQNT9YRPrH}4oNeg95F5^_sVS}s7uHQE&{@Tc3ysrmWhNo`^A+@Rk(J=$YA-m%T2 z!_DyYYGUe~O-Up@s}5VkR<&E+k^Di)7iknXC)S>EZR5=O1G|=NYjQN3jfOP}b~oR2 zZS%tCe-!{gTvumfbrMi(g}AMR!tsZ_k*u_H7k@sI$l8{{B1T1i!5_wh?w$KL0-nI) z3%{ZRh7nlgU;La${I_p@uhJjp(^_8+c|r+d=`M7UPkhI(46(@3EY=@ROk0e2^5}Jc zG&8aCl4utRMyx6DC{8N7$pIBjQcBPxmGRvlp*k8`O^k zUMQ=9-l&Bj;RIfeWR4HEb!RuXbj@}FtJSe54uedB@%9_1hGDEM&T2L=9arr)ImsJ{ zWjV<^>eL2G+0+yOD8up;fIkbz$B#2HVvGlaVImfZM901oPvdsVL7cV@2d4>>*5jw7P{?~8bueS{bf3#~jr4+G94Dzn! zd}56%1aesTL<$Jkb;IG{Z~Vspw$te{40GoD==I9~pmgm%{T8(O-(E<&E@l%H{Q4v2>9marcBd(<&_)%%m4E4Ow)Yu;PKH>VQy}w)9GoN z{_pt@QF+$)k#=?mL z1oWZlk4v1y5Ss$@QFJwg41<4~oTM>6aCr?Og;3GejpA;^8(5oK=nVU{PIF`^rfJTd zUsL+SL9?~`%u|h%QtPyW5dsJS0H)5b){cvqVOOp{**Yy(_K#z^wB(iBrxgl-W}8E0 zbl5Jx82yY-^jO5E0J^TrLG-z&K6AgY_09XQ$0u`=&wH}7*K4+7Q(1=Re9;hb9EcGF zNLQ5P%*4Z&UsHO0%rNw$3XFsh7BiI6VyDtk`zsT3wbKnJ$j@FqKYf1ncw_5yXFrlj z2I7%+xmG(WVuo3N@tHxpdr~=_&P~?3O^Fu_p6Xtm zmY<#Td~auT`&gv_@C-bgIVlAQA(ooo+3x>Wzr3OyIIq3_kiqzc1t~O<+ZxFA&8;&d z2}%e;48Xv39Y-5l`bg_H9m>cgdTo8$DbPW;>sl%_?Oc!)>MEfaLTFnyaY-r>Go)^5 z4sWJ#lIFDhfty z(*O_>LIsREtXEX`r>2mpYR*SGuTM!m4XaUubrQFy$vdM>&+ zcl-W^ZrY+p38rUws{3fa;a@n~xQ7r(S|pX1{l3GUjefs3s2!jG++X#1J(TsF zU*-Uyr&~84zwvbz10j&=7w?7B)0`*|nw3uZfKUo3K^TLd+C1r}Wxz4+^#&tFNhRa0 zc9#|Lm}VGbj86*)!gKSWqfZk4+DjLnzcfQAMFLU{M?zGc}zWmo=R8lr)^RP=J5 zus~coYH614A`JfmY;FO=;eJgEro5i8*sCZQqYsxVoC(0*xoRI8Rq>Z-C_@P8yPxgf zZ}=qu03!?lXbro~t!_S+TFTGV+YKh*u_zez`g51oj~{IfyFG?uA%L#qPM%xVh9j2e z5|jDD#@49YLkMxA=s2#a>5|_|38jP}1Pz92!0{u_ri6vabZu4DFDYD;pW|#Qk=j!aI3}Qy6cK6`%Y-&Ot zkw<_0ikwT#UN~pl*6Ge6E3om2tmyUBjtU&lU-{B!@BHDnHBHMzlC@rgMGV7pRkb6w z$lCN`OCRcnhFOjk1;?__NUt9|{t!lo_cwFvOBc?aGh2<)pfk64VKxxDargVwc1)M} zB4JO^FM2(KEGhlr?%Q`9+h$mnxUTEC;Z)KW4ko832i@+d-}gtN+Nf(2VI}WKG7MiDJL6%dq)4^0+8;rKzxMQ1UBr}(uS<0_W$idLT-3O)Z!%YU~{z~Tm z@*n3o1}vwg^{jZes38cxu`zgXqHzp*|KbWFWLcKvmGkTCd!+{I8TnLn+NVdRCLgqz z(}(xMewirr-MjRx{{upZ&-fh%SPyqfg4Iro{16BEK=yo^0k$&IB%U__pmM~2VPZlH zc#>JqxBk`b^`P1#>xz4FKUeX(-%I&c>>(9 zt_|95?wrxB4TpUPSPQY32zg=9m81E3=|J)X&SnD$0H7}5WX9H5LDZOF>EZYF$;)eV zS2ROM5K=%fgIoPxRvo4$r@D+>cLn zujLo6rINAMy?@idGog5LWLoItL0xl`vlrmIaVM0xn33X>%fvAWMYiLl!yX@xTCP`) z=0UfCi79I3sl?*TxA#tak0+KcwMu&cqV(buPWO0J*lX51lE*jfR2s({;b(u*(se*7 zL@2X#jfXC#R#&kDk=Ur)Xcl)6KI^K10OFrut^a2MhGDwBK`xUH_OCW)M5yJzl?&tICRlp+WVmF{nU{qELL zong?&PMv_RP4u2Ac$rT;kx-y^%ukl138A8>fAmM+DHcz8o;#xgc%IweKf)MYxUlvM zzwpxf`cf{J2?Tr$!?ao*(=;K32w_E0{_qdKxw5jburTwRzxlsc6m4T;=gyr6-}=_~ z4-Sqf#b?aI*?Q*Pz6?kR35SE%uU|Dy%jffb?Q1_LNrET}nx==t!HXBqz4_+d_jP+w zQRM&D-}<$)Goxu*t=7DM|M5TiNB`6DaY>Ry!!XCga*Q#+2h=Qio|~RdV~jR7jveO* zT4wt09^}k_0b`^n_SHYh0hmGE@+g?`C~cj%^h4DO5Kutjr;$wh7lvhUUDvg2 z00Cy%zc|KY2qFk!u~{ipPp(|P7Kz0*+XR{X+uwgx9gbvKrT{pWb*4lxH5~%5d-INK zJ1oaLj_r?zjgj)+WwI?Ro{SS8fBSUnVtC3gcoaizddPQoZ`+D)l@;@}HLjj9C`G*9!E3%La-eqJVA`cc+rM zrOEk|a_PI9zc+JkC9^O~C^1!y;W$q)aJsdNS!VSM&z`(;J0N=My{2WD!Bj%zg?n$l zmP({9T)YB#u|8_D0&80~{D`b9a`I^VSN`g+6?XP^HedhZQ(rl(R-{-il%>4PLd?0A z)o--gElGS&vA^?p`2YJ)at;Bu zORvw#FRl9j{vX$G9cg|Ek@q(tLFibfKN8L^&Q%VN>Vx*x8Q+TwJ|~cWtK<~!Kad0t zzz-3xLIQwSWFMSbUpXg;_0xXaVm;x_CYPLwXYvbNBI`gjos2XKcOLGaDD?pw3mc|u zxdbWZKtP$0uRTy%j9uc&ENk1gYnh_#ne!<+VDssi%=PL$%d*&oiR7dGVz;~>&o8;e zg%BEsZdEp$qy6WW(tr5qNb#9hE=}nD2EYB9lbn-1fwW$DR2>8tuEhsELsOxt6?X0{ zu3V^?WNl&6-7f0HN{ZqMdeAMk<5)VvoCOLCn@OZUhTkW?j3TZNv_p&3(9~m@jjx1s^)Vh+JqJAGSTHA$& z9QA=ntY>PWX^&78@O$H7Z+mE#R7ViNo`^9OkRk)CL_>*SSOr+RAc%;Pr<9go*ruZJO`gs>G!Pq?fN&_a2<= zd`lm+F=o$FE&rm)yEu-m)tb|jdB5K~7>xv;A9qiTF~(1OXF-4Pr`&yEIM6J6eX{{`#HA#|@Uj#C1MywFCjzCZnb)1z5+T z@Dnbnh7I!vRhN&|W`%~s(I5Q5H}BqkB+Js-4xduM^W4nL#6SFp|LyGTRKGvi+}x>D zYL4S9FE6aEEfPWjpe)P1{`&29`!}C^?y0%CsrmWot5+{vyLRzQU;6Cd{k#9i{r#gK zQ=b+ach@vo_)5aL%!yOqXCKB;@uu!NeiY5pggz&5viDg-iV+oDK z`tj8Kf>UZGr*fhw3xWU$ZQk0l`if~g&Q2}M1{@x9Gd!7_)<>g8p=9X>f@hwUKX9%5 z(a+%$m&MFMxzHW3?A&Z5n@P{lP?vZE{?hK=>BjDrU;k?V?*7O% z9hr$|(mOZr`u&0Kpxa)6!1--TOowBPAkomGQt=$I6gJ8aP^|D3~zn?_W|@^M&LMV*(Bs)KD*>~ z2vAMJU}!mn#pKe2mAJDSVJa+%`B)~G*XS@wL6e{6b8H)xb@x@YZZ z@FN_yD4+<^8~e($^WMh5ro4_@D3FH zVRg8ik5fupeFad!GOS};mJ8S7kec|QXU0MS1`hj*0jOZx?UluaX1NI7{Qd0Yve)Bp zl#93i9$Y5Axyox4*NwDi^2ckEWjb^7j2b#%K-0ON*C3xB2$B{jS^8 z^zG8YR3i6CFI}8VltwTc4@YCL-q+f$tS8wVS21*nsn zxY%?I+HU9r)f>xp3!|0g#X{RY-MQ;J?#$X#6yjm0db0VZsg1IWS4BYz0^?|;1=CaY zgGaT)2kGS}`>hfr2KMG0N+E)#Hewhoc!L--6hI09%X0O06R3Sq9rEb~e`pH2CQ%2B zHvnvV`2T0`KZ7hw)AK;=GsmBMuJvWTH`QG>t12tKxp}=e$D8l_^dqZ#dJKRW z%nYZ2$tO-^WM!SYb@SX~-uL;Q_j!ixa5A5oS&ORh!N$8ZQH*6Ou4QWR9P;emctlfq zg@ch~VbtD_X>ej0mgCLw6OXBD*MG%ybWL}~xdx5LT2pvLrWHD8=jd>qY` za@QNaz5Df@H)3jfB;i*z7zqz^dKmAYt^7ifZ@pvN3 z(*N*3{NM2ho-d3s&-31S=l0E;cT1&wCX;;TnQLGA(ii9EN}v7gOM82VAC7`U_#N{( z#@Nd*KO2okHa2$t+yC~TsH#jUa9wwCarW1L{g)RODl01s&1U;##g*f@ot=Y!_Rs!> z@B0WrgpeQzvMfoGc%qLuJta?Z3h?L183ch(Cc_ZISWJ87nX>>u#;7ETK|mH3^7(vX zXQy^_)FFfr!X^{zgi|;X-4j9p033%P{CO~gWDM~*Jr^bcW#q|yD?Jxwgndj#4^9Rs znj3@C`J~>pp7d%bZ|(cv9tBUvk}L~6pUh@L*@W-9?N$qMcyDK?a$)tA|K(q+lCpOFDl}}3myidGS`_k}t@?Ix z&Sbu68pBq5(Czx32O)Ygf*J+S?LXj{?uBLUz|zi2V%`9 z0Rj*q^j)3O$rKC#mlw|N9qvQUzx;(?y#3&|bx?iu=Ig%etI>QSzYN%p=h&1448Yvt zT(Xph078UX2S?FNYT6rAH@02dW|UUWug$N-tVw_G_HjzZW++r#T~?!!L9;b%c3jKG z7|Y?%@>ADhxzyqPN43pe*EAD_+2qV}?{LHSJOOi=2*+c15+{ZcB9x`WoGRhQ*gvU? zAY+Wu((*ziliq#*uH!hE<6c^pdt8dT7oiY1w6d{P6bs=ZdB7(P+bKO@+Bj*FUj-?`_~T8-woUeER(^(D=@$ugnw3 zE#k0aTMZL`^KPxt>BsUFIT_7VAK%)%MIEy=f4;A1-Q&%us4B@>4)XfA8_$#Y(m7Il znB;52NQwb4-n$!)W$wN92ZE%eXI3CDB`3!Rx@j;$*5cWP^MWK>wl#Y6PJU?>^Mb|6 z=422nEc&)#Pluu!VV(tzeowdL*-P{BC_nAm5GzCvbLjBV!^5M;g}HM<;Q5|aIrB^p zl24yQ->S9hkKaqrt_37ew0J0zpqwnVH}-edgK%2Nr^IPTOQNZ6RJ(myk!O~#IQm4S zZZuoyIiBpf$48r8`Y=>UkUOie?tqu0U_GHyDj-ht8y+x%$qd*73fmsFVgD zXU`f@6b`Gk7oWW$OOmb|A9$*r;uNR&u_iP{9#2j8x4w240CvJPWRu!|`RmV%0;UXL z1P>d7fB7eOHugIlhkjJ2ZU_MhK=Z+*d?~8Ng|f-%7Hu)S^e_6&&NkDh+_1SdoT zrI0a}OvWi?hGE{ib?^ANA&TPDPhVMETXtO!W90imE|>X-|L`C1JolTw`Fl5S-l^3Z zM@O|wm(I=3mQ+=S@T3Zcgpm39GRJX_r8DJQ8zdt!y zW&4oy`>^YxlwphpgK0V)3x}1HH20HLigY?gDKkym_XAPn|E7;lKmaJSCthL(G6Det zn8&v6e%z)Hd@nGDc5WqBe>mU-L;?m8Kp3&_$q{_gQNzFP?hFt>O4+4Pf1W9i>mc5OVTUz@DTn0Lnf}H+(o*@ZrA#f4;N9 zNhryOIPo<+^Yk?}8h-rN`=d@*Rn^k!a(b?8491Paqbt{6paT;(CJ|1S;+$?9w&!Au zIfPR)g~y1Q=I@;?G2aEZ##>>aO zMq}?_P-{MT?d=OMJ@?$-{-VeWd`JjMA|q6dgn!{b|Brru^8fA~H+;td0NTDYwWo}d z%kyj1QKvT^c!4i+0%i2%=n>x!f*_mD6bi*-Y+TGPz5mYJKBoOzBk%)=fH6F#BpJ)k z+tU%mUgg{}qlgB+WmuF1p=f0H{d?wg%8O#UR7{nNgU;aa;Z~}^d4{oY{i#?!H{Ltg zy?vkfzVG>xs+7(w&8#j@`u+F5{B?6Q#vCW9>Zo&!c_BHo*g1G?dUUJhergpk1_Htu z00^RyNfuIKKqz5wWca2JX4cL~A!YZyTb@UFo_~2+_EY7DBPr6~qLge_`^%*yhp``! z?Ns&`HWUeKVNKxGxf$;6L32Eu7F2oI zI#jx~aWFDnm?PDql1NHKAx#y2q+6Y4+w%-5>PUt)Ej=cx>;B{pD3;1$-Un3rfW?S%h%KK zh+`XDH@~{DdM%oo127bgtIgp|abAG~PUT83UU_cm!t;iy^I9TfcRJl>U3Wx5 zG*m5BT2j}pkA{86orE)4%b423?acYlcBd0xAE=RJx4M;@)W^QJxw|=c^;2~Ij1o=B z)|8Bo?>}zFu$(W>^Qt!5f7sl+pDLdn+j@%U7H5~K6wxQWaDG8n!VD0`fR&odSk~>w zx5Q9nwzQ-HeSb)zS%io`F{W}bU0hnRfHvyxYVK5pg3bx%WH7Gnh~wQ!&>s3yySk%l z(Of!~m&A*eNLWFPk&q}}o=-d&m5nLq**aq^k}3thZH?Pu8A^!~uv)RW=1sfZPAAV_ z#4j*KK^1r0DFUBE|W4%>$K`R#VNo~D0M>M@WgO`>rd|i0AIX1 z&nS~bjxmNHIBX35<)7SswBPw*GA4fDWs5mD?Yh-FqcfjM!zWG(e@Qz5A@po|_W% z$bIE2->g>a&pdPW`t^$tf}1z*1wr8ZfoU2Lf>J5}kN@%i<&8IP{?Q+O{rTswr&95H zz4h&HzZH*1PnJ4VRqpkM@4kEc<(Hp(`svHDSY$GpQc8W_Cxo25)Sow*`@wFf)Wa!G z@jZj>bYtV_B(V16qIMkb?Ah5fXDXYUN7ZT4ry?1} z7&>Z9^c~_D9xr~!9m*X&H z6aoksWdJfl0c7;#3j>r=MhRm8Fa{W)jGn}n5|0GF>$|@1d4cN%zDFr#6adB$MhIbq z(T5*4`^d6Cp!5kR@B6;%`?kIE)KyVY-uv=5jL}HeLQnmz&p-9cpXVhJ0yysV-uO3v zbn`1;PbN}x*^wR% zj{vGuNLi+_Qj>MsYv{|(;OOOQ4ncBT-S}IQ=F!J;rb_c+qH<#-FoNky~fd*tCwdltnJ-- z!0~+Gd6Qlfb8Pvk=R?s*`*4T&hGUp&G}1Y0w+^bjAm(N(k#v$$vVU)VGSbzo5Lzqc z*3QhXEZ%zk-Glujp63{4sZxIF`ei|uciy{G+u0Qa5%c_$&<#QC*LTx1E6L*A{`S^R z*PYlzld#A^$EOT{ff+og+ZW3+25c||@x?^~grMApFUKaj zmC9A((eUAR6$3Q(N4g0_PR_?;kLskD0H7KK4l$~tusS70{gl#!IACvr?ur&~`&lKEVYSHpLA8l|Y*onnPI z|M0$%<>kdh=(v0QbRpv&`8Ch%Iis8wYj#`V!h$jF%`%%Kh9E>d+eHX^geFudGb5mc z7sY;KFFv<2yZY4d=#eq%nfG2zoV}LMmZQT_=XiJF$|tO;9ZurR-0a4;?`ih2EDB;~ zKFZvOwPUHg7L^3U)Hgfb*8YR+?Aq+5ml5VTK}_evN_lBoedxE=<8zDq!}iwAZ$=Z@ z+~Q?p)QLMoT~3{O_KT9NRqY^V8)<>LEVl0rUluHqSQ%3$g(Bfp(b0#ztknS*CHBL< zor@)9IYdcta+idH%IBBn25nA63KAz;h7#SjR>(#(19FKd8R+{Ehv? z3%CYG0pcJ4aOd@2^O26wkKi&6AkU;Wk3 zf9XrV$QXF|a1&#E>Cy#3;CUYR`@?_wPyfIF^?&_;ICt*M_3M`qLWBgZR_C{W`wws4 zyaORr6zSHj_4nSpf9~AM-~ao+{@imnYPIGIFFc*i=DzvO*ITVlD5QR%p|e;TqG=ITRsLdLMp5KwG_Gmt&m>Ox6sG_m`z43(sR|TD#P~^P z3L)^k;Nio=vuEedo}FDo`4m=u8?uO0H(QE&FExWF^@jlz>|PM2>x8n*avF;pI%*f!XCAEh6^`x(VQC2s*dh$e5=|$n0}OCrj#+j zAo?2+Hvt$Sox^G@n+bdmP|8c<=3DRIf93U2yJzbL#uy?9Aw(EMh!92y(vk+Q@43FGsmj8Y^X;Q!eK=Zu?nbX#8#LPHWKv#RKHk{5@Z$3T0&_fN zlynYjOE)f8A8lGwT{{6s#9v|FwBn+=ZV1yRT@EJTvBZ?=veKK2}kQYuK|{N)R|xk`O^ z@8JH1YgwWsfArd9jPZihZ|rON^QhypjC&W1}+;42S+-f2lw#vZP6ho40h-9-Ed! zLb4$6qDVX+2tC^sc^)!=A!dPhu(y*@;My`*25mi<-5*-fY-Nxx3Gs{sMM^xz03kuX zym)Z$RnD+h(}|s$(`+~9W-3=No_+WBJr1G&;KtmqT+aOVdKbl|_wF`$CSI8<-0#+} zER^c&n-9H7Ay!I85}QX`^W{aR@XQMw&x236YuFF7j`rv|MDM;5?;qU$v%;CD2F-qcVJ1>oAua#;Pt4Xl?O=ahK&k|2oLSqt zHSX4u#f3z1S&$V@kQgNZGSl^Oc40+Hc+K_uZ~kF){&K3gu<^$46Uvga^No>#5EK>F zXMu^iIkz(!u~czhi%L`7aBWwOW>e)eCxg!eW2(uRRv!%T1tl}{!3DwqU{l*n_V*LB zMITotFeX64C<6>)K^!@o_=Rz-EH2-{-iR$;;{1W zVO4B3;cNvUjxvfd)-8v)K8DElTv>}pqj7!M_3df7nBBT{YgJ$_Dnni+&VUks)I31E z7);xf@u<-_y&yiU8d$VBMy>) zLGay<4JVVH0`x7i_s(GZ)h?q9eZ;irFZnMJ>h*g6-GBH0noK6mW}D}^k3NDCLWW`f zH~-E5^S$@(X0vHomM0VajW=$FLduITKJ(stcM!rDK_bK0EA$(Ij}6ZSWGF3$QUq9yVsladgC9TW%%n8ZwUdyu(dOc z-Blz_9Jfs@VDOQY4nRO8t1t%4fkO%Xe!77Mj1mF>z#RH346yx>Bs2gJL6l!jlrJU& zpK?5kq?OnI*GHqKi8=J)9Kngi|0nqW{!A9t7-N{@ZvN5NBdJ7Ywv0ug_Gs(1-~Rpf z!4WTs2%!%wD%eM7D8P4SA%0LCCS!=hoWOHD&j|uA3LMV^00E;AVNT$AQRGA(iURS2 zaj!pa_dM4{2m!|CE}dO{{(3BvI(oPz$`azZH-7gI0f3yq+lHC0%xLkbXFu5)FmV2* zXD8jk@#AeW7$FWFwd)kr6i&SS+_S@GJEO%iGZnJmQI?Bd5R5v#Gtb=cEW5U~Tie{8 zzi=+QP&s_OJ?!;5hsPIQdKU8>19aGIZ@&HhmCt@+)b5PCgJdyJ8PoeC_kI$K|0FwCF(*@q5GM%J{>U|gP-0$7MkYNcRZLRGg%UYQ?m$5H z>Idz9XJu~b(_j3hv86W~^w%BWlSOb7|jy8P{Xc#! z`!D{%!f)(H-g(d-HtHCmxg`6=i{XJJKNs3CRv`YI<1#%SC-t`FK>9wV3W&n<->)tr$TNIV*1?uE~k3-f{pgR65hZ@xeL z%|8a+fm2S$F@On4>^qJV5QW3^$;l1{K^R&D3hLPiXiS{#qumQU$VYlD`IA6pfWjw! z5CBS|P-{0Y<O8D%Ir#Y(A(O&D^-@V>A9iD(h>|Plptt2NS(d@wC(M0J*;;-GXj8y-t71C#ko*4 zB_>PEnwri1aH{B=qwROUqC_&1$}L}is`@xOJbnjKVHBUgl8%oDwav|=4p5e^ea11T z#CJGeWR#rTcM#@WbL#6uE|d@yO$jF%AxbzYKxVWKq~sFD{Gh%I1Z7&vjyfIA9Y>;> z+qK#ijc*eWpFImGam^_Jl*wU$?Acg&y;aSXmUuZtDLJ`SBFG6dbCra4$4kakL>K`8 zGQa@hiRYMsPZN35(x-KT? z03`7DM_>#hrIqxk-6q?1@vH;;+Osz+r7qi)X&a!<$kjiQHjh@K1l| ztzZA#rH#GT*WcdeF#6E@@WWyWVZqkNdasE%0sIgP?~F1mAjb&q{$XR(u*z3sk(|uf zch>A71P}p6K!4xde|K1aFah9)Wf?xC5=NuxfB)bAQ;cyq9O5|cd%1p|_kI62e&csB zMxrR#wj)U*rR?ipe>EJ|PC_3PMc&%lyM23ImL{F{ICN3QEBimYks&6{`r?9bkiWjPd5{`?$Y^xA9h zeD$k;Cd-nhg(y9}zn$U~e{R>taj4T7H5z@M=RT@q;(2a5H6K3I1%YRbd0v1q`X2J} zuM8|n+FzGrggMMhoMU+Q)c;Oz%>aVv{O2o|e`$W@#X`Ik8rBTg^uN=|GXN0CEyot0 zEo7HsuIW2d@2BBa3n2_VlB{S~e{Ip8dW^Ebqf%JV`*v$<#7mel03cw5X-UO%h->&i z(kR`ZKe7QL8CCDul(2u#9=s5tX@9VP_d)ll_VCrW-~IB}#@)W8$mql!_@g)xGMs?t zFn>ZN@SGrUg1~>ci2~+003apQcRk0ntf_A4x-~T%({wG{wQbL`9o-CEFPw}QR~AaE z%ZjFzR+ql`U;Jltm(HcjrI|C!yeNGAfBDURqwN^RbTBf8BLLvSwF|NqVuT`&qlDHr zcQ~GxR5?{HrAx(7B+OyXoa$OJbFjIYTAEeTaRS-3&wiRV$A#queLU$L*NoA$a(;F0 z@;QH~$44|LgyV%=Y+**xG~aRWee1R2@&aW5A-sR@!P2!$-J_bV8}Kh%Nc=F;7Go@M z0>;?$J>4=UmhJ_9DV5V?l>so&heKnkC`wq1Fa#XpV~%r4FmcRmDl?xi*V_$aJSnX# zN?M3fiWt~@^PTP6Zw`)kh-bK#o135KMSjvA_yHF$RMPo!W^oS2ol6xU zMy}^>)%G0ULl6ai01?d0&g2(n=P#aX?jF=0Zzl>lYpQpT>iv4dHOJZcnVGc3$5UPq;CH)GLI@xP zK4Ec{ducg*Ce7Cd&bOKg0s6jUx)dP@LJ~gi*?l5kJ6Cu)=Tr~d2ZJCR<}Q`xZCu#w z&?A047)$I&&}tP3kzC4KkD>aN3~wPZ5x&>OFl)5 z88IIf?$<0rm?WV8^w(#feJ(RLd>W8wgbPRT*Iw_mI?igjfIJrj-h=*F<~aIYH6oQm z;p>a@F}K%%;p6@wtO^%2XUG?WPy!C$}Je-;`gR6@bB`WS7wDakC-|k&4 zaj)&@5m7CrwMYBi>|FHda5$4nie9iY>d&Y1GmstnRz>DWv{G*zsl+OV#C!c<;xHdb z_2z`wJr&bQAS9A0O(Z!<&@H<;on*^rQk6Ax)Ul@hcp_74>?`4<=a`s7qMSe(QB~^Rk6$RLd-ilEs@OU(}?r+t1j(aE1FGeZ&Uuz)FHYfbhp^OY542j1E$9891H;0~YQHUV~An>W)b6Z=+{@a7CZ}&zu>mMUj2?8WPX* zs;VlAB#I)&C=^mOP5Usq;(M0OR8q9~lo8BTGE zAL6RVg1~)$C4dn6@T%lE{JlQ$KYFs}NtVt2{^rMB(QxAM_hBpMTE3`o@QEw{KnQ|> zuDnpV@P*3B?(;XYjIg(UbMvDu-0Y>yrC*v0C1n6W`BL)zf4kS-9{og`{O^A-P|6T` z@}5t03*Xg50mvBpO9S?Pv_pgur6()o@MqynfhN7d{a4-sj6noBp8L!1_1~Aq!G6$b z3ONJ;{^&j@jzAVQP9EOlULW%u03e!5z4Z5fH588quFsf@c|M-cmd-3ScJ_V8rIeBY zHg@*!{K=nP|E13%gaCxioxL~z?U#E;by1NagaE;CBAzVf7cO7W5-}|rompE#9Im7y z*|YPytsmchDBE=A;uUK_-@d;d6GF>@I{)%@jL^t2H-c_oqC4;1!x+c18B5n&)x%6> zh6I5*9{)(}&l7h{05HUu$BeOe9^Y;cd-J)n<2mbxo6E(ynPgtT-1*8G2*9K2PH!?a zEaSn!yCPqF}_{7?k#-O|3ZBASp1wjCS7LPAKbw!PY8#@P`gX-L+bDY5KynoNu zO~m0$WhPUZnGS}xzWV#&WFeYe;Dm;x3c2}8`>@upH~fHtvBI+-dG0^^>o5mfFU4#;P@;T5gt@0Ga2p0%LOb8VMSt&dvoJp zIGn~flt{^b0CXon5X>Zm^_o2}iOc~(!1+OoB?5VbJ@d}SVWl+pxr^zq z-l`stys$iYX1*{J4G$-7VMe~ynf{%{?7j6nuWNh1GP7vZw}+B)AuizOUU2J=2II+2 zb?deoTV6Pu)H3^<@BQjCD(N5DOrcsCO62OoLWYLg?N05^Mq=)A-}Q2~u6L?|?<`&a zjAvU%>u(Z&GJoZoYb=m37wW!C?CIUkC|5Z{2bo|h8?n-TCq*b+pzxqH`jY{Y_@ zggoTdx~=Z0c5t!mE%?O0Ivb4_Fql2wSw~W2s^#8mHjLr+bU3&)mz;VM zuVquE<$i6OcsBJdF{KERaBFDCQ^lQwb)EDf z>k#wcHKu$T9WJH~x6#+0V<7 zILGr4^B?iu0;&WEp}YhkfDAAQo*26W#z^23-)-)!AKrZ(VV?ac%`jsCVgML0`rh7~ zeTX1L@IyZ`Mi`|Zj12#kl&y?0-w*!c9fBbEK)&(eG#33HFUAk6z8_freNRY45D)G}R9+H9-8PQeb%MYrKKr@m z;~gq-;Y9pT|JQ#V7UWE^Kvc1Rcr1t1a3W?+O-bb(qaXNw=b+=-uIHG(rJMSo980T8 zsBKImu?){i0mqfjpFj8fv*T`O|K0=Nb<{{?IvA3G^pBg7OtQE%A4w(-?mrwhI{-ps z)KjC%{H5!WbbkB&TccJTVN3{{Da4i^)QFOpMOCRc!VJYuT+#u zLg-D2BB6m9+^f07o&W$N>5?((`kr4pvy>=gciz8092)Vk^y=pHAAcb!#A5fF?B2WU zlE^^_5d<892tl61)sD566C5?=hBCU4c>i(lmAAGB6Z_muA{#+b875VviA)vIvx{0> zwI&MO#X_Fi=FQGPRvdSZ86~mIjB8tv zxw59Yp17Qi9JlJSny7V~o;eZK@XXpXx%uc+;3%ch zOo>qnArvGPA!z8+q{;}Ewne5nb#)iXlTw&o{D4rP9 zYj^hc7iVY6Gc)?AKk#`6AwiAAI2e5*sZ`1a z((%zDhZulJ2`3Q5hmUSvxbjqQtb0KaI93pN5HjDjQsotEI;6z^*eV5103<=%z8q~i zo{Pt$z5d|GRJ}n6N#K*f1B^j*nwNQspASU?01#tGA9atm9DVE<6GtDJ!;U%Z7$1He z^*;Dx_vDA>u%q`|{p!x~!}sbNH@~xN_E+*6hY$h=7z2y~MxR7cKm;L#r=RjEPH~El z*a9!hSz_Jiza8 z;XfYFzz_#nz&;k1rvKg-xF7%!W6!cX2i45%%!!f@b6mgCeDBL&vvk9=ZBbDqMLzL| zZ|>~J^O?rhK5>0Hsx4i+G#w6!PY^~BLCydW@2Fej|sxCS8Dz5NDYYCJp3@iOuC z^1{No%N2dJb-1QmgfxR9MN!mF09$3BmE25$A;)#di-T$^2SAtn~~-w{Z z<}g1Sy1PAoHXhlnbzeU?_>V4Le%grExWF*2?U9_7V`)KuZf&kM)c5bbl`AiH#l;>O zT{^2hY`RA4VL=K_6XnKeRDbu)qzslWJsT=7pEV|r4%byV51JMX^JYp!1VRBrK-sDwA)`Lbh7%jci7#$ChI!#p(G2bLI%h!`R+nl4iEWNeL5 z!by>GWgeKVdUx19d@EaCaYYRVJ~%N$WfWsUkX7P4k#q%N&K-59f`X<8>1f*IdB%|J zHnIuzV3-#8pctW}=_soA0*m6(vS&;KYr33|+R@Uz%?&A>nmhjtgqTulF{WPqbst6ImTqtZ=}j++WQX~qX43hp{{{3 z#_@PK9A(qVa=Ey>dmu{^{VTms#u#HHk}ipgX6qwk)O{jw0H@N1Q-Htm>wt*kiSINv zZ&MQd&;bV!B7`{}aX$&s)8ClDvQwPm6hAlk7$_Rx2ix}{w-USdrNxyOi>31^LB!*h z>ANJ7QLM2S`1AuYGjyh2YBmx|$Phu#4DNsRaCoerI6guM7-g}dmRX7spCSx79__x} z>K#lV{%Ki4x|UzP*9)hWY1iJr+2%$3VHtL!XozGL-y!z&$5u2z04NYtK~On!=>Aoi z`o94on`|-|rpu*7E(0M5T-Vn12d}+z^l;0w?MZJiY;}jt_NdeA*P9T+-f_KGYgkj= zHjGFr;h3gtIiBsPk#J#oAu~54NFt-`#C(w#cyls!4Aa(4Egpl6E?v89*1HRl9AOkf z$RXSqc5dxHOjL?+>dY-IibfDG=6an@ztzSZW*=zlKRjdqydwTP`}~FAd46n8O~)>! z@=-PP;Bb4lc@z*o8B4wR=}%jSt=l^f^OZ_DUA+71>og?JDd=t0o?zyuY2w0>f)l|S;xEk-D*uz z!%J6ggkl*rmY5Fud$;dOA({Aos$48CFF1x#+uXILhG$P)Ynq#1UU~X?IjnXc-HBSg zhb^XQQoGaV`5(Y?z!cBQ|+*^I-IYH7Mzx6s` zfB;;I;n}prXA4JN=l}P$!-&fN?_NxWWxU^W$2Ng9khRd#^-F44**)mxgVug^ND)UE zU;ywK8J43++~0lq{0kQ=%jH}$9=mfm{o1|W@xZH({EAdPX*jma+F%>H!h7h zvbDQ8(5LDAoRVMbn|{4^Fq0|tEN4*Lf%Y)QdvmiTRg20TrIP&qt-IrX>*CU!Uw)=g zS)KG7$B*A_?cA%Jd(N|s_WnbF_)>m`51ffUN$1MD2iuX%49|-n-s~7-g4^#@xAwOm zTceim*!ktFm=jJ4ZiKPtSmvP3i4tRUI%rW!L`m`;D>|&cfAC>jiE0RPRFapr5K1$^azH1RGatOz>MI?o&?*hgkU=T8h_(0BbO2nS_dyTz*eK(n( zPe|%$I^5oP*RYMs?78`*7L{WN3xjdr(nrbS!pcH<_oy)*4U|Y6^P-}~JxlikQp&|B z;2+<4Q&O~eZk88BYdRn#@T{pQYoS=m9QWYISk&OUo)!*;L!nN0_*aU>h716X=ga4w zTYc_V3M*HV#f8ALjdAxc2;MuzDgMSN8or}!;CL*EydZHu#D)bC^ZXMF>QkKJ6sP$4 zQ#AbSi3Um-B@D2SBvV2_2@_TR+OI8?&ZQ6nk|rcd+O+4iw@1m@ur+oAhkQUKKx^vN zANHjX@0r2-|8A%8c=%oGD-4X9hN6k#v|>-a-M3qtuhxF5X}b_X0HE&#zD?}0%f3f< z`V%D@7zMH>a00eQ&d={TjgT>#?A=*6Mk4@#646ZE{6BCkUJOM)m#i9#-%j0au-06Xa%GL=$caW0Zh#qt@1Q8br6 zKCW^+A5%3Hur9K<;W%+&fmbCY3%YF>wwcc7#i6q@yO@Z?06?zq!Vd;L2q7nnAt%$8 z5JJir15D&agit_&zm#rZjB%KAJ*PeH@tD7|u;v8r*3ll9jbcq2ZybH$`A@kVlZ#1O z8werA*Z6X_WVjXkz}0%q&FJ{+C+z958rMxQ%(Z8n+zlXt(7Ia6MH?%LtK`~9P) zlCLQFVz1d$bPKzV;p^qK1#>!X?(Veqj!I`%Q!@*g3(a4?B*{{3Yq#HQGfEKxyeKYS zy^xy8jM|;f@kk_YCF1YvGGe4Z7;_&)f1Ui2K4B7%o?8q>6?}8w!U#qc%wZ_;XrpQS z1aKHoLNUiJT)r@B)h9!T<2YTP%%{W~^U5w)9$O@#SE~c>-2=Nl_5Xuw;l+&T_#ia5 z94i*PNA>>kai`f^D`__4$A(MjlbkR@*>XAk^5q3W830U`MMYNH{h{M}JVtK7#wO_* zzHUJcrZ!vcu^qg z&;!bIs5`N)&t`O+I?R$&dA~nNNw71u91hOMm7)}VZKs+^hT7dhCO2yh`c9<4Nm^3j zW1?eu0pJA0OA67&GF{)?0lY9bH_yZ{g&h1qEk*%?08KaFdHB{J588(u zFZqP@I|o=)HB~F-E0gK)s8f?vp1OV^mR%^!0^bjavv&T%!}WU%aqYba(R7iQREV%` z8}kcG)2ZG(KG1tL%<-x6iYTk*xJL=Gru|SXg?Y)I4$;STnt;QcW!w2o+6#Q$Ft{Jl zz!E}40zXk)IQzn{Dv>yZND0M5@mzcVf$v%$e>==moDvN`A)?_#NczJ9oNT8!#VJm4 zN;LeepvELEAu|YwPr(Nkk2GLvR6P6X8H6FFj1tC)oYAum?{_n^QFG|{E`cA305wN0 zCtwJ{&YO)B1uOWDBpW)q-#wUU32F0{`onKlf9fm$3?Kvpm#9%u@7v&~Ml?VO7y)vW zM;KaT@8|loM#$EU?omAyiy)pmdic2d;PK-13(dVFN(jRE#DOXByks$d5@x{(JjU4f zJW&+G$v8qNT`nGP?(m{eIEZy&VLEPOb9lGDJ91%y=a570wnRP^E0KuspvsTdX9a2|*MEMU-U~Lgcxw?|F{r zW}?YofANcd`}xmbUplXd@^P<88HFG65Z{dxrwRZ7MhF5pvGl$^p3RhU$?W2bH(vkB zpY9&*S~6ZOEu@foP(7GiJrl{M_a1KGfhpw^!$v!jPWJ0fTQ?xa2q8c4qe}QQ7oU4L zIW9eSnfm_iKm8^NyiBDq?KJiu+_wo7Gx_|&@`aUioulKU%?)EZu#Jg19L!x<3dKX6 zYQxq8Sxd-T3_%nxnxC<@9ss)7Ue&H}-p-k?91I#Cri-&dYmk`$MHSg7ETU ze!h@&+~CBy6+!S|zug_1BF_Q9cn-O~_xzc~v12SO;M)%-hU+J!WHF-LYImz$*Kp~; zB;Bds7zfpXchvXxy6%l^^pAJVbiUFugX@bL9UsL6zjFS0H*+3G3W@w|ab~6@w$3Wk z-L4hVNK$BW{0&|10v zslxoK)314yghj!3T#HvcODBXN&&Ir{4_Z;)-`mg?X_2&N>+_t=$3liUD~KF}e1E7T1ct3cHm!;ATu9&z zf>C@SUnnJ`(qJ;>l{n_`$-SL11_2!n+lm$q#WH^2TcfUPO?g4&wAi5E@Bxd*bGdj% z=GozR`uK1Mv7nrrJ9Fu3R-9O|bH3~Of#Zf^c!rgDZ70vV+w z5S38paKoMsAv`4-PVw_YG@RlTr#QtaKK?`lV*tXX=khmxeR<`@LUA==P26e6f(SwY zC}SLt%NJ8xQVu+VIfO7gy3=iMPg0ez@!dqj$?7lWkTG(mU5n%KM->ea0>+piaZ*TV z?~WbQ!`#1*s)zQd0{{@;e?l}&^po{`2%&4)nB!72MM0LUkGAyw$QVy}Niau~$8X(y^|$_= zV_M^OPYs7SK~N)+$8WyNC<~_(kMG`_Sh^sI#c)MBgUrRK1+(>TN& z=lGsah#v$#`OZctAtzqUj4}WqM3m9pqy2L)JslBM$!}w|KxN3AuPt*ytDb{d-d(T;>x0yi0$27?;Y1L zhoebN4)eWUXTRErMpCn-1&DY-QW1Tc7lr2(y)^o-VDP9kqvzts}>9 z)o7do2=wNa`Q$Mz+P3F7R^Yij&)FUoICQxzFJ{Htht_7xS;|U0h5-SLfl5kvbH|Vc z&Uf5cE;F;b1VA*m@LamQs78{pbSV?zj&0VPIL(d69ET?^JD25p(;!)y5i-U1j%?BF zt;At2%wY~w2B$Wi*umwBw%xKmTww2tf(jx z5flN;C**QUQbKY>vU$(Gx{wqQ-R}10R2WKT5U+5FOsl%7F-+8yqofoi3^D)hZ+-Q! z-kx8%fFR=3Xj;1 zM$H!O)an$uQW=KQq87)1WecTbDm|^OtE0n(Y?kLx;8~t1$D)bRpoN={B{j^+ob53o zH803od;ig>TW5h^Z5&?L4<$8L1p@IsRZ^0%B+bm@z&EFTUX(aN`30b`mLmZO{NAgY$G8XQ`4n2F}u*W3~AvKO3zU&0=1y<0`kmptLg+k5+uRy zh@v$1`9!8*O^2RsTI0TBP7x+}<5IhK~@05C(1l0F2LQN<@T=RoDAluQfc&j~7Gc_Yn;wph`^S z1U&89m_y&sX>bw_T%z~vA7G{fe=5%%#y~tD8n>*UF3~`kmXt|AY~4Q{lqEqB%cdbh zqjvYq(^v0&?G;&5=P#XW9abr!CovP>AsRm5n;?X?VP(oi2tlvbAVF|&|Ixv{hYwzV zXX~9?#%O%B{y>ly3$YBmAmnzLh zeKZ(Ew8-4*nZ?T&a`~LVF!h4tz5Vs~-`#w;UaeLg*HP6_HkDn?&0m^brGzj52qO%z zgcj38RmMU@3FQ;%Y&@NbB{R`vCYDUclJQU^5(tXY=5 z``()na~y}ey=kG6ojJQ~QNDk4SlvE)zv=-9pPCEF0+a<9l`&xuU_K(U#@OdE1Q1e2 zr>0X$$uUiZ5Oqh!`;Y4!LSa?pI6N^N({azu6d^;gj9+b7gRvVD`5UGD{dRA+F`mh) z2*b(L=eQ@%vS>b5$?ICyn) zvNwtCRoky@w3-t(a`{`k{k@)7o?Q;6`hI_^3Oqv;QtwPI#)!{F#GJ}Y669^$;Kjvq zA)rns1VdIe65%2V?YWhr(|@R`s+!29_;EQUWkR4*$xA_Z290FSRuh>-VIjWo)Xdsb zkmGSAnXRmHf`lu`$YdoH1ZtVJX7d@{*#R5WYTev@+t*c;0N6cEM4<|Qeqsw$>?&8lrq{OOQ$ zbS_h72xCrkEejx|L{eHTO{6en0RRAV0t8?(?5J9#l23C=Wa@K)=PaPn==jmS%`MW| zi10oi&$00sStADtgX&g$|Gt1QPlIqg>odv(Ii4y;v*l=Jh8Jbb@p35YJ2o%!D7~n~ zvZa-)QaHvavtbBe%&F0M;KcwHB}I%RATdqT?6hh;C#1`(lm?z-8KaIl?nctZRB6%H z$L6RB?sxcO66G(Zy2NLKY6;^^LYOfG(2&um7C6jDW5sc-KtUcKa6_R)jK zN;I-?@qBy#kTFI`@cl#sqg0TjST^0OH#t%CEJsvj&vF9a=L7+B9Okg+ILTt+%+psz zMUG|Dwqb4Eyq(DBBB^938Xh)U)8WW9tx0b38%b>N#SRMK%EaK?0M8ipVEJ_&*# z2nabDso*(Y5oApbB_lBnOV>XAa>#>dYy-gN7nfGfp4Bvs)8vEukB*KHhvxKXd-thN zeM&_<@B*yK30Fvj!Z;Ov{>7J4lc3BQN<|C3Gmut{P9TX_Xpu*UQHCP&dM_(d$VrbsoDs_N>Ts}cmeYWfB-CJ#5Zj?;8qc18Iuy&2zykncL7a9Ds}JAT;u*c)hL~Hryk_#zGa>Wl+m9^Ekrau8 z;Qq1QH-oDcRTZ$$m@44;jLZT0pzeq~1PlZeEN4aH8DG6!->kOZ->f}4Y;RV(j!!gM zEN5a);FS}}vFRo<-u|K8)9vSG3aTvMtTiEHx)BsIvKLUxCISaXw*QGrf>CmJg3sUh zv_^)bgZDyOwqa1i7^kzdycz+NAdEeq7`3}ERqR2Kc{~z|@o+L*3{(xvu}Urxk80hC zJ4NAzLhj+_{zl7akNpQVo%uZD)yHE&g#K^6)re^2fy=*p&|1ahoqE5p@GRAGok0_K zYId|lwR|YIn3-8p;|1R}hxNVMgd}~tJMHH*n9Y~C%o&ej2pAxQ5FbH=5X2aUNLRG0 zGS3u!KP67GrCc~xfbkhAl0=*c5iAz->6nDZ`%&Ir$fY$*z_{t!V+T-u(1@u@L=;WE zyMK6KdqfE*rC84M140-lg^6Qwik1+09bzPjjQKK$P9|*DB-lKOOz5Qj!^Nq=% zv2|xPllNPP+j|d4K(HVQYBX6|mcvOY5?7P6oTO2}C=E_hIZr%LFvm~*!0Fcu@pO8o zlGnsWd*UO|+_^^rFFku!QZxvGG3<<5RW+I}E?seLebhe293RaT%~AJb*~>rxpd<;Z zqK?LsA70Twf`Aw0?EHDpwd$L<#+_=vzPo?#wf6o4M#*Wq-YHIrhEts46sI`F$1L6w z0$cZ-sgHR?DdRY7ja=985rQX!4=16)?VV9$W5Dx>7Z5^-QR-U(FK`gLKYVS)7{ELN zfcYL3WbVTh07_^mE`^e^=LFM^P5hs1&BOwSa1!!t@>8tD7{EMY0X;pl832gm%+Vwi ziHM5w_?`EcpSsf6-aEYa2myHMv!A&4&DR*AKky@#LMlY4Uu))<<{2T@RL49A7+{n# z#spD(`9J*+&pdk_L4-IQ_`%k@w}y>YcCHfmt`rJUN|$e30gM{s>CuD7)>QA;n+PK< z7K`OG!}0j|)gya4&Ck!478g@1voqJu8|{I4)O4qY=X!g!!(=EX@B)O;3%s}Pz4NU{ z?`X0nYO0ouiMgny>+OT8XWI+_NGL*><2j5l$8p5GdH(h2{D5OmWa?_iGK;wgpKdK|q2aJ6BGXik-vbL8ImQZV%R4t-Y(yyi`f&y@b}N zHHICNF(`-kTvTwuJk5&~N8IP_`4ItjQJVk4g82D+El z&|cU3?78rJ2PPuk%(*jaEV6fJ-LoACS@YmgJU@>(5dy#%88nVMM_cKc<+)2wDPc5h zc3O{iKny;;sC|1=N1o3B&;)REXS(0E{_c(VT1I#b+=)g0_O+NIa=&+Lz!*z}@JtMS z>*3IF$w@?|z+oPv?oc0$&9Ev~vWb~&4365PF)^J$6}W|D;$S?TI!;uUynxob?o3{- zHZ0R7DNR{Os#_C3z50ybJI*hpjIdgpKmqy)VYhq81Thp&n8p;)Kpo$&5>2NvFa{&L zEvL(tsT14S(53Tp*;&9@6g$zvOD{fmuVrF{d`1mHEXR~*ViD74i!Yo7ww^Z!UDqAU z1u30B@|2h}AYyvGOVr|Z7)eN>}}kLNAuA{ zE@sba(S6@PZX5)j8_mx}QY9^s>m6_J-umX;g%=jCewq`c*4}-Lmt%$b{_z&a|9}|R zpK;D5hxZSTpMCo3!O`(w^4=f>lu||!=3?2IP$V@SwDe({G1}fAQAz*+950@-45v87 zDNb>UQ=9^Pyy7h(U<}w3H=I^tIrXFlYHkjCh#)6% zyof()N$?jd8XyFeP$eSqA~)?=m`8v;Q5F=}lGneqc=j{p*{f+$6^6&U?~tEh?4_s* z5P}oQ#!p4jfFKEIyr5YV*R%Yeb4A0+;q@FRQOJ9iHEMOrYb%VgQL8iV_0@2A_WW9X zdpDlTdbVRurXN)_%&e|-j%uE5`>q>JCq2g{{*&~F!1u3x;Zx82>K8H3L4+U#5TbFr z+uA=2f*`*zd+SfW!Anv&neZJ~(KL)X0GX|uo@I}FgJHANJFWo;v{=-2oV^E+Hr{>T zvMf0jjV>0|+1$w1>z$_Od5&c@`mF~CTdE+J;#tqO1)nj~wTELF3ybI07FJgy(HMu2 zBudODj8Fh!K!VEEbIqgUrGxWNw9RV;1Zx!>#dwM4SCwj!#^{{6?pc9$}Sc;0t?Nej)MUlSy0 z|K7SW8bb&$Lg7@Zd|{P~O2@|s<43!RM3fN9Nf9ZQL6}1b0tkuk5=vv5aA_%fukNQ{ z|4K!?doX_Qaidc^P!+W@S4k%mT~Ez~ac@c@GD^zq?%}k2W)Wj<@6NjCxBvp*C$r)} zM0TL0t;yiv-fQN#C#jm2khAl%ooc&txX%fKkHoc#*0mrfN`fr&k`&Sug2h`6l23;| zxfao6EMfNf^V+9Y!>NcclMTIFgB~Ykl95m>qD8_=SW_ZeBpwULqrM_B8DK`f(yIkoe4m3l*12;X+zUMAU2~F*h4YgpxCP6ba9rnN`AqA4|;6 z(^mEQ_PA}-qs44(&C)Fv<#UFAcBA* zNO=Sj$z*-6-8}NqBu&fY|Ku7_j z000KD>r;JCF$e%;1P~H1MjXS|2c}B`DWgNpW)deyT^yR&#PR`DQUl8mu)>L9hXBmU03rr} z?Ru6mmVv|k3E@IM5I-auAOH-oFo!wM6eCGSM(^BwQ&wV%5(;x@E?=HbdaiBpiZ&T` z6WOw)hFg30NkGcypN0^14mKjG0x!wdWQZ{Lal1(pLX*i@;1k0%e;`e8!aEV)!LI@*-G3GGl0XVhOKgFq{;S{Gh#VJnlaZ@xffG~8e;Qim-Zfp$Y zh~Vg6`9dl=8*cB8MVX@~q67A%kO_RsC_o%y47irB=G2p7@JEr1vhO@xAfS}WVgB6b z%K6o}XZgIut$wmJs!w;{ZbKgZq?Vyv)00B{xD6mYEy?~pxt#^J10m!@!8Xjp^~aS9 zYmMzah|uos`zudhx%jDnL_v^6eK15Ad$u#}k7AkhpxL4U1rRVwD;L%P z0Mrjo=58Q@nYpqQQewI6{@n*F&s-N}$#;Dzr239$PW5!TG_$&Fj;F?W;#ihrSi}p) z-9F~|cs4V$vgBIU=DY9vj+dP)M{{X;p>kjt-+u7z-f`1+T}0T~;$lLLc8np1a3Y$< z5Rm%7qAZ$<=C57@lm({km}bA;ju&&K(%fNN|I8P@*giOtrhYzGri8@hs00xrv@_{D zV}0q`CEK)OI8;bxyuf1s0LCohWaE)F-hH&Qkx*HFW;Q=R+pE@F2h}jghhs7cNI*!W zkWbH5y2s7N{vqImAYg(bB@4N^i)ZbLzPG+Ps5b)7OLl9|zW8$E@ph-(=42U#GZH19 zHL)#Q;scpy3nASl_$#*uj!z|#Bg}QXn^YWDVJ@l$AvMLzv!7o@cMgpkzm(=Vw0q}H zqL4-qISijKN;wVJIpS1bYwhmSAc*EN%TGP$d!%!)lPVTNG1a#X3UOEBKKYVx>(B{F z9A)guObugiPnp;#gGc!Yc=@z2V-iPhPnwX5jk0 z!)I0{7Rimf1Jyb>>YBVs7Bl4W_OYcdCLuc5K8(fV0;JWWV-n3$!c9BPfUse$5tCTA zK6VwYNSgawM<$a}$&7p0nwOEGcRGRDgh?F^;(q___1iBkRGe`99*unA%(BS*zE%NZ z=p=;=iF~)Vd*@I7`Ft+c?+!nC;rub=9c6Ce{L?3nyZ`{e7(@s_=9-3UPJP$n1(}zm zQS%5QB(GhEFaQ9Z*z{sv)O(FVV=uey|+4d=288K0+fxX1cv+^|jM`a26h-OW?5gA1ZO17U=MQ)9ak7?Qx;*LB_HR#TFMfg(q}t<~g{3RR z_w_*weasqi2*Ke|eR*-V(P~TLcWEvlgbaYdcOmArcvcR_1xfAK_Z(x45QY$)ED3x> zLw1T&oZ=LxIK?SW@#lj387kcof{qz%zgcI5K@6vDQ;CXFh!0$XF#NEdfdB>`HAYUn zr1cIbuHo|vhY+Lz`yq*GhyX%}`t)S~6KjJ|TvozD;1LD@^O>Na)LiWFcJIT%iXZG#(b9T9MZguz0eNmRTZ{C@^c>c`OSKs)( zKcbADPzJu^&7N869XC%BC?G=Cbjk^QESv7vS`Z=tpl3QCo@tCR2vKIXTv(cG?Hz^_ zafGp`%Cf3po*y*ZmGfs1M%GlPl=-elgMj$Kv_I_C8jfj=d%Z!cB`R{JQdYv6YdgK; zW-Ogdmhv;d_R9#P=H6lT@s3U@j|9~gj+(XgX`kZ+crru31DQ`k(MWE-qJ&hnoGM*e zGy7uzVRd~2GLTNCBXWpP64xRq0HyNm{=Em3M}2#`G`q-EhnV9?5Io^o5DHi@r%8Gx zkqKwVgJI+TUC;4j5rqOkTu;!%(%Geeu*TLyU$+Wz$+6v7K9(vMqv_XFG&=(h z@c^MttNY3uuU@=*t*od4^>oj+u@G9C^%(cb{CMg7@|&aD?R&e$Ga|=x0RgH6(_yaK zcSWpMW(&u6TN)y3P#X$f+cn2`*t&2aVL7`;E)rzkF$VtUchRrRtjrZ9Hvj-I9tS1A(_e3j z7?ufJuRA?GPy~b#WB>$|CbbaaLt|?%(7Cs6ccVOf?uDzzgelbFW!@w#7LQA+j5zH2 zY&I{PIkWbMO;Lq+xXMgnHa7tvlr6-U&L13X783H*J=AyCq^iWw+L9kjWZ+87Cw07^`8>ALryto(vkT7=d zwO5}CMRJv;AfC%aBlS-6TQ^_*``0gyscphA!iZ2B1c7hshG`)j7ZYjU@gu2(9F7nY zKtW`_2O$6m`@U;W2ci^m%}I6R-9cmj(r5l&BwOwtKC-7{B^)C`KmmjRAQrgRM2Tgq z>#w^!oSj)6_v`6Mwy$R0&W@@&RWooV&D7lLxKpFVpS|$nuz6@thT+W2qgVeem9=1b zzAW?aO$RWXsPEp>{GQ9?R3?2Xi|(|YW~-AXG^~X}B6HlhXHM|sfFx!t6z26qHJ1sP z1fNhOi~=Zm)AsRxBvoXTn8P-Pz_bmOm}@KNtG!%cjnrsn+;2>caZy0;+<)ho!LY0> zEMH87;{~2ySh;9$+*pt>fRy-zAxRXb-P+A>{f;*sEMI!MRIFTm>a!&9I@57=?>;~3 zPNrj7Ru>ZKLEx{Qf3~^%pkLb!=jNDW9Nc@gw0c93)Z<5Qr)JlD*Ky6s$ITehvTO*U zB1weOkA^c5--8H7Gi6Z@A&#@g{qE5w!Wf;37fx}CQ=H-yr#J=p>oPj=fzKC2fa5VQ zV$8uw$C6Y&nh)t+`#Vc*Pdamoc@#-2!@7 z1Q}(eGfVBmBj0sT`T>ZLZJN9!iK=W(bqEo}Xzu(PCyD?7%yX_`(ZDB!R3B}(_m4zX zkyZ8R;p6xI`0K81JBGD?_u;71g9vdPc1#-prba?qA}*^6p;T5>QI?F+xL0e~Qv(3z z*^W7ySW~^Rdk{&d=FY8ALTpSIuUtHP{Ytt}kix1KiHd^2f&gJ0cz&{jcQE9bK- z^Yx=@y;4ks_0DU>T{knY(*AC<;^{n4wh zxt1BvXNS%9&U<$!{h>V>P5XV{^>{IqEG~_k2g9kI2#eXccr>ITML-;nc^>mT{hEeZ6D`l@9x2#A1*$Zi5fZwiXqaD{_Y=x7vi7eQ35*qB}I1!(dqsI^A|xcb4WV%(eRC zsT@usUI2_igej%WwUp!go5u&a$|~e|;(G{l4>#{>lcvPM!`hxZ8EWw?le9!(PRq`! zv2=hrW7J(O&u8XVbtN1vL`o z`MG>0kW>p{NJ(eV;b{<4LVTi-6hu1hn3M@hWYVcd)8%-!(%M^3mXVhkO_9=5xf z!}?&j`~JO7^%x>VJiofJHR%pQ@o0JNOf;212n&*cF^>?!9LMuK$Mcikz;oQd@dnLS zqL8J&fBTKMs)q;JeE!Vp8pViWn3*Z1%cVpyABsh^Wc=Ie|-AG)E zrxS@xGCwzS{>7)~E}mtCV4hEwN@^k@#p1cORUw+__w~DP-r3za>~_b!-lW$Vjrx;O ze>CV0`@M1h;5ZT0Ft8^3k5YL0T#^3mGprza5iq)_w2$`d?`;mkS|S_fcaQqL-nbNk zrfDB_?6tC5na{kt-aY{fPmw9 z2q6H>vvqUa6C|a$a*fcy(kJ-{Keas5r5HiRPHr)PGIpt~tz?COFa()^*!%nX*B?zT zmqUjG|Dfju6g+hq^RmIHMU%aUlD=6slk za*R*sYW14ft2^dsIGu*%Xkz)|dygKnQR_>ysf}KzcKg-1EKezrB-vqnMx}vid2*sx zUC#)BqqI92g?LbX<2N-*055FZeVzI)4SdY;@xlVfi;+YYOCd3E8St)1q(A7iCPunA zXAh2TiYnz5!PQO2#9G1!flA#$Z#d=T%J~-T(4FYSb(*3K0N)@?D{|ZAHPm4D;5c53)$zNx%T?&Z;uBZDUoY8 z_G|kaOSw{5l*SYa(G)MMdcPHuWFeU)zL!D>LEr*tO?p~-CXy=ltDE6e-kS8EJg7c4 zM1#oVbShr0)&)`Ics@~>k7Qz_UFDs1E^h~k# zcw17{;+ci!?m>QGP9Ki+!4PxY_Z(c`bt9<+2?&Hx)i9{jmyUx8odp(j$<>o2~LnRz8EY9T@=KA$U_oy~#b)xBH;Cr>lJ3F`T z4x23{5)OO<01HJU2qOl-bT|t9AQX#oydbI)#we0b&z)bbKHS`S@UXVIn+_*Zxtwb| zjs1g3ZxBwzpZU@+PJ2VoaX3LR#uH;Q$y8=i#oS~tQlsHysSwX+C%t~}xFLr%HKKX0 z8%ZXDi1cvpu^~e^m#l}#t;gE}5|gR49F9gZS)WnIb>f-ysMCG;>O1X&>af|G_J+L3 zrwTdWc3L~T+c$5U!y)lp-?BW*axKd;PBz=My{YBbtF7g8OLHk9Fow^c(az0;0Dv6x zQeh#Xf>$24Bs%R+T@)$J&Q@X(@u+3Q3WevNn%}&)asP1x6H|_)a47wBg@=%K!i##p zceH-Lv^p9mIzld)~At>sFC?tws!xAyDv5$)oc zv+qsp6o!rxvqo*-b5#)wTFUBmMO9o%C+{D(2ECTdA!yc8-V}0Npo9qpB=8(l4<`%p z{2YR)eY_o&rQx7@F$%oK!Rrt2W@ayhv?u{6BFSRl$UJxO=$&LP!O3~f==FuLJL(J? zdx7Vs$}6QaH=@~ceft(Afgp!4;`vD8dR*;}$43Dl4qB;XBFCApZBE<6!R50{f+*`i zn=R!K^@lFcOMDguZ5Hu>(Am4^*?KIIv~1V&>|tXM0MZQ8+o1SNmyY zy4#7KzjpOYf9q49{>0Nf&o|n=dZQVRB$RlrRo_0WZu^ckmrR?Z?!eS(BuNlfAjr-v zwR>&BwbP0UG3R-f9M3ATtU2yTp@=mdoOm4kOi5S>0HB008UTc2@q`qLiqUK&nbSwz zNvG=QW8bwPLipq7VR?#E{OpMa2qAVcm(}~8+8Z) zkTjkV=94RZ6d zlBRZ#YK+okG4B}G@y1p-l~{TD>Zsl69XByX?E8ErNkE9_hm(n!wUySv(Wu#Wbi=jn z!opmBaqi)(Z`-;NO(&&LsQPFt5|7)u(W^CL*|aelHunwz!skBmYjSP6>s8oqOS##cP*L(=?b@ zoGH)DRJ3#=QOIkV1TS#k`iGVV4txNHVWP;v6ptvWj_O)H>n>i8#j8wCCsN9D+Un zNoS?TBGF7bnn}KL$Q}>aYe&H!?V>l^;`K6rHe!GCwXMCa<02UH=IE$CdgFfY>fDTo zdW!|2-?yh0DTg8^Cjt!WqcP9(5JHT(fCLl6OI0pk)~pBh1}BKUz8Ov>FP@w83|{2) zie#?7j?r+N*9?(h*}a2+v*S z!)Z~AtKr!3$#kHIx?y>t93;LM`00F!Oa{mt+MbsPc(Oi7Tn{rhh$1CuCGITrFfV>ap>7*dRY^xO;( zV-8Z&k~g+|iiC7D)a>=$#vxLoRFHhvv?c>pk+B+Ml`Xc~;5>bBp|a3n$ZH>5SvnJsWk@)s#MpoKcYg5~o?eN_@XpA8oEgP5$OWNFfEwEL~D zV|kPBF%O!!eJF*>e=y3g^MJ8$KZL<*2g~!uHnh*DtePU8``VcwADber)Ux-mc2~{G=P$H`(vT7{#mu^Zl!AlAw)OXD9 zUCj8A7f}F0ki!roh!I2xo`%bw;uNPiB^o|@n*=nVp@e+>ON*7u88O7iXS8@e)ZHJO zBNuZY5ihuecr>#Rop$Ue6fk@e45=k#5>VeET2h(z><_zlN|+oGIRWbZAK=lziJTS} zM-B7juTF#j`PGCya=ZHzLB*RmYTMhFo?C?Ungg=v3aji<>{!L=-NG8uRKv*%Ys z(a7QY2EyF;A3cn*ZJ3pFtGp;2+<(Li0)SAIrKM|^#@&8nXFr^X&tJK)cYA$*{h=sJ z0023p4w{{CGJ$!%v9){jaFhCe<^0;pQ&)`9xVF7pTw2I4&C6OyAB=YI-$#f`mkMem z3^8u)9UMN|AVCmK#$`=2r<2Z6ZPe+-GO6<~KY!`v7YdhF!n1`$D#;u_J5$)bvrZVu z&6O#mu3;gJ6NOy5GE-QXU48Z`&+`yMp=d-@srh`-gEU%5XJ^adSZvhn9B*#xgCQ>pKloIq z!13u)PP#ZFGl;(ZU}%_b`OLzyX3rwCl759*DhW_`bY_i^`Z8voM8 zNY|im?^_`WuNLHdTwoye&8^1SMXgrVUtEYsLMR$eeDl!(1Pmj{00fj`z~XB!ex@kj zy8G^W*UCnfY`(Bi%D0X;=kjUYHr`r4`qiuH_E`VsM`jCC_vTpaWVa(?Mjd1mMlIbEr*zq)<*O~|OIhB;pJZBvp%Jc8{1&)%QM zS(24y;`liy_K3Uhd*0l)%B;P5sjl9erh#sDTtHM9#8FTOXGFneMxC#sqk;~jxR2Y}?@Y-j;ze)U#NgN;7eyK>SKN)t*0UWEV-SJ%7Eou@9G_i;jg@(@XkX2D0?gAjSz&r?z8so8EY?R^3f;ATWAZC)8|}z0njz$ZS^| z4xw86j`4|bAndUGvdt#F;LUG(g)B>^W%E224f@VrSm^b-fVhUHrjm&FrH{-{>xKyd zfC#dXoOv27<$914#&>Cvu_*h`}t{kP5xRkg=3JA5ePJO$_ ziR{;GCKzb+Y))VUNu^WK5CaFoidNqVBxT|ftz|}ryw|i3AOw^E(aUoJt2Isdbs`I* zkLP%%S2GX`Aq0+1d=W|Van^E_ete`94rf(a+EN=WRKb%tZEJ>U?7q=0C4ZSs5{ z`|m_=l0}}7q<2l%Cf9+6=iY3da8PZu2773=)lQ7${E^`9%6e=lYiYXLZ2Mzj2obj3 zI_1t zU8=ga10h5V)2%glQ5@Mn+if&AFD%q|_S9A zT)~*gUQcu=n;swS)tjaDt;Sx-)O6YB)q8zF;p{EPAj3GOMKNI&*&7e(%`OYk*#3Qt zzps6XF*B!|W_9g+t=;T(Ef#_UhmVYnO|p`>v9w%RSfrRR90$HpXOWGmz@mF* z{T>l5?3tH$b%AGHt>33yA`?xq{e+)`5E4rN`BLw%9xL>8BjOdt65;sx;ht&kU0Ilk zb6>qwvidCmnA;A-(>EOt-*R7WdaPO6Rsx=GU9}8AsbgElb2n-TF^FLS0D8CCsqI;s z%JFV`}>nCo6X zRqpS#G$2O=B`}0a2r{Fi@y(VKaH|vP^p_VphHFP6v38?mQ=kZfPZGC&VZ^wq9v;uCk=!^{5F-KNC2z0GG}M^nNc%y6>kGZ3dJfrLog zwrV2ZsK>9f0+hY9)9mz{J`XQ2N~N#Oj*Q7il(vailR3QZAimcs zoBd8CJJl+0X|-KGHpH2IzpJtN1Gdp$Kl^ZY<_3pCQE%n^o@63#gonOz?j-DYZ@BZW z$y~^FF+zw^B1zJAwO_8c6mO`qxpecSUaryu2M)Tf10iG(vN1TdxMKspTiGhEoS}dq zmeV^8ffp>tZdisV6i*LLr(zkkR@mKK>@ghl26IzKQEEi9t?tfJ)Emr>%oCRDG|RTB ze-E;HN(sf75+W+TNP5g4N%N9ST*tA^UcJ<<6^UbZR5g=HQ$pJ9F3U34pBmTWI?(Vf zPzDIV#PL@S&ELccBE{IXP3&0z`j_hQ&kD?Q6Mh7t)-t>?iI@0(-C#Io;9AJANKiOi zcYQJWxj+NKRP=J3!1P<@3-WCUp+6z(J=@Y;gdnAqVVT&7uU9wpj?HlJy9YE-LIs(V ze0-;@G2B%|0|E#j@J1xPYhvdm01XgOLRo>4{Jh?=UMgns|I#gvkgXf(vEjyE`Pw!? zSJm9?l-V~Jj&)2+@Al#&dB?OiE-u9L*=ROh+uplY*@F<;mL1Kc;={SE%ZrBE_l5!h z0$(KT3kMKF+n1Mok@`{}$Fdw}^!xpG2Rn{89I|wyw7xa8Zz?}K*(z1G z7gsvfhNT$;V#9kZ{85^-BMD5dM?E``%c0D#`@@sg+ne3_|=!+~8KjloCv*62g&TsnD=4Z0qg5D{&A|s=FY~^!z^r|+0@43aPFu5G3i)6vk{;zm#WFPFVio~R$V%B*Dw~J%%H7j`n_!#7&+b%j*e5w% zGw1adTW;MI`zG0LbS4twp}b<4mJl6*fo!h+jB2?j_d5CEaU=z3W68&pdJp@;Bgb<3 z>Q;55F0zoe4I>ha_0^{35<=;CBEH>hyROZ9f-)fC)QE|xHxO&-n%>xL)T@*cj@@|N z7axMX;+a!Vv}z?WkO4poA<*xd@q8BfQpD7YeIp$TixTU27_9R$wH9|a=i~8$%g6jm z9|NHFBnG_u_>u9TC*ze)OixonpISI8#3us72SNd#>rVE(_2i7+h(~+d9hy;UvtLcfRY+Xw$5PPC^SHiC8)!Vk{72?AT zLVyB7TtX;>NNrbSe?$;v#0rhAOTI`_^o9t=EWi%n1xe8zHyjR%-R70zPFUi0svYVd zLV!R>`yz*W)_S@U8UA zNqltQ$l+UE$EJilD+c*uz966!yEe;nZJ zTS7M<@*kS@?4R-+n)Mt%?7!`pKOAJMb+^%WIQBc4#TaA9ajxMhgXcTLd>@cUa`l-G zU*a(@0yY8|yRM6`UZ58@HrI6tp#yF*A@my#;~Nf-Qb6g|?^8-KCWFJS-3DI|5MYd5 z7gPGLbIlM!lv3Bl7`qtb!MiXF`Yy@%Qc7*xA%qe_;DBj9_&kHoyX!f~_4qym4FEs} zI;I;+dxBXn!$1mvsoIj4H+oL5rb7h3HmM*05a=B%J`x~=8eI!95HU#aSkaMy)pt0V zHF`F|^lLzahvy`w-?E-}uTuaS7|wcIJN-ePPcZOCCCMvP*4muFeiucx2S9_uNnXBF z(Y{8VfPfO}i_3b)a$g$I04U&PR`PIq$09DhKFOcE8peh)_1)sNlVusEKO7RhGB1kV zMw1YlnHXI^cL^cbuGYh;L^PYO?-nT`2qElZ#qS;3H?_O8rgwWR#~FP+5Rb(2IhNz9 zg`G~lIevIQcHPA%o|Zf^C6rP+cs3hqf6!tO$)d|02r3lyInyR5n}YN8cHVuu?TTV zYHZja2~$Gz`=-W^9<1*a0j2&}$Qz9W#-?ZH$HHNs>d@UnLAUjuttnpL{NW?{;StH> z5f#bf^8iU=WhD{w-*zAtje5^lQPbsRkL(M01w}!koJ;!lPlV4b)wR&DhGD&DePNYY zNbr04nbGLv(F0fZ)a|u31Cc{xq6+hgNc_fQIdNhxa_n|R<}K44n2D;*w%W9KQSNsd zo8wBvZpr7h+)F%QExcGa3Ta$;JHTMKE2j)vHR*nv6(bluB%mpJhjk$^?Vqx z)@Um8)hpYDrry%&UPGH3OWrV_vv)4d1ci%rts|s-KL5_@#RFN}nMQ zczM|+xY+7=6%Qb!Z)m3L&JX3*sx`gW3a5qx@q9EG?DjfVv)pm8*B?oY%*wIRZnK%^ z>K86vC^fp!H5tjriGIr2vD|#UtNXn?Cq zDn46R5wF;WCiz1GgxD9cJ9Q2bTNGI2MGV6+ya-&gU2=pVwheCYa$AYTM`kI(06+== zg2*=dwZf9(3w9di>e{(vP>hWpM4}H6GO*zxkR_dhs#*R(NM&W$lkIfcJC`4|bk!S9 zin2ElAL`cjqR~vfzNcwwX7UKMx-Q^-;Y6=d+Fdy13nvpJ^X07tLTNTVQtdP|q43d& zucdZ7nfaZ)twv!9NS>+LV>Wiz)>iVv!%@EsD8Yn0dGeW43%j!71Jtb-w{JKQF&*@Y z&py>^w@c;Psmog*|KvZ}{Z23xld#h)Zdlj_440ig>Ip<$$EK7(N*z;gHOr;F4cAbo z_MecGBZy$)+K6EhF9J*$LoHW#vH$Xp%!wmG zufiY*EQcBvF>OK!;CU1daEE8T`zDl1-QL_aISzeWqob61JW4bgCIlb^IgVu*mJp(8 zIzo_Tzo))4JkN6+_syV$L1r$B0>dzbke7louq-n_KXd5NzE-QFY5KQDRR+0qEEc)( z#>25#q*AE@09cmgc^+f@f`bKt|N7w}1Ol1vG7JhmTuUlHK;uh*VR=uH9F!6_^Mkw zfkfQw_j|22!!WLG_uHLNG9F2%8ha&52+Oe}2j&}l<@#=s69oW(W7*M6T9hT*uxi`8 z-cWGn__2#$d7NPUg0&Sf4575&>U8VPST0QoRoiXil1Mh?3kNBMm96c@PEqoD6u;LS z3~1eMeW!>WR|)uXvy*}>IhL)qI;N)i!XZz z%l4X0K&dYhF0QWcTv_RNd$QLXh{h1hv{c)ym8|NXVG-NKgy3$kS1RxIEi;)(r4wmU z4um9r|FC~3AuiXf)h6IY$>UW-SrHV8mE=UsJ2x8K>ahlp6EaE7Ot}o#vl)*^=Hlu7 zhsP@ojmM4@3`e6r-Xm_Q#(0LOk&)=+{$MQLRgNk6}HcO@$*`{AxJ*S@AHQP zxtaa(kzrrRL#f-YHg=a+n|mdr*T;^7T?{Bih+%o&>UT^i9~<+2<>{3Os96Lde8eWkg(luTtso^3VT zgkk-mSa|%X>)0}5%B)v4dr1YFNNHG31mJkkXRzGn?oQO`E|&MELjKFmej=F*MiTc7 z#UmaM8LSVKvb?xdtDk@R@k>|EB0xgPJY*%ywk0Kyo;$uTnO*K%#Ow)r2?{=^Q)Iny ze?0FC#j!uec|ySKc?jzA5D}}oz0J6)97r?1aJRX`h{05HXro^BhZCYFKrm()mf<+Z zGOL@Hwk|#%j%QLH0^|^ij7y#XB`yL4GMv__YW0Fb`+^I5UA5Nh`TSwqG8x2BN^DbO z5F^Kig5d;d?pbt8DGNH_9eRoA|6vq$VvE6FL6>&Heh(x!q}!@vvv+7;xYg-D zeXh8&x_ai~a!aR;>aOkBf-l%;Rg;RxD+s-MX=ig$2}LDI5fz`}4~w#o7ZhF;`??A} z!FYb!wJm@kfRGTfv3Sz7^nk~YJ9Q~PQ#WDctUYcAS!zNu4A>!TbT7J;N}s%QRe%>p;Udmw_b1hi>Bp@jFhuDJ7hwbSpc}y$zNZzxDnTLI5am z3H{**;_v&(TqGda4#5Oa3J?TWnGypef&favP+GiUzjtHD+}bnQ7j4i^2nhxQzxR8; z_MZ3r-FEXWw;Y|G9#16V^?FlP``??UD%W*0nba@*!cV{A6?gXg+QvqK zxM#sU;DN9{OAAt(~muN>dKW> zS^id+m1UW3w|C!tcm4kF|JMTtX8-Q*J{1ZDf8ru^;Qn6U!dH%X7^1tVP9E_=LI~ZRjq`cq&$8jm806@pNx*Pd70UExi zE>@IKhDZH|ar)zHh`S1^G`CfjXJTXi^h~5(?03q2mS+G2gGLFpWpF#a$fv;d^xhKHH{20R@o0MDFJw}EA+GJoRc{J}Xx?XzB~Uf5IXEng@Y8_!>P@|m60jj@CK zVz~@23X<2;DwQdv*s;^&qpfoFv0`N?R08|op!C6i^(1y78;i6 zP>z9wf-2o!J$sJIp4;bghtr{2qkVZ(HwnYo{jFxzb{vjjA!K9$WpeU`E$70vJ`xp+ zdvtwy>$clwH_l%0hWx3R^5o|qZB|=0hAaby($b}6dpN|L-6U306&^i(!y8{Udc#42 z2}H2h>n@)KbsCMmby!?y1xX1+dBs1TNSadO(_4GD`}nDJ?^pt# zT<fh7t&5NE8=l1Jp&08kF=UCmaq&?GBFE?t z$Ngt7UXBb+AHV5_Jwvc;*XcJ@SF$==L&1R8n_+l^HHy0KJigVrkM^?xxCFYo$%G?m z9E{)KOEiJfVTG1%lB*ClU=cX8x3N+#Cz5HtZwitR3*nK`JReLETdx(C+L@%jyRxyn zGM)+~^VAbe@ZlIEcnEeNfRGcEaGKQCHNeTN2CPmtohEv>&&r`xetYpuKQ}wF|AcMy z)h3aBA*0{1v@T+~JDN(BgcqiUF)0uxI*eY&@>QfbZ| zxszd#?2B-M2Oy|*>Xn_9@GbXeM`p(w4a>6iZUc%5UQ`-8%M`$&siT$R#>V9*Z<#&h z3C2X?T;jsU))h_=Q={|U+TPfadz+=Ta&0d$G83}8ou2;ppZ@&*iFs(X1g}SHZIE#$ z9Pr^b*KTVpqAY`W9QyfrUej=g%*6yDGu{piQbR=4X$~S?>qRLQfgVYVHgAc|F<6Av+x8q4AV3% zLMYF3$BrGm;fBLYOKVrItPXGx%d+me>%=QxdABGE+uOxcr_Ojh3dWe@nB&KfzV3Ce zdh*HBEXx>%QLQ#6ChS_RK`C`zH=ob`$N%`FiA3zZ@BPhkxyrIEguu2P!!T{z9%O?E z!LJ{ZQYMYyYCLiabNxFm;J#X{Mlzd^WXrU{zez*8=R-X znfZn%0U_kNIGs+s4o z>y;xBKOv;mQu}@L+WkLZ3=It>d_I|BkZIbLN~_n?SeAL|*X?_5mrVg=py=hU4xLf} z5GAy@(DWyjU`p{trSeJ(yA-i-KwD_-s+`CsCxg3}o4mx@h66C*1cVq!2?3A+6hHtd z84w{Lz|ZFJ5CB4zkf?VogrMsZZ&c=Gw!G5*9-s_^_0ch1*CB$JCsmCBEdAP?f9bdY zq=d2@qJ$Dm5px}AcJfs0>xT=IIz*Ky~b8-gM? z_DbD)BR-T1CSsvjtiD%lZSQ!3!R*v{zujq-D!xbX^vn`U2^JyN-gBR+0CscbiG%_bZJO@{`((!n%OwaRDD)*F^E9FKCU#<9M1 zEJY}(wwsM!V>-zj1TEL`NYd+*n6;YaGdparaqyKd<4slFEnHY_=AyD|VTXWR!kdob zhgMBAGK)Hm!gc|F{$F~XZgM=&6VzNT$f7iI^nh#G*ml%*Z{z#|!9@1?{n1n?H5|!~ z_G)|e-4)ld5yL)D&JzF^u;-Sx?>;>F_+`CatA_j@;=0Y+8pAM3Aj*rfHxv)VbC%xi zRCd%xSuYl%Bf}1)qDOmV!GMPS+WoP~S@|Zx^VP-D=bq_1gt_;wn|*wTY_6DoPdG9B z59fqc3~UFK>iXz>^eY#dj?3n<*(3YLEI!haVqwx+ zsTE^GGu}XOy|gzh(PH1h4lb^o3C8my<5LkCxo!~pk{Y9Dcy(o`(`}$|daU6ZEv$ul z1(WrOBH{{#w&^^IgKs%DGdr`t(twjZS8?2Z`O(MgooaFSQGKV^@7=X;#&MnHes`g= zB{EuW?uLEoBO-NO;;M}uyItK~ztXPmgt^-%yz&<7)#SV*#3IpnpW!IR0742VLad

fKLPzIycz&P$qM2<~9ddgD(Fvhm$I)S@dUg%DShn>@B z*4ML2&UC$zIjQAJLvvcsmYTyZ%P<%5ZV4p}#>G_r*|qBrj6-ej22gu|R0cq4OK&sQ4d@(24* z+r$1^b@9s5Mzh~#G55^+RR*$zCSejkw|S#G9=@^tUNM~y;wY!5vucWE7}K@4>MPH0 z-AX8#TC@Ia9DQG*0VYY3R&*9K_m8(1i}jqI3Zm%Kmu~Saw@|3>w~zcVoSWFsnF|eb z=FFKh7aHdLp@jyBU}YmCY8(K76`437kAC~q9(xGSQzw43FbG;fB66sb=FY|;^TQ}9 z3NZ$hCQ%ePuJ1TXT30e@k`Rbc97dE91aTaPrKQD5yW@F&5JW3W`P)?(Q}*3f((g`q zo{*QlYrr4Y!X5XX9wIEMBWin#e37hV$uRt_$L4B*UoQ#2@yPt|e!Y7# z3=;rJ6sqZTWoz@9h46-q{?WfbKAX5K!U~T71e8z!Kt#aIiT=WKje$j-z$|I(*Y_MA zLxyE;X4Ch2qYF7>G0!OiJ{$y;0**mBl^K{J%W(B<=3qFCW3u0B6CQr?&YkSy7SdJU zMi8mT58sG=pHtOWUij2Gg45CX?Z*c>HVLpk=y#IHOOja4mH-95J+*DWTq|+{cY568 zc@|KRP^xoGn&&&N&(SEO$QF`9V+;U57}Gd0E&DGo)&9=qwVWW-Wa+g^@!WRbo*Jef zdbSHCjYsfyZ4pJzzj^RLm6U?2YND`IDm}Zp!I9t#S1vD?OPU};2x3Aof&ii4X$`jz zcb>`HyJKu{DStAe^h3Fb0stvZiD850`#YDQd+wKNJ0Ui05Ow4n41+#s?#V$|2$O6|vXgMX-J`zMJ$e)+Nj=A$?`@x-pI_3&_jVqqM6?Nl zZnt&PZwoBTN$RlM*Ba{!janvGMp}i_@^ZexYQ^4gJagkpT2Uma?SvVXtJNF6?}5md zvSoWVEi7!>qhWQubo}4}O{iy1CWcYF`31eW0B8&WpqOVk1=(k!UJsK5dTw)XCs$uh zv+-asWFd`R3xu{>tmm>-GmLc>tuEDD(}}D6ckh_9VdJ@$vD&?xSh{RL|y?mlgxa&jOS#mY0|6 zQ!hCi+A)F4jndXi)ejO1sKi1_l7*r!3oL^%p^#;eA0_W>pN|ZeVK4*`z>kbfC}1#l z18-^@8@1&i3cPsixbX7AT0-f}HWfimD6w4Ii+qf6Op;p#XiPfO0mpDdVDKaPUDV2%{MDtct4o`2Jbia)PIO6oaI(8vS@443wAcF5 zv#-8z`I+0RR~L)5C<@Pqo$h2n0fpZQ0PrGdh!7%+k|ryyalbbiWYpBpKK~Po#oBUt zp;4$*vZd{_{UC|peBL-`E;P)UGiT0RXqfYd@Fb)FP$+6_5>Wtw+4s6TW8VrVEgR20 z8h-R(1g1{1SrVdz4()`+@P~E#0SIYAT*LNlM@i|tB=MqvAPj@RGp*{%;$&<!0IzPyRzTi8ad-w{1cI0{2tKzgFJ!s54(x+LaJ4SnT#(*4w14%3 zSrAd4!$}xuxol~DYdvqiwxT?GWPIbG7bTDas*0FJuxrG%G}kx7Qc8Szv+~Yi_r*2g zt2>tIk(koul)^xKX4nvdAfhjCs88Ge)J<3nV?rAlZfHdq^YvW%;r@}PtNB_*t}c_M z+q}9aE0uJ4`E37@Ic(L|R`QGW1f3*|TP$Yeq3y zSjs~H&rSy)2@N1E@I1yH%Mk>zDBx4WOJ$4JbcivIDXq!U-@de*7kMv9VoG_8D1={W zb~-c5i=sj*^OtYlRMJ^Hv=?(3ndcYtxxA*t0G&C}*WSN(IBciYTuzpF24y8VqHt$8 z`hVT~%~i<^6XEWoR<>G7;>35pT}lH%n3FkPU`Y%TF~h{haOSYQgcUuP_=SwoZjQOZ zQRud&9)XaX8D=@7FQ#)xlOe+3TB=x9rA|DWAVHDyqt?DL8kX`oUe`zcVJ(|JYWHT2 zBdf}FU2cxY<0wgI^3&dF?`#KfA?@z*C~^tQFpR9{k~pS}5c*UjXuxOLY@H&$l+Rtc zeiO2ioGSFr_fB^1R#z4UQJD0nN$iWVwsi9~UQ%h200=3i3g&O(-%Bv7mSm`eMz=MP z1nu(L+KtPX1tm+6tm$blVHrW?MJ1sqf~>#-2;zv+{qyeIk4_xNAta8Hm{3A4p7js_ z2wBXANjx+sYn7#ZM*QjrAB1syWnnFdf^sI0Fy5@M45lMW$a0}t&@)d@_dBERXf|3a zH(bwlT!+$xBoRqs8b_2QVdSqCYqo2)2YuUi8wJ@gEXQ+c90h?pnhZIN)1s{M!eBBm ztZ5vEBnn-}i9jH6OkFLE9P_+){_2(IvRWoiVgP`|iRFzi>x=nu25D1?YXl#p?|ixAQa zc~RFyP4!IcaQpE3tu>{$19a31TFtG>|0r%qmn0&o7eDG!A@i;`)U` z=9N`Z(Yd#e+^tKzCSpLLqpI8jw8_H2e{<1lh;R}~qVp+hUi z2qc7PA}b5n@*|#wADp?C7uWo(&O;m|`7{eC6`5qSD6dshl;Phza&sE!kIi0tOaVm* zGZ+FuSp;8RS0oPo%CEhD<%`)De(noz{mO4M9K5IlaUnOnx~WW^JD;1B@73rR+1 zpIedKfPVRj6~!d0Ft-+@r=1`zp(p`SLOs{bRf?s}jUqdEbyGgvc7E-CQ(zg9jV=Gf z{rVAQF^ppH+NIj*$O0gcSm|UKG6)($w4lgGrX5q7#9*T=*ghFMF@qpN!15CoLykqE zA3^|YTkEA#A&O!>dx=N21O!;iu_Re37qarTX`G0bdvx!997T{}6^;seVen*+CLx3f zvm79lCJ}%D07PQS@(^95g+M?7#Sp}lG6+&i7=|0R9_6k*mo6=s{WE|t1%N{seIx@A zN-2gs%U^G#w~B?!!uCH}?e+?#b< zFjLMft)31?R~8!I+}=SDiVL+rf9=xmOhPw~Atj@;Q(oegbb+={b1BbE>VxwGjDX|V z8Vk5gRmp7-IR}yeAh3V*L?GT$n$2u3XHps8V>zvot0yNPv}h7r!;YFRUEH<|jT{Od zhKyo&bs=psD$eFDXG~aRM3c!lzE;q67R_uUF#XQ-Nw;))wQ_ZGa8Kj-%;s}W;GXTi zt7zH5@e@c{Kj=wn5ecY0@+uWoX6^p*?s_(BjXWit;RUsjDd)=-H=W9e=MgnmN@*t~ zgIQS3C1yD3g*k9aHx*Gr09{?& zc+@=UnUkIFIg+)kmIDxsAhUJ##hvC6%dnJQcr9XxAO&zHrY=46dDJ|l1adj`W`pgG zEskRlLX=WLl!a_j7NqCOOXq`gi5C+}lO)M!GeI2ae5Q~t^e00`NyTw=aoHwGoYm7m z_nDtrYaS3nU#%=YZ60YE?)G9`=k*{8FGe9rlC0KOZ(jQpLWn^O1r*Q=ms|<}q<|7a z!Z=bTS(h~`C@)=qDU-_h2uqY+nA$K1uU8l1BtZ}+^JKy~bLPyMGv~*TxzOdLC11P-r8^80?U;MeXXK(Di{T?d_loANxtDEY; zjPIYjB8LbCQA{sa#kC^;sOg`K0v1D_Mb$K;3;1vlx;_jdvRspDjSAIjcEA1VOLF%J zcKg%!kBzH!RTZ)2f4Jz2AQ+h8Rz#D2f81)Qw^UKn%cQj_Vt- z=_Lw}004190U(ehxy7a8>XPEv-Q!c=jaP2}IYL7K07&8lq1@8t)sFX#4<2jjbjx*Z zKTrjZ7ezZDBycIA6hv~WKu8=o7K9jMVq0z|l~EKSPAG(cfrwII$C1D?VH76`QAMG9 z{Is%mJq|s4Htf6po4sK}l^6smfDA$bE8V_&B^QT0;vSEz9os!V*)_(4$;QUDTD5N& zJVpY~B?(FE;;qKw)ALR?pE(-O{=u*OvKNmRR0h~<(Ii7zqkJvD|3Q0r)?T=@arEE` zCkm7h3P3^u17S#jo-L8EXLOIFFtUyx_Za8=eL=`@-P7G0x1OywYVFQ6mCg32hVA== zB$rdwY^@r`+>2u6XvJ<1yY_Upym^((&i5Wa)@lu)#4+116L-(33_ zPxpH5V~*#02gi*o8#G-pY-gd&?HzT7qanhKnJ>3iUzTN^!~p;b!fdbkE0fcQ#oCg9 z$a1Y*TFi8g+v3`#B!R9m3p_jYY*r8fg$#-`GMPYbf{WQ`DoH6ATgUQe`C!_wk?OHBmCcSpS&G`^=+RA{+-SOej zCTBf=-6kikR&o~eEPG{R`D^!%u3o!>iy2_Bhi+_7yCU%4*$w<4S}dj1Y}gG1+q953 z4ua^QAB9n3Snfh0oz=vrXO0_T#BkkFCZErBC&R*Gy}W)o?#%oI2`mdCf)D`+DFiX0 zgc3jqpj2Q%gyBj-E?<73KknUJy;e@=y(okLTyCuEsp9|g?zgII*Etp=05C=f(2SmY zu~abJ34<6)2!H?rn#56B8+N-;udMNcbwNlPn|n)ps=kFD6NRhI#v zA9Z{%jAM-Pyce7^XU?2CbLK+BoF8PV8^jUGHdF}Vq-`-g1^^%i0SX|bfgK*c-P?G% z5<0Op@)&-eL-C{48aM{Md0@S`rnG0#k3!a=ltKs?j*X%OS>~%(Qh_`B`XioSx{?~a z8%J>zMF^uLPR#Lyw|SswtGv5fQva9VI)O@Ry%euz>5;1(IugPrg&>NPwH&J5NbkX15v3R$g%m@m2+Y6?Re|jo5rl+L1R$a$ z5k)ayEIhj`O{T`b`NnA&MhGNL1VxS!xet>{D5dKq;U||hCm@8<#T*9_8XJN0-s{)D z_|vIu`uffd#0fM@&}!?!Z#f*Y32Bo)j0iK;%1~(~rrF0Fe?a zO5W^^4rdm};GKkW`K4y})S!@~B&EoYTdkkCa%H_-dU}2?Dk(RLZZ>Lm2#%ekp9~5( zIymcm_D244L;U}IW9JLkZZIKy>-4B`CFdH3q^~Gx-LoBpF{Ly~VuoRqVk597ATc3A z4Cah5*z=;DH^H{jFDCyHu^rCev~@vt%}YaqrPD z?fiy2j4Mm){Ky}l9SwPIVPmV7FV4(q&$Qk#lb@;M&!?GxhEW6|0CaHL*|>AdQ%ZaL z$E!8{D75?ISquA*2pM@>$SaIp5b`g zI2T-jVe$U_oGmw$Oi4`_oKc^_LglgbB~4}FDRj`z!X+e{exK?kPl<1>4!_;m_^RSrv$9OP#K+> zaY#Ni>z@ODRHZJhfaEns;b3PLGe7L3jUb2#jbgG<7C*hN?stRtk4?+4Q)!Lm1;nu| z$5BcMAv8%WFRF^s|K>BbFP{s&p?#|YbxnHj#K%e+GuX4N3{Ss!r{r7auYB!zq>bUo98EC86l!I`8=v%?e617)As5;VgE4|Z6i@7sV;NCWlzcf( z@Is2YT8MW}$B)hoNE4og7-IxsOsE$U%O@i{&a2F3N%-;;>-Al$GmDOf;mIKIDT0Bg z>f-G`^QC8AzV-57{e|-7EuOeJYN|Y5%JZMUtR)0IZhIVtS(Q;mEHLQ#Wrf2qA~cTZ zr=Q9FZ~yvQqbwpoN*PvGIN1??E(!VT=f+ z=abM0h|J@fEL%x33qzXFjS}z0;GpL*G~y&NUCfuaHrI>Xd-rzQ=fk2bJ7F+$9G+v9 zjIQMy5Hg5irri^J+(|^8L>?hYMierVP%D-W9WopCLuUpN0|1cpToQ%8V<3bPf}ZQI ztX2%en@(+npvJKnp;-`?6{%^MX<3#yZtOTkMJ$N?i#P9VWb`{Z?N^V_|J%17{OiNB z`@`{yrX-=i>p+gdzA7L}ru_~8AfeRsyysSyhn8i8$+H{lD}~gN$9cwx+5;zuE;n=- zPn!-n?mAxVzp%M>crt9APtzqqO7W7K8=kfqj!ohypVk*wR!+{_!EBT+6#D&soRA=n zw+h+4-XvcwV$M%y(P-4y%Q??ShU+Y))BpMN&porWEc2YK$Q0v>qG5=>(cTdOai&%* z=2@0IKR+#I^irw1-|2BIr?1>PI6qwzz@n}`>5nPI5OWEE<(1XR)a`4%jrX}@`Xw69Xz8#d354{J4@ zx4P|j<1qv>pB+HMdGCldxSiXgX!{e;jcj>9;KV&VjTA(cPvcWSv>e>RN>F`OuyQZu@0 z`AIINr8LzJg0oTY+07fOqBlo<%&=NYUu!J2dqXqyZm-{T!=OJKRWb!X4xYC55x@c` z9QMwFD7?9PxjPv`1k0&hZ#s+;l91%Eb7}|f)Upu9hHF*xmD{UVS1XHz($i7rwAY%s zrs+9`V@D(@Wb);7(T{vD4tul7N$)(0qxTP=9CpqifPUnU%;~)L#GF4dj|K?QhyQ+n z1|WhE&PQo;=FFL!LC*QHI5!EQ)vb&@4$OgzS@e5(H{fZ<;T5KOIWs&m=e|aN0w<+s zM0b{y^KnRj*eZh`Q=Wl$mgGj3|Hhu(nuY?;296_05@ML{!Lgu9vZhKB9|K(0&|i5* z`R&K{I2N9-Lm%)T9GQetPSNsNX*r9_VmuM6XMuY9c$*hEKogc1cv)gtMo?tmb{Lj* z4AZl1h*7Ctj;5pD#Ld?#fgk3OJ#|T1#$B6{WQ7wXD5&YIwv4(t*8SR!*`0+PMjscC zxbVva00Ib~S(H}`{5STUffX?r#tBFWhzYQ~WMn79S-A1yr_xKS6acK{U~%!$gToTC zHp|l4IIsg!&$8tdSJc>?!d$6}>m>mr$aDDf>*8lVl~0uvN&z7tCLpD-XKmyE{;Q_~ zhc0GSVMGcVlMqNKrGWkP`ikwf+<>YAJQ+qkGxp+SNt0!UIdU9Ipe~}Vvh=$ThMFej z>eb@Xf~ZIb4|mh?Y~sX*PYaroBqWi=#^$>3OlE__I5L_$PtKmcdG`2?S?_$QQlCKK z?n(2`>hiOzE4u^Z=gu3X!6Zm=Jj?D@Y3fl-T2Cby95ZB0SpHr zW|APBdY-^>tNGj{#$UX3{Yj@g?2STuyjUo{wg2=lKHqrn)PHm~U0+ZJ6Q38DvX(s` zjV4_u4!wozOPt8{4$rkhy-{Bf%A}spVVa<&`x-xlSo(S}tOFCc&H6KTQ%f4V@4Jm(3DZVMPTof}XER#g!xh zYQ9#z{yBFth`aj-Pw)C+l-49jlhM?KH1Vt{i9^h>naXOR@dCr?7c&Kh6Scwu=9PNA z(eqSZ%Pur3iX<71FR>)2@{wz@u{-Lu&0*8*9dAE;_we!i#4|D~s{jW&JtH87o0!wl zqa15J}+`zxGxc2nyASOvU zTUaeG+}nG2&^~c|SLB6f)~=rRn(ypAcyRR8bZteHL|(uMTb^Tkjv~m*<;G@p`KWuA z5K1ZOPY1to_p5Jizjyy=yEE?JSh-|*4j^=5o6JS>#hf`mI-vnV0ALaaap1>c5J!J- zOQPVyrxtxe3Y;@%&YZa!ko)z)&-TvjzH&#DY-hZi4zDQNs>5<^jtcL6W4MWmSs4WQVIyw_+-b95rTx$lmLtgP3LlUj2IzdF_=t^ zde*&_R}OZA*NfUD2w5%8)}@;FF!E>gdBz+RZhH6B9I@3OIJ5Cr9u*g zfC3VQ=|b+-olD)<&;R+`wNCY_48rxQib{!F zvyoR?U&|NLVHkFgPR;%>My!`;iogVYBSG-;?HggMHEwr1N9VbQVvHZ1-XBVuL?O;A zq7oSI?LT3p^n3l`rOmBNm5R8!{MOO2>AD4-M+gVL&GI6>s38dkZe}B~f76=4AZMy}c+Qo5gfZEq`UG8h-!N<$O*Q-t3KruD7BTcG}0EuGj8+ zw7K(CNojIA&55EjnZEV(=}*4&nV)~{PIK6N=YzX97O(ak%42Y~ivQI+CzW*LcwpFG zSSx7T&32ksU)Wgx`tI)FWD3ak=8Nlyxnob5N#`_I<`al6hTjlfXh|?hB0*%EUE|V? zb-g&22fXh_M&~eHSVTG=PNx}Jqa?YA*vAN(PO$s5Q(nrjX^waN@!7Uss0q0;j)UcL zp77~73~}U+gYcJj4*vY|f|}NTr`fGk^Y&zzs^mWX{N+)z3jn{l+PF;ij(WpBls$WP z^xzFSzi68?&o)871p%sGUh3@cX3IH?D6Y}3t}krw9ZW{fE30LRgk};SboW|zc-Kjm z>vCB%e2|U-Rx9fiG8%&Ajpu{FC*Gue@NSI+h02m0Q>By_B!#WVJTCwMm26RvbWv3y zx;`p2x5P5 z+?qKP4+^TTsHw{0dSmsHKkL#sL^MvE35h}g0RiB=KUu8hAM7^29wwXh{N4vgL6RT{ z;l=VOf(Su@V-SK2Ml6E~C7PoC?g!rtqww;=hHJSy=Z7LMe(BlIys`c6%(gBy*2mWL zwAXfgj{W4;b?m_d}i(H+q?H~uU^jU+3vUxA=YH!_IlL|A^^bk z)lx#}FaF23-aCBo!lheNbLs{j1n7&mUp^hRe(U{ja15(U%Hz|$l%ic*+1h=2@N0L! z@}*~90}%Z7dtXn>`p>`c#iwWcJi}s)db2@JOCNU6o}BLgmCyXyo2yq^qu$guyVGHN z(qAZ43VK$P6oKU_0B+ztI^8Lz^QLQhp?@}LE24rBq?ATU+#Gc(nWF8wo#}wid%-zB z;vpK1V~BCKz9#8eR*=9C6r-91j%AH{)~JnH{*O6!habxwAG$nUc$&=5&73)Nz&v$g z&L5nv&vH1ss2hF9Gs54$h9yM6>U*`TIS8TAa}hh&8h(V{oRmV_PnPq1l+dXgvl!Ap zcIi?-B+o8M8ztd!+ke>f1qPyz&LKo7^n5{*BwaHn#!5l>o6jl#)$@ubFi$%ET21LN z<&dg}<9ckGN#K;;? zD8iT5@_PsUC=B&-wUX1PW{{HcdEbtGYdSNYX>iw9v!|Z?=7T2BAOyc-F$O{q##9yX zXD_K!CwXJv#`wGSE(kzE0gvg6pIXgrT_g0ukOCqI&$oAf_iGPh02LlH2yzS*SrjJV zg;gmcK;oJGj;*LNOqbqx+`n^KE)~QmrYr-`yWaohe?Bnn7=OZ;Goers;+soL%}J1z z#u(wA5i=NejmYqlyeurJ%6t8>!n2ShuidGh@r#(o!&awzcoO;nFA52z8V@-P`TENG z#wxI#H{W?TvK@xy<+LowqBBW2p7Fx4p3P=7?cJkO>KW@rIp)hd{h^l1T&~+nWJM>*@5J_0@7Z1Csb;JbC}*i~>3|EkBCt+0-+|+`Gr; zGo|oaDGfsJ-f%j0of`{loTz?l|H)#mP-N)IbQDKPU^@(pl}xHoTV)vW&SH7{_{r0w zR<%%81$LvD?Dfod4#zA*Z!IoAJ@0HTYoW(HI&0lpT4W%a1g<%pWXtQBQrQcRxX8)! z(%IBai;9>^^@qJEOfDiC#uN=_{^CMbX2MC|k4Z8yO<7^J+yWQcS85f3;Rq!VLWaTr z>YWdM>Gii{ou8tx(>3}-r`PMZ?RaTn>*(Zkj0MXhr>EzppPY0DC#L^WDG#OWz4j21 zcr+L(*|eM~C4}EQK3#=@4vf1G-m$v}Dh|t)a$4aF3aC}9h3bl4$`jy4F{T8~#-~DP zrrjyqY44w$9CljMFs$adVo^T2_x5mR*~TbUTEv_{lNgXFi6e+0VmM-UJ;xC9OLA#R zFE6Hw3yh#pz>p-40%y`WrAY*t5ugbt0Y~{r`|hk4JK}*oZe^@c#bn2e{6c)u_H_3VnNBvKuD~_>_=fB=j)gg9Loe^CgM^C z6()An>JDwoDd+UV!={|et}PT!&$>L%!4GE{G){=bvl7n^XKolpDOuMf^|;%7aJ+ps zI5$1(t?l<7oIJX;uvW3u$2P8hoAs4PXZyOW*{*xsI|mfZTx)2I z)~hQyEfdF~p5F%=s&6oa6{qmi{@}+!ZJzHD(16!uHlCCUf>Z=UP8@=;C zaux-lG>VfTj)OS%qd17-Fi8?ZCX)F zkDQ(vD?Fm#sW~w$YmO$BwbcT4|NfV9fALfKN}8{0pd=>$@2_|JE?!(N-&~LjeEf~~ zT9a51^mJsKj3DUwoRZRdN2kVcd~vr|*H*H%%JKcju3^gQ6vMK!!AO<3(n5JK3K&sq zGzy+EX1r;8XjzUga_F^7I)?N?4@7d#XrALw7_D7=^Dw446@Tusy4wvNoV(nG67ij3 zATa?FhhE!Mj+%y8TS}J-41*!UaTNT{Fa7$o+vhkgAs4e45GGWU@a3xTq#dkgz*AFx z>BX(V;r`d(?YDY9LNKLrQ9vIb7;oL5j3y!T(bbL-wETE6uU@ScU*A5tv&6Tji5ZZb z!n}3pNCGPGoW$UL)2h}gpM7EZY?3^EaysqwT+3z!0bv|R5v8D5$zHy`eA2Vy;gs6$ z(QqV7VjL%|fH{eAramD=2x@{PSg%$OPWBzo zg%Dtb5Q0&h=sKTGDUnOQbnR**lYalabr%J1$#BHU8qtPhGae%^W3rm0F zrR%$$-fui;rewZvm<3H;$Q8z}p(yz1eA=9jKfSivotb)l%^e#M#J!VtwV_t>(m~S} z5i9G8VL6`bQV3UcwdX}a6adIBF6Mf}Q5o>PI23_7w87_YUfn%8qW~5(%?ZMX!@)m$ z^G(OM_!v)ouTad&=GYOHtTpa)D@+i7t_{cGl@J&J8|8e z)3cWCbw@^TFj2GF=Wnj1(q&xSlGMzHBfg6fIRy{`z)1)K%eK?r=>Fq(>EzIA?`}VQ zch)%=w+~0neNNyrwFc%C2pERtC`=$??e4yH{Qg2Yt*e3}%8u^`VSL`3w#Jsja@im( zRC9TaPZByd9SET!aru;7&T0svsqIbe(DakB>GV3SUhB;90>CM=@xY$+VH{|>UaT&0 zS|Ob;Wi#60QEPo`B`foeWfxO&S``Wzxtvp1Yq_khs4~A?E!2w{mWfMQC7)LO*do+l zuhruuI31kTGQ~=^Bn#4B>+pQo!;o1nFBbH|%yIHs;h@#By>Mpv6U!Y;4a4;_a`xWt zHULak&2%RtMG*37nNSJ;Zjxo#q;5if! zLO^Lmh$aZ1y|nh{@7(&YKJ((=e(i-{`1G@%y|l4f$gvoA3^OL=k1RJJ1i#+_fe?P| zegYvx7oYKcxY)_XuYB~Z{l1$401!gx!##rU`mgW$1AfoF{i#SAh7cwRg>xln&Rl4i zACw=1a0b9IxV)8aZ%=-}J_upx&O*e%+SQyn@Ip798$}A1;NElI;L0Of(duT#e@}ko+WYUnl>*8dNH^8{OwtP#EN`zp`I=lwqAI~x9ry5zH3=>N|RM} zHZ~V)S+2O+J!?(}z16xFdaf}s`VLqwh%c@xM??R;6C3klrjY5MwHTJY7#Kka2n7kD z>m}jlg7nUjdpZhv20`$hu?!GI36%x(+NOFm4Dant*DkN<0y3Sj^>lat-u=>IeR$S# z42$7704M|?Ou)^CG_n#7BtkX^3kyl-$g;e?O`09&Tkja@Sjm>azxV$n&8Fd?dH=~-N)S?-df4mp40BP0Ptdu@j{`5xs`7fN{Egi`o?#os z6je%zJ>yvRdKYp7b=+H2F5fD{DcsUnMNl4xm#Cx$~`(d?hJ=JgJBdW z62~e$H+KD{LY`%D9QkFAe>j@FTq_>WjECJ`zP22>=1Q?PiNfxnEeevP>JN|i*V3Ad zp)ICs3ma!gJ6j^^*%nSI{oeTh{O5lDFFyb5R;7M*VIxVBcaM&Fj%!WE^-QjoOX~_- zPnCIw8QI>;cV61>v`5W-R^atwb+U81+{hXd<`Q^yF-H(QI_m-mS5)cTv?+rpGqSaw z2Z5DL!{*HPN%+EY{aS6|ANU_WSgB$4`FfEd_pn)!v4pmGqTl$1W1 zbk>)bQL55!AE!$h-!{~2F_SM2g3wj-Ka*p9#Q3=dRpial(cNhTxa(W@3F4jtnC`1fv0Y=M+ z>$f(;n2AFA@koyXz%bacT{?Jj^!V+fH{Cuvk+}qrcx*TfLJY%cg=%4OLr_F(_QAB> z5By=O?0e^XS$kWAB$t*cphvBlAB4N-LqAGX23^0r7zJKlRywY$vPcqnKZyEct2s2g zV{2sCjvIzaLJ8$qEX$I>A{@IsN-7I$x+2IZkfEz_iHy9&x5|ZlwZ1g79 z;p3y8A4Qc+{&Hh&=Gi>Y9yCvbFo;M@2w5yvHBqVOE4ft0O}tns5>--C zvbx_n$!Y1!_4TQ3_+b!6VHigY!U!USAj2?#(pt83HfU1-5JcbkG@3IX^8PS{2106= z?^HH##$gC3{WzKF2WSugK#~|?ENbalzZp0N`oThP5QK4(V2pq2+NHnu)1UtvFMsN} zm4%f;uAI^Ym=Hp~UpDldIdh?5&YwtdenK-1l_bRIIzM1+0)zlS=$WCK6ZMj03|yMf zxijRCuKYwofEUrVlF&8cC{J~(rxZnBi;_gglF zC|4?7U0LYy!r|lnRc6whM4g$>FbqN{@O_r!ipz`D)s@*`xPO0pqr{(%f|R0aqHsJM zats3ih$AAW1xl%JhBuZLdNX5eS%8Aoh4R3rTpY-q)X0h7&+z;aL=z_mSp9f2X|L9iYCbebBYD+a-r~7KlMD%;4n_| zs(Q6vyLWPOJ{ofj)0s{Gv)gz6*2|y!FJF7@ufOziHeWdDw4-tNbTsiMQ?-zjG2l&i z=qHyhl@`-F$1;xRI|*3Nre+MsXS1@RW=gq*BHMLQju+QA)~_usOrp3)u**q}lr+H- zL0IBRrIL#=>+&LxxZ0JvmM@|>L51?|g{AIvfK)wSt!1k@UX&50)x}Ml7lsu6{9-*( zn6~f1(BmYjw7SHY_KGZiYdoclvec;Sias?RMM+peeEPw|OAECXMeV=;!QRwt`}XeH zaPOcw8O`KO*6Va|=y6FLTP7!prZF3IT~4WeGT`Q7HH=Wo$eA$k2t{cy7HGi_L*gSqbxMjD=E8Q`AC?#F1mrghrtkhCv)f2_XnFw(lCQ zyMl9=b%uRpr$hQUi$o>?g`*q-YLz8{7C*)WX5u`x3|qmn5U(piNUvs${6$wf&_ zDY(3_`o%Bcv0*>m_r{j_mG}4eTLV?%E-zfFWovKmyss;YDoY&V&j;;Vu3SiE*Q-lW z5{-d(`Q5R#zaIJ)pm#^G$ zeRsEg2mwf|x?!6lFWg$a{K3&viQ|XH#P(f`P*zQ;vdS^6<-1`V1yNW^=MBePEH!wR zJ7^tKKrzPi^}{(oRG|SCZF)wS*bTDn7V2=L-gBlQoQIhZs z^MCls&;0Lx;?<3EfdW7%jR}d9B)*txQ_3^UrE2N<)kQyyAD*|-AF{>;La+k%Xzn;yekB&}~grNCa;GF-YPr{4vrSBKSbg==Y-+nPS zg9QI;S~15AN>`MV_xcE7?u~sX>Tw%Juj~=$>|hH65n4;&ul5%9sfbgzqKU1cBk=`fB)6Thcl7K6aYbykM2J<$CK-y zc`;Y7JpTGSn8jOF_2HRyX(f{=nFn8aP?o8{i38Kch;CL&*X!~>_|?OOhI;k0+OL1L z(Y^%V zcY8Jf2vX{~UTLwBU#PjJwg2w>f$LGkau{NSoFJe8Xrd6t34>AK#ehVis#GMFA(TRd^n7JW=F??;|LCb8>VM<4*9d@L+uix+uYdIy>aXgO zkVMpr69f>1AV>%RAd^;}wtGLdzK%5onf9actZ6w4%Y;d+CJ|3!SIHt{8Yi)!X#JDN z>2gC(m)~ypE<^iPDVxa^&PIb`L7TXAtuE+_GB#!mLS7h39A8#d&$b{hs*-rU)>to8 zW&q_t8o!RiGWe%AR+@uOfYxatJM?@}mTug+%ry6I0O4v{PisO!7b@ACzrEX+0oLW% zgB-`Q$DR1br&Qzd_~n%)xmf!0-u+iEU6ZiKb6lpd;2PGMVK2dGmP}=dl-EB4tjrCNq>>8cs&i3jvpW`|H3FZcSZ~uHXwbz~9-9O|%c)a+` z&6tFdO+1TwBKPJyPYQywc;iz~_RssfJFi~5RE6-p2M4b|-oCZ5Xb#5Rp21?=*+1e0 zA;RME!>6(+q(oNGG=@da;Ay(Bi3IiI2?ity!%)uecMi8@4)=%lrDA#8nC11%%8eIA zMUMlwd%Ua3Vi@=_rB$7)W@RN}a#c}g!M&X`*LUj`d22D(AG^)|ETJ?A!qL-XDVy;o zVHP~%x?R5=9qh}V zBzgJjbN#`vQZAi0+r!z!cHOnw;z9cqV|;aabEkDYm=3GiBG0f_7S`_{ZI{ypMGzT; zA%KUSW^>qID%P$pZRWJ}-Mt5(m;Tbve&GwR{l;(n?mzs8|I?rSvtRhRpZn5xC0tNS zF1`*zXf&Gq-M{*-`@ArQ1>-7*q{@>9eL57Cg?>isw(@F(tiA~!nPes8HA9r4twbJ+keL)lu|+92_cR{d7k^nLhSc}h9CY6Wt&d- zfnX)wBo2LB*OgJmiMW>6lyu7%RU-r5+)9;~_7kk{L!|Mw-@I;BX22uk*=_w@)1IxO zrP&lg@TQW_@Kwm5^JB}T5jS_&h_Y4GukC0&h8RJcyh*l!5QGR5fDR8z0hhE@GC!CU zZkA9$Bwa3O*zD^Y*5#7aH{1shN{kF*o}-L8mJ{fX*K&nGA||OS$8*FX5JHHdZJI8x zTk%O|yQ(*;ya3gJH{cR=n`stxONbGqvi4wzef_GvTChb9@*Je!`k5dAro$v2y>rr? zsoGbzH4ekq$wR)D%W(g=`(|2SD_D<=ORQhJiTM~>Y|!~iA4#pASLa0r?X z?eQr0^u!9fF`Fq4yQHO7W42VOn3l?O4r3T|LtXt>Z=6+o$33A$t5(z+)%eg1W30Th ztZU6WFMfDtDsSm_fbWTgB+c>5dZp14FeZ%g2sId$dJ(PpL^+6b?cZvq}N)j7q3>6Ne20yy{u(ddSafk)ecK)4RCuaTb7|FXA$ zs;_6KSg4m$E?>|SN**{9=aooi<*FwTxm9oTnEQ!=1Vik`=I-voLf?H4hIr=A>WyMX zQg{~Y+1lD35&3)XIG6aau^FWRLV&PLii55?R0o`Qq*dB{t^7U^wA+ zdtL5<2s6B@Y18Vt>ua$P(oL(}a=IWXH5%*LmP^Emuo#f?_9ZN zo4Rh=hG~;mq)1+|jX)5J0{1NdBd=I`v$(V5jU@fC9@QJH=60HzzO`2#ABe9kr;grn zaP-*W-0GHx=PQNOUOHE*YqG5JipmQLL=ZwGyS(l|1VRh}uq^ZB+Kk z`C6;d6^spa_vxlRniv!W9x(RM(YqBvZd>{{uAe)*a5doZr3yKhx0P!)FMO)l6^z=n zny)r6=HGMb!Az<2)yo$K;yp71?yg`LCyMz}VI(=wwv4UZZf`i@5VDy|0mACdX3!td zOv9z9b-j6GV`(s+q?BIYT)b=Qc)FA;H>v_J%7T2))JelKQpL=tUwY!P;}5K6w(9N1 zMmCiQ#u#IXKqOx+S+*VbhYR&G0+8eIT4tL^Ts#o*sP1FKQ>vs$oFEBe*dP4ahdyjM z_PNEYU%K$D0AS!l#}EDZ>0_qj5XSJgPYn@-n&pT*_tA&$*{xL1 zuWj;gL9C=Bs_Js7)6)~dpx^Cwbs&b1um0+P-rdbW2)n!EhYn3vt93#|fEYlpYm9^tKu+KU zUX%n*5Fp2Oh2_Dhl5GM*0!IchcxBCa-GyclKt`!$lb#?}1eh&p?;IjcMgGfm@zGI1 zXl6gV47=TYPu$zGp=B7JfWKL;nz{}Fz!>wAq?ZdqoNVT>?l z3}6Td01gEZ!28Et!I<}{tNEop&FvCjsZVsAv=C;LbPOh9UjA6WvY0W}@+Obr8y9i} zf#oodg6|u5U*FcU4f6hJwF+D}EAsC8y2!!TT4Pd51zECmXzx1JwJZt%$KgszIgNcL@9ruXJE(`C{3LxuPjp|OB^~A_W!SwBU1sdO=x4J zZ_OZ!4XxDHM2s!lp_GjG3^lY?-7-ji+Z*mmPMpvh#dfXKs^lcMDbo8KsP!-QGSwzu2tS2_a4(P&KS>uiJ7Q$QT7IpU+=7e=&Oe zxZ2c~Hn+uk;ZQ_!g@VK(9h3}G;0+3ATkG{4=sGZ-eseWJYbpOrgu1yVf0|0nl(wbFXa>a+H zb{EfUjVj_r&TKC@VQXRiL&HfVshc{ERcpgZU&yQ#ec@P7eBHa;enRTbfBIh0#_oZbq!JRiR2v7pBX z7=Q@H{gHaRv0KPZkH+J1{mB=y)n-AFI8{dZYUQ0r?mfG3ZFYU0!+f?ZKX&rIM!Vz| z)KqcrYnNX9&|U9hln}(|3fu0UlunfXE9E9=$)xo>Zd>br7wT^83-YzOjYHNee9#-}%KmDR83XB2Au@OT5@DE>o z;f3>*GRJWO0pD-_<}Z$qkNoh*>sNsi+<4*mGYfB*93>#8a% zihA$8r$6w4M-LsE{CEHEXMXM1{)=f^mSs8)dG^_t|LBkY%5j|ANg0H&-PV0Rk6~CH zaR-bs#;B7*+qO+9gAi~W*J)%hO$$QMnHwF4AcO>gf9*Ejww>ED3XVfCMz?VR#+YR} z2tkC9;}C=(gosiK0272)bh10L5%GAmrzhcZsfJ-nl87<-!WW)=;e`vDrnTET&*N85 z&mn|hj5<6B0H7f7x1oeiRhi?k<2VpPgfL^2QYHxe{sXli-{U@?LsL_O$zWD5P}ej#R5K```WdYe-x}?A87cYu0sggx)UGuHA}kD zvM`6fx6TX4B>DAPVl3c^$Y$HtswU$04KLpg%0P%a;2%DISaGWxv$yg)yVP+g=|B&V z6L>+AI8i_dF#xIns($zJ8ULOkd0Y|}M9ksaz=2Ju00_11M#~_!JrY75Uii6CuK@h?Y^~zQgZPo0txQOcfVva0l2y8?{6ZG>h?8be(o3UGK8qaKBI8@k4 zYt5!@TB_IEt~cgiJRcqC>6@BRydK-M0ALcw`%ASS561jQj(nl|f^It95;P$!Hpzg@ z?mzC&=4#73v}R(71K)CH5Q?H;Xof@K!MHdQ6<%I#mD_~J5P~;B8BB)-RPL@(*Ugk} z6Y%hq>-u&Z_w;JntgW>;L3~}(PYD$yp{3jA-1%bQXy1vGuGH+RN$WZZxp3SkzO+&~ zIXpNPcQK`c2CdpTXQ2<`IAwT4kOrIEvvCP1rKXHCt30B{1&IyD^l&C-xzS(GtJ5IXz| zjzg7l^PXelo7;u9VLA@$iF<$`)f$bC{VW0iFf!89?^BevX+i*+hT)Q=fpGNN)=sKY z+sI%3F%Njx@Zbx2Z$t65%6tFfz~HH9$RLDAFeJItdbu|dPn#x0h!ElymF}Lt#oT7! z#DwDZsJ@WuAE@Uo)lDPGprPqnyZtjW!kK>EcCee-GnoAT+3L;9+Erit+1cwDf|DbI zUp{+&CXsl)T6IiYqw@2s8y`75C2$;%@m4Ya9 z1J5<_k9NnN%;Zs{Bm(b`-+TInO!@qUi+3hMo{0mGuVxDivnLN7!kj}H4SLk3W_A?G z0b`Ug$Z^d^E4{VTJ$+#H%1zPhm;6IYp!eF>Kbu~>;$OezkHnj$J-5J|zNk%XDI#|t zf3#UG^7+*nKesMMW-T+Ft7%r1Va5OenB$3USN1jqSq=A$ zs{ZJ1YHf(;Vu1iDmxPeV8w+|wu8tr8ltF|r_sZSN042oInw{s&fDO!X6}t0WY4@I~ zlMS9r>(CSJMuJr2xI}kbeTHdvrk;?;ci;5gk6(QJu9@(YFYij&)f@5{mUevf z=)*@IK@d+5j8659ZsvA9vWpP*^8BrdvHm-zCKxeiw{A@)#|+EbDx_L^yRB;&qNdii zm}9hUp5u6qi~5p=umo;q;EFioE0cZ-?3rcN9goM{*>4snBt?!HL3<=CZq zWvqLcF(wIoJQVXPZm;5LXf1&kD5Z=sh#;jDA$YKFJnZpv5HkQ60G4gLWThvZKoBv& z;J#|ne*7@CAsC0@yY8Hzj6U(gyhF)bY_i}GeCO2o!DPH;n)t0r9%6(n$GQK&$nk;R zmsZv>#_X-OZKKy1K)g~l>3o9_>gs}9FD^sBMF2MA$BH{UtiyLxl{na?CdRF zH-6z4e)j0mX;oEfwPpuF&@_E>bH}!=+YJ+P zik+Q5A;jnNOixb?4)$4= zH8;1MO6}F_4U91%M3Th2?>^-?_N`k>u~_)v!2@2eyHF_Jyt%lwwcDu=_xC5q#)df# z8-_VPKK$sT_ZJGK)z!^l&_6RXxwn^FT3YMS7YLzVuRD>59ylkfV5b*2ZKVlm$M!E+;Vd*-BMNl>mGlx zVW%tBJ0{&>H&<$qVtOys9p7DUVGg%z4J`7C%OxvnW^JSQ-~q+$;zYrpE&A)N#e5zD zcxG&*W|L6By=U10l|LS{Q)|wpEluomUdK4-*hXT3*EHkgpsOn^J~Q9YEGl5g-f)LP z2uz2C+}x=_bzx8U$hfCVclZ)s=sTv= z=~GFv2wPP~bc?DF&xFsdtXJ9&hY_W$KN3D1@4utF_l{A+t*EP;?Y=%5N{0s%?i16Y z-+#8aIiH?5=-#X|mx{eu(j3PIG^oIY2hZz)(L?b{zPPo#fiUjmE3Z2%LLrCXZ8qa8 zF9PN!qDzr(G~r5ucQuOY}|gfJcrCfBmt1W*73tw{{6wm$ns zN%a)AmmJFgh;vEYq3Eb(Glu~P7^CFwUVd{ozEdhcarx|WCikoFeGf#aoX*@cF}cP> zzFA-0TK@H|<)}Ll^Lxj-!ah|FxLpm+SlCS;>+ip{wbUq8w}{*fC`lJ@GIV`4J-?X= zMEys{SR4H-E!J#=vK!i9QjDbzDktE3x+y^-VhY0WAx%Ca}CGUtU%UTRl< zeZ0pj3XHOcpfls+rw)#u9(|77ft;u4OhlSGG(TFf)bjhKFD7!?r#Tc{Nx?XN_s?n!dEst8Y6MijqpgZD? zdUBcE@eQ0b~F`03iZ~ zWkWcO?kMldSf)7=j}1oqBmP*&U9K=%ncD`5=d7*9Uqum3QX6@G2N?)|=k>mGmWOppv z1`P5XH@~yOBW^RFD%Gp^OrID_4*l(OUl4eKQ3fHj9J@Etb?4OarrzGpr;Ck>B#5s* zqfp|-rl!~1&FO)0_^LiHWk9oaz`*_rxF0`gDB;`l-T`Bb!|>hr9QeQk)3!q(W6#~l zeAf&Q0^m^UlBAP^eQ!4zqyWe~cY3)0#pU(4&#eAty!MsbZ{T?j0I35s$goJhWdZ^cYl@Vg+Khmzx>1}{>0@{d_M1Q|MvfO z?AY{IzVeM5H|E=I?Y{d?|JHB)a(8#UgDhBd%0iz)&G3y z(yVD(AO7%r|NX!JS35h~mSunFL+}2%pZl3led-^6>6d=%%$XB^@CX0-i6@@=#b5kQ z!?0}I9vK<@jo4AYh$8mIBFBU7m_j`Zz#V>wM6ovigZa>~u$AlnYmrF5C>-zPz zdcDnYxL$89FQ@LfVz6Z zHsn6g@WZ6lIX3n7DU7gYSr@(!Z3PG+u}Pz-`FR8(4EA~o8}n)BQC1moR)5-A> zquBxgsD9tkhaYHH>yAwz1e8*}*{bD=TBB*3W+%6BC=iA{LjruE+*T!wI1WKz*z9PZ z@?SsPJsJ}&hdp}O|M@G`|Lt>WfFS<%3a+o943r%oR9zw}x5z+P^vD=P_!s9&ro$vz zFsco=C#iUp%3f`~V4WOPp1f(-a)nrbU#HqoO7BhHb2^lW=eBlky>J#HRM^?I9nz(l zKXzb}L9{}wtMdyd$H%+8zJGDoOs?77XwbQxrsV(?0}H%flz{+<1o2eJtQWW^Z#4*^ z!kgQ00^4CB7k|f~x=}C^J{}?TPE%uR&R z;^l=ssc-D)K_j1X3;Ls?kSk{{Y&9^#gp#p%;^QBD|2^ZQjsuSU;>k~b`T3XTFW+%y z;GOTpF=Cv(vb(WTc1f7$ajL8ZTqug^uE7kt!*>C*I(qcnYHWwSWml_Czc)?I+)+Mr5omnk#WNz0Afa8xda{#OM+Z#G#O(8 z&;QNKXHO3H->S7gJk^z5Tj&jYQ;zxawVU~TDd-RW@9%vm5m8R`552s)ypZ0DczvU> z7{qXWb*IwTx8BO{wrI6h(+!&wuu-sbSF`uuckqFUC{Ij|6Ym`9+vJtm>zmDDokLiJ z)S;9Yc*kfJ8;#@r!#9_n>j?xUMQF4eQIFddN|=pWWv4uF$Xm*#VY37fc6p<yi8>X%=<=&?yibPbM9a2)a#D?c(m z*fL4PLC{t>4tL~DIzqaF>|*V9v?oc&4{U93HFt0I^n|g`+pIITA2f=P%BE3WZ8DxY?ta4RhDCc@LGCvad&MjIpkBl zswBt#(Ofm}Q{9xYrlxIVQeDCLt?gx1k||@RZF*a-R6f0#+m%JhtGG9EDZl`SFoR4p zjY_k2cyJs+B=7>I1Pj7eVfWVNGNGi?CBDDJ?Z*#DNx^Xlgs{Wde`8B5hta$5Iq)O* zP5}T!o;x+ue`~uz2>Y&y8KG1Wgu!UoCgkn9Dlh;>X|dgKK8MXhQq;) zjqS5%ugJ1=^ytB%q5hA3?4!T%3%|a(nF@shzw#^p?#!9vTU)yqE?l)N>*&#$>FJ4& zee6H{;xGQz^70ylsL^P09QUqwJ-D{E_0_LFhcUY2jw8ur*RTA_zx%~s{LSU%^%q|} zPbsnthY+XPZ0Wke7;qfY)fN9w|LH%RIB{fsef#Rw>+QBS zJ$+ziX7WG&$DeDpTF*Uqjxk`{cClD~;DNg`nfxF8!JpfWtZTOtJO>k z?K}6rHQ^=I=XGowLI@zFjw8F3O0G~$?J-IKga~1TF~Uexl+Lekl+9Ap3cA+pa2}}QvwRtGRaJjTx(N=z-O;i z4V$_|uBJN}f=00#?CPpi^|hQ4c5|a~=~hZ(jtvo1y`IGIKqwJgx_EVSaY6NZ+O@{Z zpLx7iD~CLO*lgDkni(4^^z@xux_NR6-^x`hnsop80Pbmh>cyMBH?%_7gsCFFXHeMO zEMHh{BMdqGZBd4R3!fTNOHC){Dq>uVdn5}+krKKudPe9x)+oiVC8;}AjzMQH}90(nqh<)KwF~5`csS+=Vwr;+8 zof87xqKW_oj?2|*L$R1!mMX1wUpVAZT_|9Aew`Qbv$nzOJEAJq;NA`eJP;5|DTZ0ce_R zy{z~VOlexGRFOH}uuRSy9_v#+^XylC`p#3SN@byx?H}xiNN6{kfBC}s)00WWlc{9# z^2Wx^)b5WRJ6LRI&1SiOiHmpKXCViPFSr$B)7+CR7Ago z+9rq4$WT0&%h(Lslp2H(fE_I9rcEH1Cs7X)HqwhbYa6awRSEb?sVwF>!@_}JqP?@L zRdcr1+8H_&i1DKgSpZoO0*6|FU<|7WU9J{aH+G;Kw#sIxKc20Y^%{J-l6FM;uf|41 zh8bfG(|RdeY_=LMTmR={{de`m6;ILq ziUMCK=bEYY#PDHT9#KP{sAyP(&5R_xZu!r?e7T{S9pl??dmsojODonZ7$TcECq}1R zT3Zst`R$dL7p}bX(4Apl&>>7xOR4Pk`UZBdZ1^R=Y_9aelF?{_D6fFt@_!8D=XZ+0)Cs4 zx9f)pA?OPQ7PTj^sgF?CdT;H%{(B44h-}X;`~5&L55-Kx`8ognx@O8 zzWd$p^!vTr+v#*Vix7YiI*v0lGx5n!e!L^QaNFYHfBcWnUAS;XmZd-WlfRjnIdJ62 z^oKt5UXRE9@Wb~5!2aSdKDD&81|j^&N8Z=h*R!^^@f*MKdsnaC`{JMe z>EDGyfmhp4Ug<`mls@?2T}O{jr&4==@CSeK@c`?X*Dh2zH$cYqQ~2>^iS z`JJ8J|MZ{!+l32Pb=~;zhu8n(fBbo$&oePG^8EAXBnf}3YUh6J$9H+ks?{a{fa5UF za~PwpuF&Xc(sAhKW)@>)+eB4G06?>;BZL5WN3;(yM|Pnn=_ z2*XA}7i5loe?2gaF;2v})mqQNP%YaIbi3O%)7A;xhZ??H#sC4#ZEPQU@E!;eqm&bc z^vY%>o989*l}+hwB%jjGuV4gP23^hSlU-7|VsmKIR(Zq>>+Y>7t>rHlbVN}viUDZ-`VYhu^K+QLVN~M1M z(RY;gvboJ2L6)o8yu?eC5X|%LfFCfR5$EjE^3llybK9wRpPFGOV@v71&z@gBI2cSf z;sz0Z?DQQ@G<2iUWB@pXV1yjPVqX5_usdT4=T{mSy@|oZD<}hD0T*|A$i*1*D(Lc7 zyWFB2qoM9NFNpc=U0xF3^scsT+B?!WHRL~ccCl@-iLhW;PTN5$qN(MzhX*F)_~7jF z&6W^8dSBnt^?9C^QjW!i7plwrGfIP?Tl*&^*J$^-P==yLhnkts|q?#aN zNyMR0u-vjRv^}9n$gRYC2gC8ialfajwHpQdgE&!?ch4S7_Vjh_rVAZXu*?g6 z(ReiIF^SWutr5xuj159P0_RxNC^EM&?R{{ zayiyy46|0g>hk*QmG)Le3k7|IfxS}0B1Di>#$#$2yeRm)hGmyW-?%zD+T$lpNJ+FW zY$f|_B4Mk_w2Ceu80%(&boy@J%_Feh?I zrWZ@)VLi*|xM*0sR4$z_l%ihOBfW_aPmJ&gI>bIDu}W0>vyJpZ-Z(gM5PG83%(kO9 z7yt-R4j~B9H@!Ary#e8CJG40z@&p{>)Y=WVD#k+Yq_=fI*zpQM)1d&uwqZwn>OdlJ zbtR1v_Z@Z=of#}u*gG*g)6iQHZ_q8PFW$ObZPhuITqs74~5`a2ID z5=FOZ8JW`V#(EX;{$z9lW1djLW1OiLC}4*MCoI$MjdkzlvfDJBD(oE|9BW&~g{4~_ z)qUUe(WX{E);)M`abDmB(>7I6n(Q6AzOk^pyCLvG%onDN?Ur(tX8ri+%y`eBU-h~b zS4(e4eWCU2)<8Tt)i-uwdDf%2C}TXw*^Y%EG#z_+cO&W#jrR;Tw6-G3K9?s`E*l_^CAAaUsrr3}KjxyF!f8-H* z?Ct~ayML;qZ&0eWKlSwNx$9e^%lj5{5(J^hbC%(J5A8n^|8`Xa8OL!`Q{x!pZ?#&0 ztycT{?9Kj8Zfmv^3i&_skss;min-mcK)`qG*v#bQC_?DjXJ0T36QK@~f%*O3?(PJH zuRtddB0`*JpMA-3h%8H`Qson$_|rf7qyK#B)RB`X4|zQ9r=EKL3txCrk_1(iqtUSA zIA8d}*Up{0?DP2uA?MCr{^&>lQ+IcKettz1#RCUMd7i(1eeTnr{$e2DXN+FDbnWS< zUpR1Jw5O-bJ&+5A%G>F6VFP;k~q6h9ig%H}jK6mA-&%##;f8Qq0 z0E&Rt3T9tO9EplI(mKzeD8T0yo9~+TcKLV)7?05BuGESxN5F3)%n1RY3_u8`lJaO& z6gb3V_@&tzhhad)*LK<>hbRLG0stY0AjJIU++uW~UvJc#K(-~%!|xbftjmUOtX{tE zICiKzp?JN`YR%MiOVcHnQY#b{f#1v*M+Ws%L+<74FZ55|OMQ|oExR~Y(p%3juJeRG z7`pSZ>4TRT$krR#dZRChkN2zRw+#1)fT)e$jDFnlnDDFIox?7dgmx?T)orb95&=U7 zaHKD}F+2BdtUm!IBsMfSH5}ZWpI^#bs)(k#q!*W)3Xd#8e5#t1(EQxl3huJ?!t(C+ z!J~)n?(XglM;yjFUXqd^X41QtOHJPNBHD zQ>C6Aj2@vjF0^MgAar~o@}l9^6J{}uYaR=C@i?dNW8aa zpntvCnhc-RTUsTbPjBvc4N`BkclLJ7S`k3ZD4`5A83Pb>R5{|&U_?=JrD~)%+K;$< zdSiw|{`2LVv*r4oqr*`3SgBNtQ$jxy>BL^(+X5L$Y>Qxq{NbLllj zf+KytuUy#F2=|#Q72CG&JA7ON&3;u8&Bk;*+6?zwt@^^;mElaz(&1X5@(n$@JDQj1b11U!6;LWyTCw`}rCSoNvN(T(+me(IDw zZcbqR$%MwKvg~eKs@&Ck%1tj^xJ9fw_WBUU(f&aIpkYwucSd$KRVK|m;j z5Xc?L+HzZM z8HD-|OtdOhf%EB!5s=%KY?G>P?DGT1;UW=bd=Rk~D`vmd00v^fhGZJJ^L|1sQp^Ca zGCVm>a}A^l(BalK67^Q8f4(^$rFusb1}7kX7bp|-j-%)000hQn-I%!1kBmQDb*_;MLjZf zki%#_vvY3on#l7IK~<9Hc9zf1Up_W69r6UW3u%cL_DK!<@sCb{B$RcBy+84;qhtLM z0Km_G==2|b_WWLSzxCLy)Zp7GP$7gGjppzF{+})_t;w>~F}dtGHT;`@^HXQe9RIV~vEm0H+p^_wB zzC8QKfBZKe{pkOq>v}d@_~a-5ln`p$WO8yW81!qJzOb+&%W_BhQ4oa7m#<&Gd>v!V z^W50jkYO07PanH+;~TGP@wo;7Ij?$zkihFz6LZK9kg(H#h?ryr%Dzd)5-NBd; zg6+0unij?gq5ZPqethrYIHb{Nca-KtQ5YNRwk*3?tYXaH?r?hDZ>jJgnzh-lzfqFxpOhG>}=YaQwcV_;&->P5aru_|)~UzpS{_ z%=)Hfnw%hf=gw-%fWo7fS6h$Gcrtan(k2Rz&Tq7TiGgb)E@o7AxgL6%_$6H$z(A%yFO zqoz~Ut)?_E!HWU_tWhev{NC~&uQywIyXA|7i>b6`Q8xzzayh8>zr3uk7oWZ7p&xnp zfs>`J`JyI3h#KwYjeO2(wh{nL_4YsLwj|#8`}12BgPoj2Z(0(B5LgcIE8GL)ZkL2- zciQtAgHa#~oTVG1Cy!L~B}3OShrb10=~x3ePGW4t=W}uCrKOxLaxm=XbelF!Mk$pz z{;|WO7H!^IFI?T;Jbl;6v91JPsmaOimzp)b#7_l+mT8xpxv$Qj&(&)WOhpSV=jKA` zk)ytvgy-{CuBuIs_K%DXePeF*psTT(XBK^>4#HR`V|!KZ@l~!0aU9|}gs?`PBz*4a zv5`Ogsh=2*#x&C$jYYd+(QO3hvT09{k-W3Lk-2{9yd=qt0mrdOC=QbS9HXY8cgk4+ zAqW71uw#ZA@wpgdg?g)%vfpv^V6|y0n0q;!znCvW0G_%vcd)DLzLBAgTHCTL-E0C% zRDZ;_jCQr?@<$kBdb7&$0$>b6ZoDfj87mhnUMdA~yUc*V01UZZYn2uQ^yy6Xp#z7m zZf~sRGfiDP+&`f5;#NKn89UUQINa0wY#%gUZ%?G^G173K=d3U3!1%o6R9Q$1vp@}e9>aU{D04t6J# z8a<2{lp!n@7Q{$6*%gC&t1a3md*7Kev7xnU^;~wVI6U3AeZYrWL3b>uHx) znx3C+W0eFG72A{`@(O}Y*;cc?Yg0dl7juPR&tz_8(@byh1HFY*S_Mc_+-b-1D*}d; zAmB}gb*EY90<}UWb?qf2%ErY@UB^x|TTtIv4h`D5bZUG4I+7Ke5X*LCpC@_I|5Nu& zNG|!cPbdVyVF)0KX~8NpaCuUuaG%GYmrT#^d{Hr&-8aQlAp!S|=~Swk=~#X`AJ+b*RScGey` ze77t}UBM`2ED?x#RW~Kn73%4|r*}TJuv^|a&_9^3)G^}fTFZ1S3K#%Dw~USK&SEOo z8%}Iww{7CQ_l}4D>KmUgR7+#Yf!Xy11{lY2lroz*wqy53yF%`OL!6bp4UrQp+Zjys zZH?owt~-Jtbc9+uz380- zc3^^z!6ZURRb_;bVVIdr{#CgR*s;dUWOA>8U2IC}s|Nubhi%&;gbD)B^Sou5Zza!^ zWvP>HbpB9h@F``MWnqjJMY>%D=|B~X;ZAM&)dYS&jo**&Wn)Mwfe==!&6i)k1tC;b zsi!A8KHfVy*?<0gtKBv&%W=DrEDM@uzN(o5Wm&Rq+b~SV0EA#)4Dx@%pdi@mDQ-2s zd(Yn6yrnn}7dC1=)8XyeLSj7V4$6&^#tV2KYWU7RqX=`Q-87>V^E@xS)lwK`Y<5RK zHRSs8%^CoZN8qcs>gU(n5P)*q5jiB_H$xd1U=YkC<$K567@=nu>o<3G%VF=H@!s4u z>N@2Rv>k`q4us4d3`TmQ;Rqi!U@c#W_V=9o+?P$$G6L$UA>~q`5FhH>y1CdWS0X*# z9M89^HNDvmCZh8W=nwH@VVu#?H!{wVf!>N)_{NoMkBoGsT+&jT0ZI@?JVFKoFDo_;3g_Ws(V4?}}eaRS|?f1(#b+r<~N8Ly7GW;xNWKJtp2@fD=VU0I{HTIB<9@o+!6k z973994S2lXYVGFpFC4mOyj$tIxmFNG2_ggmV!Jv?GPy1*@46>3z?R7etTDT2VGQdRZ3c;{H{Bu-g$fo zL4W|Wh;})@*A@jViSEG>Lx+Q1p;Bobl?n$3dgHAE0T2QJ0W@t}GA+`!m`nO*62}09 z3{vRgWz{a&)rDHcD-VuElcR1^bn2SPs3*ivNd>6q1H9B7_3e~ePo*-$9@lulix?=| z_7&X*7>{^8U2f%Az$0U15Q-ta!v$x3;uAFJ4}>+XS<7uhh&Yb79or?zK9|pQtXwru z8RIc``*!MBIU1(@{OtO0GAMGKP3SkStliovjvqU0wAxy&&Iv*%hlT(;l(cm#>Shy(iLz5vVlkvLszuyS153jdb-N9yl=7KNfX`hy8u!R;^Gid)=O> z6WYq|MBE|2?6w>SLg)}jK!S)}l!3u`tS=f-MR!woh7$v-B-xG=^!OD~dTH+RV4^4H zj~KRrsq^8x9(!s2(#f%zh3(a*)jNwpj#Gt%ch2qF$lob?cEN& z^=;K!c%ByoK@f!7TWdn-53YpH7{eH~+xjOy@u$x}|FWvOI!chDD2Sr)x+V^cu_y`% z!PlP8ZD~ozagxczzx}sAYumP>C=(N-Klzg%{BQs5{}DwYmD;OTtFc(5udn;!#jAoK zFh&WX9*^7Oag|DyR!du7-=3K{@YSzg|K(r)Ka$C~X<8kSrK8|z+m7Gwa~vle4tPAC z4z7VQ)^#J1h`L5AcuQH-ThXaU91qErd7#n68_Pi`!jYAw?1Ves`mx>$(XcP!y?Dszbv=RD#cd7e8!w)C0h(v{NRn32Vychyob86XEu-lbgsdP^UP0e;p0x{gj zL%++)$8i7xM%i0L85jT=ZV9OZ(rpR=a7*}&M}i%Ek%6Oq>W>`p zW~%mAZdO)vI$+@VfLd-^3+WaQ89;m}5f3Dy9EU3n6F|$-&B9KhUaV-fMr^P@y|Pwl z(~Vqvrq8=%D1Z`TJDBGnLVB}h8;0cTIx*;qdC?B z40dl^pVOO7he4i$j~)sdfcujd7A2k^ibfLQ@Mv$JJe0e+n`Vq*gdl{kbWAAt!zcVE zp`X82E43VjM+`v6ab&kE(v#dL6o`5z;#~&Iw{+;pU;Kz!Nv?JO^Vc zZxdE+JA{(E#>XwkBBY{7y$?_VTrty1M+5{Kd03PM_?F zcXzMdS~G%UcYWjog1|#Y?(`j5dGS2k+`P1#KRM>xEEo_%htP+(rmRd@kLz^7YnqC@|~T)@6>fZOa{qDuH-Vb$|8j zHzF#2V0z|st#NbxR;YU@*gYi3?%l;pfU&k_dPMHA>F5g!dz<-|OVI13z2w-TOnUj) z_-K`LA4v39fj*#xEyLw_z3*_$A}3H;5oL9FxWCkD2LtM@z1{IxSABD{-fRgR_tM2H zz9UnIC;P9h?7X8lt|)q{up4yP+D<;@OQ<8x|XG;yH+kkqPJT*=W{2A4w@8{baTKX`Uu?2tt1prQFRl{wG~%A zUmZV@5D!TlfefhJDBrGbP{i&#F!t`zf$eJZtGguwdoLDSxy?0~r1ZI!&#rEq>FGHW z?h5yX=V-ZMn9+D2WPs{Trqx2>cz<^oFlss!04Q+C!;-%@uAN z)HJb8uvynbq3*%4Zqu<(4$9qvD2e>#cC*a`>d>p1Le=e`OvVNXJ<%2Ea>*v42*OTR zg_oF_wYlziQgHhcLx&pWY^}5x_J>`PT5C7zT9ZRur&4!&4`ABPNHWA@^yK+vpGOjT z-m;zUh|e*M-IcY0=>uz5ZyK70InH(*+i}7^|HFq)^oD|(scjcBO;aZT=$3OUwYyVo zYPzwW-4!|hN8dRl;I2MzVyvhC((?7WofW^!JJUa2Y1J+)T|d}AG1NU#sMgm@Sw-S` z#2x4vwr$HTDSMUt-@ow0{bo7t4bQKxMT6micv3U`~njZ*XOI6Co%GVzpTti1%`s6FB^iBX?rR-8FUM+`?5^ zkiuU7RR3tMS~RR;cPO@9*vpj*q9C-4_W8wYA}4(4?so+}J_z7YqOT{?b!qwfR(@AA zjs10PKYkFpP9o3k73zQa_?4f2&#{BU3Ch@5fB2Vw;$E*y!WhACKKLMH4@ApO`;f@pnV~kSv#-@Xg z#iMQ8w>R*wI%RMjwa9<{um8pL^u%+|on2Yk_|YGI>_Z=V@1;vO&z-xR$>b`Px-3hN zJaYfjPrq2JH6R3`P~dld=YJm<=>3yF`J2D|%TI4?>}Z-fGBPkQ(6hL>swlE;JNMmp z=Dzz*-@3K<#1qd@$}q<5w)Uex`sn%dS8BDo<2Vx&BWKQ>ux+xrnR>NY2q^`EAVeae zMx!aq(i_KkZEfq`d#$_fx?^hUsg;#=LEt?e_d^fetE$S<(yC#Y2<-!-`|*$Yd=Wxa zRXTXEA3}8Q+#F-H(<_WI!WdG@Y@1*VTP+jYuk`GL4&w0E>JRW% zT7O{NH5wB)OP0iSdh-FH?6rDqxBrAg*j*#8A3fr^u+jR`^?KW4qQLb8#jdb?C5J~2 z54gQ<;yA5Fv$&gqloTrMK9h3=dA-r*1in$Obd3%bQ@f7stQ5dduMv~2Tp(n(8@6eQ zvec~938hCu?OC2ax2%^N&ZLC&wqA4U3JOfe#Kon(^G`niFMs+YCypO}>Fi|{=tqWx zbJy(kvZ;t70PI$3w@93}DvKQd&(54$+RH4a_iW;57L9m>pE?uVtJ+_>Uezt83Ybs^ z00Wf82m6h-UN4n-NqQ~H02pAD_D)VnvUua{)yIwmE^KNxp)K7xIUsEojdII6KA0pF zD_pHV)O~KFT40uxh?e#;TCv=$)^Z%zJu-Ci;Rlv#Rb}>8c6q1!jHgBImC)d^_qOQ#Qd8GW zO?PY}30Rk0^V`d-+1ywn-qa13B&92rxzsLYASAgm@V>VqWkBqS)Wvb|`Qx zCRy3dRzxXKAVv3YJD0;ivoWuSE9rL7>9et079gi<1wqWDjNk& zk<~lK#s+(bp1*mmVYPZEjt?Ea!!()@>hBtsMWv_NcAf0*X8>BdCMiN>a6(lCQ;rD^ zdE&{>3xa?UzO?S$8p+KB6?fZ{AMa6_o7)J|Q^$Lkpvc>1bv^qTYs;fb5@N%Nphs}s+|Dj-?EI1++N zDHaZ-_OgO1jU79@a`~#87Y_FJj&$|Nf;hjs{ngovx@l4ds_nLJ*$@JO<2Eu|$43s< z+l|p7T&&fQ5qt3P!B4&T`10Aw)BDMUa9n-*BQgS1If-YWwkn2+Ei! zaOr&gFCM@A)9*Qca5zCJiv(Pq|1H&8pZePM^EY?kD{~TiyLkwY@vT(m$(!>(apt%~ z2>Wi#9LgAk&?L@hE?z6t8ytQc67hr(`fY3sC}o}f|C`ETe!KsAi*M`b8W2Kk+p%qj z5b~x+uqo8MyYId;^?I{dtnfVl(n}XV z^r3f;jScKK}UAhGCvQeeB_f@1vA{{p&Bc+nU?0zUi31#nIl6{dl7SORHs2N_%?3 zlaqZ*OS_KaV2sAc`#c_3p-?TC>paiz?Ue=x6Va%DXehC{nN<{NVxm`)gx%d@z24@y z@3;GYA87dDwE2lHzM5@O$`Jm?M;j1^w&7ILt;m3Pd$uriGVY1Ujhu$KeJz>q0s>J& zi1W&X&WplZ=}f{17#6#=XU_B}`6e-K#$!kUgRl5h&<;xfN`)M8k4*bNd@B6qdHu_a zMD+&(UbiRUKQ!#wDcX`%t><%lD{Bw{;y8|NBM2-DAmrhA4sj4Nu39L1!og^NZ)#zg z2;#Z9{KNN!Q<32Aa;a6RDB*CpRXrZmi%t8|9@7n?2*@;S(Xwp_%8lye*uYI7SM|!J zjm-q%9=+>u$ZuY_w7r-y-Kt0#1pug`D7swRxm;y?_tswaKzIDT#}3^}cBxC}ukgZaxC{_7N*QB)Q{$o}UO#(vrq^u~n5~)|!UubN zF|V?kFAYS3M+Sylt;(_f=;MopvM-DP*tt1pG~0yG4s4NLUaOVMM-ER*USBYv@>*ke zy9Px?kR?Ve001M@F|47nkuN{<@<0N&f#8T9F5o>F_Yy37ZQ5+;nYGP&qy5U*Iu4)= zK!6a!9EUlcE>QX+<{Rlxx5pn zABzqg)GRwXak^N{)=OysfQXUbC6_CWie^L=>2%0f*Y%3!a0tmZT!Em0aWvi?=pHb% zdcC-Juzys8G%`9E7e#M4T;aK@fIj@LNAd<)O79g4nNYa*Sj1`+ofj9+ZIy}=FA&B6 zV}{=DA3uh=r<{DDDzaL+BJv_&)FHIsaW`8USFbGQE646VIXN<&hy{yaUV(Qj?7qXpm)6SN{y;OA&xJf5pEp-1ilT%BtayU% zU>BvNQO;esWZy9*ES5GoI80hXyUF|eV(ryZZ71cFt8Ni1$!NXZ$mRCDU8+y++Nxgf z3Iw%=1#EMtQ5>*B9!|14eX{_?qP^mT!_BWglgVm?H1Z{PAl4{tiE1?3E2MT-#=}85 z6kph!bH(CQL2qxwcW)xF)3Vx1Ad^em3~m&yff&NT=6H?(IG?VR(rfKf25~&ZnCC!# zJMD?|1tJ01s^4|z(dyRbcCN}}{NO!9XK!uo6dKLT3qokHUMXf$TPKfX?blszpGiMLujX( z$|2;E#E!}(0nXA+>h2@`vZ@)i{uXTg@z?%tFxJx(HVXBUB#3+EeApN43CC}3uC)!r zA!KfAEglFzFmonXEoCYN06@7_vn>a?p#XUZQBN!}dGv@F4^-QY+{&i3xRcA(=)hRe zPpjr9y?N~Nz{e*Vnl zkvk`knx@Hnxf5fDD~&3pAX_PM7|pKF6G|b36flt!6iFOPB$MGdM!3_jgdn7VF$fuB zswB4!eZPBRKYlRA6HMfBI^X#7FJ1okAGxc)D_|4CVQkyvAHF{K@{KKw5Cq>#V>1JQ zL&&h5KYQ`QXe@eaxW8>#9V?1&hcX}tC7%1c^VhyKJBJW@>l_LQq2KRoG+J+D`!fa< zMe_N4k|e$HXfBuP_xpIB`_2b&mlze9HhV@#4nkH>xJ(B!dW zGp`+amrHr}*%zOB>Kk|5ar~Em`CrFk;lKXt&pq|j^Mb(t;UE6x=;+YB_n!LbNB`xo z|N4LZ;uoKcM#De*vmbfz!MpFi`;Lx4L#h)5GH48fYff1z;gqH4jBPv9&xK;0-47N%JA#^|M`cD4UlnAn%93SZ(9mE`G zwAzd@_=?c+tASqmcRLsZ9AcS@DInSx;5PF*aV%mxlu(Z2Bt=$y9&ae<3HThz{k}UQ z?>!a!!YZDvyAxeu$>nM`wSH9IUfeu;Wz(vZ^_JGb`2k}HV~i1DU?42IB)pU{D1#6} z+q6R6alP55mRZ$k%rA5Y@X}7*Fr3qedwNm1AjWgRZ?_tHy+J7x6gd!37^97Heyp!M zRkCZm*hx+ID z==lw+)^0hJ2$<`P3&MEl$jt8Ynq_`7Z@8_!)IWVd5QL>m*HlHE>6LG$+6YO%^6p1| z^ZoC;@4&IKM9+AlYbT!(+=eOIY2e>n&*WCt9Lt6XA&fei8p2p_wybLX%=DzEUp8Bs zV;Z}f5E(w8dQ|EV2ms!@_Ql(rTGnF<;tAH}m;IzV4W&VOW$>zyLxB zaj27%y`qT)!BA9O&6$gt%*EBUhh`4`>2uHj@iWgtgdaP42ua?QzSqoaJjWB;7&-n> z-@!AC0m>YgFCs|l&irKogP`AIGN|*yL@az_u(ttWDBvq%?t#9pEocRj$)cw_p6GFl zP*u1y6UR7+Z>-O^iq-7aPIWJ%GVaF0(#uz`9O@h9%Gq>!F9CNjQlK(?E1fZ0b;q_S zWyCVoaPLHSQq$W#f#}lKVy;%@I1CZOJa?qOcRpX@i8CDW4~|C1l3@Tqz^(Mf{m)!m z90)}W+b%a-7-59rv59VkAY-7@m8WTzj8s)oE-f!{ty=i#(OScFc|-0%)a8p>hPE;L z9Cb`NFxa1zTNXFeJ;WiqYRbeeKvFI+LnIutQLtxdXMG+4pz^q;>)}AOVVAoiBc*!5 z6Nw~30nYF6E}k$4GuF&`yTgNKyLGcz&J;=zLWp=l;im3KZ&W*vr|l5SAzqK_m0kVg{Vr&> zDV|^6u`T;29zL3_G@iS*(Hrya73*%9$Fi?f$P1$2@p`J&%1AO+v<%Q}i-=LLq#0_p z)F|#O`Xk9iJmw~qRxzijV!S)4h>Byjo3)B<+nl7BCXMwE)S8aSaE0=jeZ#s#f? zxl$s4N&@F~sX>nqB4MvwsMm^Svl8wZ89DyW!9(}a)C02AmR|h2x0h&Q78of zV_=#WQANHg(F_!M!035wYcfRN2Usc!S;8T3XxN7A3((bTzfPwztg~ z^SL~Ik?!F{uS<3v8k(rK>X}N(v}mr@sBxA;ezqZ^e~%*Q%KJ>_Ih=1aZ>6&b60xp;4?^g?QuF_&={9AIF(z;v z0O0X!^B;fw>4sql_^p;78DkuW6N%`;!piycSDMW>#^^PJMkA4+Wtr#CUzwj@ktC5) z_Udv;OttDBO{C>~Hi?i3S&v(kpYinC`a|^Xv zvtDne)7i_HumA1e{=?@!_hnr-I?5D*fENJp?6WWI?PWUyO9<`mj#nzR7hgQTx0liGCX{1CKYc!bW4(r~Hl@s_V5(c~3rkNe zv_u{<`i6_c00rRgQI}W7Pt7%K!Z1d9t35C?NeIbpY*7kinScNNgU?;s4JzP{lcRt8 zxyvY&IC9S&f%kPvF>Xov#^UlH zoqrsuGBmA)xsCOLr7FVf?7KU131N@t=kGhSPPbg~*zR_Ab8R<#^ubd<@(310LWo_+ z(~Y_8&St7&?G|)m>Xb6OUP3OH+T#Mp8M?&zW?j< zi%;E}uQ!{I-g&am7b?KwlTTeIlo6wK@4xu%e`sOxwLcQIsK=k~%`MU-NMxwn4V~*#)bn)368;i0iLWJ77_Kp*0 zcJi6+d?DODEH`r>ykoejHP5fqGzyxc2V<_3TCprW-Z!BUcF4mOTdjLfzVq=*&!;w5 zctN0)%A)Y@!-xO&+yx%OM-KGgb7qWU2pAxgdKBsJzdpOXUAcE+?5o#r8kWuT_?JF- zPtY$p4ucS23@SDDtHq=wzb-bSLtCzp-_5>p`cV&I;-a8(sJEiXUVA*JIEZ*?D z{KrlttFB^Ce^=c$vln+pYQ9CA*&J7CwVS1Sy;xz?4t7Ob)w(}18jAOljqABux^Hy) z=Hf=*%y6ILOQ_qqz-rJ7%Bz*CBdM(xCw-p(^G+PeE60*z77}a#W*=&XSdqK19*Nv;? zI)&IGL{cQb&ubJiF^?caVA@t)YcPQ8nw>9I`zG%=`p{2M>JUPBK`LjqR-XUss2ktf z${~Qq;<12BMF?SxAp?Yw^<1%KHGAVRT@zfAkS*oqfjD%?&fGHQ-^7v@Bd8f9=tn>M z-jl_gf3HwGyLj1h9E=d5MBw=8zVS@8uv^L^2;=^6cPLTQ({X4$@xFX?_(TMfOBfUMTwe9>)s+F&JIoSlZBuKsC#6Ya~rG<;V;jUu`XP!FuyzP*n z$JY~1sG{Ol-MXoZyijj7IgWFPQ)@Rel|sH!hLDUUlMvJ8-L28?{_&oH!SDfD6g!_p z#C)oh{o=)^n_64o1PEBEST)U_8)+d4dS;Ogoe z+m|NVPr4i{6dHE9VwK7U0Q7AG4FFPNkKOrLVswVSf#Hu3Y-#4PiR3?f^vL{L_R~+_ za0ulvdhKG~*<=#iT6ppC()JQ3%8Y(@bw~_h%d!R|q5tLXQ;$qf#C%?xIF>^?N9GU` zI1WO%kuQGs()GVNf2FSLBFE9Uli?9UYqc82*zI<4-)dzIA#65VhGELGu* zMx$xlw#VZVMe*C=8jP_%OscDpzZ1Hf7>4FIMnisLx#wk8OIs(uS*WZO== z-4;bjl7v>P%@}aI)sE<6Z*SM!jICB%*A0)yElJ{ST&7-c zSeET}yKcX@ANv8`W*dcV69|DM@s{Nf!gwCP?#Xf-f-#n5!EvZzm>8q)xiSqQv~4?) zi1qdLJoC&y>@ynvDHlB8*whnM1cj?++TRPZ{&oWMxLq?ty&g(gHQiSIqNECqqRt6; zKlOS;u7FHUA3bs8!JqjE0KhhFm(S}C`ibK(1~{Jgg#6w}C=ic@d%C0jJ>j12a8Gx* zClT)H4#cBsz$d#@K@fI|#^El$ZL&(!v@EMpYc$H0@?Ng6v-jaqCk|@=?TOUVPF>*` z=6Hy?xL-Op=zeag`KEFZ5C95*%%T1;ZxgUvwHyinV4T1=E7j!aaIH{;j8>|eD-?R~ zK{Z>_mUK_4+#>Bp_xK3nxb(_8M#v_lFB$OqJz6%i(Gon0d@O>5pzF!=sjA^rOp_w^m?&tELo_3C!1qKIP5?>#y&04XtK z*&mB+-CXzjZLfzt9^HE^lcLq5tu*M+T!2%OLV*)6I6a;dAf965d5+JKw`jXmb2R{U4CzOAjS*Ao&&U2o!SOr;Anq; zrdlhtnl@#ON0UQwk>e<(5Fv-qrJdr!c2*IEiLS(IE(aK}Y%<;x!yKf9v|G+MR!Vox z9I>!+V>dIv(;F*GHq`}z2i9dWq`>Zh=?js5(*}+=c>IP^5WT5 zMc}$8XQwCatj#KqLOdcS7ujJ z`4TS*;ojb0Jlw35ErZ4S21@Bo$rTPM93ri38%nAt81bEd>73Y=oa*atTYSoaP>@AI z1iOp<&=6E_K{FXK2NJ>Fm|x&H!?emxt74&ArQ9kNqkX;8!?9#6`1sQoi*-HXcQFQZ z!}ht=V!7fDCyAqrkV#&yRBroSN?4WVQVmz!BQTDu7t`gI66v?9-@`lFG2wYHSrZ0hY+ zp&aQ+imF^ImJsG%>wk?9)C@c9lmE?+-jhmmUwr9owOyI)8_ksS3@{FHwqxh(<>5r1 z$P1Nbt!-)yaQDqjtYtQWt}dVISxs+J#@vZ82)GoFt8Z+qKi<7^_4>`rSIT=ikrSff zXt7q#l=4lj1tE$DqRnKTlsp~CKjPg6_ox+ z_sr15XmU^yy@Ro#@#OGCZ#RWaS#Swh=^zCbaRMGMgz)0>^=u`-y0;zm2YbR@rAFoE z=F(bbYb%$Y>L0thdh;_ceVI@K0pvNs>++Q9We)GRi0(5Qz7IwN0001^S&Q^fV4erx z>NQ9ylLRhZsL!osudnP`HsLu$D0@wc4j}}X7mM3VyL0CeCxExCHZ5{orPaQ;xqUsA zZX2dUm|K?JvdAG^YPN5r(vQ#H`oz;OJTt#y*tYOCQHGA#fyd)k6y;63Eo52tc-*(G zC|;Y&x?GCe?Z)4cJ<(~MaJyZvRkywUUmlNJRh94DF`%Ol} z{sR0@iz-njDjc<$*|G(h`+?3Hj53U2ZoL*8_BTsCP5F6Os)0ARM|80~huUMKdq)HEm|j_nY~p^jsk&X@M! z$$n`m)e5?}q)(_amTt3;y|0hQ@Z(?088&q*e24K!DLdLHon33TOe)|v7we>y$s*)A zTy5DHz1k}Up<~&_-E?w%Wck`$Pgv4aHZ2uuT?5Ib%hw=62xGt)1z2X5!GwO5 zUdriQNSjK+^a`l8eHNiEiMJVees2CmclU5Ov`T4!<0{!a2JE3JFUGLab|3^IhCM+( z;N}2;gt6;8J8nsedOiK&@S`V>K6l|VhR9)*F~DO?DTM$G9-3qntX;c~IF5&CEGF$$ z?Yc%J0kw1!vRC%{JkL>vKlRj{Um%Q^3iXD>qfT9dbvECO0ssV&*A04n-0Kbnj+{DB zAYk{(l^E;p?FsB{?z;WmU}JUt)@olYg1v#^)2C{wt<>TQ$6?X!LEY|0r<776ximDG zEjO#_jMiu}0H|$u@+X84L>MAuQ=~{dVZa{_xdQ%~Xs8+q^#(jxP)d|8l!~5qZOk1N zwf6kWPYxb?w7a_>5~poyxy5sf*XJyUPK5lYBL1ebE~Uo z#>dw)>4iew6Yb>$5g<+$1e=iFXk?x8hOUPa1LgFJ*=ltK0#Dw!$ruwkypgF~Sx(+&?iso`~PvNzJZhdV}GiE@ionR4#CL@8D-&c<$blr@KU_ zQmy*KJy7x|Cc9TIUdnGSbd4Xam-Z@qn;g$0K-Y8d&LPXna5B$P!W^6Wyr^C<>^5e! z-G8KK?$U-J$w9Zr3HwY!aLHlVNJQhR-|dOHS(W*3!AHG)!Tv_GR!A>5n(dwS zkjp*T6T4diO(S@-P~FW}+lJj}>x$|Q`>>5+qgszRt?tC+>Q<(pQw&)wUXxVnT)oPm-gpkL)EC`8UG!cyD%B6a{RMVP{!(>r(9B1|F zjnU(WBT1`}+U@YLUhN-Yy^+XIJ$7noBmc!0uR-K!R?F}54MdYm>2+C`=Tr;r6$~$ql*-5wI+a z5Xy60xmi2EboIpOOjj`GmEDtlV~g9Xb**JPHh{3LX;;^8B?3_fXt7>_u%?QVBFY@b zvM49R3Bxoo#*BDIWBrC@Q^syXf|O8~B-gd3!b|raJgJ%b;_hm_-4Zxn7G>Qsx3j6m z)EWdxz`S9b^>(v25_c#O_YLUxD62Eo1rLtv2I|D1W{y+ zVf3whIS9+?jrGglV2r`HsX8feoMAgJE^l1j+V#kiTM`A1V~m-$(=d#NZWy*B@f?pa zefwD*W6ZW4@a=UXznw;-;}8JIcRjx2eA|P6hrjz;5k&g!sUMxq%p2eE#?$Wn2q9#Q zIu3o)M2k}ARsIWkGZ}Bd7;_xb(e3|s!}7Y?c z>yBknLKtH_hnf}unETcDbp5OQ<3DqEcrEzV6;AuO07|E-e&y#J&-=ZQ6{w zg8A*u{>cNxA+52 z!vGMD9GRh%u3fvy@jL}E?B;p`+}ZWEA|gXKRkw8C)VRzEmO~^S{r&kD|LUddqY0G| zx?6Qb9#P61%chhFvM9S;o`5erFfcvcm-GpK>|0pAzPeYpTCK%}y$46w&5BRj;22_8aa|22y+3Wt?RNF?e7glB9bcef*`4?D9bLt zHxP@A4g~l}kGCtyDN>)?O8aVbz^gpQU(AMWwmYU@nC`%oNl@P^~I*Z2{XOPi)-skd+CEC2aX(=*;>1~zH&qL zNBX)4{5%eL0u^^xKA+MmS-}?@4Y*o{k*-u;?cxRLVy)3Kx>e83t^60y&DWbc1e7>V z-L%h4OlSm}vR9CU_YTLuaN&F=TRk(<|HUh_$w+r{c+7>sYGyCBzT{Y%%cnLgby4vE z#x# zY9bcsjdfkVa#cheVPu9A)4XLs#X#n3l)JjVRd4A%k{lHT1R;l@D9TJ!YPIr# zf#|XRa3NPL@ovWQCjWE?JZWuG%z+V+Fd0TA9t>{#d?P#{y@VPEZsAN#Eka z2EgInyrX3f-Z_`IYX7&lQZXZsjVK%0O2*8us}_DIv*owHoD6ZhNcUY(mqv zH9eKdYCwSQP`P1O+E%04U{+h@ffthi(hwF5C^AZr)3hpEwRW>fX~VD}MvCf^L{Sp? zfXg-6JLpxUwY`mEtrYM`sw6ixljpcj38G#s_e_j9hKV>XJ~W_uJ&tW3A3FHRsp)I0 zE1!AxBF{qxAYrWBsP{*c6o7K0&H!Kx*bd253f-Zu6B9iTo$QxH6!y8gqh8IWWGjtU zz2T3AbK9xx>SnE6;RRGTTkW>qAL(`}E=dqtTASlIpW^naZV13c&#>ecWh{?%4UTm6 z^~I9Y{bQP?Z{$+7R)aAR^!n;rb0f38kXkJ_T8>R#n!k8$bJlXKBhykiqB#zBY~glO zH)U)+n+kgZqsf7*YjZpKJwhqZaR30ysL1j0V00_Lt64gL9a0qYscwf--82x~7ed}= zG<;u-28eO1oUf$Usclh886~!<-~O@;jX9=c>XxB>%jk)G>%qF_pgXrLX3^i&NhQwi*3n!C&(ERPMe&vyo zsnJCE@6NsSdtW{4R(PI+THDM`XmSM1Cg{m-79>+beWkGYv*om^ zAmVNrtf;kjDjTvi9E}7iW#vZo;_`LPFeE{sfa5sMYBUwK3$CLZlCH;1|)uVYuVk?KYGu*_BcPUdZ*63C$oBOZ+mHK{NU5)p0kM~V2%NR zF|sWBwJR&FvT-aK-^-W1UZ3LfVoq?du+=nA9+>>%#f!BZD>Z_n$u1GcFQh9E965e= zW%Z8!q?c$&gn}gOE-p{pc_uMDQppxoub(jrA?Fxv!yuWW6N;gh%{($!&6`Hs4n=+K zdXtHKBV8aqb>M*m*@YFeW$Hw0SBj^nho+Al{^D0&n%hpvg80tiA)}DKekI>`M^rB| zcg&Ym)%<$SXqOpd^2HV(58d-Yp5p>B%m8SWGu7n_y#tB1 z4(rABC{i2cQXbTcn$ghVdabGQ+^El+R3%$b%e>qh56z4uN~V48#zq@&AG`lfXlU(b zi!s1qNEx7%G3HR)B3Q{*>)lcRUbCsVUF)gh%xEC$Q>raWDA>*a|JnQRAj`7*Ob|Qf z`g@=EK7D3omapor_Kj`;4FVuQ4#_bbyQ_`WY=m|sg|u2ttjs^sMkr<_#YW7IhSF}# z24|PcSsKuS07#&L_TA;HveMg^`MiJEyK|2I$m&Le9L|6i7*2k5BP$~#^X1KZ?>pyr zzVrRQZ`vJMv$prbbERQpxxU{%(dD=hTK0c+0`oT-x4+F8`(gP4_%Tt2@Y!4JPp7y%OPx6LeT1Lt+&Hs@Jij@Akp>@RV`JxIVfne4 z`Z>;Vu4wr2CP(8%)zN*|2>#MGSRep2q?kuaTr`KCX9tDFgsuCbN6rV$KV;M3yKeo- zc5`RHzP@$;_rG_#wTCeJLkhZovj+!)fC2b7pGm&3pgIAA5CjA$0-ieL_a5u2h#3Pu zVdW&hoR{9&HNB8=e|)|vgn%%RRJmM~pEzXd5HFw@K|%lo;DrTE%+lhV=lauTGZPiB&PO6D|E-UjgHVcU;>pp;!t&yz(@VsoHbnM# z3J47uJ?RgYlBwEU?YPx`use*$4wz>qu-eejw^z58wdhE&3B%RNeSC@;KsA_h9;kUmlO3~NXD*y0b z{Hx=>Ig=8TB71aVXRD>$Y&DTf%aI7?xlyNky0Lw7*jUcsh$0Tm@Us_}f9buAVpakW z<|W`Wgfz+N`p;C@A+NMe**ElTl(qYwr5mS* zX6tlwXX}G|^^I+#KV*zz#HBM)DUlSD*=Q!US}gjG(>4rI;CFZTWm)1SPD@GSrYTBX zZ=$<2$i@;A$Ir*2$THfd^-*v9dMSG=m$X8H5u}W95Wd;y@CZAE)W>GAkaVg2&b@Vn zz+t=o+aG;4C(nL3caP$@lEQey(|>5e`1 zy4}IV^RIpO#ly|Lscs~r8qaYf(}^Twu4O?nCSg4ri+88GAJEVY#H>Od`Sy^-gCnol*vTN|Um5rB+*> zsU3 z`?@!B*wA5;8grrSBbieZSdL1utd`1OeB+h$Ow}<>UXs$;YiP;W9c9IG|#20=JBr;qoaWa63LWZ=`Fnk|}^9n+%qUh|~aD5nb{C5cF! zNAkopMA=)NPv2ab%_g;1E?=!?X1jg(y$6qE*_)m9e&c)V&2|`3RgAIY*ohustjEaU& zUJYW5F-DmCArFW#g!s?#0c7X;g}?OD9b@ztYN>XPbDS$0&hh8rm>?h}E_U`N9FP7o zJzW?Bla5tdONlD>?XY_=$<4)%AM`MHK5qVC)DzE>Fg$qhm=cP4j^p_sa%y1!00u(J z2n8I1Q5lhsTQMO3gfhdSXLUwMnasm$Rpp}tTX(1|z<-0Tg;F43sETM{lC$n@2w^~& z%%jh&XcL?M{^M~X4QJMtCY`RU8$5@1hIDRhUYph4y5GK`$_V3xf`0N^RJX$?hG0P@ zjv-}$L$L2S9L5;ow5qmz9|FiD6cF;}lP7;?zP6l9e$?$-miIgR;y?RFdpflshq;ey zB?f3|Y0=S*QKKa)3T2EDl89)$7 z&2nt|Q7=SNJgI=M-FZBmx*PziD%CDjPhz}4T*q=8)0}ksp&xJp4+Sw7K?^zg?OpTM zoElOH7+?Tk1mi0AU`N0HOtx_-MmXoun>!R$7hn2JG3kCG*V}5~kXWZ%JHoTKTq%Hn zF$gIGycgPs^>(8XQB^e-WsK>=(YV`Zltz})d@Sa>m;xrMaw45vD`g!gsEkL(VB*=H z?*xbgjIc^3ZoB@ky!*jV-?;koSJo!e@$c*(695-M=)T|GoESbp90Y)Yh`=9C&Ao}S z5RYt+bqWzNb)1dgJ=xwm*<=Vho+}H|Sx7fwNJjLPE7_e+xbO9r^4XED%h6Q8F}K?= z`VB0IGRC&=|Ni=utEIx~g=A6P_2LD05P{*=+s&=WhJsciz+@(4EdvX1J6b3`TD}f9V(Be(#yN zwCs9)&nwL>bq;p-?>$(1+gQ=9XIfFNpo5MxmT_yT=VO{e>+v0y?A-HGdo|Q!N~Qp<$1l=?;njL7sN0$&5@j$ zkD8OI=Y^1k<)tf$m^!P3hsTEqE=1-FCZmv@)%(D9JqM}baI6pOi>r%A>l=?JMo|>= zv1mq-pN#ae=gAxwgw$ogmGKF2!x3pWM~?4b%ctOESRM`i=bzd8rQZm{&?SNAc$mY+ zaKfoMS&L3|OTb(JsEpvm^e6=dg@onu-mt|ZK@z#W69b9xgAeY1{*}e+^XbDrz*7Fg z%dfav5qrMXZ=LiurIeBz2*pe(E~*Jdp^OfuI*`N@!`MAO!3c{y$06j72Py1@V`H;E zK)fg^Dle(Woqj%jKV2uFQHt z2oVUv@bGlRL-_KQ=NtXD7x-@Ax}M*g478VQ&3syP7Fx;;GlJzrmvSoSl#L4yHebX_xS64g9pt_Am4F7-IlJQI^4( z6EdTWeSAKjnsO)ul(DmY5dqg_q|`r^fgX);nB0ofJi5JUz3-55q8)O-D1S&38ZIWtlQY z3Beqmy>`*F?BUKnf$+}JaavPia_pzCmpmac%D_RdvvGSzg}$6ib*5fYV%cc;{%%t% z>zmt?`sTiTA)hN3#`o@pQ|s01R~1p<5DsVv0N@dtc;1LnMUrSp7z79* z%yF3KDFePAkY2ZbWI;sxsdOwE7cuzo_Wg7&oi3LJNl=nPEIxKy!_i3Zn@%;IEb;LD zqoX^gtuJ1>=s@oIWc*+}P0J!e;LT>|@o<_~Bm{s<2*-2ASf7{pTsAXlH90}hB!!$A zSwSpH^7WkO3bn`E9l;sBaqVi;&Uu`Ca(D;27AJ^|F$w@iNEL)fjaIg_I0qR+7ywEc z69vBA>AT;# zUaQ0;@Xq#rHJv_5P4_#!&$#wdF8$=R`P|Ct>65+g;l7rP8KY@qXScj^?eNjlHLCC1 z(@DsDHI`;!VKujqq!g)yl;&#R`Ja9*I5?3t)gIb%EV)#x+8yho_PR1330&6P+P}3t z!}s;34|#+=Q#TyP*%R{%*=dtSvciq$s^NfQQNi(?JLxp0{V9|CyGI6nZ}z#b20n!l zaGXFxPZFheYtI<;AcXma*-3j+Z+BXlFH8J$xkSr$x5hfc@Zwy)5Rdi_PX>0d-s%TI zm{DW_0O`S_+S~BvE4mB5&4LcoH=^5Ud*SDMq}R$t5Idz)^XtH zGo^+k_yGd|oV1+Jy_o&rZhtW9Sx#>{5-z;>B`>oIAxmm7mdLhXki&!d1zwOi%eS{r zyC?l|UpGMgq);s-RQ1diEFd(OiWT#T_5C(On1tSRWCYg2qL>8)f zKY&M_DZsoG&j`Fi7=Y1;CIv3gsqZr44^N(G$PvDHk>j|~4;bY}Cgb)Bm z&rBzgB&jT;Jaggd;nCst{!VDS>00HONFQytm&+-}Sbt1HKfY8+>$YzD?tbgo4?{oj z%P^nIq%}!~3@HSRTsoz>dn#hK+G3^q^qjnGU;F-lk}8h>%^S|%+DvE8YD zlxFkgbj=HZWwp&|_vX;L6xmz=)UR!S;h2i+h+@j+L9LIgQeQ#)tDWzxP1pt67 zi0xs|bgZSqj5e!oogNZOAcTa{@8`%sXn8JUl;`+!dHFfcagKAG;~eKi!(U|*JXMV} zo(v%V(U>DxV^2*=N?dewzhBqOmr_R0am@hzIGHt^#VYtAI}->97z!Nxi}SL8pZX7e zqE288u%~&7lmfyS{kR_!LLhKZ=Ap=A3;}{Lso_FQh$)azu;26F-80upav{$DH{Th& zyrf>AQEnevzx>hoojp_Lp%=1Omm*V(Y_%Pk`?s(RXQzS@)C4pz!fH~meVUJQuV0AV zJGS?Fp2$N80mP_VKbgOFIhM_gy1nIUsj+vs-ld9QugZ)$ES_ag+n&X*Zh9aH2Tr4M-4T zjLS>&`}ZDELNSL4A(-P9uV1!J>v(;W<9Puik| zDk;*dtH}Y5FI~&ud3)S={5Vq)*N=5u_XU9yBv};f_YW^FNY;2f9)06*@7E6MK4lX>{OWwApec9y zV}#(u3_}KF5svAZ)a8uyVF5$W&PSYywRs%y%yTKDvBF$}{qEb}VXlKY;VgRN%%p=c z7E`0k$)wkKtc!(0rVuj9`=(({<=UFcsOK0;BspyEbD|tc<|zq1Yx?lX{o<92d#zRt z(=2iJCi+^rWC!74w{xLXy;dv!Uw{2KU%hne!c6kGF*qHL%8B@3*svhKlu6v%+Hg!G zmQA^a0RX71tkgF)MOnreLFf}D2hwV!827ypP(Ue>;xWf^z425_Cj-}+TbQG!`To88 z!(qQXUn*aW_^t6GLdUtxpwSWpaCxR!pN^G?sKw)H5q9=lYE_#+VOsCuAz8?Z^(i%i zz#Ml}Y0qx%aM>yiLTlO$ytWckXc$5Wn)?TwD8=$QTOS+aNu8)&o}a_q8a-$LH(6n#=!8|3kB5(144pQH-D+ zhN0^TPWVPLodSNS!pQQ%x1Q_*2Evf~9!Vu+(}9ErjrQ;gk^p3Y1OWjI;%aq?Z?@m> z_D=Q=vB1q06UB^%Fqr7JZ@Wr7st-n#fru=WbFq!Xb`XYy5`h;gnNl&8Z4JB4VV4jB z0ho*icSnPACbpQ=_FIE$EInI}PEGfqbtsA0n>qnRnikC`^NB>Zd(_M=)wGC8!oZpu zt^KAN&jCOw3Bn*CArWLzl*MeV980I_+q>WT);CtG^A~GN7navJpKk4MZ?^62{V9ep zro~6*bgWO3u>=nxhLA@H^8$hhLdYPXj3I~^fFUKCtT?`>+vfV={$cy{rAt>Y`3*9*xns(cavba2|mfmKVbj*Ri`okyD|+lff(#^P$FD5!Gzdw1&h_wH!2bbWE{ zQf=is58pfLoanZ>(>Sc8^M-AnrCl<{1fF+1=icGQN_qa~;>F`mBczlu3c=GEjR7EF zp)($2Vo6n$gD^O6pg6}l&T)=&oa3Bm_^WuK1jvE9={SwQ4dWCQ%yvjzW#FZ{83fwN!t$tUzv z22ThASwO0YWC1E7<`Fn^V^RgAN=OkPhasV0pobexr)vaWKr<2UE7ubFDEHsJJ=kx% zU%e6kZ~uepKYO$P%_q~if*qe;sVcGnzrAT<1nCcVl01eXWe`Fyq;nZ@E-SvXW484` zI%|8OjN>`aG>yS9KT|n+v|)}$$!xmWGyl`C7GKSnA>tu~KXEy>(Xcit5fvryeS{## za|i%G2u#;gJTEGWuBMJHi-n;ai_#$QU8g>3CL^_Lh3xJGO?m@KRWr59;G|hwTbcF; zu4!SOCt-*=ZvOgZOE>EqTO7|LghJ0_kXyO9@cfnJ?e+HKoyR;R<#_UEpIMnHa-Qm@ zGq5`xhNngjPa8Y?ahcP2zNOQMBv1yxSt~(EXc)L5czro_*xK({&3=3!&po`(txFwx(0a@c|VD9#BdlWDvn3Aa zG={dPTd|1P#26p|8A6bmF1tD-V}JT!7*8Z|0AX@wHE`{cNIR2hDx!syLWme(l!S~D z#=uH#iRa<4d$iZv^eXd7MY@`lY(S_Ok(lqgwlV4^OAD=?d$vA=2t&Y7NS+)YFXVG~ z4v%i8H` zp5qqgW;qVm)>cJXaBUk&Vm2G`<266Y2{?2qMt}kUf*{~{+#XNkwbC>%EQzzgyMH$8Lvq=rg z@*~|l>`qKK_@n_SAJj}nJawW^|KcCM8#D3O< zZ{(u{69nP>LdABiH}@LQXD2OpbwzvkZs%t|H&d3YS)Lz(r^)bwAWlXt>-1oulAg3> z-SsvOd%1)*S4iqnr8lvd7G;| zL>Rz~&`2^FNya%rfCx^ygWY>OT0AN(WD>RcpR8R{u?Qi2W%kO$G zP|Fo+j_VZiIU@)g{U%@`Ap`=(!XWS+8hC(+H1uqXVZ^7Dh#9tWDUyzdlIlFOFkef} zs8Wj1008*f<<}ueCZ;U*yr5*x{@{|5KLBpM3cK zSJ?P0#ujOG+<`&7kYWfS z1OZ`j1;4zg-kQ_e)8PO4%`S#ek#TzxY_wd{BO-^~fK^jMCCPt#!=!+55V9XGopd29 z9`t?6z2i=+~+xPBwQro`(>+mYpo-v$M4eDYpOQ@b2T0 zCNM#gCQ77($AX)_RL&PUau_nk!XP9;2oZ{<6KX0`jL>vZ z+HG(*if}x2PfmKHnbzJ%4}@hHEocKXoJopvN%e_AW(#89aOQK_m5iE>st@-D$ztRF zgF(DFKX-ZULW27IlJGO z;{pbFN&p0eka$Es#jBKXgivSN zCo1U3%4{yvn@kV@lv2!bN;JibvLZ-})mcRm+Y>?JgX8TxeaLR!y3YH0mGk!pQ=S9% zcwkS5QY3EcBLEjc5eb4$mAVY7RDty;ZvaC`5# zb8R+%zwHjOc(GDR1Odut-$=gnpwrPL(f0$#ab#7F`t#X!S8K+AYPJ^g;`2NbKDyoKhdI9#*ybPSGz;A-kmo4lm67I<>S?C%mrAj z6r!OsnAp9^G^%Lxg{mw{C*4+O+~Ya^2N%W+0YD)T1)NVsC}m+t38c%ltZuuNY$>J2 z4eGO`&^$P;X=d-?@Z10NS2>P@2vygX1QGU6>)BcrfT=Oo$E{BD_%M|z78e&pRdXFT z=FliFyI}wr6F9D%E!w+}DJLe9k(O!ZcqyN&*kQ1;ay^t3+jBKd6%)x+8Oe?vO=cmK z#H5=~E0tWVnk^4KX|=RcZ%@8^Yz7nZ4@yx&0|o$K6fo)sUUS$9X*i!-T$ziOi=f#i zzx&P;C$JVvvjUHUkeH6ib9_JoNsxjtjBC+|qFtR^J?fs0jH$>A9LAqW8(QO@8~A_c zwVz%p&2F6Rgp^=}*~dCG+jAvB(jD`>7&*r|&T)=&oa3Bm_^ZV;0001!BI2lFF~;DJ z!n&3*fG~7)&$me=C3{xDDC-_fiz`VbD*iY$P@JvUQ!4kLyq2ycg{e(2rk`Dn{Kv!e z|McNdcZlmVga8B(K?o6p5Ml^00ti8j0EQ4F$RUUk;4t72;xH6A$Ya1^^hf_T1|TJj zK6P+pgaX1?Kp16DZx3a_@`&wG(<6pQgOHuwN{k_g0EZ!ukx!V&q35geLRL&`+#hTj zcMdH@L>L0h;GJXp&as`3@fZP3!q;ocTid1=Qi1!SqnH`UM)CXm=F3Z3QpNw`-SNaG zA_pA;00WW$QxP1KaZJV$NsXZ9i=QbU?bM&2wZFO;Bc4lne3rc#5TJ@Ea2!FB0?&sC z@H|fmfe3LNZjHt~!fxQ#(&>$(V>KGJ3{!#ugIIU`clY;STwGX*#5W0*H5DP)t2g8M z?4;Mn04?0OYK$hQTRXfU5JDh?vsc$dE#?n9t~vZ*+e{_Z^6~=Y1(~{0+HCw`*Jy=YKA~K#RC^=;;a>N_$s~kVx zG$xZ@y?q;FG@H%5ba8F>v~m0G_e(R?NFtuCmD90#5lz99y@2?sL~Og&iwYbeG#*nF zk!z0(&cmNCXQsCG`v)hfLhaW4k}+r=)^~q$Vdgj5t&551)?oDA?ZY4lQku3{DBP-5 zRK)h1?Zb&a=DC~2Y+S>WVs-5$41C82T#T8QO1w4m+)sWf$MMnbQDgu9w_*?s45>97 zEM_uo!_5_|0AWf)gn3DcT&ykW&Q#*X?ZX`s1^}W|GXCbH2ak`BKC`^ECVKCmcA|+a zFUqlWQBb1I?YkIr6d{@C?;X}(TwGXhv_3p(T#P825R~KbU;F6Zaw#gtB42vrvjfll z+`oXJLF5;*Zw@K|p(4r4O5 zhrRc{_0~&E@xns!cztKf1}@fmdU(ZZ~hffx-U3DC{T+SC1JRSCD%bB}fFUr$kq<^+rI5o`ek$yHRLIkYwblUB!i8u*E zh+!CpryE-lRiQ>lk7V}^*PIURoyq_E)tfTJfH4RFWzcqmQYyNd$!DU`S|ZZPboUQB z{?vHuem&D}W~xh^AoY*8rh~Sqr7t~uEnoyO{nmwYI~(7scXv((F;&c^qR(GlYP1LU zKH6BFna?LO-SJ?zdF1+@B#3AB4S#5uB$P%Jk>@aF07A$BgMby1>3l30fDk3L!}Z-- zGMud@zVU8XOC$iGq32Kgqg!A3LUy*=Jv90~(gp$h~%5fN2)fe9tvZH>n2CUrjA8W=#_y z8reHJK{WDvJNu1c;|qW5@1&k7ITT4w2q9zuP)apLTdvI4yWQ1AtZCrR`t+TLJE@p* zeenjNbgy;XpNx2pi)&HSNv_STSgtK_yy;joxw02{OQpHaxYrzX5rSug0*APelFq2_ zhyJrmR~{X1nXV&nJY|5#+)=l&T%H@5le01Eye2uvInHs8bDRU5$6NlDP&0rqq_Lce zFfs zBODrJX#T)4FvFe^cJ-h$4LZ}HH3^#IpfL_wlcz^#8jNjX`;;)iV<_=Z!E?90ossEBSYyOMY%O^3&JiQHlG5O=D;hf&V_s z00DsT>2XGFocTeVtuI0f@-aRp;bMX>C56s3j49koQMz1_SMt(@qEt%>aT#NbY@ZHI za?+WaSj(j&QJ#G3gqu^nYDx+SV~j>6^qnp9%>zH4P50{!Et&8vTaCviy}lNW1_1bz zDd4ck^E3>lRNQy{rKn#Yhn5EjrH#>eCY4O^yt*{!SsoUaup-G2A9qu4#qG*eM|;=%WJJ16~aT$V3ZD#?ge zO_6;PFRv~oiv{q^Ra?{HcDwyxzl9N!C1E`EF0Djcy}-5INv|IgQeIh<6vZ5kkNW*9wQAom z6iHer7M|=MPC9+ZvT*3nRFW_^Cr0F(GqpR9pTuRkIT~n^&>R^&g3l)tR6}#sRTbAM_tSHs1b@4qzo+Y#uy07z9By$8k^$ zU1QYt!yuE%mpL#pO+^$&9@Km&CcF~}uVv?&mX9T&y|bU5iP~eAGOkox;Q2|j)#t^e zXOAJoQZx})qkK&0wR(Z;Bnzc!uSvoHbDTaLdzP<6)T>@lb{e)d9gW+Eqt>CLj}U~8-uFp} zqG>&lTAe{s!Pl3HQB`gYO;tc%5E4OsX?4kS$xgH07<4c~9OnMD#`X*VgrMt(^Tkv) zu2RN04hI2v@6oXv5s57B-`UJX>9tGg@4VY~><~c~Nhap6U6Lb_)2&@uQyaSn#$Y&m zWvy~y(VptP$XWLC4@v2t(q;q_4q>w(PD9y5TZLK1OOv!d+uDW(j0afW9LM}dA#L$ zPT@JuagKBRrNvvG6AgdCmm9&*quKemJ@Krui+-euk`MwCQbFNFO|VBUCt!2zCdv^; zm}>;zZyWfL={^8s@Wza~T9iV{L>>kq`+t3_``^AjXib9pz;BF#(^1eE`^|CC90$!w z(3%A8Nzk5#?McwpgRUO-jG(WF12Y_$;m9Imn@nsnb^bMn=~2h0e#k-!7y}4Fo`WI> zg^v#oLyRDXPmLkHfQ5ubWE_+6rLuCNC{hMx0dBS3x3*26Fp-0l0SJK`(B*>kfBS2t zQiA6(oJosm75(nL!N3eefqP1$01#3Z5D*Y>7K$kgC?a8zM>l7c|J@t8pL-_pg^SUs zf-@R7wn;j|cc%V+*W2&;^`U<}@ax0ibR4uN!N4Q~GaTA1#rsS1nP2^&Hz4wh^Rfg2 zf_PI&K0Gr1)w`Yg$ji^q4Vq0^iv*r8sfs=vOPVT4($T?jC6nn-^?V`$BZ@xOFC^*X zrcVgN2oXx_{lT@Bm53ld+1Zg4*)^@|>Iwt2f6{O*ix-6Qg~d#zSbx0PZ}k_8%9U&L zrzkgRHCp?})8Uw>{)Lhz3LGH8N4t77q99R-$D@T}VV4BA=Hd!Uw~kMm$0zMZ%he4- zw+j(CpHm;Vd{yFBOVZohrYxW!B-dwW6d~+PM?E)uV>U&@SgAVOHl6kTbr*Q?7~ky& zgh7OXVUml>vEx&VP{0^7N0U*f8_#BP)$(vSXmq-7tgZdQ`Ua%*#%yisy1mgVb|AiaZF3iq4Jg)n}a#GB4a%VEVaXG`yU5YMWjmA~q zaRFnzAjBce`*zC=2*+phnOrG(F<<)9?AncD?Q(5aQn8NoFRZRup=ScGTFg}nnQII4 zV`|Tpv#Ep{f`H@U>nkfc6%%6e;W(Si7b>;#>|AYW;mYNeQl(UztxOToL_W`0^KgIj z=#(>!>2UP^#$hd%{9wORQiZN*PCFwYDZAa_$zW25rH*=o)?f^<3;4{_lM!H(PTI-L|I8a3Yy1;Ph_OJPDkcYF+|pcRbw`W8bU~ z$HVq|qIn^4#vR4j{&u0{|k-F$g(cFbBPSEk9^Apq$b}?x5bx#-&#- zSJR2;Y0Ih>W=@8^z#juh1HwW=5rTi5-3)@j3&_YYHATwAqoaxW_IiCFX(^Sz^X`L~ z3SYR9eD7{wcX6hesa;xAB1&`bU~tkJG+MkUt~~!tJe%=7?__g#+UxtSFGzyv(C4lu z|D(ShYqmn)Ns0m*>XTo2`|G=nBLQQ|7(x(27!okh4L5YIEY2-f%BhTV`9gX!weIg2 zK8<@+>G@#k+KsuDrF1m?@L+R1=*^T;kr-~j-_Vu<@Mv8{&Ymb&g_*QaO$mSPdi?+J#r&13 zJd+m73I4F}|Kne8_Vf@zwAJ>8R!9i&L*|Dppp4L`XAU8FVL{8O^u0QjQn{DXQ&keb z(-Ob+U|?VQ;x9cW8}~MgaV}b&9khp%#D`%hh@v@}N~*#M!no6Ah|8#ok8vTJ4<=0k zfyO9!+T#p>pvqjOAPmMz5Ka)h^6Cq{`swcN2co8CtL4hdl0DIn9&bid$Qi1?1uE%i}2BSx|C0rOLL_{l%d0|+aGQ0-`{IqE|v7iOcUT~AgdSyKgBa!gZ-XqR7lei8(-AbfUh^>=r6W9igu zS1${y1~hKI5N(CZQni>uLTl15S4yx{t}f5NI#=$;5<-6NLOSI;gX1tn$;8E4`Q?0i z1n~>i@^7`e<7h0MNhz_Y5{oIZh!oXou_zRTc1Vtg146@__4UpE;a2}}YeiIV6xJe=h9OK!8u5ay#$Gv@v=C}ih9l9n z+4;I@jRCd-V1~>HK`)@koDNy^*igk zoNi18lcAvtlx%fIiDZ#uVQ)CTFk8~Qy}R}1vkME~efVg;kcS9$r;|u5r9=}({{#VK zPbZ)MU;h2fr6n#Z@liRRSLQCvVkjLxJ}~^S-s;wJ+J1XVeM^ePR7L^@%ZbEj-1jMs zic&WKp*^i8@;2btcOQM>)^o@D$QX1z6BSkpu5PP5Kb@GICVKW1GL08S2%$M1ROaU! zM~9rKOnXhtVL76Bwv7*pH?1f}{*| zT}Ld=q2)p$UC7>l_ak#UuFO;(fAsL+?n6pKUgXl1d~54aN@U}4I4>rEA`LQ;12_Dy zzk9bydC0;0Paf9_DH0M92yMhhLhC9m?GI;;0J_52qMTBKoFjN^6?;v0up#0uq@%=WbpoRN0+11 z!3Z0Z-f;Tz&D8M#8!R@rwjjvz$>w(N_|%#jnCFU%b4n}{Nya-zrzacR0I;*pDbot) zs_L_s6Yt+2{)^wdf6}jS)c1bx?svBv2O`e{2p9v7O9R4kX}Oe>;}M^i26MTJ*2nZq>+34Ar$Dv06go%POYFeCtz>nIg;dtP` zw`blvc7Ef*S!U_b>`Z$;qFhW5&AzUm;GZ`Tp-@h6Nota;upn4dT~ZWI5Jv4D zL68R^p3gEYE{pm`$DZ00ApjAil&(B`y>)QBv9oufR=ad%ZTs-p9E|}3>2gs^CZ>Y{ zgfLqvKsCN3jW^a051OVR@Bo0o^E^NN;*DIYknM4)2~*+;&6?;3k2m1dEX5L z_tARy==4PaZ??KQ5~SnFfAX#GwGIx4jrO3~8MQjSM$>6`6x-Z7JnXc)%%{Dnw?8yX zsq##wmP$qky4mVQVB@rD>baSstg5`gJ3-L;;KA2__dAXLzzbQu)4#EFW3{&Ag&~A6 zAYm$!Y@hDm-`XOk{pLF#wf2t|CHc3${k=iEE69=>k4KV;cqXYtw1(>l9J-V*0N1;7 z_l_XOaw6{aPDhR|%Hm&t`4v-9oM?<>bGH`eQkkS$%u0ot%fq!o+(uHqkSy}xZg-rH z#|1&y?R2hHDo348$S~$4eQ*jne(u`kE1!E6004Q86ClD+R+PtEb!%fwr1s%pGFz)P zyRE>ZP~g(C#A7ic@W<%$b)m;-vhiy;!!ctXNco*SqUbX2cIl#D7FgzfGg2ZjzIjuvCnQGa&+!csh% zO666@ecWjFLX&Y(4S>DVW-gz#Y}+u*NK^@Q|JGu5XE-|PI#({lb`A~hQ_3~S7{bV! z>ZQebqdy+@+X8joc=070B)6J_?SpMiao`@>>RK)Yi#B_p?3LN$V;s=Ds zXTcM|3;bd#yHc5*7}E|86QyEz@33=J&n9BmZ)TZRI2{YIsBrXTyL(s=oi$&?pBd)zBxPeLn~g}x!e$#EO}rbc*UOd4PV;Eo>VTnfy1P#e@5buth#w`3QAF{B_jitu zS{LV+BbxTR?|)~%bxMJIaZv++ed~k$2YdUM<`!$2Qft^b>Yf4sdCajNoPHpLUf|E? zs}oBfnbUkC(;9YDkvNZe-8LA2eSK8#HHXH;@m&t1LNc3(L}#vXrkfV4Dv6$b%Gah=u=84;D5x1 zi{Rrp2BYs(E~R;iql6(0$4ygBq>?3V(y=%mvma>$g}}kqBsd!Q2m+Bu90q@Br^5g^ zGlpaUloI?xR#bTCguryesZO@q9)jS7MKvnot&X?baU&AqG5n)K5DvkIb^FaN{q+k` z%mEI=_D(B2>COSsPxFQwLQP9&i<1ELreU|)9d~=g^8_A=7-u3JA>Vgxh$%R&;l_jl z2>wuj1_U6a3ESJ(OeQ~&hV}ttEKt=*e%Z#PaZv*yLwqsrOxTNHS}h3 za%)UG77!^t^RqbPcK`r=U7wL8n|YeV1q4w>dBnMvJ#%T*oalr4siVx>(?9Iqm$fhRZ`_)ZyeOu{hV+x1^@!zaYR)qU$~r&;tRFlqa){WU3Ui^+jIm` zz!(Fb<9RGo&hZHVD5faQ(RjbxTPqiT?nd!=IKNtKFJz2+2a~`H7>}VSTv=Uy?b1@y zSCXry8|ve9VeO^37E>eXRKAwqss}G!!x04z#{oi+0YE}}bQ~6=y^@>}g`aWFaD z-5LRc6?JiKIhC1RHEh}UiX2BN{h&XY&7`({7emMxMFXo34nZhMVr$&@!w@4xDHSl^ zn~c&??ZZ8zkW4TPuUuG(EX-U{L@x{j*EPozeK<156Jt0gp7$Xog=F&P>}<^o22UQN z^8D`3vE#Y2>AaLm-o1Uh>p0PP@;1bu%S1+zL>nN+=v0ecp3MXhTv(8bJ|vOI7uS}5 z_h7%WxcKF{;s6MuoVfV%Ql?soWiw|%gMcvx03(cPqLx)RdyT8vw8#mr4^t{VwZN#= zymaHLFmWu$4GEJud}{k@Dj{0Kqt=NgN|{Ka?F@>&+}!1_8okH;({U-g=97)qaU+$B z2Ck5*3H<}&=tDJCfq+R$)SC9A$vnc?7!ELp6Zw4Sq*cwuRf#ujHx<(Y)A;RQ`t9dG z|MKjYzbs|)(Nx^AUVr@NyWjgCf0ZFY$X06?m)`x}hfjLlqNZKT#a9)nDe&u*!cOm1Tqp<(1^s@vXw7Cb>Ajs@MU!h$snv65=Hs1dhr^Kj z!TvY~07S?!Er=1|aXFiR`O3=i&g0GQSc#?h#6r{T$rX5I z*it3q2jPSL_Wo&~P>LYDII}2n!a=8@)^aIcJh=1Fm`swD>g%7MYmL1(-|sk+L47n8 zWCg=Vt<)hwdI++M0 ze}9`EZnavi9v0w2xth}AU28Cz8ZTa7{larg&9?K~?>>yG%C-5Gjrx9X(x1(hpIfFE@s5%X5;E`01d{bAU&f7rBsz`|V><5Co3@VC#N1 zp3WyS*XGx*&0lN|+l6HI(##5FpqR`p6=rSU{c!u?zkKu8gD}7lGr-QPlyjWp9OpR4 zIly`9#J_VOgvn7skh%Vm&i&X#NFoFSm*`zPGaGAc3Ig3VhGYR7=rRV(Y`ZqN=Riy52cH{f)!=Pk;WkSxNYCbGLS3 ziI=6$!SQr3;3erRw<=qQ1KqSrGsWyo4TM3x-u;Oxe|Tbk`@If^011K|(EwwC?^%wQ zkizw@>-iKSNGKI~9%DW(TW=jT`YiXk7cX2aCfWWdZkj5`U5F z1kEV{WloLPRr$4K^q)N0dp!(`sZ7%Y(L_#GW4x?{4CWBQ#F~sopmpRqHejLac}0zh zVdlH-;{L&U*gARU(hX*eM~@!g`QY~9Sie~;Qb3(BL;w;>L|(YF`}oHE+J*8W12ClI zsJ*}0Ze**a+J%)R3}2X;`CxssF&cu9Sh^9o9)N)3cuwF2SyCai!tl+#z2_Gfe)iJ* zH&2?ml`Hn>G@mbsu~>P2j!dT_gf0mWk+{a_UNChSx7QfQna`A@A<{xD)^@lW5iaHD z-r4KCR?YA19Z0el_(R*Ustl$}1xBAX@GuCe@8{F$^lPuC^+{x6kES+dNL5(7WyrqA zV)5Q+j{$}t#_=3+4d@#6iE*(~VkY5p(Zk-+Txzacd%dzOh0vcwFT~QDBp~L{&Mo8x zwShS`^lUGLt~ou^5i!6JhmFw`iIG|@r-k;!@{=(&6_r~HrH=x3LgA;*QjuSB$G zfAWpi{?XRk@5hU&c4tgI7MGQ#VIhu*t~Vc#zVgiV3B``@c6sUjJCAJS6`px<@#2lW zC+lN#Dkglx3d@;je{5bXYsWmAjI38KW!~Cpz4%gI7KPJ}wNQ&}9~vV6l!Al+FvcK) z-NX8e&%O|G^zGBr$A_mJ1ir1Sv6L7|hkUx*?v!Tolfh{7xPQfM>LXGj{-S4$~%`Pu+q9O~jJbPu0 z1VMZMaMBx)AP`lRF@^w`bbHZkZf13UDXH5&{PufYjz^+^{D3k_5d;XKi;J{mH}In2-G${r2A_TD#cfB3|sJ}2T- zBwkA89~^8gELPrle)ZPHr3ah64>yk&N+n9^qoZxt_aKD(t@_BE)-uIfwzz(@?FK#o z03iec{1gCVbhEy9v9|Q&Xm7bXn~o)>romy30fr%x1u>>Zd=d_g$=K2l+Vz+kRV8_@ zPw2U%di)=Mpo&P~Fh-yd6Us?m#BgYlM-AKdm`|7=GB=M zW>yI)`_>a!?G900@Hs zLJXlSW56gib;Do=1JnKx3xey@R4V$?^)gF<-`XY5* zoh!U#CvT5PYfrRO8_N|{qln`#25e; zdOiRQ^E@vIP>^#8@a8TO6X|q1p+r?I$teX~N_cM`vgv5j>FvLJce+wp{p*#g>AJsj z_mRf;W&2V}Rb<`k$X0*UnYJg2fYd}ha6MjDZa<#<{7+TC@$N{JF(nN1%=SRY@N6yG z8+vEzm``@#5#~fnzxl!KimLvN&wl3Z(!DQdC&f73*PR6o&!ks(EH7Yme}Ci7<^xd> zFhm^3QAHze_-s;n=b-uXmzKUYhLH=mgyq?5gid$r=3rn>y6uCGZcM$1OjWtx?a$Q8 zsZwd!?nokj<=NQ>9lAjFpc3EjPexCk%*LZ@rE1l+H^e>>h5dF1Fn~EsC?P@E9}R!$ zyTA3fKmX;S=^mNG3&kXJvt%%A9vmLtzCVPx-)`%srO2`p(O@i!AQV+uR1{HBBt^kI zW|V1~w$8}Sx$>CdaW}#Ivr`R1J>_<9R!V+XxbjTA zJ(*^ci>hw=jvxA=nvQaUkccIbmNZ9Gfd!l(LEf_i0s&15aVEPKLTV(3h;J}a&g8Cq z20Z%quXr{x2ezCbQ8zK}3|uJq5-Kwi|1+*=Vg6 zP>OsXLKyl1FG1l^9%teb8)$>Ou zJF%I0czWnD+jd>u^$Y3P?r=J`)qFN-49(CFJpnz~>_59&xV_a{U5q^5o{9no7=sWJ zLKpy<<`MLb71cYq zv+mg*hZqS18WM;Q!dO(K&?AVkqL!ARXa|lT1ONbm7fSI$JRYNzN}O7~zl*g%`4k)VY5C9Dm|6f>BCBPLMDsK#YFKofAq(7_Z6L;ObvhclNiR$%!2EPgan#`V+5afo>?42f@9 zUwI|>tw*Ew&`u>aNsDlz04Nh=5zAsekyGQ*^z2NEH>s(&50A~M`Q^)z-@M}-_5IZ% z_9Tsj3iaLFTRS|D^U=scmU9Dwd9c}_Ke@n#Jmz=-VGI$12towMoCxS|CCYbuqqheW_wj>#qcWFEck4&7R7#C;lxlK>Pe~%- z_%D3%bI*VA^H|{P8#~j({`PMD(fS{(JeT5dT9g&f5AN;lK0L%PE-rrI>NN()e?J{zY^!U!|^04M}zTTH}GS; zvKGshc+sdktbw2hGFY$=2+}>fE)< zm;`|1IpBPQw~e$lfDE103Zy^RI&&A zhm~5%cHO14_SU0gRTcz}oAk$wP=FC*03t+upHO<~`5WyAkA|ibWneC*%q(7COvpoz z{LX`iqgD$6{K|#OO(Z2NCEe>b`=`S$yt2AtI_=?TDktO2F>o;L8o^Q~6;OERxSL8U z{gDM0!-aAx3|&>mi~A)n!h&ZQZ(%JOLJA9u=U%Ia#1#WJ^ihBdX61jyEyA< z@l2^OY_#edJ7?nwoK&uW*z% z?bGJgU31j=({T-F6hla9NGKs^DolV7zzA^|VFcOv(|nF|oa3Bm`1fyCVw`}rxKw}G z!#w=4ng}3(2tlLo#7n9a;RBZ-4*3olx6D)};!OP?xnI&*Y{c1R{9%M3@Z+3_r?LgY z0`k;tK@(9WDP$uYLI6Sdbj=Te>9X~v)0>7AFb`uv-JQYV$>`zjakiX`=khYg(#dd!Pe+WP*XW3z`N~4{Nz>c! z`4~e8z-ud!l=V@;QZ< z6rSIoOjMpfOHO&({Q&@_U_1@Vd3Eo|VhjSn5QMrJL{&~xc=|`4B*vJ4aYr`+XfCGW zh65xNMnR~@)4EHJalE>4^LkvtxrIlKW`x6r>s?0nu-Q+=_{Ssr7as1$1kPuyIg~Dz z3a49pC*igdi{@r4iA?75&C4K>$gM6j2t3;^uPjq4)PMIkLFi8`21P5L%bMc}h5$kM z=H{kL!keYS7iVkND&>z%lQO0$5}<568f`sXzrMWm#^uYp?`boYN;1JmB1@X;c%E+A zY%sJYQ{VH?-T@Fngb;*~0+5NtWL`MvH6>AGjNLvuzBV_*WA26LUVn6Qw3yH7Kr}4f zr-3Y}@3#gw)7h0|bVqmV<7qp_N22OyFJ1U=j=tBPPAchC-!Kn5oeSmV`@1@!bmh`A z*X{5B+V8#o%(BO`Z{FR?pgM}=0U10w-JkQVk~ujvNh%RQ47NtFRGb+HRwOWcy`d*Y zIo}R=4nmjXW!*A|gF}1RS$gJmCL<7r000J&AKKYk9CPI0jy-8>wX0n1;yi#zJZnUQ z2tg2rbg7!u4Tmy1>JR7V%00(x^u`xv^F9T)-+Vu}y0ZN2b54V zRO~|7pW4r520_@dT$bV_YcbC#R=& zyFZtaE-Wj*_uaVoY#}or&zz^8vm3XZn{r+2xfexSh z(kpNL?CUCWv}8or{RdA*2b&LB;PL{GIm`&d&Z50yfgchAz`a%1|_kDpEFv1+-oWMP5H>$a!fcc0L35?0v zzz-qgIo@$yjL;{0z6c^O^a&xYL1(0oi|M>9N{;7#@6m_brw5-n)STlSKU6_S=*;z3 z=We{p0HY+NLGVMCGDLBQ@WhCug*cy3Fa&@w;0DYKX-JtLu&y3-^)Mt1V<2EC3lIQ!rb0aX6}C@vQT}>O4k=h~ zIwvDv;SuJ)pD-7M3;=MYDwh(x=~2_An=QMm2NH(_9zyQvcQOD%N)-YAp)1K4a6-mo zaC279MS0t213h^Ez#l*p^Ci#m;`uBR#Jt9CUXb2ALUuUeLr>QYV>0n=7XW}c zYzJUvIfi*90J5xzK0~#%kcskdZjB`@{k@mg;wt!;?;Uq1eT=Xsi2xGMpRAt@c@D1T zm%ecM;*r>PJ)Hr7c|P!bh!9|a<6)=oPW51IF>-r-994NqM29D4IWNytl$`@Zmj19+ z3Sq2})T&925DFk$BAO#d4~@-6oFfSRCxVWMN=Kqf)D`^Br>uZ)A|i?*fDBznw!my zS}llBNJvtaBRv1LkW&Z7z<*z?{)N6L&V2oq2 zsbvpLqt_qEq6iTZW%=pa_2~kW$ru;nv4c*R!x#c!`~Fw1U;EmfdlS?A^2?tc$wF3@ zb_ROi)Z=P|0V;9$c6abvDH{OPfv_?0n`Y+{g!UA9 zK0Z@rt=0l#8``9Pa=O`S0SM+ZG0(P(m01gLgWkY&Ca&*xT^W@kuSMjaizx}2_d;5Z zMY)g;6tQI!I}9;|9)i5UjSVNJ$q`kc$OA;kCe*uj|JKE|h^*~3>l15oZK<+XE6wGr{ps+N zL`;F_4ab5Ie$w~H0KgEr#4BZrgwZF*yW5TZ-ekCSdf){fg6FLh=lEekDNU8;YFA$* zVQ{7u0zdTg!x-^hONk`rZoKy7JHHx+0fIm5&JzS62x%fBt=1A3YRN=IiYkK0BgTN^ zhlb_%CidgQ(Oz@nxBBuH~T@OOwhiqyS-6fO(2!Vj% zS-ZqpBg0d}Huy9r5&-z}l9tiNf42rv**cBavQ5X4n{u_Q%h+?oX2Ew?=lEsrPyI%~2xGkxF? zka-9JBZx~T#Gkqrdu~ShXn*wffxVPUfA_AZn z445wAIb7e|PUN#{JgWCc)P3on)uMl2nN z44mv7vhnz4S$q4v=G(hYG#MXFblWg6<|I{N03ZZhN+4tqAW8wFl*4$nC?59h#eD6? zT#-Zl|L>divF&Q2$QZDFQcDVi;!2W#fA=IQqz}g9{7mvEE@k@t`w(-E?VK5IG0H|$ z-|k}R$*P}s5qskvPv_E^6(lKRdhC3bW^Q+3)^G6s+3QQZUXZh+K0~mAAw0?!j8=EtYJchFm%e)Q<~JTa+PZ&VRg|-W>}eDJ_Y+CzQX$u!Or0R$G4{i7 zHk*YI_H@JX{a^d`H$MBBFXr=^8`IHY`;@Y$@*khDdxP5Nmnwya z2hELU^XB~Q`Ke`HO@*2Dl1%9?80-m_P=dwV+0E@96a9iJpXP)NsW<;8(sdqh<5;A@{jiFEsVtt$z2ks}*O5oq=b$@nnQC#t2gq(PTca#iIZK&vA_5 zL?4VH0@0ips|qxd#PxeqH(DNlKiFhy{Q)l zlgZQsmf@JHs8B}X9|`&iDba0nV(Ikb2bja0D#>G0->mOP6fF~b;gw6bimBXTr(W+g zMP4}Rwv0OP>S!nM(K$7yq$PXX{en1w>iB~QctGOu8 zK|)zbh#wLN075Vx5tA{gmXB?pjNg9L>`rWf!#}p0{}94_J{yn6PET8wWj#$S`Zvbo zNs?GB=EE>(G&*O}s`F>@9Ow8m=!wqS3gN$2Bn07^*)99zlXIfs-+{ZTM8)pj^vuBT z#}F7Jv+rbQW4z3fk8{NXH=MMr(rUW?u*V61*^?GR(DKOh3)=tV=Sr2NKpFe$)tJb2 ze)IlV5%DLBsECYHDo$!x5fFqR2*J<@yVG#H?Vhdn{gC;D1>~t;BSugb&?gp3lzr0N z{d8Nx3z>jnH6>oHD8~cu+gpb169Gd-K#Va2flnBMu$mIqijv{6?`@m5PrZ-{9E?ba zF>vM$`F(E)09eQZ%0kL822lYE9IPhAa)R>-*lf82({=-P_Ip(kQ3if+cN0(mC<7`F z|M8cyfAiTSWArDkBp#jG|M|Z<*=joxc`|BsSBr9KHUH3_UF64ulZNlQu5Qr~04y*7 z5r*b)vUm64mDgXw97lq1{>HV=!BL`^XM~M=JyB5rW0vJwgj`rkr|8(kc%-{GUb@y9 zj+RPAo5xxv?H`@oe*ZSlbH(}DRJqVSK0SQ+gi?kP$SyAZ%#w0Kn5~mp3cmN<_jp-~ z#iQ49!BKrs9}&ZJAfwT2I+99^+g(BkgfOHqp(0hp1A{6ecD!(|EazfzUPw+Y^SHaC z+s?!eHBls#AqXf1iU==PrMI^Ai6x{JX}vS(3ciM7udl93nZ&)LBLILG1`u$BFx?1b z3C~uP$2&TQfgAk+_B2Lh0;6!P=)k$9|x`KjkAiKyKl)gP{J zIBrf5Zf4@OSfWs_eBcMUc=Us#qf|Wh!s>;UQt{Tp?ET}TiD}0bnf~CL6hat~u$)ZV zelRdhj1Yt{r1WCBw9#mIK`3(^66JRu-s#OQ|Gg{Mj|YRJ&VVt-LBt_8bi60S>9zTM zV7e!hu?x_vmu7D+R^Qn;{s*tV_#Q;l$@t})&or^Q^X^?);QcW012Qoj$1-?Hp@g=& zM9B>zqA)NVRgSDxDqFqg1RVNn?kd$nxg!;MEy ztIj_+nCG>(+NYet$54{Znyua7^vOx}@&#jP1l|Be1keNw(wRbPXYWXfB|XoJDiR^= zpf%zEpoR_-aVerv$Ds&e0gEn|2$RN>gY8adbnnCY7oJ&t=~jDd-xeel@ruBA`dy-E z`luuDvJy{t*4X!aMi@lG$a5pI;1Mb!WRP%*h1#XH!N#@)gn{jslj@m(|KVQy#j6EX zmf~tE42R!+u#YiVoheKVr_rBE0v9r@4@PP{7SE-viH8Sfq3xl&l&I@vqwp1!qy_dj^!XD%%y z_0Ry${Bh580&An=vpnCiPy^aIAqo zygIvfvAWpT$J?ieyUpW-mRPMWo%C9+@5R-q6L=vBAw(Z{i$E_3%9&y|p5AL7V~h^k z$C4Y1)7GpZzCa`N|vr=pX%`zV@|m zBoZ+~$RA${BEv9Wdg>W+Bv$6Wa{#m655uA1` zH7Uh&%A{*^BK}JY%YXocl&J##%H>!sC0ITM0B9omhp%Nmv!cDZWlWur$BM*Z-JbpbYpS3kYKjr~*nx`IN?~0=imN(i#T= zs}IAkuN#CsZLPovN<2JE+5ACsil;|N*!7z7)vGbUD4~GE^io;6KCA5w0yhK&g_Je= z%ir9gbURhZm6jG5rK4^?hTLg?7`UFG$-E@?>Zh&!qnS&qu4Px(mJT1RBZOnwRJVQ- zNyY;&q(ML#0I4!GPISw^aA_V0Vj>=cnN(Tezy90btVJS=%ZpT&T+=++*ugxPDi@>4 zxZ@Ex=~%~|w{{G}A-Cpdu9b=(?jJr|LLipL&UF2>uS%Tn2ZKgijYm`EqB)t`)2ScA zVocCP{$vn925Onu&p*F%*ykS}ZBK3e^K0?<_I+7EXWUIlK~zSIIcaQ$&2gY|97QOu zs+79*(O~QF_$OX};e|>y&Dil^*cgt76RDJwpX^RvdM0z!upNg8JZg5GXD=r-1y2m0 zhmcSva7dCAO@!GbkOfp9`lYxqGARS#a3KEkH`|*{_trvc^Ul3X&(Qzy>V?oW0zzU4 zPEDhjN#C?&JL)!ehq5Se7zc#(4ShD9*=)1~j3EGVksJEN8x98F{`LC9haOfsd;2Gw zd%P&PmMunQ6RGoSGxHZ`8hiVpX#q+8@S{7Esg5yblwt_`LGX3Ux{-B~lJv^L++wxX zos1=(|G8VwF6Hw<82;q7tMBdX-aoF39QSFife@Nd)Tk^Sbo&qjjG*BylUVQmmckcS(I3OWJNCfD}u+o|9krR#Dm7KVgTAaYy~c%qybO(t?Id3BZn$B-gb2?1!2ZOem_ z7*Ruu!}ku3{8;2dZ7Jf~jgw=?vDA)^jgc&vddw=kI7mKCx za!q{JI(W}E`an&}f}BfV?WqT?YBt^>Y_S(huM{n&Nyj8AUiYF7df9v<>Z$10$8?QIlcTV>ACic|uXf%<62pYqF z+!2&mN>uE|_Fnrl*S@!P`jv$l88SZ%Z(HuYMn{slTeogJJ~GEsE2T;0Z2YJ-P$h|l zu|iB8dJV^C3`BvWlwqFNhofw*5=*D_!3cBQ$F?uf4}+K*sl>BVMCI-)VSV=(e;Hv+8NG1v>Ps)bQsl9FAd`6H^&2R#K`fc^>lSj_(^}G95LBN5y33g|!=djpO$=@4WHSD@UCMAfP`P zS27ujo2rsGJ1b*z+88#EIt|NpG({zpay;ky{vX#y{!~o%>175)5CRH-!1FxDrep0i z4qL-sEnCXR)6Xnj2||Cnaddrt^~JTDgURUX{HiR70>?YPi!lZagp|a!=t7}-XK#I_ zG}oOBgD}7dQ*cf(oa0Zo3xfaD%WMch2mm~@EdJqsgb+GgjDGP}EuxA+NFfA&bUz<{ z9M&C#w35-jd~4=6-aDL{9)^E{;MPw}5T3?x0``fS(Z^o_^iy)VKN{W1{`jy@_yYiv zBx#z;o!Pbi;P*V$<^7;rGskhNs#uo%hyL_`>xrG?9OwA-&LxB(8dViV5=Gv&JfDMnLIedeoRQ%6@DW4S)d% zp*?otOjL>po)tg{AcCP!hjl$W7dOV? z(Sx%kJ%SJ+fZ_KqE&Q}T;ZyIfPx~*PiNnv{S!drjwMiktUoOeA0Qb87M$1t}Bw*-; z>_T3CX-SL7=$#$Y4cJ^(I2roy>`r+MCE=-K1Z5y3EToK3a27CGNeG!J#t8BV`Gh7F zPU6wP2=5-*en>eCc?=Qyfph&t1o4TDrRP)Ir+&yV2FnF0reM>h7=e%g1i?&Na9lE% z6Q7$`-`cS#0|=pEtJ|wLltjF;P|HRWTs%qR#-M)6Am9aI@AiXCrIe|a5df)j!5mMr zl_F!1AE4tyKMAyn1=JQ@0u|tR* zanKuy82E$^ZR>KaT1}Q8pN@a${%%0wPhU@Lw_QrXSv>|J2t$^La~I3(4r*n z)gO-q<>ia>V3BQiT4U3a1mUPRxKJt(LLd|%1QA{sJN|2H@#Dt$;oEOYJj6T?0HcId zRu*a(FDSVf5A4nT(cYa$l}O|?q75cfSr90tXO9Sk5Cd?#JF00i&v9-tk&DKD?zv}k zkw`!Yq4cGdm4Ecc8~^Dq{>wA({ZAetgkUxrYmap=40()0!c}6SW}<-i50ym?6(GU`9yDIR&!C^@lLv9MHC{6WO`&U9BHcj6Sr<)!y&S?adLd; ztp_t#vdx428@FzZdPe`rUSPY$%gY4`(SE1^lRNkpO-%JZ$Bg$11#i0RqSt`$cU@4fY7 zLHM|^rj!$eNw=S_l$1!+cO8T=W6TTuay(lrRbWC3Q%Xq`|Nrd$XP6|(c^wLeNnhSq zbya)c)7|6EdW(fySb`u4dM8MqK=BcEr7M#6Ug`UEuPE`6^oSC9MbVQWDG~q)5Pq?X zwKF^3^h|r-UEWt^Rr-vG??=tf&Kdv5+|2&I5~%j-Z0 z0ije9@x3#tuwSxW@-6*DAcVF{hg1IJv6ZCf0N`P(kbkPzZH z4unV)h1c!sdw#>VZ4*KSLEtz{2z?#hfDpQK1cV?$h*C-jx%Dw|u0GjitxOGk(7UA#@y4tu_}IcWbqFFEPq- zNGcVXnHh>k{i4WI%GzyhZEb&dw?yBLJ>UV+@HWG>iR9%YgZ}>cNNK(CcbaH;WshFp zSK}l8-D_1|#EdbHM|#_`4JSI_D{eFe2{ZaP#JXVwRg=89-hKbkpijguV;F*`7S%s~ zxz6L;O$y*OA<}OZro%!WEMQpI2%*d&Oy<3PUzH+Pm|2|tQv>Zi54q?>2t)Ngu)EDIAe%>!52moc!a;fD|LYd`|n>pi1 zzk)H?uUi;GkBDCPo(Th#vYw)$_j{3paX&wilunO$8Dl{OcMVc%IZ+?iYqD?%TP&C{ zAOFC(_u{tR(1?H`0|0Rt^PJh$_7`rFn71QE1Cd}Pl~8N-;`S~h^!hU|KKdiyABcuC z*06|Ata8SnHc5U<%;G+#-?d%EUu8PD_5%fYB(NE4-L?2btj+CghH#i zd|`dlGz>uyDduPTC4s|R6;0tGLa<}fX16E{9?T_^{_0;|E5`d%k{EB6s(>+$?wROUc>Ubk)z4hcOT0MSCz%e}t=o6*7)F7>!TF3*Y&u>My=OKu z6At8TdRv3d7=+O4_1L<8Zha%>_YXy5XGSJupCiiEbJuF$_e5sDU>c^w^JsZfecz*f zx7J#Yi-w}U=_FQl>+FUZkh!To(X`l~UvA_Y?(yNUX&bhyoE{tDISc?$9k=Tc4g$s) z0>HtD0(5m{1;%OI?|nEloohC(Z0+n+tM^Wfzv6WVgM!c(16{{iDcOO5hZ5r0PT%;* z$dNgOQEn^i=J!)lr&tz=V<*DlLbJhR{JI4b13<=TzpE$Xcr%}KZRbNLjsXZ6V+f(H zu8$^Sep%K`6Z5y71sPzOaHL}zjc!-qF#y1H?3r|0;JD3lS>buv8!|g>+te`TFaV8q zbA4-Vd~{}E`^JOgqav@|*xi?TEMdIU*5U{p4hKJ-TROkG{{ttF{g=Ob>T*-1R*&h zhMam83f%hkzF*`=rw;oW<^6KUG<^hj>m}max3+Srp!XfeXTItY%0>%h!Tgy+H(xH* zvfFC4Z4_H)?hjw4)`->T_fQl1`eftj3#$UgfU!i#b8S6$YI1Bi5^2<%d%BSv7;)=$ zO;rht`vvTwz?VvHE-mJ-RBDy-+(Y+;(s9*vdu_uABgAp0rs-$veK8H|SQQgOf7oxSJ2m2+Q@WB$y{q1Ck ze%XIGJ)I228D&pjKU-6q0xtw)PuLs0zPd6!<{e2#Zf@zx!0__^x@nt)QV1YKkWoen zr4HdZ+}qEvSNhi2U5|2hmx<|Xwm_5!5JL(~-E>R~Qvd;UU3+zRL*PY8lJ6azPle(P zfUc?W9RJANnVn+x(%KD((2?Qks#@PD?3|uFQt!07rp{p=9LO0C@HY$FB~ybj2EfX8 zQ3P+@dy)+&{bQMcOXyp4Erk$J2IfbjH@9lFwu#VNeN`k9Hchi!t|k((xw)xYt+BV4 z<9W_Bt#~}z-=8uJYjbml5GqOHD?zzX({$G*qoYI7XlQeDw_2@xJTlL}#^6@d^hhK$ zIGCZ7ZfxvmnhxI3AEE2IB#GnW!-}G8Z|{~$RiDqpaojiLQ*6g^oOC+X*OzFw)xEu( z>$;*S9*ndD900soH@amx6BGS&bHkcuUc9($+fH9!tiL~Y zmt|plyI8HZM3EmK&m1{21^`%F%L)SjU25|Wh=#X0&0*w3V)~JOZ&X4ECPstplKyx9 zZJQkjLZ}1#pFGDSdNzS;K6=mSSW5|3Wq?Edk~ z4T(nx0YbmSjtt9X@16_%;OWqCR9MU#zkjwdl@ePzDYl%KH?>-q$UG7-v|S1zuw3?m zqrvHv)X-f3Kz~>mj)@J8Bm#U$!C?i5eH@1XgwS?a+i+Ebl-dpez;;>NAgVzKWg>@6 zlW-i=EfVo@^$wv7z*kCn3;+&6zl;M43MpJr!6F9%01jcAO^Z#Z)V5s$R*Tk3!4!G) zj~|Z2{Cq5_u5Ww2k}nbo#3FMK-&fk& zEpF~y`N}iz_{ksYpPn={le%s=m1M9N=ZPi1e}Fc&JQK(6J6+BdRxhn3{M^I$j%7P= zV|`1cWGkDGVvboBVa((6IW7r`Xgn^ww5|aN5CpnK2gBmgLFsp1SpAWEh7C6fXsfcH z4=3Z%{!~3*ri37j0RW9^oulRhk4fx}bC!^NV7CH1e5CmmeA# zVuWIZde>UydE0d@$03YC004x9Qok&DL}9gF7dXrqpo|6-Wi%PPmCXUhlu(=y*D|{3 z74a&E@n(K+C>{^SG8cB&h9iA3pZ}Sg3w}lr1~)3r)BT>gc=YP(<|E?+vtuKBjw^GR zbhwqP#}d&_FiIf+K&|Gi#^CUw zS#x>Otv51>=w5!Wqv?nGlliV$Yt)evo;!Uejo9Mit-Wd`peTFg=4jJ5F_>C%_qL1L zcz@*PX7SZ&nla3A)%|=Z8E;l=LD_TS*hv=jw3+Fc_Qp#uchwHZa|k0{?P3lGlQB=g z?+pid3^|NlLID7d>jEqd96IR>aDs%|wN`OAYsvhP5h*%oI&$L7vFJ|G{pw3qy{+?8%&8Bo;~CQ&oOo~wGTN3Jxt(HTx1-lB2ADS>F$Tv{ znV>i5lRTw*`R2|VWmMoeo4D~nR1uZYQ70meXk8`d>%X>jV_|zW=<&@COtS5W=s@z3y23E2113936;>@_35pZZCHb zgf1b$c|M7?Ke)ppv`N)$Vk8GNjs&;#cjtS2*GBvd(S;HLqn-@x!LI$uQPNwAR7KQ zuc$X99eLkKFy)~x1CSm4z(_scY3z3q2mj8NQXqnk>9$LHbkM(dqbhJ*ucl|~Zl`L7 z`g}&)1{D0w$W9pm2mqIWKYqFS7gt&kLd&5p1wBW=?@TgeyX^R&^6$T|FY4m}07FsX z_@L)T*7&U#YB#e6hhW0Tu~%IiKu`w5QNeT=0uVr;S!5z1{lLj!+aRh*+d5e(n72&| z8E^=*T}CKl;I=D-SL6WzA`cCV3n?5%;M9<(sS}TgB>r~06NJDepli~ONg5j2soAze zdld;nSzRL@2|0un+fG2npFCe*FPWcsJoc$ejn7?gKR)9xsm@~Fkl!pbl`#qt7Gwzk z&?uJFT3zvZlOuzPq5kcKrJK*ceE&zD+*?`082h54r5O!Pj|~nGwdNfP%^iOcyhv*p#8e{c^eOG<8=IkZ#k67oQpRT;A0n zfEBe??ga0hnz+2RRWFu9@n|g5SI-xT>pG12Jj#QkBhWCucy0fmy!&{)?a?e?Sk9R- zf3aon)+|LpJ*^gkz;fBUCVfK@;mnv9LqHe^hj6&o{oG~h6~z|QZs&ynKq%!9_K0G& z(^)ALudH;=jE{K4jNofdjp#QwT9Uw*E7p%bn!a$Y^tC0esgaO^ADr-<-P9hP^leql zV%s@3C>2|}OL&3fFYoNk_CGM5h$jX9mPM+?d;o&&j`mcpShn2J*=gCIHuU_>%`Mf? z10L_Yj?524!qb_){dzkQ3Atew2 zykvD-(6!42cyb6p4qJxN=o+bb+{w22fp9cbEA7?;nTRdZNG91Xb(w8+Orz~OT`YS& z-T9Hx#d6JZ>_WEs{Nn1nkDcDwSSzTiyjhr-NZ6et0k2eou)NU<2Yr=@JvxW-A6 z)#>hExxpvXN?Z%@SX2E&X|225M`)}s`Qqhk1H(xf zE3{JCj!5B5+*7VQgo*-gw%o4nPL6n9zFzT2;%GXux?dGIu6J2@fzNMjo_ONX*{Ruq z$;rCj($$(;trym}UB}@C0WfA;Hpla#qRgB*v3X;8>C&|aGRKm>Fwb$A7Yc2y!=Xsr z(`l1#+tBNcffze^JY$ehwXF{Yv@d;rac!qd389Wn2;(@8_UpynN>1{5ID}nB;=ahS zBZs|1AY7Rfa6;sS&1}I=_-4~*C}X@5d~D!dduoM8*d=Z>9C94T;dlh0>$;Q>>Jrzn zs7ooKl(>}89$x#Dhb|#OuWt}|3tQ{^)uQ;SYzIIHo0TfgOdUP_E)xPuDTlF3-D15m zni=*;^7XA{N=ZBzu^p${Zb*W7U;uf5x7~{Cj!D5A|F7$kL!*hG{qUJo%ntzgu_sUb z_7`t$5c(~71ImCR;AF%@2>Z7BeR|ngnV5&&v84J|g|SE^+~1#i-}~Ny5VmdGG_6!B zkxIo+ojRIG#1I0Vj+RKo#>R&J{lEXkANi3_lu8vs=nwz!hkxN0KJN7@tyagftci({ zLx(0OCr5ta7yix0#*QEerfL1a54`W6{?nh7Wl2>#mSvBRkBp5Cce`ENwjo3iLd&vF zpFaBU{@uS!r4sFSN7s#!k-_=-ng0It|Ng)KyIih#cXK#GNY{ zRkafe1x7{&W@je>00&&d0S@qHRxd;i3Ic~Q)^)Sh>W0I9pHC))N|NC9 zO0G-x_DYN~N#ZG`jfPsOwEFww;jpjS?A~#6I3ODS)|m#D7z+lHietF|K!kvx@Ug)_ zeWwFC#QrXeHX$%I+ZUHSLDAA2h#+H(6LERFHF6^12}@eT{2L1v>h0JW0GdU6#jEe8 z^#nm^6MAx3@yf__XiruU^5V&a_zO?OzPQj1DjY@t-YHK&*fm|lrVs*2fRq7&L+7`& z?W%WBi;ZR!!x1C!p>lDU>QKYS{Tuu zZEk#dzp_=WZk9?S&m#aJW9wILB!>GY@1540Vl|sB)$4zG@zO{<_Wj3>KfQ2cwjV8K zJ8e~;Iy^Icd`@q5p8cawxwZ{4#sUu*6-BvHEu>`L>$Jns@s(_jQi>6JlcJOB9vK)o zyS~9=3;_6@=bx{3)K5I|1P1iCzWTMDPWR;K=ubcV;EQYPH~023;b^1VwHyb%awv}D zPL2+L`TC7OAdCg6)2!SMfxo*ugXfkD#p!q~!Lv$c?B(^FQ-i~&AAf)Q=5s=Bhl6aR zWAyvHFX!_mLhgx$zqqiKl>9!AcOjd5U~=Nx&OQK)<7Finb1hBls-b`qk+5p>dwcDH zNp3SQtW|4Mm=E+1mr89(FapUS?Yg;qZRo^2#|!mr8B!)H9stg~Dhx?=PS~*LC zzSV4NFjIPBe(H1ASJaAjrM~*W;dv&A9mb80^bz3g+V+SySkk+mv`8xC;gJ!^C4czr zSu9I|WXx;Y!?QDbRTTujsWvR0TDt9+ME1#*_3ZSiqy9*^U2jT$53%h1s|#W%+ooDAQ8+}+M>YOmdyZ24-fT6lfvlu^{ZDres6YZ ztzB<$JkN_FaU4o$C=pAJ4iekB`pk>6EIfQ7_}s$o#F#W3^=7y8OU2geW}X2YjYv~- z!-2%AG04s%

yr4&ZvQr2@S4Z|8y$Nb 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 Date: Mon, 6 Jul 2026 00:03:45 +0100 Subject: [PATCH 23/39] docs(readme): collapse platform picker and optional extras into

The 20+ row platform-install table and the optional-extras table (~60 lines combined) sat between Install and the value content. Wrapping both in collapsible
blocks keeps a skimmer moving to the report/commands sections while each platform's command stays one click away. No content changed. Co-Authored-By: Claude Opus 4.8 (1M context) --- README.md | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 486439f44..28832f66b 100644 --- a/README.md +++ b/README.md @@ -138,7 +138,8 @@ for example `graphify claude install --project` or `graphify codex install --pro > **Git hooks and uv tool / pipx:** `graphify hook install` embeds the current interpreter path directly into the hook scripts at install time, so the post-commit hook fires correctly even in GUI git clients and CI runners where `~/.local/bin` is not on PATH. If you reinstall or upgrade graphify, re-run `graphify hook install` to refresh the embedded path. -### Pick your platform +
+Pick your platform (20+ assistants, click to expand) | Platform | Install command | |----------|----------------| @@ -172,9 +173,10 @@ Codex users also need `multi_agent = true` under `[features]` in `~/.codex/confi > Codex uses `$graphify` instead of `/graphify`. -### Optional extras +
-Install only what you need: +
+Optional extras (install only what you need) | Extra | What it adds | Install | |---|---|---| @@ -200,6 +202,8 @@ Install only what you need: | `chinese` | Chinese query segmentation (jieba) | `uv tool install "graphifyy[chinese]"` | | `all` | Everything above | `uv tool install "graphifyy[all]"` | +
+ --- ## Make your assistant always use the graph From 2ab086742acc06627b5913cdb23c89425f44597f Mon Sep 17 00:00:00 2001 From: stasnamco <2972373@gmail.com> Date: Sun, 5 Jul 2026 05:07:30 +0000 Subject: [PATCH 24/39] fix(extract): route extensionless shebang scripts to their AST extractor MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit detect.classify_file already labels extensionless files with a bash/python/ node/... shebang as CODE via _shebang_interpreter, but _get_extractor dispatched purely on path.suffix — so a CLI entry point like `devctl` or `manage` was detected as code and then silently contributed zero nodes to the graph (its doc-referenced symbols stayed dangling stubs). Resolve extensionless files through the same _shebang_interpreter and a new _SHEBANG_DISPATCH map. Only interpreters with a real extractor are mapped (python/bash-family/node/ruby/lua/php/julia); detect's wider set (perl, fish, tcsh, Rscript) stays unmapped and skipped rather than being mis-parsed by a wrong grammar. Co-Authored-By: Claude Fable 5 --- graphify/extract.py | 32 +++++++++++++++++++++++++++ tests/test_extract.py | 50 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 82 insertions(+) diff --git a/graphify/extract.py b/graphify/extract.py index f14f4638d..13c6cafb5 100644 --- a/graphify/extract.py +++ b/graphify/extract.py @@ -15821,6 +15821,30 @@ def _body_of(block): } +# Extensionless executables (CLI entry points like `devctl` or `manage`) carry +# their language in the shebang, not the suffix. detect.classify_file already +# routes them to the CODE path via _shebang_interpreter; _get_extractor must +# honor the same signal or these files are classified as code and then silently +# dropped by extraction. Only interpreters with a real extractor are mapped — +# detect's wider set (perl, fish, tcsh, Rscript) stays unmapped and skipped. +_SHEBANG_DISPATCH: dict[str, Any] = { + "python": extract_python, + "python2": extract_python, + "python3": extract_python, + "bash": extract_bash, + "sh": extract_bash, + "dash": extract_bash, + "zsh": extract_bash, + "ksh": extract_bash, + "node": extract_js, + "nodejs": extract_js, + "ruby": extract_ruby, + "lua": extract_lua, + "php": extract_php, + "julia": extract_julia, +} + + # ObjC-only directives. They are illegal in C and C++, so finding one in a `.h` # file is a near-zero-false-positive signal that the header is Objective-C (and so # belongs to extract_objc, not extract_c). `@property` is deliberately excluded: it @@ -15908,6 +15932,14 @@ def _get_extractor(path: Path) -> Any | None: # grammar has no class_specifier). Reroute to extract_cpp (#1547). if _is_cpp_header(path): return extract_cpp + # Extensionless files: resolve by shebang, mirroring detect.classify_file. + # Without this, detect labels e.g. `#!/usr/bin/env bash` CLIs as code but + # extraction returns no extractor and the file silently contributes nothing. + if not suffix: + from graphify.detect import _shebang_interpreter + interp = _shebang_interpreter(path) + if interp is not None: + return _SHEBANG_DISPATCH.get(interp) return _DISPATCH.get(suffix) diff --git a/tests/test_extract.py b/tests/test_extract.py index ae88e364b..4e76ad120 100644 --- a/tests/test_extract.py +++ b/tests/test_extract.py @@ -1514,6 +1514,56 @@ def test_extract_json_via_dispatch(): assert _get_extractor(Path("foo.json")) is extract_json +def test_extensionless_shebang_via_dispatch(tmp_path): + """Extensionless CLIs resolve their extractor from the shebang, mirroring + detect.classify_file — otherwise detect labels them code and extraction + silently drops them.""" + from graphify.extract import _get_extractor + + cli = tmp_path / "devctl" + cli.write_text("#!/usr/bin/env bash\necho hi\n") + assert _get_extractor(cli) is extract_bash + + pytool = tmp_path / "manage" + pytool.write_text("#!/usr/bin/env python3\nprint('hi')\n") + assert _get_extractor(pytool) is extract_python + + # env -S split-args form is handled by the shared shebang parser + split = tmp_path / "runner" + split.write_text("#!/usr/bin/env -S bash -eu\necho hi\n") + assert _get_extractor(split) is extract_bash + + +def test_extensionless_without_usable_shebang_stays_unsupported(tmp_path): + from graphify.extract import _get_extractor + + plain = tmp_path / "LICENSE-COPY" + plain.write_text("plain text, no shebang\n") + assert _get_extractor(plain) is None + + # Interpreter known to detect but with no AST extractor: stays skipped + # rather than being mis-parsed by a wrong grammar. + perl = tmp_path / "legacy" + perl.write_text("#!/usr/bin/env perl\nprint 1;\n") + assert _get_extractor(perl) is None + + +def test_extract_extensionless_bash_cli_end_to_end(tmp_path): + """A shebang-only bash CLI must contribute nodes with the same ID scheme + as a .sh file (path stem + entity), so doc-created stub IDs merge.""" + cli = tmp_path / "devctl" + cli.write_text( + "#!/usr/bin/env bash\n" + "helper() { echo hi; }\n" + "main() { helper; }\n" + 'main "$@"\n' + ) + result = extract([cli], cache_root=tmp_path) + ids = {n["id"] for n in result["nodes"]} + assert "devctl_helper" in ids + assert "devctl_main" in ids + + def test_extract_bash_node_metadata_is_sanitized(): """Bash extractor must route node metadata through sanitize_metadata so HTML-sensitive characters cannot reach downstream graph viewers raw.""" From 5cfd7d98912722a876f73f40b7e71d1650ed8ad3 Mon Sep 17 00:00:00 2001 From: safishamsi Date: Sun, 5 Jul 2026 05:07:30 +0000 Subject: [PATCH 25/39] docs: changelog credit for #1683 Co-Authored-By: Claude Opus 4.8 (1M context) --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 70170db56..44a631f44 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ Full release notes with details on each version: [GitHub Releases](https://githu ## Unreleased +- Fix: extensionless executables with a shebang (CLI entry points like `devctl`, `manage`) are now extracted (#1683, thanks @Stashub). `detect` already classified a `#!/usr/bin/env bash`/`python`/`node`/... file as code, but `_get_extractor` dispatched on the suffix alone and returned nothing, so the file was silently dropped from the graph and its doc-referenced symbols stayed dangling stubs. Extensionless files now resolve their extractor from the shebang interpreter (`_SHEBANG_DISPATCH`), mirroring detection. Only interpreters with a real extractor are mapped (python, bash-family, node, ruby, lua, php, julia); others (perl, fish, Rscript) stay skipped rather than mis-parsed by a wrong grammar. - Feat: Ruby `include`/`extend`/`prepend ` now emits a `mixes_in` edge to the module (#1668, thanks @krishnateja7). Concerns/mixins are the composition mechanism in Rails, but they produced no edges, so the blast radius of editing a shared concern was invisible to `affected`. A constant-argument mixin inside a class or module body now resolves to the module node (reusing the #1634 candidate logic and the #1640 module nodes, under the single-owner guard) and emits `Class --mixes_in--> Module`, which `affected` already traverses. `extend self` and non-constant arguments are skipped; an ambiguous or undefined module produces no edge. - Feat: `affected ` now reaches callers that bind to the class's method nodes (#1669, thanks @krishnateja7). Since #1634 binds `Service.call` precisely to the `def self.call` method node, a class-level `affected` query missed those callers because `method`/`contains` are (correctly) not general-traversal relations. The reverse walk now seeds from the root's own member nodes (one `method`/`contains` hop outward) so method-bound callers are reachable from the class, with no change to the general traversal (no forward noise) and the member nodes themselves are not reported as hits. - Fix: capitalized/mixed-case file extensions are no longer silently skipped (#1671, thanks @raman118). `collect_files` and `_get_extractor` matched suffixes case-sensitively, so `App.PY`, `script.JS`, `Lib.Ts`, etc. fell through and were never extracted. Suffix matching now falls back to the lowercased form for both file discovery and extractor dispatch (including `.blade.php`); an unsupported extension like `.xyz` is still skipped. From 6d3a6f1c6b0f47c87dda221d4d6369fbccdf751f Mon Sep 17 00:00:00 2001 From: Nilton Moura Date: Wed, 1 Jul 2026 22:36:00 +0200 Subject: [PATCH 26/39] feat: extract rationale comments + ADR/RFC doc references from JS/TS Parity with _extract_python_rationale: Python files get rationale nodes from docstrings and '# NOTE:'-style comments, but JS/TS comments were discarded entirely. This adds a post-pass to extract_js that: 1. extracts rationale comments ('// NOTE:', '// WHY:', block-comment '* NOTE:' variants) as rationale nodes with rationale_for edges, matching the Python behavior; 2. first-classes architecture-decision references (ADR-NNNN, RFC NNNN) found in comments as doc_ref nodes with 'cites' edges from the file. The doc_ref pass is the natural join point between code and design docs in mixed corpora: teams conventionally cite ADR ids in file headers, but today those citations produce no edges, so code<->ADR connections never form even when the discipline exists. Spellings are normalized (ADR-11 / ADR 0011 -> ADR-0011) so references to the same document collapse to one node, and string literals are excluded (comment-shaped lines only). Tested on a real mixed corpus (Flutter/Supabase monorepo): router.ts alone yields 10 ADR citations that previously produced zero edges. --- graphify/extract.py | 109 +++++++++++++++++++++++++++++++++++++++- tests/test_rationale.py | 69 +++++++++++++++++++++++++ 2 files changed, 177 insertions(+), 1 deletion(-) diff --git a/graphify/extract.py b/graphify/extract.py index 13c6cafb5..2599082f6 100644 --- a/graphify/extract.py +++ b/graphify/extract.py @@ -5799,7 +5799,114 @@ def extract_js(path: Path) -> dict: config = _TS_CONFIG else: config = _JS_CONFIG - return _extract_generic(path, config) + result = _extract_generic(path, config) + if "error" not in result: + _extract_js_rationale(path, result) + return result + + +# ── JS/TS rationale + doc-reference extraction ──────────────────────────────── +# +# Parity with _extract_python_rationale: Python files get rationale nodes from +# docstrings and `# NOTE:`-style comments, but JS/TS comments were discarded +# entirely. That silently drops two high-value signals in mixed corpora: +# 1. rationale comments (`// NOTE:`, `// WHY:`, ...) — same as Python; +# 2. architecture-decision references (`ADR-0011`, `RFC 793`) that teams +# conventionally cite in file/function headers. These are the natural +# join points between code and design docs in the same graph — without +# them, code<->ADR edges never form even when the code cites the ADR. + +_JS_RATIONALE_PREFIXES = ( + "// NOTE:", "// IMPORTANT:", "// HACK:", "// WHY:", "// RATIONALE:", + "// TODO:", "// FIXME:", + "* NOTE:", "* IMPORTANT:", "* HACK:", "* WHY:", "* RATIONALE:", + "* TODO:", "* FIXME:", +) + +# Doc-reference tokens worth first-classing as graph nodes. Deliberately +# conservative: ADR-NNNN (Architecture Decision Records, any zero padding) +# and RFC NNNN / RFC-NNNN. +_JS_DOC_REF_RE = re.compile(r"\b(ADR[- ]?\d{1,5}|RFC[- ]?\d{1,5})\b", re.IGNORECASE) + +# Only look for doc references inside comments, not string literals or code. +_JS_COMMENT_LINE_RE = re.compile(r"^\s*(//|/\*|\*)") + + +def _extract_js_rationale(path: Path, result: dict) -> None: + """Post-pass: extract rationale comments and doc references from JS/TS source. + Mutates result in-place by appending to result['nodes'] and result['edges']. + """ + try: + source_text = path.read_text(encoding="utf-8", errors="replace") + except Exception: + return + + stem = _file_stem(path) + str_path = str(path) + nodes = result["nodes"] + edges = result["edges"] + seen_ids = {n["id"] for n in nodes} + file_nid = _make_id(str(path)) + seen_doc_refs: set[str] = set() + + def _add_rationale(text: str, line: int) -> None: + label = text[:80].replace("\r\n", " ").replace("\r", " ").replace("\n", " ").strip() + rid = _make_id(stem, "rationale", str(line)) + if rid not in seen_ids: + seen_ids.add(rid) + nodes.append({ + "id": rid, + "label": label, + "file_type": "rationale", + "source_file": str_path, + "source_location": f"L{line}", + }) + edges.append({ + "source": rid, + "target": file_nid, + "relation": "rationale_for", + "confidence": "EXTRACTED", + "source_file": str_path, + "source_location": f"L{line}", + "weight": 1.0, + }) + + def _add_doc_ref(token: str, line: int) -> None: + # Normalize "adr 11" / "ADR-0011" spellings to a canonical "ADR-0011" + # style label so references to the same document collapse to one node. + kind, num = re.match(r"([A-Za-z]+)[- ]?(\d+)", token).groups() + kind = kind.upper() + label = f"{kind}-{num.zfill(4)}" if kind == "ADR" else f"{kind}-{num}" + if label in seen_doc_refs: + return + seen_doc_refs.add(label) + rid = _make_id("docref", label) + if rid not in seen_ids: + seen_ids.add(rid) + nodes.append({ + "id": rid, + "label": label, + "file_type": "doc_ref", + "source_file": str_path, + "source_location": f"L{line}", + }) + edges.append({ + "source": file_nid, + "target": rid, + "relation": "cites", + "confidence": "EXTRACTED", + "source_file": str_path, + "source_location": f"L{line}", + "weight": 1.0, + }) + + for lineno, line_text in enumerate(source_text.splitlines(), start=1): + stripped = line_text.strip() + if any(stripped.startswith(p) for p in _JS_RATIONALE_PREFIXES): + _add_rationale(stripped.lstrip("/* "), lineno) + if _JS_COMMENT_LINE_RE.match(line_text): + for m in _JS_DOC_REF_RE.finditer(stripped): + _add_doc_ref(m.group(1), lineno) def extract_svelte(path: Path) -> dict: diff --git a/tests/test_rationale.py b/tests/test_rationale.py index b52aa3909..4c915664d 100644 --- a/tests/test_rationale.py +++ b/tests/test_rationale.py @@ -261,3 +261,72 @@ def normal(self) -> int: f"rationale node {r_id} for ``.{decorated_name}()`` is orphaned " f"(degree 0) after build_from_json" ) + + +# ── JS/TS rationale + doc-reference extraction ──────────────────────────────── + + +def _write_ts(tmp_path: Path, code: str) -> Path: + p = tmp_path / "sample.ts" + p.write_text(textwrap.dedent(code)) + return p + + +def test_js_rationale_comment_extracted(tmp_path): + from graphify.extract import extract_js + path = _write_ts(tmp_path, ''' + // NOTE: must run before compile() or the linker will fail + export function build(): void {} + ''') + result = extract_js(path) + rationale = [n for n in result["nodes"] if n.get("file_type") == "rationale"] + assert any("NOTE" in n["label"] for n in rationale) + + +def test_js_block_comment_rationale_extracted(tmp_path): + from graphify.extract import extract_js + path = _write_ts(tmp_path, ''' + /** + * WHY: retries are capped because the upstream rate-limits at 10 rps. + */ + export function fetchData(): void {} + ''') + result = extract_js(path) + rationale = [n for n in result["nodes"] if n.get("file_type") == "rationale"] + assert any("rate-limits" in n["label"] for n in rationale) + + +def test_js_adr_reference_extracted(tmp_path): + from graphify.extract import extract_js + path = _write_ts(tmp_path, ''' + // Gateway pattern per ADR-0002; provider selection per ADR-0015. + export function route(): void {} + ''') + result = extract_js(path) + refs = [n for n in result["nodes"] if n.get("file_type") == "doc_ref"] + labels = {n["label"] for n in refs} + assert "ADR-0002" in labels and "ADR-0015" in labels + cites = [e for e in result["edges"] if e.get("relation") == "cites"] + assert len(cites) == 2 + + +def test_js_adr_reference_normalized_and_deduped(tmp_path): + from graphify.extract import extract_js + path = _write_ts(tmp_path, ''' + // See ADR-11 for the trust boundary. + // ADR 0011 also governs the injection containment below. + export function guard(): void {} + ''') + result = extract_js(path) + refs = [n for n in result["nodes"] if n.get("file_type") == "doc_ref"] + assert [n["label"] for n in refs] == ["ADR-0011"] + + +def test_js_adr_in_string_literal_not_extracted(tmp_path): + from graphify.extract import extract_js + path = _write_ts(tmp_path, ''' + export const banner = "compliant with ADR-0099"; + ''') + result = extract_js(path) + refs = [n for n in result["nodes"] if n.get("file_type") == "doc_ref"] + assert refs == [] From a4d4533ae3f7345a77fdc5ca35e28b4679d75879 Mon Sep 17 00:00:00 2001 From: safishamsi Date: Mon, 6 Jul 2026 00:48:59 +0100 Subject: [PATCH 27/39] docs: changelog credit for #1599 Co-Authored-By: Claude Opus 4.8 (1M context) --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 44a631f44..6609559f3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ Full release notes with details on each version: [GitHub Releases](https://githu ## Unreleased +- Feat: JS/TS rationale comments and ADR/RFC citations are now extracted (#1599, thanks @niltonmourafilho-arch). Python already turned `# NOTE:`/`# WHY:`/`# HACK:` comments and docstrings into `rationale` nodes, but JS/TS comments were discarded. `extract_js` now runs the same post-pass: `// NOTE:`-style and block-comment rationale become `rationale` nodes with `rationale_for` edges, and `ADR-NNNN` / `RFC NNNN` citations become `doc_ref` nodes with `cites` edges from the file, closing the code-to-design-doc gap in mixed corpora at zero LLM cost (pure line scan). Files with no such comments are unaffected. - Fix: extensionless executables with a shebang (CLI entry points like `devctl`, `manage`) are now extracted (#1683, thanks @Stashub). `detect` already classified a `#!/usr/bin/env bash`/`python`/`node`/... file as code, but `_get_extractor` dispatched on the suffix alone and returned nothing, so the file was silently dropped from the graph and its doc-referenced symbols stayed dangling stubs. Extensionless files now resolve their extractor from the shebang interpreter (`_SHEBANG_DISPATCH`), mirroring detection. Only interpreters with a real extractor are mapped (python, bash-family, node, ruby, lua, php, julia); others (perl, fish, Rscript) stay skipped rather than mis-parsed by a wrong grammar. - Feat: Ruby `include`/`extend`/`prepend ` now emits a `mixes_in` edge to the module (#1668, thanks @krishnateja7). Concerns/mixins are the composition mechanism in Rails, but they produced no edges, so the blast radius of editing a shared concern was invisible to `affected`. A constant-argument mixin inside a class or module body now resolves to the module node (reusing the #1634 candidate logic and the #1640 module nodes, under the single-owner guard) and emits `Class --mixes_in--> Module`, which `affected` already traverses. `extend self` and non-constant arguments are skipped; an ambiguous or undefined module produces no edge. - Feat: `affected ` now reaches callers that bind to the class's method nodes (#1669, thanks @krishnateja7). Since #1634 binds `Service.call` precisely to the `def self.call` method node, a class-level `affected` query missed those callers because `method`/`contains` are (correctly) not general-traversal relations. The reverse walk now seeds from the root's own member nodes (one `method`/`contains` hop outward) so method-bound callers are reachable from the class, with no change to the general traversal (no forward noise) and the member nodes themselves are not reported as hits. From 7d463c98e2ee1b706a5de7ab1524d2e4a04cac76 Mon Sep 17 00:00:00 2001 From: Vinicius Machado Date: Thu, 2 Jul 2026 15:27:52 -0300 Subject: [PATCH 28/39] feat: add `pascal` optional extra for tree-sitter-pascal extract_pascal() already imports tree-sitter-pascal for AST-quality extraction and falls back to a regex extractor when it is absent (#781), but the grammar was not declared anywhere in the package metadata, so it was never installed and the AST path never ran out of the box. Declare a `pascal` extra (and add it to `all`) so users can opt into the AST extractor with `uv tool install "graphifyy[pascal]"`. tree-sitter-pascal publishes prebuilt wheels for every platform (win/macOS/Linux), so unlike the `dm` extra it needs no C toolchain. On a mid-size Delphi codebase the AST path yields notably more accurate relationship edges than the regex fallback (calls and inherits both up ~25%). README extras table and uv.lock updated accordingly. --- README.md | 1 + pyproject.toml | 7 ++++++- uv.lock | 30 ++++++++++++++++++++++++++++-- 3 files changed, 35 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 28832f66b..5c0b3d479 100644 --- a/README.md +++ b/README.md @@ -199,6 +199,7 @@ Codex users also need `multi_agent = true` under `[features]` in `~/.codex/confi | `postgres` | Live PostgreSQL introspection (`--postgres DSN`) | `uv tool install "graphifyy[postgres]"` | | `dm` | BYOND DreamMaker `.dm`/`.dme` AST extraction (may need a C compiler + `python3-dev` if no wheel matches your platform) | `uv tool install "graphifyy[dm]"` | | `terraform` | Terraform / HCL `.tf`/`.tfvars`/`.hcl` AST extraction | `uv tool install "graphifyy[terraform]"` | +| `pascal` | Pascal / Delphi `.pas`/`.dpr`/`.dpk`/`.inc` AST extraction (more accurate `calls`/`inherits` edges; falls back to a regex extractor when absent) | `uv tool install "graphifyy[pascal]"` | | `chinese` | Chinese query segmentation (jieba) | `uv tool install "graphifyy[chinese]"` | | `all` | Everything above | `uv tool install "graphifyy[all]"` | diff --git a/pyproject.toml b/pyproject.toml index 30d2a6da5..3bfe896f1 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -70,12 +70,17 @@ gemini = ["openai", "tiktoken"] openai = ["openai", "tiktoken"] chinese = ["jieba"] sql = ["tree-sitter-sql"] +# extract_pascal() uses tree-sitter-pascal for AST-quality extraction (more +# accurate calls/inherits edges) and falls back to a regex extractor when it is +# absent (#781), so this stays optional. Unlike tree-sitter-dm below, it ships +# prebuilt wheels for every platform (win/macOS/Linux), so no C toolchain needed. +pascal = ["tree-sitter-pascal"] # tree-sitter-dm (BYOND DreamMaker) ships only a Windows wheel, so on Linux/Mac it # must compile from source (needs a C toolchain + python3-dev). Keeping it optional # avoids breaking the default `uv tool install graphifyy` for everyone (#1104). dm = ["tree-sitter-dm"] terraform = ["tree-sitter-hcl"] -all = ["mcp", "starlette>=1.3.1", "neo4j", "falkordb", "pypdf>=6.12.0", "markdownify", "watchdog", "graspologic; python_version < '3.13'", "python-docx", "openpyxl", "faster-whisper; python_version >= '3.11'", "yt-dlp>=2026.6.9", "matplotlib", "numpy>=2.0; python_version >= '3.13'", "openai", "tiktoken", "boto3", "anthropic", "tree-sitter-sql", "jieba", "tree-sitter-dm", "tree-sitter-hcl"] +all = ["mcp", "starlette>=1.3.1", "neo4j", "falkordb", "pypdf>=6.12.0", "markdownify", "watchdog", "graspologic; python_version < '3.13'", "python-docx", "openpyxl", "faster-whisper; python_version >= '3.11'", "yt-dlp>=2026.6.9", "matplotlib", "numpy>=2.0; python_version >= '3.13'", "openai", "tiktoken", "boto3", "anthropic", "tree-sitter-sql", "jieba", "tree-sitter-dm", "tree-sitter-hcl", "tree-sitter-pascal"] [project.scripts] graphify = "graphify.__main__:main" diff --git a/uv.lock b/uv.lock index fcd87008b..088ebbbdc 100644 --- a/uv.lock +++ b/uv.lock @@ -1090,7 +1090,7 @@ wheels = [ [[package]] name = "graphifyy" -version = "0.9.3" +version = "0.9.6" source = { editable = "." } dependencies = [ { name = "networkx", version = "3.4.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, @@ -1147,6 +1147,7 @@ all = [ { name = "tiktoken" }, { name = "tree-sitter-dm" }, { name = "tree-sitter-hcl" }, + { name = "tree-sitter-pascal" }, { name = "tree-sitter-sql" }, { name = "watchdog" }, { name = "yt-dlp" }, @@ -1198,6 +1199,9 @@ openai = [ { name = "openai" }, { name = "tiktoken" }, ] +pascal = [ + { name = "tree-sitter-pascal" }, +] pdf = [ { name = "markdownify" }, { name = "pypdf" }, @@ -1308,6 +1312,8 @@ requires-dist = [ { name = "tree-sitter-kotlin", specifier = ">=1.0,<2.0" }, { name = "tree-sitter-lua", specifier = ">=0.2,<0.6" }, { name = "tree-sitter-objc", specifier = ">=3.0,<4.0" }, + { name = "tree-sitter-pascal", marker = "extra == 'all'" }, + { name = "tree-sitter-pascal", marker = "extra == 'pascal'" }, { name = "tree-sitter-php", specifier = ">=0.23,<0.25" }, { name = "tree-sitter-powershell", specifier = ">=0.26,<0.28" }, { name = "tree-sitter-python", specifier = ">=0.23,<0.26" }, @@ -1325,7 +1331,7 @@ requires-dist = [ { name = "yt-dlp", marker = "extra == 'all'", specifier = ">=2026.6.9" }, { name = "yt-dlp", marker = "extra == 'video'", specifier = ">=2026.6.9" }, ] -provides-extras = ["mcp", "neo4j", "falkordb", "pdf", "watch", "svg", "leiden", "office", "google", "postgres", "video", "kimi", "ollama", "bedrock", "anthropic", "gemini", "openai", "chinese", "sql", "dm", "terraform", "all"] +provides-extras = ["mcp", "neo4j", "falkordb", "pdf", "watch", "svg", "leiden", "office", "google", "postgres", "video", "kimi", "ollama", "bedrock", "anthropic", "gemini", "openai", "chinese", "sql", "pascal", "dm", "terraform", "all"] [package.metadata.requires-dev] dev = [ @@ -4728,6 +4734,26 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/bb/ec/34de4da134f48373d2986137e785da86f4df2b70f688307856588a473cff/tree_sitter_objc-3.0.2-cp39-abi3-win_arm64.whl", hash = "sha256:9a99d9b81a4e507bd33329be136928b3ebe424ce8b9d6b8a8339083ceb453b5b", size = 301378, upload-time = "2024-12-16T00:37:36.424Z" }, ] +[[package]] +name = "tree-sitter-pascal" +version = "0.11.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/89/89/cb9ce7f7e9a119a3d518020c387fb994f8f6cac07a3f796fbb3409b506fb/tree_sitter_pascal-0.11.0.tar.gz", hash = "sha256:7d4da59b8c0b2ff9a32181562eed25c8ba13a6c8bbca2cb895e10f5344708dba", size = 293593, upload-time = "2026-07-01T03:53:16.47Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9a/74/621a4d1690e224de4ae00fb90304469bd96c1ae25bd7a8eabb95f9809b90/tree_sitter_pascal-0.11.0-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:7a8c2bb6ab958cea7390e18ed28f4535ca24ba110eae0449d5a77c294844d45a", size = 238019, upload-time = "2026-07-01T03:53:01.704Z" }, + { url = "https://files.pythonhosted.org/packages/1e/36/8660f400b1c42714f345fc0afae295be2fafec51531d199b7c6e2387881e/tree_sitter_pascal-0.11.0-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:bccb2d757c17820cdcfaa760bac1df4caa6278e1e2334d6956e0f9c31c6e8f4a", size = 125475, upload-time = "2026-07-01T03:53:03.182Z" }, + { url = "https://files.pythonhosted.org/packages/7e/1e/06f87ce971119b6a6c1682a0647cad9774463ae9c68faa8c016d8c10d30f/tree_sitter_pascal-0.11.0-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:ed50bb16a8469a54ae365f51dac046a3247e2efbab203269a8d737fa816b11a6", size = 132345, upload-time = "2026-07-01T03:53:04.643Z" }, + { url = "https://files.pythonhosted.org/packages/00/b6/e37df67cc704f9c19531c858835396366d39790e71114fa181929b0dba00/tree_sitter_pascal-0.11.0-cp38-abi3-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:3ec2ca83d1e01a1eaf7711d6392947058c64302562f987be5c0bcf7e185d0dbd", size = 157887, upload-time = "2026-07-01T03:53:05.849Z" }, + { url = "https://files.pythonhosted.org/packages/aa/81/9e21b0199e86078ca4763ab4bc68fa6e1a3e625e168dee9fdcf27455d09f/tree_sitter_pascal-0.11.0-cp38-abi3-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:ab7557a05400f2841b18d000997453dadff09c2830bd48313cf4264bab018bbe", size = 153629, upload-time = "2026-07-01T03:53:06.99Z" }, + { url = "https://files.pythonhosted.org/packages/20/34/947ae7c72eac8363e3de08f2a1e2f992beeb6afb27daca939443438e4614/tree_sitter_pascal-0.11.0-cp38-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:543717086ae596aa1895c6151230e45f78ed20a69b9c1ab83a5d5950db068381", size = 153629, upload-time = "2026-07-01T03:53:08.138Z" }, + { url = "https://files.pythonhosted.org/packages/14/05/6b103890fdb63c57fb89650ece51333852e0ee8a4a3ef0966168acebfad4/tree_sitter_pascal-0.11.0-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:e317158e32c6e19ab75fe8664b48c48d71e757f6e2f8de0996eba63583d4ea55", size = 152709, upload-time = "2026-07-01T03:53:09.386Z" }, + { url = "https://files.pythonhosted.org/packages/46/6e/ef2c893744b4d53f53113f7ca5bf3016afed6ced3db82ae7d3a42a2faf72/tree_sitter_pascal-0.11.0-cp38-abi3-musllinux_1_2_i686.whl", hash = "sha256:ab2e43d9a4d30ee482322a41f7f12ca2f40b4f0ee1771646329fe57a6a6a29ba", size = 157179, upload-time = "2026-07-01T03:53:10.501Z" }, + { url = "https://files.pythonhosted.org/packages/0f/bf/5b64986483183667c086c6612185a03f3de2408f81b6bac49b60fa45c187/tree_sitter_pascal-0.11.0-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:b545e3b7a20fc7f7ce346e0fc598120a90b980adf050357946b7b00d2a81f875", size = 152117, upload-time = "2026-07-01T03:53:11.842Z" }, + { url = "https://files.pythonhosted.org/packages/18/80/3553a1c89441a8f78daedd6182580db4df234b6b4ddd0e9d18ac9a2f7385/tree_sitter_pascal-0.11.0-cp38-abi3-win32.whl", hash = "sha256:c898d8c2771c5da47dbab20aea1d99e3aca8878a90e24db0a5558619ac8ad5c5", size = 124205, upload-time = "2026-07-01T03:53:12.969Z" }, + { url = "https://files.pythonhosted.org/packages/19/96/695db7513510ea4fedb5e4e9b47011bf309253715c5eb9892c71486312e6/tree_sitter_pascal-0.11.0-cp38-abi3-win_amd64.whl", hash = "sha256:99346d54c928d42c820c0aa262f6acbf4fb2856d69016f1df11f834f681b45e0", size = 124349, upload-time = "2026-07-01T03:53:14.082Z" }, + { url = "https://files.pythonhosted.org/packages/45/ad/e5381365ed5b247cad2e047682b081ccbb79f84bb5c1b48642ef3385f1d3/tree_sitter_pascal-0.11.0-cp38-abi3-win_arm64.whl", hash = "sha256:9d22b974a47765f1c98629338d82d1df89c35c270a73f08dda8fbd49538e32d4", size = 124914, upload-time = "2026-07-01T03:53:15.191Z" }, +] + [[package]] name = "tree-sitter-php" version = "0.24.1" From f2b81a99809b38e90d35856d94a3c33968d1f60f Mon Sep 17 00:00:00 2001 From: safishamsi Date: Mon, 6 Jul 2026 00:56:35 +0100 Subject: [PATCH 29/39] docs: changelog credit for #1616 Co-Authored-By: Claude Opus 4.8 (1M context) --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6609559f3..a4069599a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ Full release notes with details on each version: [GitHub Releases](https://githu ## Unreleased +- Feat: added a `pascal` optional extra for AST-quality Pascal/Delphi extraction (#1616, thanks @vinicius-l-machado). `extract_pascal` already used tree-sitter-pascal when present (with a regex fallback), but the grammar was never declared in the package metadata, so the AST path never ran out of the box. `uv tool install "graphifyy[pascal]"` now opts into it (also included in `[all]`); tree-sitter-pascal ships prebuilt wheels for every platform, so no C toolchain is needed. On a mid-size Delphi codebase the AST path yields notably more accurate `calls`/`inherits` edges than the regex fallback. - Feat: JS/TS rationale comments and ADR/RFC citations are now extracted (#1599, thanks @niltonmourafilho-arch). Python already turned `# NOTE:`/`# WHY:`/`# HACK:` comments and docstrings into `rationale` nodes, but JS/TS comments were discarded. `extract_js` now runs the same post-pass: `// NOTE:`-style and block-comment rationale become `rationale` nodes with `rationale_for` edges, and `ADR-NNNN` / `RFC NNNN` citations become `doc_ref` nodes with `cites` edges from the file, closing the code-to-design-doc gap in mixed corpora at zero LLM cost (pure line scan). Files with no such comments are unaffected. - Fix: extensionless executables with a shebang (CLI entry points like `devctl`, `manage`) are now extracted (#1683, thanks @Stashub). `detect` already classified a `#!/usr/bin/env bash`/`python`/`node`/... file as code, but `_get_extractor` dispatched on the suffix alone and returned nothing, so the file was silently dropped from the graph and its doc-referenced symbols stayed dangling stubs. Extensionless files now resolve their extractor from the shebang interpreter (`_SHEBANG_DISPATCH`), mirroring detection. Only interpreters with a real extractor are mapped (python, bash-family, node, ruby, lua, php, julia); others (perl, fish, Rscript) stay skipped rather than mis-parsed by a wrong grammar. - Feat: Ruby `include`/`extend`/`prepend ` now emits a `mixes_in` edge to the module (#1668, thanks @krishnateja7). Concerns/mixins are the composition mechanism in Rails, but they produced no edges, so the blast radius of editing a shared concern was invisible to `affected`. A constant-argument mixin inside a class or module body now resolves to the module node (reusing the #1634 candidate logic and the #1640 module nodes, under the single-owner guard) and emits `Class --mixes_in--> Module`, which `affected` already traverses. `extend self` and non-constant arguments are skipped; an ambiguous or undefined module produces no edge. From 92edf78005f849cf36f0b141347e30e9a86128a6 Mon Sep 17 00:00:00 2001 From: NydiaChung Date: Mon, 6 Jul 2026 01:01:53 +0100 Subject: [PATCH 30/39] feat(java): suppress java stdlib types from references edges (#1603) Adds a _JAVA_BUILTIN_TYPES skip list so ubiquitous java.lang/util/io/time/etc. type names (String, List, Map, Optional, ...) are not emitted as references edges (they never resolve to a project node). Mirrors _GO_PREDECLARED_TYPES / _PYTHON_ANNOTATION_NOISE. Nested user-type generic args still resolve. Co-Authored-By: Claude Opus 4.8 (1M context) --- graphify/extract.py | 73 ++++++++++++++++++++++++++++-- tests/test_java_type_resolution.py | 51 +++++++++++++++++++++ tests/test_languages.py | 4 +- 3 files changed, 124 insertions(+), 4 deletions(-) diff --git a/graphify/extract.py b/graphify/extract.py index 2599082f6..be7e99448 100644 --- a/graphify/extract.py +++ b/graphify/extract.py @@ -868,6 +868,69 @@ def _java_type_parameters_in_scope(node, source: bytes) -> frozenset[str]: return frozenset(names) +# java.lang (auto-imported) plus the ubiquitous java.util / java.io / java.time / +# java.util.{stream,function,concurrent} / java.math / java.nio.file types that +# appear as field, parameter, return, and generic-argument annotations. They never +# resolve to a project node, so emitting `references` edges to them is pure noise +# (mirrors _GO_PREDECLARED_TYPES / _PYTHON_ANNOTATION_NOISE). Suppressed at the +# type-ref walker so they are never created as nodes or emitted as edges. The +# boxed-scalar/`void` primitives are already dropped by grammar node type above; +# these are the class/interface names the grammar reports as identifiers. +_JAVA_BUILTIN_TYPES = frozenset({ + # java.lang — core + "Object", "String", "CharSequence", "StringBuilder", "StringBuffer", + "Number", "Byte", "Short", "Integer", "Long", "Float", "Double", + "Boolean", "Character", "Void", "Class", "Enum", "Record", "Math", + "System", "Thread", "Runnable", "Comparable", "Iterable", "Cloneable", + "AutoCloseable", "Appendable", "Readable", "Process", "ProcessBuilder", + "Runtime", "Package", "ThreadLocal", "InheritableThreadLocal", + # java.lang — throwables + "Throwable", "Exception", "RuntimeException", "Error", + "IllegalArgumentException", "IllegalStateException", "NullPointerException", + "IndexOutOfBoundsException", "ArrayIndexOutOfBoundsException", + "ClassCastException", "NumberFormatException", "ArithmeticException", + "UnsupportedOperationException", "InterruptedException", + "CloneNotSupportedException", "SecurityException", "StackOverflowError", + "OutOfMemoryError", "AssertionError", + # java.util — collections & core + "Collection", "List", "ArrayList", "LinkedList", "Vector", "Stack", + "Set", "HashSet", "LinkedHashSet", "TreeSet", "SortedSet", "NavigableSet", + "EnumSet", "Map", "HashMap", "LinkedHashMap", "TreeMap", "SortedMap", + "NavigableMap", "Hashtable", "EnumMap", "Properties", "Queue", "Deque", + "ArrayDeque", "PriorityQueue", "Iterator", "ListIterator", "Comparator", + "Optional", "OptionalInt", "OptionalLong", "OptionalDouble", "Collections", + "Arrays", "Objects", "Date", "Calendar", "Random", "UUID", "Scanner", + "StringJoiner", "StringTokenizer", "BitSet", "Spliterator", "Locale", + "NoSuchElementException", "ConcurrentModificationException", + # java.util.stream + "Stream", "IntStream", "LongStream", "DoubleStream", "Collector", + "Collectors", + # java.util.function + "Function", "BiFunction", "Consumer", "BiConsumer", "Supplier", + "Predicate", "BiPredicate", "UnaryOperator", "BinaryOperator", + "IntFunction", "ToIntFunction", "ToLongFunction", "ToDoubleFunction", + # java.util.concurrent + "Callable", "Future", "CompletableFuture", "CompletionStage", "Executor", + "ExecutorService", "Executors", "ScheduledExecutorService", "TimeUnit", + "ConcurrentHashMap", "ConcurrentMap", "CopyOnWriteArrayList", + "BlockingQueue", "CountDownLatch", "Semaphore", "CyclicBarrier", + "AtomicInteger", "AtomicLong", "AtomicBoolean", "AtomicReference", + # java.time + "Instant", "Duration", "Period", "LocalDate", "LocalTime", "LocalDateTime", + "ZonedDateTime", "OffsetDateTime", "ZoneId", "ZoneOffset", "DayOfWeek", + "Month", "Year", "Clock", "DateTimeFormatter", + # java.io / java.nio.file + "IOException", "UncheckedIOException", "FileNotFoundException", "File", + "InputStream", "OutputStream", "Reader", "Writer", "BufferedReader", + "BufferedWriter", "InputStreamReader", "OutputStreamWriter", "FileReader", + "FileWriter", "PrintStream", "PrintWriter", "ByteArrayInputStream", + "ByteArrayOutputStream", "Serializable", "Closeable", "Path", "Paths", + "Files", + # java.math + "BigDecimal", "BigInteger", +}) + + def _java_collect_type_refs( node, source: bytes, @@ -885,19 +948,23 @@ def _java_collect_type_refs( return if t == "type_identifier": name = _read_text(node, source) - if name and name not in skip: + if name and name not in skip and name not in _JAVA_BUILTIN_TYPES: out.append((name, "generic_arg" if generic else "type")) return if t == "scoped_type_identifier": text = _read_text(node, source).rsplit(".", 1)[-1] - if text: + if text and text not in _JAVA_BUILTIN_TYPES: out.append((text, "generic_arg" if generic else "type")) return if t == "generic_type": for c in node.children: if c.type in ("type_identifier", "scoped_type_identifier"): text = _read_text(c, source).rsplit(".", 1)[-1] - if text and (c.type == "scoped_type_identifier" or text not in skip): + if ( + text + and text not in _JAVA_BUILTIN_TYPES + and (c.type == "scoped_type_identifier" or text not in skip) + ): out.append((text, "generic_arg" if generic else "type")) break for c in node.children: diff --git a/tests/test_java_type_resolution.py b/tests/test_java_type_resolution.py index ccd97d9bb..35229776e 100644 --- a/tests/test_java_type_resolution.py +++ b/tests/test_java_type_resolution.py @@ -150,6 +150,57 @@ def test_java_type_parameters_do_not_resolve_to_real_class(tmp_path: Path): assert ("Generic", "references", "T") not in references +def test_java_builtin_library_types_not_emitted_as_references(tmp_path: Path): + # Built-in / standard-library types (java.lang, java.util, …) used as field, + # parameter, or return types carry no useful graph meaning: they never resolve + # to a project node, so emitting `references` edges to them is pure noise. + svc = _write( + tmp_path / "Svc.java", + "package com.app;\n" + "import java.util.List;\n" + "import java.util.Map;\n" + "public class Svc {\n" + " private String name;\n" + " private List ids;\n" + " public Map lookup(Long id) { return null; }\n" + " public java.util.Optional flag() { return null; }\n" + "}\n", + ) + result = extract([svc], cache_root=tmp_path) + + ref_targets = { + by_label + for (src, rel, by_label) in _label_edges(result, {"references"}) + } + for builtin in ( + "String", "Integer", "Map", "Object", "Long", + "List", "Optional", "Boolean", + ): + assert builtin not in ref_targets, ( + f"builtin/library type {builtin!r} should not be a references target" + ) + + +def test_java_user_types_still_emit_references(tmp_path: Path): + # Guard against over-skipping: a user-defined type sharing the field/return + # shape must still resolve to a real `references` edge. + dto = _write(tmp_path / "OrderDto.java", + "package com.app;\npublic class OrderDto {}\n") + svc = _write( + tmp_path / "OrderSvc.java", + "package com.app;\n" + "public class OrderSvc {\n" + " private java.util.List orders;\n" + " public OrderDto first() { return null; }\n" + "}\n", + ) + result = extract([dto, svc], cache_root=tmp_path) + ref_targets = { + by_label for (_, _, by_label) in _label_edges(result, {"references"}) + } + assert "OrderDto" in ref_targets, "user type OrderDto must still emit references" + + def test_java_cross_file_constructor_call_resolves(tmp_path: Path): # #1373: `new Foo(...)` in a method body must produce a cross-file edge to the # Foo definition. Foo is NOT used as a return type here, so the edge can only diff --git a/tests/test_languages.py b/tests/test_languages.py index 38eb7e169..9aa64b526 100644 --- a/tests/test_languages.py +++ b/tests/test_languages.py @@ -472,7 +472,9 @@ def test_java_record_component_type_references(tmp_path): result = extract_java(source) assert ("Order", "Payload") in _edge_labels(result, "references", "field") - assert ("Order", "List") in _edge_labels(result, "references", "field") + # `List` is a java.util library type: skipped as noise, so only its user-type + # generic argument (`Item`) survives, not the container itself. + assert ("Order", "List") not in _edge_labels(result, "references") assert ("Order", "Item") in _edge_labels(result, "references", "generic_arg") assert ("Order", "Attachment") in _edge_labels(result, "references", "field") From dd8c24cf7b25fbc52b56d3ac651ac73e13ae2fab Mon Sep 17 00:00:00 2001 From: guyoron1 Date: Mon, 6 Jul 2026 01:08:10 +0100 Subject: [PATCH 31/39] docs: add .claudeignore tip for prompt cache (#1539); changelog for #1603 Applied the .claudeignore troubleshooting entry from #1539 manually (the PR branched from an older README). Closes #1387. Co-Authored-By: Claude Opus 4.8 (1M context) --- CHANGELOG.md | 1 + README.md | 8 ++++++++ 2 files changed, 9 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index a4069599a..e373d3a16 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ Full release notes with details on each version: [GitHub Releases](https://githu ## Unreleased +- Fix: Java standard-library types are no longer emitted as `references` noise (#1603, thanks @NydiaChung). A `_JAVA_BUILTIN_TYPES` skip list now suppresses ubiquitous `java.lang`/`java.util`/`java.io`/`java.time`/`java.math`/`java.nio.file` type names (`String`, `List`, `Map`, `Optional`, `Integer`, `Exception`, ...) at the type-ref walker; they never resolve to a project node, so edges to them were pure noise (mirrors `_GO_PREDECLARED_TYPES`/`_PYTHON_ANNOTATION_NOISE`). Nested user-type generic arguments still resolve: `List` drops the `List` edge but keeps `Item`. - Feat: added a `pascal` optional extra for AST-quality Pascal/Delphi extraction (#1616, thanks @vinicius-l-machado). `extract_pascal` already used tree-sitter-pascal when present (with a regex fallback), but the grammar was never declared in the package metadata, so the AST path never ran out of the box. `uv tool install "graphifyy[pascal]"` now opts into it (also included in `[all]`); tree-sitter-pascal ships prebuilt wheels for every platform, so no C toolchain is needed. On a mid-size Delphi codebase the AST path yields notably more accurate `calls`/`inherits` edges than the regex fallback. - Feat: JS/TS rationale comments and ADR/RFC citations are now extracted (#1599, thanks @niltonmourafilho-arch). Python already turned `# NOTE:`/`# WHY:`/`# HACK:` comments and docstrings into `rationale` nodes, but JS/TS comments were discarded. `extract_js` now runs the same post-pass: `// NOTE:`-style and block-comment rationale become `rationale` nodes with `rationale_for` edges, and `ADR-NNNN` / `RFC NNNN` citations become `doc_ref` nodes with `cites` edges from the file, closing the code-to-design-doc gap in mixed corpora at zero LLM cost (pure line scan). Files with no such comments are unaffected. - Fix: extensionless executables with a shebang (CLI entry points like `devctl`, `manage`) are now extracted (#1683, thanks @Stashub). `detect` already classified a `#!/usr/bin/env bash`/`python`/`node`/... file as code, but `_get_extractor` dispatched on the suffix alone and returned nothing, so the file was silently dropped from the graph and its doc-referenced symbols stayed dangling stubs. Extensionless files now resolve their extractor from the shebang interpreter (`_SHEBANG_DISPATCH`), mirroring detection. Only interpreters with a real extractor are mapped (python, bash-family, node, ruby, lua, php, julia); others (perl, fish, Rscript) stay skipped rather than mis-parsed by a wrong grammar. diff --git a/README.md b/README.md index 5c0b3d479..c9e4ad701 100644 --- a/README.md +++ b/README.md @@ -532,6 +532,14 @@ uv tool upgrade graphifyy graphify install # overwrites the skill file ``` +**Claude Code prompt cache invalidated after every `graphify extract`** +Graphify writes output files (`graph.json`, `graphify-out/`) into the workspace. If those paths aren't ignored, every write invalidates Claude Code's prompt cache, forcing a full re-upload at cache-write rates on the next turn. Add them to `.claudeignore`: +```text +# .claudeignore +graph.json +graphify-out/ +``` + --- ## Full command reference From b699182a4fed5207c4e6a4aa4d3cd2f5f983590e Mon Sep 17 00:00:00 2001 From: safishamsi Date: Mon, 6 Jul 2026 01:31:06 +0100 Subject: [PATCH 32/39] release: 0.9.7 17 fixes/features since 0.9.6. Highlights: - Ruby: mixes_in edges for include/extend/prepend (#1668) and affected reaching method-bound callers (#1669); constant-receiver call resolution hardening continues from #1634. - Extensionless shebang CLIs are now extracted (#1683); JS/TS rationale + ADR/RFC doc refs (#1599); Java stdlib types dropped from references noise (#1603); pascal optional extra (#1616). - Incremental/detect correctness: Office source edits re-enter --update (#1649), Windows long-path hashing (#1655), word-count caching (#1656), zero-node results no longer cached + warned (#1666). - JS/TS phantom cross-package calls edge killed (#1659); Windows skill name + OpenCode plugin separator + doc-corpus report noise (#1635/#1646/#1657); case-insensitive suffix dispatch (#1671); postgres URI on Windows (#1672); deferred import() not a cycle (#1241). Co-Authored-By: Claude Opus 4.8 (1M context) --- CHANGELOG.md | 2 +- pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e373d3a16..fe0bc82e7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,7 @@ Full release notes with details on each version: [GitHub Releases](https://github.com/safishamsi/graphify/releases) -## Unreleased +## 0.9.7 (2026-07-06) - Fix: Java standard-library types are no longer emitted as `references` noise (#1603, thanks @NydiaChung). A `_JAVA_BUILTIN_TYPES` skip list now suppresses ubiquitous `java.lang`/`java.util`/`java.io`/`java.time`/`java.math`/`java.nio.file` type names (`String`, `List`, `Map`, `Optional`, `Integer`, `Exception`, ...) at the type-ref walker; they never resolve to a project node, so edges to them were pure noise (mirrors `_GO_PREDECLARED_TYPES`/`_PYTHON_ANNOTATION_NOISE`). Nested user-type generic arguments still resolve: `List` drops the `List` edge but keeps `Item`. - Feat: added a `pascal` optional extra for AST-quality Pascal/Delphi extraction (#1616, thanks @vinicius-l-machado). `extract_pascal` already used tree-sitter-pascal when present (with a regex fallback), but the grammar was never declared in the package metadata, so the AST path never ran out of the box. `uv tool install "graphifyy[pascal]"` now opts into it (also included in `[all]`); tree-sitter-pascal ships prebuilt wheels for every platform, so no C toolchain is needed. On a mid-size Delphi codebase the AST path yields notably more accurate `calls`/`inherits` edges than the regex fallback. diff --git a/pyproject.toml b/pyproject.toml index 3bfe896f1..9f3f48881 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "graphifyy" -version = "0.9.6" +version = "0.9.7" description = "AI coding assistant skill (Claude Code, CodeBuddy, Codex, OpenCode, Kilo Code, Cursor, Gemini CLI, Aider, OpenClaw, Factory Droid, Trae, Hermes, Kiro, Pi, Devin CLI, Google Antigravity) - turn any folder of code, docs, papers, images, or videos into a queryable knowledge graph" readme = "README.md" license = { file = "LICENSE" } From 31211a0e7c512d63972b4f0438877d3777ae0e85 Mon Sep 17 00:00:00 2001 From: safishamsi Date: Mon, 6 Jul 2026 02:34:28 +0100 Subject: [PATCH 33/39] docs(readme): visual overhaul (hero, capability table, query demo, honest benchmarks table) Rework the top of the README into a self-contained pitch: - New logo + Trendshift badge; collapse the 31-language row into a toggle so the tagline and hero land in the first screen. - Hero screenshot of the FastAPI graph, tagline with selective bold. - 'What it does' capability table and a 'See it in action' section with verbatim explain/path output (real relations + confidence tags). - Benchmarks as a scannable table, honest: shows where competitors lead, only bolds rows graphify wins or ties, names the tie. - Collapse platform picker + optional extras into
; typography and identifier-formatting polish; fix orphaned paragraphs; reword the confidence-tag gloss; drop the redundant callflow CTA from the hero. Co-Authored-By: Claude Opus 4.8 (1M context) --- README.md | 90 ++++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 70 insertions(+), 20 deletions(-) diff --git a/README.md b/README.md index c9e4ad701..ea3c862e3 100644 --- a/README.md +++ b/README.md @@ -3,9 +3,17 @@

- 🇺🇸 English | 🇨🇳 简体中文 | 🇯🇵 日本語 | 🇰🇷 한국어 | 🇩🇪 Deutsch | 🇫🇷 Français | 🇪🇸 Español | 🇮🇳 हिन्दी | 🇧🇷 Português | 🇷🇺 Русский | 🇸🇦 العربية | 🇮🇷 فارسی | 🇮🇹 Italiano | 🇵🇱 Polski | 🇳🇱 Nederlands | 🇹🇷 Türkçe | 🇺🇦 Українська | 🇻🇳 Tiếng Việt | 🇮🇩 Bahasa Indonesia | 🇸🇪 Svenska | 🇬🇷 Ελληνικά | 🇷🇴 Română | 🇨🇿 Čeština | 🇫🇮 Suomi | 🇩🇰 Dansk | 🇳🇴 Norsk | 🇭🇺 Magyar | 🇹🇭 ภาษาไทย | 🇺🇿 Oʻzbekcha | 🇹🇼 繁體中文 | 🇵🇭 Filipino + Graphify-Labs%2Fgraphify | Trendshift

+
+
Read this in other languages + +🇺🇸 English | 🇨🇳 简体中文 | 🇯🇵 日本語 | 🇰🇷 한국어 | 🇩🇪 Deutsch | 🇫🇷 Français | 🇪🇸 Español | 🇮🇳 हिन्दी | 🇧🇷 Português | 🇷🇺 Русский | 🇸🇦 العربية | 🇮🇷 فارسی | 🇮🇹 Italiano | 🇵🇱 Polski | 🇳🇱 Nederlands | 🇹🇷 Türkçe | 🇺🇦 Українська | 🇻🇳 Tiếng Việt | 🇮🇩 Bahasa Indonesia | 🇸🇪 Svenska | 🇬🇷 Ελληνικά | 🇷🇴 Română | 🇨🇿 Čeština | 🇫🇮 Suomi | 🇩🇰 Dansk | 🇳🇴 Norsk | 🇭🇺 Magyar | 🇹🇭 ภาษาไทย | 🇺🇿 Oʻzbekcha | 🇹🇼 繁體中文 | 🇵🇭 Filipino + +
+
+

YC S26 Discord @@ -18,7 +26,7 @@ X

-Type `/graphify` in your AI coding assistant and it maps your entire project — code, docs, PDFs, images, videos — into a knowledge graph you can query instead of grepping through files. +Type `/graphify` in your AI coding assistant and it maps your entire project (code, docs, PDFs, images, videos) into a **knowledge graph** you can **query instead of grepping** through files.

graphify's interactive graph.html showing the FastAPI codebase as a force-directed knowledge graph with a legend of detected communities @@ -27,13 +35,13 @@ Type `/graphify` in your AI coding assistant and it maps your entire project — The FastAPI codebase mapped by graphify. Every node is a concept, colors are detected communities, and the whole thing is clickable in graph.html.

-Works in Claude Code, Codex, OpenCode, Kilo Code, Cursor, Gemini CLI, GitHub Copilot CLI, VS Code Copilot Chat, Aider, Amp, OpenClaw, Factory Droid, Trae, Hermes, Kimi Code, Kiro, Pi, Devin CLI, and Google Antigravity. +**Works in:** Claude Code, Codex, OpenCode, Kilo Code, Cursor, Gemini CLI, GitHub Copilot CLI, VS Code Copilot Chat, Aider, Amp, OpenClaw, Factory Droid, Trae, Hermes, Kimi Code, Kiro, Pi, Devin CLI, and Google Antigravity. ``` /graphify . ``` -That's it. You get three files: +That's it. You get **three files**: ``` graphify-out/ @@ -42,12 +50,49 @@ graphify-out/ └── graph.json the full graph — query it anytime without re-reading your files ``` -For a readable architecture page with Mermaid call-flow diagrams, run: +--- -```bash -graphify export callflow-html +## What it does + +A knowledge graph is not a vector index: it is **deterministic**, **every edge is explained**, and it costs **zero tokens to build**. + +| Capability | What you get | +|---|---| +| **God nodes** | The most-connected concepts, so you see what everything flows through | +| **Communities** | The graph split into subsystems (Leiden), with LLM-free labels | +| **Cross-file links** | `calls` / `imports` / `inherits` / `mixes_in` resolved across ~40 languages via tree-sitter AST | +| **Query, path, explain** | Ask a question, trace the path between two things, or explain one concept, all against `graph.json` | +| **Rationale + doc refs** | `# NOTE:` / `# WHY:` comments and ADR/RFC citations become first-class nodes linked to the code | +| **Beyond code** | Docs, PDFs, images, and video/audio all map into the same graph | +| **Local-first** | AST plus a local embedder build the graph with zero LLM credits; your code never leaves your machine | + +--- + +## See it in action + +Once the graph is built you query it instead of reading files. Real output, graphify run on the FastAPI codebase shown above: + +```text +$ graphify explain "APIRouter" +Node: APIRouter + Source: routing.py L2210 + Community: 2 + Degree: 47 + +Connections (47): + --> RequestValidationError [uses] [INFERRED] + --> Dependant [uses] [INFERRED] + --> .get() [method] [EXTRACTED] + <-- __init__.py [imports] [EXTRACTED] + ... + +$ graphify path "FastAPI" "ModelField" +Shortest path (3 hops): + FastAPI --uses--> DefaultPlaceholder <--references-- get_request_handler() --references--> ModelField ``` +Every edge carries a **confidence tag** (`EXTRACTED` = explicit in the source, `INFERRED` = derived by resolution), so you can tell what was read directly from what was inferred. `graphify query ""` returns a scoped subgraph for a plain-language question, and `graphify path A B` traces how any two things connect. + --- ## Benchmarks @@ -55,8 +100,8 @@ graphify export callflow-html | Benchmark | Metric | graphify | Field | |---|---|---|---| | LOCOMO (n=300) | recall@10 | **0.497** | mem0 0.048, supermemory 0.149 | -| LOCOMO (n=300) | QA accuracy | **45.3%** | supermemory 49.7%, mem0 27.3% | -| LongMemEval-S (n=50) | QA accuracy | **76%** | tied best | +| LOCOMO (n=300) | QA accuracy | 45.3% | supermemory 49.7%, mem0 27.3% | +| LongMemEval-S (n=50) | QA accuracy | **76%** | tied with dense RAG | | Graph build | LLM credits | **0** | per-token for most systems | Every system ran on the same harness with the same model and budgets, scored by a judge blind-validated against a second judge (90.6% agreement, Cohen's kappa 0.81). Full per-system tables, the code-intelligence result, and reproduction commands: **[BENCHMARKS.md](./BENCHMARKS.md)**. @@ -167,7 +212,7 @@ for example `graphify claude install --project` or `graphify codex install --pro | Devin CLI | `graphify devin install` | | Google Antigravity | `graphify antigravity install` | -Codex users also need `multi_agent = true` under `[features]` in `~/.codex/config.toml` for parallel extraction. CodeBuddy uses the same Agent tool and PreToolUse hook mechanism as Claude Code. Factory Droid uses the `Task` tool for parallel subagent dispatch. OpenClaw and Aider use sequential extraction (parallel agent support is still early on those platforms). Trae uses the Agent tool for parallel subagent dispatch and does **not** support PreToolUse hooks — AGENTS.md is the always-on mechanism. +Codex users also need `multi_agent = true` under `[features]` in `~/.codex/config.toml` for parallel extraction. CodeBuddy uses the same Agent tool and PreToolUse hook mechanism as Claude Code. Factory Droid uses the `Task` tool for parallel subagent dispatch. OpenClaw and Aider use sequential extraction (parallel agent support is still early on those platforms). Trae uses the Agent tool for parallel subagent dispatch and does **not** support `PreToolUse` hooks, so AGENTS.md is the always-on mechanism. `--platform agents` (alias `--platform skills`) targets the generic cross-framework [Agent-Skills](https://github.com/anthropics/skills) locations: the spec's user-global `~/.agents/skills/` (read by `npx skills` and spec-compliant frameworks) for a global install, and `./.agents/skills/` for a project (`--project`) install. The bare `graphify install` stays single-platform (Claude Code) by design — use the named `agents` platform when you want the skill discoverable by any framework that reads `.agents/skills`. @@ -236,19 +281,24 @@ Run this once in your project after building a graph: | Devin CLI | `graphify devin install` | | Google Antigravity | `graphify antigravity install` | -This writes a small config file that tells your assistant to consult the knowledge graph for codebase questions — preferring scoped queries like `graphify query ""` over reading the full report or grepping raw files. On platforms that support payload-bearing hooks (Claude Code, Gemini CLI), a hook fires automatically before search-style tool calls (and, on Claude Code, before reading source files one by one via the Read/Glob tools) and nudges your assistant toward the graph path. On the others (Codex, OpenCode, Cursor, etc.), the persistent instruction files (`AGENTS.md`, `.cursor/rules/`, etc.) provide the same query-first guidance. `GRAPH_REPORT.md` is still available for broad architecture review. +This writes a small config file that tells your assistant to consult the knowledge graph for codebase questions, preferring scoped queries like `graphify query ""` over reading the full report or grepping raw files. -**CodeBuddy** does the same two things as Claude Code: writes a `CODEBUDDY.md` section telling CodeBuddy to read `graphify-out/GRAPH_REPORT.md` before answering architecture questions, and installs **PreToolUse hooks** (`.codebuddy/settings.json`) that fire before Bash search commands and file reads, nudging toward `graphify query` instead. +- **Hook platforms** (Claude Code, Gemini CLI): a hook fires automatically before search-style tool calls (and, on Claude Code, before reading source files one by one via the Read/Glob tools) and nudges your assistant toward the graph path. +- **Instruction-file platforms** (Codex, OpenCode, Cursor, etc.): persistent instruction files (`AGENTS.md`, `.cursor/rules/`, etc.) provide the same query-first guidance. -**Codex** writes to `AGENTS.md` and also installs a **PreToolUse hook** in `.codex/hooks.json` that fires before every Bash tool call — same always-on mechanism as Claude Code. +`GRAPH_REPORT.md` is still available for broad architecture review. -To remove graphify from all platforms at once: `graphify uninstall` (add `--purge` to also delete `graphify-out/`). Or use the per-platform command (e.g. `graphify claude uninstall`). +**CodeBuddy** does the same two things as Claude Code: writes a `CODEBUDDY.md` section telling CodeBuddy to read `graphify-out/GRAPH_REPORT.md` before answering architecture questions, and installs `PreToolUse` hooks (`.codebuddy/settings.json`) that fire before Bash search commands and file reads, nudging toward `graphify query` instead. ---- +**Codex** writes to `AGENTS.md` and also installs a `PreToolUse` hook in `.codex/hooks.json` that fires before every Bash tool call, same always-on mechanism as Claude Code. + +**Kilo Code** installs the Graphify skill to `~/.config/kilo/skills/graphify/SKILL.md` and a native `/graphify` command to `~/.config/kilo/command/graphify.md`. `graphify kilo install` also writes `AGENTS.md` plus a native `tool.execute.before` plugin (`.kilo/plugins/graphify.js` + `.kilo/kilo.json` or `.kilo/kilo.jsonc` registration) so Kilo gets the same always-on graph reminder behavior through native `.kilo` config. -**Kilo Code** installs the Graphify skill to `~/.config/kilo/skills/graphify/SKILL.md` and a native `/graphify` command to `~/.config/kilo/command/graphify.md`. `graphify kilo install` also writes `AGENTS.md` plus a native **`tool.execute.before` plugin** (`.kilo/plugins/graphify.js` + `.kilo/kilo.json` or `.kilo/kilo.jsonc` registration) so Kilo gets the same always-on graph reminder behavior through native `.kilo` config. +**Cursor** writes `.cursor/rules/graphify.mdc` with `alwaysApply: true`, so Cursor includes it in every conversation automatically, no hook needed. -**Cursor** writes `.cursor/rules/graphify.mdc` with `alwaysApply: true` — Cursor includes it in every conversation automatically, no hook needed. +To remove graphify from all platforms at once: `graphify uninstall` (add `--purge` to also delete `graphify-out/`). Or use the per-platform command (e.g. `graphify claude uninstall`). + +--- ## What's in the report @@ -277,7 +327,7 @@ To remove graphify from all platforms at once: `graphify uninstall` (add `--purg | Video / Audio | `.mp4 .mov .mp3 .wav` and more (requires `uv tool install graphifyy[video]`) | | YouTube / URLs | any video URL (requires `uv tool install graphifyy[video]`) | -Code is extracted locally with no API calls (AST via tree-sitter). Everything else goes through your AI assistant's model API. +Code is extracted **locally with no API calls** (AST via tree-sitter). Everything else goes through your AI assistant's model API. Google Drive for desktop `.gdoc`, `.gsheet`, and `.gslides` files are shortcut pointers, not document content. To include native Google Docs, Sheets, and Slides @@ -464,7 +514,7 @@ These are only needed for **headless / CI extraction** (`graphify extract`). Whe - **Video / audio** — transcribed locally with faster-whisper. Nothing leaves your machine. - **Docs, PDFs, images** — sent to your AI assistant for semantic extraction (via the `/graphify` skill, using whatever model your IDE session runs). Headless `graphify extract` requires `GEMINI_API_KEY` / `GOOGLE_API_KEY` (Gemini), `MOONSHOT_API_KEY` (Kimi), `ANTHROPIC_API_KEY` (Claude), `OPENAI_API_KEY` (OpenAI), `DEEPSEEK_API_KEY` (DeepSeek), a running Ollama instance (`OLLAMA_BASE_URL`), AWS credentials via the standard provider chain (Bedrock - no API key needed, uses IAM), or the `claude` CLI binary (Claude Code - no API key needed, uses your Claude subscription). The `--dedup-llm` flag uses the same key. - **Data residency** — `graphify extract` auto-detects which provider to use based on which API key is set (priority: Gemini → Kimi → Claude → OpenAI → DeepSeek → Azure → Bedrock → Ollama). For code with data-residency requirements, use `--backend ollama` (fully local) or pass an explicit `--backend` flag. Kimi (`MOONSHOT_API_KEY`) routes to Moonshot AI servers in China. -- No telemetry, no usage tracking, no analytics. +- **No telemetry**, no usage tracking, no analytics. - **Query logging** — every `graphify query`, `graphify path`, `graphify explain`, and MCP `query_graph` call is logged to `~/.cache/graphify-queries.log` in JSON Lines format (timestamp, question, corpus, nodes returned, duration). Full subgraph responses are **not** stored by default. Set `GRAPHIFY_QUERY_LOG_DISABLE=1` to opt out, or `GRAPHIFY_QUERY_LOG=/dev/null` to silence without disabling the code path. --- @@ -706,7 +756,7 @@ graphify label ./my-project --backend=openai --model gpt-4o # force a specific --- -## Built on graphify — Penpax +## Built on graphify: Penpax [**Penpax**](https://graphifylabs.ai) is the always-on layer built on top of graphify — it applies the same graph approach to your entire working life: meetings, browser history, emails, files, and code, updating continuously in the background. From 74a1457290482bab705729c6323a19e5e9d6b19b Mon Sep 17 00:00:00 2001 From: Fabian Wilde Date: Mon, 6 Jul 2026 13:23:27 +0200 Subject: [PATCH 34/39] feat(skill): Sigma.js viz fallback + batched community-label reconciliation vis-network's client-side forceAtlas2 physics simulation is verified slow/laggy past a few hundred nodes regardless of hardware (apa monorepo, 1083-community aggregated view, 2026-07-03). Step 6 now generates a separate WebGL Sigma.js render with the layout precomputed offline in Python once a view exceeds ~300 nodes, documented in a new shared reference (references/sigma-viz.md) shipped to every split-platform skill variant via tools/skillgen. Step 5's community labeling also gains a batched-subagent flow for 100+ communities (sample top-degree nodes per community, dispatch one subagent per ~15-20-community batch in parallel) plus a required cross-batch label-reconciliation pass, since batches only see their own slice and naturally produce duplicate labels across siblings (338 of 1083 communities, 31%, collided before reconciliation on the same run). Ported from local edits to the installed ~/.claude/skills/graphify/ skill made in a prior session against a production run, which were not yet committed to the repo. --- CHANGELOG.md | 2 + graphify/skill-agents.md | 18 ++ graphify/skill-amp.md | 18 ++ graphify/skill-claw.md | 18 ++ graphify/skill-codex.md | 18 ++ graphify/skill-copilot.md | 18 ++ graphify/skill-droid.md | 18 ++ graphify/skill-kilo.md | 18 ++ graphify/skill-kiro.md | 18 ++ graphify/skill-opencode.md | 18 ++ graphify/skill-pi.md | 18 ++ graphify/skill-trae.md | 18 ++ graphify/skill-vscode.md | 18 ++ graphify/skill-windows.md | 18 ++ graphify/skill.md | 18 ++ .../skills/agents/references/sigma-viz.md | 219 ++++++++++++++++++ graphify/skills/amp/references/sigma-viz.md | 219 ++++++++++++++++++ .../skills/claude/references/sigma-viz.md | 219 ++++++++++++++++++ graphify/skills/claw/references/sigma-viz.md | 219 ++++++++++++++++++ graphify/skills/codex/references/sigma-viz.md | 219 ++++++++++++++++++ .../skills/copilot/references/sigma-viz.md | 219 ++++++++++++++++++ graphify/skills/droid/references/sigma-viz.md | 219 ++++++++++++++++++ graphify/skills/kilo/references/sigma-viz.md | 219 ++++++++++++++++++ graphify/skills/kiro/references/sigma-viz.md | 219 ++++++++++++++++++ .../skills/opencode/references/sigma-viz.md | 219 ++++++++++++++++++ graphify/skills/pi/references/sigma-viz.md | 219 ++++++++++++++++++ graphify/skills/trae/references/sigma-viz.md | 219 ++++++++++++++++++ .../skills/vscode/references/sigma-viz.md | 219 ++++++++++++++++++ .../skills/windows/references/sigma-viz.md | 219 ++++++++++++++++++ tests/test_install_references.py | 9 +- tests/test_skillgen.py | 10 +- .../expected/graphify__skill-agents.md | 18 ++ .../skillgen/expected/graphify__skill-amp.md | 18 ++ .../skillgen/expected/graphify__skill-claw.md | 18 ++ .../expected/graphify__skill-codex.md | 18 ++ .../expected/graphify__skill-copilot.md | 18 ++ .../expected/graphify__skill-droid.md | 18 ++ .../skillgen/expected/graphify__skill-kilo.md | 18 ++ .../skillgen/expected/graphify__skill-kiro.md | 18 ++ .../expected/graphify__skill-opencode.md | 18 ++ tools/skillgen/expected/graphify__skill-pi.md | 18 ++ .../skillgen/expected/graphify__skill-trae.md | 18 ++ .../expected/graphify__skill-vscode.md | 18 ++ .../expected/graphify__skill-windows.md | 18 ++ tools/skillgen/expected/graphify__skill.md | 18 ++ ...__skills__agents__references__sigma-viz.md | 219 ++++++++++++++++++ ...ify__skills__amp__references__sigma-viz.md | 219 ++++++++++++++++++ ...__skills__claude__references__sigma-viz.md | 219 ++++++++++++++++++ ...fy__skills__claw__references__sigma-viz.md | 219 ++++++++++++++++++ ...y__skills__codex__references__sigma-viz.md | 219 ++++++++++++++++++ ..._skills__copilot__references__sigma-viz.md | 219 ++++++++++++++++++ ...y__skills__droid__references__sigma-viz.md | 219 ++++++++++++++++++ ...fy__skills__kilo__references__sigma-viz.md | 219 ++++++++++++++++++ ...fy__skills__kiro__references__sigma-viz.md | 219 ++++++++++++++++++ ...skills__opencode__references__sigma-viz.md | 219 ++++++++++++++++++ ...hify__skills__pi__references__sigma-viz.md | 219 ++++++++++++++++++ ...fy__skills__trae__references__sigma-viz.md | 219 ++++++++++++++++++ ...__skills__vscode__references__sigma-viz.md | 219 ++++++++++++++++++ ..._skills__windows__references__sigma-viz.md | 219 ++++++++++++++++++ tools/skillgen/fragments/core/core.md | 18 ++ .../fragments/references/shared/sigma-viz.md | 219 ++++++++++++++++++ tools/skillgen/gen.py | 3 +- 62 files changed, 6888 insertions(+), 9 deletions(-) create mode 100644 graphify/skills/agents/references/sigma-viz.md create mode 100644 graphify/skills/amp/references/sigma-viz.md create mode 100644 graphify/skills/claude/references/sigma-viz.md create mode 100644 graphify/skills/claw/references/sigma-viz.md create mode 100644 graphify/skills/codex/references/sigma-viz.md create mode 100644 graphify/skills/copilot/references/sigma-viz.md create mode 100644 graphify/skills/droid/references/sigma-viz.md create mode 100644 graphify/skills/kilo/references/sigma-viz.md create mode 100644 graphify/skills/kiro/references/sigma-viz.md create mode 100644 graphify/skills/opencode/references/sigma-viz.md create mode 100644 graphify/skills/pi/references/sigma-viz.md create mode 100644 graphify/skills/trae/references/sigma-viz.md create mode 100644 graphify/skills/vscode/references/sigma-viz.md create mode 100644 graphify/skills/windows/references/sigma-viz.md create mode 100644 tools/skillgen/expected/graphify__skills__agents__references__sigma-viz.md create mode 100644 tools/skillgen/expected/graphify__skills__amp__references__sigma-viz.md create mode 100644 tools/skillgen/expected/graphify__skills__claude__references__sigma-viz.md create mode 100644 tools/skillgen/expected/graphify__skills__claw__references__sigma-viz.md create mode 100644 tools/skillgen/expected/graphify__skills__codex__references__sigma-viz.md create mode 100644 tools/skillgen/expected/graphify__skills__copilot__references__sigma-viz.md create mode 100644 tools/skillgen/expected/graphify__skills__droid__references__sigma-viz.md create mode 100644 tools/skillgen/expected/graphify__skills__kilo__references__sigma-viz.md create mode 100644 tools/skillgen/expected/graphify__skills__kiro__references__sigma-viz.md create mode 100644 tools/skillgen/expected/graphify__skills__opencode__references__sigma-viz.md create mode 100644 tools/skillgen/expected/graphify__skills__pi__references__sigma-viz.md create mode 100644 tools/skillgen/expected/graphify__skills__trae__references__sigma-viz.md create mode 100644 tools/skillgen/expected/graphify__skills__vscode__references__sigma-viz.md create mode 100644 tools/skillgen/expected/graphify__skills__windows__references__sigma-viz.md create mode 100644 tools/skillgen/fragments/references/shared/sigma-viz.md diff --git a/CHANGELOG.md b/CHANGELOG.md index f01b4fe4c..60833c012 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,8 @@ Full release notes with details on each version: [GitHub Releases](https://githu ## Unreleased +- Feat: Sigma.js + graphology fallback for large `graph.html` views, plus batched/reconciled community labeling at scale. vis-network's live client-side forceAtlas2 physics simulation is genuinely slow/laggy past a few hundred nodes regardless of hardware — verified in production on a 1083-community monorepo graph (apa, 2026-07-03). Step 6 of the skill now generates a separate WebGL Sigma.js render (`graph_sigma.html`) with the layout precomputed offline in Python (`nx.forceatlas2_layout`, no client-side physics) once the view exceeds ~300 nodes; the full recipe lives in the new `references/sigma-viz.md`, shipped to every split-platform skill variant. Step 5's community labeling also gains a batched-subagent flow for 100+ communities (sample each community's top-degree nodes, dispatch one `general-purpose` subagent per ~15-20-community batch in parallel) plus a required cross-batch label-reconciliation pass — a naive single-pass label run on the same graph left 338 of 1083 communities (31%) sharing a label with another before reconciliation. + - Fix: the `query` reference doc's inline vocab/fallback snippets now read and write files with `encoding="utf-8"` (#1619 A2, thanks @edtrackai). On Windows (default cp1252) the bare `read_text()`/`write_text()` calls crashed on exactly the cross-language corpora the doc demonstrates (e.g. Cyrillic labels like `обработчик`). Fixed across all generated skill variants. - Fix: `graphify update`/`watch` no longer leaves stale sources after a deletion or a destination-only rename (#1623 / #1622, thanks @oleksii-tumanov). When the last supported file was deleted, or a rename reported only its destination in `changed_paths`, the removed source's nodes lingered in `graph.json`. The rebuild now reconciles extractor-backed sources against the files still present (code and document sources, subdirectory roots, legacy markers, symlinks, hyperedges) while preserving semantic and out-of-scope records. diff --git a/graphify/skill-agents.md b/graphify/skill-agents.md index 2e19931fa..0d02e4a31 100644 --- a/graphify/skill-agents.md +++ b/graphify/skill-agents.md @@ -474,8 +474,24 @@ Substitute `IS_DIRECTED` and `INPUT_PATH` as in Step 4. If a `GRAPH HEALTH WARNI Read `graphify-out/.graphify_analysis.json`. For each community key, look at its node labels and write a 2-5 word plain-language name (e.g. "Attention Mechanism", "Training Pipeline", "Data Loading"). +**At scale (100+ communities), do NOT hand-label one at a time and do NOT fall back to a naive path-prefix heuristic (e.g. title-casing the common directory prefix).** Both break down past a handful of communities — the heuristic in particular produces duplicated-segment junk ("Backend Backend", "Frontend Frontend") and word-soup names that look plausible until you actually read them. Verified in production on a 1000+ community monorepo graph (apa, 2026-07-03): a heuristic pass needed a full redo. + +What works instead, for communities with >=20 nodes (the ones that actually surface in God Nodes / navigation): +1. For each such community, sample its ~15 highest-degree (most connected) member nodes — not the full member list, communities can have 300+ nodes. +2. Batch communities into groups of ~15-20 per subagent (write each batch's samples to a small JSON file under `graphify-out/`). +3. Dispatch one `general-purpose` subagent per batch (all in the same message, in parallel — same pattern as Step 3 Part B), each told to read its batch file and write a JSON `{community_id: name}` map based on genuine reasoning about the sampled node labels/paths, not just repeating directory names. +4. Merge all batch results. + +For the long tail of small communities (<20 nodes) where subagent cost isn't justified, a path-prefix heuristic is an acceptable lighter-weight fallback — but dedupe repeated words/segments, strip trailing file extensions, and spot-check a random sample of ~15 outputs across different sizes before trusting it. If duplicated-word or generic ("Community N") names appear in the sample, fix the heuristic before applying it to the rest. + Then regenerate the report and save the labels for the visualizer: +**Reconcile the FULL label set for cross-batch duplicates before regenerating the report — this is a required final pass, not optional polish.** Subagent batches only see their own slice and the small-community heuristic naturally collapses siblings from the same directory (e.g. many different test-file clusters under the same folder), so duplicates are expected even after the steps above — verified in production: 338 of 1083 communities (31%) shared a label with at least one other community before reconciliation (apa monorepo, 2026-07-03). After all labels are assembled: +1. Group community IDs by their current label. +2. For every group with >1 member, pick a distinguishing keyword from each member's OWN node labels (word-frequency count, excluding stopwords and words already in the shared base label) and append it, e.g. `"Agent Gateway MCP Client" -> "Agent Gateway MCP Client — Server"` / `"— Additional"`. +3. If a collision still remains after that (rare — e.g. multiple communities extracted from the very same source image), append a numeric suffix `" (1)"`, `" (2)"` as a last resort. +4. Re-check for zero duplicates before moving on. + ```bash $(cat graphify-out/.graphify_python) -c " import sys, json @@ -531,6 +547,8 @@ graphify export html # auto-aggregates to community view if graph > 5000 nodes # or: graphify export html --no-viz ``` +**If the resulting view (aggregated community graph, or the raw graph for small corpora) has more than ~300 nodes, ALSO generate a Sigma.js + graphology version and present that as the primary interactive file instead of vis-network's `graph.html`.** vis-network runs a live single-threaded JS forceAtlas2 physics simulation on load (200 iterations before it disables itself) — verified in production this is genuinely slow/laggy past a few hundred nodes (apa monorepo, 1083-community aggregated view, 2026-07-03), independent of hardware. Sigma.js (WebGL rendering) with the layout **precomputed offline in Python** (`nx.forceatlas2_layout`, no client-side physics at all) fixes this at the root rather than swapping one JS physics engine for another. See `references/sigma-viz.md` for the full recipe (meta-graph construction, offline layout, self-contained HTML template loading sigma/graphology from esm.sh). Below the 300-node threshold, vis-network's `graph.html` is fine as-is — the extra build step isn't worth it. + ### Steps 6b-8 - Wiki, Neo4j, FalkorDB, SVG, GraphML, MCP, benchmark (only on their flags) These run only when their flag is present (`--wiki`, `--neo4j`/`--neo4j-push`, `--falkordb`/`--falkordb-push`, `--svg`, `--graphml`, `--mcp`) or, for the token-reduction benchmark, when `total_words` exceeds 5,000. A default run with no export flags skips all of them. See `references/exports.md` for each one. Run any `--wiki` export before Step 9 cleanup so `.graphify_labels.json` is still available. diff --git a/graphify/skill-amp.md b/graphify/skill-amp.md index 2e19931fa..0d02e4a31 100644 --- a/graphify/skill-amp.md +++ b/graphify/skill-amp.md @@ -474,8 +474,24 @@ Substitute `IS_DIRECTED` and `INPUT_PATH` as in Step 4. If a `GRAPH HEALTH WARNI Read `graphify-out/.graphify_analysis.json`. For each community key, look at its node labels and write a 2-5 word plain-language name (e.g. "Attention Mechanism", "Training Pipeline", "Data Loading"). +**At scale (100+ communities), do NOT hand-label one at a time and do NOT fall back to a naive path-prefix heuristic (e.g. title-casing the common directory prefix).** Both break down past a handful of communities — the heuristic in particular produces duplicated-segment junk ("Backend Backend", "Frontend Frontend") and word-soup names that look plausible until you actually read them. Verified in production on a 1000+ community monorepo graph (apa, 2026-07-03): a heuristic pass needed a full redo. + +What works instead, for communities with >=20 nodes (the ones that actually surface in God Nodes / navigation): +1. For each such community, sample its ~15 highest-degree (most connected) member nodes — not the full member list, communities can have 300+ nodes. +2. Batch communities into groups of ~15-20 per subagent (write each batch's samples to a small JSON file under `graphify-out/`). +3. Dispatch one `general-purpose` subagent per batch (all in the same message, in parallel — same pattern as Step 3 Part B), each told to read its batch file and write a JSON `{community_id: name}` map based on genuine reasoning about the sampled node labels/paths, not just repeating directory names. +4. Merge all batch results. + +For the long tail of small communities (<20 nodes) where subagent cost isn't justified, a path-prefix heuristic is an acceptable lighter-weight fallback — but dedupe repeated words/segments, strip trailing file extensions, and spot-check a random sample of ~15 outputs across different sizes before trusting it. If duplicated-word or generic ("Community N") names appear in the sample, fix the heuristic before applying it to the rest. + Then regenerate the report and save the labels for the visualizer: +**Reconcile the FULL label set for cross-batch duplicates before regenerating the report — this is a required final pass, not optional polish.** Subagent batches only see their own slice and the small-community heuristic naturally collapses siblings from the same directory (e.g. many different test-file clusters under the same folder), so duplicates are expected even after the steps above — verified in production: 338 of 1083 communities (31%) shared a label with at least one other community before reconciliation (apa monorepo, 2026-07-03). After all labels are assembled: +1. Group community IDs by their current label. +2. For every group with >1 member, pick a distinguishing keyword from each member's OWN node labels (word-frequency count, excluding stopwords and words already in the shared base label) and append it, e.g. `"Agent Gateway MCP Client" -> "Agent Gateway MCP Client — Server"` / `"— Additional"`. +3. If a collision still remains after that (rare — e.g. multiple communities extracted from the very same source image), append a numeric suffix `" (1)"`, `" (2)"` as a last resort. +4. Re-check for zero duplicates before moving on. + ```bash $(cat graphify-out/.graphify_python) -c " import sys, json @@ -531,6 +547,8 @@ graphify export html # auto-aggregates to community view if graph > 5000 nodes # or: graphify export html --no-viz ``` +**If the resulting view (aggregated community graph, or the raw graph for small corpora) has more than ~300 nodes, ALSO generate a Sigma.js + graphology version and present that as the primary interactive file instead of vis-network's `graph.html`.** vis-network runs a live single-threaded JS forceAtlas2 physics simulation on load (200 iterations before it disables itself) — verified in production this is genuinely slow/laggy past a few hundred nodes (apa monorepo, 1083-community aggregated view, 2026-07-03), independent of hardware. Sigma.js (WebGL rendering) with the layout **precomputed offline in Python** (`nx.forceatlas2_layout`, no client-side physics at all) fixes this at the root rather than swapping one JS physics engine for another. See `references/sigma-viz.md` for the full recipe (meta-graph construction, offline layout, self-contained HTML template loading sigma/graphology from esm.sh). Below the 300-node threshold, vis-network's `graph.html` is fine as-is — the extra build step isn't worth it. + ### Steps 6b-8 - Wiki, Neo4j, FalkorDB, SVG, GraphML, MCP, benchmark (only on their flags) These run only when their flag is present (`--wiki`, `--neo4j`/`--neo4j-push`, `--falkordb`/`--falkordb-push`, `--svg`, `--graphml`, `--mcp`) or, for the token-reduction benchmark, when `total_words` exceeds 5,000. A default run with no export flags skips all of them. See `references/exports.md` for each one. Run any `--wiki` export before Step 9 cleanup so `.graphify_labels.json` is still available. diff --git a/graphify/skill-claw.md b/graphify/skill-claw.md index b3542438d..5c337677e 100644 --- a/graphify/skill-claw.md +++ b/graphify/skill-claw.md @@ -477,8 +477,24 @@ Substitute `IS_DIRECTED` and `INPUT_PATH` as in Step 4. If a `GRAPH HEALTH WARNI Read `graphify-out/.graphify_analysis.json`. For each community key, look at its node labels and write a 2-5 word plain-language name (e.g. "Attention Mechanism", "Training Pipeline", "Data Loading"). +**At scale (100+ communities), do NOT hand-label one at a time and do NOT fall back to a naive path-prefix heuristic (e.g. title-casing the common directory prefix).** Both break down past a handful of communities — the heuristic in particular produces duplicated-segment junk ("Backend Backend", "Frontend Frontend") and word-soup names that look plausible until you actually read them. Verified in production on a 1000+ community monorepo graph (apa, 2026-07-03): a heuristic pass needed a full redo. + +What works instead, for communities with >=20 nodes (the ones that actually surface in God Nodes / navigation): +1. For each such community, sample its ~15 highest-degree (most connected) member nodes — not the full member list, communities can have 300+ nodes. +2. Batch communities into groups of ~15-20 per subagent (write each batch's samples to a small JSON file under `graphify-out/`). +3. Dispatch one `general-purpose` subagent per batch (all in the same message, in parallel — same pattern as Step 3 Part B), each told to read its batch file and write a JSON `{community_id: name}` map based on genuine reasoning about the sampled node labels/paths, not just repeating directory names. +4. Merge all batch results. + +For the long tail of small communities (<20 nodes) where subagent cost isn't justified, a path-prefix heuristic is an acceptable lighter-weight fallback — but dedupe repeated words/segments, strip trailing file extensions, and spot-check a random sample of ~15 outputs across different sizes before trusting it. If duplicated-word or generic ("Community N") names appear in the sample, fix the heuristic before applying it to the rest. + Then regenerate the report and save the labels for the visualizer: +**Reconcile the FULL label set for cross-batch duplicates before regenerating the report — this is a required final pass, not optional polish.** Subagent batches only see their own slice and the small-community heuristic naturally collapses siblings from the same directory (e.g. many different test-file clusters under the same folder), so duplicates are expected even after the steps above — verified in production: 338 of 1083 communities (31%) shared a label with at least one other community before reconciliation (apa monorepo, 2026-07-03). After all labels are assembled: +1. Group community IDs by their current label. +2. For every group with >1 member, pick a distinguishing keyword from each member's OWN node labels (word-frequency count, excluding stopwords and words already in the shared base label) and append it, e.g. `"Agent Gateway MCP Client" -> "Agent Gateway MCP Client — Server"` / `"— Additional"`. +3. If a collision still remains after that (rare — e.g. multiple communities extracted from the very same source image), append a numeric suffix `" (1)"`, `" (2)"` as a last resort. +4. Re-check for zero duplicates before moving on. + ```bash $(cat graphify-out/.graphify_python) -c " import sys, json @@ -534,6 +550,8 @@ graphify export html # auto-aggregates to community view if graph > 5000 nodes # or: graphify export html --no-viz ``` +**If the resulting view (aggregated community graph, or the raw graph for small corpora) has more than ~300 nodes, ALSO generate a Sigma.js + graphology version and present that as the primary interactive file instead of vis-network's `graph.html`.** vis-network runs a live single-threaded JS forceAtlas2 physics simulation on load (200 iterations before it disables itself) — verified in production this is genuinely slow/laggy past a few hundred nodes (apa monorepo, 1083-community aggregated view, 2026-07-03), independent of hardware. Sigma.js (WebGL rendering) with the layout **precomputed offline in Python** (`nx.forceatlas2_layout`, no client-side physics at all) fixes this at the root rather than swapping one JS physics engine for another. See `references/sigma-viz.md` for the full recipe (meta-graph construction, offline layout, self-contained HTML template loading sigma/graphology from esm.sh). Below the 300-node threshold, vis-network's `graph.html` is fine as-is — the extra build step isn't worth it. + ### Steps 6b-8 - Wiki, Neo4j, FalkorDB, SVG, GraphML, MCP, benchmark (only on their flags) These run only when their flag is present (`--wiki`, `--neo4j`/`--neo4j-push`, `--falkordb`/`--falkordb-push`, `--svg`, `--graphml`, `--mcp`) or, for the token-reduction benchmark, when `total_words` exceeds 5,000. A default run with no export flags skips all of them. See `references/exports.md` for each one. Run any `--wiki` export before Step 9 cleanup so `.graphify_labels.json` is still available. diff --git a/graphify/skill-codex.md b/graphify/skill-codex.md index e6e411ea0..f28ef4cd3 100644 --- a/graphify/skill-codex.md +++ b/graphify/skill-codex.md @@ -474,8 +474,24 @@ Substitute `IS_DIRECTED` and `INPUT_PATH` as in Step 4. If a `GRAPH HEALTH WARNI Read `graphify-out/.graphify_analysis.json`. For each community key, look at its node labels and write a 2-5 word plain-language name (e.g. "Attention Mechanism", "Training Pipeline", "Data Loading"). +**At scale (100+ communities), do NOT hand-label one at a time and do NOT fall back to a naive path-prefix heuristic (e.g. title-casing the common directory prefix).** Both break down past a handful of communities — the heuristic in particular produces duplicated-segment junk ("Backend Backend", "Frontend Frontend") and word-soup names that look plausible until you actually read them. Verified in production on a 1000+ community monorepo graph (apa, 2026-07-03): a heuristic pass needed a full redo. + +What works instead, for communities with >=20 nodes (the ones that actually surface in God Nodes / navigation): +1. For each such community, sample its ~15 highest-degree (most connected) member nodes — not the full member list, communities can have 300+ nodes. +2. Batch communities into groups of ~15-20 per subagent (write each batch's samples to a small JSON file under `graphify-out/`). +3. Dispatch one `general-purpose` subagent per batch (all in the same message, in parallel — same pattern as Step 3 Part B), each told to read its batch file and write a JSON `{community_id: name}` map based on genuine reasoning about the sampled node labels/paths, not just repeating directory names. +4. Merge all batch results. + +For the long tail of small communities (<20 nodes) where subagent cost isn't justified, a path-prefix heuristic is an acceptable lighter-weight fallback — but dedupe repeated words/segments, strip trailing file extensions, and spot-check a random sample of ~15 outputs across different sizes before trusting it. If duplicated-word or generic ("Community N") names appear in the sample, fix the heuristic before applying it to the rest. + Then regenerate the report and save the labels for the visualizer: +**Reconcile the FULL label set for cross-batch duplicates before regenerating the report — this is a required final pass, not optional polish.** Subagent batches only see their own slice and the small-community heuristic naturally collapses siblings from the same directory (e.g. many different test-file clusters under the same folder), so duplicates are expected even after the steps above — verified in production: 338 of 1083 communities (31%) shared a label with at least one other community before reconciliation (apa monorepo, 2026-07-03). After all labels are assembled: +1. Group community IDs by their current label. +2. For every group with >1 member, pick a distinguishing keyword from each member's OWN node labels (word-frequency count, excluding stopwords and words already in the shared base label) and append it, e.g. `"Agent Gateway MCP Client" -> "Agent Gateway MCP Client — Server"` / `"— Additional"`. +3. If a collision still remains after that (rare — e.g. multiple communities extracted from the very same source image), append a numeric suffix `" (1)"`, `" (2)"` as a last resort. +4. Re-check for zero duplicates before moving on. + ```bash $(cat graphify-out/.graphify_python) -c " import sys, json @@ -531,6 +547,8 @@ graphify export html # auto-aggregates to community view if graph > 5000 nodes # or: graphify export html --no-viz ``` +**If the resulting view (aggregated community graph, or the raw graph for small corpora) has more than ~300 nodes, ALSO generate a Sigma.js + graphology version and present that as the primary interactive file instead of vis-network's `graph.html`.** vis-network runs a live single-threaded JS forceAtlas2 physics simulation on load (200 iterations before it disables itself) — verified in production this is genuinely slow/laggy past a few hundred nodes (apa monorepo, 1083-community aggregated view, 2026-07-03), independent of hardware. Sigma.js (WebGL rendering) with the layout **precomputed offline in Python** (`nx.forceatlas2_layout`, no client-side physics at all) fixes this at the root rather than swapping one JS physics engine for another. See `references/sigma-viz.md` for the full recipe (meta-graph construction, offline layout, self-contained HTML template loading sigma/graphology from esm.sh). Below the 300-node threshold, vis-network's `graph.html` is fine as-is — the extra build step isn't worth it. + ### Steps 6b-8 - Wiki, Neo4j, FalkorDB, SVG, GraphML, MCP, benchmark (only on their flags) These run only when their flag is present (`--wiki`, `--neo4j`/`--neo4j-push`, `--falkordb`/`--falkordb-push`, `--svg`, `--graphml`, `--mcp`) or, for the token-reduction benchmark, when `total_words` exceeds 5,000. A default run with no export flags skips all of them. See `references/exports.md` for each one. Run any `--wiki` export before Step 9 cleanup so `.graphify_labels.json` is still available. diff --git a/graphify/skill-copilot.md b/graphify/skill-copilot.md index b3542438d..5c337677e 100644 --- a/graphify/skill-copilot.md +++ b/graphify/skill-copilot.md @@ -477,8 +477,24 @@ Substitute `IS_DIRECTED` and `INPUT_PATH` as in Step 4. If a `GRAPH HEALTH WARNI Read `graphify-out/.graphify_analysis.json`. For each community key, look at its node labels and write a 2-5 word plain-language name (e.g. "Attention Mechanism", "Training Pipeline", "Data Loading"). +**At scale (100+ communities), do NOT hand-label one at a time and do NOT fall back to a naive path-prefix heuristic (e.g. title-casing the common directory prefix).** Both break down past a handful of communities — the heuristic in particular produces duplicated-segment junk ("Backend Backend", "Frontend Frontend") and word-soup names that look plausible until you actually read them. Verified in production on a 1000+ community monorepo graph (apa, 2026-07-03): a heuristic pass needed a full redo. + +What works instead, for communities with >=20 nodes (the ones that actually surface in God Nodes / navigation): +1. For each such community, sample its ~15 highest-degree (most connected) member nodes — not the full member list, communities can have 300+ nodes. +2. Batch communities into groups of ~15-20 per subagent (write each batch's samples to a small JSON file under `graphify-out/`). +3. Dispatch one `general-purpose` subagent per batch (all in the same message, in parallel — same pattern as Step 3 Part B), each told to read its batch file and write a JSON `{community_id: name}` map based on genuine reasoning about the sampled node labels/paths, not just repeating directory names. +4. Merge all batch results. + +For the long tail of small communities (<20 nodes) where subagent cost isn't justified, a path-prefix heuristic is an acceptable lighter-weight fallback — but dedupe repeated words/segments, strip trailing file extensions, and spot-check a random sample of ~15 outputs across different sizes before trusting it. If duplicated-word or generic ("Community N") names appear in the sample, fix the heuristic before applying it to the rest. + Then regenerate the report and save the labels for the visualizer: +**Reconcile the FULL label set for cross-batch duplicates before regenerating the report — this is a required final pass, not optional polish.** Subagent batches only see their own slice and the small-community heuristic naturally collapses siblings from the same directory (e.g. many different test-file clusters under the same folder), so duplicates are expected even after the steps above — verified in production: 338 of 1083 communities (31%) shared a label with at least one other community before reconciliation (apa monorepo, 2026-07-03). After all labels are assembled: +1. Group community IDs by their current label. +2. For every group with >1 member, pick a distinguishing keyword from each member's OWN node labels (word-frequency count, excluding stopwords and words already in the shared base label) and append it, e.g. `"Agent Gateway MCP Client" -> "Agent Gateway MCP Client — Server"` / `"— Additional"`. +3. If a collision still remains after that (rare — e.g. multiple communities extracted from the very same source image), append a numeric suffix `" (1)"`, `" (2)"` as a last resort. +4. Re-check for zero duplicates before moving on. + ```bash $(cat graphify-out/.graphify_python) -c " import sys, json @@ -534,6 +550,8 @@ graphify export html # auto-aggregates to community view if graph > 5000 nodes # or: graphify export html --no-viz ``` +**If the resulting view (aggregated community graph, or the raw graph for small corpora) has more than ~300 nodes, ALSO generate a Sigma.js + graphology version and present that as the primary interactive file instead of vis-network's `graph.html`.** vis-network runs a live single-threaded JS forceAtlas2 physics simulation on load (200 iterations before it disables itself) — verified in production this is genuinely slow/laggy past a few hundred nodes (apa monorepo, 1083-community aggregated view, 2026-07-03), independent of hardware. Sigma.js (WebGL rendering) with the layout **precomputed offline in Python** (`nx.forceatlas2_layout`, no client-side physics at all) fixes this at the root rather than swapping one JS physics engine for another. See `references/sigma-viz.md` for the full recipe (meta-graph construction, offline layout, self-contained HTML template loading sigma/graphology from esm.sh). Below the 300-node threshold, vis-network's `graph.html` is fine as-is — the extra build step isn't worth it. + ### Steps 6b-8 - Wiki, Neo4j, FalkorDB, SVG, GraphML, MCP, benchmark (only on their flags) These run only when their flag is present (`--wiki`, `--neo4j`/`--neo4j-push`, `--falkordb`/`--falkordb-push`, `--svg`, `--graphml`, `--mcp`) or, for the token-reduction benchmark, when `total_words` exceeds 5,000. A default run with no export flags skips all of them. See `references/exports.md` for each one. Run any `--wiki` export before Step 9 cleanup so `.graphify_labels.json` is still available. diff --git a/graphify/skill-droid.md b/graphify/skill-droid.md index d1147b903..afa602ccc 100644 --- a/graphify/skill-droid.md +++ b/graphify/skill-droid.md @@ -474,8 +474,24 @@ Substitute `IS_DIRECTED` and `INPUT_PATH` as in Step 4. If a `GRAPH HEALTH WARNI Read `graphify-out/.graphify_analysis.json`. For each community key, look at its node labels and write a 2-5 word plain-language name (e.g. "Attention Mechanism", "Training Pipeline", "Data Loading"). +**At scale (100+ communities), do NOT hand-label one at a time and do NOT fall back to a naive path-prefix heuristic (e.g. title-casing the common directory prefix).** Both break down past a handful of communities — the heuristic in particular produces duplicated-segment junk ("Backend Backend", "Frontend Frontend") and word-soup names that look plausible until you actually read them. Verified in production on a 1000+ community monorepo graph (apa, 2026-07-03): a heuristic pass needed a full redo. + +What works instead, for communities with >=20 nodes (the ones that actually surface in God Nodes / navigation): +1. For each such community, sample its ~15 highest-degree (most connected) member nodes — not the full member list, communities can have 300+ nodes. +2. Batch communities into groups of ~15-20 per subagent (write each batch's samples to a small JSON file under `graphify-out/`). +3. Dispatch one `general-purpose` subagent per batch (all in the same message, in parallel — same pattern as Step 3 Part B), each told to read its batch file and write a JSON `{community_id: name}` map based on genuine reasoning about the sampled node labels/paths, not just repeating directory names. +4. Merge all batch results. + +For the long tail of small communities (<20 nodes) where subagent cost isn't justified, a path-prefix heuristic is an acceptable lighter-weight fallback — but dedupe repeated words/segments, strip trailing file extensions, and spot-check a random sample of ~15 outputs across different sizes before trusting it. If duplicated-word or generic ("Community N") names appear in the sample, fix the heuristic before applying it to the rest. + Then regenerate the report and save the labels for the visualizer: +**Reconcile the FULL label set for cross-batch duplicates before regenerating the report — this is a required final pass, not optional polish.** Subagent batches only see their own slice and the small-community heuristic naturally collapses siblings from the same directory (e.g. many different test-file clusters under the same folder), so duplicates are expected even after the steps above — verified in production: 338 of 1083 communities (31%) shared a label with at least one other community before reconciliation (apa monorepo, 2026-07-03). After all labels are assembled: +1. Group community IDs by their current label. +2. For every group with >1 member, pick a distinguishing keyword from each member's OWN node labels (word-frequency count, excluding stopwords and words already in the shared base label) and append it, e.g. `"Agent Gateway MCP Client" -> "Agent Gateway MCP Client — Server"` / `"— Additional"`. +3. If a collision still remains after that (rare — e.g. multiple communities extracted from the very same source image), append a numeric suffix `" (1)"`, `" (2)"` as a last resort. +4. Re-check for zero duplicates before moving on. + ```bash $(cat graphify-out/.graphify_python) -c " import sys, json @@ -531,6 +547,8 @@ graphify export html # auto-aggregates to community view if graph > 5000 nodes # or: graphify export html --no-viz ``` +**If the resulting view (aggregated community graph, or the raw graph for small corpora) has more than ~300 nodes, ALSO generate a Sigma.js + graphology version and present that as the primary interactive file instead of vis-network's `graph.html`.** vis-network runs a live single-threaded JS forceAtlas2 physics simulation on load (200 iterations before it disables itself) — verified in production this is genuinely slow/laggy past a few hundred nodes (apa monorepo, 1083-community aggregated view, 2026-07-03), independent of hardware. Sigma.js (WebGL rendering) with the layout **precomputed offline in Python** (`nx.forceatlas2_layout`, no client-side physics at all) fixes this at the root rather than swapping one JS physics engine for another. See `references/sigma-viz.md` for the full recipe (meta-graph construction, offline layout, self-contained HTML template loading sigma/graphology from esm.sh). Below the 300-node threshold, vis-network's `graph.html` is fine as-is — the extra build step isn't worth it. + ### Steps 6b-8 - Wiki, Neo4j, FalkorDB, SVG, GraphML, MCP, benchmark (only on their flags) These run only when their flag is present (`--wiki`, `--neo4j`/`--neo4j-push`, `--falkordb`/`--falkordb-push`, `--svg`, `--graphml`, `--mcp`) or, for the token-reduction benchmark, when `total_words` exceeds 5,000. A default run with no export flags skips all of them. See `references/exports.md` for each one. Run any `--wiki` export before Step 9 cleanup so `.graphify_labels.json` is still available. diff --git a/graphify/skill-kilo.md b/graphify/skill-kilo.md index c45578165..b4892b39c 100644 --- a/graphify/skill-kilo.md +++ b/graphify/skill-kilo.md @@ -477,8 +477,24 @@ Substitute `IS_DIRECTED` and `INPUT_PATH` as in Step 4. If a `GRAPH HEALTH WARNI Read `graphify-out/.graphify_analysis.json`. For each community key, look at its node labels and write a 2-5 word plain-language name (e.g. "Attention Mechanism", "Training Pipeline", "Data Loading"). +**At scale (100+ communities), do NOT hand-label one at a time and do NOT fall back to a naive path-prefix heuristic (e.g. title-casing the common directory prefix).** Both break down past a handful of communities — the heuristic in particular produces duplicated-segment junk ("Backend Backend", "Frontend Frontend") and word-soup names that look plausible until you actually read them. Verified in production on a 1000+ community monorepo graph (apa, 2026-07-03): a heuristic pass needed a full redo. + +What works instead, for communities with >=20 nodes (the ones that actually surface in God Nodes / navigation): +1. For each such community, sample its ~15 highest-degree (most connected) member nodes — not the full member list, communities can have 300+ nodes. +2. Batch communities into groups of ~15-20 per subagent (write each batch's samples to a small JSON file under `graphify-out/`). +3. Dispatch one `general-purpose` subagent per batch (all in the same message, in parallel — same pattern as Step 3 Part B), each told to read its batch file and write a JSON `{community_id: name}` map based on genuine reasoning about the sampled node labels/paths, not just repeating directory names. +4. Merge all batch results. + +For the long tail of small communities (<20 nodes) where subagent cost isn't justified, a path-prefix heuristic is an acceptable lighter-weight fallback — but dedupe repeated words/segments, strip trailing file extensions, and spot-check a random sample of ~15 outputs across different sizes before trusting it. If duplicated-word or generic ("Community N") names appear in the sample, fix the heuristic before applying it to the rest. + Then regenerate the report and save the labels for the visualizer: +**Reconcile the FULL label set for cross-batch duplicates before regenerating the report — this is a required final pass, not optional polish.** Subagent batches only see their own slice and the small-community heuristic naturally collapses siblings from the same directory (e.g. many different test-file clusters under the same folder), so duplicates are expected even after the steps above — verified in production: 338 of 1083 communities (31%) shared a label with at least one other community before reconciliation (apa monorepo, 2026-07-03). After all labels are assembled: +1. Group community IDs by their current label. +2. For every group with >1 member, pick a distinguishing keyword from each member's OWN node labels (word-frequency count, excluding stopwords and words already in the shared base label) and append it, e.g. `"Agent Gateway MCP Client" -> "Agent Gateway MCP Client — Server"` / `"— Additional"`. +3. If a collision still remains after that (rare — e.g. multiple communities extracted from the very same source image), append a numeric suffix `" (1)"`, `" (2)"` as a last resort. +4. Re-check for zero duplicates before moving on. + ```bash $(cat graphify-out/.graphify_python) -c " import sys, json @@ -534,6 +550,8 @@ graphify export html # auto-aggregates to community view if graph > 5000 nodes # or: graphify export html --no-viz ``` +**If the resulting view (aggregated community graph, or the raw graph for small corpora) has more than ~300 nodes, ALSO generate a Sigma.js + graphology version and present that as the primary interactive file instead of vis-network's `graph.html`.** vis-network runs a live single-threaded JS forceAtlas2 physics simulation on load (200 iterations before it disables itself) — verified in production this is genuinely slow/laggy past a few hundred nodes (apa monorepo, 1083-community aggregated view, 2026-07-03), independent of hardware. Sigma.js (WebGL rendering) with the layout **precomputed offline in Python** (`nx.forceatlas2_layout`, no client-side physics at all) fixes this at the root rather than swapping one JS physics engine for another. See `references/sigma-viz.md` for the full recipe (meta-graph construction, offline layout, self-contained HTML template loading sigma/graphology from esm.sh). Below the 300-node threshold, vis-network's `graph.html` is fine as-is — the extra build step isn't worth it. + ### Steps 6b-8 - Wiki, Neo4j, FalkorDB, SVG, GraphML, MCP, benchmark (only on their flags) These run only when their flag is present (`--wiki`, `--neo4j`/`--neo4j-push`, `--falkordb`/`--falkordb-push`, `--svg`, `--graphml`, `--mcp`) or, for the token-reduction benchmark, when `total_words` exceeds 5,000. A default run with no export flags skips all of them. See `references/exports.md` for each one. Run any `--wiki` export before Step 9 cleanup so `.graphify_labels.json` is still available. diff --git a/graphify/skill-kiro.md b/graphify/skill-kiro.md index b3542438d..5c337677e 100644 --- a/graphify/skill-kiro.md +++ b/graphify/skill-kiro.md @@ -477,8 +477,24 @@ Substitute `IS_DIRECTED` and `INPUT_PATH` as in Step 4. If a `GRAPH HEALTH WARNI Read `graphify-out/.graphify_analysis.json`. For each community key, look at its node labels and write a 2-5 word plain-language name (e.g. "Attention Mechanism", "Training Pipeline", "Data Loading"). +**At scale (100+ communities), do NOT hand-label one at a time and do NOT fall back to a naive path-prefix heuristic (e.g. title-casing the common directory prefix).** Both break down past a handful of communities — the heuristic in particular produces duplicated-segment junk ("Backend Backend", "Frontend Frontend") and word-soup names that look plausible until you actually read them. Verified in production on a 1000+ community monorepo graph (apa, 2026-07-03): a heuristic pass needed a full redo. + +What works instead, for communities with >=20 nodes (the ones that actually surface in God Nodes / navigation): +1. For each such community, sample its ~15 highest-degree (most connected) member nodes — not the full member list, communities can have 300+ nodes. +2. Batch communities into groups of ~15-20 per subagent (write each batch's samples to a small JSON file under `graphify-out/`). +3. Dispatch one `general-purpose` subagent per batch (all in the same message, in parallel — same pattern as Step 3 Part B), each told to read its batch file and write a JSON `{community_id: name}` map based on genuine reasoning about the sampled node labels/paths, not just repeating directory names. +4. Merge all batch results. + +For the long tail of small communities (<20 nodes) where subagent cost isn't justified, a path-prefix heuristic is an acceptable lighter-weight fallback — but dedupe repeated words/segments, strip trailing file extensions, and spot-check a random sample of ~15 outputs across different sizes before trusting it. If duplicated-word or generic ("Community N") names appear in the sample, fix the heuristic before applying it to the rest. + Then regenerate the report and save the labels for the visualizer: +**Reconcile the FULL label set for cross-batch duplicates before regenerating the report — this is a required final pass, not optional polish.** Subagent batches only see their own slice and the small-community heuristic naturally collapses siblings from the same directory (e.g. many different test-file clusters under the same folder), so duplicates are expected even after the steps above — verified in production: 338 of 1083 communities (31%) shared a label with at least one other community before reconciliation (apa monorepo, 2026-07-03). After all labels are assembled: +1. Group community IDs by their current label. +2. For every group with >1 member, pick a distinguishing keyword from each member's OWN node labels (word-frequency count, excluding stopwords and words already in the shared base label) and append it, e.g. `"Agent Gateway MCP Client" -> "Agent Gateway MCP Client — Server"` / `"— Additional"`. +3. If a collision still remains after that (rare — e.g. multiple communities extracted from the very same source image), append a numeric suffix `" (1)"`, `" (2)"` as a last resort. +4. Re-check for zero duplicates before moving on. + ```bash $(cat graphify-out/.graphify_python) -c " import sys, json @@ -534,6 +550,8 @@ graphify export html # auto-aggregates to community view if graph > 5000 nodes # or: graphify export html --no-viz ``` +**If the resulting view (aggregated community graph, or the raw graph for small corpora) has more than ~300 nodes, ALSO generate a Sigma.js + graphology version and present that as the primary interactive file instead of vis-network's `graph.html`.** vis-network runs a live single-threaded JS forceAtlas2 physics simulation on load (200 iterations before it disables itself) — verified in production this is genuinely slow/laggy past a few hundred nodes (apa monorepo, 1083-community aggregated view, 2026-07-03), independent of hardware. Sigma.js (WebGL rendering) with the layout **precomputed offline in Python** (`nx.forceatlas2_layout`, no client-side physics at all) fixes this at the root rather than swapping one JS physics engine for another. See `references/sigma-viz.md` for the full recipe (meta-graph construction, offline layout, self-contained HTML template loading sigma/graphology from esm.sh). Below the 300-node threshold, vis-network's `graph.html` is fine as-is — the extra build step isn't worth it. + ### Steps 6b-8 - Wiki, Neo4j, FalkorDB, SVG, GraphML, MCP, benchmark (only on their flags) These run only when their flag is present (`--wiki`, `--neo4j`/`--neo4j-push`, `--falkordb`/`--falkordb-push`, `--svg`, `--graphml`, `--mcp`) or, for the token-reduction benchmark, when `total_words` exceeds 5,000. A default run with no export flags skips all of them. See `references/exports.md` for each one. Run any `--wiki` export before Step 9 cleanup so `.graphify_labels.json` is still available. diff --git a/graphify/skill-opencode.md b/graphify/skill-opencode.md index 684e0e223..e923319b3 100644 --- a/graphify/skill-opencode.md +++ b/graphify/skill-opencode.md @@ -469,8 +469,24 @@ Substitute `IS_DIRECTED` and `INPUT_PATH` as in Step 4. If a `GRAPH HEALTH WARNI Read `graphify-out/.graphify_analysis.json`. For each community key, look at its node labels and write a 2-5 word plain-language name (e.g. "Attention Mechanism", "Training Pipeline", "Data Loading"). +**At scale (100+ communities), do NOT hand-label one at a time and do NOT fall back to a naive path-prefix heuristic (e.g. title-casing the common directory prefix).** Both break down past a handful of communities — the heuristic in particular produces duplicated-segment junk ("Backend Backend", "Frontend Frontend") and word-soup names that look plausible until you actually read them. Verified in production on a 1000+ community monorepo graph (apa, 2026-07-03): a heuristic pass needed a full redo. + +What works instead, for communities with >=20 nodes (the ones that actually surface in God Nodes / navigation): +1. For each such community, sample its ~15 highest-degree (most connected) member nodes — not the full member list, communities can have 300+ nodes. +2. Batch communities into groups of ~15-20 per subagent (write each batch's samples to a small JSON file under `graphify-out/`). +3. Dispatch one `general-purpose` subagent per batch (all in the same message, in parallel — same pattern as Step 3 Part B), each told to read its batch file and write a JSON `{community_id: name}` map based on genuine reasoning about the sampled node labels/paths, not just repeating directory names. +4. Merge all batch results. + +For the long tail of small communities (<20 nodes) where subagent cost isn't justified, a path-prefix heuristic is an acceptable lighter-weight fallback — but dedupe repeated words/segments, strip trailing file extensions, and spot-check a random sample of ~15 outputs across different sizes before trusting it. If duplicated-word or generic ("Community N") names appear in the sample, fix the heuristic before applying it to the rest. + Then regenerate the report and save the labels for the visualizer: +**Reconcile the FULL label set for cross-batch duplicates before regenerating the report — this is a required final pass, not optional polish.** Subagent batches only see their own slice and the small-community heuristic naturally collapses siblings from the same directory (e.g. many different test-file clusters under the same folder), so duplicates are expected even after the steps above — verified in production: 338 of 1083 communities (31%) shared a label with at least one other community before reconciliation (apa monorepo, 2026-07-03). After all labels are assembled: +1. Group community IDs by their current label. +2. For every group with >1 member, pick a distinguishing keyword from each member's OWN node labels (word-frequency count, excluding stopwords and words already in the shared base label) and append it, e.g. `"Agent Gateway MCP Client" -> "Agent Gateway MCP Client — Server"` / `"— Additional"`. +3. If a collision still remains after that (rare — e.g. multiple communities extracted from the very same source image), append a numeric suffix `" (1)"`, `" (2)"` as a last resort. +4. Re-check for zero duplicates before moving on. + ```bash $(cat graphify-out/.graphify_python) -c " import sys, json @@ -526,6 +542,8 @@ graphify export html # auto-aggregates to community view if graph > 5000 nodes # or: graphify export html --no-viz ``` +**If the resulting view (aggregated community graph, or the raw graph for small corpora) has more than ~300 nodes, ALSO generate a Sigma.js + graphology version and present that as the primary interactive file instead of vis-network's `graph.html`.** vis-network runs a live single-threaded JS forceAtlas2 physics simulation on load (200 iterations before it disables itself) — verified in production this is genuinely slow/laggy past a few hundred nodes (apa monorepo, 1083-community aggregated view, 2026-07-03), independent of hardware. Sigma.js (WebGL rendering) with the layout **precomputed offline in Python** (`nx.forceatlas2_layout`, no client-side physics at all) fixes this at the root rather than swapping one JS physics engine for another. See `references/sigma-viz.md` for the full recipe (meta-graph construction, offline layout, self-contained HTML template loading sigma/graphology from esm.sh). Below the 300-node threshold, vis-network's `graph.html` is fine as-is — the extra build step isn't worth it. + ### Steps 6b-8 - Wiki, Neo4j, FalkorDB, SVG, GraphML, MCP, benchmark (only on their flags) These run only when their flag is present (`--wiki`, `--neo4j`/`--neo4j-push`, `--falkordb`/`--falkordb-push`, `--svg`, `--graphml`, `--mcp`) or, for the token-reduction benchmark, when `total_words` exceeds 5,000. A default run with no export flags skips all of them. See `references/exports.md` for each one. Run any `--wiki` export before Step 9 cleanup so `.graphify_labels.json` is still available. diff --git a/graphify/skill-pi.md b/graphify/skill-pi.md index b3542438d..5c337677e 100644 --- a/graphify/skill-pi.md +++ b/graphify/skill-pi.md @@ -477,8 +477,24 @@ Substitute `IS_DIRECTED` and `INPUT_PATH` as in Step 4. If a `GRAPH HEALTH WARNI Read `graphify-out/.graphify_analysis.json`. For each community key, look at its node labels and write a 2-5 word plain-language name (e.g. "Attention Mechanism", "Training Pipeline", "Data Loading"). +**At scale (100+ communities), do NOT hand-label one at a time and do NOT fall back to a naive path-prefix heuristic (e.g. title-casing the common directory prefix).** Both break down past a handful of communities — the heuristic in particular produces duplicated-segment junk ("Backend Backend", "Frontend Frontend") and word-soup names that look plausible until you actually read them. Verified in production on a 1000+ community monorepo graph (apa, 2026-07-03): a heuristic pass needed a full redo. + +What works instead, for communities with >=20 nodes (the ones that actually surface in God Nodes / navigation): +1. For each such community, sample its ~15 highest-degree (most connected) member nodes — not the full member list, communities can have 300+ nodes. +2. Batch communities into groups of ~15-20 per subagent (write each batch's samples to a small JSON file under `graphify-out/`). +3. Dispatch one `general-purpose` subagent per batch (all in the same message, in parallel — same pattern as Step 3 Part B), each told to read its batch file and write a JSON `{community_id: name}` map based on genuine reasoning about the sampled node labels/paths, not just repeating directory names. +4. Merge all batch results. + +For the long tail of small communities (<20 nodes) where subagent cost isn't justified, a path-prefix heuristic is an acceptable lighter-weight fallback — but dedupe repeated words/segments, strip trailing file extensions, and spot-check a random sample of ~15 outputs across different sizes before trusting it. If duplicated-word or generic ("Community N") names appear in the sample, fix the heuristic before applying it to the rest. + Then regenerate the report and save the labels for the visualizer: +**Reconcile the FULL label set for cross-batch duplicates before regenerating the report — this is a required final pass, not optional polish.** Subagent batches only see their own slice and the small-community heuristic naturally collapses siblings from the same directory (e.g. many different test-file clusters under the same folder), so duplicates are expected even after the steps above — verified in production: 338 of 1083 communities (31%) shared a label with at least one other community before reconciliation (apa monorepo, 2026-07-03). After all labels are assembled: +1. Group community IDs by their current label. +2. For every group with >1 member, pick a distinguishing keyword from each member's OWN node labels (word-frequency count, excluding stopwords and words already in the shared base label) and append it, e.g. `"Agent Gateway MCP Client" -> "Agent Gateway MCP Client — Server"` / `"— Additional"`. +3. If a collision still remains after that (rare — e.g. multiple communities extracted from the very same source image), append a numeric suffix `" (1)"`, `" (2)"` as a last resort. +4. Re-check for zero duplicates before moving on. + ```bash $(cat graphify-out/.graphify_python) -c " import sys, json @@ -534,6 +550,8 @@ graphify export html # auto-aggregates to community view if graph > 5000 nodes # or: graphify export html --no-viz ``` +**If the resulting view (aggregated community graph, or the raw graph for small corpora) has more than ~300 nodes, ALSO generate a Sigma.js + graphology version and present that as the primary interactive file instead of vis-network's `graph.html`.** vis-network runs a live single-threaded JS forceAtlas2 physics simulation on load (200 iterations before it disables itself) — verified in production this is genuinely slow/laggy past a few hundred nodes (apa monorepo, 1083-community aggregated view, 2026-07-03), independent of hardware. Sigma.js (WebGL rendering) with the layout **precomputed offline in Python** (`nx.forceatlas2_layout`, no client-side physics at all) fixes this at the root rather than swapping one JS physics engine for another. See `references/sigma-viz.md` for the full recipe (meta-graph construction, offline layout, self-contained HTML template loading sigma/graphology from esm.sh). Below the 300-node threshold, vis-network's `graph.html` is fine as-is — the extra build step isn't worth it. + ### Steps 6b-8 - Wiki, Neo4j, FalkorDB, SVG, GraphML, MCP, benchmark (only on their flags) These run only when their flag is present (`--wiki`, `--neo4j`/`--neo4j-push`, `--falkordb`/`--falkordb-push`, `--svg`, `--graphml`, `--mcp`) or, for the token-reduction benchmark, when `total_words` exceeds 5,000. A default run with no export flags skips all of them. See `references/exports.md` for each one. Run any `--wiki` export before Step 9 cleanup so `.graphify_labels.json` is still available. diff --git a/graphify/skill-trae.md b/graphify/skill-trae.md index ac16b925d..72fbd9937 100644 --- a/graphify/skill-trae.md +++ b/graphify/skill-trae.md @@ -475,8 +475,24 @@ Substitute `IS_DIRECTED` and `INPUT_PATH` as in Step 4. If a `GRAPH HEALTH WARNI Read `graphify-out/.graphify_analysis.json`. For each community key, look at its node labels and write a 2-5 word plain-language name (e.g. "Attention Mechanism", "Training Pipeline", "Data Loading"). +**At scale (100+ communities), do NOT hand-label one at a time and do NOT fall back to a naive path-prefix heuristic (e.g. title-casing the common directory prefix).** Both break down past a handful of communities — the heuristic in particular produces duplicated-segment junk ("Backend Backend", "Frontend Frontend") and word-soup names that look plausible until you actually read them. Verified in production on a 1000+ community monorepo graph (apa, 2026-07-03): a heuristic pass needed a full redo. + +What works instead, for communities with >=20 nodes (the ones that actually surface in God Nodes / navigation): +1. For each such community, sample its ~15 highest-degree (most connected) member nodes — not the full member list, communities can have 300+ nodes. +2. Batch communities into groups of ~15-20 per subagent (write each batch's samples to a small JSON file under `graphify-out/`). +3. Dispatch one `general-purpose` subagent per batch (all in the same message, in parallel — same pattern as Step 3 Part B), each told to read its batch file and write a JSON `{community_id: name}` map based on genuine reasoning about the sampled node labels/paths, not just repeating directory names. +4. Merge all batch results. + +For the long tail of small communities (<20 nodes) where subagent cost isn't justified, a path-prefix heuristic is an acceptable lighter-weight fallback — but dedupe repeated words/segments, strip trailing file extensions, and spot-check a random sample of ~15 outputs across different sizes before trusting it. If duplicated-word or generic ("Community N") names appear in the sample, fix the heuristic before applying it to the rest. + Then regenerate the report and save the labels for the visualizer: +**Reconcile the FULL label set for cross-batch duplicates before regenerating the report — this is a required final pass, not optional polish.** Subagent batches only see their own slice and the small-community heuristic naturally collapses siblings from the same directory (e.g. many different test-file clusters under the same folder), so duplicates are expected even after the steps above — verified in production: 338 of 1083 communities (31%) shared a label with at least one other community before reconciliation (apa monorepo, 2026-07-03). After all labels are assembled: +1. Group community IDs by their current label. +2. For every group with >1 member, pick a distinguishing keyword from each member's OWN node labels (word-frequency count, excluding stopwords and words already in the shared base label) and append it, e.g. `"Agent Gateway MCP Client" -> "Agent Gateway MCP Client — Server"` / `"— Additional"`. +3. If a collision still remains after that (rare — e.g. multiple communities extracted from the very same source image), append a numeric suffix `" (1)"`, `" (2)"` as a last resort. +4. Re-check for zero duplicates before moving on. + ```bash $(cat graphify-out/.graphify_python) -c " import sys, json @@ -532,6 +548,8 @@ graphify export html # auto-aggregates to community view if graph > 5000 nodes # or: graphify export html --no-viz ``` +**If the resulting view (aggregated community graph, or the raw graph for small corpora) has more than ~300 nodes, ALSO generate a Sigma.js + graphology version and present that as the primary interactive file instead of vis-network's `graph.html`.** vis-network runs a live single-threaded JS forceAtlas2 physics simulation on load (200 iterations before it disables itself) — verified in production this is genuinely slow/laggy past a few hundred nodes (apa monorepo, 1083-community aggregated view, 2026-07-03), independent of hardware. Sigma.js (WebGL rendering) with the layout **precomputed offline in Python** (`nx.forceatlas2_layout`, no client-side physics at all) fixes this at the root rather than swapping one JS physics engine for another. See `references/sigma-viz.md` for the full recipe (meta-graph construction, offline layout, self-contained HTML template loading sigma/graphology from esm.sh). Below the 300-node threshold, vis-network's `graph.html` is fine as-is — the extra build step isn't worth it. + ### Steps 6b-8 - Wiki, Neo4j, FalkorDB, SVG, GraphML, MCP, benchmark (only on their flags) These run only when their flag is present (`--wiki`, `--neo4j`/`--neo4j-push`, `--falkordb`/`--falkordb-push`, `--svg`, `--graphml`, `--mcp`) or, for the token-reduction benchmark, when `total_words` exceeds 5,000. A default run with no export flags skips all of them. See `references/exports.md` for each one. Run any `--wiki` export before Step 9 cleanup so `.graphify_labels.json` is still available. diff --git a/graphify/skill-vscode.md b/graphify/skill-vscode.md index 31a3352f7..c9592c649 100644 --- a/graphify/skill-vscode.md +++ b/graphify/skill-vscode.md @@ -473,8 +473,24 @@ Substitute `IS_DIRECTED` and `INPUT_PATH` as in Step 4. If a `GRAPH HEALTH WARNI Read `graphify-out/.graphify_analysis.json`. For each community key, look at its node labels and write a 2-5 word plain-language name (e.g. "Attention Mechanism", "Training Pipeline", "Data Loading"). +**At scale (100+ communities), do NOT hand-label one at a time and do NOT fall back to a naive path-prefix heuristic (e.g. title-casing the common directory prefix).** Both break down past a handful of communities — the heuristic in particular produces duplicated-segment junk ("Backend Backend", "Frontend Frontend") and word-soup names that look plausible until you actually read them. Verified in production on a 1000+ community monorepo graph (apa, 2026-07-03): a heuristic pass needed a full redo. + +What works instead, for communities with >=20 nodes (the ones that actually surface in God Nodes / navigation): +1. For each such community, sample its ~15 highest-degree (most connected) member nodes — not the full member list, communities can have 300+ nodes. +2. Batch communities into groups of ~15-20 per subagent (write each batch's samples to a small JSON file under `graphify-out/`). +3. Dispatch one `general-purpose` subagent per batch (all in the same message, in parallel — same pattern as Step 3 Part B), each told to read its batch file and write a JSON `{community_id: name}` map based on genuine reasoning about the sampled node labels/paths, not just repeating directory names. +4. Merge all batch results. + +For the long tail of small communities (<20 nodes) where subagent cost isn't justified, a path-prefix heuristic is an acceptable lighter-weight fallback — but dedupe repeated words/segments, strip trailing file extensions, and spot-check a random sample of ~15 outputs across different sizes before trusting it. If duplicated-word or generic ("Community N") names appear in the sample, fix the heuristic before applying it to the rest. + Then regenerate the report and save the labels for the visualizer: +**Reconcile the FULL label set for cross-batch duplicates before regenerating the report — this is a required final pass, not optional polish.** Subagent batches only see their own slice and the small-community heuristic naturally collapses siblings from the same directory (e.g. many different test-file clusters under the same folder), so duplicates are expected even after the steps above — verified in production: 338 of 1083 communities (31%) shared a label with at least one other community before reconciliation (apa monorepo, 2026-07-03). After all labels are assembled: +1. Group community IDs by their current label. +2. For every group with >1 member, pick a distinguishing keyword from each member's OWN node labels (word-frequency count, excluding stopwords and words already in the shared base label) and append it, e.g. `"Agent Gateway MCP Client" -> "Agent Gateway MCP Client — Server"` / `"— Additional"`. +3. If a collision still remains after that (rare — e.g. multiple communities extracted from the very same source image), append a numeric suffix `" (1)"`, `" (2)"` as a last resort. +4. Re-check for zero duplicates before moving on. + ```bash $(cat graphify-out/.graphify_python) -c " import sys, json @@ -530,6 +546,8 @@ graphify export html # auto-aggregates to community view if graph > 5000 nodes # or: graphify export html --no-viz ``` +**If the resulting view (aggregated community graph, or the raw graph for small corpora) has more than ~300 nodes, ALSO generate a Sigma.js + graphology version and present that as the primary interactive file instead of vis-network's `graph.html`.** vis-network runs a live single-threaded JS forceAtlas2 physics simulation on load (200 iterations before it disables itself) — verified in production this is genuinely slow/laggy past a few hundred nodes (apa monorepo, 1083-community aggregated view, 2026-07-03), independent of hardware. Sigma.js (WebGL rendering) with the layout **precomputed offline in Python** (`nx.forceatlas2_layout`, no client-side physics at all) fixes this at the root rather than swapping one JS physics engine for another. See `references/sigma-viz.md` for the full recipe (meta-graph construction, offline layout, self-contained HTML template loading sigma/graphology from esm.sh). Below the 300-node threshold, vis-network's `graph.html` is fine as-is — the extra build step isn't worth it. + ### Steps 6b-8 - Wiki, Neo4j, FalkorDB, SVG, GraphML, MCP, benchmark (only on their flags) These run only when their flag is present (`--wiki`, `--neo4j`/`--neo4j-push`, `--falkordb`/`--falkordb-push`, `--svg`, `--graphml`, `--mcp`) or, for the token-reduction benchmark, when `total_words` exceeds 5,000. A default run with no export flags skips all of them. See `references/exports.md` for each one. Run any `--wiki` export before Step 9 cleanup so `.graphify_labels.json` is still available. diff --git a/graphify/skill-windows.md b/graphify/skill-windows.md index 6ab0e027c..d947bb490 100644 --- a/graphify/skill-windows.md +++ b/graphify/skill-windows.md @@ -499,8 +499,24 @@ Substitute `IS_DIRECTED` and `INPUT_PATH` as in Step 4. If a `GRAPH HEALTH WARNI Read `graphify-out/.graphify_analysis.json`. For each community key, look at its node labels and write a 2-5 word plain-language name (e.g. "Attention Mechanism", "Training Pipeline", "Data Loading"). +**At scale (100+ communities), do NOT hand-label one at a time and do NOT fall back to a naive path-prefix heuristic (e.g. title-casing the common directory prefix).** Both break down past a handful of communities — the heuristic in particular produces duplicated-segment junk ("Backend Backend", "Frontend Frontend") and word-soup names that look plausible until you actually read them. Verified in production on a 1000+ community monorepo graph (apa, 2026-07-03): a heuristic pass needed a full redo. + +What works instead, for communities with >=20 nodes (the ones that actually surface in God Nodes / navigation): +1. For each such community, sample its ~15 highest-degree (most connected) member nodes — not the full member list, communities can have 300+ nodes. +2. Batch communities into groups of ~15-20 per subagent (write each batch's samples to a small JSON file under `graphify-out/`). +3. Dispatch one `general-purpose` subagent per batch (all in the same message, in parallel — same pattern as Step 3 Part B), each told to read its batch file and write a JSON `{community_id: name}` map based on genuine reasoning about the sampled node labels/paths, not just repeating directory names. +4. Merge all batch results. + +For the long tail of small communities (<20 nodes) where subagent cost isn't justified, a path-prefix heuristic is an acceptable lighter-weight fallback — but dedupe repeated words/segments, strip trailing file extensions, and spot-check a random sample of ~15 outputs across different sizes before trusting it. If duplicated-word or generic ("Community N") names appear in the sample, fix the heuristic before applying it to the rest. + Then regenerate the report and save the labels for the visualizer: +**Reconcile the FULL label set for cross-batch duplicates before regenerating the report — this is a required final pass, not optional polish.** Subagent batches only see their own slice and the small-community heuristic naturally collapses siblings from the same directory (e.g. many different test-file clusters under the same folder), so duplicates are expected even after the steps above — verified in production: 338 of 1083 communities (31%) shared a label with at least one other community before reconciliation (apa monorepo, 2026-07-03). After all labels are assembled: +1. Group community IDs by their current label. +2. For every group with >1 member, pick a distinguishing keyword from each member's OWN node labels (word-frequency count, excluding stopwords and words already in the shared base label) and append it, e.g. `"Agent Gateway MCP Client" -> "Agent Gateway MCP Client — Server"` / `"— Additional"`. +3. If a collision still remains after that (rare — e.g. multiple communities extracted from the very same source image), append a numeric suffix `" (1)"`, `" (2)"` as a last resort. +4. Re-check for zero duplicates before moving on. + ```bash $(cat graphify-out/.graphify_python) -c " import sys, json @@ -556,6 +572,8 @@ graphify export html # auto-aggregates to community view if graph > 5000 nodes # or: graphify export html --no-viz ``` +**If the resulting view (aggregated community graph, or the raw graph for small corpora) has more than ~300 nodes, ALSO generate a Sigma.js + graphology version and present that as the primary interactive file instead of vis-network's `graph.html`.** vis-network runs a live single-threaded JS forceAtlas2 physics simulation on load (200 iterations before it disables itself) — verified in production this is genuinely slow/laggy past a few hundred nodes (apa monorepo, 1083-community aggregated view, 2026-07-03), independent of hardware. Sigma.js (WebGL rendering) with the layout **precomputed offline in Python** (`nx.forceatlas2_layout`, no client-side physics at all) fixes this at the root rather than swapping one JS physics engine for another. See `references/sigma-viz.md` for the full recipe (meta-graph construction, offline layout, self-contained HTML template loading sigma/graphology from esm.sh). Below the 300-node threshold, vis-network's `graph.html` is fine as-is — the extra build step isn't worth it. + ### Steps 6b-8 - Wiki, Neo4j, FalkorDB, SVG, GraphML, MCP, benchmark (only on their flags) These run only when their flag is present (`--wiki`, `--neo4j`/`--neo4j-push`, `--falkordb`/`--falkordb-push`, `--svg`, `--graphml`, `--mcp`) or, for the token-reduction benchmark, when `total_words` exceeds 5,000. A default run with no export flags skips all of them. See `references/exports.md` for each one. Run any `--wiki` export before Step 9 cleanup so `.graphify_labels.json` is still available. diff --git a/graphify/skill.md b/graphify/skill.md index b3542438d..5c337677e 100644 --- a/graphify/skill.md +++ b/graphify/skill.md @@ -477,8 +477,24 @@ Substitute `IS_DIRECTED` and `INPUT_PATH` as in Step 4. If a `GRAPH HEALTH WARNI Read `graphify-out/.graphify_analysis.json`. For each community key, look at its node labels and write a 2-5 word plain-language name (e.g. "Attention Mechanism", "Training Pipeline", "Data Loading"). +**At scale (100+ communities), do NOT hand-label one at a time and do NOT fall back to a naive path-prefix heuristic (e.g. title-casing the common directory prefix).** Both break down past a handful of communities — the heuristic in particular produces duplicated-segment junk ("Backend Backend", "Frontend Frontend") and word-soup names that look plausible until you actually read them. Verified in production on a 1000+ community monorepo graph (apa, 2026-07-03): a heuristic pass needed a full redo. + +What works instead, for communities with >=20 nodes (the ones that actually surface in God Nodes / navigation): +1. For each such community, sample its ~15 highest-degree (most connected) member nodes — not the full member list, communities can have 300+ nodes. +2. Batch communities into groups of ~15-20 per subagent (write each batch's samples to a small JSON file under `graphify-out/`). +3. Dispatch one `general-purpose` subagent per batch (all in the same message, in parallel — same pattern as Step 3 Part B), each told to read its batch file and write a JSON `{community_id: name}` map based on genuine reasoning about the sampled node labels/paths, not just repeating directory names. +4. Merge all batch results. + +For the long tail of small communities (<20 nodes) where subagent cost isn't justified, a path-prefix heuristic is an acceptable lighter-weight fallback — but dedupe repeated words/segments, strip trailing file extensions, and spot-check a random sample of ~15 outputs across different sizes before trusting it. If duplicated-word or generic ("Community N") names appear in the sample, fix the heuristic before applying it to the rest. + Then regenerate the report and save the labels for the visualizer: +**Reconcile the FULL label set for cross-batch duplicates before regenerating the report — this is a required final pass, not optional polish.** Subagent batches only see their own slice and the small-community heuristic naturally collapses siblings from the same directory (e.g. many different test-file clusters under the same folder), so duplicates are expected even after the steps above — verified in production: 338 of 1083 communities (31%) shared a label with at least one other community before reconciliation (apa monorepo, 2026-07-03). After all labels are assembled: +1. Group community IDs by their current label. +2. For every group with >1 member, pick a distinguishing keyword from each member's OWN node labels (word-frequency count, excluding stopwords and words already in the shared base label) and append it, e.g. `"Agent Gateway MCP Client" -> "Agent Gateway MCP Client — Server"` / `"— Additional"`. +3. If a collision still remains after that (rare — e.g. multiple communities extracted from the very same source image), append a numeric suffix `" (1)"`, `" (2)"` as a last resort. +4. Re-check for zero duplicates before moving on. + ```bash $(cat graphify-out/.graphify_python) -c " import sys, json @@ -534,6 +550,8 @@ graphify export html # auto-aggregates to community view if graph > 5000 nodes # or: graphify export html --no-viz ``` +**If the resulting view (aggregated community graph, or the raw graph for small corpora) has more than ~300 nodes, ALSO generate a Sigma.js + graphology version and present that as the primary interactive file instead of vis-network's `graph.html`.** vis-network runs a live single-threaded JS forceAtlas2 physics simulation on load (200 iterations before it disables itself) — verified in production this is genuinely slow/laggy past a few hundred nodes (apa monorepo, 1083-community aggregated view, 2026-07-03), independent of hardware. Sigma.js (WebGL rendering) with the layout **precomputed offline in Python** (`nx.forceatlas2_layout`, no client-side physics at all) fixes this at the root rather than swapping one JS physics engine for another. See `references/sigma-viz.md` for the full recipe (meta-graph construction, offline layout, self-contained HTML template loading sigma/graphology from esm.sh). Below the 300-node threshold, vis-network's `graph.html` is fine as-is — the extra build step isn't worth it. + ### Steps 6b-8 - Wiki, Neo4j, FalkorDB, SVG, GraphML, MCP, benchmark (only on their flags) These run only when their flag is present (`--wiki`, `--neo4j`/`--neo4j-push`, `--falkordb`/`--falkordb-push`, `--svg`, `--graphml`, `--mcp`) or, for the token-reduction benchmark, when `total_words` exceeds 5,000. A default run with no export flags skips all of them. See `references/exports.md` for each one. Run any `--wiki` export before Step 9 cleanup so `.graphify_labels.json` is still available. diff --git a/graphify/skills/agents/references/sigma-viz.md b/graphify/skills/agents/references/sigma-viz.md new file mode 100644 index 000000000..7cf0ba408 --- /dev/null +++ b/graphify/skills/agents/references/sigma-viz.md @@ -0,0 +1,219 @@ +# graphify reference: Sigma.js + graphology visualization for large graphs + +Load this when Step 6's `graph.html` (vis-network) would render more than ~300 nodes — either the aggregated community view on a large corpus, or the raw graph on a smaller one that still clusters into 300+ communities. vis-network runs a live, single-threaded JS forceAtlas2 physics simulation on load (canvas 2D rendering); past a few hundred nodes this stabilization pass is genuinely slow regardless of hardware. The fix is not swapping to a different JS physics engine — it's removing client-side physics entirely: precompute the layout once in Python (fast, uses networkx's optimized implementation) and render only, with sigma.js's WebGL renderer instead of vis-network's canvas 2D renderer. + +Output file: `graphify-out/graph_sigma.html` (self-contained, opens directly like `graph.html`). + +## Step 1 — build the meta-graph and precompute layout in Python + +Adjust `MIN_COMMUNITY_SIZE` (20 is a reasonable default — communities below this rarely appear in God Nodes / navigation and just add render cost) and `INPUT_PATH`/label source to match the current run. + +```python +import json +import networkx as nx +from pathlib import Path +from collections import Counter, defaultdict + +g_data = json.loads(Path('graphify-out/graph.json').read_text(encoding='utf-8')) +labels = json.loads(Path('graphify-out/.graphify_labels.json').read_text(encoding='utf-8')) + +MIN_COMMUNITY_SIZE = 20 +comms = defaultdict(list) +for n in g_data['nodes']: + comms[n['community']].append(n['id']) + +significant = {cid: members for cid, members in comms.items() if len(members) >= MIN_COMMUNITY_SIZE} +node_to_community = {m: cid for cid, members in significant.items() for m in members} + +meta = nx.Graph() +for cid, members in significant.items(): + meta.add_node(cid, member_count=len(members), label=labels.get(str(cid), f'Community {cid}')) + +edge_counts = Counter() +for link in g_data['links']: + cu, cv = node_to_community.get(link['source']), node_to_community.get(link['target']) + if cu is not None and cv is not None and cu != cv: + edge_counts[(min(cu, cv), max(cu, cv))] += 1 +for (cu, cv), w in edge_counts.items(): + meta.add_edge(cu, cv, weight=w) + +# offline layout — no client-side physics needed at all +pos = nx.forceatlas2_layout(meta, max_iter=800, gravity=1.0, scaling_ratio=4.0, seed=42, weight='weight') + +degrees = dict(meta.degree()) +max_deg = max(degrees.values()) if degrees else 1 +max_members = max((meta.nodes[n]['member_count'] for n in meta.nodes), default=1) +xs = [float(p[0]) for p in pos.values()] +ys = [float(p[1]) for p in pos.values()] +xr, yr = (max(xs) - min(xs)) or 1, (max(ys) - min(ys)) or 1 + +nodes_out = [] +for n in meta.nodes(): + x, y = float(pos[n][0]), float(pos[n][1]) + deg, mc = int(degrees.get(n, 0)), int(meta.nodes[n]['member_count']) + nodes_out.append({ + 'key': str(n), 'label': meta.nodes[n]['label'], + 'x': round((x - min(xs)) / xr * 1000, 2), 'y': round((y - min(ys)) / yr * 1000, 2), + 'size': round(3 + 12 * (mc / max_members) ** 0.5, 2), + 't': round(deg / max_deg if max_deg else 0, 3), + 'members': mc, 'degree': deg, + }) +edges_out = [{'source': str(u), 'target': str(v), 'weight': int(d.get('weight', 1))} + for u, v, d in meta.edges(data=True)] + +Path('graphify-out/.graphify_sigma_data.json').write_text( + json.dumps({'nodes': nodes_out, 'edges': edges_out}, ensure_ascii=False), encoding='utf-8') +print(f'meta graph: {len(nodes_out)} nodes, {len(edges_out)} edges — layout precomputed') +``` + +**Important**: cast every numpy value (`forceatlas2_layout` returns numpy floats) to plain Python `float`/`int` before `json.dumps` — numpy scalars aren't JSON-serializable and will raise `TypeError: Object of type float32 is not JSON serializable`. + +## Step 2 — write the HTML template + +Write this template to `graphify-out/graph_sigma.html`, with a literal `__GRAPH_DATA__` placeholder where the data goes (substituted in Step 3 — do NOT try to embed the JSON directly while authoring the template, string-templating that much escaping inline is error-prone). + +Key implementation notes: +- **Library loading**: sigma@3 ships CJS/ESM only, no browser UMD global. Load both libraries as ES modules from `esm.sh` (`https://esm.sh/sigma@3.0.3`, `https://esm.sh/graphology@0.25.4`) via ` + + +``` + +## Step 3 — inject the data and clean up + +```python +import json +from pathlib import Path + +data = json.loads(Path('graphify-out/.graphify_sigma_data.json').read_text(encoding='utf-8')) +html = Path('graphify-out/graph_sigma.html').read_text(encoding='utf-8') +html = html.replace('__GRAPH_DATA__', json.dumps(data, ensure_ascii=False)) +Path('graphify-out/graph_sigma.html').write_text(html, encoding='utf-8') +Path('graphify-out/.graphify_sigma_data.json').unlink() +``` + +**Before telling the user it's done**, sanity-check the embedded JSON didn't break the ` + + +``` + +## Step 3 — inject the data and clean up + +```python +import json +from pathlib import Path + +data = json.loads(Path('graphify-out/.graphify_sigma_data.json').read_text(encoding='utf-8')) +html = Path('graphify-out/graph_sigma.html').read_text(encoding='utf-8') +html = html.replace('__GRAPH_DATA__', json.dumps(data, ensure_ascii=False)) +Path('graphify-out/graph_sigma.html').write_text(html, encoding='utf-8') +Path('graphify-out/.graphify_sigma_data.json').unlink() +``` + +**Before telling the user it's done**, sanity-check the embedded JSON didn't break the ` + + +``` + +## Step 3 — inject the data and clean up + +```python +import json +from pathlib import Path + +data = json.loads(Path('graphify-out/.graphify_sigma_data.json').read_text(encoding='utf-8')) +html = Path('graphify-out/graph_sigma.html').read_text(encoding='utf-8') +html = html.replace('__GRAPH_DATA__', json.dumps(data, ensure_ascii=False)) +Path('graphify-out/graph_sigma.html').write_text(html, encoding='utf-8') +Path('graphify-out/.graphify_sigma_data.json').unlink() +``` + +**Before telling the user it's done**, sanity-check the embedded JSON didn't break the ` + + +``` + +## Step 3 — inject the data and clean up + +```python +import json +from pathlib import Path + +data = json.loads(Path('graphify-out/.graphify_sigma_data.json').read_text(encoding='utf-8')) +html = Path('graphify-out/graph_sigma.html').read_text(encoding='utf-8') +html = html.replace('__GRAPH_DATA__', json.dumps(data, ensure_ascii=False)) +Path('graphify-out/graph_sigma.html').write_text(html, encoding='utf-8') +Path('graphify-out/.graphify_sigma_data.json').unlink() +``` + +**Before telling the user it's done**, sanity-check the embedded JSON didn't break the ` + + +``` + +## Step 3 — inject the data and clean up + +```python +import json +from pathlib import Path + +data = json.loads(Path('graphify-out/.graphify_sigma_data.json').read_text(encoding='utf-8')) +html = Path('graphify-out/graph_sigma.html').read_text(encoding='utf-8') +html = html.replace('__GRAPH_DATA__', json.dumps(data, ensure_ascii=False)) +Path('graphify-out/graph_sigma.html').write_text(html, encoding='utf-8') +Path('graphify-out/.graphify_sigma_data.json').unlink() +``` + +**Before telling the user it's done**, sanity-check the embedded JSON didn't break the ` + + +``` + +## Step 3 — inject the data and clean up + +```python +import json +from pathlib import Path + +data = json.loads(Path('graphify-out/.graphify_sigma_data.json').read_text(encoding='utf-8')) +html = Path('graphify-out/graph_sigma.html').read_text(encoding='utf-8') +html = html.replace('__GRAPH_DATA__', json.dumps(data, ensure_ascii=False)) +Path('graphify-out/graph_sigma.html').write_text(html, encoding='utf-8') +Path('graphify-out/.graphify_sigma_data.json').unlink() +``` + +**Before telling the user it's done**, sanity-check the embedded JSON didn't break the ` + + +``` + +## Step 3 — inject the data and clean up + +```python +import json +from pathlib import Path + +data = json.loads(Path('graphify-out/.graphify_sigma_data.json').read_text(encoding='utf-8')) +html = Path('graphify-out/graph_sigma.html').read_text(encoding='utf-8') +html = html.replace('__GRAPH_DATA__', json.dumps(data, ensure_ascii=False)) +Path('graphify-out/graph_sigma.html').write_text(html, encoding='utf-8') +Path('graphify-out/.graphify_sigma_data.json').unlink() +``` + +**Before telling the user it's done**, sanity-check the embedded JSON didn't break the ` + + +``` + +## Step 3 — inject the data and clean up + +```python +import json +from pathlib import Path + +data = json.loads(Path('graphify-out/.graphify_sigma_data.json').read_text(encoding='utf-8')) +html = Path('graphify-out/graph_sigma.html').read_text(encoding='utf-8') +html = html.replace('__GRAPH_DATA__', json.dumps(data, ensure_ascii=False)) +Path('graphify-out/graph_sigma.html').write_text(html, encoding='utf-8') +Path('graphify-out/.graphify_sigma_data.json').unlink() +``` + +**Before telling the user it's done**, sanity-check the embedded JSON didn't break the ` + + +``` + +## Step 3 — inject the data and clean up + +```python +import json +from pathlib import Path + +data = json.loads(Path('graphify-out/.graphify_sigma_data.json').read_text(encoding='utf-8')) +html = Path('graphify-out/graph_sigma.html').read_text(encoding='utf-8') +html = html.replace('__GRAPH_DATA__', json.dumps(data, ensure_ascii=False)) +Path('graphify-out/graph_sigma.html').write_text(html, encoding='utf-8') +Path('graphify-out/.graphify_sigma_data.json').unlink() +``` + +**Before telling the user it's done**, sanity-check the embedded JSON didn't break the ` + + +``` + +## Step 3 — inject the data and clean up + +```python +import json +from pathlib import Path + +data = json.loads(Path('graphify-out/.graphify_sigma_data.json').read_text(encoding='utf-8')) +html = Path('graphify-out/graph_sigma.html').read_text(encoding='utf-8') +html = html.replace('__GRAPH_DATA__', json.dumps(data, ensure_ascii=False)) +Path('graphify-out/graph_sigma.html').write_text(html, encoding='utf-8') +Path('graphify-out/.graphify_sigma_data.json').unlink() +``` + +**Before telling the user it's done**, sanity-check the embedded JSON didn't break the ` + + +``` + +## Step 3 — inject the data and clean up + +```python +import json +from pathlib import Path + +data = json.loads(Path('graphify-out/.graphify_sigma_data.json').read_text(encoding='utf-8')) +html = Path('graphify-out/graph_sigma.html').read_text(encoding='utf-8') +html = html.replace('__GRAPH_DATA__', json.dumps(data, ensure_ascii=False)) +Path('graphify-out/graph_sigma.html').write_text(html, encoding='utf-8') +Path('graphify-out/.graphify_sigma_data.json').unlink() +``` + +**Before telling the user it's done**, sanity-check the embedded JSON didn't break the ` + + +``` + +## Step 3 — inject the data and clean up + +```python +import json +from pathlib import Path + +data = json.loads(Path('graphify-out/.graphify_sigma_data.json').read_text(encoding='utf-8')) +html = Path('graphify-out/graph_sigma.html').read_text(encoding='utf-8') +html = html.replace('__GRAPH_DATA__', json.dumps(data, ensure_ascii=False)) +Path('graphify-out/graph_sigma.html').write_text(html, encoding='utf-8') +Path('graphify-out/.graphify_sigma_data.json').unlink() +``` + +**Before telling the user it's done**, sanity-check the embedded JSON didn't break the ` + + +``` + +## Step 3 — inject the data and clean up + +```python +import json +from pathlib import Path + +data = json.loads(Path('graphify-out/.graphify_sigma_data.json').read_text(encoding='utf-8')) +html = Path('graphify-out/graph_sigma.html').read_text(encoding='utf-8') +html = html.replace('__GRAPH_DATA__', json.dumps(data, ensure_ascii=False)) +Path('graphify-out/graph_sigma.html').write_text(html, encoding='utf-8') +Path('graphify-out/.graphify_sigma_data.json').unlink() +``` + +**Before telling the user it's done**, sanity-check the embedded JSON didn't break the ` + + +``` + +## Step 3 — inject the data and clean up + +```python +import json +from pathlib import Path + +data = json.loads(Path('graphify-out/.graphify_sigma_data.json').read_text(encoding='utf-8')) +html = Path('graphify-out/graph_sigma.html').read_text(encoding='utf-8') +html = html.replace('__GRAPH_DATA__', json.dumps(data, ensure_ascii=False)) +Path('graphify-out/graph_sigma.html').write_text(html, encoding='utf-8') +Path('graphify-out/.graphify_sigma_data.json').unlink() +``` + +**Before telling the user it's done**, sanity-check the embedded JSON didn't break the ` + + +``` + +## Step 3 — inject the data and clean up + +```python +import json +from pathlib import Path + +data = json.loads(Path('graphify-out/.graphify_sigma_data.json').read_text(encoding='utf-8')) +html = Path('graphify-out/graph_sigma.html').read_text(encoding='utf-8') +html = html.replace('__GRAPH_DATA__', json.dumps(data, ensure_ascii=False)) +Path('graphify-out/graph_sigma.html').write_text(html, encoding='utf-8') +Path('graphify-out/.graphify_sigma_data.json').unlink() +``` + +**Before telling the user it's done**, sanity-check the embedded JSON didn't break the ` + + +``` + +## Step 3 — inject the data and clean up + +```python +import json +from pathlib import Path + +data = json.loads(Path('graphify-out/.graphify_sigma_data.json').read_text(encoding='utf-8')) +html = Path('graphify-out/graph_sigma.html').read_text(encoding='utf-8') +html = html.replace('__GRAPH_DATA__', json.dumps(data, ensure_ascii=False)) +Path('graphify-out/graph_sigma.html').write_text(html, encoding='utf-8') +Path('graphify-out/.graphify_sigma_data.json').unlink() +``` + +**Before telling the user it's done**, sanity-check the embedded JSON didn't break the ` + + +``` + +## Step 3 — inject the data and clean up + +```python +import json +from pathlib import Path + +data = json.loads(Path('graphify-out/.graphify_sigma_data.json').read_text(encoding='utf-8')) +html = Path('graphify-out/graph_sigma.html').read_text(encoding='utf-8') +html = html.replace('__GRAPH_DATA__', json.dumps(data, ensure_ascii=False)) +Path('graphify-out/graph_sigma.html').write_text(html, encoding='utf-8') +Path('graphify-out/.graphify_sigma_data.json').unlink() +``` + +**Before telling the user it's done**, sanity-check the embedded JSON didn't break the ` + + +``` + +## Step 3 — inject the data and clean up + +```python +import json +from pathlib import Path + +data = json.loads(Path('graphify-out/.graphify_sigma_data.json').read_text(encoding='utf-8')) +html = Path('graphify-out/graph_sigma.html').read_text(encoding='utf-8') +html = html.replace('__GRAPH_DATA__', json.dumps(data, ensure_ascii=False)) +Path('graphify-out/graph_sigma.html').write_text(html, encoding='utf-8') +Path('graphify-out/.graphify_sigma_data.json').unlink() +``` + +**Before telling the user it's done**, sanity-check the embedded JSON didn't break the ` + + +``` + +## Step 3 — inject the data and clean up + +```python +import json +from pathlib import Path + +data = json.loads(Path('graphify-out/.graphify_sigma_data.json').read_text(encoding='utf-8')) +html = Path('graphify-out/graph_sigma.html').read_text(encoding='utf-8') +html = html.replace('__GRAPH_DATA__', json.dumps(data, ensure_ascii=False)) +Path('graphify-out/graph_sigma.html').write_text(html, encoding='utf-8') +Path('graphify-out/.graphify_sigma_data.json').unlink() +``` + +**Before telling the user it's done**, sanity-check the embedded JSON didn't break the ` + + +``` + +## Step 3 — inject the data and clean up + +```python +import json +from pathlib import Path + +data = json.loads(Path('graphify-out/.graphify_sigma_data.json').read_text(encoding='utf-8')) +html = Path('graphify-out/graph_sigma.html').read_text(encoding='utf-8') +html = html.replace('__GRAPH_DATA__', json.dumps(data, ensure_ascii=False)) +Path('graphify-out/graph_sigma.html').write_text(html, encoding='utf-8') +Path('graphify-out/.graphify_sigma_data.json').unlink() +``` + +**Before telling the user it's done**, sanity-check the embedded JSON didn't break the ` + + +``` + +## Step 3 — inject the data and clean up + +```python +import json +from pathlib import Path + +data = json.loads(Path('graphify-out/.graphify_sigma_data.json').read_text(encoding='utf-8')) +html = Path('graphify-out/graph_sigma.html').read_text(encoding='utf-8') +html = html.replace('__GRAPH_DATA__', json.dumps(data, ensure_ascii=False)) +Path('graphify-out/graph_sigma.html').write_text(html, encoding='utf-8') +Path('graphify-out/.graphify_sigma_data.json').unlink() +``` + +**Before telling the user it's done**, sanity-check the embedded JSON didn't break the ` + + +``` + +## Step 3 — inject the data and clean up + +```python +import json +from pathlib import Path + +data = json.loads(Path('graphify-out/.graphify_sigma_data.json').read_text(encoding='utf-8')) +html = Path('graphify-out/graph_sigma.html').read_text(encoding='utf-8') +html = html.replace('__GRAPH_DATA__', json.dumps(data, ensure_ascii=False)) +Path('graphify-out/graph_sigma.html').write_text(html, encoding='utf-8') +Path('graphify-out/.graphify_sigma_data.json').unlink() +``` + +**Before telling the user it's done**, sanity-check the embedded JSON didn't break the ` + + +``` + +## Step 3 — inject the data and clean up + +```python +import json +from pathlib import Path + +data = json.loads(Path('graphify-out/.graphify_sigma_data.json').read_text(encoding='utf-8')) +html = Path('graphify-out/graph_sigma.html').read_text(encoding='utf-8') +html = html.replace('__GRAPH_DATA__', json.dumps(data, ensure_ascii=False)) +Path('graphify-out/graph_sigma.html').write_text(html, encoding='utf-8') +Path('graphify-out/.graphify_sigma_data.json').unlink() +``` + +**Before telling the user it's done**, sanity-check the embedded JSON didn't break the ` + + +``` + +## Step 3 — inject the data and clean up + +```python +import json +from pathlib import Path + +data = json.loads(Path('graphify-out/.graphify_sigma_data.json').read_text(encoding='utf-8')) +html = Path('graphify-out/graph_sigma.html').read_text(encoding='utf-8') +html = html.replace('__GRAPH_DATA__', json.dumps(data, ensure_ascii=False)) +Path('graphify-out/graph_sigma.html').write_text(html, encoding='utf-8') +Path('graphify-out/.graphify_sigma_data.json').unlink() +``` + +**Before telling the user it's done**, sanity-check the embedded JSON didn't break the ` + + +``` + +## Step 3 — inject the data and clean up + +```python +import json +from pathlib import Path + +data = json.loads(Path('graphify-out/.graphify_sigma_data.json').read_text(encoding='utf-8')) +html = Path('graphify-out/graph_sigma.html').read_text(encoding='utf-8') +html = html.replace('__GRAPH_DATA__', json.dumps(data, ensure_ascii=False)) +Path('graphify-out/graph_sigma.html').write_text(html, encoding='utf-8') +Path('graphify-out/.graphify_sigma_data.json').unlink() +``` + +**Before telling the user it's done**, sanity-check the embedded JSON didn't break the ` + + +``` + +## Step 3 — inject the data and clean up + +```python +import json +from pathlib import Path + +data = json.loads(Path('graphify-out/.graphify_sigma_data.json').read_text(encoding='utf-8')) +html = Path('graphify-out/graph_sigma.html').read_text(encoding='utf-8') +html = html.replace('__GRAPH_DATA__', json.dumps(data, ensure_ascii=False)) +Path('graphify-out/graph_sigma.html').write_text(html, encoding='utf-8') +Path('graphify-out/.graphify_sigma_data.json').unlink() +``` + +**Before telling the user it's done**, sanity-check the embedded JSON didn't break the ` + + +``` + +## Step 3 — inject the data and clean up + +```python +import json +from pathlib import Path + +data = json.loads(Path('graphify-out/.graphify_sigma_data.json').read_text(encoding='utf-8')) +html = Path('graphify-out/graph_sigma.html').read_text(encoding='utf-8') +html = html.replace('__GRAPH_DATA__', json.dumps(data, ensure_ascii=False)) +Path('graphify-out/graph_sigma.html').write_text(html, encoding='utf-8') +Path('graphify-out/.graphify_sigma_data.json').unlink() +``` + +**Before telling the user it's done**, sanity-check the embedded JSON didn't break the ` + + +``` + +## Step 3 — inject the data and clean up + +```python +import json +from pathlib import Path + +data = json.loads(Path('graphify-out/.graphify_sigma_data.json').read_text(encoding='utf-8')) +html = Path('graphify-out/graph_sigma.html').read_text(encoding='utf-8') +html = html.replace('__GRAPH_DATA__', json.dumps(data, ensure_ascii=False)) +Path('graphify-out/graph_sigma.html').write_text(html, encoding='utf-8') +Path('graphify-out/.graphify_sigma_data.json').unlink() +``` + +**Before telling the user it's done**, sanity-check the embedded JSON didn't break the ` + + +``` + +## Step 3 — inject the data and clean up + +```python +import json +from pathlib import Path + +data = json.loads(Path('graphify-out/.graphify_sigma_data.json').read_text(encoding='utf-8')) +html = Path('graphify-out/graph_sigma.html').read_text(encoding='utf-8') +html = html.replace('__GRAPH_DATA__', json.dumps(data, ensure_ascii=False)) +Path('graphify-out/graph_sigma.html').write_text(html, encoding='utf-8') +Path('graphify-out/.graphify_sigma_data.json').unlink() +``` + +**Before telling the user it's done**, sanity-check the embedded JSON didn't break the ` safety check, search results ignoring active filters, and a camera-pan target using raw graph coordinates instead of sigma's own display-space coordinates. --- CHANGELOG.md | 1 + .../skills/agents/references/sigma-viz.md | 322 +++++++++++++++--- graphify/skills/amp/references/sigma-viz.md | 322 +++++++++++++++--- .../skills/claude/references/sigma-viz.md | 322 +++++++++++++++--- graphify/skills/claw/references/sigma-viz.md | 322 +++++++++++++++--- graphify/skills/codex/references/sigma-viz.md | 322 +++++++++++++++--- .../skills/copilot/references/sigma-viz.md | 322 +++++++++++++++--- graphify/skills/droid/references/sigma-viz.md | 322 +++++++++++++++--- graphify/skills/kilo/references/sigma-viz.md | 322 +++++++++++++++--- graphify/skills/kiro/references/sigma-viz.md | 322 +++++++++++++++--- .../skills/opencode/references/sigma-viz.md | 322 +++++++++++++++--- graphify/skills/pi/references/sigma-viz.md | 322 +++++++++++++++--- graphify/skills/trae/references/sigma-viz.md | 322 +++++++++++++++--- .../skills/vscode/references/sigma-viz.md | 322 +++++++++++++++--- .../skills/windows/references/sigma-viz.md | 322 +++++++++++++++--- ...__skills__agents__references__sigma-viz.md | 322 +++++++++++++++--- ...ify__skills__amp__references__sigma-viz.md | 322 +++++++++++++++--- ...__skills__claude__references__sigma-viz.md | 322 +++++++++++++++--- ...fy__skills__claw__references__sigma-viz.md | 322 +++++++++++++++--- ...y__skills__codex__references__sigma-viz.md | 322 +++++++++++++++--- ..._skills__copilot__references__sigma-viz.md | 322 +++++++++++++++--- ...y__skills__droid__references__sigma-viz.md | 322 +++++++++++++++--- ...fy__skills__kilo__references__sigma-viz.md | 322 +++++++++++++++--- ...fy__skills__kiro__references__sigma-viz.md | 322 +++++++++++++++--- ...skills__opencode__references__sigma-viz.md | 322 +++++++++++++++--- ...hify__skills__pi__references__sigma-viz.md | 322 +++++++++++++++--- ...fy__skills__trae__references__sigma-viz.md | 322 +++++++++++++++--- ...__skills__vscode__references__sigma-viz.md | 322 +++++++++++++++--- ..._skills__windows__references__sigma-viz.md | 322 +++++++++++++++--- .../fragments/references/shared/sigma-viz.md | 322 +++++++++++++++--- 30 files changed, 8005 insertions(+), 1334 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 60833c012..ed996c9e3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ Full release notes with details on each version: [GitHub Releases](https://githu ## Unreleased - Feat: Sigma.js + graphology fallback for large `graph.html` views, plus batched/reconciled community labeling at scale. vis-network's live client-side forceAtlas2 physics simulation is genuinely slow/laggy past a few hundred nodes regardless of hardware — verified in production on a 1083-community monorepo graph (apa, 2026-07-03). Step 6 of the skill now generates a separate WebGL Sigma.js render (`graph_sigma.html`) with the layout precomputed offline in Python (`nx.forceatlas2_layout`, no client-side physics) once the view exceeds ~300 nodes; the full recipe lives in the new `references/sigma-viz.md`, shipped to every split-platform skill variant. Step 5's community labeling also gains a batched-subagent flow for 100+ communities (sample each community's top-degree nodes, dispatch one `general-purpose` subagent per ~15-20-community batch in parallel) plus a required cross-batch label-reconciliation pass — a naive single-pass label run on the same graph left 338 of 1083 communities (31%) sharing a label with another before reconciliation. + The Sigma view also fixes a node-sizing bug (`autoRescale` must be disabled alongside `itemSizesReference: "positions"`, per sigma's own docs — otherwise sizes stay anchored to the pre-rescale coordinate frame and don't track zoom) and recalibrates node size against the layout's own median nearest-neighbor distance instead of a fixed constant, so communities stay legible instead of overlapping into a blob as node count grows. It now also surfaces each community's dominant content kind as an icon (code/document/paper/image/rationale/concept, via `@sigma/node-image`'s `NodePictogramProgram`) and dominant top-level module as color, plus a left-side panel to filter by entity kind and by relation type (grouped into calls/structure/imports/references/documentation-and-concepts/groups, covering both code and non-code relations) and a clickable module legend to isolate one part of the codebase at a time. - Fix: the `query` reference doc's inline vocab/fallback snippets now read and write files with `encoding="utf-8"` (#1619 A2, thanks @edtrackai). On Windows (default cp1252) the bare `read_text()`/`write_text()` calls crashed on exactly the cross-language corpora the doc demonstrates (e.g. Cyrillic labels like `обработчик`). Fixed across all generated skill variants. diff --git a/graphify/skills/agents/references/sigma-viz.md b/graphify/skills/agents/references/sigma-viz.md index 7cf0ba408..0eb161320 100644 --- a/graphify/skills/agents/references/sigma-viz.md +++ b/graphify/skills/agents/references/sigma-viz.md @@ -4,12 +4,15 @@ Load this when Step 6's `graph.html` (vis-network) would render more than ~300 n Output file: `graphify-out/graph_sigma.html` (self-contained, opens directly like `graph.html`). +Beyond the raw performance fix, this view also encodes three things vis-network's `graph.html` doesn't surface at a glance: each community's **dominant content kind** (code/document/paper/image/rationale/concept, drawn as a small icon), its **dominant module** (the top-level directory most of its members live under, drawn as color), and a **left-side filter panel** for both entity kind and relation type — so a code-heavy corpus with a handful of docs sprinkled in doesn't read as one undifferentiated blob. + ## Step 1 — build the meta-graph and precompute layout in Python Adjust `MIN_COMMUNITY_SIZE` (20 is a reasonable default — communities below this rarely appear in God Nodes / navigation and just add render cost) and `INPUT_PATH`/label source to match the current run. ```python import json +import math import networkx as nx from pathlib import Path from collections import Counter, defaultdict @@ -17,53 +20,137 @@ from collections import Counter, defaultdict g_data = json.loads(Path('graphify-out/graph.json').read_text(encoding='utf-8')) labels = json.loads(Path('graphify-out/.graphify_labels.json').read_text(encoding='utf-8')) +# Maps every relation graphify emits (AST-structural and LLM-semantic alike) to +# one of six buckets the filter panel toggles as a group. Keep this in sync +# with the relation vocabulary in graphify/extract.py if new relations are +# added there — an unmapped relation falls into 'other' rather than crashing. +RELATION_BUCKETS = { + 'calls': 'calls', 'indirect_call': 'calls', 'instantiates': 'calls', + 'contains': 'structure', 'defines': 'structure', 'method': 'structure', + 'implements': 'structure', 'inherits': 'structure', + 'imports': 'imports', 'imports_from': 'imports', 'dynamic_import': 'imports', + 're_exports': 'imports', 'depends_on': 'imports', 'crate_depends_on': 'imports', + 'requires_env': 'imports', + 'references': 'references', 'references_constant': 'references', 'uses': 'references', + 'uses_static_prop': 'references', 'bound_to': 'references', 'listened_by': 'references', + 'cites': 'docs', 'conceptually_related_to': 'docs', 'shares_data_with': 'docs', + 'semantically_similar_to': 'docs', 'rationale_for': 'docs', + 'participate_in': 'groups', 'implement': 'groups', 'form': 'groups', +} + +def top_level_dir(source_file: str) -> str: + if not source_file or '/' not in source_file: + return '(root)' + return source_file.split('/')[0] + MIN_COMMUNITY_SIZE = 20 +node_attrs = {n['id']: n for n in g_data['nodes']} comms = defaultdict(list) for n in g_data['nodes']: comms[n['community']].append(n['id']) significant = {cid: members for cid, members in comms.items() if len(members) >= MIN_COMMUNITY_SIZE} +dropped = len(comms) - len(significant) +if not significant: + # Every community is below the threshold (plausible on a corpus that + # clusters into many small communities) - fall back to all of them + # rather than crashing on an empty meta-graph downstream. + largest = max((len(m) for m in comms.values()), default=0) + print(f'No community reaches MIN_COMMUNITY_SIZE={MIN_COMMUNITY_SIZE} (largest: {largest}) - showing all {len(comms)} communities instead.') + significant = comms + dropped = 0 node_to_community = {m: cid for cid, members in significant.items() for m in members} meta = nx.Graph() for cid, members in significant.items(): - meta.add_node(cid, member_count=len(members), label=labels.get(str(cid), f'Community {cid}')) + # Dominant file_type (majority vote) drives the icon; dominant top-level + # directory drives the color. Both are approximations at the community + # level — a mixed community shows its majority kind/module, not a blend. + type_counts = Counter(node_attrs[m].get('file_type', 'code') for m in members) + dir_counts = Counter(top_level_dir(node_attrs[m].get('source_file', '')) for m in members) + meta.add_node( + cid, member_count=len(members), label=labels.get(str(cid), f'Community {cid}'), + file_type=type_counts.most_common(1)[0][0], module=dir_counts.most_common(1)[0][0], + ) edge_counts = Counter() -for link in g_data['links']: +edge_buckets = defaultdict(Counter) +# NetworkX <= 3.1 serializes edges as 'links'; some older graph.json files use +# 'edges' instead (same compatibility hazard graphify/build.py and +# graphify/affected.py already guard against) - accept either. +links_key = 'links' if 'links' in g_data else 'edges' +for link in g_data[links_key]: cu, cv = node_to_community.get(link['source']), node_to_community.get(link['target']) if cu is not None and cv is not None and cu != cv: - edge_counts[(min(cu, cv), max(cu, cv))] += 1 + key = (min(cu, cv), max(cu, cv)) + edge_counts[key] += 1 + edge_buckets[key][RELATION_BUCKETS.get(link.get('relation', ''), 'other')] += 1 + +# Hyperedges (3+ node group relations - participate_in/implement/form) carry +# no source/target, so they never appear in the loop above. Remap each to the +# distinct communities its members span and count it into every pairwise +# combination, mirroring how graphify/export.py's vis-network aggregated view +# remaps hyperedges to community IDs - otherwise 'groups' in RELATION_BUCKETS +# is unreachable and the filter panel's "Groups" checkbox always no-ops. +for he in g_data.get('hyperedges', []): + he_communities = sorted({node_to_community[m] for m in he.get('nodes', []) if m in node_to_community}) + for i in range(len(he_communities)): + for j in range(i + 1, len(he_communities)): + key = (he_communities[i], he_communities[j]) + edge_counts[key] += 1 + edge_buckets[key][RELATION_BUCKETS.get(he.get('relation', ''), 'groups')] += 1 + for (cu, cv), w in edge_counts.items(): - meta.add_edge(cu, cv, weight=w) + meta.add_edge(cu, cv, weight=w, buckets=dict(edge_buckets[(cu, cv)])) # offline layout — no client-side physics needed at all pos = nx.forceatlas2_layout(meta, max_iter=800, gravity=1.0, scaling_ratio=4.0, seed=42, weight='weight') degrees = dict(meta.degree()) -max_deg = max(degrees.values()) if degrees else 1 max_members = max((meta.nodes[n]['member_count'] for n in meta.nodes), default=1) xs = [float(p[0]) for p in pos.values()] ys = [float(p[1]) for p in pos.values()] xr, yr = (max(xs) - min(xs)) or 1, (max(ys) - min(ys)) or 1 +scaled = {n: ((float(pos[n][0]) - min(xs)) / xr * 1000, (float(pos[n][1]) - min(ys)) / yr * 1000) for n in meta.nodes()} + +# Density-aware sizing: a fixed absolute size range (e.g. "3 to 15") looks +# fine at a few dozen communities but overlaps into an unreadable blob once +# forceAtlas2 packs 300+ communities into the same normalized space — the +# same size value covers a much larger *fraction* of the available room as +# node count grows. Calibrate against the layout's own median nearest- +# neighbor distance instead, so sizes stay legible regardless of density. +def _nearest_neighbor_dists(points): + dists = [] + for i, (x1, y1) in enumerate(points): + best = min((math.hypot(x1 - x2, y1 - y2) for j, (x2, y2) in enumerate(points) if j != i), default=None) + if best is not None: + dists.append(best) + return dists + +nn = _nearest_neighbor_dists(list(scaled.values())) +median_nn = sorted(nn)[len(nn) // 2] if nn else 30.0 +SIZE_MIN = max(2.0, median_nn * 0.12) +SIZE_MAX = max(SIZE_MIN * 2, median_nn * 0.45) nodes_out = [] for n in meta.nodes(): - x, y = float(pos[n][0]), float(pos[n][1]) + x, y = scaled[n] deg, mc = int(degrees.get(n, 0)), int(meta.nodes[n]['member_count']) nodes_out.append({ 'key': str(n), 'label': meta.nodes[n]['label'], - 'x': round((x - min(xs)) / xr * 1000, 2), 'y': round((y - min(ys)) / yr * 1000, 2), - 'size': round(3 + 12 * (mc / max_members) ** 0.5, 2), - 't': round(deg / max_deg if max_deg else 0, 3), - 'members': mc, 'degree': deg, + 'x': round(x, 2), 'y': round(y, 2), + 'size': round(SIZE_MIN + (SIZE_MAX - SIZE_MIN) * (mc / max_members) ** 0.5, 2), + 'degree': deg, 'members': mc, + 'fileType': meta.nodes[n]['file_type'], 'module': meta.nodes[n]['module'], }) -edges_out = [{'source': str(u), 'target': str(v), 'weight': int(d.get('weight', 1))} - for u, v, d in meta.edges(data=True)] +edges_out = [ + {'source': str(u), 'target': str(v), 'weight': int(d.get('weight', 1)), 'buckets': d.get('buckets', {})} + for u, v, d in meta.edges(data=True) +] Path('graphify-out/.graphify_sigma_data.json').write_text( json.dumps({'nodes': nodes_out, 'edges': edges_out}, ensure_ascii=False), encoding='utf-8') -print(f'meta graph: {len(nodes_out)} nodes, {len(edges_out)} edges — layout precomputed') +print(f'meta graph: {len(nodes_out)} nodes, {len(edges_out)} edges — layout precomputed, size range {SIZE_MIN:.1f}-{SIZE_MAX:.1f}, {dropped} communities below MIN_COMMUNITY_SIZE={MIN_COMMUNITY_SIZE} dropped') ``` **Important**: cast every numpy value (`forceatlas2_layout` returns numpy floats) to plain Python `float`/`int` before `json.dumps` — numpy scalars aren't JSON-serializable and will raise `TypeError: Object of type float32 is not JSON serializable`. @@ -73,10 +160,14 @@ print(f'meta graph: {len(nodes_out)} nodes, {len(edges_out)} edges — layout pr Write this template to `graphify-out/graph_sigma.html`, with a literal `__GRAPH_DATA__` placeholder where the data goes (substituted in Step 3 — do NOT try to embed the JSON directly while authoring the template, string-templating that much escaping inline is error-prone). Key implementation notes: -- **Library loading**: sigma@3 ships CJS/ESM only, no browser UMD global. Load both libraries as ES modules from `esm.sh` (`https://esm.sh/sigma@3.0.3`, `https://esm.sh/graphology@0.25.4`) via `

uhprpJpDye?Krjt0nHz}Gm#paPJ63e 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