From 01014cbe772ea5a59ccbc55266222433944c7368 Mon Sep 17 00:00:00 2001 From: Ali Romman <226877337+aliromman@users.noreply.github.com> Date: Mon, 26 Oct 2026 11:59:51 -0500 Subject: [PATCH 1/7] test: retain frozen research routes across priority revisions (cherry picked from commit ba8a9e640e1983f3c29993fefa3f46e8ed03313a) --- tests/fixtures/README.md | 41 ++++++ tests/fixtures/research-routing-v7.json | 87 ++++++++++++ tests/test_research_current_assignment.py | 164 +++++++++++++++------- 3 files changed, 242 insertions(+), 50 deletions(-) create mode 100644 tests/fixtures/README.md create mode 100644 tests/fixtures/research-routing-v7.json diff --git a/tests/fixtures/README.md b/tests/fixtures/README.md new file mode 100644 index 0000000000..472a6a502f --- /dev/null +++ b/tests/fixtures/README.md @@ -0,0 +1,41 @@ +# Frozen research routing fixture + +`research-routing-v7.json` retains two exact task cards from priority revision 7: +`portable-replay` and `centre-path-sharing`. They exercise the generic-baseline +and historical-ceiling routes in `choose_current_research_task.py`. The fixture +records the source commit, path and SHA256. The card objects are unchanged. + +The source is commit `553d26d796fde9871ff2661a49ac7732e945410f`, file +`docs/research/agent-task-catalog.json`. The test places these cards in a small +catalogue with one track of weight 100. This carrier is test data, not a change +to research priorities. Current cards are checked separately from the live +catalogue. Every live card must preserve its other fields; each distinct direct +command also passes through both real CLIs. + +The CLI fixture copies the two real scripts. It creates inert reference files +for path validation and copies the current selected record for receipt fields. +It does not execute those references or verify a mathematical claim. Missing +references, sparse omissions, deleted files and staged replacements have separate +negative tests. No Git history, network request or change to the live catalogue +is needed to run the fixture. + +```sh +python3 -B -m unittest discover -s tests -p test_research_current_assignment.py -v +python3 -B -m unittest discover -s tests -p test_research_assignment.py -v +``` + +This fixture repairs the CI handoff in +[Discussion 5722](https://github.com/CrocSwap/integer-mult-bounds/discussions/5722). +The [investigation](https://github.com/CrocSwap/integer-mult-bounds/discussions/5758) +records the failure, checks and publication status. The original scripts, task +catalogue and selected frontier are unchanged. + +On base `de5ec2e7a6074068452f45b1a191b5c72832df4a`, the old suite has eight +failures and two errors. After the repair, all 12 current-assignment tests pass +under Python 3.14.7 and Python 3.12.14, including an isolated optimized run. +All 16 related assignment tests pass under Python 3.12.14. This is test coverage, +not a mathematical replay. See the investigation for hosted-plan status. + +Retain the original catalogue, routing and test authors, including Douglas +Colkitt, Ali Romman and Mihir Srivastava. New fixture and test repair: Ali Romman +with substantial OpenAI Codex assistance. No subagents. Apache-2.0. diff --git a/tests/fixtures/research-routing-v7.json b/tests/fixtures/research-routing-v7.json new file mode 100644 index 0000000000..f5d52ac21d --- /dev/null +++ b/tests/fixtures/research-routing-v7.json @@ -0,0 +1,87 @@ +{ + "source_commit": "553d26d796fde9871ff2661a49ac7732e945410f", + "source_path": "docs/research/agent-task-catalog.json", + "source_sha256": "f7a48bfa2659b88378282a8eee7d9fe52cdf505594124c4d1686b58510fffd72", + "scope": "Two exact revision-7 cards. The test carrier is not a research allocation.", + "cards": [ + { + "id": "centre-path-sharing", + "question": "Can the 64-per-call centre path (eight rank-8 COPY/ERASE totals through the private temporary) be shared across calls or shrunk?", + "starting_points": [ + "docs/research/research-family-status.md", + "research/complex-local-word-ceiling/README.md", + "research/split-centres-global/proofs/PR386-BIT-GEOMETRY.txt", + "certificates/selected-result.json" + ], + "methods": [ + "Derive a fully charged favorable relaxation for sharing one centre path across k calls, including restoration, hosting and precision.", + "Prove a lower bound on copied information per call for the selected decoder contract." + ], + "acceptance_gate": "Show the changed centre charge and copy profile per call with every added restoration or hosting cost charged, and its ceiling via ceiling.ceiling(centre=...). A scoped local result may be retained without a complete supplier. Expanding it into further construction rounds requires the family-level budget and obligation gate in research-family-status.md; an optimistic passing relaxation alone is not acceptance.", + "first_step": { + "command": [ + "python3", + "-B", + "research/complex-local-word-ceiling/verify.py" + ], + "expected": "PASS_COMPLEX_LOCAL_WORD_CEILING", + "inspect": "Read the selected word's per-call local profile, its packing ceiling and the lever table; run levers.py for the ideal budget of the lever you target.", + "scope": "Positive control and planning budget only; this is not a new construction or full cold replay." + }, + "first_experiment": "Write the per-call centre charge and copy children for sharing across k = 2 calls, charge the sharing overhead, and screen it; stop this route if even the ideal sharing gains under 10%. Ideal budgets: free 2.80x, shared by two 1.90x (levers.py).", + "bottleneck_link": "The centre path consumes 64 of about 99.6 unpaid coordinates per call, i.e. about 64% of the raw deficit.", + "allowed_variations": [ + "One sharing pattern across a fixed number of calls.", + "One reduced copied-total contract for the existing decoder.", + "If the coverage law, template or guard changes, derive an applicable fully charged replacement bound instead of applying the incumbent ceiling outside its scope." + ], + "scope_change_triggers": [ + "Removing copies without a replacement contract for the decoder's copied totals.", + "Continuing a partial cost improvement while leaving the same unpriced consumer, restoration or central-readout obligation unresolved; refresh the family expansion decision first. Local product-retiming evidence has a narrow scope and is not a ban on changed graphs or contracts." + ], + "overlap_terms": [ + "centre path", + "copied totals", + "private temporary", + "shared centre", + "batching" + ] + }, + { + "id": "portable-replay", + "question": "Can one reproducible environment or artifact-comparison failure be repaired?", + "starting_points": [ + "research/gzip-container-reproducibility/README.md", + "docs/ci-verification.md" + ], + "methods": [ + "Reproduce one portability failure and add a minimal cross-environment fix.", + "Audit one canonical-payload comparison for omitted proof-relevant fields." + ], + "acceptance_gate": "Preserve immutable source hashes and proof-relevant content; a different compressed byte stream alone is not a mathematical mismatch.", + "first_step": { + "command": [ + "python3", + "-B", + "scripts/research_baseline.py" + ], + "expected": "PASS_RESEARCH_BASELINE_BINDINGS_ONLY", + "inspect": "Read the gzip-container reproducibility examples and distinguish frozen source bytes from regenerated payloads.", + "scope": "Positive control / source-bound orientation only; this is not a new construction or full cold replay." + }, + "first_experiment": "Reproduce one specific mismatch or audit one canonical comparison for omitted proof-relevant fields.", + "bottleneck_link": "Portable exact checks prevent environment failures from blocking valid contributions.", + "allowed_variations": [ + "One interpreter/version mismatch or one payload field comparison." + ], + "scope_change_triggers": [ + "Removing immutable-source pins because generated compressed bytes differ." + ], + "overlap_terms": [ + "gzip container", + "reproducibility", + "canonical payload" + ] + } + ] +} diff --git a/tests/test_research_current_assignment.py b/tests/test_research_current_assignment.py index 860f6b9b9e..c524c0037f 100644 --- a/tests/test_research_current_assignment.py +++ b/tests/test_research_current_assignment.py @@ -1,9 +1,15 @@ -"""Current orientation must preserve frozen task-selection evidence.""" +"""Current orientation must preserve frozen task-selection evidence. + +Frozen fixtures and live-catalog coverage: Ali Romman with OpenAI Codex +assistance. Retain the original routing and test authors. Apache-2.0. +""" import copy +from contextlib import contextmanager import importlib.util import json from pathlib import Path import subprocess +import shutil import sys import tempfile import unittest @@ -15,16 +21,49 @@ LEGACY = current.LEGACY legacy = current.runpy.run_path(str(LEGACY)) CATALOG = json.loads((ROOT / legacy["CATALOG"]).read_text(encoding="utf-8")) +FROZEN = json.loads((ROOT / "tests/fixtures/research-routing-v7.json").read_text()) +FROZEN_CATALOG = { + "schema_version": 1, "priority_revision": 7, + "priority_log": "docs/research/routing-fixture.md", + "tracks": [{"id": "routing-fixtures", "weight": 100, "tasks": FROZEN["cards"]}], +} + + +@contextmanager +def frozen_cli_tree(): + """Run the real scripts with exact old cards and inert reference files.""" + with tempfile.TemporaryDirectory() as directory: + root = Path(directory) + required = {FROZEN_CATALOG["priority_log"], + "scripts/research_selected_baseline.py", "scripts/research_package.py", + "research/historical-complex-ceiling-replay/VERIFY.json", + "research/historical-complex-ceiling-replay/verify.py"} + for card in FROZEN["cards"]: + required.update(card["starting_points"]) + required.add(card["first_step"]["command"][-1]) + for name in required: + path = root / name + path.parent.mkdir(parents=True, exist_ok=True) + path.write_text("Inert reference for CLI validation only.\n") + for name in ("choose_research_task.py", "choose_current_research_task.py"): + shutil.copyfile(ROOT / "scripts" / name, root / "scripts" / name) + path = root / legacy["CATALOG"] + path.parent.mkdir(parents=True, exist_ok=True) + path.write_text(json.dumps(FROZEN_CATALOG)) + path = root / "certificates/selected-result.json" + path.parent.mkdir(parents=True, exist_ok=True) + shutil.copyfile(ROOT / "certificates/selected-result.json", path) + yield root class CurrentResearchAssignmentTests(unittest.TestCase): - def test_every_frozen_card_and_other_fields_stay_exact(self): - before = copy.deepcopy(CATALOG) + def check_card_round_trips(self, catalog): + before = copy.deepcopy(catalog) resolved = 0 historical = 0 - for track in CATALOG["tracks"]: + for track in catalog["tracks"]: for task in track["tasks"]: - result = legacy["select"](CATALOG, "a1" * 16, task_id=task["id"]) + result = legacy["select"](catalog, "a1" * 16, task_id=task["id"]) original = copy.deepcopy(result) current.resolve_current_first_steps(result, ROOT) card = result["suggestions"][0] @@ -55,19 +94,25 @@ def test_every_frozen_card_and_other_fields_stay_exact(self): self.assertTrue(card.pop("first_step_resolution")) card["first_step"] = card.pop("catalog_first_step") self.assertEqual(result, original) - self.assertEqual(resolved, 16) - self.assertEqual(historical, 4) - self.assertEqual(CATALOG, before) + self.assertEqual(catalog, before) + return resolved, historical + + def test_frozen_routes_and_other_fields_stay_exact(self): + self.assertEqual(self.check_card_round_trips(FROZEN_CATALOG), (1, 1)) + + def test_every_live_card_and_other_fields_stay_exact(self): + self.assertTrue(CATALOG["tracks"]) + self.check_card_round_trips(CATALOG) def test_only_exact_generic_command_is_resolved(self): - result = copy.deepcopy(legacy["select"](CATALOG, "0" * 32, task_id="portable-replay")) + result = copy.deepcopy(legacy["select"](FROZEN_CATALOG, "0" * 32, task_id="portable-replay")) result["suggestions"][0]["first_step"]["command"].append("--historical-fixture") original = copy.deepcopy(result) self.assertEqual(current.resolve_current_first_steps(result, ROOT), []) self.assertEqual(result, original) def test_missing_current_helper_does_not_change_receipt(self): - result = legacy["select"](CATALOG, "0" * 32, task_id="portable-replay") + result = legacy["select"](FROZEN_CATALOG, "0" * 32, task_id="portable-replay") original = copy.deepcopy(result) with tempfile.TemporaryDirectory() as directory: with self.assertRaisesRegex(ValueError, "missing current first-step script"): @@ -82,7 +127,7 @@ def test_nonexact_scientific_commands_are_not_reinterpreted(self): ): with self.subTest(command=command): result = copy.deepcopy(legacy["select"]( - CATALOG, "0" * 32, task_id="centre-path-sharing")) + FROZEN_CATALOG, "0" * 32, task_id="centre-path-sharing")) result["suggestions"][0]["first_step"]["command"] = command original = copy.deepcopy(result) self.assertEqual(current.resolve_current_first_steps(result, ROOT), []) @@ -102,34 +147,52 @@ def test_missing_historical_reference_leaves_all_cards_unchanged(self): path = root / name path.parent.mkdir(parents=True, exist_ok=True) path.write_text("fixture\n") - result = legacy["select"](CATALOG, "0" * 32, task_id="portable-replay") + result = legacy["select"](FROZEN_CATALOG, "0" * 32, task_id="portable-replay") result["suggestions"] += legacy["select"]( - CATALOG, "0" * 32, task_id="centre-path-sharing")["suggestions"] + FROZEN_CATALOG, "0" * 32, task_id="centre-path-sharing")["suggestions"] original = copy.deepcopy(result) with self.assertRaises(ValueError) as raised: current.resolve_current_first_steps(result, root) self.assertIn(absent, str(raised.exception)) self.assertEqual(result, original) - def cli(self, script, args): - return subprocess.run([sys.executable, "-B", str(script), *args], cwd=ROOT, + def cli(self, script, args, root=ROOT): + return subprocess.run([sys.executable, "-B", str(root / "scripts" / Path(script).name), *args], cwd=root, capture_output=True, text=True, encoding="utf-8") def test_cli_preserves_legacy_output_and_emits_both_commands(self): - args = ["--seed", "0" * 32, "--task", "portable-replay"] - original = self.cli(LEGACY, args) - output = self.cli(ROOT / "scripts/choose_current_research_task.py", args) - self.assertEqual(original.returncode, 0) - self.assertEqual(output.returncode, 0) - old, new = json.loads(original.stdout), json.loads(output.stdout) - card = new["suggestions"][0] - self.assertEqual(card["first_step"]["command"], - ["python3", "-B", "scripts/research_selected_baseline.py"]) - self.assertEqual(card.pop("catalog_first_step"), old["suggestions"][0]["first_step"]) - self.assertTrue(card.pop("first_step_resolution")) - card["first_step"] = old["suggestions"][0]["first_step"] - self.assertEqual(new, old) - self.assertEqual(self.cli(LEGACY, args).stdout, original.stdout) + with frozen_cli_tree() as root: + args = ["--seed", "0" * 32, "--task", "portable-replay"] + original = self.cli(LEGACY, args, root) + output = self.cli(ROOT / "scripts/choose_current_research_task.py", args, root) + self.assertEqual(original.returncode, 0) + self.assertEqual(output.returncode, 0) + old, new = json.loads(original.stdout), json.loads(output.stdout) + card = new["suggestions"][0] + self.assertEqual(card["first_step"]["command"], + ["python3", "-B", "scripts/research_selected_baseline.py"]) + self.assertEqual(card.pop("catalog_first_step"), old["suggestions"][0]["first_step"]) + self.assertTrue(card.pop("first_step_resolution")) + card["first_step"] = old["suggestions"][0]["first_step"] + self.assertEqual(new, old) + self.assertEqual(self.cli(LEGACY, args, root).stdout, original.stdout) + + def test_live_cli_preserves_each_unmapped_command(self): + checked = {tuple(card["first_step"]["command"]) for card in FROZEN["cards"]} + for track in CATALOG["tracks"]: + for task in track["tasks"]: + command = tuple(task["first_step"]["command"]) + if command in checked: + continue + checked.add(command) + with self.subTest(task=task["id"]): + args = ["--seed", "0" * 32, "--task", task["id"]] + original = self.cli(LEGACY, args) + output = self.cli(ROOT / "scripts/choose_current_research_task.py", args) + self.assertEqual(original.returncode, 0, original.stderr) + self.assertEqual(output.returncode, 0, output.stderr) + self.assertEqual(json.loads(output.stdout), json.loads(original.stdout)) + self.assertEqual(self.cli(LEGACY, args).stdout, original.stdout) def test_help_and_error_preserve_child_status_and_output(self): for args, code in ((["--help"], 0), (["--unknown-option"], 2), (["--seed", "bad"], 2)): @@ -139,23 +202,24 @@ def test_help_and_error_preserve_child_status_and_output(self): self.assertEqual((output.stdout, output.stderr), (original.stdout, original.stderr)) def test_cli_distinguishes_current_orientation_from_historical_control(self): - args = ["--seed", "0" * 32, "--task", "complex-new-helper-inventory"] - original = self.cli(LEGACY, args) - output = self.cli(ROOT / "scripts/choose_current_research_task.py", args) - self.assertEqual(original.returncode, 0, original.stderr) - self.assertEqual(output.returncode, 0, output.stderr) - old, new = json.loads(original.stdout), json.loads(output.stdout) - card = new["suggestions"][0] - self.assertEqual(card["first_step"]["command"][2], "scripts/research_selected_baseline.py") - self.assertEqual(card["first_step"]["expected"], "PASS_RESEARCH_BASELINE_BINDINGS_ONLY") - follow_up, = card.pop("follow_up_steps") - self.assertEqual(follow_up["command"][-1], "research/historical-complex-ceiling-replay") - self.assertIn("historical", follow_up["scope"].lower()) - self.assertIn("cost law", follow_up["inspect"]) - self.assertTrue(card.pop("first_step_resolution")) - card["first_step"] = card.pop("catalog_first_step") - self.assertEqual(new, old) - self.assertEqual(self.cli(LEGACY, args).stdout, original.stdout) + with frozen_cli_tree() as root: + args = ["--seed", "0" * 32, "--task", "centre-path-sharing"] + original = self.cli(LEGACY, args, root) + output = self.cli(ROOT / "scripts/choose_current_research_task.py", args, root) + self.assertEqual(original.returncode, 0, original.stderr) + self.assertEqual(output.returncode, 0, output.stderr) + old, new = json.loads(original.stdout), json.loads(output.stdout) + card = new["suggestions"][0] + self.assertEqual(card["first_step"]["command"][2], "scripts/research_selected_baseline.py") + self.assertEqual(card["first_step"]["expected"], "PASS_RESEARCH_BASELINE_BINDINGS_ONLY") + follow_up, = card.pop("follow_up_steps") + self.assertEqual(follow_up["command"][-1], "research/historical-complex-ceiling-replay") + self.assertIn("historical", follow_up["scope"].lower()) + self.assertIn("cost law", follow_up["inspect"]) + self.assertTrue(card.pop("first_step_resolution")) + card["first_step"] = card.pop("catalog_first_step") + self.assertEqual(new, old) + self.assertEqual(self.cli(LEGACY, args, root).stdout, original.stdout) def test_sparse_historical_references_require_unchanged_head_entries(self): with tempfile.TemporaryDirectory() as directory: @@ -178,12 +242,12 @@ def git(*args): git("update-index", "--skip-worktree", *omitted) for name in omitted: (root / name).unlink() - result = legacy["select"](CATALOG, "0" * 32, task_id="coverage-law-change") + result = legacy["select"](FROZEN_CATALOG, "0" * 32, task_id="centre-path-sharing") self.assertEqual(current.resolve_current_first_steps(result, root), sorted(omitted)) # Ordinary deletion must not acquire the deliberate-sparse exemption. changed = omitted[-1] git("update-index", "--no-skip-worktree", changed) - result = legacy["select"](CATALOG, "0" * 32, task_id="coverage-law-change") + result = legacy["select"](FROZEN_CATALOG, "0" * 32, task_id="centre-path-sharing") original = copy.deepcopy(result) with self.assertRaises(ValueError): current.resolve_current_first_steps(result, root) @@ -208,9 +272,9 @@ def git(*args): git("-c", "user.name=Fixture", "-c", "user.email=fixture@example.invalid", "-c", "core.hooksPath=/dev/null", "commit", "-qm", "helper") git("update-index", "--skip-worktree", name); path.unlink() - result = legacy["select"](CATALOG, "0" * 32, task_id="portable-replay") + result = legacy["select"](FROZEN_CATALOG, "0" * 32, task_id="portable-replay") self.assertEqual(current.resolve_current_first_steps(result, root), [name]) git("update-index", "--no-skip-worktree", name) - result = legacy["select"](CATALOG, "0" * 32, task_id="portable-replay") + result = legacy["select"](FROZEN_CATALOG, "0" * 32, task_id="portable-replay") with self.assertRaisesRegex(ValueError, "missing current first-step script"): current.resolve_current_first_steps(result, root) From ccb92b752ab31df4220780a580cc14d9e86ffeca Mon Sep 17 00:00:00 2001 From: d3lerium Date: Tue, 27 Oct 2026 23:26:54 +1100 Subject: [PATCH 2/7] Pin official PR5864 export for C verification feasibility --- .../inputs/PR5864.tar | Bin 0 -> 1228800 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 research/c-verification-feasibility/inputs/PR5864.tar diff --git a/research/c-verification-feasibility/inputs/PR5864.tar b/research/c-verification-feasibility/inputs/PR5864.tar new file mode 100644 index 0000000000000000000000000000000000000000..bb9fc302168df0bf66cf43d08bce70544eeffc4e GIT binary patch literal 1228800 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

QICY(T*I5JH!KZL(VTnD*q<}ULz!pA{yjT9cZ-s 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

{LgE%yv(Ap7uh{Ik5P#S~uC`pC)kh9(k zkwQB3+$RX!QFk~WhRy_4;1uz~4j|Pg!4;gJ;|@laMPn%DFe0(~h!Y!AAWmT-_@kGK z=bhq7xoCc3N-~A5bEG-u?qDG;`3fUi<~omI`%k9NbnBA~SV7nZ)r&t6*=^&2OU2MwkGG6r#WWQ3E5nXkNKm4u@(xy9Hp z`jD6%!Fo`ab_~#VY!X_10m7T6D{cysP8`{S?ZaMoho<90(wbK}T|^LZOotazVu=7` zRcS<7Kb;CPp=(Eu-WZW2M}abJvQbCl40_2KjFG4z^&sAC!_|qdV>vQv1Qu>5=5=3R z+V)%Isf=74Ad?DlN{>MC$(05&nYa^~s04i&6VI`j=!%W& zavH7Gp1(!hlMt)fzCS5Dj)kO`U~kX!lm71Y=coi=GMDPq2cxiGxU>K0ugZh$~oNl3VX#41tJmYgr}-w83E{kw))~ z5G_cmvG9vF7J3tt6Gv;!e<(p@RN1EUS zdW4E^ooR-=C_*n#`*4Jr*pF;8y(A=&vs7A>5Xn7NBz-@e??G^*OdO@?bQ;n+a1hM^ zdH_8LY=Ky_cOGd}Pl0y9sU2cnMXXNPV$egjZF6N9Qk*%HKhq1sSh@dgLTm`~7nT)2 zHYMHNt+K%(TNursyjdcK;YmNd2)<`s^TE}}zt^dy{pxj@N^tq$Paza9_yP5*CY~yl z6afVT{EPyT8}?0$i94Bzycye&@Y^p~Lce(K1^JWnVene@Fh-xr7a=4}GC(Un zKY5lpgzx%A<__@@x~INqJco`@t-McIx3g%kT)-^K_7kj8c{nfBg_Z!UY4B5myVET~ zEMoavwrGljIJ<<%rr3Rz70z*WlWn^oVg0s$Z01|`Q-|sO<|12kbk(CE++b?AVTRl^v%o?ufRyqaF>ooyIPyDYDv85xaw(SR7Mp-kH@4xTy%J zHL*`SrUfSQ+^iL}AOm42Jwz;d7mn2YrY(HWf|ktBjHePpZ~9^9zQrA<5H_PvEXgPL zlQ&I`Y%xk2QO4UQfzy2zj+X&x%+k(Mh}O<>aMlh)o0;&M56fB#$g*aP>UH$INd;kj z!SJhFR5!ZC{^|9hJEHCYT`y2na1H;^TGT5?jj REzaywN@Tb&zb1eR;gR-HOfsw1P4`Du~`gX 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%0D<)<+DPoCJn0lRbd2Zc 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≧`@55uVn2y%Ngt2(xM%66(08NUTunOv@m6*y@gu3RVB47T@wLqR8Mv z;Q);=uGO2wv)B+lavg#-DXRee;AS?0OhkR^2M_y$?* zxk(AU>8xQOt;7zuE`%J8u@H#_X*(lV3R=e?nWS=r^i0w=DP)RR2tfqGST-?TV-n7+ zEMoveHEk|4G%wzbRUZ(PG&V$93TbO0xXTBYc@Rodi2=&RSX!uWfn@|a|C%b~C~JSa zdPNfd3yUmKHe}+J8~_5jaLZ&I*thm}Tq<>ePJYNX0$mv-P-Mip06RfiBM&cTvwb>o z!YSHxI5O&VpuS}_lGBlBf)3a~4mvVJk&RN@?=qDnvI*u2C>=7-BXus838CwqkgPr- zu!dpfPUIn6i9?@f)1{{~gK?at!pq9RIQUMWP$esoY2#!_!)EI+?63g2b$N{m8y3tF zq>5c)Q#s9J`bZRW86tv4kZw^SA|(<|Huj&p-NS%c<=ko6Iucu?FU_$+IV_cQxaH2d zvkgVi81LSg7Nxdf@g_;R+fRsOvSm3sM-d@(9#mMIt{$$z9;)-yrRcbgc>DI7J+CyY zA=cWBUGjbEdlR)2&qW+oTI$A@-mw@b(DJN-tI%9_yEh}3_iB@@!9@;Olj>q?@T4|D z;}6R+$@e)OE%gIMlTS&jhoy~@x!cvbHb&A(mQf`?WvV(;1BVKGEQ7=(k=-{&q5rGo zW;Hd8^M{qeXST7ZLrm2CJEFB_RD{Jze#trxbfHDOxc>$)8IKn&K%hH3vr9@vV38-2 z*(KqKqpE2!NtX2T~(}NFL!1V;B8}Lq*dW@Z7&xRYm5C-g-Indb z6Df=Z9wyX5v|!Y-CFTNfNhH1LMo8+H!FjPiMn)E31K16*J&cU30}X}2Ltj|7h$|rk zcwpvDv1q864rf>xIn+&B7}+u`4l8lfij}EEq%#I>!@@U=>m-OfRP3Z}Xfl~VbHxZT zP7`%kpyyKv^@ZUuXjLO{b_`!voP?Ch;Js<=kVqFb$gGPHstTk_h+T%rjqUnLlrFW} zSrzQ0)#xPWX`E(BEosNw$q`wIMsyQ2hw1#vDV8F5ldUL`0=QBx$t|N2iAa%dENiL_G zl)bTeCW_w8wUVY>7_}PBq}htWaMJO@dcHt)n|W+dG-lw3!)hM}cg9$dbRp4r-wta9 zb7A~mpj;YnqQa~kAnkB814h5U$8lyYOvu$Hnt~zVp)e7?rsY{MJnD~)iU@0zEe^m6 z^{wGD9Z8Jg?Uei*I!P)urHfZNKU?O7P&T9nM?t45qS8uLi~_3B!c;m8fi4Z7we%ho zn3|g=;+hmWtzjaArYXsxs(3>a(cgs@D-|lrvSuo*wNoLckG4DZtDxvmY6wZE$BDYV zu9k+hLXd*yFwH{G)Mz4w6+lFVzr@IpP8sfcMQT?~R~l##dQ3Yl6jN~m?OPkx@mds{ zMm*s^t4^Vkg($Udnz2Y!gn^(Uy)BlWy_gL+jI^cD79yb%LlRIh%vf&5o_?COW!Y09 zNM|t;)h)*z(EfC33z96C+G*y}I8u(MI}>CMVBsbc{CQ)6(rr6T4!b zTDj&w&FaqmN*Z5+FE?k#sS$YBiiX%?i{z zBDloeq$zK8;C7MJ1Z*qZN@YG$y+CTW!nv^Q5}l$=tzv!v(d=s@c7R%!7@rvdz{!Dt zPN3E>fPgcl;NL??S0^W)XpyOGL4ixLr0(VQ6yfn=o_7Bmw*jb=ZFZfJTK)b6i}O)3b+?}#DO$V8aYk5{o2jLNx;nD zG=(h-e~R`v6(Kcc69_a)w-NVPn>3nGmnWGdjSZb>w`IlBT10z5fN$Cdj`X&S5U2M{ zH(e|@wJGXJ<6YBOaL%~p{i5)+0Ss)i)kf3LsL@u-#wijm)L)AP&^eEgkX_G)%7E1E zGp$?4le4THLGQF$HoI{kH?ji0sBnZ$;;G+qk&bT*DA*f~oLjGOe&B=NmRI zd1tCm+{cxRRJa(>oG;^n-K%C?Zs3wGE$;Ir3?h{tMpqJ2nD{U_vL+o!u}D3r+qfiH z42w*XYBf6^0teEbaC~uvs1hQvv07Mf0sYA1URoa~JY$%1f*sRjByP2xQ)x~hZ&4;~ zcoJ5IiEbi2qQ0~y3dTr1s#CWSTPhc&Y|IQsB3PmJ%XPW}yM|Jk{yf&Z{-?c13Y6$fw z!h8Z;49ftb`?WXL@CfM5;si>fjpoF-Ew9(T2!r*l{&#o|UbC3&&bt@~p;~wS1d)%H zvfgT#QEu%k|J<@1tSC@r;nI>wGBL?&q_CvAppl!jOi4*37ZHl=soX_%gCvT=&JN0p zR@9--Ez>>KU;s7tMzD}#Rh5sEtW57@qt&0Ed-bL#Gk)i2{)h#1HHA<-JoIKUHi z7z_>jMo^|`9F#Cy*TvEZweAR8k+jz|S0oKRtt*m5wL%0lsOcyN3qi0F4AO#$(q|Fc zG}{=2t<*W_XUPq4=v+jp2isz3(g2MO^?;QjnHl-iG8vS<0~A+i!f@*J>_s_X9{2|p z9~K7@SCPK^uyrV`sJwwIk3i3fE9@F^j0K6O&PLC?AoeY5g8;;S%$i`6fxzNIDY>P`HP}TrK@PvR zfgt-;3UZ~Yg=RpFaPq_7k5r*wG4D4KU>KKl1wWanlw6V<2GgUr65Wl$Tq`M3ac&&9 z=YzQ-3&jMkE^LR1LV{8Wf$NNTH+LzK0zA1^5=k_7f}ZAXNXI8Jio>YEX#hbd32%WX zSm-S025By63nP9=XBUiO>5v@8o8(PtFD|hIciseKE_oqy=I{siw^lcE0CUpe+jZtx zE`&E7WSB8?NDjP%D*N!6lMNt>D_}a;nFGX>~W49tpWyOLUZVzvNm`?J2>WY9C0S73&}ZK@-%6`fh2LWK0LN1}SCBWWc+I^`{g( zhbAexHdXMJ)^V7RX<{%RCljX-n!0jpfSl<7densuW`Pp`P=;ZKZUn;fGa_j^GJu`5 zkVUTJ(1}Y-Lfav?u$U$&H6dyx0L@xO42B&x;-6SY71BT<1u1_A*z9`PMC#L4Qn=GN zY=BIOn@Vf#FfjoLQyRWjYF-P;1g52vC=BxH9*HE}%;eZO11HNRMwAChYp<{r8aQx4 zo%3>6oGb!QJufC#xn&}d9EjrZKm$aj@S_?)d_3?nsg-t}82lV&w3Fb|*oH$$vc;+i zz=#rc(b$xXle%Oiu8r-Hs>btVMb+o+nuv6jiHE^D(p$!^})mxS#DK_m1EOO=O+6%yd)|~po+{LcHSl>qJ z%V3!|7z2F^^msA}UCYDxHDQpp@T8wxNhz+6;T?r_PjJBrGYy0KF*JkIRg1JavHEz< z^?4d4O*k`nO;fQIn!eRb`Kp-6Sm}PT;j`Dx{ z49NK*Ne$lv5WL%1*ppIGu2GjOdzQEpSwNynW6#z&Y4j!k1Dh1BR7Ycb6>YyhiB zBaUL4PT@u1k~Xl80_Y`-<4tgf)5O@yAOvRAot67ZG%7(6`|b*qO&vk+WW#qBVgf19 z-X7jd$H`<`Mj#er8Wp(Y+6tUxk7WovSK|p0dsO9TLg4>(3kERcpLUN;eH{4Q;g9 z*t`DI)6&>UGY{ZEkt_=!m}Dwc&3v~7!=u zyB5H)VPCdzzV3JjwxF)u%rY?bd@s+a7HJ<{`F2MKsbGe^_>$pdgm6 zB)}Ymma+n}!l+v5tx2YjD~Q#tp&Xy{Ask!&o#hSu!myme7+sEzWrQ%3)3kwI*z)ve zAQwy-1klf_V_RC5K-H$<>V{%F3cW+sxRx>S!;El9O$ix(tGpq!TnTx)GdTS<&}Uoa z#IS^tIKVa{8U|er2_U`OwL@CdEue<=zdi!NED)JGID}GT;}c23+Y5)ndgs*eT*?Iu z+Nr83G5`AmU-2G}YLKg_4Cd9GBJz7SDMaqR+M*Rwq13EYs#Qfj(B6)K2Z)T2GPVp(!(SuR zpnG6;Tc#SEfsQ;2A){^Y=R$IPF9By5Y)udc??P4)mW<}7v_O;kB3IUy`|5NVta7#$ z>II%he^eBnLS&IgmX!&(M0<119+!Kmw8yat^uJxgs&c7|{=k2F06NL2^s4CsPV@28 zU;pXufK#t?Iu!Wt4{(}$aGH<*_qXu0PvL2AAz((8g=$inrdzMNw{CZE>D?%0#G3e^ zt6r$kR1tynfW*kR!xspeDo<#3hSiZnEokotW2%f}FAo50Vn|z~al1V#1)?sQmTKYH zE3lQ4i3&lil-Y368<#6qAXzO+0d1#IAWn}NTI~Q6E2z`Mri!G%R-glu^ywXWKD%7pPqoz|)gGWtuee#bQ7Sl-+NJ}@K{OgRS-!*v95FRHzQ6rRIgE#6z zrv?w6@>EZU1N6gK6Y`w$@j7J!ojSXoGXI<^pX&{tPM!%g#rMDUF|+3G?&*9zfYk|WXsmAD=8k?s(qW5_b7jM>ij^} zUw3r8qifY)9XfSuQ}tJuRxR7N3B9x8U3uPMu0Jg=KiBWcO3Ul*k;ViNGsctb@x}QA z(J6jkO1#GpKskoHXuQb@9ts@%$uS;^y`){TFTq0>PI}QM`I2KjDJfnIIC?ynzcVr~ zBi}DuOq-+RcoykwN@SrwqgU_zJmr1fKuU6YAi?KJ@C9O%{oWX_C(i3h^3xF{&PRWS>E0QW;Prxw@`AgFJg@k?-~AW<$@S;?J-OcAQ90B!HOvlX z1s`xDQJtY*; zvA>ImKIJ#o;K72td`~W~ufZe#fBLD&mdHGBZ-162t)D+PFC&-@x5tR+iA?w8`P00? ztgH-?WsyFAg5MkKPx43ycy0ovMk)}WkRIb9T$-NXrS(l*tS=DnagI)8AS2T`I3dwn zA;J*N`MqT@uRk|GBaq?saJ-`O{F#1lzTYQISCE))(~VMO7X(mXn>|FyE8cry=Y2WCnYk>WT?u#s|`Uz68HqbnBrKD&Fr8 z(4R0SKAi>@OrB19Uca}BUR5jhdwhvrpEt!9?Fl6M5|aJN9`La7@jj$ivNy>alK|0t zvFVgTWI0LzO; zu*dovpZ=UwZliFL7t<(&&J(feF+Q62CntDgQhekT0$yK|H!;@hOAk~TItsTXg4<3= zOb>WHDc-~Y&F>SbH}sLe@Ot9?zVw**KysXy4ue$e`p{flPVSA3W=~S$)BT=UIM`9Q zCrA4*nVylIQ;?tMMs?>`Rl5<)&FJOOyn?qmJyoLNWVfJlJf5zQ1gE?!4h_mRas>ZG z{;%1c3d1c@Wm66!9R%V7QZJgEPQIU@Oq@R^CcruKQ+VW;&i>KS=?0sg)b`bY9qdQ( zo;F?XZQr#f;z(WM$+Cg5#8a4(y49$pIA2N4->ci{trYFYv6VuaEJOO`tO0*|B$rF|CPs4owD^b{#Uo?KXDqX*~5R^ne5o9>m98WC+NSc z7|q$JCo$be9XdzJ$63OL;3jGcX43sW&R={2Rz`xC>hg32aH^if0ESykl9#HtBv4@h zC4KQR-eiwIIU2h&#vAYkXjcqeD;5*Z6C0of1Wr~mtr5JWVUvCT4wYEGi{=t53I4zG z5SGu@dj9^a8}lDLe=03bPAFp!=jPz|=4LhY=jH};qdeK3%%Z%Eyhb@imDWmRB?naJ zf~XoW8Ve9kr(iKIkmRE+S-?Z;L~L;ipa?kxVxxWWlvElT@Z@Hp9yM=Dia#dWCpd`s zBwv6=6zQH=+!0?O4re7gAUA9!r}(R4TFOyNBvRpz_i#4jV*;EqZXWgr5@Qq6(U;zY zxIjX>H!gtXnnaw$o5(R{%EUF&)BOQ&96$MY9JQR>j9_jpP<~Vq;krP;Ls55PlFvtt zFZX(+6GX-zuH+}>fXR(?*pr-4;v(4h9I?bip9fdZ=OJ+Fi^WW(!EOQou&0rs!_gV0u)E36b`|69(MDzX2SFZW;FivQfPQb{54^wj@ENLcs2 z!p=a;=h3L|1bV~Iy67oXC<8Tuj0QFp-jt=G)`my z1Id%wFe5wPpBwOa{S7nySy|_oi!$?8p6rNVwm+gE+e`E~*YAs{Ttq}hR!*jbp!sP;x<4Yc$czE} zrZ6MFcZ9#c$D1D!atb0m*}e!RXdRKBk?qUK?v>Y~TmeK%9wDDk(sF{lK}`!r>fzst zBiAtC$;!wqYRH561$m9Kd{wGMd68RmykfMdUPMY0Y@f3P>w`j02q2_`FVa2vq!4@!y}9|yQ;uzr8WNz9 zS^oUqL7zsJwhmK4?+8ysRz_YP#EVFm)S)N0D8gZ|hzuX0a`FUhNqSL4es6z7MXn%1 zxXoYKsETMU3z!c>g|<W;ttz?T(JE@95aBOIoLn?Ul4{Ms}V&Di7Y{&kJVu3sKWs zkekaI&24SK2k@}aTrvfj{{B(HT+W+t#%*_Wjq>=t#1hJn$Oy2| zjJycWptldyh~U5TSbrX~a<;JClq}~U*~Hw8EZ!-TybnI~J0h~;42nSV%hw?>*tft_ zaRz%Ah#t(jr(IMYMFbkDoToL!^3pR~&1YoF@?= zKG|X+MuaCIyO_apvd9r~hBz5AelR;fSL85j3LSaBuTexB=9r$Dk=L7X9FYMlIE0FT zej?1BeTB5;T*UYx{;2p}L(V3%Wo3Mkk?Cs^;R`z3k?YSb$d1VL$$;t6lz7&E73;n*den^mz#NfRZXFsx|hcHHAM1IiO(sEfC5~gsK zXhOSSG(;iriX4)_&OFlcNdomENvyuFZMhJ4DzrjPj0yx_rRI|{+Bnve z%4{J?Q6UY5BS?f7plUds)tP4w*XC)H6wy>5goyMMpy6^GI+OuwRIz;`ejTZ+02kuD zG=z%|#K(FPJ?UQ3HiBUwmmMGho8conOc*v{A zC#5rPAUT=Lvj8LT-BWyV(Y`=Tx}VA?Lep_E>0pgwV!b5g$?v6meA14vT&b4JYUY7{?|FJSk0mhs}>m2iy`R~88V2{ zD&=v7^(P(;mRcp@{9eaPE;ohvIKtx-PYT1d6-Y?Ol&Y|4L=fk5^7Ar$7+V-2*%6)Z z0p}D#m6Xq?TstElKNwd z;(KuppiPJ^bA#AHnD64Ti3QOav|@$ni8+fGpON1HB6~A&0{OmzV*E$G*w(C0I68m_ zkr@#z%x3D&YRk1tWXL#7!#cs25dD&rAOaAlKA4l1Ti~E}@d1N5*IB6KjbVhY&pY>K0PD>ui{NRg@-?|e_EPHpk!ouQQc zdy{ha1dUff@d1?Fb-(GC&%yTypX8mXL)|%I8Lg}BXo$xNDpzbC*NUWatL@8 z&R*o@S453qvBKU(X@D5u=LR_*&f}cUAghAALWc};i#sl^ch!o^ zCnCNZ&~FZqLkF)!p9*r6w>r>2JeTw$;U8y*a0$hFa3~p)LgKp?5rVO$NDe1TG3EqnHV~H%XSFEvs zUC-~$?v_8VEL4lsgvjgnuvE?xTq-eA%%t);vcnF!ASa=R5DlPtIWYxC9}yDK>}-WI zth~ygX=u=L0*YpFSX|88yWxufj^ zrHk^ceI@PGNA{{%CLJpEVspDH^S)6!QIGDbp?Ws%=;jmj_W#P4?^ zq~eo0YSoDsM}~rv{IUn{;4Ln!7W#R0u;i0`G8Bod21i-5=e3miNj@5miwL>THF~@% z{~MwonpOh))fg(M{eG2nb!a;?j<=9C@)rR*`ZGIFu$pAEs z^Jbd&R73(IE2B`6t;&snh@_MhqJ5bKSy%|=X(Ov8TJB?1cm_>0D_N2xVHPPr!5pnL zn#1kV@(B0;>9SK27d1bWHGhp&{>!y`@o`4|7yY7Q{!jkboYFOaqTbMRoQKY=y<>Ez z30cjCuh=^1>3fFl{;20uqlbLm{nOu_8}sm=Z+riStGeE^Y}h9kU+~-Bu5(idrX2F^ z9_v5RsB2Q;J-a{1J5)4vXL85A^ZFg%+T!r~-GfhzIsWU)A$#tdbK<=@WrahIwwP0v z`qj?0Crau~-Vz*gX8O@1Kh~R9YsS&NFaK8S*ip}*6D^1DZgKVIqa7L#NxraA?(sLa z)|yaj<-RBO)!%gVyp%b&ji~p@ZdHr=KNz! z+P7(A7p!3Fb+B7I~Ywg1ac5Z!eN$CG3+k1^j(`1R1wXQ%vfV$t%BlQt%e_+7oP z_I**7HuSTy(m}uf{*|U*>>1VWueCPM*f;8$GY0)->Bu%oebx*P#GJomdf%;c>up{* zytL_=gKip;Jb2$ZzrNY@m){m&ckA&dyjP!?Gw!?_mbVz!<+&Ag#@w7X`27~Ujtpsd zc+TM8&Te;Z@5AlhY;$b&$GLkh8}dopn-0xgIc99*A-OHyPHX$yfw^P8tM$aEe`}qR z^6B2qZ*&<^Z|QjnD+`~vHf6>KD}$G}8*|0z=hHHO_~M^42Y>g%mv`UM;Mc$I0E1qxghlPEfeCN60Qx32EG-1M!S*=$j?7ioiNtd_UzUG^| zexBHRiTA>0`B}%4ruI00($Ti5^~cX&)9bu zs0kC=6+Sibc;+pA>TM6cSQPj3_C4Kuv|h3CreK5TSIp^I>yfMb@Xdr5Z+LS2<|V;D zda_z}C}_5CL;D3uV|scg^m<`xQf*(>hqJFa{Et3&e05~y_RG@iW=)wg<*)vRKa6^( z@33ZH9;v@_`-t%)A5C15Heq-hNfd_?OalN50*t<=*a>blC2> zzy6qgYaZF&q4QODJ)1CjthZCo;{&p0Cv878YTM)unX~qMwR_<1IVTPUqjv6{c3)19 z`NQ{>rVV*3>b1ewUUOH=HQP(mqIVwI^}?nTWshxJ{LJy+4(&a%xn8ZqSeX?2RFYt z@}3c6&R(CCSJtQNyvO&{k57DN%o~r+?O&_$kYSHD-G5fCb8js@`0R+<%>vs;#k_sA z>Cex$>^AtqKX2Oi;>|5;t=Tx}&Hl$$t*Eng=L>}UGshS zUoR_(I+&20pSt7azCRx=IDbK_?YWE2Y1QL{vUa^wr=OEBe893}zjT^+@Rc4dW=xI! z%Zw&{B0jkG#=}jot?zxdEU#I_fv?JLn>u^mBSk-pd zk=heSCN6AIYwdzrTl&vVKQv;?u8UvTKkB+||Ga(3uIoo!IBEaIUq;k9H1x_%vwO9> zVA9?{-Tuq4eKGfJFYdnotfd9tK7PfbIzuDR|M{*@UmkMROgWqi}`$^+Nte^@W8 z?sEgqT73JgtJ}8yW%Lsf_e{t-cI78SZuoq{z~`Rr5%uh_ueTihecQy?3A_EfBGURL zuDI3LGjeY1gq=Iu%|5#Oli?Gmr3~)V;JIN514dj|r%z_^jqF`Rwr}0s@8g`}=Iyp` znf&dsuIK-LR@1ioRvkNdMuSJjz3IKDxao_BIu#~t`pbxO_g*$Mbyw}D4mBDa@$=G= z7yl{0WbxT&zwt$@HO(Ju^!4%|j(ILv_vf*nb_Iu~0Ss#2Ey?RL0AJ(?{b5Wg#^z68) zcCGfM&ATO}o|xV7=h?@LQ?m;myEt{^x>r`u7~f#}Yd?3mc-~|G>~?LiYkcI?3qKu| zo3QT>rOj`Ay+_`L#AjMApIzr~L#L0Oc6Z^VEu+WYb$;(TSr0cpbMVAu+rO~1bkDn2EgUp|RO64fH`#D$=Bu@y*;%+FV#7@jb(pwpe`@NsCEfNF zW`46};*6}@%2toN`I$d;%9%E%`0aJwo=kdq)rFteE^6Pu>4q1#Wj6nx#H)5U@4NHp zhD&cLE_-m(*il20E*a~ces}t@GfM7!ar6ZfM(p~2^_nFQ4c@t9|Hr@UbU}8DlBDBV z8NWK4U1MU(6k&o#Sa++9D-E^g3a+SUn6*FK;09(T`|et-5=b#^xY=ZWEkz2+Wy zVA%H3m2FD4xv~UyWL|;Grjc8=G|-w>>|p-&u!0y?>g2{eUB1o!R4ovL&;g zIWcbN$em06=Zcq0uii6Z_w8#7IxO1K^+RQC+tvB5(ErsZO@4Z5^s}QzbRU@Y`)Tj49kl-p&-5cdpLNDH?;rT|{@q_~ zTl{5lVfushhOgaq)|Mm19lBA!S9s%BQ(La;b8V9?k-_ukm+s%S?XCe+vsS(_cx~f> zYo;~qyY{Sg2Y)whMOnZ1Ywh@E>dbvxhYVSk)pB<6jse&AxM=Ow(-POrY#IHxqSZ&s zI?hWid^BnF=v{FKSG+cA?#uV~`S^j!kNzs8NO-@;10&W>I#_narNK43+dtE7!_J$_ z0{crRAD=ky&eg>WNBt%3VC^3F9=vk*iwRp+-CVZiu1(WV)IIp&`}GDcTVLf)C z`OWAnx7TWM$;Rg%DXSH{Y;s}UtlF0s6gFDb^Q&<^&PhEqaQmtu>wiCc+l;v9vPNw_ zHtd;$Q~T!qw*HLFsGG;lE_q>4&xwJeL5~+le0Jd58!u_vdB?*uHvH_rXzirU6Q(tJ z$~=-cnh57#c9*Z5CY zwrRWJ$&|#Y1D2hU|NP#m$=jX|46MDj)`*!&Th7`vZb5L~s>6$WZkn=w#q>vf!C<2$ zYexl!q4SSC@|TiV|1^J3gLqQ{s>VldtX8_xiRQvakwG_WbeT8;{ z>M%0vgPo(=e>U)`EycCJ$zJru7e$;Kq{!JgPIBW9Zw{ARsWa6Xa)*b(9dA%9W)UJE+U4Qw$BzsMZjXRdC zeYpAdl3R|JT>ko`Mk_jfHFoGPBfAuToUyCljZ>Ot&MG?4XV%x_U$}K;QJvuU3p?cf zHR-D2vYXcQ$sV?}WJ1B^J$qc%_2*tGrEkBqs?pg^+7xb19QFBt#dY?2_nh+1=j^%<9vIsHP~#szTsU`Uqw|B0Ec<*(u<5Mg8M9x^t-Yti z!kq=(Zy$R9?B_mzb^F09hE2F;@4K7&?`hVld#k}ee^ik6#gxf)QiH{DzxR&m+NAl2 zUw^uF|J$u+7C$t#^D9YzZGOx2-K!5@nzOyt&~2Z!7!=?9%;rV=$7f#CpvU0J8`>6+ zeCmbEn~d1?r!T%s-8r?hH*->pscBPI*V^1^_>c}C9`KG{6t%n7cm11Rb?BC|^@ZQe zeDCpD*R6W(qmLV0J}~dm&i%^14vxvcwA0z&z1Mix>S25DUa+_JV}ouD9GrRA)%QR9 zPRRu`zt}i5&}5FkL-WC#TX%hF{>yyQe z{!})9xqs;Uhk9J_%!rOhfB4W}clm~yiwEajl+|nV`px~{`*Pz&&s?-H@zGCajqT~r zpS5W4Z|&#)k~3)eWZ&-Bz3Z=>u%po*n>V_z)93xl;xCx^*r)&Of9{&p4b$FOxBje^ zB@I6FJ-W31kQ4h?#?IR}tZ@FGeIr|3IeXOkpVujv{rRR#26o-N=gu3}_E@?6vzBG+ zN6fw}D>Zv-!Q8yk8*gcT)&9j-jPrjr>iXmBlhzL|9*}Zk`;y_MyUrW(`_I3*=I3pL zw+w4sxb@*)KOUVqXHBo7hOg|rvEF+B@KqP~D>-rZj6P3p?)hM1)EkYm#}*D8lT`Zg zs6QUqUbyD34GPcNyZ8C^gN{AkY|Vp{>ZGi=b=rulr_IkQJZDY!gB#BsSo(B)>FmD0 zjQIQVZxag+>|EBU&-?-72QC^m@E=)o0xwA|UueW@>ZQ(^vy*~Nw1t0zGg{-0@ zdnZgCnR~;K+28fgYy8!iT5U$%^~hb{j~h7dq9tpeUO)4eTc;OyOIum{y{&&p+L~1Tc@|kZFpAMvCZ#J zSo*hx*Jkv){gbFRNBcinH2K>Wn~uMJV&gU6X8)t#$Nf@HT>j4H;4haYt=T=PR*PW4 z+B=8cbKR{6$NiX^^vGMyetvvf^v1!Rj!kSovswQadl!xEaZR)Aky-bTo}aaHVym9n zwF@6?IV-#VWmgQ{@j}C$&)!%(Zg#V+rQOc#So?$0W>fAzqwu8*J3Tq^-Y(~tys=sXOh!-781+^LN>s)1=>mvksR{D;b~HmG$cBkNS3} zcjvD3=^M8HaCg!fC&oAZ^0otcIY*CPnpwK(g)vuEGD;_{0kYCV%*(q=`Yojqpz{xGQR zphNMivmWku?D^SCri{LI&)({cYe_8-mJd4|N$*f8j^p zKRha_mG`;E|14g4a7(l0jh;BLtJ(6M!?zt-cI7*dJs7<5h8g!o&nSLtf1k(h>**hG z=k@Ou4($5L=&NV;i8?$nCOvgr;h39$mv_$l(>gu7@#Bj!_Wimh%e!v&*3=a}S|mR_ z==ynUAHD3Mg-z}e(k6*gA<)I4}ub;Q??3=$Y`0>__c|%V0ElfS$ z{_x~S@0+`ngl=lrez? zYwOIp=i+%YOIi(jb#RM!E-Co^#A^!AF4=hg@C~UsS3k9?r0d$Pi{B`l|5}gRw-=oM zbIH-q|M=~yJ>#FL_tBY|x14!a?>et9+&J@v8)v<;>xSQdaoeh2jvu}Fr}@{9zH!Zl z^*^;(7&Y*lf`r;BO>3>#IB;9j+TLzYwSV>41p{B{`tcag(s8SH@46zp`?uroIQz|g ziRU!E=H;xLQXl+c*wX#K?K|L|Hz{|`dn2zNy1nPIV-3Im<;a4U9^U`M9dDGBjJT>v z%lA69p3tYsYb_eyF#d_#_pe>n;H|P}3*+9ndPI-R$fd{jzMK2P3p2-D{_)$FrvBMi zZ${C5XRccI;6Ki8cJ=Prh509Lm{>C6lB_XJ2EO|3l(gyBtnIt@+#NHX*;q7o`kZYU zNjEP3<*|BwJGUNl->X}0J-VaW>r=M(`{U^AUdzfY$-Ztw$0jAi`nQ;oefHs_%Reit zm3N?IW%5t=*V?}R?MaIl=C8XfcG*M0xxab;JZ)@Y$rX{Ky!$@B|Kl45Cbk&Uam!Dy zuGzWa`PA#WPk8>kq1PSCp0Tlhom%y7z2>ERj}#qTd+_}`HhtD1viXvhYqM^-<@t68 ze<+?mYU4d)YIhnl?*6>L{k&r7!t|w2y;v~0;QAFiZ%S*|eAkw#2M?b+@Z;Tmub**X z#OmynADS+TZ`$d%<4;ZA(CFe_jV?P8b8&WQql2D~>yFnQ{$AtY9n-hY{qD#7&x;5C z_FlJj%}4BwACW!h;qMl7OaIdYS+zQ@*tjcW`@znoQ#Ky+J+*7WMT0uF`(W$QmxHMn zH(UMWVBbxzZf*U_oMwyvUQ+MVMX8OK^}T=2oF{%M>@@DWsYgZ*Z1>jZTbFlecI>(d zF>5ZJc3r=s`*t1ta{8$Kh2Arp?7Hcr=+CpfzpQ^~YSzau6x=Z7@R7B_8RI{m{mc61 z%TtD}`sC|B> z?>|`kmy&mn)+_mZR-N5#ydw)%^xiZhwa*{gy*}n|W4F~=UUvJRA2|E<>sK_Nx?=Fh z(+4!nE9thO{>GwZyM7DY{Y9NQ>o4uR?!60FJXV}=YxL?{<`0X&Lf>yT#OD9`Qz_EC z*TMGG!t+qOn!EgQzc;+QCcC>H%qfQLSz4-eBIO;u*x%&wD)8%L4G-5x5$x0J3L~{4 zxzEofoNg@WZ@Ou6^sH#_>fR?$QdexBY)>p~11kQt(-CV4E$f?Rn@NjD%NHX4ymR>= zuyXYMLeFK{+Y2W*wnRVhPD(W&${zZrWD8_dvI-tq&8II)<(wTG=>EMqU~}Q)@S=%k z!NI!zcW;|#bGxm)55%4Iw{0|xU0&%s)OG03kL`%qeem=jqaR)jw6FVquUlW2zhd)p z{Rn8_%*4=@{>0wjQ{~~E#@9V(1U`jog*<2rop5~eDgA6F@Gy#VebRn&p?cc*TeGjp zZjFM~;h%p#egmVzWrPX*)(?BP8#+8{%5Z8gU6qXV@uK(F30Y>xYzsL55s`Yi(^0hL*^fJ z&TUu0gZdetav?Lu)>V}s<_2G8&Rf+uNhE?>DX-+up7+dn6Gv{(i&r=aA$luQT%-i~SPIImhmWUy4o1 z-(2Cb`13EJ1te^4eR{6pX!iK&TBP8^@S62G+0(;@U%DIfIOE+KU%FGKGa~Xf=#MG+ zOSP*%uPdFnsGU45&)aJ_(_^%C^`_G22rB|70f04(Ubi?^_I@irzrN3Mo>_n&NSZnTEdgC6*WZSK$7T$Cy}e9FSqZ2i*o(yL?k zZXd#u-ZaCFy=M$vZ8R>O0DV5JTUjUj7_I51TJYp#ZU6qvV^7zm&NV-2>>t|7O{&@j z`!P4W`BOv5zufG>Geh6yxf4|v9j31tpD~&>)Ed~{zFX6?$-Qd#F>QH6vAgQeogX=F zk;@_nY);k)?#RO_6_}Qum4QOuhB1|JnXZ3(#}rK z&g~j~dEO{xCF5&;fuT}ie#-uVL1pj0E^p1@Ef>Cl54pQ8ymU)=^E*ptcuuvU;Hi2` zcu^d98MAC8SdBCx#)N8>Zi1>1ZTuz2=Fle`^!UJ=oh<0Gf$Ns5;( z#)G4p{J~K<_T)6lqywIlsc(-NM`Ar3jB4B;ImL?ixYIy~hvc}}vsfmc$~Z@sZMz@0 zXmBtZsUU^0XJK#JF!X(uArtU|# zo}2yo5%E*Q5g&diTc=-GE>ru%$+phZ1DanDpCrf$`&SG&u>D8$=;2{*(;nb!V$YCT zVn3TRGI_yy$TxN(>`cpt-;W%s(yARQ9Fa5(6etzHVOX1>pKc}e{0g&D7XZOGA|mN(j!&E1G5yB&6$9WV(Os}ff{W0+U2ft6Wr%369- zf;s9i@qDrSI!E*HaWT2yd(0jqyE#j$*Y@eeJj3om^pQ;N&rBMY#+EuJXibVg(*`H^ zj^Z%F(uJmJxss8o-xr&Rl3;Dvm2cB=vQVw>=PbWl0)rT^+%#`qqthjz4NBg_^fjJP z&C~2LU@b{xAxn@L&XJpP9i5hft@t1N>US4&T~&hzxe!N^WGnj~BTjfSv{4_)uvlT- z-sf@9@aSaJ14(^e3!ev+;H#MM^43(9XiX~7q8a(34D_|up0lconpE*fv*2G&J3e8l z3`0z;??c@hN7W(UR>`KCKElgk@ys7W@-~8PYSeF&;a#4=w_sR=X0$HK!is6c2|q(M zTe^yzIdPD)=+%aYs_h$o7kHrNi@?Ot4GRe$K1eVC4sO+78wk$7iJ7 z8Wt`@V;^O(f5$)TzpHjNIrd@Hi=N%;Ay+P^oD>Vou7$S<`sxiVj55c@{T{#-vJ-2?fKWyWADhi*oP_*@fo z$1|`X3m(lRQH$`Y?D^CB6E*i+pPW(y$-eK-Stuan6OJ7J66-`=@~3pN;)`~@9m;)( z13tXc!F-S5JK~=&^ajwH`-y=LeHBHnNk=C8J-*aD?oX))d%_r~{F>Wk*Ia>{^rbx)9UK z6duB!J(`f0@MQf@KVbX8{4--4K_M4+<97X6E~#7Lc&14{yVEZjJ^m8%UF-O`Af)7` zXwM;FCt`xSO_OD32fTSUm#&wucI^XQd!XC8eL{;oG?|uh1%{L3r{|v4%bGKNq%N%X zY|$-vDqSiN=FQty?(+b;UVRjQdtj>lRNWKwRFTx}K8M_0MRPq#{4mcRm3L7`8lQrR z)*dB?lP@DpJ!y|jQ%C#PX-V}}rn@B%JqqJ!*$HbbWgJ$p-1u(o zm-dexcNi+MF&!{6-P!*ApXtR;8E!{W?r%k{ciF+KgARTLv7YuAo{=UMJt+&nrW;XD z7po44X4Z-Zy^x&GPwjj6hrq=787~aEO;HeWMoI5yjctBs5X{u z)U$KqpDAGy7Z>u3KDtSt*Vqm$;(8eU(e&;EjX3m<9el2Y&S{$K)vY97uiR z$KU8TU43jS=vXJeCd;t@T~>LlTxDDsS>6PPmPH+XqAr&^{aNr}oF5{m?MgwQ1xGqW5~&LWBaEf@^lZQ01Fp`;GA##sf|oT{*OX1iNoLcU z&Bx#0G<30t>3et=cPXowC-F^uSiBZ8E-_JRpBg&fcA(u2IZv;@9_ZsFTorp@?R<>9 zvKl#Fhynx%k9_{Nx8`^qnQ{4ckgv7&>9!E%LB6&Y#ma))zn?3|u09vwns5`YAPSX= zD3~g8i{F4;vx?h&pA%ajbGAkUW_I*~N7I~koEZTp8kC4=vPgVrk!X78X5ZQH`2#{= zZQXBmQF>~ze@+d=(;s=RH07+WnU`{YILL>SQ)LROTeA*bS`(ufA;Dpn+b+1bK@2s} z1Hvh5HHR!RUnYZ_MqwZ3yIBME;HGDUqwTW2mL`{?%S6jr`gEJ?A=2Zh>n0Zb1ku$@ zpG^KiIk!87mLbs%?b+?^Uj!mX#MM=z&0_5$@9jFsxO%(kYD^sN7VE9fBsnFe?Xj2- zBu0;`T~fnxSW0F@O7?HKO%lc1I~39!K6UHdo+&UsPL5PjPY-#afC5pE94rJageZPD> zAb8t_?+K{%`wZ32D^5+ zAOeY=W{o!8TmwH~W`S<8^p{FF*FR3fPCr1jE~FU<)7rd?Q`>Wc;tEoz8`tdRtyOo$ zX;@nD>!-L(&LFsof)9=xDw(&@A5nB6yUowU86UoEzgarM4p!o|JBAo^DdzO5BWP;$ z$qux|HL1p!x4oZ23Fe=K%_HL=B2dx7wPF!R!38GwGW(jia-iTgGqKb$Yt(&%%QZ5x zVkwflHv1pG)$xq`W5crw{S*;K3LYd!pS(u)ZGEb9T)qpI^5Qn27~h+Zv->o6Mz3GTfw5T*`s4k4;^?tR8zs@% zbDmR+*ZsMkPh3oDct8%nV|CrzWjI8u2-Tja;2QZ$$0A8YzbwM*Qwc*9&wYPnagXZK z?MHg=(;5XazxZ1pPyWTl zJ48MA$eSIIf8-70OEZuCfP~>jWzod@p@Z#zI&Z(&N8++ubul?#1uhFy&wb!svS@Py zy_&ESekGt~htM+D(X!Vi7kGvzHAd<~+#C}c7fun_uH_Rl=LJH3R)VYE*8|)6qtlKF zrJ401ZAZD#^OB2RN4X@~dJGf)B{6sPezU!WS^DF3rFK_LEFq4PFtcg_t#+J?*w|2F@P}QsrW;b=7 z)k##`O5r}ElPI;7QZd{0UonVgKSq`=4bQ?`BJrj8M+mtVG54 zxce_Yc|VbvIb>XY1Dbl#azkPQHPhV*a(Wl?6R59!+lY~XgcDJ^kba&S=tQOUby{M5R1kT+*DW}@nh0v^pT)W4ybY!Hw zn*A9Wx#%V<4x9P;wAfPMZQDVygJ)Knq~=c;y?^u6Jw(}rugJqZ*Xxk!sqqd!AdGc< zRk`&iPUiDMJT~-YL79-(-R02R2OjY;o-VrO+jxdNR$ZrD6UAALiEX`-AMbA^G%ZY5 zh`+zgry5HMp(U*qLK`HdGx7W8rS_SQUK(#P`gm;L8)^qBq>NIInAqL@czZV^BC+Ye zAkf;v^HGW`C<%2jN#x`Jy49t`z%PAL+Cd=ZVv+6A$=f61?@QD>WKZ@ecU*VfiH=D! z8SUSXDTj|!l`jL) zGQ!{=-Ov{`xH&XC{%#K~$SwB7RBxl8U zZzZ-5xVdVLTV4~1`1Qtpt=*#O@!eOP-`{?E@oSLzKKPb~s1%8|hlOQNruiUBPul$Y z<`K4DYQ=TiD#7&9@lG!gPof{16|pb(WU`Sa{nEI3*tj`Z`z34Q;tQG8DuahPmoBr< zwe}i+oDRlmfyr!?T=VMbV3$`e``bL%8dKyR$;y;NS1m71$$gXf%?gV_wSSlR4GW8@ zkNKgfP}(G-Y^n$szX81lC#*~vytr{Tx3AA*M76W5Q7zb&;v{tV=#Q4)-Vs|>TOH}c z0Y_CfU*9S|CmdGpLEh^7)9-$%x_gbtx8#SlV0?SkmRcCD9@A9cv^6}Xw{N)ZWURoF z--ImRq3Rb8FRE3xo`YpbT~tKd8L-5;Pu>n^3o_@SmUcrcdshS-a+6AH80WA2`_< zVe8lJ7`#BJZ0U>KS0T3TbR>t@wf|?3+DqU|X!TTe{49;>i!gflJTYdi{!X}JX=TnM zQ>noRV$(&IzXx`mxvw(ME);0!R_zSH*1N(`yAw?kHbb7Ze=c7AVs`A# z#I5miw*!83nf}0Sr%bnN?|^Uo^VWoH!sqMs&v{>OH6OQkO;}DY-M3-#y=FFOD+KUb z!V9g^w`!WUbemV{-Sf9LzM3yD@CaZ>#`#M_uNa87SPHaQX1%dm4P0FBbxw;tK5?C{ zc<|A~eLW_tIS{R$7Ov*4;b9fCB>ENLyVbvK`I40pd?RO{=3L{x*1LLU%RO(-6X4c~+Ru*>QSVR_Amig8Zy`16l`MlphGhP>z-;CcLd2+8DBy%b4 zp81mVBz@$4PRGIvo7sR~hbpPV_rub%{+v|uXpDLP?9~N{D={A0>30wBy1_j*p2s|w z4p|+%-JT9!Z6L-U7QAuU;Xz{q_Tlo!_v+tYy`A2C@Fh$n_5sLwjKA+Lyzp*kApyGSRJ3xD7|FtJnsVjF9UTYx5J66$*$U%{o zgkF{Yq#|J!8Y3L}(P9qP0}{!;dDLu2^9bs?oU>qol?tR{&tBCf%W@`ECW4+9+;OL~ zs$a5LgDM_x_QFIWmSVY;IiT|#wX5Pq;HHW`{lvgD{xL^E_e_Ok_ft80k#)|9s}K%U zxeF%BX-X&hGMrg7JFePl2NSp?oCVvFCPjO`=7o7wQv)8@TyoUkqmZhhoyVdm}BES zcOLQWv>fOy^o|MNWPbGFKT)9Alf(^r2OA${2P?I|TuHnyi6;TiqG8Yrtr&1(TQ&SIhfkulLrlIIeWQiOb^kM|<1EyTY6qC&0MOaVstFNB zcOB;HVCTS;b8-~xB`hr)9IY}LT#v&i(pZa4@gYZw?>n$wI%4mbB-nx9t_zj%$kR?K zP)?MCfI*b#TH|jEP|w;00!CFXyAAzO%`L0Sy?#Y5=i_shC(f##Ci!wdRisf zTO;hWl*t{%7||QGo^g;LgC8EhX27(sGBb%=jrY`GHF}O^Onf4;BjT$M5sgDkHXxb; z3?C)_;*UXlZ&Ttb@6EO{@ZqL|kM5^!KJ_InnceXu813ku<>l}Y{8Yq=6C?=+K5#w+ zvNRv62&nQ9T9G1IG4s?@e3Mnh`7{KU%0<|)DilUc1kKA2!i%x%7{SBvSU+A=jwH%a za`I22_-BjE20o8Bf+o*qy_3|t2+ukPq;`v#oi&M^YVzfBE)+9=x4ELhfBJfG!V8AO zYg=hs46EQ=o2^kbT*MQ>bLV)%4ULjy5?sH>i=iAQ>Y$0bHtIHMq-hwb*R-kkyH=9 zRL~HQ%XeqwN2cVR!FtS=^Bt(+Ena$2`QJzb;7;60{|BMQw_wJ%fakxLfA745ezrpF z(R|#uYv{j0h7egPLyoKjQZj_9eft=0VV97Pf2Co(MX=s#@i@FR4UclPV#-Ilh3zcw zU969|lE#npxdbvFzJxR%rUI`(p%u`j?{mbJH;1B#hnU16uG#uh-WPthaGrxg zh4C&z?06U874D|c+JpJ zoMdQdgRphJIUU-u-F1pL(}WM0?;FU|WavU~(0by?p3U%}TTG!6;0_Pn{cLUP$(RYyPw4Q0m31 zJ~1Y$B>GeM0u#d}Q9%E6GZ7goX3oBu4rOivrxFbCU&UC3eF`JQSp<#f7V42$QCiC z0o8d@pN$Mkv-3Py|L8QKAPr83qDruM>BS~8$KW|9)LI9b|GCdpA2`dKh1tlNn#l#d z(1W`*{Pc(+IefeM&HVI=)^ZeF)8e~cGF}ANISRu(UG@F+B4Ie{ej3k&TI4R6T0H34 z&lZ9^5&8Ckb2%L7>KXt_(D=ZSQxFfb??lsrcZFIHux~wgkw^vs94W)K;Q+0hVYPAZ z71Qp&zSiuJkn1~zx#?ZcT@GSedr2uT z2g9o!g@MBwn`E~`1t-~2@0IPm0e2PP%t59Jh8)3p9%0mH(-@0W-W7^SFUA=qGPeJC z_=w6Y{qr{hk!D(_=_=Uxf*f6Zq^oiQ2^dJS2$t;O|Mki7$~;Q&UFrYg&O3SOgn7J% z02R|w_M|LiC2CD4_e+lUekGPX?jAJNM~xEqF#d!bZXExV@ExRuqzNNU9spv zCE7K2x{(&)5(rU-#0ZE_69f~9%1k<<`U0$`(8A6~4S}lmlY3Tr0aAkUXpzHkE|}41 zE^$#W<3-XO*@gFU+$EyQ_zE)7*Bn7rrPEFk#owZDILGa~jtk2txY57wM6z3o`5Y6^ z!BV1GHc@0H;)o>@z}@4mMZP(5(isZR_Ua#|w`!LfOzQ^MR0cN+QVh1Ba~u#JX;IgNYC+EHsvtY~TSw2#hvbYT zO6(=9(Jjwr*hM($Y?SNjOg2l1jrED!!7 zISsW-ffjz@%HsmnY{CZIfTv?X^x*&1!_6_?m)Eag0Py1a739Cve_#js|3zaq;}RyO zqL90pl$bPPSyUmukjA~Y zA!WUlPa*le7x8Zw(UjA*7>=S`>U%Fb3rv+jnZxLk;Fs`NIme3%j;oYQH_Xdmz~S30 z$KKh&D`#CELFx~RaUwPv@#)A8*$IAXVM8|?*&r~y*ZJRa6tv+f#sT*+2bGBiQLT#Y zmD5BXEVa-f#k`DBwdN}7j3lH|>Tm9dDGKu{DW}vEAW$Zy9GAdmIA|ByG7_rsOw&kX zp@f%l;N`O@F)}Qf=h~Sq;T+55Gcx1}f?qa9u(iclFd(t(l>F4G8-IAcmjEp-P1q8(*$sT8vUyLviHX zB>Bmeof2F?i4=0Kjr`;}c~q%zoIxIiGslH#S;ur${fCtMhy0Is7bC<~^gJ#D;0M%K z7;lu)JCt%HKWS?D9DtN-Hp%Ono+IzE1*&J8vK-BKl9WBRmS;l$%V{&UERH-~j^mpE z+7_3_t}I`!>)hi7JJfz|`&r(3b` z6eoN%ja8$r9fv>{sc4f$0TDjuB3~49I|iC@6BL~dIpD|VpU>X|BF{1DM(7}8&-C}8 z=x5-}3tprGI*g9Ig~S356)KZe9W@xeKo>)!B3s;w6(`9YeG6G#b`3chkDNq!U6n*) zZ>}P-l~8P@DrsCJPKId;CXF+Y7Ie=6Iqn)N_~u3B)_hB<`3m@#i5>iwJ%ARip>p56 z=nJ4FYacX{SW)8KuYa85sN{{wo%0+RN>OhEIZ-8;be`H^$!iXb#27)0HILI&aXF+G z1PJt8pt&svLsV=a-%Ie74c>QTDY`mELG7#Atm4^Xu5tCCCg5KDaF{H$M}Wd(q7YPg zfJ0Y%Y`7JofbzV?o!J>VWQ(&gn|mJDu4;wdC`Jx7fyymDwgP`MF274f_K&b=gDm(M zE9gU9^AOzoE7?SX1C`>WYB8E`K`HL4VfEh6BkL;6>7+C;W92Gn=}@*<$M-<7Vy^XT zSH-93$h7!E-PVT4hXs5J)in(mrUTB{F9EU^F!knHp;ucl*Y0zCQ3eSuA+1qJVXf+c zMob>koSUc&h})}DJSCt5bs}DSci~J#-F`pOSwT$A+5i%N*?b00okAoN`zD{PHe%-QkHI;coMV}F^1f9{C_CI?6HZNv}LNQ^6Vb#oIM<)6z_BQE$% zh0*Sdvw61_gAs<+1ZVG#Y9bHEi{V>Bc5K{bh$2pA$gr+n$;^(a)f2Y*kFR@}ICcXNeS>r4O?#1n#j9@@hqkyZK zMK_}qS{tg?1sX=RdIw0_xQ9SO4R{oiV~^7}G75PV7735diMcKKzw1;i(cG7%#u}~X zA}YhEa`)b*gbt&szEUnrbosByepC|il;O5p)Ie_k+I#FkSpU|iG%#GMl%J|V_GRL6 zFodU=hpr@)I#ulw85kvuVAF}ZDl7}`rHrVx1H^l-s6-Vu-CXw+s|A`Grjj~-C~hiW za)t}Im7&jbR3fMHsq(A#^3A2_?tOaw2dyz2U4DgCd)!}ysMUN~aK0A=>v;kH7m-ex zFQc5XP1G?HBeN9nX@9vP7A?ihBYk#biWEh>5X#8F&8k*wKpqk0d_tfCH~lls%UI4T zsQaoOqFx2k?!$^AIG;bh&G2X~KGeGL4pP0#)b$dt$nuY?!U)fsL^T#y4Wi~n(h<(# zkGSySpXIr)`6eT>-H{!K#5z8-`^Zlkf)cbr^fyF?JV`dK@SFa%d_A1Q(AQ%%7LN1Og0lwxv$<@ zsgxR^%UCXhLxJsTWR=jHPfW8t2#E09Sup|zPswhg;)LJB&?ti=N_*jvE9EJSd7>QZ z-BpYDAyr^94rP8gbm1z7?d3jns~O7%-Ef}95P&aB`>k69E20s}I}>uK2<=LIMP*=~ z$Wk<=$#aKn$YGzYgMzc%U+}Y9_MNr3(_~Ex7AqG1qysBoQ@x``0rXp1rd#?~&$y&} z{O(ku#hxJ8DH5QX6)hK&x#24(`=P<aHG{LcvZP)?DOW&>W0^)^) zqgm$NFhunp-jMujizZngL(kx-Lu!Z`OMHBDEd$VZ#_Vv20v=q%!OVxH4uf(A$3 z>$~cd#Wj<`r|>f8H5-I|`s<`1i!`>Ewl^elY@{#HD*4BWLY+Er3YU03!SD0A=2QK^ z9tb^w#Dl-Oh+GUi%Lk}2jiR(c(IPeKpPIpY`q`NM#pwiPUQKdjm~%oDGujRoE&djF z;|>OO7q{O&#o1m}lPn6~7J%=WxA`T^%7JTQ@-q7)+phxqZUN7%4$O*Y;(p}O?Py#l zYP9p%urCpfwd!HYM_2pbWtz5DT54mh<{9#-uwE+93d%iTmx4T9LEe{nLexor<4U&@ zl9YCu6+Ehnb$;tbsCqtc|8r1}z^W@&ml)viql&3aI!1En!Mdhk0tB2;t=UIrljp)UYJm{Q{4E-;A^`gO`BtTe?bo=+HxIowC;(F)6$9 zp5R-^BhZ2c>xN8CUxvYuw9qMQ-#N6Z`yi=am9)2}47K&dD?6u29ZB9r|9O|m&WnKU~D5%|QCflJ)^ zluZzMQ3_sP6C(XS`aR7x4eX>4gzm`-$x;>;Js?a?5~?%vI1VXenQ{$wMu_#0)055N zQZd>ul&~$Ti%TjZ1_CG8he$kkPXPkdPuMwX7rB&aEmCBSCpnd<6w%~FPI1_hJ~xvi z*#dkoQ(oQTa(zmuV_FXzSmUFsdoVYJrlg8_k%vWISIvTR-Th@KjT~3(I z&ryp!A&P&iiHWRDge%D5sd#c-2o2GhWm0T4?yp9@%VFs)fhC2%zQc~ z78D)<)IkO%7eOg;SIIK*=*dK-IDJ|TX6r#|LV4b)vyYHBiDy0Uv^>o=57u|81J0@v zpm!vZ)pjDVo2}*1MCf-w4eG3buV9v)Fb=rFi3W$S))9p%awe71Op-ddAwYtD2aV5T z!SetO*WtqVa3YVkDc9nrtdGBbJX!r~MEMoST&tAGD)$el9jsl^q6myn1EjG=B9*lA z-Ub3h^6p~!rO{Z$WD5pnUd#uc$=XX1gO1&W!d}9o$9UEYP8AT6$L!&CvtWa5Aw!!$ z5d|`!c+5ja1D^A(JbRLV>lNVvo!6ZqGCz&PgXdD({~V5r&Lm1?5hcc?{S<9tR5;x< zZUc$C1xt_Fk2AV+FuB(G9g8}l!toHXB>+&B080t5CR^26X3;}zJevmgcLkJNS&!iI zST?f%7;0wK3=~L|oCpqAJWaA<1Z-Nr2h><;HXLR@>t&m2asi+*1ay1gwQxpv4o&`) zv)K*($aC(3>i~;lWX!>9BrY0Wm}_bPq=zBh^Nd_~;sXH~X`Noh9Z^hgG>W^ZcbZ3<5|TEZvZt57-RUt*x#S>&U+G&CSDrF9n=I%@uoBOf7yt-?JDc3QP%a~n{9L* zCTr}#`k@IxY~VTJ$-~VuNq7lr6#b}syDML*weaYIDYv*T-{c3G-D#k!C+XjL_qw>$uN38(X5<0CQxh-j_8$fFJBfIQ3R>1uZM#-z*do!N&L&SHGtb7QMq;|ZmLj0z6y^DHHUYrQps*~(sDeSF6%?z zSQY&b6R%IK!~Ddol*J*rwE`5ZcT-fU6c;*x&LN;Z-Vo}-u1-df-$jAArcOugjkIsQ zzoqCSCZGH%Em^8mWCz7hO1s8S!*nZyxvz`K3$H^{bJ2r$-bd*|iiIuUQw9q1oyu54 zo4BrEDmm#8A23FD9E$Ecr z=`6HO0>poHf7Y?Mt_>>X^I;r-PX+LORZ!i9MhvisffTR=pt{5y8YA6s5E`&!P|b!T zu`6_Q8l&P;G2Den=_e)Ua$^noh-bu@Q);koXIN?-M&27s=}%1_t|AwQE6D#;MU@?c zTWwOw!uL}diarY1vSV?SP3i>jigI>^cfa}H6ld4Ct~Vrur=*~$=#NmoHn>=nuo~Rz zEtT@d5%;nI{Q_DcU$|56Q&MtNG=`gxh!A6ns6myT?3&;%Sn>N&nm*C)gNU|5(I}!S z?5ZP@rvl0ELKMGG()3XP9~`9OvJ2CJKB>m}L^+}d0d{P-i`9Sq|HnNW91IMexVqHJ zCfw)NJ*q*$oTpa2?Jlk&_@MdbpR>S}r}ym0oCT>U5v<6vPL5c|m5VLBgz!*+Kap_E zI+hHS>On(mk`?6Gm}eFI2+e{L@DFFn$)*Y<8v{5=tO0tBqo8Qk9rZ0{ARh@DAdx=E z%h~|T3`D`)(?Hj~0cFO&^K%YlVTk$~#_X)a6EcT~0cpy^6*qQDF{SS?p}t zGABJ{#JI`I2&oSTu<}a_IYxx(p9blpaFr@KdpD&!k8Eh6(nZTgr0MffJzrse3Bv#X zgrt8Zi2qXprBVfyu)Oo=KLWst+4B{eJ_-+{90IUB^ z09y6G>Ht{%@8iFBLha-D>ivVe)Y{#{rL<&X)q^B$pid;Z2J)*EY@g<&| zz|sZ*W)dC;FCKIBq)H0%a0;`DD$jAiVJp$_U{NbpxvJRng>~sH0++-zk=aBH3Bahb zaleDkziS*QyFPUl*|8m%3PwSTk?Z8zi7yY@2KnqzNY6cd=o4}kNd8>McQ0^jLw_C#4Yn;Ha&!VOG9}SM76w4Q?kIPHao@jnKRFRht9l# z_ty*O`dJ!`+5}Zz>82|xkpnznIC19kgi4A~qx=sD*EsChSC#|hcMvRV6s}z*?B!~Q4$lEiCjrAn zzg_vrjX!SwV$W274Zp%Y$?os_@7zwJ9UL{(d@{%n=5^?_>Hzh8amgH2zwfiL@tCG7LP(o>cNi9Y>&ttuWQstPGtu%hT5wrW`1uI#nGd5u*;4h~bgv@;k#!_m6W|aD_No@kLp; z^INwQMl!jvfUqead1&~jy)(0`4nMDcoqG=2g;{~`7`s8y5OTgbu#t!32BPfS0yY5; zq9x%_F?rNF6gbUsOcK=~x1g&ILv{ktJjLirJJjKwk|iL7)&ZJa8v*?K{N797xbq9 zeoOy#eTPNsmJw;nS;Spf{9o2N7QS_l=3mqV45*r!NdPJY^t$&sx_zzLQaicKX)JJ0 z7m(ED-^r0&j7%lJ#A?$wUTf2UxC8&^{l7Hw!fn(y>t1rpV~atZ#6oXL(ts{A-xs=X z2zlu?YQ?&j(DL|ZWO$gm@a8Ycr~SIjJYSgc5bR$m!gudp@^^2!F$pg8Y@;__1hBVa z0L${=X~0iyND}~n*OzlLOM13(RQtv0DwK%Je*FFaVdtVqJ-7R5Q9Xa!Y=d>$?B1yT zeiHZ>0a-x&zacDk1SVKd zY(53SA3g}0z8hC~M6}G`fnDnm*W-AQ+_LX)Bmi(H?xg>N=2TZvvR;Itc3!iN)jRPW3 z0+(J9Z{MH-Aphm!;k-LN;7K{xB0QH~N{+5jj8e3_&1pC`ZjGTx0!|DY4(2?7bA$*- z4NzBcH)Zk3*V6Uz;d>V$bAbN{1myOfjpf`JgMT@gM!i5X&r55+K7oH;&ki`|S zsr;?ASx!cu?`deTfKdmPG3g?#Ks#hInSuQJEEhh*T?V7b5m?Ex6s8VF8jONK<3{pW zDO_NQVB|hlz*L`ZGZFCqK(mpqE6B$~@JpptaS|Go;tJbi(~ro2q3$JIMB$OFVWCB> z8{qfyZ7?b1fMuVy2oY=2D8-z)NhaUHk(nxAWakq0CLlp#9glhIFw&qo-XdE}WGfqA zg!Fg=lJKBycrm%L*U(M#fDBAX`2;vrx*t|!0X`8!G_*$=nWG3_0Zg&!G?r$7BJK#I zxCXj3D&r=(p)JhgYV-REA~j3U1!F`1;y z1{r3Ry{8gB9R^R=3^2dkg8tJD8uBH=h8n1A)cwD1K7qG6C8h1qkOMIEOI))<0o# zMpse9Ld=sfe&jy4MAo1;(lJF&4v%iEXgV+gC;?}0Aj{<~Zi2@~4pOW!)LA+H9?|s< zAvh%HBPm>F*C5x7lW!sbScJwzqzib@HU%5@zwE7bp*F~p)z5S3Q-4FgicBl{(U zi#%v?HDe$=yI4mx?p*{_CoY>Ec_O$xccsQ~A)?2FHMVTcx0C7@iOG8}I42l20a?CQ zgCPViI;!bW(N^F%JTV`WJr=d|U2>@{ZZ z3#MZo?Z=}fHBJO^nR(8GcDXsbsDyB-y!2hv!m$0h$zEbbUhEI9cat$ihQ8$bAb2E; zCDDWubbV{Q5F(m^yct#4?C~~ob-in8zNb*R`LCrfD3$z zB(_Qw=0ILRHGZF^af{U9yjBB$p5v-} z5&)<8kNvA&^p8BG??dk?3FOo_RgnZED?3}MhNZ1c+F5>B_QMlT`jaBvl9{!_^d?h6 z*nR6V3{-P?TbUTnyiKb6et4lS_4J-8 zy>{?SC9qTtlC>q*?9&DsayvPW!tRD)m^&)lrN9f=-P)e$`!;uNOz^`oX;uz&@6p|6of}0F8XjgI^5G zl$$BZ&3U4;XY}IOd%dz{`h=N>)@4{D((uhxhwK*fvDM%9$YcUnI=TpEi2}-#I7wK= zAAf!KuBPONr+6bSRl#pPVZh^WS|W|YzL|ea(_2=^pmg0=EM&sd*$Ra6jQ(<;WYTGe z#qAEUabGM?(!THR){(#LpI-aT36^4AMn#+X^Ps3;)Tx!ugdPegi)54S_&PVg)w>ci z_zb}gqLG2D%^VM0hVkZwzNRWxQ~jBK*9m-Yu9Jk$nq+K)@!*dG4AQ-qwB=t>nh>#p zLxEloc4I(z*7G--NtjYvHZnD;jC`lM%DM8VX8CQCVDcwJQfg_s$Wv#(ub0Thf!77dore`Z%giP@xcYLlmZAjtU8ID&nvIVKXOVL&h8n^esDiq zQ>6Z}R(_y{&HrbZWl(E|5UN75gvDp%d0_0mAuJQfMCfs@FTz* zLluLV_wOdE)!}I>%4O}9R!Qh z%8pG?i+OIVn%?%(s86~Y0t$RifdmcaQFARkkB&9LWi{szQXRv{j^Uma2fHI5_3?+n z&RWBURHS_?axwamtQ+)wGGAkZPTGIq5x3PFsk&G}!guEA=PPLWe7Rwmdn!c09lr`zyRz?)Yhi%bxW;2f|dDC#jhoVWvo7+oOC%c*9w;vceye z;vpUW4P4h1g`wKtCdITxrzDkg4k2_+W9e5!Ww(tQmqc=>;0lfgwGI(^L|66!jB-aaSuBvs2r>ip6PiF)vd6KV+j##<{(ie!dq{J1q5~m#C4ytW= zM|T$bOh}z#7T57Lvd-7tm?@XDQ_AnrtG(3;g^zaf%BuQb}+g)>PEKhYSSyjNA@IrI22?JG%?R4{+0 zf@&{O+-7h zmsV@|)3!%dPTtB9?#KjIJdHb#%8ANg#%++HLtF|oqS{T>L+CxQ0ls~5{doSU{HtP$ z!%HUJN*g`2+KqoZosr;zE8kI0ERl!L{sxi$571QnSUL83z&>qzHu7TSZ&_55NN9+% z->)ejcjzoD8jlCEK{N|NT zD`UTS9e@JsrlEZk;0C}?kafR_+_dxk7j1B0hyi<>0gL|CxfPhgq8?dEOg*vKK<%q>vLas>SY7}bW$ps33Gr!G{*|W?h#;A-a%aQ1e`Y41FyC|VBjX|&Jf~SoGpvLZ2(rhrGq-hQHSLN&dAQxhl6uHwA8tWEQhH( zr_M?|wn~QmQ!SD38fJ`i8wU}Y|K}nx<=Va4Gxtzc~uNJTzWKs|g*#KqsOmv@k&eIFai2X(=bIOv+w5?6LYdwFi(FDod3GHgJN z?5iE{!FqW<87=!wVIAn4TD~~rB|TXKo(S5{1M<&nPxtXlht-x(#TLd|lA4qcUK!;A2WIr-rTpwJ z*XGk_DUA~Rlk|&A9=z)g0T13onRcY86}1LSN3OuNTNwpSa@F-2e0T6wU??vty&n*uOc4J5A^b&MQ{z9`cqAfVFKBrI_JBG*EI{)^CMs^SofZX`tLsTop} zzY}DY95fVemm`T87B6qn?r-czB{PK*c0qJBgpuf&M7}@)ib&(N6-2O?u9a`nn(xHGm=HZy@DYdPRYbFm)vf#+C(QgI1PI=bAb?}cZ?#zNc6L}S(Uvq*o{A< z0hk5zByd%U(%hKraX5m(1ism^Z}`+bK&I(eknKLXVYg1sTg(RrPMhGZ?55<4H9v1! zzN*Po^!M*SX%G{m{7LuQxaX5o{UxP45XTUepYrW1KPm8J^kFN!mDx(ZNaKGW#s>M5 zdfK?z$*Dw1C&}D@Sn9d|pcx27F2crHOl$6rK}{-NU?y-S1CdY~#))r%p&pw@WGVmg~b-dSlm~C+_zr{RY4%e*?J7 z^^q&Rm9tH~lykrz+i){7qsElD`HTd{^?J;41jz9{O||Z^#_OrPd@+i;V2*ar z8QUmIqI3?Xg+g^;$SKMii0wG40u!{~p3VkdEmF>zycCH}lQM};75_x7|4d(gbp6T6 zLK-l*sI!eH;|TLDezJegT-n>WBprxOnrxuJ`44iWkcfGSc8U1Jv->a7G=anH%iBPV zZ zI{}=e#a^#+8(eEdLm12aP;Jm(a?1Tfr2OE2iBzP13@Cw730=k%G%ugFUSB#Fc|ciK z7Wx(Vfn$l1z*E=x5voFvB0or{jLDn)&I(-;CR}YKKoJ$fJ?0KM;@skpE=GUDpqZ?cP;?F1szOG*)sbb}}a8!D}|oF~>>hiNB&C zHa+e<$kM?$TG?I-#)>^q1nx*jcBPT9!#f%LALensW|imPBSAfNha1Qi^qHkeHw z7g2V{vqSt0a-4o$w9A{iw`~;zQV~8Z;ZP+AWwVhv?sqF8ZtlT+20tz}w=2Jk9eo{7 z6d2bA_34L-^`$E?x&qkc#!PIKlM_xzrx#*`>31g&hzX`y5aX}|a`?uzD9j0j4ko*= zphzO6+D(f?gCI6kc&1TG{B`roaK-f3f^T9)T;F$7@pl-$(WT|NQ!?-)km;D~0QKpy zpfVdFB!D;62R8mJ_uudO?01_>?`oM+P17aWBB^1@e_j@N2q0wBrY$nOd_pl{R0Pg{ z@Sh+6wL?Y_gh&fYUx|v4u*oTj{yMK+^vMxGHK<_+i~*tqjL%6JqTUsea!)%MfZIgj z*o+8y+e=>qlBhs^39!ds)CccQm3zLFk%I@b*;Y}?`kRdU!Ox+E3%jtICQ(%ujD(Km+z2dJcHVtUzbPZcZuoo-SOeO!g*Nef_MZ+m)n=JJ-X64EiZdJqFPeB#_c# zDS_`$B_CDg-pE~dutB83jad=MRSxD(C}}HZcVX?ey-uUU!n)z96MdHTEueu*5jb(8 zvE8Ly3Z;-rY;}vJbDT|X>#d@sl33cciZ2z+SenlX9p2KCC0uDV>8qSg{T4P)^w55Y zr5=QI+NO#~-VrN}BvI|2OpH)cx$a=vW3cve_{0>C6i;x)LZ_jiYKuv1^8E8mE~Dq1 z8C*%Ctp5V`!)r$GiDQwk*vN%Tv8j-Y*3!s8!pIvJi6CPpL2gXH|6S#y-8;lrZ<(RT zJ}hjALx#&R?jN@GvCMx`|~gJoP*j?js2rlIh1R+fL`eTGqDz zh)y+%#M{azw**K&PAqJPfe-lSTV(g*UCFR~2aB!O@c=@DuOi|ezX0FDK`Tx-7EF3z;OAYn&S+I<{m8F^0lCdU$4mO0`jlOdwz%@Kme}<61(=u+ta;L_u z39o)F_!Gep(eyGV3$zPp8vdUCI%Phi&EK!P+6@h_GHx`+6Z4Ep+kV_iiBl-DM~zpl z#lJ^l#MaQ14@cTWt?JaJY#+$ZANli?GRbOkQ$skQ?3`VCSq!90&P@fxbX+Putl6EI z+^m3j7M)7pPM6GA3 z$ff33yv*?l8<5n=rb9T+?B@!}^st}9M8Q9r!{4jibOUKAkPbdF`Gw(M>Ru4E`P%^W z?f~>m0JeX!6p$5zY^*{NqKxTFzzH4kY))7eyRoB(r4CvLqK=2Hp$n!jQ+}xuwB6B# zlU>Xptxjdcqf?&a5WPCMTo1fP4cozmz`L7gj2x>C$9-461lN>Jc!ZZ9p~%CwRWv1O zq){f!BG6<83Y{W{LugWPEH+*!!iZ7M1c7{kF;bfvOnu^;Pfy&wky0$8TGBbOT*f3U zwH?(*RB0EsTXJ<$VqqSLNzk+%@^mz=-jtD+w6&s|2>o72T{J113uR2+;kBPcrL2=j zAJW47bf$bS#B}Ht8zV!tgQ>S&`uvMagmg=5(9SM*#IrY*n2raI1i{5TA(~}jFl#mu8-JPtf z88XIXI|a`)89P@QPaO=bbdfEOcV9JevPgQ7gH4MeT;7{xTvGG}=8t1t_&MRsS&~|) z3AY?ZCEvUqZ(U5PV7JD)Pp!QkxW*9CUG63)sYz=H!;wTxiei>Kfda{}tC+yuy0+}a zLkcA?d3YkPK)KSLSyl^wYVS#0V?>)nRlZ1o_yb`_@F7)co?GZ0L8seJ|`W!s?hQOLN9Nmb{@N0o_NO zF(158>4uCftcF5;!WqC~7R+!o=jBArKy5_%E}L&50u5FOFGW%BU2xodODou*NN_32 z9b~+3kq=OmgQ-l;2;+*3rUY1>*$G9cNu9yeayp(=HnAxn0^0{ebw)V>)=Rl!(1FKx zPRu>pYlgJDlm}%0podxRhTOO7TTD}PmFYr>d@sE+U&jt!r=stguM#fgT_7~95UlE$r@Jn(r!S2Mu z@(0ch`TcWUZKw_(RDxgq=c;+CLlp%u=EP?AV3pvy{B~)tzRhAE!eiDYxhwgmNZaOo zj&44qWD@a`ci znacFRH>50;+>3+{>qw$at#xp%`|k)|E*MX*UXyC9qxYb)E-0@dcY~N^PS7j79wVEFG8n}uTO7K+jt$rLXZ3Wz$ zD#IXxD>w=e$rq39+oU_EQGjUo-EGzvB$_y98ky}P8!X41Rg%;&63bhDu3?i`SY^e& zaZNEz^Fef`Y6aR@%Ir$vJ*+-qm(tG4p{=cD&wVQd>rRqsTEslYIfcrNuI;Tg@}_3x zqD*j>3pH-KoHR6eOuCwmkK1<9zr|fQ5Lm#!dQdh{D7?0nW$mVD4oTXq!4x4=%|@ty zkh=Xn97mejWh^!!fR~2-?Dg)|3e?mS1e|6oj(!?4!&iDRNuE@@RS2Z|-1=p&!*Lu; ztvi!b5Y4H4Pz5#wSrA6Uk9O)Ky3r#?5U7uO27oN;ub1O>L2OyK`|y3BP6)O61XlE* zlKGKsHA_j?A3Mb!hd}nJj9g+*jjxpT4JaUVxx|$9$(~~U+(dFzs_7Di&UN0|gUOpNfSa&-o@DRF6-s@#g@|vtA20Xfl?e&uG zcFVu+cFKi<0VbVOH=lPw?3(7oxMRGFb#-fv&8_=7ASu2mC>dV;Z}NkFV9mn!oqeDb zBtw@fy*>OlnV7QBj;->j3w9qd)-ksr%=%r!AM@48xvC|e^3h2?i}0y@|J?j|CYOxE zeP3k-Hzt&Of_EP?)5~T_q>nrGxA?iHI71yK7?XYe{zZHA)Yg{vJQfRl=a(iy|KfM% z;+WUl>-}7=X~%b%+S90f+Kq_p+wAB7fp#dEB2tFFn&;0c^BNQps}9{Irj+@7e_}2} z#sHh?N*4G0=UwH`P6;-yj(v6lL8|M6yx5pR^$H$noq9G4O6M+AAWmVh;?p*iGavjZ z!ECSTcJJ;Gu&X-u*>UqjZMu%^@WzVgEnejQdi!vU8(y02hE zXHB)Nu$`uZd0jJSa%H0#5LKsGD>2v%_1l@mK4+X8($O!N_lSjRHj`D{IM9U9KrNhA zvcFqr-|m|(T@mh8;moBlhN36@Xe7V3S~?(!#JhC}l!}k8pn7wvoaJ&ays&uScs2wa*Exvt)xFuzB!4@yqQJ|{0fghNE0aYNEwcmZ(?q-&10HM%U= zD;ee!VwS;Xw2N z)i70T)r-L` za;b54)qgkzvv<4thSQ)zIW6zBec6m=Y>FQ#wpy8&&4W`sWZdz&BGcgOf$po)A<*px z1{AQ?hrw^iN6}@|D5(&4!n5{$eoDB;xF84+ZQ2V?(%s(rQ{XS0l(PE^f{G2du(jyT zC#W(>)DgJ}Cncfm$xu$6TJowfc&d@w;*n%HPj(Wzf0oMtE@{>X#icRg&GDKquOgO+ z9x_laV2@w0Y733hfU0paV+B@nPZ-K1u}8RftEAED;`W4Ds4?oas?c&Zp2c~-E%_VV z6n*eU8@I#3Deig#gi~8Z1z%$HvIslHN}Ba!^GGaC5*2gSL5oioZdOe5;+5w!8Whks z%HIcNiKu9)R>z$X&ht2kcqiBdU3Q$XkL>^j-hLA`>TgOy1SI&BXa3{ zsL2Cm*wfH^loBHPU;sNsL!1~wmKc`;4F?bM zDU%bsrdwv!oO9mNytXgcKQ2Z`2FrP7Zks(#N89RkQ1jcWpvtKxBKlyoXx+vNq%E#v zij=H`$FZuys*Lr|8i!oo0&|3(a|suA;9Wxnhvl^Pg@`cAGO#1YXggd+ytY*8`P}-h z06HE2df#OvDxRaUM$@QIlxqyP!%GI>4{?OQUSIW}S=uHSmOUKD|G|zVr02Z$Fhi5> zQnDHl`Qn~z=_)Jz@8&)}0gZZc_N^>}!|O#B)wpTVFIg6? z4=;62pQm}0+YB=Qo9qfJ^`jv(*YgIPgkK6x(VbJefyd&^w?DE*WxC@5W0+@m1SJhP zm9)PA3rB4*E`x%bc3FnzXiA^obIRntO%}r;TUvcqN64_~c=6Us5eS6yQul3S0Cvu9 z(IK_w7KlH{A%oeV6T!`FoI_w8UDn+7i;Me+oc~8kG|Hze&{o zR;G&AFro2`OWSs_0}{G5?Kk3ZF$&b`5SV2bp5_CW zpM;QQa=~G@>dUgnh@48~2|t0LMqX@!PoLQ9N=6&&5Cz#kT1w7~C_HEOMQ}CXFxaDd z(ofh+Cn1AvFwc&f0!%&p%Ktm)Z_fI`D%czA>s?*e}7+=&53J z<<-kZgpm?}P8@y(UBGWr2~u3Z?;wv??>XKpd)uqR6sY1ztjcp`vX;IwxdbAE;Oc+( zoYCHuMcoe&h!OmiXxw9j8hnsavZOfzVimKgS-IkC!()w_B-N>ba?7|9n|(U$ zAgF|^LFfqQsUdrA&kV~>N`eVIvwo45%GfL|U9lH6m#oaBJmUo2&uO~Sw8tE-$_|+^ z_edyO0k1Mam;!wy#(HGa82-S{frI;3bk9t(Gk0uI=H*<^ck$j}J8;0FFTTVeEqTX= zuh(PO&2=nrp-+i`-9FvSma`RhNSqSRo1$6TVE>I-wl4RY2++jhmQTt+luB9IyOqr| zBC?pZ0zR8?ah!5G8Z+8aUn%`BRg}nmu_nEfqIAQn+}TJmw|T=VVjh(aVa3sPVD&Jy z#vux0u%0b8K@w8~zS-f+v5H4&W0m%&aP^+{v8M%_(+J&gCY}|Jxx1a$wd;WXiY}U- zRjRB=Qwi760U|SW@EQXFL#akn30o#O%-&-EM0)-+-QB@K(<3ZCppLU&F; zmGnQ`xA-?$bigyO8LjeulNHweO4T`)uN+)?g>(=b6?>9 z6u8V9fgAQZUBa<%goyUrVc0iWvB)bHV$#e~kpR*D1R3>&ONKp02iv4bxKo<8@knUS zJij>k-M{tQ140+1z_0lI!J%YmWi5?u?i$$kgHSRYbf2&xZ7I?L(a^s+-{JvZ8h$jm z@;8c0n0lPRSXca;v*Z zx#*P1!DR`MUJUrO+JmuX1er~FL$PK$f1;(_@V~idyT2F^(>a$GA0JSLU%$E?5*~;B z{%);I?%73+->@wI#vH9i$8biGP^+;wj8Qbdqh6X%Z6t$<4OKa~`ze$R#1y@VTIp!< z`**%HIXhgRsYQpJh5$#3J--uZ(dIGsWd75~HFPbos$Q_&5SKTEv(N$2FwTPT-(0NM zZaS$eYN>NZuj$;?Z;IHox1kwtU(%OYMowvq<7|2n4-^9lJB-aNgt>toH&9x)Jw5=| zTuZYwFJ(KuoX@?48&_SEnOC%}pFO$u1oh?Jr`s*N&+Qgp+jmX=-Q(9KvG2FO7wr3D zH9atSJ8?(Le*tlS0DHB^uZ~$yf@cX|-tFwG=q#C^nUjG&1%*}hXFVRivZ|;*@*y@Z z)W&aosl?>rEBtb$-F=3!7lNRrvEqmJ%I0PLc^}_b`4yJt?hpQ__c7; z&fgvA9DViKWg`9IkG{aPZF@$Di^+&AV|=-D8YLH14toX9G6t#xs;JF`t6YWcZvyJ$ z6jEOh-`%hS2H$ELb@j{fNytW^87MBdFYDs9g+CT2iZ2_L#>EIji+#z|JOiTw$JAj$ za+O5}C6CzWz{{pmG6zLr!GQd<0*`5{zb?d_$$y=3G?ddZG~crkSxr__-?1$N;2A2Kyx#=Oi4*^r(4|W;&@t~1YS5D$q zW>+7TBxZq=V*FgN+3NH%-KRpA6(`|`%-htO2lQ@Jk=>u=Ng>DksV&Y%Eq-7>m+_UZ z)=3decuGm~IJ)&z+Qh6*7Ogn~yPt6P&+BsU)&m|~jzI%s1_eNb4C*6^$EV#8w!&U4 zyvEllaIn70Xy)E9G9j|erlih|Vnm`fD~hN2sd1|V%KVOakIa8i9Gl!Npm>ysd*sS1P!;)_A-gBy%S2e+7s%faY$Wca((u*8Xh~RTr%6?y zk%^V!|3urD1%=|^+vEF$N4ooGy!$~E9Oh0os6CdK(+;UcGwoLV>|DnPW_kux$`r`cdr>@8fUPUr_jLnr@(tnFkw*(9VK( z#CAF~b3zhUgs_@9O*4jmIzq5L{yZ18?K7X--z9MhHtLcw>cVv=uO9`nHowDRYAJ`G0fSa;D)yrKsAFf82c#d zrEDLiWPxSknEL)R_N4v~!-o-!MzypV0qPhquA3bP*A~OpDWU1Y=q|TPGQ#CWDVoX6VfQNX#zkjvLTx!){uPV<4DbB_d4E&NcvPYN3-#8-__ zR*evn;o2t@fu0H;^Jd9>@hzoXp&)D+SQc(AdOTLRK+2)la5Tj#3xULz& zC+#-VaAA9aYD;(&gkyPutwIPrVT$ZGH6Z4f#+$lDbng<@=K&PwJJ-Fp<6 zFRFE89UaKHauzMQ_@Fkjz_P2q`<`PKQIvm^FRp^I1LT=huqh zu$bDGa8=>tW@6jIhCrBAx+#kkrZMPP`IpRZ{BTa07?4t~Vk5e!-`j>ZWEm48P{of& zC=9mr!CfBz`=*+MtV*ywzj!hdy#H_nZlv}yHe=ZCo zoE*ZJH2h@lO~>{5_b)rB&rYGLY^EGhnbCA7CK~2|T~@s_!ymmM_n4TomAo{%)DI~R zhB@}6`z+CMhZGgP1RR`xyrVXPu7bm1i%4A5wm5b%7+I8GORMD72zfwqP4xYzTB~ z^P+e+Hge~d3D9+wJoA*W#hnmWrGRiqx>Y?MrYTra&x^0fr^YnO^<{Z6E)TKr7CxwH zdp*woKVV185Q_qyd}gm#_V>xSihMR`R-EM}cVmb(^{3hY0RP+P(vwSl{?C*D1^x%2 zzd#|t7BstrEogQL__xm`Z2tn6`t11A=l>wYTT$OvB38V{-$Q(7ta>=i4SD%^`UM-| zo5}unCG!fMH#LqqF3ln%h1W2keb5?p8={*Ox*_fU2}d^jNb^4&`u^?EmzBTX9{tg9 z%l(}1Im^R`cD#e&6gHS;LL&29GJ2I#Vzyt!pB zU3wJh#l#dM>)JaVHB{r55W3~F`wEKcXL9`fF~+3p`yrLxtvX&=;#e zX{o-tU^h8ze~G&P-lsA4Ua5~q_P$pP$0&8NPf4TW^lVM;o&Df=XcnWiq5DS0278Z& zR<8MwFi!_F=8(HO*KnIA`Y7$~GDF|iRs4vRr{Xv`Xd0F(2YH4*v*7YIcBzy8zK_$p ztn|V*2GA`-$v3+l;*9pH`{SU9$|E(7o`V{1niNM)v-v8A@2i9`4H!s85-gK8IwUiF zaO;hxOspVBA7E4BI*ElvFGK_^YIz~!gOJY%hQ_UnNYWc=QejWO_ec0XC5P6Cm#lfr z@|Q8|%S1>?yQ@}vZyY>&XTx^h-A~tyX=q92lyYx@%ANbNU(Mw+4m(r$lg>9I#iEfFq0ryhR&2Ad68yrxG_OeWS{BHRP1q>;UuaY+Nx!7_; zhl#>B?;mh$X2#7Z@8kkJ1pdyQpc1GYd+6X6jH=q)J2h1zlrqX__jn?~r_ziiHIh#p zc)0g@;OB>j{3wP{X4t};qc|gYChj#&E3iP7CPaP5PESF)c$CZyq0)v z+Yjlf{U%4R|GI*|d;ZNj%j3!tvx@wpd(k){rrgHBIaW?C+QWzJN%FRAF+gU}?=oIQ zkPbhH^2A*J7J9r0>W6*NUFTwSmYQ}Yfs{0a!W*0(wuw|>=p$dsYTP{jXcqQ`un<+g zP-ImE%^X4n1VP0LH}Tn4rCK?(yz|?0#dYXZwqmkv!neyt{bVT6Km-aFEBR%9+Xl)N zN%+9RW6Alk7rRK{SV0gN(_P}}L9x+9{ffg{C%4^>y}#VQ0R27MNb&tEQOXNT<^^Kw zOY+V|@otxeE*Lu_i~EmN&pp?DG1n&(lT-X)*+!kpL-d+w@R*rLva8gfc=Z_1IHO}N zcRQ+rB{~mw!DOrrd@?7n>dV|Z|M3g(>Kt3Jr=DT`4$2m1{sv97;(@&zpiil7N)xQM znK*br01Vf%Ay}85H<1RR3p8zzrJ*5c)&(|H$FOxzSto26a1c-(d2{!k?aI8dwb_rh zj4a*?&_9xkdL5?4bd8m_jWoR}Nlm=K8e6J4>BxlSCMZ_j)_1hsS0kyZ5YnJW) zv{QOYy7iZSk{b%oXzPi~ucmgH86ZOsA9;4`Z36cycdz-Rw7rubCOtDw25PVFPkWVk zf+@A3e1*q1sbz8$X1XmOp6tui^acTT`baos>_J(D5(#gsFA!`Ip=|wN(SDD+<~BrW z_P7xRp{Gyn_6B zvo-Sly0X7R_kix-kj~{5!CE;c07P4sTZ2XNZ%Wik8|d5gxV=%QLHV~!697w+R-vVyo8 zy&Xxa2JH<>O>+?ig%>kMO49{3W$2V2$MiMpeALdi1iL&6~ae80=@pw`^~ zH-sFDKWx%1cn_V7Ow{)8Z-E*aLDAzOwk0CRSS3CwZQ1h0v+2vQ5L^Qry4hq|E}p0a zVOl!{t<(K%wC5`m^-U%8k@{*rjTQ{ux5T5nEbpme| z<5GbCCh^6P|FJvi+sAJK37r>y!DhTwDt(ACAuVjSaUe~J(s$QcKE>y{|7q=;*2q|a zK#;V`{+f|)%Ybh+d{Vvw1GU%o_XKwvo$;K)_Htvb!ri-SLX(>_l?TbY9Wf3tPt3 zcnpTOzM?_tOKuPt-XnK^4{wyH=(#0~zT%EwZacuTVB(fSi8&? z^L7i->1@fFv>orb?=uq2%o;b= zj470Bc1B%XXE*08`}A=8SS$(rCg6X@mNBT&vb+;(dsu4!Q-%~$#qKaN@jYD%rBZ1^ zQAG>?_pbt84-YDInV^8u&LeyocXV0@<3v3glJ7z^PZ(a}H zMa3x2JYb^EAA1&1*@C|$OGPh@^j(cMr#2spYIAIzzaZi_83##sJXoxZmao=C-E{}y zOx9%OdTF{`1J!>$a1iKFd?I7A<6hjuyZ(Y8&f<$5UB79#5ETNyl|vHLaHgMH^g6du z6&9CfYTK{2TizKj#~0UTZ|#9nI%q>@OOcs`+WQfA1}szzW3xLXa$4+-wQid1VqPEM z#jlbN*p#6pTZrAgit%&5?1#`;dB))qy{)QS=es8|j?XHQLbmW)CDtPNzDx@o*H`NZ z5V=N-ImmR|=TzpUmtFhb$t(@?9N{K=UeSxFWlu}K8il-BfEYiyP3iAI^Cei9*mHHO zC4dpSU&2uoaN)j@(bNkj*48>q({d?fSuX{dyH}~q^w%EWLNyn)pHNnQZM?aA zYpg)cLfd(1gq6C!hP3_odcdgq?*I=QU@c6>DU?(r5hmk`drr1Ysd4(9$fvTQmG_2TgT=LtMVT z)4&h&XN=jH=u*jqJh{WfFxwR`i3JL}hnvnowui1Z?KO6^9&exBBK0K>9}xB)x;g%> z-7cs9HHw)Voe<*We`NY4ae2oRq6Cq}{`$%uth4FbD@Jvu}-`25&x} zme+iBR$Qj z?Ar>AH@S(jZpb)o`42Chdrr1*K&tMFZ?)>5?4p8^75 zmXQbwNck>HbZkBSRO!%^D$LT}*1k=#;>jJ}riGB%y-$n0+iyy|`tf}Asx)!I4BKAC z_6+V!MWg*t;P$-~YML@S@!=jqA997%UjMyAhzz$F%)-=rpADFkc#~BC`jB$&F!b~5 z*JW)13wlS&M%_^Ho?KSseXGHXp|{w|9E!K1_dDxpX-qq z&?)1rfm-`_7pu)GUNdxe`wvintN<%{?7Q-xYyKzQ-`id3*lu|I8$Q-<<;zuH_B_wH z-n8}ZwSY~DA@4plb(q|J$C1HRJjG8iHob$MEx$uQel@p_yQ*c=^__dm@bQ5f3Hr?{ zgnKs))~9_cBRkNIJYkScAxFl-)$=2=k4Ix z`uG|wyng$w5|YyLGmAIAZ~ry60r!00=&wlqLprm+e!BjezVYMb(Rd0na```2vgP8` z+Jhvoq#MQ%b5p05C1OokXHEqH74=F`j`LAlx$OjIq+UCwm-eT#o=rIoua72 z-{Uz+0XF$m)pa*u)vu?I?!SBHTT3IN`R56YYFU`w{+`=?-)&TXn0?x29<`fzl{KSy zYO72B`1LK_sTWSwo-WbdT1w2jWp6OLsYvINMvc!_NwKWBy5r)`TosP?SP5&{>D(uR z0HU>7{1{VLu2`fm8L{1|Ze{D8xE@`fl~%plA;VJ&?OBtjkme}+CzzMDXM5I^UYb@L zcqj~hK5*dU`qg1-$LiB99zIQdw&vo4EicA9C~e(g-5#AUQeSQ9_wr*N_Sz74CZzR5 zuWWysky}z`L`F?m@1A#_9)9DQK93`Jo~icM3rOn92{>K7SNA~b7tgGt%Z5*f$Bdc= zZjQ37*BBUa{)qd5et(Lv(x@_!xjQn%=jR9~t@n1rA?%vVKYbEcot|BF#KF2F_Kdi% z3ej)&K;i!K@*0d^=8&C9=d4R##P~EnHOt_b0l}{}knq zEf?vb?oBqE6)-lFx2E*&E3yqA(Cqv1ZT1AJRKv_H)Y7~r@b>U8i3HCc^Fs$@EX@zdDP>I;6sk1u-8n$t=VD*PGMn?YYmQQHu zkM~J^npo7aa~C(s{y3nukMAD6Y@wOAN4HW=aUgqbb^3>rA=9?ACF4zMG+FuX=5vBLlJ4&A?(PQZ?vn2A z?(XjHMnXVBy1PU4Jm~v<=bXR5mgQRP*)!M7eLp*6zlImN%K~MMTd!SR3mnL17EHc4 z>0%i&CHT@N>VgfZEBXdd;QW zMxQQ?>#jf!e3rj5DR+%v1FdS1l>M`DR$O|?gv1GIiYkrOR!C#**vEFI3zumT>g0(F zw(+ciHF@J%HQjCMW}GI^fPcP{3$F4oQrZ>O=4}Qwc z9h}olC*}oPapOFIU99ofL)myOSpaT0;i#2>>}F1VhCaXU_YPFfAVNTM+@nj!JNey> zNtm_yHJ_~jy+P(=5kVb%=IdNHuYLQg2NC^D-*RU|CVgC+W_wG&^yFuJ+T9^Gr%2~M7zYG?pCDJuG8JME+1L39CSj9^{*)bAm zdh3)ot2ng_g)b#dlu&@E^)WsNn~K0ru5X`b$ivJQ%Vv5>bXm~NsPB2JTSw!sMJ56dxfq0PWp zl1UY&e4QQi8B!Kia3QnNX_H1@upQZ#T2RqS4t)(XZ;!$z@1&2Xd49W4;_DDog4p2> zJKW~mEpKtXSU-U_Z>2+9h!S@tm7vNUAM_bfw%OWHT}GZ^6J<&qC8}|@!BXkRxH27q z>k@6y?3ZV&ooZl3>CYWp#7jm8UgBx?mV@ z4C+R(V_l({J)%<#$td!dPvA1-$cvki59sFbS`{~?OQk6Hx zcrTgiG!5$RIsr8Fr32GWoM?(I7NK5)XUk$HxtJ}MeE zubxI+h^~r-C>nKwR{O<3QE2H{kbj!JYCb5{O^A$tOJz(l?tEnccX=p8>ku`j22zeg zX-gGJ61mQ)X>KQDfE$jDH0I#=2@^O_J#A8~^9@nXS;zT4yL^$~~?`Iw<@kvP@Dyp}l)<+nBuL2#iFbur0(y8U-Y($u6+#xFc<|LTw-kI8XM^s5K-p49p3&`w?n_(D0~>pswPqwSVM+#Qx~tJAqLy3O9K9}TJpb^H-+jm3|6(=9t%=O@TKPj+@Ca1&w0`dGTyMYIh zo?6MV;OW4B!l{qyf7avjmNGmAbJJfeL-nw@!5LTRm9FOmvxrn>!P=1=-Ac%@{Yb&-s0M1bDPytcN6zIP!!WI zvlgH}G<_;LQ?ZZz@T>uG?s-uNCgx%v)L=|Lb-L<{#Ooqu+u7ZrslyYhwOsnz_r>bF zkcQ!a$OpQL@*G(HR-2$ox)V`ALJU+?SNPK4Lkr)K zio0#i&fdXUvL{t_m&VkyPIr4g-KXu*yZM{Y)3RH%*B-Q6BZv9;%#QhpfMeOS+9*c{ zc-UVs55|~Te+#>8&CZ0D>Q!>(fKDi^yEp@PNOziW1-|0q<>b;9r4q9fxUn*QCZ}bL z(D#xIc?JPSd|sUK+uK*W+flp6$m1Y$p+wIbf9qG&8Z@L5<|Zz zpB5yjU!}+o$X`vIw*a!>TWx{RGGa~y&WJDeNx_VH9#J6u+y~pc2=-0Gbr2mk;)Vxj z-o8|yZ$^%EO5Vfrwpm?PBe4unio2%_%(-B*^iFEXi?$O<27BD1bV5Dm1sd(oWhuLL z{)^<|YR9xNr!3KZTnac4!S!U*LTTT}8Q^`gZHZ~>JDFC?SH;36X&ZXVVwnd8pgj<6 zjgFUzNBK#^va8@WzoeWeUqmMO+kcln3?mbz=fX(eW7&~NGglkV*p&+l^B=NI-@{KM z2w}(!VrCfUOJYxFu8RJI_>CdtJ9v4{ggdSgT8TR&SR@LS3_p9B_aJt#Iuz64hf)DK zIqT98p*i7xbVYkvmZL{`Yz#lqxbDveqhV+PY^EP8Kj-A4&O2cY8ULJcFPrKd^e`s5 zRh&uu-A4z`S@kNj5zytj-|qF%F3MSR!(9B_zZ(U-JVeG;P)|Nc^>GnMD>W7OU(C1! zW8~rnIli6n`8XS|@UoFR$^_st(~UC71$nfRg?I*yae4bJGO(iv0>`9>pet+zFY+w; z1bj&Ti#d#{U9|A9gO<}tiDnCbvmN_;xLwqt=-inl zD-R{#x~tX;sSI26ymrn0nM1!6+(0RI&a<77gS2Q`ni}{~7d^k?oZSOw`7%PX+xEgo zR%hJkwh}59;wQn$jpx$jx5_;?*{b^;8((#cz!Otfe(D-YFh0-~-a+9fdJT~uzsYU+-W}JtHIGA2RlNI<9m;O>O=Z@d9rGs3 z^+SGD!$chhoC0w`C@6EVsUJ6L%&F)mBuELzeLz$kK&K%Zw{y_83NlXe$*`PrsKYUiZhz2g92tF!lXI@W62q#v6#2t z$3$rw=_3JcmCG)lSNYKc_Y3~^nT}Fsca2N*WB(i zwQlF2#_^@I>=FWzpJD@eL!_OE`W4xqRUh|)YT-6mcC)-YMcw#_SAAZTmgL>eU4j~= z<2%w-56{+i<^oZ?Kj@q3Y;7b=!}>bvhf+B;2f$_R(2pEWE!!HN5ynT-Ln*}5t9RvS z2f+6j*Ha!fIMoUSZ?79Pn8SF(Z@Sd2=B(=!toP=ULX}AVeA$aaihy7?KZcr9c3rD_ zMTVvr+l_JedIWpo@cZT7*>nJxgD_4064Ic{cfkr4C&m$RUZ|B7M*Zrwk%w& zWdWPF6wyA(Cz$=gaMR8pr_J_~O@0eh5JHo-8VaqV0o5fiRXd-!S3YJoDZUzQv{FeW z>99Eu%k6D{_e@2|C$}rdKTOu=cMKpd65bwBM+1=0Ge?eg>QZ`eqkbMNV|$tuA8el@a~Ov35YSDgz1lt$&mymFINg90U_{uhRib&t z7@xrFJ8=}~ktn$PG8V*!Bmi%~~{p}~_G1IIy z?m4bp0O3O1IQ5t}ue5siGz_~~vuE0gq}6~7IA;P;f_B_;q4Na>Vu>TRRXDF_nE|XI zk|FesXIhP?Hm_}zCA#r_(KlnY_vkZvYRKj0v=$vtv&?HLnfWjKV5X?Qvdy_%1?KtJ-HaC*bV{e9h*+W zLGBd-Gk(9m&6ut?lB}+s`yL{*wkv$!;qIQ6_66Z5P^whZZFq1xyr4>G((9_eXw8&% z%D0Z7_2QiwM70~a*pk4n$&fuAUOVvR_Qj@4l07%CnM^1p2BmB&)kDzQzs$I#TM?mi zb29av(`~r~F@=x+h*@tY4;gK2NDz0i?f8R-XK z1@F+d09uma$V6t?z~Wlqt?;WHaT!(#{wV4^J>{A0QH9*9!l7fNreH6RP({B+b)RWz zT3lgMjCzNUpL&#-q`RDJi6w40;-gsij_JDF2pYg^Lh!7O|Kv_$qV}sUW`Vux^v~SG}2iqa9ZU zp@V%WiE2%!T%+D>{Bq0NsMQdAsb*LUt#foFp$u+5b54n(ep2z-o{|Hiz)0^pN2NQs zo-k?#WRi6&11Jp2`c7@ON0K6FgvA>FsJEc>{UCLVK*uxQMFMY zbY&R-MwqqX__aR6IE#R`Y3r`qiSCMhjw(D=>o~;j31`Sx+-$;7WYrBv%u93HP@=!T zhV1ib!i35o1V8tt`Okl71U8yvYnJ+tlAha^CDiYiePMr5kCTD|ls%)THFNscv$B6m zg3SdOlIEoF=almteZG$}04gcjJxpbASw^qmE^_~g)8>SG?=0!;c-f9`q ztfTHvNfF$3B*w!60FVwgBP-Ui# ztzZyrp#-;dK_{_z1U0Uv^R;q-c+8hkB{##ED!FQr9tI-Lc*pmdNZX89{2I&a2eUq| zkc#CHt5Khm2KdrfHuH#t$?V<=-P+C>AkXYsK7=eF7T5`I$LuJTdMRv-)c~*+E>L%L z=~y~`@!QkE4Bk@Crmh>__E|#Fqzu8@{@Tf0pwtsejd|C0Cs`(G7pZ)BCk4l@WDir% zLHBrJm;8vf5sGZizy$-5AS5<&LHOErnt{(N($Y98c#W1;yvNQRE z&Dh9G{77EJk88Z68xnLN&8~CW56>2e61TpHw?j^>-7Jca;t(Fz&EQ>Pq~x^Qu&NAZ zw%#RCMy4Ek$pr;GcIz~4kMsoQr6@12>-Qf`2LE{xm4OpX#SxZwJy~B1PFNmrh%*Ur zKbHXx9a~D`bA!3E5#x9A;_NU-_bDk*P-K5?xC`96)xsjgfHLi&&*|=f|C+b!(V~ua zI|OU}IqHlYY2&a~Jl0Q&kXsX{3)x1KnS0Rf*s8=$B)K4M*o>Pqog?AEg1SnxCa4Tk zqBg~%#-C9&ge9E03>5B`EO_Kz5!1gT=$J{%BKi8uP?_R&2jnMGl|p=$74KcD;ABOr zbWs0=d^AmcI!HVnzO0@n?J;q6eRD#+EeK>;th&Ucu>=#Pi8>~!tok6Lx$_8d{^Qeh zE<62}0SdJepGC!NRKb{_v3j90Gvl-P0veD3VT{_tm37|jRd-_1)19JtQuTjU1BUI= zi3ETb8NZ4KncM;ZIT&R?!03Qb+ z=dt+c^6Q7|2v7Cz-Z9r)$8gAoz=T>+&)DkWM`c+KjFoFlRWqP(VYpTZhTYJvTb@wA zU;iox8i7XvN?Ei1eEYJG>-yiqMi@S!FIRnr^Z=##wh_$y?FK;XJT63K;8f|2a690h z$N%U^$jQ@l^EWFkTKx+#cVa6b-c;N?^Z8jqN%mlx4*WRW@GedS(hbCKS2xv&X2?_n zvwMqI^z;-Zro5F3Hy<%XKI=XT@w?4sEJ&ojb1wv?suEWS$uXIHw(52)9t_KJ;5l zDRCSB7Q8dLuu^S564ObFdw_Vv(nemeg_WUORb2weYM-|Bv?%-Vp|URggsx5*;SYL@ znVIqi8;+%99NL*JK76YbaB+@K-DqoZMRNF`OL^;uT8$d`o7c%iYijF0+O%$B#2bFJ z(o9rI#91~8CVW$?p>}=(h?YCjPfXjWn-(k8+Y71)mhgy=R)s0o(UV>#Ha)U8ejq;J z-4Wiz?Qo{df&`QT_n9y+5`4b8!Q1hMY9dfQ@eU=MQ*mOh;Y^FjbusdZ8JTCkCeMR3 zrpGw}9)n5*UjdWAEfgaDm7U-)mcTCcyBDvEd}x3Jf@!Dk9daC*B3fnjK)Jf8UKCub zWBsoOKpu?tFutlmIHmdoXn_rQuiSAv=+>8mVn9=k4bFqBm&wVK)hJ9O=;VpHu*Acu zQBqAf!QBn$`aN@SClg*aE;GlOH0JgaPbgzi_V9=~E6T=QM$tWjj()V+<_Jq8)Z<>D z0B)U482$b=dns(x_SG=E1z7`*4i?r}cm5pps_O*aZJk4fA~J9BalcXhA2AgRn&e>v z)rKa1?Jx9tyWhH&4>u;44rI@xwJKrIN$oM=5_fLEJ7du_JVX(n=dlT9oeW1p13O+~ znx_4;%p$8ui7!T7Qx|El=P(8~AlQ-Pj@Q58(_h{*E z1aBdAbmaW2!m0Qe1);(2y!;2Ylx>V5rn}e-&cKmq)ZKj*AqS;urPp< zSlvxr;CtSWbT;SVibhMu8ISCj)qa~?n=N1nX)eQUZd?R7ERiEk>`?f&7kKX5jevm= zPX)^B#O^G=uUCp=>#W?vs{H?jrK$_*9#|r_d2YV#05Z$bO52)^HETaH;f2$F7RxV@K zRw_t~JbA)JyhIe=q}(Sw%ow1_o1VyHmro(W$r#lPIi-AfXx(h&q{En~$zuQMhqKYR zGIp^z!@*Ulo!0a<;8iEqu0jFgG0mKyJ1=|AXHjqo7QmkJL%)3B@|=-5|1>f)c6jCRz;))qTt%stm(K8PcR4Z|npH@^Bkp1Cv_cMqTWSZ3%g;}}(*(U6HKmWA zPjX-&c5%jBr`s@K1=42bEb;2pR2903%e`<1_jr3Zn5|98zABL)P_8B2<>2%(?7w~5 z3SX|^q=IqrQHficKch_)4rU`p{DAgj^KejnLZQBhMW;BAV)m98{vYlb@XoEv@psP5 z`Gu#LGjVhc+}sF<&Q#R7vlRoC3l26a7$M7RjyX*8zmes)3oOT3%&JRueW2CkJY$e>Q)Gz=%ZQ-6yW9L<;emFqu+46bz=5CN~YZcK4v z_Mdo5X#$x^vK3_q%{VKMKIj%th+@qRE`f;32lD#8;2GOL&Okzfk1fS z9z~P-0ebtwMigx}&H&!VdbJ|z$!oFS1N}IHX-2#)S*eX4fGZTY+q_@n!98gkWjp>& z?t%KfUWIY&%6W7AN$G9;u@UTA0>G$+sC(|bulv4XJ0nLaxZ<>61(YgP_6+-!C*DwTzHgcgihcGv2*;R2f8y)trHu4=$pfOG2Y zT0GP^v4=d%81iWzYLSn9L*`6DGsB*FT;1pMI{#}L6rY;Ge|L4bSBZEh9hE@s z635?4R|bPxaa4|#??ehEa2Sd|Q)XtB^&jMIfGJ?JOA zN|-knTq4iR6j#`=@4UCVstK<$hq{_&*oV;OiRH&yqKFl3Y7po{(vG>ui{x3{L<9~L=NEu__ zHnI(8Mcpi|t88b{9j`+ecn*-n$9uSecyDy&dvprQyvn6V$SGwpqNX`jJ1tnfsBAMW z>7OrAcE8Cm^YZupVe|Xt+F4W*FgpbQE-yA^Xqg#SjK=`1qIrn7b-d-?bj6iX#(bds!!=HK?=-W^K?=+c#J`|{A+Z7|9_3{ z)P%k6%U>MwyLQ=xnlq6D<-mffO7fGC%*Q>oNgBBKM)!jSoommLuty^A?#WmXMfNT( zR%O|QJB5)-sec3{I;l!F{@sH2Ak}?6VvAwi7$OgP2WCber9qEiK zaiGv$#M0Cu?P@eo-uaRf6X|aw$0H%O8!moX@*2%ZGkHX=ePM&Lm*&9vaw^z3#6Ru9m%V*3*hDHp zBNw`BL*k_wvO06*r*|}#sYK!PL@Sd2*WwtZwq{<9FmyVtNg{4Z0ROZg!fsrxn`}E{ zgU{eZIG}7mBb*Y56>{j~+!l-fx-a-u#GNFr+ql=KGx?@@7XM*Y@;`SXb9Ja%I45!F zd%w#1_e+ShQQ*J5TXNj)JQC02{v)kJ*SDwf^{1>$bgOG4d{I!Fu?i_;_T92kKtUs{ zp*r@XBs;P4^E~k0@0TTB;1*g{Q8QBm5)2H7jT=6Rxq5KP{SIIEs-AKHaguDYc`nh! z4ve6U8zu?CBDtGI@rz4C=byLz*d1BqsLIcul5vMv3U$0GhSY_uqTMqOM<)ryF*AkM z5vZ0D>#YN&T#|3K$S;&L&sqIwE?W2OG#k!&rW+maHyrW{*^l9U`*k@@3u|1+TBZfG zL!DHhP;R_~8JRLNOu#NAlRMHdx*IxY)z(Q{^kBJVwt<0~b!X`hb$9vBb2=sopvf&# zQ(YT}Xf#YVSvmhRsQmPIU9uRLVe=UNgGj9`lVQ}vd<75<89!P+jA;AP^MawUxLp2f>chFJN$4~=t$xm znI;k#pq>h=&17XrdP6>8&E&-X00*goZ9$KuhEr@gl-pineD2HxzP8Ui&67(u+$^0J zqH=|c`>3YK&+%@Am(n_uV!YYUU-QOvkxeyuSt>IQYj z^njJfrMR;j9BdxQnY4)@yZn&e!b-Rhst?C~)wAQIH#;nGQTa_qg#S40fXRJFKQNWMh;0jSyV`KzcS>q zy$ua7LZ9515yraqeNre(9tMHMyL8$jHZ4mj=d(`^DBzLL1lM^_GsE(ijf>2(a+zX( zeMs81DBwdxe>ERR1mg5?F`nT-9+QQwO^mz>tygNs^md4NT&zp?=|5W6Ofp@$as}pT+i^y$V-&0N~ zvgC&2di)~n(YZtnU}-)((r8LEXI(Z<`aA&P`yHk;WB_)k0mflC!_zze;fn;gWsXc?6+uF^yU6Nq61w(#lrZR*Q@oin&91+ zlbo6z8H*zK*Ny5!>=*@C(VX&RM~{H%6+C>()JhGY&VA^p>~m-b79pirT)?Jm+x$!} zCMhuF`Q=93p_eZoA>a7&%=D`BDGUh^XgCWF}P+`^; z@3eqdg{aQ20Hw%Q-JhO;FVLog$}5Ob$vc{@BNy(9lyoD)YdxKZf9PzQyH(P-fI+HR zMd^f^yZn+0227#quJ4PKDq|{OJr3Tj$F#D-yY=2s59?#Dp}ocW>BU{hv>4rRtf zxs(gR4eoFmuta6E$XKCoTRzi9y};C~c#S*Eo-LbtACl30T#Fh`#xJ)nQF&yXRgAVg zg*HzmglBfC>gkR$RY2G8O~tCcY8f;8P`jkOLI-PWAJB`L%dDMAfb#2y&ijgtOJ^Kd zk?ne+no%isQlskyTzwtSCOw1q_UdQr+(s#`Xv~4gCAkmCYOU)EPIsMDa7bEX>-G%* z{!G5OTIA&Z^vmS;?bKDW3NaVze}Zh#WwnHXR>t~Q!bDUwZy(s$F8FquuSm%`1`SdA zW95j^!9w5qhB9$u6^Fmi$Oh-BY7~+a%R(8~VYByrq~3ukDce6_`irLR^gm#l1OQWE zx4({K@qI%!{1=$ct?kDz_c;IsjQjLIV2Z#EX2wR0(8+7_4os!~0@Ha+2MssatrkWO zid&!IGgTW9aJ<>Zz=AX=Rs%T0JwA8q++KX{-;{=DCZ<;-ji$qAAD4@3(`JzI&VGB! zwj?r#6C37~3}oy{g@yaCTc+=0r{zw>nI$?ynyrT3ka>+PDMBlD1aUHHDJEYl43)`U zN4z7`Y<%Z;!(mg$gyu0p^xuYzMG-oqFS-CiA{6xPx8&|YEp&rA_!(}a=%;1uP0cz= z2NwBJA_mIuuBWH>8aj?lQLx0C{h#s1f#5+RTr?X{h53Acs7ue6A`KE0%A_Y>1v)8SsvuA}U`%Mka3 zH`+W+Ko_e&yW4BoOF$6>X7RiCL6^Yv3~FF9;^bBWi3s}hM?pQ}lRM9g=y*D-{%rD^ zOe(=RSeOPQOoXS^b3U(&R75aT<7vwK(ivc)y5{5BG7Ho&gMCBpUx-Mr4wJPh&0o(9 zq4Zw%fv(x3qc|uo>VW;1D_?k2q5 zL})24zQQoo(|VJKr_!G!XO40LME2+|!NErE3YWBu-7c?s+Urg*wQK{Tk%$p(%cy0i z!nwA3J0cPR=wsO=D!F#plICHjD$x?nsjA(jG91rSM$~jZMr)mDyHp-Dd>?^T=7qIa zly$lOuzbQd6C@9t@OQS^)O;O?T1Ir1||&W;uz)HR4a;krb%&(dloV zNmw@YO(KexV^wvgsz7@?hVq7?Zb;={Y?bqw(n+t63#|0+35$za+h=2@R`S2N+O})F zx7ua}1O#)6N~FKOjXvLwt`*)r*#itd^;TAiu1 z8WmxM*+Sf9`V?>x?|5qj#;m&&Wl-V68yKo}u30y@5B^ZqJ?JzxViG3M{(S*mcB&XY z3+Kwg*<(-9#&7GV;$fQl73_=LVZdk+*b_PfpGw-{#UncKpR;P+o_yWeMIv1d`J+9+ zgPwqig-{ba?1y^Mo5}EX%@c$)ox;|u)6g^jD0R1oH(~Zc;d`@hbY_@(M0E5J@NmpT ztj5eU+MrqiYq&mZ88##$Vv4J{oaU8%NoWKah}>O}2^%}2%D3G7bL(+~;z9i^n&74^ zPbim$)yo-;plqwG@LQSQFNxWh{!B^!$Ez__3zN>`;1hRK^Dwt$%P~iL5#pE75nF1A@ak z&dNQm+Vy&4reV(Vv;&YNW7|1b_q?(7KL~rYHCx%rcEjUVH_P`=k}M4a_-l0}In$Oa zWoCc*9sD_G0qr zSJn_GnZ{alRrdm6N}uveauZ@PiF$f%^A2Bx(IU1u1x`mF4L9I|j-`K`42yGr=?=@Z zrXPva5jOZeAV=?qq#LR61CJVa$4ICNt}T|KGQa~^kR?R`x}mJ&;+%=l^cNMrK;3&ZulX*~D8X*{enkcNUZ>%ra~Q1E;I zyCJHwryIlG5j(9UIN%fXEZ5yE91TKiM%HWW4x7*{rKiHIGnDcG{s?2HO0Ea+mFaFu z^ik*JDv!)#SwM>pr+<|ms(`E7%|6S|hNBDL`(&q5D=Vj~re7q^Rm`+aW)WxUHkhUI zFh8q7+{0cuALd$Muc}_#MVU~G&j;SvpqG1>$ox?}vPIJa${;k#booDW4#ifJd9XcS z>6!Jes!_Zka)(uSEg{r-CiSakGwYHOHGkioGt<=9_M>m0*kJb<8~#*T*EzmI3E`f) zqw%M&J2t@4a|R0&SaD*(HEoq`&ouxJTuG|U&R+iIvvd`YQd++r z(b%mC*IbOH{^D87IyD!aZ1mPk9J1Buh)~OHF{2MSIgJL!lpPI2HtnBA{5Vvwr0o6g}}}=F1rf;BCKS2YWzy~B?DNKd{e7q zCQjcod7ru34rlDkg+;{QO~~E%2;D|SHcIk*TUYhC(Dw>j~|p_Dm*SC%%B|ZiOHl5@6rGlFMfIejd|9erh1|C;d*6be%>V z_OW%$H(jk>fN9Y!OlO z*SB`imy3T$*2hNg^6l4c1?Tis(L6Zs!@o!r@Ri>$v*mwUpLfBLr&R&W4Lv%uF{eXi zw4Lv>f`MXA#}PhEibOG!;?mGA-)36Es@$#)dU3aW=EV4I!U=D~#)r|uLsHdgr(Ch_ zu8ob>$)A)1$P*>MnHqx$1mw@+r#Tbwrdnc@JssG?a1agNHzk71RsdfWA&$@1L&%tl z#&PN@R*{n+ZT?t-Q+#asD!#7~PW}tF(AXn%0?XtU`$Tb-FgY%AgV3F>WUza2gSC?H zcOC_SbFR6 zL$rGS-Z8gEK^;#H$T_u?2hEZ9R5_kNA?&id>+@-&O@1lGh}IgNEH1*MxF4~gvL&^B zLG~V5K#KKZ5TDBYJKvH4)wo;+kb$1PRyX9@2Up_-e_*VST1q!hl?+xT=xV(Yc1U$K zOow$$7AJu%PWt^W!ujw7ZGNb1v^IUUFE)X(4rN4&v(yKi*_)i#?8aYku7;zESl;6s zuSg(aRXiTRfMl%Z(5=ChEM{SCheL0i00@ey}xagwR={*{&0J!WwVw}0hs$}A?MP_G5%1Qj@Ml^omT2J`FZLF~_q& zV5@XEl)x3NA!@e}R;r@?6}9_L2qOJoV&7b69awK*1**|+lYNZ1KnL#RrR8oNr14z* zG?K(oH9mvq$qIR~MBv5-!J0^aZ+DoR+bl*ga}zA5BVX?`S=6~i>{MC*5Sa}2il@LE z-Ac*fJ<+Ux#nJFdC22I!m9MzxdBy7NUO9O|r<1G4K|#brZ<#PkA>JzNS7w*T)TwjkPU2XaE_RC4OrV==x{dMde;{4Vm~8I?|*L?Xiio=Y}q zwR1eXJA0AY%r6R?CUbRsR|7Pt47R#+RFzR;#B$*gsjPJr`6%~ASf@DOExy*h;9xRy zkWQePngq}>)kJ)>+R>MiVFX{L26c^-u=rxf*H>Y%cN*l(8@GPYb^aqOmpgiCS@ox^ zqCr|b1p~9PfumlBGnjzV*=Qtxp|eYm{KSFi7XpA`4sufjGdl@z!kUvH$eqh&jox(o zyu9W`7jIZizwrp!LT%Xo+4g%w{BuYDJY_# zL#N@#HSAac(#F8Y!Aqfrk19z8ppvFxMlDMCa`8&ihcd`jsY|*|qrd(9{yhG9`Q!cR z0Ko+IibU?u>z^mPKNo(jqs}NS6_hvM8t*Eh%!!}c^jmw2Emp5_e-Y=FEtEm+=lN;+ zSo{n>03UBwG?@D03OetySQq=urFe3H8IEfHqL3qM>rn3E173$IE!(GH?tpnhHQqh9 zj+cup37#yHp1~CqAgx4BHI65}1OuWI_hEKAJGiWr7u0FNAeuz(YY)A>l0~$ah*U;Q z%n_Sw@*+41W9(@5>YIW47OiCP`MGZz$&Np9_YR&!gQ8Uc`HE-TXQqC817%aQIj7Qyr3eJ!qG&iwg-v$H_ul9w?6`Rr=u6^ zoB+L+5fx!nfb(p;O92Uscpb$;*_+i(htb8V#(0eVr-|7hz%gn5;GAS_ukB#4ndln>QRqghiT?SoZGTC%DL=IePNv0;bG z0=a{s>xOaerRZ#hd;?jgA%B}rHb{bM?Y?y#$+&yjGPPtw4f3^=V{AUcYt8bk%FR)T z%M*j6oFV7Dg7JraiHRe_sI{4l6?kqr;LZ|c$gvW<6OjF$zWn2x8A_=ZfgW#)iD0mT z^$O^)g64upSRKM?9g#nI5vG&Z!87nQVL3RsBJ#4IF=;+F9FZ_OCr~_4+0)Ev#Xku} z1=48w3y#1mU4wYk4q=lLN)?6$6n@d<5>1hdH&rsZHqnXIlQ`{1rvFo^kl_P)raW%>|abCX|`$O-Hxu1qqGtc1r!m86AP%{lAsD;K8}bKS;iQ~~`6?a&ofQ9wVLn#^_ula;+oO^^@BwO?QA|><2z^$3@x|id{L$;!F%lQhYlf_*jbZ#5=q( zpNM_&0o_y_gDG^b1YF<=EM7#Cs3*+}fk>kC8FqqG<>WD#1fvm|;Oj@O52etisKxR1 zVbjG${YY*n`E21ymxG+KX9-NN-^KZ=wC#PQ%uD9G1VP5k79*Vl$IkF?+M!niKdcay zY@gw7^i*EPY}`8I6v>M}28mAM1VS}kXH3%FFji6jG#YwqXT-2t#+s#%#i5N_b&qw+CdVKENuWby)i~X#Qd1&0_IA5hN3s1e1r`zqr{ z7rQGn_k>GALNO9Pnk3Wz;0+5}sOrckSD#Jz#xV+gz z;fw2CRfuC2$}(11<{&3OFS+Swg4a;zZ6iLQNNs=DIWc%>xN$e&{dWuQA zA_`AUDjB(^QV&g@=E4#@x>?FxDZ`wQ>0&)C_Blm3m=pE4PeDoFa}paQNP9jf8z+g< zT%*@#73S&8Q#(r5j*)hMPQ451z)eN&D;;%(AobD;ugl+^z23o16=`yXbUY=Jny(G~ z*^9~l$%r+)!@`e~@X8dYln_Vi_b>K%$J2Vw7|JiVY*!HsAeX(-NsmF-69u3ItZGpE zE&VsEklN@p{Q7zz9wQ1Kf%yYpJnDq9zmv2X9ar%QB}#b-Q$<()>20TBrNUI#AE92P znPizsEoVr2f|QQk8)kt=lFQHw-cUCV5a3#v)>V1&?&F43 z*lj5cv^Do}I|r`T|90~OK{;;QC`%#|GoJX!i`#X3l*A+eTq!W&%+>D-RN;$hz@lk5 zTCyp7Ifww{xkPI5$3ZcabX_GfXxT(rDSZA#iMZbnCp->E_adWSXu(NB635?Use^tS zC96F^$4<8=IA%;%OO_=k$*`4sj_zomhBdbeL*D<be{l0P{KGA{YO^JykkNtmz-l+b703hB{A&D@b2}RG z-WMha($R5WB&cz+?cs(uG@*twK1{DM)>NoSrcmL5RlZf{8P%4Lf5=qrpc+kKPrf)h zp33}?F9|BvLJz`ZubwdZ;XhJI(a6@{qUmbQ7Du<+W=E}O9`o8FR<^@W4)GjrcjW}z zP>1@{fV{h3&NDFESSqiyA9FNG1bCC549GsFp>37wEj#(n2!73mA{>)*56r%TXU5RZ^gOgD=Mo%u{&55#odtOpjtWVcLuv zcNZqxg%^d{hR6@P8hP;e3Tou>m5F$+nE<1DND`!=Ef{|vUFif4(3BTyB~CHTp?Q7e zNlsdd)awYH5o$-Q+A-6vJUZeoq7-Dk6_HUuZ=9seYQ*pkg~<DDXrs^&0 zDhV7zFC7s$d&wjC)4T{OM_N!5%%?$$Q#aPlbBDenPc;jkv=$nyGrQR~Oq9X+%Hx<3 zWka-OZ&PN{^pPs#iMtw`7SnEfM$bUmriBA@-%i~ts)Cbt7n%v>1&O9jKy2WNc>y#w)sHfy7)NlDPdfU$Ucj?nr{^ccvoI??bmgm* zqr;@VmCzZ=KitJoVjzN_ShonzQF)nJGU?o{B)`Sm>7z{R^n0-h0{5z_R z36PJXDqcbm&I1cE71xVddRc|s^C9fY#%ZfXL7eOapM-dap&nUS2R|`JvA}SG;l%+IE zRh9Qr1spAwo@h;}a%LR#i*|L*fXU^x3Y_MI*RBQgY;XHv0DVFt z{>{(j?cSI5j9scTtZFz{Oh6Qeb}LLKEP|xNlsIoqfK0H(J*WhqVl6_)>+K_*H9j|X zYdZlSC2}#?=i3$bHj%Bc13u*%3x2sw{gCPq3%WX}!ZZ`8`A4Txpz3QlJBvMlzEHz| z1P2kxG(P{r4?!Ruh;(rzl6wU?Cm^QG9y$o>{4V|rs6GX$I~Qjw)N@slM^tHK{=Hvl zM_Q~~i&fE-ZN<$1C@_bW<(jPUn0ewVduKKf5ikqIR=F)vayvMtfGdID%BP~k}$M@Xxwp6&IvnoKfXXa92 zMjC+L7;|f0$qYhQ#y#yX1y#yqHDl_sewvI&G}bH3rab*gKCyBHor@=0tgL0tC3oUm zRB%h%2m*|QJrP#HK#0yAvzdU5co$UrP|YYs-uDyRxRw(ZYUS17Oz(`!rdv3S<#9X^ z%feMXTwqoSi^2VeTy!YsL)}ne(506q^ETFC$n|LQPf!Zx>LAHgv@yCkhn_j%-)5EF zCBZ)`aq?tiBI`vsT6Sb5$9WZAhRQx<4Y%A%Rcq1ZtR0_;t$Gm85@7kDY!VZaDUTM6D5xz-CIS6|Jt>|X zmrA2JAxHaZVeUD?jkX(Ay&G{-YtiZUgYt&p^oe^<6FiFI>|YR5tg_#UF&h{^yyD&v zk4|bM)=`CXt$&&wQ*L9zfxPE0ikOex^^HfIPm>ga@)`}PT55^@M>LQ}@(fTlg;|a= z!OQ#TbBIUI7+F~uw6ahCX9%d(+9rePqij=L$6 z4R{u)y1**|VXbe619R8(G0Nv{SLTMgG0+oK*)S!W9qC*xPJIp(I%R38hB`<5mDUwH zB)U&d*7{K(i`kLeOyI&#!~;a5V;SsUFJPQ@lUA$V|EI_^tk-(JQmjY;r1`mxGEhst;hLX&l;>kal^X#OxQ(e=qD3l}?0+fJ|@#v?yQuVjSh z>r{()I;kP#$@1sUQhdk}&}$hbP*JfH*j8&yiv8SKMx_t2g>uT45D3x3@rD*Ss>#x{ z5koo{WJ~Lz8XXjJ4MqD#`*5_@-APb=VeU6bsgnxD8^^?!sjYHxo})#8?e!x;>gSN# zy=DWedqrIlF?vMX^wP8M3El^`~ z!eNR6YtOPi1fL!q4c3N5Y=|OziUv!J{y|@G1IUeU9{zo=*KcmE*+V)J;lqw`4~^46 zAg5m097dh!`a|{>#4`0hjdizvVZtIo!3z*BGvj@^S)C(?)5iTW$KwqeiHH+AC9Fg> zxC)AzLaSW&?3Re|SZeALPquMsfe?in%s-WM{T?6LcNk6hTSi6Qu^8?KWiJ@#grlW! z4+HhGCgV+qmuuYqUB3Jaf8R%3kU*DrWZCz6k8lT6v9%LF#_xdwWSJ|V1NWr8L+Que zZ1Z@#cP2!?qFRyGam8{53)WDtyfEN!wqNC_k+$P@&vkPASI_f>N#)q%JQ#Q$ew`vP z%61UY7^dMNo}EFVf)lx_wm~OR(glOGc|5a6U#Lbt21AUAz1VV~02J?kgb;RS+TFed z5t1fIzwy?- z@WixTVmI8X(Szh#tv1CF)=SF{`xk~yEyD)Ri0d!Md~c7pLxHW6 zEN~MMAIh4jCJ-%Op7`^qOnmHYWhGv1_gHkuDZQUg4t$)>7y9jGb94X9tuVW{n10^> z_%9%DEQeU+&E4r? zxyosF4tdml7ZIwjWj(lZzTowC&frzUiz!N;@%HuK{Xg@6 zN%=St?bhg1rLbI5@IhT+?N2X5HRdsCJeO$~ifYYmL>W7JU@MF8;JUnw&c_2AI=ZhC z5Z^GUoAgxOC?(6nao7e?C@U_3Wr4mK*I$|HLSy*=fqa$)9{{S&Gxy2gTI(#AS==`}b5%KK^HDav zc!*a}6Dw!)IU+8~`R7ZunmWS}0RP=5@e_6*A>^w;axNO3*TtW!iA_x#Z*$UAaoU@Q zk~Jo1v}n|CNyVr}?MvS>Z~N9a#6~*12NTY*U$(K*68J{y-)y4`uUkVh>bYBFY#%q@;HG?#M(yNUa(HN|DI1OvTv-_3LX-*} z9i})qof%S3;7Kov(8rac+;Gpk5cdS^-@XgrTt3^HIgb$k(W36hL2De6^4-w=Oj!Ds z_GbgG0Cj&6gH|5sbNpsS_a&Eb8e=c!z8&M&YQuI$k=nW9dZsbmvi=?l)?W^t+guB;$m{=)iW^#`3FtCBX4~9z9C@&>63f8 zs|oj8u+xI?bb!zSaM!cnX{)U>mwGJb?YYUFIoIM$2mUUDX)cgnBamgNPw6J653i^T z=A8oetXy*`*Feh|o7cwIf6t$v7i&Ej^*_7&6;1xi{iz@EAkC=rYIW3B%oW>$bJUd& zNC&aKXK5QCrV2?ZBT;>Q%r#w(4uF3!{_3Y6sZ_;hYaEoW(vT0}z!57vLa3bJNX;&H zI#-H!j*e(ONy+e_gIPh+Uy;F2glbddrBE)lYX&hsQ5V){h0ou65_{;_-15E=t-hgYqG?u#Xa*^2@y`#r49tY zV>A|hB$?>Gg3?oWOin8nf`ZM?MG0`fRNTU$SlqMnYRm6k{0q?AEQWhyc=h{iNs%2c zJj`=a$EEadgiob7Gf?*#eJvAk7Y*fWt)#MB=w>eD^5lP~hifDYkBB3yXwa#8eqkOE zLV)r^ue6qe`h~nD)Qp@%JTOh5O+z4()u#gXL0X*{u}Ihe68YDL8p01F(Goh*;PZQ z65Mq}-eT$29DVQ(8OiJp5n;04l_fiXBQanyIQ-sH?znyG$uERh`I}aa=F7b-X|OQL zy13XsIIzmHU>swh+7NkZII(O92mDDX0425g9kW_V@`djRx)`NY?;VPBGTt_9jyOO> zoXSiCZP~LexsH~N9{hH$hx%W(q|Wo4Mnz@m#5N&^i!!atd^S~4t+havDPauJpw-4w zUF*K$-BD@C--zw{-ETd8ypePOMD>trEyQt=A?WoJG zZxz>%HQ{-5{zkjDL69^)I+QHQH6_cq&CC4_D%?LHv_+I`)c4w^Vq&Ev{27hX%uVQv2F*g&SSIidOX@zMlzl0Q1R9SD?@7uX zI98dj7LRLrBuFe1uKmj?T2jgO>{K<9QYO5NR;*C8I3?K))~-uj2;D-KgIBie)5XlV zZ=4lObEFu4h1W=eG;w*o{JPW;$pGOK| z%n-dfHUd+s!B&ujGdDUPw>XyK)O4%KWaoaIgT%04auQ*i_Z(B|hqW}*?!1ne3)`F7 z4o;}neNM)r@Smt;sc(WYS=p&}_7zBc0GyZ_$H3g%pw;?ulArJ~hm!Gtu5V`#6da4I zX8tTIpj1+5#C&jwq}c5> z80)?KGl$Up1&REt2+X%IVUl0z^pgae?v6hln3^b;&8*MyHi9roaEJ>2iK&(-o}BuC zOm|bO>|6hQ0y5cR|8o2d0s0qh%0*>`*Yq&u#@+qQNy;2qTJPAf-A%hPra=YYxR}0A zLeXp)WyFEb;F~Iqq(HKQ?P1ToQ$UOK*)I58HcJL+AAS>p*fcVhV$qb8jmNM;Vxds$^5fgA94QXk4 zo;*D}R7O}NB*e4&hEY+3SkW(nM8P^i3w<#+#%4qcI?aQ-giA?WQEq_7^G0a*EWaGD zT}c{G7LrvLejos`X6(0+_L1boA1$+D&hcQ&8B}pFORfO2cd9(W&6uz&`v@}7OJdh8 z$vR?2m`S0RaA2Spm!H&XOvP#zB6{q8^yqO_hU)RjsHx7S<`@^zf0a`7jmR0Q#Eo8q zbbf)Ai@Y0;gv(e*$eJ-JkUfTj_{(sL&G0jnvqMGyQwUkqdyG_by!x7y=s7O7**u(k zN+=m1tU`4$Xgt3N?at+wTeT}~|C?@p_=RVp8tGJs#TaucX~nX`C;YijOC+(%Gd@6M zBBqbQwiw5#%GlA_6zcZdo$pmi^ChHd2Xk91{pb0(U6l>8;Z-L`8W8mMg<4DbY~t&Wk$=qNSDC-w|L1+{I_yBD01p+~q>+T<)nSV6se%=?t@~R8p_q3_NazigB0} zmue&)LRWpl7*Zr`Qb}nqzgJ|`q2Sl(Tf=9qP_;(+lMt4Zzg((aX?j-t8TJ2PnkVz& z#%txIXmA5cxv)u9?|V|-A9oE5caAr=4~X=sdf%)eOW!`JE5+z4Pbv&CE(Gp{A`T9j zBdPj2O}}C4JqxwQ^VyL8-!jRQ#03$a4vGPydzflNKj9<9%uAfc^>VZhWUQl60Y7Mq?ZF%D5BPZ)imhuTVQ0Zc>|j9+>v zE;Vu$iKRNsLzf#-J2WFQo{?F9QRuCcw{rhyh4dOqAWn+bl4l9VGpvf|E9GRA#2&$$ z8(k!cMdxG$?*&Bc!^%H~y!sBP2yaV<%zzZPmWcpoxqmaM6h6#Udi+N%nRu9&RReNpsu#zI^*PJ$&TrlO*`F)kh5N4%$9jT z88BJXUPdrLDH(CJM{jtsYgDy(8Y9|}m{tiEB4ff;Q%qikw%n4{>WdH%Pp-akI#%cN zRb%<7SLYYd9vb;*TAyMsra-I`vI})HvgYI$=q!dyCi7ZGH0>kLbv47%C*RrN zAbhDU0EJ*JGEdnWl7Q>qV}VRpg*!BkSV+Dhg@LHADpf5cw@V6(>Z^VJ!S7XgvT3PM z?VorJLxQWwhr8@`yZozkCYl0IKMy|G%OoyRVuhB7DY?m6%lCmZr63W zd6uF*g{!hx^J0An2-FEjD_z|0EhH38= z(}&o#@saQIGJaS0gcVeUw>?Ss8+O5aqh#BJ$E*oiuU5pC#7&StIVof;GTcz7N(qEPn(cJX8hqa8m1%U$jEs8NB@H|vC z(}Y*Z?n2FYyC4)3pgHrn7Pst6RBQL>5`qVMplHA#IjJhgo-d4K#g$6A+bOdd?NIldJ4nO|Uo@kCtoD9*G<3jD( z#E+VtL!2g`kTHUeCgzNHHFAig!%(&Z%u9g9U|{dRsQqONBMhmY z*@s7-FLT};0k(bUgiV2elx&BVzvej1f^$=R84sNtoqsIxbg^9-xO@EG`c1{nn?M$0 z8bflZ*K#%AoWMHhKo5`nIR6{YgO~ntEXUB9=;ACAsl{b^GEpKj)LSrQ{m7?3-^8-| z4H-=`vSUNe4{6k1;=N(}t2!}nN_Y#$Xs$XR!?(x1$f@yh^wT`V7Ouda13K&JOtG}| zD+ib4xx=#cNqKfXuDd`@mJSOJz3*1lZ|-sYJA-@3BHGiqI+t24n9m@h;%;|^g|Z(G z)mC^*bMFZf9A!nN;E)?dV^jx96s@>&FI&7hF5Uu^%kryESL#Dqar6W}ejWrs*n1Q; zy#&@qHxJUGqXl_`3qxy$ zu56kR7iz;}M+kuSx;P1qBZWt@a@4a99i3jIqmDG1uZg9h+QSrnl7*!!(KFBYr3@L} zx$QR@U-my0RdPuA2gDyLmz%b8JM5-mVl*W?8D8 z*s+>;!<3oOO6B<4kS^@tzG!sySi%BAccgNJAIcvpKc6Un5K|0zcz}N*ZcXpc!4bqJ zMiI>jstu~T_R{PiaIu{fO>}%VV;*bzyYNv!6OG`&$mYbzGg4QKy>s}nnnA!9zn;AO zyV(KSYZw~lr@pxaLD9-;jmG=@IET!OMqx>iRF!5HRWk=tv4yoDnpL^RQWH>5@YjWX z70ic;%>MEdKlZ@GaA>xJ)wDWm1bQzVAuLG~f#vi2 zx8||3=jfv7M-oMme}h^Y=vF0xy>QBPD_UY1mnxV#%o-nsG}M={Un&$z;R%oLzhA1O z)qX*2SyRbXhjh_Poqk-T>f~m1Svt`oAEP2Nyt9QTg=Nc-5&1|Kx2=Uf^5UV@Tw5Yd zRd7`&`s%}((X3`V$?>)b_%#EC`=0Fv9WtW75^9ZBec;}z=n?|8oQ31fOsV~ose1u1 zeUnajsHvJ&hML67@?X^Gz5kCqKQUEqP!vAFIE@S5oF4=^6c+K~v&;?##K@gYMWI`I z6JUr!Kj=;YbM~#rk1=?Q^H0Vl%5}@7X)NWR#MEEMxf^?J=q__!<>tmRh;N`$SY0b+V>+_5FPeC)JWtEYpqKLk}1 z{`lfhghupxR8YZv+XeBR2mQi!Es(nC@sEWh2D)@*$1CC%@ghF_-;@Li>mv6W9GYBN6J zd(Z!8KDx~#X#X-vt;#2vsMK>w*NGTPWs$@C7(y(OlF$Zo&f)I=K{jCNg~t5disf1- zw-*bcV6{*4(tKiToc8LVkZp?Xp^sGSp@^<1p8DZTd5@J^6y3d%nWKPnqi=AIC@+Y! z!Rig6X7#&K{84&&tWXy4k$|+)L#`7=crrQLrw>!YEv|yb6hOIE-7Dw`p9+c1COrmif$Mzr_lii< z@An+$s@}@UGObfhnPVHZ?E zH2=+>e~7q#-49_^NXc@eWE^lrI=2R*4Zx2vguu_6|3C;Lr{w1tY<>y!8T)hQ0879J z?|Nrn)!?FO;Rk=G z+M|XAF#R8=Od#4nQzy0IE%Y-}HfgPIJe&R~E4aw$R+iu(1h#TRrlvoX`1o%X@!3Rj zOIPM;i&t_>*V6?Z+`lchM>?nIGy%NbE01f*2$OsnE-R~d(l|Hm(gNgnKGY^0;+&2V z#h;kf0*r1^K{~gjeSXSfx>_6cMlrQ?^CaWKgzJ2+7~>PcmbRJ3Cxe%v;bANxlO;s^ z2&b~dQtNC&RD4`7i<@1hjVnU(OHkPL%OFeZ^kY53#ys8}9(VTP?)Kj>gHIQ=1`i)7 zZWwhys8;S;ixj`$S`))9i|&5@#NMbheEK6*IQ}^e`IN4|Z0ZRNL}S=4clI@ISrMU27;epuVG+BYRP5NFW!raB4S0Ob>Fb*+$CqqfFTX@mIL2Qi)< zLw51-|IGg|bGrAUWCc5zuMOh$D!YDZ*BgWXt?788#QJW~>lYp@bVaW!z*fNg+_(G2 zq(A)2b#9OpA;I^s6dU&ZZbPqX%kX!T(?hz3>*6@XC2R(joTPspu?Z1y-Z5qLWt*`E z2T-YHnBN%E#1Vnn)7)WBufgi3+J2zMB`V63BpV!4 zrEXSDlL;xWHLN!%-z&4!P?g)CvrzE5eDsP8f+aeFt5&;=!U?>wHAyx;5zE4A30c@# zd*J`zY|kr%GU`|2k)P1}!pX7(1QOKMIq;ge%Z0#>ij-63Y>}<#J&knXTG?08R5j~N z4&WO-7z4v0<}to2XZr*`IeN#`sdpQPRK6CuVc}8&O?xM1fb~?#&J!(vLV2f?FlY=) z{WL{m>_0PeczS2zC5*{rSmi$ONw-<(YNkyIrva`0S2@=kQ8~edh_M54`Q`qMoMPyN znael0cS)1^hIE70MxpAR6T*f9D15$lL^Ezk`OEW7rc`3ocB)_*uTm4r8L$VswJ&ou zqKhdk5pDf9sVzFOnAlvs2OJWk&E6mqmD8_TicE|{2ev;`wTGMi&IFSTbZMDDVMiXd z{=nozB|_w6**Ky!P7RW0Cphr6FQ@n}TXQlE1!GvU85IJ4sX7FzUYO?k`1K zv_JA&OxCq-2r;I0+(WJW%Q0n4h+Do7$&8`0BHf>h7-@2i7w%o2flys|N*or_hcbn= z=;T)v`qhF8ib8Grhcj=Wow6PLRro5@c73JZ<}7=@O;(4dJbBcs;RHW? zjHNUI5hNxS7c^Wv_{#ATpMMB|2^o)xAQ?{e=A^VUKkW9pG|mAWJH-%!Ri5zmVDWGM zmh?uH#9N7vNFM#W^s-!y`6LsUm|4 zP6#rHMICLlZ7#GeT4_SHnBw)aa;lFHCiF{~f8i$5m6Fc6%~`90C66Le7BT9})L8OH z-vDm#*45w<3<-tKOFRSq_2!rsH=cgn%;OcqX5U{C6~9$sskK0YfXl?;6|!b1}U)Ri^77u9&v8^qu@kb)SqYLC=oJU64 zi!@WBh!;`fBmXoJ90Gfq8aRC!@PFRt7+v7(2A^ zJ7PtP2vKfNLl*#hMqk%|n3Yo(Q#%p&AzcaKxZxiw=*v=E zP)9;s<)?AO+jHa~w!Z(h+-cxw4IV7DCu3Mb5P7!pWD$#eN9F!&S!8z2>fnTvRh4>} zfkP-{t_M*h|J5&ram;$Gau>F4Qk97~{zf61JMZJZyBdNP{<~#EzfWoL@B0GbW1gpl zmiZgKhDv%hH%8%cH|9SUS-yZhiV4syb&KRMM8uk#@ee*N@9?ApB;4ESG~oye3oV7d zxv$eP<|e!FDwrZ6X_Z)y_K)1)udf&Y&VFim!y%&BtOcdhoi)q`8i|>8IuQO7!OJxN z0hPLw4IQ6ImZe@G@4$T*dW%6_hHDV=Qw8VAeVQJQ-trkxx~wSS_e&!FMJk0$Tq;5i z(vprBgMPRe3d(+_AOnvex%uD2T-K`T{ldv}y(}qLA3Q=k*-|{vl7C;DQpx5gx1mT= z({U_a3C;l25|eCEz8+WoW9^<(EfER$t9lBAV6}}L^+~%$pFw10+h0f)S z+}TtX)iI@At=$2)v|N1+9!+JwnQDE1PD8{B4QCa>IEI5ZHR`(FV^C%1NsS9$AC z-?L(!Lpiu}N?QQB=)FtZLnw@*_G6TTnNFB4W@uSF__R{8&kT)VV;NQol?5YcGmSFp5W5WhWwK zQj7d3_tz^ON!;hEte6F9E5VnJF-RGUx2!(hWrpBUcOXrb)X0c)l5(cKjd@4!^4v+> z+gvYlKWb7CR$Uerk3Y168yAqyu4~0Le$`e0s++GmSX4_p__$`44QdtSl|PevieUPg zYMcJ&%Vl~@ro!|{Tp&{Zup3wJa7MrkA&AXO-StY=y3FD0Uw~{$K^T-+H5%W%0%za_ zu|mp~bM2MwC9tP4voC_+h@HC5>k=U&q!Z|ngNl)LrFyB5*X7x`UzWuL{9i^`?3M;4 zWo2}VHu2(~xOGrBn0<@X|B>?0j%V4#=T0ZlPKR#$mYi+;dMj40q$2bm$t3kU@7l5x z(YDGj%aF6&x>tf1R93D<(1naOv8{*kK=tq$GZbCh8C*LHnW|E6Uq7KL0T??@Oq@7#ZO3Uzj%U3)hWHf&Sgq1o6?WtJtP}w@Z=? zW}CWCUA}yd6GYjkA+wYcRAR?0olX&)YsMSV9Ep8$JT%*1ga>7>OhlK?^nz_JHLq4S zlD9X7^U|wiaWcOrPT661uV1@V#1Za`1KVpAyhAG* zzl-s_>>2jDgbX!?rf_A*bk<-2gXNw^G~fs_u9u`l;;h|-aV{bZm91Ebd`|M3v}x6^+WyP zFXX-#8}<#+b3*uQ(1>{RaO0437d0F|`V-h3KL_V1;P=p(p1J0Wx|%}3KO)^AHprIP7f5!&X~#yV!SBR+Z;%JyM@|LQ-a7xas2Cx2H;y;)@LlJG z?col`x!DPd1Y<@OEEf(@$d{r+9g#t{+{jf`4UrnOGGMcY&_K^IAnT6q7m}lN?*sMQ zW|y=r8yss5+y{S;VDR22R5B=`JA+uVdzDAY`Obc+Gmvww4{x!3&F11OTAcaXg}8OkO%#hTN+3MqV3tYG(geT9bZqq5pd85su4V?QF#qfyeR$3{L+6H-K(U#?J+G-|7?ew102B9ZT9%Rmp9eD0j@5d2fmBROnV0T;?s}r9X^IeWRB|zT3Uvy zNOWfNH29g+q3!6u>OS;+D%^RVU2Kc=$NgW!dxB)szvDhy38_RFEanK!p-#Y!yo7>b zRRgP|AOAugGM2Zlcx>>wZuz?Rol9rPf_}*)Fh)hRuxVK(FgnN4F`DMp!*Oqr1@%^? zc=6)RnQ@zeqC2%DU3m)O(eNgu8?(<3n;G_M?KS_?({XIkZuzkqq=ub7>FQ=%xqtCV z&g(`8GdBpEe#{qdihZl*cAOmAZm>v^IRz1lWU$S+!;-(9WTBVM3kYCrye4vM;tqw zqMr+vFD$f@y**qCAz7H}hNNa_z5=(UJ0FB%uoR?ih~{z{3Q%cIcY&(9m5^B7k8ut= zE#%CuE5R$H)wQ9&>cgha2+4d^{sq`;k8`WlRqfSUyS*X$|nmO^=IG0-roT7#19)j!z;l){)_EaZ*gvaI@ea1>k+JFs!Xd}{9}j-ZA|M>at!KDlKzlY(LCmQ4pk zy5y42>F4>ab`4pqS?CQ!pXqcDE&Zp+AIvPYGfA4g+9=KElMGrasnKs|rBx0cQ3aCB zsqy|(j=xY3=a1HL-(S@Cf=4~_Tl1}KVsIsz=iJDGyl%7amFIv&1q=V8q?ov^oW%5&-R+A6kX3D zNxQ*ssjE(v*Of||CSm71h*=jV|!Py2zJ)24F7DV3wY*0Xzilm?j*<*5__FohUgIpZ8)cOX}`v7&z{Rgzd`exNWuFo9GrS=oE1;0uN%(@(4eEEQz8 zyIrzMpD|KAUwv|iqsgb~W~G`rWh*e8o{3-J{@52;gX@^lOR7yWk*f}PAE@i+H_wac z7x7?0+}~7B%~xN#{hIwCdi`i(!1y)lr0d$NK+4T*{b!j1_=_s9P5I{4Q=v)-cEsye z0k)p4;=hCsbmzzvrh6izlz6e`_n^zYM7?+&D#@GtsoGJL>`vlKRM9BLKT(>|GkM0cv{K>9!B?P*L`~=;zNv{uPw1Hs1=BNvgmE!%e%w5yN zvz6ixr%6A;vsm>smWBZ^qpzyOk!}O`G5WgsQ{fiI*yxt7y_nK5+$YNwy-2@|r$SiC z_yE#aaq8%Oqo&}znVW>E;1=N>i+SYr;U~`J^kbL_Birsj0p&MeQ_A7`4ZGV}e7dgS zYP|RP+g3+6CqYB=)XxH{hn`S+?XCPzQ4KL3GT@d|&=5es)%t6lI>W3>w@4A{L`*E8f`reUSVzF4ER+(IET)QL%9sRjksF{}Z~B%Paa!d8cK^BIxIPD*L)!oLJ>e3_ti ztnYabP9{620lx>EMN;rM*N-+V)?dzkzxs^@+t=AInmPU7yt7c&EFWp{vyeg>>Ya>F zTyO`3w5RNiEW^m`U5xh%t$Lm8l0^%rE@=GG&K||^Pp9LZNk)SVdr|fc=g^GjTbz;2 z{F?65nb4Qz`RzL|XrjIQ36z0G#-=SBd-x8K?^yD_2md!_Y>m4it#!$U2zTSo`_0KK zIP7GrjrJbHm?DFe5!ap_yJGRLV-|b00iQyBPUL-y2e+}7l-vCk#X16JC|&gx0RqAQ z^_PXjV7FX$yikyWdXVvCHzP4%Xnp%Bbu2XG2J88tTZDb65(C?sf@=9Q#;0@04t(Ak z={^S!03m#8%@d3Ldhy+q`r{rCI=Y)u9W-TGs!7SHAB{&kYC7}jG zb2kBC&(e7(+Z^_uSb}x;qioBiE2c$pz>R@i5H>Af*lsOInfX$rc0EX$9=2wv_xsM9 z1GlwAY;LZI-|Rix&DyYaFf$j0#Z5371ffe$AW%*s=!F4^LwbpOcw*WHoLszcjbmbt zcDg?Wh$*dooYexaFReA1uimC3I#-Vl={}t!{+!Fa3)XmgI_j9VWx-rz-9>N%!20m+ zL!hLc7eCTX*yQ!Lrt0zav>`*Bv}c3AzKO=2=u@vy|B-S1kJ8XIlCS`=Bnl(AnlQ+zQhEr;c(Xq9 zE(@{Fbr12E&_C&nn$4}buVQno(-co?Y8oJI=bQp3?|-A&0=EzQUjLBX(CQMeAisB9 z2Kk3b<=T4wWppKQS_E}%eGbVRx>wIR)YnkM+RDAse;A-FfL%2Hb9Pt^%wdR5SYHP1 z7&BH!Mp<|K`~X{j4?)?L^H_ITm)h1NTVXufVpvb^7tTp=Z+tZ{qDs5~;o~aTPBY)# z91Kl4V8VB;STRRZSlNjal)PX`TMNWHjT?h1=27tsZGXpcwSmGH0&mQc4Gd7NEt&rN z;4B}1eEOj6)nZI?keIFI)MES};xC7S(YYA&Gp-4O;%>#<>bMKj>!d)dj%5n#IdeOU z)kEGaOw*VP!9@M^;()HZGK`H-JuVm4SLv@jDG%STd7oh$aFw#yv%GL@mSWJe;2ffq zo%{_}RE(DxrV7Ax(-VOhQ-iOwA3T1B1sHYAen>`$o`5bM6Bp$C{I%|UPi||~y>U!D z0TzByvAsvXnfc@4*zv@QdyHUAG&iO3ABUg9VQ^Wc9^rQQS}aDU+v1`nsfr2%Yn(CG ze!L`R%|iDXsX9)18`;D#Y#0HaY?!z-JL))!2xXbTXs_@#$_BA1$OU~eC9W~;Axz#y z%^nUyua|fA70lkcC8!LIgVz2BKsU<}u@yfn?m1LZ;6jqu9*;qA~=y-q7pnF+04` zO7%jR49$g~bT$41KzZrt38b2?B=-xISEe&u-HJ?LKYWl*6f!4}o^5sAv}!WBbSxVG z#lkQ@cFTBUij?zns3%3_$aP5SZz_|bZyvoF_1ME9fc~!Y>tbr7#BT`gSU#bE={{pc z9U^n5p{#;?OiU?x;Rbx;oXU3z1@9QSL#3zXA;<7iSgj%<$|cm3<{XHM@qoN9!F zLo%$LYI+6jPs7%joaxF_oxGjmdeB-+703{t`~X@;@#6-tVf0H zHq>LS1AsJ$h$9m4-j&GA03AcshEh)B8TwsC7T>?el5jxkd{vgU#;y`dvI-vs=~n8h zD`&z;lY;$K*pw#8jG49AM0!gi-ado@!^782Ur3V#9c!eMH5)+xvsw!4x;UdFNA&v!$4V6PJf?k8Jn783E zk2{wxEY!0l&!oT~DuvZ?fifT!q{YN4!=#WRVP^0?ez=m6H5N1S$t8`bM-^p2>>Cb9 z`W#Q~#E&J^H3m#<`_LpSO+&9@wuw-LxR`HFEiHgsjzMI$iC;8wQ$U8!Iu!!=fGiv5 z4^qe)`EmqZAtp4sPa*j&985|^+{Ov{8XGGY`y+W!1e;#z5LF108528+iM=ifP&ypc zF5{CL^-VbHO@QB(3VPD^W7G(62HI_21A~XZ25M6>aPq z3~F6-Wj=)i#-0(MF}9Nc-_!8avqsYLpRdV&y74>{B}=UN4hKYACAK5b@3o-xZ98Y? zNr2||@Eo^!K@xI>;Q2YeXhp3G@^jR)7VxX=U1fN#dcpQtf0Iou=W4}#6aFSPA1rs4llVPH`stsKsyl2!#HShhK_I*#r)2`9#x zz%ks1W0s+`KgOvZ5I4Z9Y}5S&`}YFbC|1do^Jeawpw&yUCG9C>t7MW5W*>{x!NheU zu6CDYkkZ4Yy8GH6uJ#M>R^LhHwlGtyTCW)KK6E1c!i&e08EWhLAJrV`S)68!sn?{3 zPOL8o^d~Zt!ZG|lfQ+pRm5s5ABj#-;$>Z2l<&mw@{1%@=*;*eIWK&AGph${a{@3;C zvnTjVXJXASK*epELDfo){Lc|j11liEit9MPsQu{|T6;gW$BScEgu#`hhlVRH~(7IZIQVeqIxYXhGU z-<9BA)E}_g_k>W*K4ul1G+ofiAK1W4O_!J60P|)Cfb-q00gax!(*+5Lj#ViiI^5af z!`6P4{S8LDXp>^N5HK$rKK&LnLo$yL%@9AE=Bz5^9p+lUd4)8BqhEQ&GV@vPEWnqf88Hzc|?ZvDPu}*vrrLN*0zY7r$S3<`d?O7*O{)?$VNpMmE`#iTeii+9@bC3gR!nYa zu;=r9M3h z5V7gQLVnwP<4hnH@BNU0XPp(~d*Q-M_fqep+P}#@O#2^PrW^Gc)D<8UTHl%=6CbJa zr-QHoXk!#VUb^g?rq$(k6WA`%+a}u+7xkRgxUdt z;!9SD2GAjNc5kaYo=}QIruc?EuMK!N&bn<S_o%;?;X$D3%FaTBMrLN%cUB(dPk8XT+cV259E&U6?o7*V_;W zviz@YcfT-CZ)&B;uAha_rCD3GC@*WJaFV>Vtgp%)?h8OVD^pFrKsP*A0KVgkM=v~M z;+C|J;Ad8U{u)PY*l;>iibVQAg%h`t>HberV_6q%2qG!Ytdq7;1f@@nBE_P`CVrFm zgr1#_2q7@LXI;jk0K3VU0}{CBuStnR*ET2**P{$7&*C*vca~SONZvF5LwKj;P|ep0KWl9=e`WDh&l@N+7>n}M@Egwsn2?iep6@~c zXJoWV#X(Ri3si{z)nU_T*EIbfp1v`@&gbbnwr$(CZJgM) z?Z$3w+i8*}Y24Vh?WD2U-Y38R^Lbw6)yeKP^PQR9+1-KO8urJUkg>_+)NAI0`Ff%; zjf2!c7oBA@=2Zy?f{o)1%0&x3B=Atutvf!!@%=9BY3@mc8fOu~KittzA(X^4zXkv` zXB-b}zPqk)1hM$t44CvT(xq6h^#aE}=BFyg-`;@MauEl)ID70j-yJh6@+o)VZ)OqI z)au;zGbq0cf1}ocA@dG~RcoVbVDcoKng41BcE3?K+2NW3(`1#ofHKqu8Ed*jJC9@= zTfT$4I1pY)zx7%xjqMo9oJugLtrpk)4dGf)s*<9M>JTR+8~`A+Btjl(>;grR64r5rngTy_;^VXZ|_+ zm>G^~mk{C&-KU4Rf^-u2Z=~nnN+4Tl&tHj@sI$@eu~Cl&wSY%3sJ>2@#=dr!WFBfT zRMg{wS+MnvGn@{?AhiGY0~p6gG!d$bqoDV!?w&bH*ZV;EFsuQ3G>kPUI{6m0EDWhc zh}RCa>>h;m3%Vc~Uzdj3rJStFoW#x5yTl%Z%?mms85l=@bZQD2!^H>Mjbko`Y$w@? z1ZnYrW!ZXKaRXJ-?$!#0oL&Dfc{0=dkLEoYhyMQl!2vsT+l{?VFaN?^8i`4ad~a1H z0O}wr%yxicOfyw3`q=@>*$AaP<$AaR6qDnD4GAa;rtLDDQ@Tv^xLf2s@xRA{e}8-a zk`>SkBOJ7d*{b6=?iz4}c&$V*_+ZD`g^EC=hTMCl$~(6-{Cc=KZ*|Hw9+G;93ZiAs z(o%xkAQ;y#(b4ohprD?PcFyhBu2nS1-0hrZ235Ahay}?Uo{rw_48c}<_q&Rz;+9-< zISIdZcFYAq3@nz0!1!5ijM3r{a{!`TBk=qBrI!~KsVEB#-MizUJkvo971~?($60_P z-WLeT0J)-Xu4-Yh-nt%VmkLtkM2cikv_~j#JY13_tO)ftmvshdZfp=rOn}~>0#AlY zXVAMgWyD?y33eG`5D)4zQC?}F^XWoD_*(=*-5i3igdQ#)%pbRYKh0xPd3d^{01h>) zv>#sQGl#;rcOm)o`Z;9^x1L}o=@1=GCoD%nqPJ6cQEpqV>@x`_St05-B&m*FsuPr(X7#&HV7bIwFx13Vf$AjB&ao}T4bv1FLPxVEsySIW zgdg~0@;MMRy`64kKJ;-r2bg3HTnQ(L*wlYuZ<=c>{0K4%zJsBHegX>s(m34Z_Ag(@ z0J`WMmL+`JaVegaM@=`)5yA4)Ion)AfF^;3ni(ZAf^~66=_!ltkfXavdAXm|xte!T zf|5%Rtym1XYeTEx)njMY8Ike`#f#=>I{3lnm_sQ!c5S<BO&shB~me=dBj`Q*uwLCfnZax z*x$qsL3ZqBSSpxnr`jKwx4X476WL6a*HZwWJINFrTtKbJW4I@<=0Ui*x49BlKn;hA zI;eB@-hSt<3cLOJsejigcXWL+&QBgz?d=)i%o$YV?~;>8x}|(h#V<|*b{sjM@>6rj zQzOLdpwzY{wmw=!B9k(lbv8G`6*d z)T~8erd|+eJZi(a;$ZC4H*&9I4W#)Xtl{naDv^VpP5-4ufS z84?OQGTP2q+hi;OHbtSzowg`}5Ca^@S8o395cPi5DzfK4-eXCOUS05j1?w&unqRW) z^wl%;pE8a^CgYXE8IaAHYB*d2_lRK>)-P-hP2GUTQt(`XpQU=f6!LK2Nd=KPBH?ua zc?cCe@f=rmkb~{ zy!rD4of5V6lVEi1j*^oxa$b1RqVwlv*e%u{s$7YW`jj}0HBwur+7SF2JbXLIDu`=G z&tgi#+C$$`zA?4DA4^pyn$%7N)SZ;@(~n{1trLXNh!kmCrK1dm7+^0Re=XD`wB4Q# zKPHf;dnD&YX30xbmExqr{>rm&eWU0+?GEDi(&2$u`-)7vvhR7u^2hbcg6Gf8@ljS` zk+-#6WLYl-qd>dN0!hhbG*ZomWf5=X@%uYg3~tnC;7$_B?3;*Xm+tS?W%sT|ONGRt zBAgi?Rumiy6;6?B1q>}&PO*VJP;;%R@L1wZlD0-mW-JhsyZCO6{bPF9K)!ng` zd@)iCeKZ=gkn4pLnt9=w(q!5=(0p__{SPmkgehAfj7OKu+e?us-8m>ly2V{O!CXF= zweTeA_|UzM_ny?GeE0i>RNBHOFqJ~l(yM=+g8KIR_{aMidiVFv=NrOlC7#|f@{M05 z(v1eaIP>?152a%1N;7Pg#F<;vOMLipyJuOUez7!3+%}c zaIeXnQ4+=cP{=^}V3xgpW5+Ert& zx`BR0GK}@xoqses7N|AtGe1gj;D(?!I%i5yO? z@hLfjxUL(ULPK)C8%=jCc*f9!`_A|vFiSvZuIjdn0kv_|6D^`nt;bVyED_RX9e+m! z0D|P!@dZ-Sgo?(7)9sSWDM+1h|1}L}shZnyDvnE0{&vs24J(%p<`>x-8agGU*#i)6Q z4X-rgxM$C|wQR8GCo_*kI7xq#<}8#~aSC8Fxc(g52}>Uxa{4i z&4P$^=F>>Ne->Z40L)<@yNO;~<4jAPRGM^No@8%WJ@RMqWR!%rx&;&-hH7Oa7ggg5 z#cAW*I=xa)Iy{+&XpWRR>;JA2{VffPHCwMa@G6xdS0jyFR9}M^u38^{7l=x{YfN601Y{jTH5f1WDv^aQR$9!nayZydmZj@EU&|o>)3%*ZJ}t2i5UcHqfrB zM(QuHIe(l5b3%3}=2KS>gx6Ln1xrIX4_=(^hh_chL7Ob*MX}vyT#A`ZZAEX(**2GF z>m4Cq(0Bu1z@+6xMp9-nIlHJ;5&rI2_!%L5fH|>dBP0mQo7UR#BJx)%SlzC2#Q;+p zm^n~`KQe@OKi2wNi~?A~R7z&i0oPS+dK$^fisZNZCr~#d-amxK))?NP0ZFc9j)jCW zSL6S+j_4{~NrJdFu%_uommoDFn2s9h{!>hL0OXo3`9Ib6;r`{26$rn5 zwozbBcaO~3Z*!6fREyeV?%L=MRBg_PEjgPC%f z4B|9o=B0C@-!iU|;}vdVlg1ygP@EivUlr&N;er)h$yRWi-&j2UDY+8ARqsS>hv_%?+q~7&AFxQbh1Ct zXpV_^>$N3XLqXi{TBLAEDj0l3f!F+A?02|Fxfay&VxO&;9HZ{XGXSiOWu z<{0HYr=uBq`w)lrSb{P@7ecyGgmIRfHUk<^_jBHCBg3_Xs6bB!i(XW}HC;s(3m>%0 z;fMW~h)tpGY7;Ju$sYvNjy!9}ab1UR8;y64t^AtfTLl(KL0#u99rZBf#*Qo6FVv-d zrgI$r4o~KVmIkWwh(O3l^sh}uO0_snO{LZ{t!}b-Oeo<)^8)uxMSN(Wp%SI~U+ee! z_PLm3Bu|O>&j4TjG}=*tkcaCwzS06Q*YTb1%%qESta1HsS-PLUcNFnPkn@3o7-Y`u znw!QZe09ZF2II|YTaDm|5}803=lzIUt9Jso8Pqd{K8V2l zPkMZ{{&dkQ$XfugC}sD}k*%wvFqR;OY#O;6curnhDqiOtN9#VFWJp`3E4o}=L%PfT z$6V^VXcRs)7rj1~5(RKEUWOSRTJ4Y&Da{b59tT$ULzUc}5PS;CodP-xgCSH6r%*(- zSb~#VOJKn5Ov9pRhnPUyCS|jpf!7})S3s@rK?E|Gx%4CnvlhA5*wWFs$>`2f0GNk7 zby=UGO`W3Q5!TxEAK28oUn@1?;A@{Kfwl zR~bn7GB7~?0ZC!KWD`E(lw-djGQ5?>ktm9m#&igsG;mR|u*kPSR7krd2a5uUhIozw zaZUWOAzF*k5aJPeEB=kVoCs+4yAFg|YmV=4 zO~x@0;sgaPMr4H*W77avZ&z4(E33S|lp)0C62ta+pu}lIOxAqdUNPiiTq%RNhg8L^ z63y^QX?K(?<$#<&0^Jw$KjlF&e(>C=IK}p@#Wm_?AsaDBqiYPliN2$veHuX!k_9zc z&nZmsR$B$Y2TtxvG{WqandE(bw&@YJx>+?yWL%@+=r?Ld+%@2pqLv$Jm%xz(h|_UD zI?xNS&T;Z9qS@#&#c1d$89mcZB2Ntzr3^RVEHEyIc$l;I#MPmWS|$Ght6{z(dE+QJ zUpnts`8!K?i1h8!n=eVmIUqLZ7q@%7VyfX{FNt!`#I>#)s|T#(3LXixmVb0RT_kno z&O>j9ff$q-D2dBt{_8hXk;Q!`j6~6r(k&5m3s?UjHeHqd!#ZvX*2jqu9gjBjx(2}l zj)|~pXXKNbI027m+>*H?DaRtUCx%l`#R|hAU48X3%{I2yVQj;@nauq z+SogXYSd^M9=n>P;TO0}1)CojDCo=?nOWMg^x>`X@ihb6AOLF9D*JYjnU{q)VfgFyKjSp~s~<@Rx+#Bzh<2%%!GD-E!X?OB_+# z>C+s@AxN<^M=eS4?pB2x$Ddrfl~-QOD4zVaXlHwBvMVQ^sn`I@oNs6kLmtqppumvX z)o3#PF}A+W4cIcVdgTP>{_3@W6_;3Sc&nwJ@fWdAwekDo_k$?xtl+bH;9Z^Xun1D! zi>qYnI$~%6(ld%*)iE|<{%0runFBD_E|y43G=aXa^Uu%5L$?mWQi(C0H#J$7arFdwULzM{y0#x7!36rZN88ozaG|f5iLZ-W_uOJb9OkAT&#A%LPkoOs z&+V{A!yQWp|9J-H(sn|>O1=av;WXU7J^37sB#E;XKpf7LGdo_L!|ZjV%~m<>-Y4ZB zy2V+}ZwgA4k5kJPe~C#B6z`axom_=Qo^FSCfTzQp5ShDk5l$cvv5^runqVXncW{HHp^f6!kXyEzeagp&mvw#Pt zprd-iWd%th8{1JgBq(p&eypITTts0zjCa5Q(@-cnR^eI;vy`(jH4s*@3+6{#MWOK=*e5}^gW?);a37WJGxdw2${R_Y{2r#Ynp-F*g7TZ?B;w!?0t` zm>Zr$-x1ta^G4@ond_k!F-Y~U^{i-K%Y`B19Td^=UUldCs4o>L9tEsmI&bzW{*=Ed zEX3U}xgu~Tp{B&^CK7|({$N{aSTH*q#;qcP)=L2Y0uyh3^hHci(>2)GkV`=X{>XnQ zscKh9Tfx13^*^#8V3@}-**#GrB*$nX%B(9o`eQgkEjKC%K2PTlL<2{?jwO|0J) zyn`N{{C?(L1_GsZouY4^h!qbaJ5&SSs3+NrXjrjX5v1Ig8iwMt?dcq zu*dN~-#73`{U2Qi$0uf|#yfbYMs&SLBR<~k+~pR?;iB9@mMo6qcS3b9w~b~+4Or@# z=}y~RFFpRb_)Ce1ktwJIG0#031h9zbQ&#;GKD5ChC7AG%BDAi~yhJ$Zy(IUqQWk2Y zpa%~Qy@|k8Z^G_QxnBl3B9~z=SiEEM9!#BgFcdzPotx(F$*1*Wav&w-9SXhHbUPoF zOMnTsoliV!w67feXaceDw6TYH{^27M%O%chylLIU672jf+Y2*TuP`qtF-w}tLk%5= zftGnuU@ref!tdA*wAs9a>3N7l-}&`|Xtr7~Sfp5}dph0aYL9X(Sdnx|}n* zPEdZwoLJeXS15IbRCVx&hEbbqN@FmQ{^Jmq+&V$Kk@X3LlJ9Ov3Fr@B9N5F^DX}yX zIcmpWIzGaAmQcTVfyYb~Lg*qHkw4K2yaVVuHn`3n#Z#<{_Zrf56opG%UM=Ub4s~$6 z(eL4&-caRujQGoOGtCktS`JuX9QSG6=Q@PGCL(!A_V0*v9=pW#0Z zR9}7+cdVxXzY467K?`vs?^jJpVt%|9ovW;T*l}_57Jo@Q(n4Lr53Gd$hZN&9HGuK_ zU|Kx~1N69Bs0Y02#>O$AMhGCiASQPdx<$dmjMc6qVpl)V&jathqdp9-bO6o^^;1B{ zGq?PbDow%Hc_|}4T5cCVug#*uBj=|LqTh3nrUwy(tHudar5kCG(fMXtI!T^$I(h8A3gN6cy zk~!3(;atie_;;;bGs>Vh@;Q-T{3NLou2iWqu41B9`VqdDz`yA%0k@K3GFpfgiQ*tnUd$?{gj+!iG3N<@hv-OY8Er$>WJt=iWW74 z6OaqdafHso%`=h@O>|nJ2mP4OHwMBCdo`K}k_G+&qb?QD+of4qAN@1G9?O*y^oQ>1 znk}Pl<>ofaC<2keFYy5Ht3JrGj-qZ^6p?*f4bpjN%zywdFipx?Z2Gy*&{Aa-_QRwO zSr!qcvH+W3rOKzvTEn+;qzXGcCURw_$b+!_YuZ_P#ZSXvzH|;8zc#e!WvIMcBcj&- znp5p(?S~CqR1F;-LQ_$@_Kd~nD|_g4UF~93D20Hy3ciG$FXqGSuJmCuf|9Z)AaxTd zBX`GelNTN*wabhglZi)O$0La~{=ULpB^(0R&2_}#_PGtxl?hqMgWb(|qGA4_!U_5a z`E=3uJs)(k$t@BYOfaiJXMR@1x)2ofWPMsIV6VCZ%40sXrrWwHIT$*Uc>9-l%WL*+ zv#MaBMhHs!^bK9LdHvvYGw;Z~hEcn# z(G}H~eKSx|O2SwQFlhw}EAiAfllzF+iBO=8YUISC5Y_=zHz)Q#Q7aPOE|!BC!E-7% zQ!hfVvv0LaDlIMNXL+zSLO0tglO@(Xsf+sIeaQ>hd^pR;d_aotmr3u6*i=diNAp2S z^Ylm15_5C?Ir)9c;t!&*{8_UDY`CM)S=p}EA5S!lY~X)92t&8l>ba>fV6A^ELJi|? zHifdqQ>g>6FwBIE9>Z%g4eIFh9*^P~ASL;p;V%Ia9MwP+f3>3ni48X$O!{J*{<`*n zY@HyYeku=^vW-()M!CWU9B_%z(g~5GJM$lY*PbFXtD9?OQ8T;Wihk>!8e1Y;FCB}1 z8TMODybMTBvyV2Im}S1r9?w#LhquuIp&rhR18LVhxy9Vo5iD{`n`rUIBzoy&0l9D@ zm>fxv*JX6Z7e;f@3PxvT=)aE{>1XZW(?fGhhY>;O%G zD+@t^NzK|(4(_KY!czyPw+NbX-J3pS025G31!+ZCEb|EKI-0_knVBjSg}=(|taA5K zTF}@PlFr<|wOlNL>H1kov;ZrgNz0vw@Ow&u?^no#dW>wMwz`7I(B;rQ)RoG3fxVQ? zOkvEKA4eNV#wc`lMB$o(B0p5vS9f!M1{)KrSW1Jyy=-YI5zSW%#TnOK741It-yz{h zoL+n3^df~fUb%uIs644!SzA1BjB-cKQLLY_)1xklntvYg%ClLfgqXG%h~pe^G7F+j zlbL0@MEr146_8AHF`?-Z^?ZkG?M)d##-0%PNS}&c%;h(+V5cmT^U7^(S8uy*kKmn( zML&i*HAb7F^3cbr120%sZHY`rE6mBVD8piV((7)<{!$);*FK&B>L&SiI^e}VUHPB6 zMlX14!Fh5$4}_l-L#<(?wV1Blp;K7;GOj;^G)q`v4m%Xn((`6hkH;SgX^lnzbtP_E zL&(=iS7+<(@ho_r_WGElYc2@DX9FTFd9l&Srm1aZ?sqcF!sB4Bl2ii+rNOv+_9S`e z+J(6m7@vUQTY+=QlMHJ)NDwA#=a^g9F16 zTz&?PZ?Q_UP3@X1WA;b?t^fudxIe20V-=S3cK^Vbtm41^hje%-cEC!e^_ez6huwg2 z0IHQovaWA|;|!xwAf)BfwZ{NFaCrA>P*LBEwV0NF1l1@2k8~tRFJak==5ytiZ?6L! z26oMD9WIVb&kmloL-7-&g31l@k*(>_Rd?~?H%Ut(9m{ZewQBY^>rzM zvYy4sd-Fao&wG=TfZTG52ozE^MJGJ5DGp@3#wVxK4&Y+0gRiNFoaXEy1t<@M^7F8y z%{*IN?*u({PqK@mPH%-i5<$!vT~Atuyev-cs!k*OC;J$4MYXqGDjiHJe$UIPRqR># z_euQkuhG9T=hOtJS_spb08Pt*^wj}yO?)U|15-7^rvM03)127LGhn__+Zj5-j zg0$@|)+mE%HKiAQSshT*x%@#4QwPl9Q(%}T!GO`}5pKYSA0dT^ewEEQ-u>$O)xib_ft2td-{G1h zyBifHycHpzI?VpKhL!|c?ES5SM+KwYNi6?8T-UGPL*&PHM&LW!lk&0)c8Wgt*50(H zTRuG*WXqzb37(PrK8}0vZqBXSFa3JF06a-0xw`wZte8iU7WPd28!8*VcvvXDWknVV zml3tNFQScu?|JFVPzS*^<$!=WuFj8xD*@?LocMm+{1NsA7xQh`Ij1-2c=>gfC7AoV zK9L(Bz0Kp~AT7=3)?TG@w<#HBAC~?sGY$7I?d;I}357rSn<=3)anMET#qmG$kTyVx z{_6aH2pvz;ALXW<1yxKvs+w73u$MNAH_}4S zRebTTI&Bc2N2ktvI$4JH$D40V1DSSTlfJdF@@hryNIB$ zN}sF}(k-Y~*3_H8u5F!$f8rU-*w~)`4-%2(jZlIokgf9jP=OqOpfFMp^oOX|wo|I8 zVfk0McR`hd6_uWRvS|wig&Qzaaz99{u!%7J0{WLA^#vRL03S{Tv};B!Ti*4jo=g6g zZbGid3XVQ8u@qE?Q{%y4-9#G@L)`8nEr7L2pLkLsQdxj47Mp^iyyrqj8>J7S1y#`SGYzuh zlCMNYxcT}HnA+o^9M*Or)f9S_uuMG^8pxc6kO=6L!jYdWi-To!D7wq`2iVP~>%J%6 zg03n_Anq}o;lShoNN!7f!FV8PHHt;f($s9YTyQ(&C)mMok11Mj*?mkomwRPvkM4ct z)Z?ZN1TZqJ-d-s<>@F3Ww1w+WjUR6hXQU{|R%8=YTqr5+N&r7}W{aohv~a-;uv3Y> zQYU@?(vaL(jOG~D z^XKXXG4-gL3a(TMMv4B)YSOQNfMQ+o0oBXdA4OE|nAqBMBX9o6U&LhM#+_`}h8MkA z`nk3HZzs{!rlK2BcH34yeo@#D+CREGx+`zv9gP_H|D;H3SbYTcv5wrh|bo0E7W>n7lNg^{<#sA6nV zHFb}#&Q6w|(T~P{I54>@CR{lzjHgm_2P>g$<@5?b9fVRz$NAobY&(d^32Pc=cCAd~ zX45d{I+cP5S`!Ndf*@2owUojq)J}YB*2#vuKa_Hf!~Sj=ik&(aKOqcK{sTSseg-XZ zDIl|v*2C@3pO|Ns)!uMwHl~WC9nE`uz0N!NFo zK;L3A?gx#dBvx-&Bkq>L-L(jbKSE+)UZ^>rnUrX-auQ{DNzO6`*|L?cTKuo_XKXIY z;x2J{&+KI;Y(k#gE{6v3;Lag%z_j90^M(VVHKerMQeDH@3iKab_3h|BGs6B*907OW z6Uc^qxU1V=p2GZxgR%-Fd%nLildpuVGv>rW90n4ndF?o17hF~Xj;y}1Z&Ppyxy!)ZI_%81X8A9QS>qtLEbn&|t_R zH-b=2qUVDQ9oR$y&cVkNei0%gMZhkczaB@}$p$*}pRT|=HAT4+ttSW;lvn;3JQPoN zTof^G7AP$57Ml{l8}Pmff-ykL=y&EhogYo!(A`81@xTswjZ3%^Ywvc&&c1_|@LTAg z7yL;=-e{$klewmNEJ_E_yGz(hb)2`wMJKqT=mte|;-d;{7&6h$3yzaopCy3akDqbE z@kk+5=?aR&ZsZc_8fVrw$eoTCrn;Zvy~yC_jdJ&uZpQ5Q^AG;aUyyqWUe4g#D`mRX zH~PgvGh4@3NoOO5f5LV~b#^w>6wgeTMi|dS1PH_UqQf9}7BcAqzl95TRN1}hkUMZt z4RJm8kDn-0#`MEtS-K#*48w%uZ8n)dsI^X76oG$)T2`}@{u{ra5W|tJ={YEAt{Pit zp1i4`&}2jWiy(f?d3az_wOSUj{^{M-IM2e-KB`7hD+zte!m(yVDUMif6Dvf1ZVnAZ zvxwbrA>x!bpy?%How4OJN@3|NG6nnHz>1(gWiAA7RD>o(`(7dK&g(;Y>_6=TQ_v@K z7_b|feSGRtIWUi>_ETFgX=-=>Btf=|#aP@qf5D~f2X%yQzXh>z7`;QdOSj}&jKAeM zHv!1|=FzI4LHyMG(JF&MJc*eI#k$3`^cIE2FXLm9qH3v{bM`aMZFhdgjy$ZbIy92* zRzybemfw!+B3FH@;a$1@-v{`FT7l&PgHX4_@D+rr`aRD$+NfvXDMs!Bn11AoI<++x zOLpN&BmD-$LN#ofI8U%V~PJJf+A_{VXyr`Ho5}%2%!<<2*vb_ zfzDs+S3`;&%lF}ve2V##yEI!hUx?vKH&`pfQJ)-)Utrqj{JOt!g1?$WhRe`h*tyJv z(Y@ByH&8o^3B!^g5TF8%*{)bvF5z=(WvW!W0-+3ElaswWQPghDI|1X0clP4r?th4pa-k9 z(AFch#5En>F03(h=Fq+d*l==YmXi3d|8N_~5sKpFS_mIN>-2tAejj8VUo{Hq8(d&# zwR-45lWLwq1%|9K>z_*Z*})dcwCcO?*XCfYV*r^Qc`PxtFemRd{(G*Wdg88cKuV<- z6`TOj-a+F=5<+(qlCzK}q;M^WdWGumv42hpG!W;ZwwgC;G4V)Cw3AM)kd9*3+f40q z3?fqy{iAYAxd;pP{SG#l#|?20J#*j&w)TQ0^N59CpF-~}6bqmBb=G7+?RP^SLSw5~ z7<7&crD^s7RrF<0e@1g>QCEkPHwad|&M4enJr1~`E;lo75Nh2omY&8#1{5`fRxo{Z zlCU2j$|F;pJQQ}FWiWl#{&yOC9g`9&5#PNFdoJa7)@}( zSFz5eAe#ZjB1;}yQmBUlhrRmZ@MJKFbiPN`tO*69@4bD z#W2ai%Z%T&Ns4cpG@vHOm14YO!^_0BwYrOFLTrfoI2975cW| zI0wY19#q)J4D*p~)1}qo)9HbIRN$X6DPfa?r`Gy4kaQJa=fa}yIO?zHX&+oqLCd)N zL;v-5d>=d0^&wOVGz?F%Q5cw2l_-jgHzWy}(Cf?Q7h{?r%aAND>nXa?o08sq`efL? zWbJgo+2(18)S7)Xj|~y345rrKYsecC2d+PAW3f-roKq!L$8AqDQl5H&;;3)4BVl0V zdp`)}9$!G~qwd^S{z8#;Wr=x>qcL5maMG9~A3xAU3)%};>JZH_Aaf?xV=INVw^QZA zo9nEPKyRjDq-(NroEp){@1EsCi(xYL!YFoO!)SbO7I;fSM3RmWdu7Vzwkq0HEZAe>;pwRw7BJcxb9Nldyn7a_Cg6-_}H zhaDfo9u0|A(e%=Yv+q*kyjAQ88^;NNfUZKW8ddq4rB!j6GshROY4EX zPR#U1NDE$-V$>rDIQfYYHkXNx9oV7%2Jth4UaHK);4G|6@18||1-CGa8-yB3eHE74 z+#bS@hIzNZ7A$*RE|!q88?Pp~O9t6BKChPOB~l0;>dQ7_J((*Vp9Z*E*o}H*-XNLE z^U{6#o)T&ePxl!{{HPX)H4xq(uwK({9$OZ)`Z^p)ha99{Thn?ut_Kh}nN085Y9Y5N ziRRw<3EtU*au#ZyETA~aS=R_tg@&JbMJWpv_$Ld-BmcH}5JzrlJB zUgBO?Dr#@6iIUmSfx~KnyxMc0RDis^q{9}VWZ(Q51EUt^i?YfT7eig1Cx(k*>%dOe zfb0AVa?DB5Zjw!|3y!8+62PJ|`?61pvj8f~NQMW+%@D`J`(CpPr<}+xAg&M(zvbi= z{_pKM@O{R)f1(B)*fkyH@D&wC>QRfd`TV3xJSUh9Y|u*(xiTX#H{>ojMZnF{H|XVp z#25)qp^kJCsl2nRyCT0HO4QJZ#SMPA3dL54sZ5wF;ajDTPWev)pr>Ro)edoQfWsNN zkpGvmN;t{hH1f!Q*IZM)RR%D)=w{^uOV!v_L1*#?F$pkn2CzUK%{U8jDrzz2-8>*3 zmN>oXLub!(=Y_CheK+=E5eONjN@IN;e${mJ7p$(-?;mmZS4g`N?$sB6=4BR!J zF%QQiVS`em=GWf?ukaq$ngmIDDV$z{pfUx%t*%93mm9&5I6#Qw;Yf;iYmUjryDj|b zccme*()Swi>c->O*#oEcd$9#2v+#ER4T~^~BH{~wEPz7lq?dk%bRtWDvLn7^7=nwa zQ2EATem6l7KKD9%^WY(7_1-C<^a{~jiq1lNN?9=|HxgdKVNCO@S7oxweULDdwVGsw zuz4Ddh5i)9Vv+rn=HkJHY}9RH3hr%o`^ZI1*P4XfSZellD9U4gukWlzEb#;>6xBT) zrJD$#1=tvjModo(;QIkLd){AZH5YkmBQ2WvJpMeac^`NRoxCCDYSs#p#DYDl5?|Et zi{TSLl0d|tyVD@V5^4Ct6UX%XEp@VDZLzR3TTPK31+D4%oV=(w$b)lN&Q_Stg}C=l zzM1cNrCZQwL)vOfEOK7XsvIcUBknBeo)5Z2;z_GsWi$qsqO~_Z0OfE?z<<$7R59o}0zm-W<1H?xOxTOJdB>p~zhZd{oE6gho%_Iwr&^5> zRIH@t{AEC$tTD%viKr{9>Kvr0-+6|BrJsraHOzBiU(1E%#7QaUqxEcJGhe3mNO6aH zl$Yt&q0s&CuqZ<^?nbathy$QukC+4{L9;9Aw8(o8wvme{6Mw%^IX_Bpzr*MdLgG~% zUz~(F*3nXtc+__KAk8)NRMcVJ0hbWtp%3w4Vun_PrJdO#&pc6qm*S<7Ttqx+zR9*7 z#SDxXc>K-y7eQFgG3VMoC_iB;FpDsxlreKkHtZK;CZhK)?ROhHP7(j>-cYY)_>;K` zvjgbBOCB0xf#1WrD3pq#z-}~2dX|`vx>@}LDQct;eU>%NfGF=cnrht5mgNbvdl@! z3R;u?YA=6M&U|O7mufXLB{~9xl)M{A@{5htj=`3uLP7oz3m&I60T|oLp-%c4wh{ZL z11v-4QMcpi96og3yrFSnt|I<>^QFxw6K# zBP<^)uP|;i2*D#0E3|sVA{%UV@GxMbD^RzM;9bw@7v>^;pjGaZT;$)ia&)pv56#9E zkk+?gLwVcZlT)0T4ndN95QAJ2{cjF~{P1U>&H`6E(A54D#=3}HIXyF#SuXdu4c1jqRU($)+!5c1Hz zX#Q{MBFOElxb?}D6)dv~$i2)IW45J8aE6~G8>T0M<=;ItlPCGcBVfNi9sKV4DPHSR zp9d}KG)U)bA+WnVZX~}IOqFBLL|2OH#AMf-YWa{z@qT4CZ&xqnH@6ICrTs6gEJvSH#h@{sn7 z8w$YyZ|OV(zy_(xJysnem7oX)aE4Tc5UUJtE4L&$wYY*ZjVBJxV$s5KA6%A7>awbF{Gj! z5_Ygx)UaeiFSkcc5rAZl6_>VDsg zM=cuOB-;_z7gbmUXa&K>x>U-=X#`~AM7}{3DMYHIi_=V)(oUGriWPUlF2GE4{OS{K z$nQ{qq>v_=ksRifQazkM-Mgm+^Wo&gKv0&86JcXcy+VOQP9{$z7NyxDP2EEoZ_plh z){aR$y%H;aZ>}`_|M;QpUXWNo!INx%9yAtSz(^*_dB~LMl+F{h%rmr*mAVVY4PZ}_ zk2(iU!W>4{r2}Nn`ic|101=QDQZ!xa5Q#+gCP}3LgqGsOMqYqWMko!uxh>3qQig_z zFT~xZ2ODAOqH*X1KP{seYH1?_KnJPH{!6YzK)J3#Ro#GFsM4|H+DnpJxR(0YEu$u9 zSY@w44j_4Iir50j!_N_x9vc6fVu)2wAJ9x6(hNH+ zV+($MVAf}`7fu2DV%)c~Py`OH47Z~T1;|vB%$Hs<0#H?4!^mXH`2RPT9xj$1@RJ*C zy`Lc_dajs>gux%PP4t)m%La5MYjr801`Uy=?I+6p0_ySFmmZ)0Zz}sT9eYWcGe-+l zGh~xh9~1!?_XnhINd#SAOn`4gk#c5oFio>M1VDrij#e=9flM}B+5P&94o{gf?NR_i z3xJ{JPHbGz1%aq1d~FJ3V7uM~m!(j!JK(^4M$SsiB$rB2wtz1p6g#(6_C936;moIs zMMiQJD>y|xf`u1UD&I@U3aP1Whr-RNGaOQRJxCvCvm9X*G6dxAQ4gYk1f#8wS}-l7 z!S#HCGgs{!%{~Xb67tZ1(&Z7W$d=^kN3U5SLU#IIk%g|Y^DujlK=CooQC3w?pa4B# z&wtov^ z=AWv;XeM6wUJ1_`<{k^C9v^bh-w!H=3{Oe57J6rxpisI{;hQ?yd1$|7u=T2&G$J5K zLl3Sb+#Z%yvoIdI`x(;IcUr}OLLN8Yn}Ys^DP2S@>8j_3FWK@M;Ahcj+vsIVmTOf6 z2TgOziLf9{Lsl~h2@#POWYpDw-7&$2W!`ojrzO_uc;;Cox)7mw(jQ>W31{SK*vt@0 z+sz1i7T9|Aj|3aX1`sLBpdFZTKCWqx5j#Lb+W0(q;c^jMerqM}h1nN8$c8{6ILKR7 zJ6ji^$3RSlk<>1uPn<`fX}A*?s|uc?9r$G5`knB{&IjQ6fJ!Ux3<-#Vw1A3D2P_!9DK>1+cEZn!R35EPxKy% z#UGM|pj(Rr;(r2djSarPBb@p^$eI4N1yJr}{GHTJUGa@oXDHo`opDwFMVR>XV!yaM zWKJ2y2B*O92x?-;+7$C|_4VDj%;($}m>h6YIpWjY(KS zA_p6%+?A|Ar_XFqcLp7y#D{GKxeWMi$ywN2nJd@B+Pu&~k~GgqLoQZyaw${FfOf>C z&tP>(%mPY9{T94S@kwXU4E-xFt)4inO7Pdba)QdY;>3AGnnFy_vLQTQ52m#~RHDUx zk#IxXpcnmZHyRX`b6ITlBi~$d4Br96qY*LcNOfcG{IGeM)D5G2Z&_mC6&9a^ z@SSB@WY1w`<3&O& zejf}c;gCt2J5lysn8sjCttc_(3V;mlSkXl{PsA0+18mscvC(uh2Rxs85M7VFxIe8vA*hs1G zFnQo2anAV=))L^;)2v9H-*3f=j22Lj*1`)KH_HZr5pR=(A7YEui^hZJ-_owxPVulb z=t8P0=DlG+^gJqaPqNpC`b3J6DI7_^aW9M7V7R&~3$ z<6nw;=-DDjJ)ZwR0K-5$zv~f40QdfuY5>6}^CevPW`siTJibV2>=Igqlopag zud;oV?MKsBhEH+`eL&ekPTf&aEfGci{e#W#KHdS`v&EbZp@{N$g3OSTS5=?rXDy+> z4}&PaRs-I~6ci6FB}91*F1xO2tOMA>bTD{x;R`EaR>6xvbon>0We0z+UjkF?xZEND&@%3cAc4Z7?#1#qul5{&IpdMSoZ3JlzN z!nhNdM<$d16pKT$!ywqL(}9zAc)3oTHpNGmGd4GR>W{_ltI*zuqo(-!#kymZS8C2F zCNTxhNq|A8Ku@iov7TPNLJqF@#E7%@JK(#nI|p(fL(?(Y7uvku24Q?0i8&ZOMI4Da z_^ODH;AjaT1vN=1D?%x>cWCtVlxC3%cm^KjiWcZ(-Tb1V_Buwfdd4WW;u)h@1H{)$ zIYfqZTgi1oR^@vf9-Npd0;ia8W`y&6N*YwPb%<*oBMWj(i{dwHz)&w-n*G?0dJUbT z?^rOWZ1V5*IA2VHnX!DIakhn=(^IX$Ttl!1o6PBFXZ8}x;~;y|`CZ<)p^IND-g5}T z_a5IIJ>x73Irv2hGbvJuVH&+Kj8;@m4vuh!4xjz|Hn)j=GzXBzj$2y%ls#Mx!-l>v zK8nYH^)fsi*`S)5B9K=jsSZkJJRyu+swh~=DZ!yv|C~D(y?q)ip07RwsnUeNN<4*- z>Ht|XH^(k`I;IYRqv;#nczWH;rX^oEP5D9zXN0r=m4u0>^` zG2_g)v=^Ljl6bCW0Qg?nmm-u*dp-eV82Gu&cN;2x1r(T*RR%wWshzz;tMUDZ0D~jM zp7${&#~?CzhEQNYtO`tpLB0x8r(jo*Fj}yJ5)1gTcsLnIDX=S6LHVMi#G=y)Q{Gb+CNYm*VE3h%> zCgm4BE$$-b`9w+V$4iVHp}fx-Zx$GQ z&KAb3z=(W>oT~(fPT`GW;pr-R>7E)K1*RLU?^;6F`O=w_Z0g-pIzvCiwibcBTQEvy z3e8kY=jkfsnVv!(0j5_EH8WNeyP-xQrp2cBqnu9D@&dUWuc7eXM%PHw81Q5#>~-%3 zj2dA42pv0>Zw80PM*a!1B?m}0u+t1GZlQ|#qH3O!;johm)5i+mWDmau#P_n17NTVK zOcYRXWIsLKyIL5+k^P9$=y|y`Lp^7Mo<}Mcl&Uj?+XHy16ayu&LQw!2+3^Lz0>zs2 zT0_A5t3R(+EfLInqzv0t5$Bnn664HYbm8y^UyWYXs?dYWS`nu{>nlY#g2!||fDF>l zA%?J*{h$oiP^RGgzjzhe9VESD>7t|=+PHrBn1dI}D zWvd>-EPC?&)G?+3V;fk>9L7i96oxJf>mCja&k(e-AqbysyixcR9pdomdI7}5QLQGN zWWovct(4zMFw4Z%rg1)&A~_bZR48TLN;gmn5dY#EGM+&0<78P*lcn?HkO}lb@FFQ^ zU7@mD24HxG!2cqM;(rn6H7Lt5F{~HoNdYge$pyN2G@N9@>7j6VFRsBX6Ia`UbB&)| zLdoaxH8@!CwbTXXx+6+SY*U;9a{^d_C1|dbP-2cM+hB(%g`J6cjgVw}^blmRJ$eXI z*&aOv>1>Z4f^4=&@6vH+yYz0`XS?(+ltH%13Jev8V`;--DMQ}qcugziUny|>s(_L$ zC_O?E#;>v<)qsI39chtVvsZb+;%2d88ArYh2ge;H(4(R6SfkNXnJd2;dB0Y6=Nv5_>}~(S(8;r|empjg-8qj# zg3^Enu9BL=zPqqVO=^zjxS3~0P zjgb2t7Q&6S`0HM2oyEDsmKq>F&lBwd-uvXVL84rO8J0>iKtWmxxw95Q-d&1;ly)wf zf{NyFpum_gMJ}+N_$KBta)$xn5;<*I$ibqrCKX3)4^FjMF}4{>FvSB?JuuxQV_xU? zsc=S1k0CU<15CA4gaP7fMHrk=ogX1zbxO{RbRHuo12b?U(1f59<|#oR+=W5y;5&I@ zu&lQ$gZZJ~P+$rjd8b3G>QEE9J4rGydO-PUOUh~SaJ`*!y z9Cl@fMoljf&O1zZz>MsWP3zNwvJ5C!d{3iXk#ON7;W`G5b45k-JViqJ-TPI!{0{hh zJv}{xWAbZ24$2hXXv=vg9!n9-4%~(4_%>a@3Q<7YmSn`Ho$!o6GVk+ve$eG@itpvg!$Eldt7$E}cBPZp*yokrhD*Z4w9<1=B> z+eLLq_{ym9#UNKgO4EarC(1bRO!>;@5bnI0y1kaOM(gq-g>^Af3{=gbcO%ik^p zQov~{C8l>;?G5kisb$aM0gU?{?aGzUN3A(b3!xxHF$cGS&dbVaXJhi=p4xS3>S za_BLC4W?Om>V~_;v@q0j2*ZAhSJ(G5E!6{K(NXUt%Kbf_$!cTq1^58NtLa>Z6^ogU zuR2E{j|!SASX%!lY00}oV*dTxRe6UAFhJOI?igmGO?t!RN)d>XXr0TGXcfq*Eg1w1 z+wLWl>0k+m-YPJVfDm9{hwY7u7 z!{?1+@iT37gM5!B!odb`8AN8U$*%sO2Cr!&1KWQ2S zKWT-ZrHd9nXu)jZLwu6T$5xLi6hZ9>rLf!BZ&KJ5=!o(PGIS8M5Jj|QWfM*dnRVS_NJR(g>4gx+4S0VVqkt>NSyK3+I(d%z#uh3#sgt!?^5|{ zqk-ea1(a?;fk5#_;R8GgXVh#^Q?&@Vc8B2&7=*noS%yki?e%2&mf&hH$QK-xgfcAd z0lf@AngNFO??GE{4oPYJH^7t94N|$j02<}8-NBnnB2hl4ku)|KgAbYC76;+-XqE!| zix~ddM}fgJnwBq~(ZV9Vz6~gN(km$4fPyEzWHPH+a7K=~dPSM~*EI5`S-L~sQzEw} z-#-R0irJKGQ53w{ynfubaL(hzT6~%dU?jFG+;aN1#ATg*i9*K*AdPl>0Kz}p2q@_I z6qN4ZXoMQ#y=Qm4#R@3s9(b`}tV$a$`i3Xjene9%^m09~KggV%-%5L&z^yEy+hs&3 zuQ6(gNqO~fyIOGeFh~YI!o~Nh!0J+AzZ>lE6;xeAl-Gi9T>T}$;AW~@*Nxt|rQuWy zPK}N4{Zp6@7+km|C<`y4%7=-IyEJ8O2V3y|Ll5RT{!{7xJ+U`Ei}gH?DGj?*7D(GI z;N>;;9??LGcfYwgQtnV!)=fXJ3A~-{C1c z5WS-u;~yFX)5|P3m|LbXx{iS%3%}wVBNk!Z`U-{exc3Ib9$Lj1^9Uf-VX?y@S_pO! zg^zUpgL#npUIF4V*U;&UZ(i$LDXqGyV69#OghrIlDP zug7do7SVvIDC9tWg{G<03^J~<@x2Qtw!imes!2G_r1Ndjd2h?{RiTX8*GBmJ2*Mvv zJSo=)wG3w*q6l`k^eeU^+62$RO8Hd|5T$`9h$DfG6G&mj@=@j!wP)`<{`nRMt%|4k>3u}$Az)|zq3jS-3;!hBpjJs3MYIB1o}ZYf z4$>h{N_XnQYmU-242>l`Kf5?UnggWDlC7b31n*b`FVIU|?Dt0lhYI|EOR-<4<*_4- zSKS)us4O%0@Vf0Ntt%FWur#|U`Hp15$tIi@n#?mycfjB~z5oL=lRtz*ulbaOTw)Vc z3Lz!7YV(lOJuoI^)oH?^m31$)iq?Gyf!$Pgj-FTWo%tr9gEEyocF56VUbGk}fuL;C z?!1*%PCkbRIJ@(`%mC9W zzdsFNCZ7mIs}T}`oxZWu8Ge+Fb-kDUw$A4gFQ@k>zUGe5ug_>S((_)9_pvhfcZ^JW zU39vv%bkX>3Fx42=yX1)L;_u`e}wNPvCa`hx>(@GV6L&0X`Qx&5B_b#Ak33**or6+4A>$uN^@3d8tj zghH=+>NbEtp}AoDty(_B)*Ucy83a?? z7pL%C;5!Tg?s+&Q11?)2rmo~5rZowfTDCj`QY}4SX|#c^<}HLt-95mV+Z4FD}4fy}bZ) zjY||7BXD9JKl-#8K(48G%Tg$)$agi}@~#Pdimr=A*Vnj238$KHk_pH3Ni7ddGI+ic zJ1s&s+v2rwq8GnV6%K_>Z>y~iQt(jNmh)-To)3=%o)%E=Bg)Q9M)fYQbnl;;-0VW0*&Z6s>oJGd0Ze%Ok(+xAGfo}wX5Q)g3c8#NFBS9&i+(JC(IClC3k!hE*pwCF5S``Y zG!gM>D}cG#dQ4>i z4wOL}++81Ar1Uu)?#r++u?UZB5UucUq33#5glE}PoTiY{bPzClNzbisgIvma!j!1N zgIRflAK64sWy$%t>YWn&(uJ$uH0Y|H2O!@3An_te7;+UnF}Tr;&lrvn<9SC%31D8? z2{E3xd@NlkxT1|;f?gbw#SLqMRG{pmDs~Ge8!o7C{5_oB1^_1;l0uhVE2K0X1Pm8J zGJUM^Lcw!n5B_d84YZ)!re%w6n`a1}HctwS^r*ssgA@S1qm&RunW$X`@1#x|Re=Gq zDlnK@DD3x$)3hZC!*p*2XTTuh!Y@A=-67$gvo2v=MkLWP957>8Oc<~Bin{S$URaL> z*+=QKOv%C%eBNL{jMGY?BW|<{6=v7QhXTL1PXO6E2)fS74~lU}79FQBXBqyeST-=Z`uxg>sA^7*YYEO|$?JeELact#sMDH$hF)7>GZkRbQGe7;sh1bQzJz=@zbf9tP8cc^{f=mWQb}9bY9nKDxT0 zqzHt+nDeAuhUXY=geZl#7n+~t5p4@D1WHL+EkXkaL{+?CFpVP!X2mE<5=X(ogk%oEU+`$J20c3b2Ts$xyYD}N_m7JGw zwu3G7>D6(-2q@@p=u{v&8zpV*KtWd{px_8rp@U~fD48F@%1`lw7jy-s7*MWxut_M= zDFz)~6Je9(o1Vf=1?DXX623;u^4f-whBx2pk?-0Dj-U=z(h>|^P?)OI@i{?REUzXQ zyP$9cH)MsQ=1_L;$)ltm=!@umU(w9;AHEY4P=ul0oj%;~L=jMm0p&VT=tq!U3>v!5 z6PA?Af74RAd?t+o-ww~v<>_crF2B$Xwfm(fL+w5Q{`E6|EqXjmyN;yA?rr?QDeMkO z#Ca!YdSJ2#W`7aRDY0Fn(L=WtW(9)cm^)hZi6 zAc_&*W@1viIm5@G9AJx+asK6Fg!ek6v@=) zfmtTeB$k|yLtwJE$dB9Tu-r!b3=sdKogTe59c~1D8m?{#@_chk5e#tyY$lvx!pSC_ zWfAlAh`A;YTWxFyTd)>Jfx)yD{Xq=)x)srkzC1ixBs}8pQ#tIU&!G$lIT%n#&mJbEzif>0yhugUD6(kh47G^lA7WN?(R=bDA_YvPU#ySjfS zeP|H~&yRqDX9~>_9wFti-DvIa@Yy_28>!5y)Z zApH)=jDuuR?m5ZX!4sDL^0$B)fjl0H)j$YznBKB&Y}@QbOk<-TjhN{mrdwD#v6#dX z9`6D%9{JAYf!Pk{0685AW)6phmq*>pqo@_}RG(3%0R;wK&~1IkYa&Kr-6l^6c+D#G zE3}vtKKCpUGcCmQ;(_sq=6GL4G~FU#7%?REf$oSH)`2Sw9mmU4vMdT(76q+PLG>AC zT42sNp1d649RNz-BjP-#4Od9bqX$n0kZaws5I#e(*ygtc?rG7|wK%zWO6djR-~2uDc4kXB-6EZ~EuYlr%>jdnH$_)vI=+YMA*NOjO!B~Vk1MXjgyT__$B)+SfPu?) z;#Zt*2MQc8h(eEwRY-wQLO_8#56=+9^%jN%6r5R0GX#f<0MfIApY4z>oF|fo_V3}^ zdjbPPy={0>+S~D@w720&NgxIC*gPqCifqG^k^r(SLa~T;S!lsa0WFr@EuV`{=MoV|V^j=L8-X@%7!WkBvYY02vtl6>!#iOgyT(WWDOou7g<#85u zWeYi{cA^WPIXHExO$}^EX;XtsmqJdDVP3PG1`z0Vt3t2ac1U-W;(%%0z!Fq`DzwyI zbXw|Z9IbqXZym{EyLDs}PPa%H=1_G@?Y;&xEW(-1U^f`bO3t%P(*CY%SU*v~+QRoh%R(OY;D>hpTDg%0mvA@u1BZ&h8;JIBcC1JS~TC=57N+cv|u(cv$ir;c3a! z0+uGApnn)bi^FM5hwZr`Q-sLCAc|&9wC^AL$o;417HR{(*tQ4^h^(0K{(Na z2EjQ`JU`bm1(p;XEy91wIGl+l<(lzNJGc^?Enn3lpww(&s1^$;j>DsN2gq{pgJ&vT zn=od8M^xeUZ#euSCd8@Fd!a^5&!c-u9$QeWV5rV!(Kc4?2-?O17v-zO0+%7gy-<##i3j>e74a;~ z34?Vziq9&;!4$srDlj!!RD~6$8csFgG!u?TTXj2NU|P-)R-~L%go4s$4PfX2e}muE zQVkfr^-w5}`nC|VbP&ip3}t&)v!D!zp$vmq;2b!rl8%8zUq;~&pg|xy1B@Sf zG4X|xS^e<*U~ndoGP{G6X(44BQ1GNzP^tx`Sx_9GP~8qaJ6yum<4_D2(a8_Lz~&l< zcba_rY>q(q>##tHK_=MEWpTE%IPStUKj^Wi!(&g2$DR(4JuM!4T0Hi&cKpKB_v3!WMXfbUnkg~D`#lg^IZRK8Oc9wRvP5YLDtjH-LvzMJmi(l98wW{1Jmv@EoA-C5RbF}Iqh zgO+8XrA>o$$EZ3-V{{8C%YtIj^cbvkKVq-bcJ$io3*(#tq_VSY5acHdy&woAw1Qmp zJa^2s7W2jTlxS?NFXYgp`aZ<-nhHz?1MIQwbiPmK1BXtNULORXCPkS2+_Tv&D&NUr zfHPY@hf!i;9xJoI5JNB2mcH;cEMNF84j9}yB*9dRaBx<+f`co^CHss0sIt3ABBy(_ zwJm4oi2dI?%&<5vTo5mjW75^|m@*ulIa^9@0P#8TULug^CxGT4rAHuz4|!BjHxoJC;woVGvxHMqvhW3)u|=FvUC*Of zPMLxN1HV1y`1}aCBaFg2K%NkAf4w_)3|*w~?-m-2g{R&vl9?8k&gmk-?BaoG4$*}6 zn^~7fV}QF8xT&FAct;5pRG(og3v<6;@96cgkN(f$=J{nmPi5~D5d%Vg_(_*r37}7N z>8N}FeNZ<2ICh?YcnqkM+e++mb^u8*H4@7^O17XB3re-1bdPvF%5D~(TDPE#h^5Zo zOf;C~5wPcL>Xz@ITeRI*h*H=w!4gU)QSMW53eA22#&d30$2jay{z)(ycsXD3bi4>E zQeC=8MlxV@933s0GN^c8AmgJfe@})DvqshZ6}0+8%D4M`|1(B?5VU z=yriw(EL=ewjlvZ)48OwM!P3e9wK;`YDUm1n zN9cB5DJGvdLzu*7Mlr%Uc&~5r5LaY+coO>2Ob<^2!^@6oPy)&oT35kba!^W3m*9rtseWU+v6)RI?pdHu^-XaVd|_E`J-s-#wnS_xnqGHAima70xbvcJrF%b zrK<|Js8UF3!Yy_e#_MM46`?!|w>l_kAtA5#+FiYWSIzI8zJoYzZ*%WrC zwZPJd-OY0cw#VDl(kue5wOPn%mhT%TL26tr`h>Y_Mh2ZJJZ)Zx(a3(Y!A|u*Os|EV9*tetbEB6HP@FJ zx)~pZQrQEG_ezyDxBIw?=K25Y>;8kckH{B1zkH1LJ0Y*NGw^mSyp`={LFopRo&#E* zpFVK3G_N7ZAkrCH83A6>mEny6$fIIvfbm+DVi0KCI!1S3EJhsngdT_#lTe8YIL%Vd zVkttgjD?U;91QjDkjilI1LY@zCxCiFdKrAxWm1Pj$8|N8o4SVV4C>MyTiwYZ)m>zH z?BSqeIzSv!MedR2WVN3R~=7>)JOiSFWU9@!c|u0BY9 zsxLOz2}Xyt+PrkHe#&I2ZxM*8$s(Go4KjJEZ4%onjfL8Z)l83Q%J%4c>u#pRU!_t$ zq`)+f(OeCX$x@}wn+;ZJ3&z(xPNF9dj7w3)gVURbt>SQ@&GLQMX869bAMTB#yU4XW zx+hObbnZ&a7mISw9fQ}n%+DQLAu*2`it1=KgcLSEDG!V!)6*~839l4VPAW`785WdD zqTE-U8a09bE3Wuw8-c~CN*}M+sCT<$R8g!H@zsKrB0Z60#E2gW4iIz8l=Z0F?OMI4jTPxhVnH6?a7(p^Bp>D8k1 z-c00}#B&NeB({dwUp_5Aa@VxUV>eUuRXO0|kQxBhHFsTP!GL2+oP8f*nWXPzGn z6%>@^V5pO%e3ZN{I>>+tDvQp}$`B1okQe&?^c9e$ zgTT4ft`zYiLt;EcUweYXgZR6pofo3A8!^NawebDg5AhI)%-pC6X?EBSlgwKQ>MhOdYza z@fZ_8BBOg3i$g=r@Hu0Ez@xw=N)YXE_@@&3r$wTYcd~w zDsH2&p1sT15U#W|%0*uTC zO#EIZm~GBu9G9=G9fD9tS#ox)Ra&_g^7LNJogKu$cPwn+3I+3i6I&jREG7fru>y0B zvN6~Wy!ktravxJrphI%AC9!aKp)rO>CJ`O4<#++ctED-3>8Uzk;5Mhgz@w}nTeub~ zDCbTm3HS_S*p5~RiKAsfX%@M3i+JHNRH9~Q`GbUVDPGfkcL&Hc*xYjXIk>4xDA|J2 z4Jae_3$GwmKg_DZvkcGoGpgk@f@ebsW;zrN?}ieJC+0X0D7>=a?NQ-qWlv<8Jc6-A z9w(Ywe0Jl6+z_=tPp#K6AXKKW4-pwnzr)a_e!MgwsH6$OEwe*^BoLUXMJ5D7QY3^9 zCIyK!heWy#0`VVh?-2j-V(sBq^9(W#3SL!L@M;E(Y{1Zc5yU2fcb~dIAi5DSh5^HI z+?}|FH&qBFl!G@LD4FDe^|7X27(EOd;`xcprvz!R*AsALmbgqoX(nP?fI_E(Xvy{x zVLWe+)0x4@O3M083rtOh?+4f2D<~exoJtH0CR=!F1{7G)#~UwtJ69q0l|^Lzr$;v8o9B|Sz6vFW~sk<9=yr$Iv)dnxIlWI@Rml;tp%y0h-1VC$d4 z(XO1i+}j{d{Da%cU#IieFJTnB%8>sOx9+)Nks&hkTwJxcE|YSCcG#Zq*H3>$nE~Km zKl8QtAVL}JT;+?D`h1(IAOTo z_H!&Wz8D}~1g1#2^iWy-F&1hePjt7F#L<^8yt9L85#^PmVey|MCEeMKls$$wmV=mT z`ItuNBk1A5x81#VdN+spjx;Qii4TSM)xG8XMjk&Ams?A@PW6Gx!56!5WRQZ zD-|W-jN!YIaUNfE%|~JD;X9E3#9l`W87WS2o#R|F(f2KVG)s%H~UF?|rt z@R65k`5vlAHc&?=;#3ok<@&2s9;9y2E=zm?@#K-uph`cjNawlo;gIO9m*~W5066_Q)g%B-iUI_A-28^W(1P&dZ zkYNzWIV=PWi$Ed^`Jqn=nj3KP(=owK0a-FP;NSs+_Jsl+oCEl9rnT`yD0YZa8e6}O zFr6*lMv&Z}FQGk_Ok&Ho5vC-zd|Qyr><*A+Xc~ZL37!-v+7>|S7d3abBnM#{eSjh@ zgFZq5Wzxr=K+2a6lRVhlAFpV*{#~>*HhX__LM9+C+ zwttSaU@#MG0Dld%&Lhj_%K}dNM*+zk$j5@XB)l!2;iWeWy$_8?fmjhy=xd|G5G=b- zhEg;Esq};dSliMC3qUT%j zfsq8W94Ph6SM)l_EQjv$b?UC+W5oMj9>N6R8YX0(uOe`b;1fHTx~Tk0+AmqAcNmXs zFm<8Hczf7dCbotNr<-s*##6r-Ph-z*g&H`cB$#t_OEQMjTa&TDSy((yv+#rI4@JCi zyxcf!a3oQKnG``dm`RafEZz?@Adnc^m_kA%>h|vr=ryLmgOh(&X$FuUlfqkY*?PiU0I3e4py~3YtU{9V z5dibO2RX9T=izS=A&PHm9@o??o~d~pQxp7BI(}*M8;$^`3C}ar!V*l(Ov3%5Oan_0 z_zEDQaGy8LRLfV;PP?H7GaUY*P6JBM236xR)TBb!zfESH09d*nA4KgX18`m~xWvTp zm)d1`zP%WFzS3?B3|^H47P~I~sV>zhlp0Bb`hiv*B z7L;i~nX!E7)lUK`qfE!=I6RKLHj8tp-SZvPL7#FT<9v8tPNnapqao;nUxtc90R+0> z9bxYq$VVCU5K81v_>+g8cg*yjC8#i@F^&h|d4VSd1tb|HQVkdm&1{2(q!6UAxhR?& z@E`&=*&&jm>ldD;6+)&#H^m{>;*e|j?LAY{gFFdw?S>p|VV9&~x~FuWrD7lj+mSnM zwb{Z?bC5C}LRkh%dI<8vx3qS0*a~*EcE?jB4RZCOcEgFztEa?Y)x)v_zOdk){bI08p2nB~#*a|D&4VnR8?4lKcxRrFVIZVA zK)|iiAo%IiA6|;Y`sh@zzBoDr&IXKPUhNB-nW_ z5OYwrQrHr4R9^$W8KFGR8!D`9zb(=On8(rfO=ky!PXt+yJ9kC^@`@1>@;*QqHt8*L zXFv}PMcLZ8^w*TV3{OL}NZ@Y3+X;lz+fa5QU=-P2;jK&%YBvbAfARK@2l}qMOh%~R zU-V`Q3B@87m;@pbQynNXJ6M8|n6##Aiu_W4r6i~DSf9^0;h|jL=?T^JEZ`h|2Jc*j zrw~226hP|p^wS-pyfPGi*stkJLlAdVl;p`cLEt6S z!G?h-)y~F%7b%U60u?I>r9ziPFZx~P1c8D~Ac9lai7fVYl~&mXkh&f06ocVIJSpjC z>QaGFP+_P?PF9%2cG1F5KGR^j2gW0sY9VH312GT~A~F3r(1^U$zXHO-280OnPE9P~ z_u=uO*_6VDl@~S7!b!{Uc|%}{D3y&XFOX;Xh9~vo(pHEp=^&_Qm|Cjz&K>6okk1b& zXPvHsa-1Hb6n5|HMaugmfEnSub~uihm`9XpK+Z;In5*Fwk$9`d0>`BIMZZ-u{$T?#%9v_u&^~vCb&GdvprmG zi_UAZSaL1NaN^bYl%WSTN$Rd;cqC&vtg7j-swbHs;&`MyW_5^X%x+>U{~qxWPiBXP zTKOe{B?6&aDkVy$1LfFWrDxSbw55O~2S|2+SoCwEECB_axP&rvv4GbUKw?vQu4jj1 zNtwHYFpa&f3n1s7eKEw|j}fG>*JB<8UF_wm**i8b6u6rRq`=igLFvgt%W$A93rE{R z%Xa7pqGbi84BhBzSq6|3Rq`MZ!U;lw2#zNO7C(1>#@Zo0zMt87NEkZfQ zDg>YTbYw|tF1mu?2FYWbuTKaBzUYU&KPn*E0b4}+sR)Elttx`aX*g(U7U_0aNa;in&9cGB|28?6XlW;9sCeaLwX!_EvuXm4RTt?%u;pTDXrBx3(-9(N@I^Dxn z_c+ngP15O>lXp0x5=f9sJPnTl*5L_~>KX=TQMV^VN~Xv!(FfJXi+&A<@%Fs_IWn(U zV9Re0+w~ua`J*FY89?Akp9g`^2vLMo^G(e2B>DLThYqoBwi;V%uCav`Eebi^17lKF zohBTQvRd}QR1a6pqpUVOUqmx03kp>vdb;V;>Lzt{&nMbFTK{%J@WW0da>nq$c!V=d z!kO75_c+9eGOSIFAMKUwCV|wqE5C)Do?h^K1 zy~5mC^fOilcD}rZ>IY>Bcc2x35KSo#l(uKY(WC9=kd())Y%++p?}(IFjHZiZcY{b^ zSdIWvbr2lfAS5)>u%IjlN;Sx~_Wb+J`Tekm`+sMfd*CReG2r%3W8me#)6)d-?%%Us zXNDmBt-lLRImN&a-1rqzx&_6dpgJ8O76rjYUqPt`hMGk|&7q*?P!Qbi1rWyv)E(;S zmaniolw9Ml@O8dUYr0rw{29_)XB4TlZ8(Bje4@Uh>|)>uFNZt|-VG6jUUkHusv|y{ z`Bg`cDA&!f!3f97msb^huA7c2zz9Q(k859W=**Z#&srXOb|~hb`i#>foOhUEVe5K( zo=Qpf7csL(f+Cz6e-hdY_O!fUPdC3=Sw~#U{V%Z@rkHJ<-22w`K7ULbs;yy?6 zd;=pj4^E!C>5XhT6Ru)7nwC~AwDjpX5XP5}vI=2Vrt1VDtl>c*rpfG61%@=4ZxlEZ zRZt*=prwMH582VQkR9`2cz*DRMN;^3dR{7U#PT40Ir!-YQqarsq@bHqzMvhoR=pRs zmH<)e(4u?s&?(Rja95uf50V`q4$-!`9VoGW8sAbyqx3Q@7FTo)6$>d>BNRuXsBC+i#<=Y zo_lwII8LG344=@|h{J0LP*QApq9_fAA zhS}3|J@&d0R(o-2$N3Q?+3#Bqa$QrFbuH-GeSnT8M0Ce z3gmEjhO$E{xmfrKK^hq{2p}^?p?AkBAlm>^lR-V0d*LqwaL7xvGz-eKpe%=qLOt^% z90U)SEglZ?19S%;X5A|dG9nP+CGJAu?~Ec&HsQn~euk+Qm_98qBc$fN^lBK)Zzc;% zvwL8c#cZwur79FU&1CpEq48bfstk)2moY5lT;)O4QXYgKL*c89C8nyya?1Rs^TzH$ z6!{t^zP7~%SF(r)nhJOyIEuxsk7g0g=$@mq_Gb7zuS#s;tV(=bai=ce-mjENAPgTn zN+`{M0!ae_rH5kSZ~Ma5!z+Q2=$Lv%AU}L~ub@;13Z_Alj zp^_V)O5tTvrbV(AS}-NU>!&$Dw&nZjLH!fso@xLorFy#~)!TW&6bnkVpfp`9Sl$L8 zjV?l=DJij*`G#)^r8pR>29WLmX&#|8ht(#_$2>gI(~8oXLg0fa)sbR-MwtOWSx|&Zgv>LL0-$DO!#n+7wlEmJRISmf|4BiX%3KW@o)}) zP89>6eU~B5k<+U|9NqAa)g8}R0thVM6+j$vtqz$~QYIgZb4~RvmOKbQrW9l9zft;g z9&k7qS`kR)D{bhS61)lWsr@U*M8^~<(lUP~6`p*XM<_is72yFo(~n%(MP`_trqwY)m*hXnFebmj3DzYG`#I$CzPk}C^iSyCks zgPmjaH$1lf>2!}!?7ayzl@|^~$i<3{(S%1oUlUegxgE2qzq8bR{KHiyEv%}x#q`0@N zoo#dod+@vny2S0Z>496v_Af5I|1n*R5hPl5{(eIsPFF0OIOk5$)>Zpzi08Q(YFibo zTIRjU*p; zT{OOQ8GGk5_O^4+_TF4T(tEGdb1l1flY7@KrfNpQlLPHWkU1737D% zxlMXW>K+AV$)5}A-WEqW7)wDoTs}Rmsp+I+?YE}TJJ4Oca_??(-ODKb6#{@qb3bm_ z((yrTl}o7eW0ebBXZKqX->x~AO;z!K2luo}YJ1$8wDtACfZd9ppEeqMo{5MG$?WXu z{9(2G?#_+}#;lJIY}qw!g!6~iMiw`$EDId6lFnJ-;^!PrQ$Ly{QLV3-7wYG;`sMrK zhf`k$>y@4OG{DxJ(s>$w)Xi;KDQ4;Q(29ePO>5Pj*T$R4M9L@c);gXnD@k0ojQmic zq^VHNS^3jxFP8q)^(`fj0_1c{rZ`Qy6QqhwwpH=B%bM;A58(=&_u>@XKkTXKjKWAMgPto^;lrDwo~$M%K|&y12;47A%Q*c{JJp%j zhi09BInab(R9#Z1^YyD_=vMBVc>6DDEV+v(%S@}TCSFv#sNWKem2xS5am4OL-Ser_ z&Y3nZy}^xGwi2wf-5sGBy` z+;HFRc-rAK1BbaS3*vMKWBn#;D|j>3-&e3MSbVW@Q$D)S)QmYzVcX+R3Q7G>+mogA zikFyADf1CFX-pB4KfH{7I4jrzm83C8&Jw!1I+a%Kp>jM$$3PAtkZNVxF++1V8x)eBz8X&ag79jiYd z|7k$Ax2u*&A7WU}vz8CXCZn7@?9<~utP9jQfru`A> z&-H4O#ckS1&;GQ@51FPI-Q03XMN92kqm8Ye_1*m$M=p45>0(UZ;rQr%ox}U^V_ytJ z_IRCJ&|_q_Zm?8oXZ;YiP|>;0Yv<873#Eo%w5!zBVRJh}YciG|q|WqL-9leKcu>W< z!@cjE{Z3nQ`#c31`5l4q!Fbj)&BsjiwVpVg<9LZ3#jJBpT8EN*K3bVzzFh117%#g0 zVd0l1t(4@RhueaDZzwIiGvly#$Mek|kDWOSFFWRKoA${gudRcWVh*r^ zVpRyzMJhkfTFvto1W zsa@&I7<$_xUcA!~3(`NL9_;=S6PkOZq&3RJI`knS!TiVcMQqWdGlHc`562YM5jPvz zADfjP?Amg}a&cqP)The9i%a)Mt-;538!xFXC@wSTm_EaKlJ%A)-O@oDKV43%>aJ!s zH_NWa{#;;evpD-(?Mlq?gua~-&KDS8c83x-buCOMiY~d(y!4WVozKTU;R=+drqiBx zQoUEAZil8Vi}4BXZkrKb_l`rHE#x~tQh{hU-Qr@LskT@5Q&J~!3vDT(3j)!2;zv3rxl>{7_JOmv3&OdM33&?hr^mSME3UZ8awVub zc4L+GjRqS|6|Y*KpZM~NXQ*!^Ikw@jx$ZN~Cyym1?`gCwc;G4dV}8b#5?o|(`1zO~ zvG<~{8|n%(%@Uq+?NTBhn7mq$ti9pVah3$6#Rt!vQhF0hMZIftnf2kYnVUer!;x1}JN7eEn1M8_y(o7mPTjJR=Ul$d@6Go}ZfUg9) zD+T4doXxF1~B!%?F0$t@<;j z#x~OK@6I@h{rG-L=f^%2LHSPfK&V2p3)0l^PBzc{o)$%I=2KDj1>@)Qo=i`>`#yBr zqi;_085df=Snd7f=s})&faHK{Q`p&f_}(O(9f7oRrzHIlvi)Fec zkDkvt)?qE}pk~mlP@Pb?z_<0{wM}XCSsSE%68Brw`dN68n^tY|gfKP0a`UdRt7(mS z+=AUlXZfp`3cgaLD~nN-6=w=RAuCvW`gqNbD}OmyR8>nXd+fBIy)ka5{&CkKr|P8W z&nsq5He?Iw&w6E*nrI#KB68KyV~6y0%c33hb)RW$*mg+6K5LPNl8%Wo>wX%AaM!$d4O!VzbUMv?`axU1!A$FHlUMx>zBJjJDZ5nHySI9Wzca>B(+#-a83*mYfdn_Qmb- z)x7a8SYetNQ`)Qme%RybAj46Ne7oY+^kNaBH%sEvX35aSrTO5_&PB7z}1gQXQsz|{fwP4Ja~4CV7O{+ z`d)pMv^wcx*^f5wjrI4xxai+*zR#7Y+tHc7wbemsqY73PHJvsuZnt2uZ`-m!JD&|- zY`3qxOD?`pWTP))b|?lk2C9&XP=fe6<4w?j}*Ho zrV-G!cAn~jxyh^}^6?KnuA7}HS9N+`u-7DUmgDe3`nxYj#1=$Ob<=#Vdv58CMEGTA zZ?e6L-L2`tZyuLE_+&*+zSo0Qi>Z8JC*VByi=+OWla$~Rhl}^J`!DF3(x!NcD@>W5 zlwmwm$V*MwFH}_|oW4KCExgg}-o<#4rjPgEuh25OHM?t$!v^Sa zccCtiZhs7Hs#lVBeJ4hka6t6MO8YwLj+l*h$>LjdyM7TS@I`8H?L2lyNUlA@-Qc5IM&Z?fL9tgK3!SASj)&Tr@N+qSaf?2Pm-wf=7F}+2XrFkL zEazL_2WwrC`slEhQtV@wpqtznQB%v7?nAbPrh!9J=eK1l{CI7-?CKqdw(2L7lbs}W zn>Lt6QFmP#A@^L=K9`~{k?)V(?%$(qWqNJ(iCk+dwR*rj=Ywz}g)v*;tI421B`%?(B99Q9BjUD~{=kIq*nN__VRcHB9ILW-q%(_FRLK z&tbV$EA@u-MV?)bpE3V+76$cdwRXlgY&<@MzSTbIz?+aYFT>@Gdj_5s`A^b+R4-XB zzIBsb}(mmEsHFwc`A~)pNFOU?#pf&sCry!YK4<^`SJx7pJRSmWyub% znBo2OV~)Oz4|P4Bmx_bDKMJ&8d4tl7DXb`5@!`Vc%>xdOf)!!+GADN=DC!M{pVuHy|QYl}|#|R+W1?*dl^^`6ombDFGtw(!99|z1KkdJ&-d*!RHnV=UzMhEMt-&0L&Ij4w z@SeQ_U*u;9x~iHSx3WaqA+o)Kr9?IM9+WI7ikt1a&1GZUt^KCc@7}jV84pg|=w}gz zuZZeD#Weq1=dJVj#RciZ+4LUunaRz4W^c2)-<0(;hE87A(cTj$qNs2=eV1F`juRA%hKlB{TiUNPZJ@y?j=aZk8T{?k z*w*R@UyHiUidK|wc?J$$;cw#mhgK1}i4hl*#QF;Zjb)y#dGYw2P{>Th!Ls4%cH{fr z#dB6S$#3Wh`A{NpT)^SB)q#y!v(vev=9Om9AWnYp)cBK(3`Vo|^5%#4+SNk)eID96 zyo0_TNfEIYdErTF4+R@$s6TKNad7j80~s;N-YAHRt6QWmJdkhfA3i02Z0OvbSc7wm z8ZWBlopP#8c3QCeR0QSXF~tt@WiRH;>>V9pe!=(T!tOPNwRcH7WKW7sATBz!=Ih%t zK3C?fzP&HG>WOGyUCgG%({G+pK1C8XlhiDBG7!9jlFt=sFPqPGdx6TFBAA~mi@=;!C3!|=Z?-vtTN+#k}|`6#N@ZEKMYmx>2Nzj#Z0pDqvi(cs$rH}wv| zdEqSMn!pX`pYSrr)D^FcQU37P-qsYDI)c$k1yWjap1>DbTyOgqB{j(ALn0a(!ni~3SoZ8I; zId}=_H4^uQZdIul_!+57%TYV9LN>ND^E`2F(3oUd6|jEOlCLGJ+pDDu+7D^%yJSor zI2=5UT865>r0?QfSu#yeW=(?ZOS$gGQ(CU4Z~0xh*pa)Gko{Uw=ZE&uq?VJ872E4* z(P?ifrv8|=&A#vV=%&wF6rK5X@tt#e42fmW`U%OeqdwTLw5`v)yAr=Vx6z5%CONfs z@C9I|k56)Ux2H=j6A(4@mtP6VVq?LT%cV(AyzK{B!D6XUwR4>A z7~5!6^^rfX(0k{CUv_4}ttT&fwC^S9!Jl#U66oJx)uaaX=xz5_ih*k;n+hAsTD9t; zKzP+qBG1wui0tw0SDB8h>)xvp5x(`Fr^g*ViJDCGgmP3e*WgIvfmx!RBuJnj%yjG z;KD9+VutX+SEn5{F=NcDtFw`gaLYgLxZCWS``n0=%gs?@2j)-K-uB4sxrE{c$vsW# zBFE4>+SkXbrbjp6yl$v}HZ4qEb5%Y4!+R*YOWyV9Tuvv43M=%949^X@mKIprp&)jU zRfdb!3w$9QsW;>oiq;7y1@vxMtG!S1sg0&lN` z5+*m832fJ0cSh?}p=B&a!PqKx@8dHJ#k|h>(tN5c8vW2bNr8xC^5EguB01Eg3L32~6${@bypeu0Ds7M1PKP3d}Aa zU>ws~pS}KZ&e!nxsc55*TT^R-l~Mzv4}NvIYF2Hc=a%-6Yg@~GXU?vKmP!T@ek>}`C^-0&?AQGjiq-35JRBm#UIcFUV|QkvKF5lSP zVXtw=AN7rUaM8M;@2BouQZ1sEEV!-z?Ib>-8UE?2Oh?sl<40$fBBXuxgxO{ZU;8soh-1O`qHoR zThrwG^0%W`m>v`pFIi!w+g~nU{!kpXM)X3W{kg%+&tAiV+TPzn5vE#|YE zlI98Yuh}Q4{XJw~r0hve#7kG{G-g)~!9R?B3~#?tfy$JW%g49@)Ow0Q>lV!E5c zj;?^z2g6>{Plsw`LPe5pZawIpJeceLY07 zQ~9Q5xwWE)MyR@rQ&3^c@dt`?zA=6zc-JgT3O^uFb6L+#xkP5w2Kg1)ZBoXU`Zkno z5!d{@lDug0^)zj<7*6+H$Jtn?f=hev1{=xaW_)T5ykm3wk<7jLGyCI~SVT>q6?~x} zs-oD09da;WZyr|hN#qIjl%RXVYR6Q}ssyYq*hR{kVP?g;#Cy2UTi=^JKlYKv88!bs zD|8mPr`#n!wyblO$k7*xO5c~M^S8aH9$%4bjmu=KGFq6$-tnG5JEBO9uk%7kLhZ$?WZyE4i@MuWUwbsxFcCoH4B8p~`C|7~lLfaT|F^zrsx-~oRym65tY@A6K zaF8l?j7Bat7gk&OeN!Jnc+)^7*FOUd6)d?7b&$v1t}TI zsA}N8HWQ*<)o-w4t@^Xyo!%y~AY}d8Xyp?IDSZa4oLS!+a*35qc^W&eVW`wDGo(^IQB-b_@dYk>t`p-GOp4;9;=+VV>wFcjeA@} z`}A3K!KW)zH|IvGP0Dc1QJ*_h|4Aby>n=rnJG(2sx0ZT|vtHcVfv$bR{j+8h*@EJ7 zH;Mbbj7uMMt%`3(t(H@KZnEK8c!f&n)dSSNTkL?7vC}QGqW4r}4Q+GKyuGKuqGssD z%!bCLSN3t{w&#^=8`}m`SBvc*=!$+HM3?Z9Rq>TA5nFq&-PT?EL}Y${pxc|2X~$1} zB2I}*)V!;@w~OM?5xhlALBl?CO0C0OXBBSDsnVXbjwOE?Z&^Kgzg0HAX*e_YLmVV8~R(d5%cw>8^Ztd%QW0X>Mi>n{#@og1C9dGW~`7r;7eq_azS1s(L z8yG6~7h7(u4aHUpCOEspkM(o7m-pX1V^|#PRd>z@Z}hQ$|ND=i1$hp@$?@L$L zlfK@p_CTS6h21U9x<{F3cWAA2IJcs>&S)?$z5@Jj~ySqI_PKM>{09 zo4i4w34ZNKS*(U)RLgy0k;+;+_|>Apd)u1Y%1`$L!?OZxu5~DX{zluqG=H!y|8Y~I z43lweUYP#3{qCQ_C^MKtUgkrgIdzz4H#asv5J)(ITlQRmlXvF%RdQ*5h{S`ml}`=7 zF0Ol5`sDJnOVk*<{70pBXU^7b=?>i>&{hy3%N}aneAwq$?>6lLz3%$1*WOOYEiZZ1 zeGJ;Sdw1K;ZI!JT*6eHVlgBx=dJkn=dOv@jc5+_B{xzf}^E-!MUKs4m%?Q^1PB|5Q zK&&NC+}Y5$=c$BU^{qgC#>P;V%v1FbZ3$liMIYV~{Ao2~*78UGhc%+w-KRHSQvY#k z#_8+v^eeS9%5s){dh5A#ZFPM0+Ksz|U5%XAJDAm0W`EtuYG2aE= z&e<2Sc0FdMk#s_)dS{B&*ZU^#y7#nDX{KJAYW z`*fwLcHf4QGk(1RrkOo=Bc26(?NMj{;H;m?mMW1GyPJB6Sz~qVSQz6o`7ZJ0^SFVB zIs5v*nUy+ibfI+#Pm8k~|3`c5Q#PjL8Fgm+%`?>!+7Yc<%i{%<#5dUp&>v!Yb5oDr zTv#0w`@^!;qP*qNyEVabioUHI^B1cv4+_w%X`!7dMm?x#3Ck^3I{v|@bDd_nMyhF_ z!WlyutemXim-_OwDmlGuffJfylv8mp(AoJ)E~)JgTB9z>6R>igN&_q1HwkNsMn^S! z?pi@nc$2DSFk?zUdEcE^+6A(+Pf23JG2~qz)|Uh?vLZ{ZcxaN=wdvxm)F%qNg{EdJ zwMgtSvo@APC4E>M|IGFkn$m7`r2gZkO=@!u5B5FSS~;V%r`AEL&VFjSr`N0*F6Hm1 zW;lh~%?h`PcpzJkx|PEcrfYXqTFTz27b!-cIuy^+ zc^S7?ZjI{&8XgP}LV3C5B(=|NLzu~BpItF#hu=&37$XRQ@S?+>0%o9pXY%B@DqL-hOiKj!j%zrSP1P z)U<0D<$}wD0%a*qxPpC?7yD$2yL*OYPaZ^HncL2pcEa2JX$rZqAWHh0mfb3iV|hpB zM60x$r_c8{c`TKjf}UYTKXtN?ax&VoX)s?hUp#(JW@@1;ik*Q`B>NY1mU0!9T$Czp zbkEVS+Z(K&PRkU2vtRGE6=nu1s$ah1BWC)B8J^^zsEVk4F1fpE)$Uhq)6QQN`C(&% zpq=iC)p7H*4c8@Dr#2GWkMD=~jWM$_3AEem~^3Rf|r>#%j$b`^9Nll2wE)W7<3f)OO{c ze0k;UB*C2fclrY|bA(qam4$J{yc)KX4>UY(+O_)Hl-v5gQzM?vCCR_%gfW)r6`ir} zS@@D1JvB$di)SoBIFhblXWm?8Xud=DtD=RfxWAf? zYsAiyb;9ejmR^{i?GQbAxl{1fE5&Hq66M>iiuJ2VOUPM0yW;7Rwb~mNpG=aar8-`D z_GHy2HBHeACf*5&s`RL={8~Zx7X1S{ae}7u>sMFoSpCM>v?}nG3E_>2={ot6mFDs5 z5{`O}ckp7VtOVQM!_;EZERt1{H^#E%VBXwSC$ZDb>>qwWRn~9H_~e>4v)vDSa#!b1m%&cj=v|igmH^bW05> ztdjeNFo`pEEOP56$;9*6H;>9It_@1+mYAG6Wjx!Vi?X7~G!2t9XHL6L;_>UUPCEOv zZMEMSSQwbgDZP?JcgLg9E=QuG8su_(MB2}$e$h^ral7VFA-Z;2PPebV%ht3{Ci`{# zG_y7DNNSsXounuce{R!*v-j6+^4$8vWVYJ&=UHFX171v0uK#kp+?Kv6Rd)CB%iFqt zpoNaccVlMgXDfKgtTe-TI$2c;&9X|kI6L_aX0k%#x)WGS3w**oU2a{y+8Y*1IYnbz zn5O(p8&2~wO5KJCF2(8=I%SaV6lVS-d&nIS*>F0hCVgNCH;6}B`~Msyqx=k?R$r@WdbE0 zOXvC;6q!^_Gkd&WM#nNWb&9*`TxxC0CgHvBbwARy7VIo$inpP1(z)uYG*ma&YJHZ( z<47%;*ckGR)#WES>PxGlm0Tj<((v!Z2on1YO?NJjO=(z5$(Ss&1TSghp6Z~@est@` z)Kaq6;XL~;3(b%N+oEXK-jry6+wb*K02ftr4Hu&NvUYlObj2E-smGPni&G_{OA;I8 zRxgiJTGBMNvO&B>^TfxwNukm@#K*3wW)JS&shs>!Pe_q#AN^3N8y~Nq`}A$X#RAQ3 z{u;YW4i4{F>SC1iR>}f<79+JTmtOHo&Z+ zTJX9yQ$B%(@;qN|u(kA+*RIMYPpZK#hd62Bsl7UWc_~Aq8mmQ!fB)m-buM7yGTz) zSW94e7D3uP@uP&Co1F3LP*scuZIkudhk`kS9gUGIpUjiESQZmd&HKcBqSP5-ROD4 zx%?|#P0>%mMM6^)%gD}KnXPeruI$E)jlMWbyIv4b%7L3vHGAc8?IYJ|i`CXLmoI-c z<--=6V`iyOc3)58h}F0xZ}f=2H8cBil~z$Qai>Mv_QaK;zF%G%C&bGoAC1_cViMby z`(XDDvPfU1*B}$Xp#S%<&ZeaUmX-ZA*i9WIiR;z?bJ|JtkxTigeG}b+F za!T>5oY^k%X2Z73P|XstqQ(^UEYr+~rji({4$0-Ijk(9104q&N3#pf9avis)N|w~S zJk^=nDtiGXsjqt#Qx=7ByZdVAZrvOG(%Lh&-;QW&qb_KvxSrHvc*Q}wEiGRgOpN~b1S%IM607#FT3 z-R_w>*Y2Qjpl*AuD0fQn3$eydxow-2@>Hhw=)7F4TyFzEGf^u;^U#Q@-R0Y9)A!EC zzT(^IALUujlx1=`_b0b(a=N-!-9FQ&aVBk=@FjtxbN5&gQ%z-8hM37eyeD=|PN;R~ z=R#M7y*3?(Gvt=2PAXM8W>%YxU999gtz-=&{N?K%${Q6^yjcahDF^A4>k}LnDlv>r?EmG>LDU(EHnqQk69?!0BOnlLR>PCMI>ri~L zre4EX!_G@H`a&7`esBJwjBG{hi*k$Hsuw>*Chf(^P0cG@yF=6y?M)EQ($ceyQ=&QS z8w|R4)nuEi;G~m3k9=5bgWce?|7MwD?r|@n`qD2d*(Y0!9;}_JyG23Qa+~JroPL+w zO}jV?J=1p-?=5znEm7$)y*>0eJ{+@dt5n4n%~W z_-S6X=x6`*+dm#|Prbc0`uknguLpMj2yen$-;|gxW~re@_i0UW?GOx6nscfs_IW7r z$7Xc1u~n*9Pg9)NQlXMa({9`&+A6oq1B_UM(8;c5YWgCUMzNEa*83fYRF_!KMYrYO z?4aNMp!r&URy^sB>^--6avjnZ8Ru$Z2IpISVf3Epxe``on9(JDJT_?EECoUP@`EQ5 zR?R*yej>6#Yxd-1!Q%;mnX|MW?w8D3W~cP^@Pef>B|EB=I~pjVs zLmIa(->u9SF7u;J{pT#D*GAR~ zw^-kAm-lm?fA7nA-l~tf@A`%PW_IGTbA=uE58Y;n-+I=M@fXl-8|ajqMV-FQ-Q$4E zUgbO3ip75a0uu6;hJ(?N-Psw1S2PWCSIxV(S=><&gn{~RCP75%!{N&5Qd+-KRF zsp{-bY0Vg%TGbJLT)53zCG&_0n-f_omD=%suesRS&WKYJI+uQhx00iHw8X1 zh)k8s^k_3(7klsss(kH6gEuk)8C#1}q%7q=tXX)uu#Fq5MoY-v_{b* z`0j6=$01vByQ|1Wc}W^~m6Wz#bLr1KsxI`*-Yw8WXT!6QTa%5=Rf`%IK9E@()imjC z`d(uEha)B5D$0&a3S@;RF8h&@-;W906MnuhtgpG~-cbQ~dr)0}_8>7R7Z!)^Nv#|T0(*<6OZAB^I#^-y$} z7~Z-tSxjySitfRH+jw&z7g!7~1Lfn#q%-EDY-#@RY%3azfeK=BJy8AuF0dtRE|bPW zE%#xtO_!p~Ij)Rg6wTkCiCm#G^x#o+R)8y$?T+$i_|V{)3>3|s!RC%U$N**PLxX4P zV-3&-C_4_^@5+F=T#;Km0=#K#WTgxr-fSqQKZ?$xF})eC2IAtYJYcF(E+AY%*6qjO z(wJ<9tG+)cz>m&AvETzdk2lhf;mSnV70B>&fdzZRv*113mE&hPHV?zqkgq!iC}e&f z(||*4f39Bu9pTqFYeqL?^bs^a28#ZNXYe;*;`IIu6q~~Z-ts490AV3xD?p8`z$FA> z8O$BPrhCxX?yz>0DT|46;CLh4@elCvVKI?Sb|8?^SRNDLEr~)fLRoVdER=l!i|OS> zV;fr1ykQ&c142VtaQoOeE-cdli$!@ekm;HJ-bQ~pJ#w2r132M2!W7;^hLeROL_c?Ke25#Y{Yy9Y2(x+bG<=jib{0hDo3STuu#B~x68I9Dtl zO~MdpGzt++9D#(PF>quWo`|JjTqz{Iadyy<-KGcl`5^+xWV>9U>MePYx4UunMSm19=3U8DWhdgT`Wp@)QseO`0o6 zCZBg)4onTC`+LBiyYiHCM9>Vx|4%Su|91`lk^}#f|94ota<$DW15Ys6|I6bLr~dc; zA5TOR#xMcj|6|b@0{;K{|Nn)@|MuQ6aTH3EXI`l8U>2!RkSQbrnTRE0NO&@igodx-8E8CAh=)1J zI2?&YB;W`zJ(z1U0Uk}nVSzphh6p#}&^R;+izN{VFa(dqQ*abKhD6lV=K-DP)`>FaSMrHwuN}UD`M@*dM?&!cWbWT!1@V6vAY%+I}dE zz5%Qck1}3>;-ZXE7$d|1p}-*KajxyBfSQCj?&?f^shTLs%e1@y(EhreAw z4+fs4kLN!eJ`&*L_$M-Q5zC`59R44U+y-SrHiylGX{bRQKUXSv2rPk!P)tLVmO#K! zXs#rj8v{dhWzZNzq8r1FOebL7+~_!p8^H~Orvq;pG#8vJ9p_3RGtdmID~Jc4&ZAj# z6z);!9DgoMJ0e)4E_&=6pu`G3kU@wru=8WDv8C7{G+~|pOp+sPCng$Tk8rU#21pYGSq|Kkt>fAe`71jE=2cfOGv0inN; z!C|>l0f-{&aA0^c=t!{O5`y9c0M7vnGJFGo@mwaue|%GrA@l$)$Ib2cQ6uUEs7@b3 z5&*>r+C#Ym@Fk}09bWnaX5Y$G7ozL?`a`8 ziXnbJbNKI2N{22~^fZoo!7~)(kpl$RVlnVnS5`rBb>p^JgT#lc=5!g_m z9wy=8TnMosmek`LR|w{~{6G#q`+1LARahI(j#7PSOjpDMdQrV0*o5bT9~)OZ{yl!k zzVWW%uw)=(g4!ZBluthl#e!tx#+BNKLGz+=f)L~F#$>Qukr^Xe zm{HXkpB%Y9!kSV0gdyXJ;6w@7u}QcLwm-*@%IC*_uy8R1#2_wgFMU6hB`pAgX^<5U znm+^&K`0i6#}OpD8RfH|+Z-cQ00fhN#T%Z3LZX%+4~WW8h!HXPRVCmXCY$CLG9vn8 z+e~xyW^zFVkX^-)es!IiG&hi95LO6Tk?TZ?A1+aKtoa5?>@c~$^cG{zq{2*~+C82CNn41uy8w3`V8|M1uzuM8J>`bcw?PM5O>C!~qN)=fo&SM*f}13OCRj1f}t{ z?6(;S7{Iq^EQUmYB*H(P(VfL{fqkcgiAMB_3nDoxI+_4rz|-RZypl17HV2{U#;>cJMhKIO;g|HiF44O>B6G-5gf6<4DYn`}I{+wW$*a&+;VaH#Fu&HCO ziDQuT3zZAf<&WT%UzkGxC;u9N-L8^Z!0WJtd1PF;hqS0hL8MgTsY57H5Tt;B#L=M1!UsP?>^&t8Lay4#O zf4AD)nW4QBFo1Y)gGp8U%l=i`}RgyH`J^a3?}|MU0DVfgqnS$woKkpX`Yfq#x~ zdA65D^LBBiQ4xMX3<>C*f<^*WJU^NoQ=DJ6WMmA_CGms{0^o`2@`v4I(L%sp@CN<; zqJ5F;WAcH;{ZT&r(0?)8FXV!A`eQr<+kiwu24iET!-lE?LbW_)QZ9}gO&07k<_nhU@`9|S!7x1IT0=QqNw zFeDL;r{9I-l<@P(I;NGrfd)B5+oc?8?>jSDa5L-l9T=w1j-zd4*=?CS`i2K=2! zNQn^tH4Fs2>kj*hB(265FhNHl*@CA`P@#XyV4mIdVuV2C%=M=NwgU|OPnP+2lKBS| zGXc;3&KeA4l))BIuo%b;f!;wTXX%6>8FuSffMy1Nsa0#gFF7Cobb!LiF1#D2EIAw zrLdtO%4Z)hfiXJpZ^uB+*_)rZGyG=*xU_(OHb374@G0Yy`7g#XXuKpD4yiAUXfI+H z|DgkbUIw=j_%X8KzaRxDDEymQe+_Ydmm~sqeA53RsPtxdyMPdRFu}L-^1}=y82%5P z_*;bjw^7pX^nr?kszO8w7zw28PZ()zPM**Qa##W0e7}K#y3N?@_XvH0;2v7qk4q4IvYZX9kd*02OH?p_*f;|J{fEMbP&{+A*7@4JhX1x9KR{}SpVLC$ZO=^v&H zkbx7~`Ufe2NCy(q3^uO>=?<=e?_@{oO%y1+;(?P;OvOwz<489SZwq*-A}Vl%2M_+B zj=bX17*+6QJSj3-OZx?$@e>{%3>p-Qe>X*ccnp6Sm*$St9N|wHz+j}!hx^~A7|n|O zl0rqY_8<#m8C0YM3Z-A{c=8>C)HC6$QM;pw;AkjGkKcjC|8@rsxr0I+&;IkU_ry7n z5f~DAJpB%}l3$;KN9wH;halBhsC$jm!7H>*yaOQ=NFO51V$xC4fBi|z_Z(b1vl-AFO#e+N~;z&J16RBp<8PFNXt5c3`++Q{u;D}IV z!4vQ#DAkjR7-%dY;h|>$;yozclZj~Pydpxm9?}L#q74VJA7oM>w*@s-XbS+Hf|dg) z?c<@901wy}je!OPxPT|&;5vN50ItGA)sg^QB4RKYa9c2OoA{TU*K9cLiLnfJw z#$gej!}HKs@+ipFGQOCpmgWC8$09EF#Ghq3`0GFQI{ z#zeCIGzjybWbq2Jh*put>;W%E{Cj30GEX3ppnC;Ngt`wAnq5H7A#i|NH)Tw!fWs51 z`okbFX(O^aQt5`FNad8@DZsCnj!gxLJ9s!EtQ24b(g6V4H~Jkk-avu|L!PKsf7#xE zG^F{BWD|ZdN#k7AM9RxlUegl7oe74XcY#;Ch6|eD*rAR=9$Pnm+<5&OV@R5CjhBf; zhW)n`_!`o^JNJ24&4>%M`M-q?0w@H~@0!Cqq!13uB>BSsj59d`*>Udzq|K}0+e zY1|{=kk1n*;Q1lSgcSk?rH^w4 zp?Un;#9k*pm70GA6!gby@H|G2EeM$n$ESXbKz_ZH*W&^CU8qAsy8s6guHFHNS?5y; znO~%_9Fp4nvLjqr&zlBR2a6Ou5f4SiqcLRgLnO#uL4^^LB4ALEoHuwbq$35)Fx-Tp zfSrSGIdEN|Nsto;cL5D{h(E)?o#5EPp^=DCNyI{f5D5n(3Ha;&LlWQ>NXAfr7YHiAgN1`ED75VnkkU6$je{OPD5*f04LKUb zGK1}bj2N``fdfH9zam&efct2G2RICl41IrOXcGh*4!j1g1F8djfItBpRAc~LAw6j% z62!#Nwgj11s0<^#n(!K7ER-W4@E zcBE!9I`9wXYDDhYj9@OW=WN2`h*)GpA;FELN`9erlvKZwUZuZ~V|@%jC=wFlQ-E90 zs!4>#Phc^y2N+L*sX?$w&|w7`G9olcLO&*mFO-$Rd6Nu@SQ3nd1U7VYf(%0+C$O1- z@El<;3?qVhgO)b{XaF>!$pzXZ31G*O9{aJ^xG3wxHj{B=G8Tvch(G~|M}iDFbPyvx z2OJTa0`)Z>)+0l(2w5VeyO;>sb2644kZ6U4&;{h#OydwY@hCT)l&0I{^k^UNJ;%5Yd zsXF`@p zpmziX8VAikywea!Gnzls6*+$}dKhN3Icl^-HyUgHA}z?m`L-KQRE(Wv0X;@qczJG+ zkDcLY4HM~E__bYCbF?r486e1iK>G;*NyOe05zs#xV*HI8z>XV!#D$JSB*Zg~dtjbX zM~`1c%sOVguL|*Nlrfu+_>9q}Mljci4+HDKcLF22^jizpDE83gf6rpNK~m0}*B^!( zjduRZ?SLi0j6D{iA5R!}UAz@g#)DJ-8pes{t${GUCM0MaUj(uw;x9D+MO)kGDmDMq zm!`?HQb_U|IRpsPf)O2I19H-2v>^==JDecoSQgxY6fUvI)A>@tVnVYQGLr8CHJ3ox z04za6EY;5Fz9ua-n<21c1S`9(On2u*fidf{ux1LzsuCI;EJD4fwqAEUrGV5z5#85fOC0-j-}F& zgb|0AX8-aX}PxbHkZQMDh4ejbHaf@ha~|d}9E{0cpL0IwsPJ%0B@y znj=N=`&*%t(v|Bmj#B7MA1FG~LRcKy#M29CEW;I|Ur6at7;X$Q0|O9+jCZ9l2s9Tr zEY5}EhIOGK2prIbiwm7Vcg47n+{g@97osb8pV4SpGYC}LoyzYH7==Wzb>Qrf4*8LN z{@eC%BpTo!s6`sX=#YkovL3H(8QR-fU=963U@}c}ICTk2=6CqQ8P@-Yy?5_!B1!W8 z_itW>hB-TuKsHsSJB<1~G;Ma+>1jB?%(L_J!|K!(tFbM&Bm*9{-}~F4huvP*7X)FAMMaY}VFNA>E5S}V971FtT3-(p<8hA~-mW8XNuX)XS^aahg-ejS^}U^!x}-#LmOhHgS@*>xwyYKAx( zVakx95~b^=K<=k?^yPV9gA=wWbi<-o1Zhk-Z&4&^uNV_>S`>24H;&R?N~mub7QI12 zu<v)(Wvtk-RH8zto;dLGj!;u>dynxWTP939VyBD1=f2;OCbATkZu zvo;d!BpPbf&>M{MD7b0fHpIXYZSw|N4)y*lZ{9C|{5pC4T6^=hSdLcfEA?(cBqnT~ z`*t-{n6o*7%Z3v+8l_3x-sU!{(`9)I3(L|~6q~#KrK<8c>JB)KMpV8Ll?_B?3sLz- zRJPHzq15GWv%6jd3`=F8Wf-8_a`Q6~OQtH`a26@!n2TYMcZ(GB;wa)6kPnh59$<7& zB9wmak;lEf2(#fZ!^jwqif)3bH!Co*kNOlX?~ly&gk|7Dven}9Wj*GaKHJj)s}JiW zph|Yf#%tvS+!lh^E9Xcfx9g@Sjn6O7S1(LFIiX($=Ho3eJ1~*|T;1*c=jyxuf37Z# zAvf`S=47Ukz&byY8)xKf1v~{!sQqnWdRL=c=8ib zv95Oc1*@_D73;K4qdYPf>eh}TKh&Ejjc5J?`uFgMAFgU)P*S2)$@S7_Ht%)2>en@z zFK7CTns|60jrLOMT7TBIpY-RN+ka4sjI}9v z^y9(9=U2_a_C~Z>wb()z>lS}!vD;$txAXTAtKwotkhU<*^a3S*ijm9QdW`ID+-7#C zN5<6T;Lbda@`HBwcI6WcBfk9u3W^wXKxD%lEvmVR%uh5ZyB4GT0Aq)Gr(<}+*fl4h z=)%q!=pAbpGoE3((rLNXt~#g)Y10@}JL6jS_qi>%SRy>TZm`zDlh9sfgqzVyZpUf2 zpBG6!iiZL=Q((@EK-C(=<0$8rw%^aXz-kjyiS+BaBsz4Cz zb%dKTXPh(P=;I_#!ZhaoH&1(6829o)Q1tR-l#b93a#R95%i=+)N$M$I26LM$`!pGb z!!$^PA(zb={!iUuGDZdEJ|vCNcR>TdA8>t|zUGBkW!3-qg+R&rRH&ER_x9#}Kvdm3 z-RON-rS|E4#>ei%DosI0fM1y7Ww$@$KA=2%-RyOkr9*VMmEISziOVyQB}ui=lq|t% z%Irf7aH`pQ8{}&#w%VLmZ!hkq(I~?)v=H!EeV8SmB02%>L#w){aW6=H5&LHRKJ$>;#uH+<&|$zC0X4y3rO$K%1zxja%-)p>CJ(SO z0izTfU#(`3^{nERi9vey@WqR%z<5p{K6>=mzx?&bhc6F)n127`(?@@vK6?6>XHQ=| zdHLk&Pq%OVx&sOPT!6Lz=I>n(|BpZ|?#+MtJosP5_Qhk$Vf?QDivwKbeiQ$mf5CwV zpSK2nKqtF=CT{^Z}D{PaRGDfbn; z*Ihqkd--C4>jt11M{_Q?7ztORjfYu$0{+qQai?+d?jHjXe7OC3_B=wWG2{yER?3#x zu*6NkS%L2nNFRx+u@+`)F%M(rx?nKxpIuZHT;r2$>dW_kB;Kd>{VzfHyZwKSnf>x2w{PD*P!B_O@+yf~ z0J_}(;F-FB+$Lp0(z0 zI`D|)5=V&keLYIgc!CSS{Ehi4rV8+(I8Ogfw5kK)DlPYhtqB`!D_epyw_K#1#xJ%a znXp->@m3fk5B4#*pDbJUp;W7CT4U1S)qP?KS`>cV3fk?)-Nr9>-fCy07#-4*Re$7H zUOJq;;%$9a7S6$L+$gwzHb0Zve`5XGw$J&g@aC4jU5%VDJjKjQ?Gt+Bbr_C#zF;t` zg?-OW*yd{)*esiGevnt+wC^`u>un_~)<9=TJLBd_FiLgso0Yd#=iKRb0AgRR+MBH$ z)@!e-HfCfy3Nvqp6tbE4W!EOdja4raT0%Da8BU7JmaAN-0bp>1!fFaU!E*8vry#x? zM0!NUq}A*+JB{Z3X1l#_-{R9z{@ym{mcm$NG(fXO)c1?zBbL;oHAPb z{H}fOTi|RdHE2y5haYD5AGgBxui7U(%uqlCz_@kVwzUzgw4}yEDfOyxr*W#o(t*nF zLOpj2SPNMFx4;G}Sj>nLdb{ z7w-U?*)r9rk-`3I0%YVDipZ8RBsh`&qCB0iCP7Ex-Oa!6CLaPbVpG+-Ty!_>l4&d_ zP#CWZ?-%3dK<$=|+D@EZV9eq=f#TUV(P5}fe-kBw8P?Rn{D<`J0b;oRBFey}Lt9Nn>dbHM_HwqbdIZT`l%lVRfx3&4w8CW#FEBBsg#S6zQWXLrB zRNzY+`gXMpGDvy8FCuVJ|J^6_llXnB{0`&JPg^>Z^*3Z+>k>3R{95*1ny8IStSE;b zo%w@PlmGV7*~Qbf^6GPx8_5KlF`7#1U2{8YUvAG&5%;oLm6j%|IC79=JSUZ-xn zlZtN5kN?OQbAH6P&+^W6SrLv^PT8gs@C&gc;%?6dcx<|TxEH;G zkj=K;3#)A_^Q{E&%jQ&>I)plY+4q1>8-HlDYCr6SZP`aKujUUIfZn9ep~7>mS|it!oe8aocrlD>Mo+=$$L!tqsWdDWOFdN0@|e$UciA9>Z2nZJ>U2*$`Kp}(oFRUrztWIZ3@7fxW=%pRAUBI% zXm5iimSnvX3q)_p+-moRoB{G%9Ou*8&yUYr%c1X3iHpxM%i* zdEm*Ijg4VWZffNdpJYy~GKFRTgqSow%#x3sEbJUBoiLffno z-)p+O`uFjpIbwWW&ECi(rli$WeNc9U_*yi*tt#XxyLYQTXC}`)a?@9Gx|%+>DetOE zE5_vn^O_*?o6)nL{b5USztL?92%@v5IhDO#8|SB~8h!^4tt2ywimEB)<4Qa8`zg}1 z&dsjurO?34T3U1x%V}_WP`xr48BXgA+)jDTNL8BvDXN4`VR@x)z>=r(XKphoA|ut} z?LGO(8-E;5|shQouq>->8SQE21yLtI_n5QHaXCvYMk`AGlNVRpslbz z0j5>AV25SpYs|IkOkz4BilFKoo@~w=vlu^owZpjEC1v(Z@?X{ZA-a!OwWLwip`c64#j@8|XYAuqv2%kaaJiadCdDWPVntR3qg^Tsn{rK-sCvoBw#}E; zL|pwPBj(IY<#45l{M9zAvI#oZ`MLA9k^$ueI3;?!4qXkOiS`b*z9RU^3TwU64V|@m z?56zJa)hp3)&A9f(^R9B$Ju29#LVKVDfLV_(`qCfiz(I<^FR!d)wIaVW@rzZlDd zPKh!D5qNfKF55~p@U?c%TUw(ts*Nu?bsJPkRCXB3!QR#<&~%wiN`{S+S@h*miBlgrWVA*($ZJ{o@96S{!H?g>m{QrqcmpsjcP-xI2mh#vjT)-L=$!qKm0XntR0tQ(6h z`+ge;CL* zT}wZv=r{DX#ezl1dwO*53^(At)A?+9u_w0zd-7m)568C@?+aWXKGEmP_e}bj|5tBV z`i4qT{69h73wQpX{v6)a=hFYH^zu^wEjXvby&Io%G3cwmIu}Gr7xLd(Mj}ES9B<)K zDR`IS7IuOsW#jjfS82Z?{+iF8A3S>U0vGbVgCCx}G+vr2kPM_403i0RGZj&k%_r;=S9W|W6fb;=S8;jBGUt> z)6=(}K6YMYayZ|-uiAN$?Yzh&1Ns+xk!^G3yN2%;_7&?-P+k4+oX=#hI%j>P{v&mp~~yk1)a)YOZg1 zeC<5KY$Uayg6 zV01oLJHITVD7FS`Renn1+4Rrx%euBx)&D9lt()@x`ImnYcb+T!zi@h=6&GLP{6*KV z_WvT8Y%r|jf01*xx5NLsxkdMC{{8Rnoi7*nz_YoRpT2FJT>zGM+7&pi=lR(&SuZ3K zqD-VxVe2VYfhNo zyI&RBOB)ts6b}LH8DCwY?<_qix1coL(1oD`CIbFso}C|qc?G(Q1Zk~~?BJF_B{0YJ zy|ORAnjBe5`I>GC2VehnooUquHeWZ5nF^$;mi)(zOFr!j1?P)>aeJTIj%iJ%h*ih* z7u);SBuIkh|Gm@rvkmfccn`mCJQSokaCTVaoJ2~;v;UVU2UKE;KjFhp&mo)%$z^7G+ zo#g>soqxaA3io&lCZIeQ@|SQ-1qm=`BGae|O#4`8 zUAN3TN{52+VSd&s2r7lz82j7V{CsKS-E@h_vb!XyOguYg#(|ilE9Bjc?KZIE(5pr> za})EA4gWI{fsSHLB2A&X<2cEIVl`sIPSrazKsJ=-UbAGPNLXbECWDUmJ#;{`N+!siXM&igPic!ESI9dv z%?kEWn)NgQH{Mr{a5WBy*6%C{r70|iS8Is$RWYK~gqZh*ZEH6~6j$M`I()%uH~UeY z>NTL$yk%!WC)TyUR*x4|Y9nCR>a;0!y>bpPN|*zRip1;+pQ-|SY)3Viw+7t@MxJON zvJ7qxw#327do02EN_t|xNDQ1?4Pj$CBCQH{Tw`tJf|W3C&j^a z-Ou-1p)l3AM5YJoenv_x69`V^q%vQk&n%2;Wq*QyA)RFu^=PXPzq&)e>$eV~edrIO z3jEPQ*t#~MpEh8h7#ji!I34nWACo2yHUjGhoye_+jE%v7>^Nye6-Sew>rI*NXv=1? zS1WP=QlBK`b>N()?uKLmvvVh}F>1R-bZcw$y~W71v0#({De2OAU6^@wGxDxk-u#;R z)t;_TY#GKTGi+YnHnTGD`q*?E$pkc-aWzQts`}&l_s*Z`^x@kQbV0?QE`Obp1#HqR zpT&OK>I?oFl*mS@W&GJ;MmQiV!%|)g$iikJQ}2DtcXTdZpMhAax`ENMU(c)Wkc0pv zyF~S-n5mXE)4_{UBZqF(4;w?Hnv0&Y%A}*((->BC z8nd^YI(_R6>0Btpi}cEY2`MlgYy-4mATb5TldKs!Ww}$lQ4G)s>H0cx3Qc~{YF)G^ z2qSI0J#;u4a>QFsOzZbeF@5=wL~8-0aq(`!?x!ZLVGHNEyboqi+5Usar)r;9rNK?C zeqjB9%tys(90N`uxb!~#SZ)9>HzM#F9Nj{$=uosX<(r3QJ!IA7;8U_|QB>hPTiVu2 z^yoi7_HaK)OUT^FI-! z?{%BC3EJMP%s^zy)&`V7z#vfWDrv*OWEOI%3P0OS!U%pqX9D0=`!Kg zqU})OI@wjN`OMOc^%AyJz2bP&R)meis$IjibTZ0e+s$coOx>{6BwMCwnZgyTl`HJO zHq_8vp@uUr%u@&QY0KsJP@rE;?e5odnO-xQz8L)&Wr|EK@^=_}oMbg8QV#1Ct?Cs0 z`(1k$Z@o4rSuI#LY{a=LNp#`xI;cbD6^`GkU03IShs|eJ%Bo_YP-90H-k#tuuic(u z5pf2rU(eS%U9w-yNetmNA>RY&_fKU>XCP#s-rav8Hl zIoLL8I{OC9?^ybXj5P4GFiWyq!jTLr;Xa39F%+R;Pp4vtolaHDo=!EJ`_vlY8IQ^5 z;2D#2H}f9%68j{5e|s3-SEc!|xwoe(rf=mpR-C%sMhlsn0WV2~X-W`BfKXjcBH<2x zo(i1c|DQWZ*5kaCk;=OIJ%X8^pT1F)W;#hyfK#W33w1d0q=VaHcB*&SzsXQ(4ziad ztutMAhua0X)UBqMqV5ME1fKlufXsBy{ywF~gO}6N&R=`Un}rWeb!c8T@0-d=^B@52 zO#uDu1NL#V;s8~-ii$i2!LBcvuiF*oUo2EyexU(3?+asht!?a2=!E0R+ETQ?A>fC1 z_a`5*`=*87rnlhzLn!+aDF< zZd&xhVLu#4LD9_y!@(f#j#EtKX*3@8(mWg`f#wG;llhuto+g7S)p4}WsjTOvj+I*} zsozoCC2%w4e)jM}%Jj{*&84DLQ^ftGOKMUw_Qs=8uR9nPNiif{a6F2-<6)Ep!y@hH zy)+$@L3jk5Ofnvm#kU)0DQS4SUY)alNMFZ8lWJa*EH@foWhhUdKHfjcyrwkKigZ6t zq9UMI(SZ5RGX!5Z8I8j@>%WFc|f+C{2@e5X4zP!qqhGj>A#jkHf4Vk76_X!gp>j zP4~N_zCm04di{TX@bHJf99%MhFr%AfVrGI#!#qrTgP@lt5lQm;NpIYb2ZJzW0mg$- zw?7yS(zs7%=6)7;<56#13VM50S z{q87-w33WG(EQj>6QGE?q`+k{iXxB3Ma~;(=91i2Ye1gdVb5S~f4xEYJ^8iV5 zc_CgteDP-$D_&#eGW4Mhx;RRs{%{-(^I;EqBFQ$JAs+Vz{U9p>x*SJihQkVFd6%I@ zK}x>iK|bDGhW?=YwJGUu2hX28{`;jvNJhOl2-4w*^Hwq7 zOVWx8R)U=D!`^rpj(gp4l=Z@N6z8KL@8`mxiVzA52hlL4`vojE<@q@3rQ;D>$*a?j zCWyYal&FuzQCsV6JJFky;zsoD918AR$F}ktgFI4u)|!DC9>3 zV81^Y4^lFCdv)3YjeFy-y;*98^UD{f8wMjrG0wxJpB9K}+yDnz4B2II*d1h1l!5{W zQy4;Hd4yFKog_};qKFao3iP-ejeB7Mnf1rr zyck6NB#QF1-!1w{+NIy&u$zz40lOyakxo5J@D5756!GdbOEV6`ugwIiQ|{S?*IqdW zr1`Md&4*)TdOl907!u3!WI)3AG$8|g5+*^B_oN%eUY&Lf z!B=Nwr9Z0ISUG^+2s$72`^dQ<4;cf*M9r8D48F~%Uzm0SKgU+k$n7!dFh0d~*+`1wJA zSKt3cVOKEUt3Sbi?*_dc{`;4%?RDNS@!#z#b6-pnbNmeFXBy(+{I;!!ni7WiWt=Vx zqI|vrWV>A6J2z^Z2U#L`tULN1ZpGZY$M|&N1h66=5hn%liS>goq%^(3MJC^u$i-Xg z$pm15+|{c)iV1;gJd!Aad|{q{er%$Ny3#xE`J2uO0U8|tZBPgo`EqqWe{&y<8vH04 zRj5kKm9&9RW=d@uMB^T=F5sXx>%Z*>*+f6!KzWL%8}1r&$h2|7)? zK3bmX_~m@I5WhGzy;>(CQ&*X3wUh1R^D^bO`ZaNo?Y+=;OBR9baatN*X};K@op#<# zYJGm7{m>%++6w>p$2X=c#u3EeY^XP*OXY0)ae4>8C#wDKyEiVjhCrg#?Cki$wn|I3 zP3^^<$*GP*o0HjnBd!?wXtP~A5!vjm=B?N=1+;62>c>zR=Tx%{rxWYycUA6{2kelE zO~5K{E9y@ma$Dt9XQjHhT5;2DNz`Qe9sf?K&N=-kq{J6dC_I=lD(?;~_k0yP(`}(`d0{Whbb3BoN#>dTTie+$4wJn+9 z4$XGlyO*_TVoNlEk#$IxsH2JLtE{HwKeC>!$K<)lJ1-aKZYRiKvi$WTCp{hh^mhz- z%CGWj*@>mRZ7a&?+fw~ZUClB@l=YGXN(J5=ttDZy4dTacyD7!x&mtjACN5`ARr2oS zjqV&%uq>*h@`=mtHdjpkr6abd_g#IK$Hl9=>}CIT`K&}x6{)>U`Y-on zx$&|(p=xpcRFXRCoXW3oD$`rxl)#k zv{T6o>4D7}$O9KCR&h0LV3I9YHj{DCzFWy2t*4}7$V*G#r!)|bMiiG%4Q*48$=Iu$ z#FA4j^Pk~FW?(gG`im3u_E)XB%#>azV|!w2y0p-{}L zJFU|_({9B*S%6gJ%KD9?FZr-J=O1lem2g> zW&^yCWWfkxJI-028e{6UH5(c@q#v*TXg_NUuVf6i z1taciPhDAgk2dqAq~)?+-U{qdt*>jY8UruYhFPfb(;nSu_y^>NjCPHVd{XjOHOznqXA9#Hf8X*eol8$c6+EK1n zxg6Tls!pqs6Iy2bYq7CvZAdL{A2@AOV=+|JhA+ynWCe-CL^CP|GZTIJMA~SXz$mpJm`+v)$hA(d?N1}@_Kku^zIqZ0{9Gjys11;xAAqT0!?xDyfjnFX zzZ2$H2D;yuZ@!>*#Z+EP)UM?-4BQ4288+!PphP8PRMM2?buQq2Vuh@WV`@HAGl!C! zAt*m{hE6+XG^2IH?+Ve1F~lx-CL58!z!KT zA9GefVb5OD62`K5jWiwkODOT_OpJB=>UAYPAoLf5-pJe-hjAg^7SqsBY+E)r&p|R8$ zVCvGTT<$G|$)xH!sd!!CcRv=>Uj$`56!T@bzOW{^(Krk`Qd!n6Z$*(N!Gka% z&PKD7^OFfzGp;QejNrdXtijQ*}KN!1mJu%?^U4>Hj*#fEWr*QV7>$3o4z)e15XorPh`Iv(?` zwF21dmo?f^y~TCjWA*mh%yvFCov(zc(VRr*vnybuw(mlVt+Z{IZeuwNOxOB2DW)TZ zb=UXXQ7JRZd6DT?c_DAu_2T`t)v8+!T`C83i&{OVH*WApwLAx9K|}FEl68VtB5kXV zS(5XHilY*mRjJx7<>Q#-JD7@dN)vA^4eHgBm5xGZP= z&s6Lg_bqVS#H=)&sXC zoY7C`&{L{V*=n@-vu+i`n^4ZxXzFy__8OO{F3%>Yz=))>CYh9v%Q~TbtB7xAEU0f) zsZjpRc#W99Ym|ldx-`^;5cP+ZNaUf2eN{86ZDT4o|E+CqfN;Uao4q1mi)^Ir1KiLO ztI?pS*527r4E>^4s)AL)&Fv{2zg&}Z2XR*eXK?ossa!jb+au3sZn(o5k5fuJ5^^#$ z`0Ae*IDZ}In*RZ1uHpYx#@u}FaIW_M3cJ1GVBP;K97a3;ug{(DPkHYO{P%O?Y31;J z8hBOx1N`I?|7CTA*nWKkW=sW6t#(Sei@~%~!NAKaVAy$p?Dm%v!s_rh{8EQ3>)urd zx^{T)f(Bw5kSh?c56}4O3L%uT`HA}`5b?H70CNN;yZoA;oYlV1PIA!XCsNn-vE-d2 zn2|>aH8Iy+$7M{wwGB|WjKzvhf!&_e$9^@)x4vtS&1>%&RK#_3?+1beV;(IJ1>MHp zhCjF(@%w>g{i^xf%W>at&jBfm%(i-#hk@LBcCYD&zpo(_e;fjzn?5yxHI0Lj)mGMl z@9)tvP=rh;22IdV0NHn7%D#3z5xc`-(^LWsOw(TFi5$Xwc<3oIQw0+h}i_tZPGjogC0gp-#fS2Zp46}pPW@%&0;=Z z8B*luO0h7l7((91ZR}L0)<(CQF789-ras99B39O#hM^{9Q9|GE&z3^|E!xIOQ^@xH zz7WK|UQaHirB?HvRK?@w{(jS423q$ybmyjRXxx%ujzfCgTX>BOKkO7#xGf6_X; z*DPgUo%+hzkug|=|Lxfb?g6y=)63@%AHDP-P3o1cX}~(!t`qfi1bP?5=|pl7SSAZ1 zReaKHKX5Nh+y_XxmViLJSJ8wkR+c}!?|uS}Gt1w%ZvVeiIMXF)R<}JBzt-W&M2O4D zh|Np}RU!jdrXd*({EM{G`DCK(u4&|sK{#W*o1OZ)z-64X%9b4_D_RCV*DEZ4)*8!i z6)wBHdm(pg4crP{BRB?FurSNfEa2i2%qQCq{0GDXr(^f4UEjs&>xmIF`_EO{wEClH zfRQo=(sdF>0getQoM>mrD`#pJ@{;FzfYNi5mi8#-bTW8gaa7lB6yAxfe^=i7*J0qj zDWjXSIZj{ir$_S{sVWXF{I1Oob(I$?7NLc{DkI{5uSq{q5tme59@REZGUm!0e-3;# z*HZ9RM;YUzQ7hUBI_im8KN4=gg#4vGuJB%jU2(5_Z^S?PvB!u0y>P%kp*#xx>n!QN z{OK4fze>M1zpQs%%5U$BJXzNIGgIDIb0LzpW_Y?Xv3@hl&PGFawVe$}OIK4b76N00 zv{y^Lj$Rf4hzKDs!GUwsV*mACH9m%T1U_yFRa8qG2JH^{E$TmxxEZ=`LGRwhHd`&C zv;BO)FIni_xF>%KEy~>0`xdpUBXZn%7kdt4{@vA9bIOCH^Ddd>x`j8B3fQ}_@{+5R z1V%Fmi9e%bXU!&HHuO84c?vOIjQiHxRnnq#xsC6%&`M17fV%HCN+AYeW=cg@!Ub8%2H8L*R!Me=%@k%a`pc?*ShpAej z(@;f~Y@KzS3Q&nVPhhwU^@*>fBa1!Mnl;6y+#GCB=^3mvK@J_W$_{9;)IatKA#nLs z%J()Is?!>*D5p=yz__;K1$02#k4KdK`1-R9OXkojFyvDv%~-02R6BKVDS$_jx0?@ z+b}iLIdVuMmQZarN}Y0kvRy5SS?s~C;5N|AjsbWrE4u`qvznNS`AYIwY+h0MTp3IVoZs>*rv( z1P%FUMqVl@aK6N|E1@bmUcv3TEam>7?wt91VX;zENi<3Z`wfNYB`6|pm|>HjNAY#j z`Eq5@Z($S463R^`-LuvXO|d86-Jhxx-hSUmOvL`TC&??*5yM2S5*TRmJ2{#fDI>YhSO=r`c$-Sv z`9^AkG__rIkd=p_Nsfy(T|o$Dt+$p9C=xY-9c@ojXW$#ojhOjZv9R^?NsSW9n*94L zm7NNaO@)p#Zt>#b9%MbJPzLD!%DNfb)QoLvcY(xnET_78XhJTqwO3Xy+7~-pWZ9mT zbDYN5^6t2bq*;Sr2DKQ+BM)Qwfl4IFVr4dPQ`AV^a+Fkg&Tf3Y$*uTvKd=mO`S^2b()U-K#fw?zUxM`1dAI#(n%@2b=X%iFP>??fQg;}>Ro|E z%fY)Yi!VclR$jsJ)FMOI1%VF?EeoeIScmE+M-i%J7ui8fY8t^tFKTelb~+qevNhOA zshSdTAfs&mQQTkoq=?gw>hXZDV?#gr>E*${9Xy{NJb(W5IoQz8eth_MTc;`ONxu(f z8ScwsV8%1^k2)gEhg()%j?O@hQ94hespyAa5n43_?SCR{^QV~juPh5~|I_iGyJ2tb z{wE5$yZHYr*X?UPT*H3`r56Cn5iqRXF>t1%uoq^aNREOq?{~9anhkR>h%IjH7vn!$ zNm7TK`2OIhM}PXu!{?V{#)3N-=Nb7eMu5GB-R^J@CSVYzeZYl-F?i1*D8$3jV9Z~b zfqYq{SuyI5!H>=QK%kBd!MPmr-yihMQ{=GM_Xdww~f^$^6- z{xBJW0$D`SP@sF$5#z{!;*LhWe86I5JrGvoF(9S+Xf)2_{-DRBIO!L?u{SMdMS5S1 z2fcL+SAtpt9~q=+Ty)cTRE&brXw(N88nDYSNrMQu)!`@#dw`D$MFE5fQZy@&kH#73 z;c0ivI`qOX#8SRw5LW_Q2h6rWTNj{<4w>L$0H}Bv_o5;lumeIsFlCDe{c*nsu6Qr( z^%Ed5htVh+CSkEl+xymFU*si)P6%%7LSgLx)i8VV*lK(W0fO-6m)5`!=cf-LNY0Q(NXMc-J9e(;5`!&^5-LbT1% zNxXQ&6^_?rNm6}wE->#|SfojqBNgHt7}#t8hH?-kbRNNy2^4t|6r&8n8wMH0k`%mQ z0I@fBMihoOF^o_ zqL(MY3^Sx)oaWxtn4JOW{Y{9!jT>gK;c`ui5tzL3ILOjIK-T#v9uC2ON89Kl;=&>y zWnk~abxB20fQz1uGGur(?7CWegFgwW^x8zI{5}j!2wWz1Y-Y|eLn8n zrGWE(H2~#p%d-Pf{#qx3T|K)Q*v-Ih26i*Bn}OX7>}Fs$1G^d6&A@I3b~CV>f!z%3 zW?(l1yBXNcz-|V1Gq9V1-3;tzU^fH*lV`xW|C#(hOTrC~b26GPmwPq;@q6=RnJ)nF zJ-hhy(O!-JKzi?Ccg_C~N1~no-=|OXXS_kWoEK)%2|H+*Rn~}sWn*46R`0-?wIOU0 zk&@*^kBisv@rC|=E&$U)E%}mMK#z_HUTr*Y+-p2KCe%7S#c%y+C2Xl3i z9)c$>Y@m|$;RZ}WeSO4%c_R;xl%@uQmj6@@BU09@jNl22 zOQny@v~(JG)N#9-ozi#Q@3gp&i$A&kX1d;KG(GwQ<5)&#y||@sHW|O4G@1s+6R7NJpSzaVrowAsWvBrFL{sz11QvPm zNX+uKnl*}mdGM;1*wS)6r41b@qrPI3S$Z)$srIsNCPy+gnxRKZK@Hch?3^$Oq6e#i zd%dy&uHO^dcJMyU&m>5!-pxx$Pe$NvTE&PSb=Mm(-qLq8WwNgfzayha~+FHhM zb#FShZ&6&!*Q6q^Ap=cAk6QX-jT4)nylq#RtT?C` zqsJq>s!D?I0CuyEki4aGua>4`tuFe!tf6XDBD$AH+MXwwz83G*dL*xiH{H57K9rMC zV~xK;jgBQa1>zD))EY}sro^NREXxrm@Z$9`=?isfSASg=Q~tcZmNZyay^7!D-s-H+ zncu4|vZ{o?(Q+be8L+q08t13+TLf~P9J`1w>5-krQa>6t#j=P2Y;>aHj*`4%nBbGy&UTLo;Pu_{Q5ye(tXR|q;2`$ zY1piO(gn=|~TxT41mzef;(0`wy?r*$u-SeNx1^ZdYKRw$GdS#54 zJL|cBqc9q}&vH~G|LZX94R-i{8;f-VKXCqg4$xnG3deGaL&>n8J?|5UK$-+}n1*Ib z5D>tV26#X4?k6s@9Ago0hw?$p6BOEmEql*y?(j5tN={@YmX)g`? z5{eOzy8-_5qhXrmK{kxL*%(+LQ@^6=EU7W-k4HV>!xfMLzYfP^ep|yX;P-)j-GCJE z!-uA#?np%uZ zcdXP(hakdwdYA%$muorf25a%lH8eh%12ZrF#7M|+!_kSZp~zY0`|WIgE{A3};_}&s zKJH3T_)xIGz3!CW@=X~!f!~e0+J_3gNLnl9pVIk0|D6h+V9Qmkr%L%%#Gx0MUV&98 zg7op)Il;Y7zub7rLAW(FO&^+&=2s&2b&5=IwxEEJs>DPuH}$DoflY+$DocvR`CO(m zHvX)br7q5!m97QZOLOaC_J)dgviSyB^^H_{UHNZ#-i^rr0THbm^1r{c|K7-YuUCrv ze|Qd%3_D#7MuI7Gg(je4-XdOFqpVtejObV8K%&<^4)!a!sU8-u!BurCg6a-hneb7s zn4pNdLYE=)-ulzQ^87NcBiptWwZZLh* zY5KeFO+W>DZ0HqSu!sL&sG>en` zB*_;l?=>N*WCyapd4?y~Z$THaPt}MK_EZy+pFf-^o~@poQFKp%4bqx_wFT*e06A$o zu@Z@uGb@m0U^aQ9Fp7aHvMo8JpVXmq15vt4TjpTS+bPa_;5hLiy$!uj53XkN= zMJ+pLP6dr4LJ9p2g7ic0J}eyU^8Lm_2W=9-70!D9Y0?fw_~{r1@tyO+_B%N7j*$=lu>D3d(p7*)H~ z5tE56UQu2}=g53?&~acvyaWJMZhMLQyteb z)mH}dA}$1L*iyJW@n6+2M4ugc ze|KVlJyijlgxYy`WPWmE~3Pc%3zwq8bGYGTp`kD#<7&_}b9@rnL^y zy=ji|w1PPnk4__)5BvSv26j`awdxD?wR4nF8?nqn{Lb=Ty`gi(5FP)=N?Zq~FH*p* zm^)Cq;#A}WglX0=+v^~Zv&&{nZVC3_b?5K*j6w($mat=iFjwUAY7GT+o7SF*6fPfE zL)|!qRpvrQDpTmX>{63dRm;4~pHQRH2QA%GTVu(yOaW75Utsr6SNkV#vYDLjwlmc7^O)l100w5Lku^VR<1_3=DuHSaV% zo3raLJ44FKhLz54Dd7eVXtQas4}sOX;lfznC2!$DWcy>-UZ zOAzlnjWa=YCzUw=OodV#e-L^e4mUTT>AsFsmQL2*8>Z~{GZ~V~9naP)uNi=Cr4|&D z`f+4ipmzn-E^iyqb(rY49qKhls*FdOu#A3ral+Pl;~TqW2u`foq2Mu)Q+<^UI6fr} zK<#}MmSxhp8tEpo&Enaruvg#;r#ztz-VjUevPwZY^Sr+qkO^r z9J-UH6oV+1Dw6It!XlTnm67p;xmA+1unCKkF-76w}#5b|8j%n)?>^kQ_h@HF{%pX+%Lh`TS>jYZTkMNTW*hQSFT?f-*j+vz zM4`a(ftZ+#!(MO5Vu0Wm#N%->43l9GaKe1h&qBO1)3n=*uu%eo>D6gruzKHMNZ=yF zxiJ7=IxgVIqCqe2g5;M)U~~3*3Al>A?jRYE_m4rPS#R9!r=t*@LZCVmAj^RH3bP(S ze*hS6j%)OVkc!t>s!KaJIeU0{V3{Y zX%|SlC=_fB}dN4!kDI zVT{==y@WgeEDfU+=rusqx?MZ~(zHlN;P-JH55`?^EwPG>Mg{m~Y2E{2_=Q+_mk$F3)yGeMylh24P#yPzus?{v-UV~C-yQTph6E$7AN7Hb8}{O;7Z$+5 z4n`pKf`timVU$OZTm~9murZYGAo@bU%PWWS^zkL66{S#8kaeSCSd8Jm1s5oJG%PX@ zFTw3h0pcCuhyfb|GmafU><&Tm940{Mg#(ssb0GaM#ZkR{AXg&7robttgW(X2+HR19 z2$Zas!JQE%04omrJ^rHfPoCCwUDOSS4_{Mh3M^JC0Bp$?Jl7w`1JkGkH zBL`z{h`T_p_JQ?<0rVr$L;+U?wL9!)F(~6b29js-HUwgzaBoV@boPE6G(6%iH$RBr zfb2(Ek@tt`5CM@i1rc=N5cd#?mX?YcEdhEtVIzIx~i}By*kZ?>EGC* zdx;Nk-0-AjjnjU#=)RK^96Yx=>a znB??%V~R^@>9}NFf*?%-jxXsT9AzkyMKMf4z#R^NOi#ODptB;l$My?g)YD*`!7HK= z)r_|gnp+TwyQApF7@4!2TtZ?28WqY_H^J?J)hLGJsE;lT!R1*1=Jha6$6eSO7`f;H zakmFNF`9D_j*~GE(iSuPD{pE` zj=(wvDTlK$FxX+rO2kD{aGV~Gu>g!CV7+62@AKZE$MUd|IQYW^Ie?9qgK_Z5NTtNO=xOfN) zL_Y%1d;lIbI(XVEfr+Skb-T-nP;)U9qh=i1tXgf)%jK>R_Y+*uRT4 zDv99fNTk8A2>K*p$xtt{AWP7tvtCH*2DVoZS>>@Gvr^w=TSfP--d1STa63{O#5rz# z@IJ|F5K3;6Q8(xnWClP&VejN1(J#ia2;<=x-8R60h*aAg)wkGI-H&doUeU+iF~Wov zg=0*IWWFI5B21%{og?NPL={OvNQ8haLxT!Q(=Z-J=;vbG8EzUxzKOKz{sy;|j_HbR z6~w(F&d88~Q)w8YMqpnLNj-tx0KGzT2!#CrodQBcIEMpbRkD1TAhrjXO7l&V?>E_2 z-H&XmUJp}MHz$ozFNGaov`WXl4F6b8eZ#mnB4q`N#0V9T;2U-oOajZwsE>V42=Je> ztsZ?`2_%(C(JK%;tQW_LK{Cck7>myVLOou45Imz!n^{%9{j;*Y_7D;<$!x%doB%SELQ$Iu0v+G3v5`FnkSAm(o7FORU70hEQNf zyrlk4mqf72;pxat{#0{3+!S`%}EjzCq0sgV4cHWob=&;Ifvds zfN_sly|_zi9+dflR4J(SU6esIKn$(%CKLQ7`|3BS1+rG~iYxY26r{lbI}#Rq61|P# zd8D)%1bGT8~eTvWj7Cu-)3KZObzTOS)Pu`>6UWI zG7M6VP(>0I1*W1QCYUJT=pR6foJ@usSAvKECS>fAyl_}#{wb%cM;})Mxhfh5MIm?N zA=wRwML*<*g@kI{7LSNo8Sy)p&Fmv=nOs#CaWKX}JHP}*O2I9cN#A5&{RY)Q*6Qkg zg-t^A9*imjOtBFgD3Y&iEJ;9^lV1rno;+kpfo30Y6bWMt(_Ohw!-_WEy031`I9nd@ z8P?VE3i}E^3L&SZLB^%n7`xG+mmsn*Sma_@AB}r)f0%J`!;OC*`#^XA2&YYp~Mf}aLP8I}m^AABNCQX0HZaRxMU}#V6b`5i7s{XH29~3AD!|ZS~kLr7RuFtTvd}e7TbFm!R%s^W_Alq)SH?UD%Oo% zv6UO_F9$Cla@Y27?}z6PAHUpte(>)gA;`_!CH7pB#db5U2T_d3ttyvL+;htPP8h>9 zA`ESiBY6$ET*N1W#CfDN6(0{#y0FP_vJs@ljgzO6jtKi~t`i4@(?csXp|JW;+lc=+SN4}0GqJbrowO%Azp z8eyctL#@|Gt%WIuQ5+<4ZxRkM#rH8zi4jfI;{tQG@Xw44rrBu79o`mh(j$oV#@EXZ z?jxQC=!lqe$z-N*rK1TVo2Bpb*Xnu`XQ=@v6Q zH$gW(G=a}r<$F&*YGCVg`w@_xiY* zWPJ{5JrXRVnBd%i?!t{87k&|g#011QOmrFf#!=Nc%=I_dkejq`wT88U{#G~P`XH~c zCj3v{kF{Z5y*2TeA8}fUx!43}YKWr%M#&*go#`+Uu};K86!)<^;>($ixULoF!f}lF zK%Ggp_zrw&X5(v^A~&|?M@6FO&tp;Y|+u zDUWHKbk7Bek1_0Rio}1$#{BKs$~RZ?w<{#8P5BYSL?2JkE@z&ki?c3rLR|K`5eABW zfoCEliF*Z}qjL7;`exWGa5)fX%xI7!MtYn6W8Z8`esmuOc!J}1$bBNla$MqYjOWZW z!n-O%*+CbLIbLv=pM;n?^Sp=tJuXP^-NXB(7!Eg26$CSUBLVqa-FzQ0{{0UYgCE&u zxG{6rHb5~OL6l;tj4@^6{f`9TP9VZF7}XlH`Y;uBjw^ylTnBUf>2X&WY#x)o!8SX} zj|mt3=r$8?xh@!z`4}%NE0lSa}eyG6THMT;VC~PC=kNK?7~SMlRC;5)+JVL zOw0;vijkd*pkzx#3hRI4oY4;LY7KKZ8pLsz@!X?9OAKtku$=LpL^9U&fqw+-aL=2MtAj|!y9tg3kYJt z4LsyL7o;h1h=hR_X@QAiB-e9YPJP5l6CncoCo*){O~4l{aDGp>sE{{r-#lB)1$}1^ z7~0kBB)^xgu-5vn9t;{?5OmD0r@jitnKe3(UrsG3On zQ8Xsnhm+qZ3OB_!1#X;Su8&dCm@gS%G#D57*%A4Ir0x^E6XVl0L{Tmx))UuA+~Qfb z5pKuw|L}XB;Lgu67bl|8=6wk^#G5ypt&h-tpBhnd$xuUBCcV$N|KaE}#+!d2dz0;! z$9<#)Zr0e!h$SaZ8GedEZH(92IAf3E^VZwENP#8ayy5J!p_ZHUlF<@_665PCQ8SFX zFIVY=&P)6Z-VeBX1f2LrJ!E4}1Xqw05O79pHs_=;Nk`F^yG-zDzd7laaJ!xaD`PkM zY(*@e1OsGTRT2V~cL}c>gGh=KP60C_1`@~vF8KOA;vz?RC>pl-(2sf{<-IzMLv}a( z1~)8={54o>`6AD*Ve2JMmODL`GDf%V4-+UZBV?FRBBDFcx3T9Yy$BF@V%o5(_1V1G z^u>u5PiOY&#t^Z?-S{HbM);eP{p+K{lb{Dng&T4DApUZLJiqPmOyaYTYTvyO7aa~wbRNNgJ4D#y zzM8np1YyAtQQtCr)5W8EB%l#Euyb5O0Y^FS594jx_l-qbmW~tND%xTGmUm(`#4ENV z`dEgUJ;Y&_e+i!N^@&jAL=2QfMl3D=N#LENT@epr9L*Bkhygm`iWI-5Euk*odOO-t zUcDz1uK6;M0PvLNuz*k$PJ$7aNLsK#2;$~Im_xjvGmJ9$5!Z(WcM=@+vF3~in}_^w zuqT&f8$%vGxrRjKE;_;Gmc53Tnc!uJSDommDZ#*laZHpw*Dg!|>M?u)%WhzrFcmhd03A+%~L_?TY;;M2Q9p!~_2Az)<0LhWi}hv~iCkBvEC3F3YgQ z#{j2rPo2dhoIqizVSuL{v0IxP;YSSCOfZtR?N)!7!iGuNsdTJazg7bQ#% z_<5jYbyENak|gWLd7ryiPI(D9TlmZ=rVYn;+(HP5-WUj8b~nZV2k>E&H6OY(@DM&LOJ z2}}bxM}VOzzy=DF?-rYaDk66CriN1HecLvY2*n_7SiIFBr#T3=g<3qAF(z(chaFj@SrqjIsT8j?^U<@3u9;6G|e&V6BAs5-UKu zvy?R$6sQYadZPkS0@pB10tIFtYy>d0g!lt);&5%;Jeq(yV2F$VzLLCAw?T?NiC4Gp zH*P!hV89JEh1Z?|o!)zE?iFs^pZ%gANi=_(d}v<>*>YFQZU%NUu$zJ14D4oLHv_vF z*v-Ih26i*Bn}OX7>}Fs$1G^d6&A@I3b~CV>f!z%3W?(l1yBXNcz-|V1Gq9V1-3;tz z;D65yxEuU?#Uf5ulHT1$($^Bg-aDD4i#h%*pEWU(*AsUHm*aE&-w2#C_nQ{tBF1M?%a@LSIK#q!T_ln=e+4$Cl0-@v`yQr3YRf&sWp4 zc#)s3+)wVs=_*c+$%ejc=m+=MQ0bH`m~Zma%(XTDM}F!Wa>;{lk@?SN`Ms}>EcI9S zkLPjLYCm|F&t4y`mXpKQ<5tw}JZ^Q{?GB&&@_E>9zk0Bm(-Z}QPWVbIV(*+E%PX%Q zq;ulxCWQNSO_-u2Q$Gd+^0<>8OD5&UVXOIlv*V3({}EHlmU}cmT`gwGx$M0qEjAxD zJ37+OFL0fPyj1S#gg&;2xgYg9b{0BjtnCK`?3_)~{roK}!(@c*Hq)?*k0*~?L0cz5 zlE9~D=M!1-eS)^qe7T&;7n#%e_}D&xY^FL%`Jz?5DAP34ME3FN>%64}+V{1EyAx@f zHUn9J*}wMMo!P%e?L#~F(yX2TeaZ5Cnzgc7x@zg9Pt4Ry^V4OX&QG)Dwr=c6fexKt zD^wfA9?zK$8S`?rXz8bRXSo8oYPp)FOJ=9~(rUNO;9Op68fYyJoBCGs)nsD3d>Fhc zf7Eo^l&NZ2FX%sM$doZ@r*8D^PLoEe4XT{Ffj9Em`D%I3PWiHFx^=dgv5vAu_p|ep zv!$6cssDUAX+C@S;>GkQ61@HGVEUIQkDfoBzIgQf;NYj})1Q9)d$UsrpP0@Uq!pSp zgr#yU&*!t_mkv7EeIoafBo zr3t_PmnZA~MBaX#;;c~~FVdsy$p0xD?fBx;wSbSvf6~g7x`C1ZlKwl|$^YxD-b}9X6X!$zo(jjJc$=Gk?W0R&PTRcW3-MPQ8sS;2og zA)M&}e$M%doZ|@L36B1^e05;Vk~(O{FS$>(w^n6^$TU zt|qDmFpDTJ>70q099kVh6^Wp2bT=vO4gOK{zNj0bN*rIbsHVeWbxZ}7x+3#aH6~T4 z0@Hab{o;jvAY@OLEw4jTM*iN$$LDz`?j)V`NK_r8+|bVc>wMLkL0bWW@NH*SHD+FH zu(MLe7e*=Zg^-6Uz_odxAj+d+HV*YOOL3FiQn?+r;-r6l>mPy8G zm+4ni-i%>#j6T;oiO*WR<5vD^MbB6AKD@dAR;l5QX=dRX5h{D5rzmKo)l|*2*=hQ^ zDPKJ$wAuc3GTErk95tYVFR52MxTZW7=V*^g_6?&t=6dp9UHH1=_4USw&z}AGcdI>K zTWvhO<89|JS0BGrCjM`F|C;*Wn&|vAL(oU`zdl)c>-L|BM0A6l{`W2D5dH5F!g5c~ zXpPlT-k85T#T@jgVdAA8aLznOD@f-Vk3`dZH(MRS%J|Q+VbA-j_NhjA6fcjCXNj}H zEH&uO*=*1o-_J?|kFf_)cpuxxu`45IQ)A5mp2)B28DCwYv*UP$8{j{l4I-9-DQEALH zwxlqb*bVZ-^j4%CLwpylsbFklg@$|3HADL_!O&Jrl zu`DYp!vvwr)ilB!xup%xmeb|M$?@#;O{?8N2{Y~eZsMA{zldiL$lpZ6Ian;_i&is# zk6~+#kgNq_k+04dr?!$?IxR*IH+t3U<9QMvH|)%Is!8ok?R?heWq!U$b338>fKJ;+cQ>;W@aQ}s6MGM#{>{pYfGb_7m4&`=xwk5-$*c1k-s8!XypC0G& z>G_$_ix>0x%5sNt*YBUkCsu7<#P23{)2(f4yW#BibwpveH?P$;^cD2zxHC&9CNcPR zd=Bph+AU=ad|Ne^r}5eHXufijXunRR?;FhKfh)cLZh>-a`HOU@dV;Bcp0$EGd40_+ zWbBoh3~+vGYHc;AZhEI?;LW>Gu;I6I(7^&Mtati0hDjX!$II!9zdnBa6_JP#Ha;?>N()bMi zmQRiSRqdG_VXx+s9#kfeV~&w#3fVVW9V91g(Foav{mlSo$Tl}+_)fLg+TBK)FY=#N z7~F3(@2=Z?-8{ICR~?wF_lS9rhVAd>i~PpSSHJPa*}lCg+utCXCGu%f7ybM48rU}4O8qGx;13<;_1WhpG+>NdVSt(OC0t3A7sM)lCb*aITpD0SJdL~ zosJPDQrgLiZM7$C)y2is@EWI4c++{gV!?=yQ8~njuhMMlpIx`{W%el?ds`>mluhNl z8>f0*0MDN^p|5<=__v?_+K{WG1{&u=SO?q{(~553WhoXK=@DJwuCRG!6IO0c)^=*O z@tb>lwoLQYwKlHaPH@|!X)>2*$W8>V=wTeoE%{iDu(GpQHNgC!>W)=E&;ac-(NM%n z;Al@Y7yV7maca(TkJ?{7HvZGje^xpD#DmGz=f5scsl)a2U(^eC=f6*!=FcjA?@r@D zwe^G>Yz{Nl1pq<4TFj62#JAsgh>57Ww?{)bI>A_;HrVGEdb@2@*8N+JJB>$2Top8) zH|{kap)xH(I2!lr+#H-I6h}iry?@Gm?ZYRHN1Q3&-+PFdjk(`nqW{IX70?{_;z#*j zv>!-~_ip{38+(Rbc&Y*b#{=eJv{ zi!)${3Oc+v=VbChx$m=!r-=y2>7NcB{!sg+aYuGtr*X$!hd1sRTRuMt3xiql>Gb@B z|7PMOamVRB57z3r!-eZ>_v4f?{v)5FC&!Es&ATIvF6%UoIE8ii_4s(nm)VN{p3IiZ zoPWW!Q@5O@sf6oWbiO#_)#QA6@!;04jYl$B53W1Jx2g|IQ^omd+Ni#o`n56!Y3dXS z6+qOY*&AO3B9uw_H&fgElZ_;e`X| zE!!;PeLGvuR&sndpZH-u%Nlp$#p`ytY}3CzdGX|BYq|HGEK~adjaNUp+m`yT&Y!_9 zPgUG5=UOE!?bbID25;UnizMHngO`7QcEGc}?^b7M zrA!smZuiQaHf8Fotll=&=FpASxbw-IL;JBtw7;x>U#IF{xHogQi*@QV{W1e{opRL2 zAj{eH8ZLjc4Oic7!_^O$G^`6@T6PPu*|ufmYYXA`_mdZ*S|Ho_Y$=Xt87t>;x;rc7 za#dj%6$@2;fAh}GP)kPAmhul8=ChP_pWnPQ`{daLcADvneDwmau+!JHcJMx(N{jqH zUvzG3Z&-jU>JLZ&(;_p?An3?PCh%;IgyEEh9->`gDqo+A32v#{4m0QUa$#N#$GF^fg@boW zy}+pjrB!E?&bc1QtstvZds5`;my-+npi*_Xnx}4^Hp+gH=2J z;IxiEh|=)~(K-H5^02nsuNAkot^GJZeeJImbzd<@e=9Axo!iLh{52;sC$BD>l~Tf; zQgQ;(NQ)1bFN~tok_IagBxU{>Hva3s8uIBo^*EGoX33tW>G=YK50+?_aaPE5$x`~i zZ(m%$<5aAwRU_Qr*9NxtTqkG?kvj>rmDJtCwse}_t?v*ksO;0n=vP8#W&y-PBzmKJ zS9Y|0QZA&K3nMHbFF7~i|Zyt%ubx3S6;0%W8}Y#suOth{JZ6rt>-Cu6Cram z4t^DVhtVp-`U&obJ!j8z^W8F^wxx&AY`Zvm>A9 zg~#9V!_ilj?rmq33aUQ1ucl%5&FHh2>_@X5f11+`v9Y%wKyp7E;4}JI6rn9_l-BG% zpz~7(`#dkoogt%!?7b)de|zWN9mRF!?flKBPf`-quIGtFmF`UPm{* zpWG!o+Gz#%$SB`G>4ca)?wGqkM|vCbPxaYjTu=_d1vmJey_BX?X>9(})7&cajQu~=6Q(w|KAKtlx8ZWp$a>{!5$7IAc z+rc;%e8Vb3H_Q33b zgFm(;->NQ5rJ3jrYWQQ^us>L1&#F}zEJO(8`t(j!PTXUNGK5v$*%O!;a((vsVdK4q z)-I$3wyd!SAzxJkNA?t0nzPfF(W}KzV!q6VfBkG2kIHdz8@|E0_2#qa-W&0rnN1?I zZrXVBYGJqCn|}-bo$;b5+~prJncjRB{5!L9_rt6|4;@?68FbC4NVCM=H-NRLZ(hmT zwInaEr+YinyT8%9ztOwD(K}Ydi9gfq-<)eto{&EuLE}B4@Ay_b*8=gDNgnj5FCW?; z3^h9y+^Ia|-L(5uw9nKwCEeq<-JjNs&Pvg4aQ%0>m#pv^+Cv(dM+lk0vL|lv?G3)0 zu*tiE88d7ZNJ#LzBQ)H}8^e_wE2j!i-W}PO2kUwl+Z)1lHzd9HxmO7Nt2}1&IYvvg z+^iWB&1H4|FBZKJ$6xOMb@wL*X(w9Nf)P#;;!~XH&EfI)L#AO{fQqXib12ol%A+TV1JV< z{Snz+V}8A7Iz>xnpgq%nbtcBUjhC9B$#^US{j0wit(s%kq8mPrnGY{xxRUTv*(!E$0qpIGP2GkY9TByg z%Q6By(}S)FOSgOG7j|!TLKZYBU6I*Y2!Y6l+y3sq@zG7N{4Sk#y&Q6pP9YVkT!7{~ zTB_T;)%TnPmrdssIFusy(JH($+f)3uk87OW)OZMibE~WAi#lGr=XXr4YhHqL7i(RT z@ClPLj&s@{HcsTv&PhLr(``oWj}C({W`hY-@>)9 zfzeIf${Jz>oYs{U*dg;whUmRA|N5`QIA7T?p4%{{foa=G3>`~K&H(D~h41=w1&ONJ zxNcUbsYq?94Qtm5i0{so15>2i-!dw!T4sL=G32X`G_#uHjjdOtt$hNz#{c?<_L}&J zm9dPMi8=2O7Yp6AN`&oVbk1kCkX3Jc6e_V|+V~E&%>7DWRkw*;K5_;Sb1zoUcN5l* zWqByfJ(a2+dTY(FrNye(BIeY_7OQhxly{HqD($(kNmnUTyP$OGlty|w&6Im9+Y+fR z>6WvQ`b1+!Xs`4q7@W$4J41KnQlTzd^udJ)2BF^fMu1VyYdP^P4!l-m<0S!I5dkZH@uPnXe{S zp*NmMymh+kj$LdW(61HWx_RNGiqtjMcG~TNty}+FpB%#vT!W8DE0C7SuUDaLe_mbk z;Z({^G|=0dPmk*RC$EKjIa71yTI!j~?Iqz1@@4aDP*-`2vWby@Mc9v>f_9L!$|EXe zty4w5uDpNu-p`5~=jKgL6zyGqS@a?4k^Iu_hG}(@`)0bIM3IE;TaS)*N5*cRni~Dk z^bggO+Y!@n8ISJ^dQ@>+Vn5P2Iw-o9)hB zJ6F7D&}`Rf*@WwM0~vg$s1qMWF?MIzNBg~XE|#{p>$)UOtR<+8E5Q02pNpjiArx~# zg@BoBGj^TD6+>{P?QS=1PjLeEsan^2yUD5AWR&VRn~`E(X!-g1clo z(Yt4=-M-G;*UXHp{sKt7QH{w5Kz5(L#9{iAfhejz_`rdncFk?7$j$!p@Wr2(PiHp) z4WE9CJ|c#fdJQ3m{hL3}e!AId+LO(6Kby9mJQaTe4N5HwSMp3-QZ+>X@>H4l8JBE} zSnmd56wJXOtS$((bc5*Wq2|Tk+<#`?{G8-Z-rQDB+S1BNqI8+ege}am`UIT(F{RQp zyY2M+{)tLwrMoI!@_q3Wj+FewiYCcifUNQGH9O ziVZ~LPrnc{TR!^w$pc9G@zKEbHz_RuT&*=&3{*ZiY8zB&Ih;MDn*`p<{es)b+7nMjAD#mNf4fSr%F*#oc5EV#`yT9&b?-;ot+e(p3rulPxsE z2Fs65nbf!PLnOZ|z>+A@kK?7hX7S;+lox}H1nJer%%%a)Lo z;>Fg>m)rNh_+lG?kCKP~nleG&CRFUl7+1I@Qr+KV3#>cdKxb?4pt;_#qc1T!s7 z1Iy)?(*>xgljGMX`P+pZ@h-EyBNe%+9f|AV)vd$&Nb6iM8~pZ@nT%~Sf^FMv+Y9&p zZSAR%=Ee*=m5JQe3M=xLj&XZ0yff#E7G;U}5a00=TO^8&jRi>gCn|!mMAYyOBCoey zj%Y8uEqDBzDU2@jY)2xmGNYG^(o(Ocsy>p%y{6e90nj$Tt&T#A{K#x5^Rwdnd7IX3G)rgSv3pmQ)5XibCd}*wk%w%^K+`2WqMiG7X>hK!X^+)$5MEteix~pstx_Le^ z`a8(1cY4?4D$UFSOzs4of?+p;T|)%2hGSAZg80`EqwU>pTR7kL&hj!-uiP+dxvVJF0a`8=@lGh`Ivy&h1np=C7^vyHfqZAj>!wKBV zY2DFo<;0^kQRj@3EW8;o%l7Tw15)vC%gI5Cz#*z7(JO!5E378fXH2=cBWkyt?RZ)} z$=+t`JIU-?L1`-Mw1l8hX7D4BSu zuqQum&)(hH1`~PENGWq$9!uJmKOa^bHwKnzUS4!wDWPtPr8ynfhkY|LGjlu3+40E% zkfi(&;8fFFS9w7Gh!dV)_G?M_l{E0OZYRpz0k@>k?ZRjqpe~!?TjeIZ^|4+wgxk&$n?ml?J0cydkzg)r4V^q zJ2_ln_n1*c8KTi1cXp=Q=E!CyWPb0RJ>vepO8uLQT_MzNa_v`{l1ttzYMN(RHl{u|59=FVtly(EiWG`t{Ox;l^o^+{H!(LWES?pVB62`E zeI%=*ZdVts>^yH#;+NPj>f82RcSI z!4GuR4y7e|kA3&(UCO7ONjOzLQia}GHO&b`?3i+pXVvZ(oTPZyI1QP z%gaaIml}t%_Zhx?TrMd*M+sAu`SMumL!Kg@D3gvEy(hoB?(E(kJk#F$(!V>w1Y}Zr z;?wZZeHV;+A-1bDJ~M5aqO+&e_#O3jFiWFOSqixD2JClOY8464KZ8{V!Wk&3p|xMmR9tY}LsiSPOi)n!>`Q&mD}k1ZH-fA! zb75iuN4K==b$e$UH3OD3T;1`YF0h1y`5Esb^MJs)>zucu+uBl_=E)Dih64R#aUt0BaMK(wjL49aDW~4|^X;^NZZHv$X zvmo!?=9Dq6QP7uwuv^$$=9%$Mkry7Fnu?u<8_Fy|&G(K@_st1aJHlDoW7d`p<`V@A z77uzCPiMn>crC|Lagvw_IeUtRRArogzmyYYt7$>d9W$QKj%r-0hL7>??PiZQa%q(^;sSS5JyLIc$_X-1@7SS>)sbMQ#P1b2Jtko8F?{TN)ZMV_z z0LMA6rFcVk_;q^q2HVL^4`NsfFMUFf%!`%zApQqyg(N+IifioAM zRbi*z?fm`3i1))sBVS)KVPw(c?!?d){CJ;x~OD&Oim;xAiF%a##L{|8zlQNRK08&jq`@o}z7lY`Z*pK3 zgygnyMVY`>31h zz~KyE3B$VU~MGaHNd;D+c~Kc{z%L4BrL$`7KX zXpc>dkxUhomLK-5%YiaKKkSqJg}qANGO*9}Gor^K$=i0sx?(GJ7w8_LKta*AzyDs+ z!%uhQ7Y;r)a1?m}%fhiw8}GQ->UZm6_?YzJ_j;zYa5Z_&m<{F>nreivxDdR>m=&s)?N-js_b; zHm6{jkx#9$gg!bA6?gRskwq~)5bP*9Cf#-Sp0z|_4-!Y|*tNNT{D2E$NZd$tL$m*& z5DufF%WdJHoRLmx1vm6jf89-gTzDwi4CGX;V-aAe<}N5Q zA_l#)4WCT(Kus>0vc6@yf)4ly%XDU7IzNvW)vVuEXPr$e%NI4UL@yVgtE@!3H73Tl zc0%2uB&@481!JHom>LIvNyHlPf`ty~98Rro*M&WWke|vqF|6cx@U9o4Vpv-Sxe!LY zTmh(TBlW0ll@x+~?^-Z-E`HMW=IUK@p#39(?>t;SdUpT8i^or&EMMIJ{7b$*y#M_1 z=a0VxeTQ34Ewt^ss?x|7N4A)tu({Jk8@jgO;dy~nD02GX ztqbSd=jp9&|Lq%wK(m6dKQ#x%>0yY=<2U+k_lC~ZzB##bVV}QeF6u$0rXhRVgD;;x z|C-ZFjkYe#1t+=Ko9`Iico-&QxeG1-j-iG`&>tFuz>4X1VKK$$djjlcU z+{hX8gPhsdf@$nokjMeE;g_Hnu=5Q%?4zjZpYP_6;{V;meAGaNuP0IDc>L+`=pYLb89&9H8(tHBzxE1CyLEltw(LLzK-ZvI7%Y!q9@1rh=7z}n!A%d ztd414w{O)Z@%iaT)w_O;7WE4!{~zG73(~*TP+D??WJRb8zW8w+KZpL~AWT;2KZYf2 zc^~(hUv@V;FhAk-zwGIM`lle-&skPI`ey4LUXd=V3zK9EWT2SqD)>#X!W<8;HMQ=+ z6OfaTS(i17CMd_Qk|Jgx>T43c^d51E^|V8CG^t|^o721Wd9||~$LNE*W*kW24o%Ur z-~w$j{ZiKgryq&3&9s52Aw?TqZX?G3-dB zXurLsKl$x#^4j)}sTCP}^{mw^IGcgvtvOmqFZ88@AI#kCi&a2+3a5ONmD3#YzZPC- zKI1CPnPf12=KGuPSFeGa%3Z- zJCRcJw7M;8$uI5t%=%w+vBuBfhG^UQ$R@bGADABiSWJJ-2(6!K=f3NzI!k9lFy>Qd z--wS>0LFSatxMLUt#8eVJa#)CafC{@-L0tB$F%ab+f;hMt(X(sKe{F+p*e?Op`dT> zF}4SK$WAV|7aD}fXN64b{~o+Ex6kCpUE4L0R$})Mwz5ZVn^hao9vfb8HXEneK&@7G zzzXphmvc8)pd6_vMqvKn^^uiZLiJU*)M4OrQuqNfu&07S-YYb|?Vd6gA(#6H+-Ou7Et=LVBE zw9KLZ>u@oIeU5j5N>n36owL;SMfjv`x3>)}7w$1IfMhCdNZMncn&HoOT4mTy@7dkmeH=9W#Gz{Y-_}1=2d}}4?BHf`yX+!^FoNHXLJ*8LF=1*cm~r8s zu({*nZyLl|F5RR((oUOSWf7Ol-{Z_Qtz4uZ(l8n7hX4srx2V{6_AQ*ibk5}mFr&nc zdh;o6=~J8_3x!7$uy*qCWk>UlMZYqXE-a}%c7nGA@! zePZh6!xkG8d{3e)>X%lm_l3+qy?Xr*KLF(S zMg0FldcUyx$M4j(Tkrqz{m^TDL(cyb#@@C4cNLol`|t75w`9W##R{-S9sf}59krD1 zU?u^0A{BrL>bt}Dr&cQ8aT<&Z#Zk_z3j!D?4yN5cUfsjlFeY%0WoR8h(iJR7yXTxu zIa!#)`IMBG44-oro?41j)^Nt9>w~S{fswebVZoM7C0PV+#r0xSZcL31(9kwo} zdoF6|tUJ|e7q-3qzKW_os5YSO?$DsP)rDuAsrA>>^pW1yg)|(O zRV~zOS1S4+0sBGVBqT36Y3=~){a&^s(0;hdc7Ww=ivip-?UP%u+NP*Ri?$IpFOkuz zOD*rMxz0*gb(@vaCN`PN?N{O;Hciq7bbs|ENgk40d+EZ4DcaQY%`>IRPIkKFC3bg7 zu)hVZ8)(iWW88FV0eUS#YMymy98JvFy{pf*m3WpDs32n`Ci6Lc?}aFzhl$IO&C?|TKQx0%ztH-4bw>HqSNu3i+{)RAv!1n zI9i&a63nx%;g6mtTY6h5Cg7TV< z103GK5iQbp7ht^0``NkWE-IOtO=tdggqNRJWn=oiSlkHuvKUtD=F|9c6w<vf!j9u|ox<~rWtw?C&=@nVilenWP?dxLVjZ}?sr2`$Ay4MQ(9yKLDj@DJ- zqRU*J!2Qm0pg?aX_7zUpD~9A=B>zrr4b*bj?6MfQJK3$##&O+3=hJr1-!PgjJ==bF ze0pY*gIZNiwM5xK09`P`PQX{Gkdll zBy)|t)NW?q9|;hXQghUgt`@B#0!9G+z+f;Evo!$w0MckT1C>~+@`g4aqY>? zQ@VP;S(~ms-YJlxCUW<d753JiTSF{ssFQ{*%@`t?JkrHd|J^mRX#j@zD+#SPt6S>cS&+B%Z9oUJ%x#1sNpt^Dm#iSpMh3|6W>1 z^wTF_0)FmX80{xcnE2jQLpa9lb6x0P5z9L(GIO~CWggbEM zZGHq(I5B?Qjkq6Mlg!+?0YC2itrp6Im)3kT59)rk*0FN}%h#D&+c$1J0!A$mp#4Yp zTw0sE;=bQ_(60{D{@TBIpU(gL=CFZ zHMDyDMz2Qh6rXO-~ge&A@60!io4n20Y!n_BhrgD+5vvR?2%;(KuUt)wUPs2$E*T#?3<^%^yCEMV!;0I1^B z5V1N?R~9>YPuH07rKeQPh!3|Kw0!CP)+x0%kU9*WPQFtj!N5zje?PSSlS!8GYYr`4 z(qKOSGSbf$o&?F|ODJC^TQxxhJGBZOl12uTq-()+h|6qfYtbcv*Vw0b|7g~E@;x$h z=3V_K?%79Q^3qoe{k?s)Sz~8P>NnFbE6~mF#8Hew`oP3Y283o4A*e{E@sz=Db~6hp zXnK~(`uwhE-G0XrrPboQE|4+%uAhe7byUtwS*Urd?uFLm&`XxG+?F-BDbd|?``bM0 zzM-L-3Q2ma{nEZn`m5Q+Qon-piF^H(DK^iD*ZKB}Qp*f4q!3JhQ|i~=ww&pZXCM0a z@TGr;ne~?kD~0l`o@m@F*wZ_MT_inYub7)0W$AX({z?ue-Cfbt`>YIp;I6i0@u z3ox2zea`G>)3w3dhRUcLp1msTYU6^PhpL9ZmUUY;cd^2Zl?yw@s$cFIlb>p`a4E~5 zwGY;**|BOj)>Urpu7B3PtmDw|8!`A?3ht0Y_uoK~8PoOsN3!CN$b!^El3Pet3+WJ! zW?6i{0gFgdz--r82c4Azp_fu+lIs2gKoUoynlmIgXyz&OmUQpY4#gmxA$@i#8I#uS>8v15iNxhXtPu5BqQ!zS~0l9UuUzeiI=nc9)5@k6> z;?-^WIok&ZGos{jzcd^z&$d4^W8Jg*Nxv?fYtDAe%!#hPoga-&8l0CKc^k3BgE79V z?cqu_x$dc%R@>~{6dGL2UvpOMsnG;YqZ7;B>j6B@0&HdHv@ze_9jhR_se1-EJGo)D z-NK&QP0)~GFUexIL(1JWq>iURY5t`?+5Yv4{cNRwyS3SkUehnMw6XCxoPpr9$__m0PJj0Prdx_)G?yITZ+Zj!sN z7G|dz=dSFxPE(b;tcY+lFx?HE61kgT-RlF za@4H)!t9t8lLFy_hGqL>PQR4VwO#H1Dj06lmYcrIpDLYx-zuLV^Nm+kx~L4`WzdoD zuxn;4D8D}#OwH-;ZC}P}?^5dax;b((zT0q@ERxDBV!d9*|J9D~{`a&JK^X4hk=dRupn5}GQKyF3L`44OB zIcr`BY)~oh9L2{`!Wvm^6e!{ZZK!XhJt;dfA>{1?rk=8xdG-hoZN^-6p_1w6UBCVX zQvlI-FXI1G4f&Tk05|9V`GFsd&VP&2>-@i~^8bC+9_`=`dtkNSOQiscA~x7Ih*YCeIbU4L?O4HQZV5DV+t!)^$#F6 zPpMlZ=cVo6xQ~+cZM_%ld;4gmTezc6j(<3KD`(vyqq!Dr3@KB0j93ae0)lE4c_tv;0x1|L!Y*Hw5ly$%tz*)U*{v$4vUS}zCvc^g=9hA z7+6?~?K~>eD6G@0jN>{hgS-rqsxFdho|Z)x%?rQqnxf94ppKd}^MkT1nj(+ms)&j( z$hU9EnW$P>#~5vk?U2U2IxYP&&I=k3^CHfxAW5>)r2UJ*b_I1+aB{VXIZ%>bW8&&JgJy^4C1n^I(qO6!adt!4PlU ze?(5{+QG`x4)T zM+r3UiJtedH%Ufm6@_L=?L;}<*EkoQmDajddd|B`^vdWQi_fZkzx&WmnYy%;TP}JW zriX&j8$@%XETlB0g(vlst+1(|Tc?=0sVyGp-OxAvheVKF`EtFYRuvqawAR*hhsVA* zFG`eB>iBk_AkF4nY$8LeZR+zgbN?-x)?Iz8v>!~rq!;Q_l|jhC4m0r}4*Q|w(+TK1 zAnjhUKN=fcWPxlTF&2By`bV9celXPDSlfki6W4#0?!z9EN(A5Pw6*KmI(xeS1jFik zukmGfzYYA_D{g`hz56~4TF869eb{dDVesKgf(K|D^2|x0nzuHPmKK*s?UN-4e zw%gnev?VH~G*fR;8t82@`+!<|J%ZMcvyQCg)2vV1=JU$tkg4WR+i^1+?bn&x$U}ZG z-3UX_Gs6@J(v5nzbA9VYH`OjRyXVA|k9MR8E!F2vZRx81UFwnOor7D>oIj!YFXWSXMBPd4w+}gG&JY{z1?tHt?qxU`?qTqB$47@h zwl}%!Z@!?$ZzjlwieoGJ-6Dpw5pT3W3)U|!$+JR z8%&O^LJEJ`W{kLzc5DKXZE2>8lwn^Oxo;OYW#7w*v;zL)5IH?)cN_J~Ug)3kx&7*Y zj&ADWXfO30wx810+Fk+{eE*J+UjBB_JM+BjpZq+Nziz8SD?7DS*Qhn8?r8D*?EcS@ zbh-bt9MC(w-}#fd*}hU*UTDjG#$o-Qgb1`EoO6R>M-eSUMUcN|Tkq=p&FMn_<_p%* z*|A1I&W>la{|hF>cA+;T_R7SRte=g+6!g4ggpughZE4*xm$lxbRTb_M)i<-VTVK^j zMAP)iUlB$dSa%~j{OI_ZE;yuhZVXMrVxt(E*)A@owKhbiw+*5Kypf22vy=CnfA0K< znNFWDI$I0DJ=sOO#ZVg)_c#}Tdv*cSK^$#f|syeFXI0P)NRho{v}=7 z?Em-tAX%yZK>cS*LSNVa`z4e8kLB`!33s$kU zGq-dnaB7LTxM%7#Azu}U=T=^cxyjXjC5U0^hbcI(x~lo>e*uqPq)4bK0N*bYx;8z) zGCy;IjXD8bndz=hXgg>#F0E$x`n?=L=;{tk6b&^zeqquN?rH5)LYk6wv5(V$!{*)} z9J-`Gmuq65xmaDnXAhr${pE|Pf`VFg9v84J*qb!qrmk;`}Wf2 z=8BetX~$s-7wgxP`!61U^Kj2pqMqs=4ciuH+h+f4=?mMOw)bb>GPkmS+O$ZM6=I9^ zyDI(WO)gXA{*y13559i>;^`Ov&2T<)i(lWqVFsk)xe5S|D-pX>7j?t^zvQQl{NMKj zFJ6iNaw&|j`TsAO>yLfrCz#|-9H?OZZ{FRy88&`gX2b)dyh@@pYrL>d(x{w!P17K# zv)oV0vZ-&1tLdgxg+Jvnb6T-9C4X*WW!7Ac0?#?5ZVKm@_T6r43&Pvl>w9tn7HJYj zuH4ywO>*h$BT8`Si?mh4Sfr7n2#YL^lctU$k4}0V7g5z=6GxR_6S%AbKTOlO_QTRk zt1t?Ru=ZlV2^d6Kr}JK$IL&A=h_vfJo9_M{$1$!C+k3Y%N*Rw==80c=Rpuo@k%g6? zWN{kCX%qOFSEOE$XIW8uz86*5+{=r)$fLXtynOE0d0j=lHqCha)Fem#{RcD_0KJ#D z0}6_gnqFa;M#(&`%Q~4io=507oacoX&YPrc%E}K3`g)1)6>%L#^D6PPc~lm@--Nw3 z&4A|NB`wgCr!O8qc-VViJBDT+|UF8QRc~IZL_bQJ$?FU|83QKXFHA}_tGHG>v%p-iXdsc)bok} zg7*EQsGFb+Sb#8!{W&|TEb=0lGa?A9N#dx;ie8&$9BGgQm$Vws9^U`rFAvuYBn`_r z#4ECkyrbyhd&R>)K79S97XPjc~JYY7x)dFtZLYRY^yq-mth!s zP=7u5^8%8p%3hmhf5n$aCok?l|4&tLdM|AkrGWX&tFnMyB?;J+xJ*JXsq!*TlaK`v z_zF;&G6+*JD_-Meu@~lf#JXjE7>ox3Q@bpJ|K|RekH0_{fBIzYaLB6lVXqA=s)(xq z23!R}QKRk0b>&ycNl-a{?$6UY@$(Q=j@P6xiK?utIG7MB;XJ%7y8q_kv&WDAd+kud zDD`C0<19?;w8;Z6tD~Z63M58VdPS4610ka_tk^r{9NAKPUYtcaYC;uHu;TF2$OSw; zn#?kPUmai!{y4SKq9V^20kQ=Cnj}@>)fGUhY@XDhrIO5>BUijM5Ar0+d_PKaNU6w^ zw2FfHJj{D-8j3+JyDWKMkjV7y+x+Csnz79Nu!_Rc&of|L=^VPKnhbUYjw_8zFDRNI ztx(jwqz=+Btg3nDXMUN@g*j)%m?;Nye||}vOke^mPglmYH<2wD$QVhUWc03#i=dd# zy?G*BI1P|0Obu=#<4+Sj+2AWkK8YNaufUYvH(bHlyYq)e0 zLtNINGV#B{vrAhv zH_AWXfA-|z^XGdHo<4iV*(RHmh5~b@hzkZ%MrDlEi8_Sg<~LP_L02SE1L4(Km3W0$ zMP8M|A^ZlF8$pGwH#Qb1?tJOvvo`62`w#y7aPKRIND+n?&%V}??mc_>&EtpvwZ^2V zf+F!SBG`f`-hL9Gwbp=^b4-a68PLFTV1`)}V0jlv?71J!{j$OEV_Zqv+aYGt`aWCW zvUrMH&%t=j_^d~Ey_TNGa~!>4UMEqV1!e7fj1o&K^}Re1(_E!mP-R&N2TE}=pnC+^ zv>{e6dv`q2$iJ$Eef0I0U+z7Bc>gcZ=ac(iZeCI}bvSE`8d#MX+Ao?RWE#M1aZ320 z*5h>URaJ^slBJlpafRSOyBEfqN72}{O1vn!q7}7kX-4_{#r+o#*Q>;cadX77THNJxOFgAjWwz$mLx;r%?Vd{I}B_;_P5{Tqn076(RDlxY%F327J;CZ(iK zT=r&!(!PB71yr`tg@K_`#n}E0nia;rKgU6tGhA_8!Uaooe>{9})F^4@n9zP%aiIzM zhRbq3R>u4**nlmd$ZF1eV6OMrZ8#x=^v*epiE|(e5!c=v1=wrm^B7+;f-eqm&9W`$ zSzb3~P~s=ga#4D)N{b-Qng+A9nsNvx-lcEQb4I+8$24=go|o7*Il>>`dWivw&nhcX zS8Kn<-%gqje8x|4gJ7e^EH;+{4s^zsFt!~0EdIm;etS@!90MLwLr_-#4rd3~91*vc z(P9R9FjO=g6kD8DL4Z1h-=}JPp2UVlTJpCSdOj}fJZr>qWWU3rFuW$rCm%olWs~sc zRUc2n=^03(lXW_89Tr|0MFA!uDP4Y)<>G5C=Na;~$O85RE=s>{LW(&Lvu_ zBiQD191eK7qo(ny0*h8+b{V;i&<4|yjWw<4^2~H+A++>AHTHAF9CVH*No2KZ!Z1TC zD@p>BX_4ZVAP|P37l?BruR_cwFGa;Bs+S-J&_Uz*gdT>LaAli)a=e>`9P!A)!xQTV z*b1JXAhmO`5a9Y42?2y$igredD(S2!J-E!UmV!DBf&eemh`32}{iMS++`XHKb0r*s zzbYrHSr<(l7om?05n?VN)~Y$t=Pcn;9N^*2#8HEv5T{igrAT_e#6>t}@5G`m%Z1yT z5*v5;XbOI_@~vCuj<-#XeuH!?%RJ80EXI*43rDCct|dM{$Jj!ag>xJ{#8PYVALIKb z@=a)h@V8(qYQ*1&0HRBC5C6i|-z?gQ@0BHyvWoZw78+VzQ^qwRzt|JsKb}5fPqkl` z#LaO3r#NSUYk<7KWC)_fzTtoA9S!P8Md6;l`^Qs~s6d*x@0Q^IV zz>k}x#<5wY_;;HyOJblZp$}l74>m9|9oz59INx~WoBbtlF+c-hnXtiw2J`@Cn?KJ> zkj8ZhR|h3)(#3BjJE;C|{9)Y$E#U7lSXiyM#Ckhr^kE{8AbJPLBc4Fz76 zn0P5%p3q2DV9k`C&kCdB!qka*7X`l15{15j#0mHo%{-mt@Sk$2SBC$a$m21f z!S^mLlsRVYZjfsSznQILwv+Niv>A^XL28gq`13K{>ktPO96Y8-386zGo+U1+$_sI0 z)kLVW23LPmjraWJTPy;*0l2IEQr;p}~l)<1_~jmBa4A6A;gmZ_Sv)p$uo2&CfRv`L{;c=Zuo=!yOB3xFVc6~Qfa8Sd& zyfm&d;3B|$G(1x^O^v$3xTr6LdFtbG0bPpnIwx?R%rUzOh=6qT#~b?coi6t9wmW|! zbVJE0Nq*@m4s8(G$73u!h~NeGrWb-Pt!w-R9#~n4^b?E&X;vbgt9g_XKL9M4G(H#_ z;16LlwmHM(vhcAjUmgrCSv#~ai01*CLzDsd!EKxah6RK{K%7t;MkS)AXmW5|f^;CH z(-4CU)3`xE1yu}eyhV&lJp;he;iW;FMngLf>(n$!6a?4;f<3GG7#3v{6e<6NQ50fC z)k$1{83vpNj3xuhiE4#^45Ty2l(9cNh~}5BMY?sX4k%N6R(`t%#}&k7m;h2pnh-R0 zoY!-FK6rTwuy;AvVvIyQLwSXlJ57pg&d}j2*oRpYV-k(l4OISRGZ#0s*YER_YR$L+ z2NS9(!3}}SfbIYYvN;75JO@jYMj)LlocTF`Pdu2o`b9Nj?Z_3t+Yyi9TrtkQs~Q*s zJiYU|f3E0foobA7z!(r1#(UJTN}$m&SgSlE#E<130PezE7u5hD`#dh@5h2uy-|Mli zlU=@b;}*}2@wX=HC&sryy5oVV!4?OAaVs&-5gch zo&aD5RTcxWID8z*MVg}8jaMIatX{>W{+ZEGcaAz|evK0#s{vmD`)Zj0v z)X50)fWZi^0c`V}$SsC&P?82gr~`e63^Y=lJg|+xJ4cfKs_8I1mkvXMH>^?y{{%1O zgX}{Wl~_*X6UD_5BAELqNXpy`GN4~@ByO%q-vaQ5elQv$NTaJ|rr~d#4t0E+=nx-G zlY-c5$Ww`eh&r?l2onS&phhbK@J%px3JK&i_*1Zgx{!KK99kQ6=;Q~0g(n9Kz7lICeL_Rd`~9X>c; zFU=5$C4kz9_+o|rDb;?(oA^`@!1F63 z4M-}KC?$FT8Tg>FKvWZ_74wSRZX(ZB{>e4d2j^?1OnMEXmhdxBVw^O2%o=VcM07RALm+~R z3k?Z-#Fy|H!d5)NNDxxSL5cxP8W`$;XyTa^V4+M#5~Kv0$5Q`_C8Ei}c9muFckd3* z$9aS0#uJ6_rUJo<`Ypu_2#ovGmhth-aUuptUmR|!XbL0&5a*aqk@1j^H67Zy zQloKd)W2z3T{GZKQWUZ1q3d8KW)j2z%;-~1qzq&5FCf@)+m(1GBQm5aq94tiC^^7x zqH{UX(sC?eKstZ=Mcz!zb8uYb5VJ>p6hQ1`YH@@d`XW9naO!gq%V~h48Tea3+7*co z1SSizISEXHiyfoaubP;JeD@6G$5tdfFK2^5DLG**Ao({HE-luNEPRgw3PAINiX<$| zPdu<`M6HoINPaSr@w|KFW=X!%*zOcu@YT}tc+kIXQl1>|21-T+42b$SID0rs2=qCy z9TMlg0zZ+5CY+JDigE>D6A(l#^)tx5gQ#)c0_pU|`Y{K+L5VB@+UZ5Ai5ON!T`XC6OA*)ejV@X%SSW~25hQ| zI;s5hTrV!Lq#8IDi9|_*tE>bgKy(uu01x~;4y#~JZfFcpHBRuF&5JpXY6U^mb&3MTcS$h`=#_hL$Ppd<&N(4^2Bc%K|xfj=khJ}D|x z(Sou+iPZWd4;UvsaP9HpqO@IYV19MLo2eJ7#konb3!q!TsG;19L_j1H72^tGg5+vr zr_WP@y+kD<0yJ3oq|u>nmbj$Gs>dg#UOgyq52g71>vQQC^aw5s5Y_~>IWbO36U zhM$zO1Wk+%T~|pmCt;j8ID!_S3Sn~aQ7Qh&3cx)uMw044?ZxCBP0%)ZWml?y4QabS z^vzTb0hc}*?qtQW?VFO^vXEL7s3jh*oM|GY-xKJgq_BX|d?5>Nq!8x8%F zQhCX7n@8{8U69T}s8XDiMZ`Hm$N*akw#5|SxFo<6!vVkpQgjM%QH(xb#pDum1GP*6 zwt_t$jh&?Yt2M5Mt3Dk4zYwL52EKvT1$B)7!$(-*48k2vJvi`7WJwAv7kmU~;0SU6 z?-&Rd+_eB(Ln($tEhG_p<3<0(a(p=W&D2i84#tB6UJ4F!j4H@uGAG1o9Z@}!NOWA` z&L)~dfte~NI!0ldfNDFGkR-}7ffo6s)UMKe&yN3msV>G=%we!nS{d{;{Ek>W#uYGa zsV@~&pseL&5e<5lg4SWN&Qzejde8n>=zV5t% zk5eWqqw*e@8YzK7X=L0gC5HqPKn+2y`zZ{diPD;M;$V{6ldBD240-%;@SCY!(q$@C zSI|>Y9gq=D?SqmC90>@7*{GH!+q&LZp*b zFka_RO3&=`{P2RBIzGd+qOdrp2@usnPD_Oo3c^ODNu+@6FyF}h@S0podIOEgDDXwz zH|g#a>ZEe#c)8K=KB0ZqAN#+M))AAN;ViKD&#NvT{8zdFbd&z0L!qoGo0Xk}Dy8U~E+JnRB8AsBc&xr5&<#JZd6fpK`t3xc`NyyEo(wlnp5p z|03Ij^3fFPA(9J81J+=lmr`32vX;swoL+);4w(};!tDh9kE-Pqew|1Q2152JHF7uX zbEuk%@)a%xeCOgOXZRdjKo)655`$D?mdf7*%9tHoi-0!(q?VNbkOJqDe>6sGd{U~W zD*c=KZ14P#7$7io7HZKncv1qeDx6gz=Yx>0NNq-`#z;g(f(XFHf{gkH9tT*EeneeS zk~@NNb}bmdtIcc}vhjA{o9P-Kla%uXEKbc$N|TBH6-pUC(D4bSZYeB^&I0s*P7Vhp znn@f7j!bP%0J{a{>P9>q&F>ScEB#S#AZ-Feb5iTK8Iv|hrmIEmu37BOq)lN>l+!r@1giV`F_>g>1aejs(;9LI zsDk?#C<~EZawfnh%eh&cWQ3kV3CgKrHJ^0UCxBt=@9XLU)XkY67+q8y3ImVIiGqct z05`c4I2bt00IeM#B9>+-%Q{Cd<8}~*xSQV zZ=!E3Oai^Y3;7q%5?HL9bOR2vp=P<9q$DakrF10>ItLINkS|Y6e&Zz9!+5no1vJLuLF!jxat4jdb>4x3b37pRPRO^B!Zws0r?58V zRKb{Hd;#JT#|ve9N_Ku6*MKHQ`y8V+`jjHPH}cICj=z-pkN~Esh%NDMTnqRT5`4n^ zSFzO*a8%lpghu@5lGsQN3#rKXA1Ol^k9C);rttTNhZjexp_fR#9-lM~^t2L`KV*ys zT2LXFhyc0@dNx&jIJzh2h^PQ7~x50#4y zM^L6x>zsoxGit*joiVIPGM3ZK_()-R;M5VDS`L}Q$Hsruiv|QSaV7=0#H&qzYzD*K zOttVUsoza?4h|Ec$`8k#0ZZW&M2ZEF9DyxKWs=+@PYawhupW>uNNy^@;xy*;ig6g= zilO2k1ri4&OO>bmBFn7!;PGIJ73Q~4$ z;v^@k=U%N|Eh5xIgw!ubt(=BdC(IlzN-JMc*;*BsFR zH*L({NG;Wff4p3*b0}Fegp{x?(Xao)C^5sGO*^_T%}EF#29%0+F$dN1MX@XbtdO zNSG?7bD-ha%P7_veov0ws-lvHgs4H5kC&S=H&-i% z*N%KMg-fmR5I1fqNa>o)CGvwM^N`$q62Va`<;)2rGqts-u|di5d5UkW@;JvEVHQn@ zt~CSy7o_fUuqSwTIj|Xz5Ah10GH94a>~zl5p#TR7K)8j#Oj9@pC=zy+ zcu7d~AVE7CiF zds29Wbp`fLRw)H!O3$(G(Fz}FF7V6s_8nVbVfKNxHXNS&1UIHGV$jDvP;^WnU|EK$>(9RF{9v}Pb=9B}}z9Opw& z0ou+y0<`w7N7+x<0F{(jI5b>NPopvzDlV0j z#{;>noETY+<%2cD0LIQ%59NF_Y9o?^OCfT!@re2?poroUMZ2LY5(fiu{#i|l8gY7I zSA#D>=gP+P5ndK`{8s7$9~`}Ve|CE3t7k&c`)Bz{Zzr@h#R(AsO!Y8;uz6v(z*5;z z&@xfsJOj8b{0Vi5qf|MM4V*6ILv0I6vO+smJ&q7`;b zc&seqY-UV7O8$`39|LBg6q%fQD`4x4!+j|v2mi&t9FXJR#ACroVZh6B%;-3ln##Rq zG&mnP8V(F8{sqd0P}z>E;7~L*#(<-qQB6^o~8loK#j=OK`{eFU3OEw(mga<{=Jfc1iJ1*lCS4x3kV3D#w zCE^4X2Eile;9z=q7#IX0aiMS|0l}JbLi^;Tjmz3?@A8xS=xn)BAHxD}C?}a>3ZhZ7 z*MR?FCs6|ct1zIha)PAfEI+9YE~O9v0ppWSI0K53A9XaY-6KC<7Kc8m-yP;ZuA!WU zy+x`tmOkm>q>+Sze*m1W#y{1gV^Rr{5dRJaFXEA!Eu2#ah?OJy>VlNQ5#8!>}qrL+$RUJ;Puz!AJ-5>2hBQ$RuVJx z#5q|?KrJOoSknKPlh!z~r{V|^j7zkD8pA-G+f;mnSx_(nBc~yXJO*Wh3^dEa->>B0 zl$*`*$=m#lV^eOP)TecRQhvK<9Z`Gr4|4p_-Us6nylF4@Z@uH}W9N?l?tOlE&>WQc z*#QUH-1zy%@2>w`&%pHzT+hJu3|!B^^$c9k!1WAV&%pHzT+hJu3|!B^^$c9k!1WAV z&%pHzT+hJu3|!B^^$c9k!1WAV&%pHzT+hJu3|!B^^$c9k!1WAV&%pHzT+hJu3|!B^ L^$h$Y%)tK#IIl9A literal 0 HcmV?d00001 From 118aed6cd43f757b5dd71f7562fff37ed4a9107e Mon Sep 17 00:00:00 2001 From: d3lerium Date: Tue, 27 Oct 2026 23:32:34 +1100 Subject: [PATCH 3/7] Archive exact C batching and failed complete verification screens --- .../CODE-SOURCES.json | 19 + research/c-verification-feasibility/README.md | 168 +++++++ .../c-verification-feasibility/SOURCES.json | 40 ++ research/c-verification-feasibility/TASK.json | 60 +++ .../VALIDATION.json | 30 ++ .../c-verification-feasibility/VERIFY.json | 63 +++ .../drivers/baseline_full.py | 6 + .../drivers/candidate_full.py | 74 +++ .../evidence/BASELINE-IDENTITY.json | 15 + .../evidence/INTEGER-COMPLETE-GATE.json | 84 ++++ .../evidence/OVERLAP.json | 28 ++ .../evidence/PLAN.json | 51 ++ .../evidence/astra-integer-format-review.md | 221 ++++++++ .../evidence/astra-integer-format.md | 220 ++++++++ .../evidence/astra-rational-design.md | 306 ++++++++++++ .../drafts/arithmetic_binding-v1.py.txt | 114 +++++ .../evidence/drafts/bulk_fragment.c.txt | 160 ++++++ .../publication/fresh-all-scopes/receipt.json | 26 + .../publication/fresh-all-scopes/stderr.txt | 0 .../publication/fresh-all-scopes/stdout.txt | 19 + .../publication/fresh-all-scopes/usage.json | 1 + .../runs/integer-complete-B1/receipt.json | 26 + .../runs/integer-complete-B1/stderr.txt | 0 .../runs/integer-complete-B1/stdout.txt | 9 + .../runs/integer-complete-B1/usage.json | 1 + .../runs/integer-complete-B2/receipt.json | 26 + .../runs/integer-complete-B2/stderr.txt | 0 .../runs/integer-complete-B2/stdout.txt | 9 + .../runs/integer-complete-B2/usage.json | 1 + .../runs/integer-complete-B3/receipt.json | 26 + .../runs/integer-complete-B3/stderr.txt | 0 .../runs/integer-complete-B3/stdout.txt | 9 + .../runs/integer-complete-B3/usage.json | 1 + .../runs/integer-complete-C1/receipt.json | 26 + .../runs/integer-complete-C1/stderr.txt | 0 .../runs/integer-complete-C1/stdout.txt | 10 + .../runs/integer-complete-C1/usage.json | 1 + .../runs/integer-complete-C2/receipt.json | 26 + .../runs/integer-complete-C2/stderr.txt | 0 .../runs/integer-complete-C2/stdout.txt | 10 + .../runs/integer-complete-C2/usage.json | 1 + .../runs/integer-complete-C3/receipt.json | 26 + .../runs/integer-complete-C3/stderr.txt | 0 .../runs/integer-complete-C3/stdout.txt | 10 + .../runs/integer-complete-C3/usage.json | 1 + .../runs/integer-format-finite-O/receipt.json | 26 + .../runs/integer-format-finite-O/stderr.txt | 0 .../runs/integer-format-finite-O/stdout.txt | 1 + .../runs/integer-format-finite-O/usage.json | 1 + .../integer-format-finite-v1/receipt.json | 26 + .../runs/integer-format-finite-v1/stderr.txt | 0 .../runs/integer-format-finite-v1/stdout.txt | 1 + .../runs/integer-format-finite-v1/usage.json | 1 + .../runs/integer-format-micro-B1/receipt.json | 26 + .../runs/integer-format-micro-B1/stderr.txt | 0 .../runs/integer-format-micro-B1/stdout.txt | 1 + .../runs/integer-format-micro-B1/usage.json | 1 + .../runs/integer-format-micro-B2/receipt.json | 26 + .../runs/integer-format-micro-B2/stderr.txt | 0 .../runs/integer-format-micro-B2/stdout.txt | 1 + .../runs/integer-format-micro-B2/usage.json | 1 + .../runs/integer-format-micro-C1/receipt.json | 26 + .../runs/integer-format-micro-C1/stderr.txt | 0 .../runs/integer-format-micro-C1/stdout.txt | 1 + .../runs/integer-format-micro-C1/usage.json | 1 + .../runs/integer-format-micro-C2/receipt.json | 26 + .../runs/integer-format-micro-C2/stderr.txt | 0 .../runs/integer-format-micro-C2/stdout.txt | 1 + .../runs/integer-format-micro-C2/usage.json | 1 + .../runs/rational-final-finite-O/receipt.json | 26 + .../runs/rational-final-finite-O/stderr.txt | 0 .../runs/rational-final-finite-O/stdout.txt | 2 + .../runs/rational-final-finite-O/usage.json | 1 + .../runs/rational-final-finite/receipt.json | 26 + .../runs/rational-final-finite/stderr.txt | 0 .../runs/rational-final-finite/stdout.txt | 2 + .../runs/rational-final-finite/usage.json | 1 + .../rational-finite-micro-v1/receipt.json | 26 + .../runs/rational-finite-micro-v1/stderr.txt | 0 .../runs/rational-finite-micro-v1/stdout.txt | 1 + .../runs/rational-finite-micro-v1/usage.json | 1 + research/c-verification-feasibility/full_B.py | 4 + research/c-verification-feasibility/full_C.py | 4 + research/c-verification-feasibility/guard.py | 120 +++++ .../integer/finite_probe.py | 194 ++++++++ .../integer/integer_binding.py | 84 ++++ .../integer/integer_format.c | 470 ++++++++++++++++++ .../integer/micro_probe.py | 77 +++ .../integer/native_loader.py | 76 +++ .../c-verification-feasibility/portable.py | 102 ++++ .../rational/arithmetic_binding.py | 117 +++++ .../rational/bulk_backend.py | 83 ++++ .../rational/finite_probe.py | 219 ++++++++ .../rational/native_bulk.c | 388 +++++++++++++++ research/c-verification-feasibility/replay.py | 21 + research/c-verification-feasibility/verify.py | 41 ++ 96 files changed, 4178 insertions(+) create mode 100644 research/c-verification-feasibility/CODE-SOURCES.json create mode 100644 research/c-verification-feasibility/README.md create mode 100644 research/c-verification-feasibility/SOURCES.json create mode 100644 research/c-verification-feasibility/TASK.json create mode 100644 research/c-verification-feasibility/VALIDATION.json create mode 100644 research/c-verification-feasibility/VERIFY.json create mode 100644 research/c-verification-feasibility/drivers/baseline_full.py create mode 100644 research/c-verification-feasibility/drivers/candidate_full.py create mode 100644 research/c-verification-feasibility/evidence/BASELINE-IDENTITY.json create mode 100644 research/c-verification-feasibility/evidence/INTEGER-COMPLETE-GATE.json create mode 100644 research/c-verification-feasibility/evidence/OVERLAP.json create mode 100644 research/c-verification-feasibility/evidence/PLAN.json create mode 100644 research/c-verification-feasibility/evidence/astra-integer-format-review.md create mode 100644 research/c-verification-feasibility/evidence/astra-integer-format.md create mode 100644 research/c-verification-feasibility/evidence/astra-rational-design.md create mode 100644 research/c-verification-feasibility/evidence/drafts/arithmetic_binding-v1.py.txt create mode 100644 research/c-verification-feasibility/evidence/drafts/bulk_fragment.c.txt create mode 100644 research/c-verification-feasibility/evidence/publication/fresh-all-scopes/receipt.json create mode 100644 research/c-verification-feasibility/evidence/publication/fresh-all-scopes/stderr.txt create mode 100644 research/c-verification-feasibility/evidence/publication/fresh-all-scopes/stdout.txt create mode 100644 research/c-verification-feasibility/evidence/publication/fresh-all-scopes/usage.json create mode 100644 research/c-verification-feasibility/evidence/runs/integer-complete-B1/receipt.json create mode 100644 research/c-verification-feasibility/evidence/runs/integer-complete-B1/stderr.txt create mode 100644 research/c-verification-feasibility/evidence/runs/integer-complete-B1/stdout.txt create mode 100644 research/c-verification-feasibility/evidence/runs/integer-complete-B1/usage.json create mode 100644 research/c-verification-feasibility/evidence/runs/integer-complete-B2/receipt.json create mode 100644 research/c-verification-feasibility/evidence/runs/integer-complete-B2/stderr.txt create mode 100644 research/c-verification-feasibility/evidence/runs/integer-complete-B2/stdout.txt create mode 100644 research/c-verification-feasibility/evidence/runs/integer-complete-B2/usage.json create mode 100644 research/c-verification-feasibility/evidence/runs/integer-complete-B3/receipt.json create mode 100644 research/c-verification-feasibility/evidence/runs/integer-complete-B3/stderr.txt create mode 100644 research/c-verification-feasibility/evidence/runs/integer-complete-B3/stdout.txt create mode 100644 research/c-verification-feasibility/evidence/runs/integer-complete-B3/usage.json create mode 100644 research/c-verification-feasibility/evidence/runs/integer-complete-C1/receipt.json create mode 100644 research/c-verification-feasibility/evidence/runs/integer-complete-C1/stderr.txt create mode 100644 research/c-verification-feasibility/evidence/runs/integer-complete-C1/stdout.txt create mode 100644 research/c-verification-feasibility/evidence/runs/integer-complete-C1/usage.json create mode 100644 research/c-verification-feasibility/evidence/runs/integer-complete-C2/receipt.json create mode 100644 research/c-verification-feasibility/evidence/runs/integer-complete-C2/stderr.txt create mode 100644 research/c-verification-feasibility/evidence/runs/integer-complete-C2/stdout.txt create mode 100644 research/c-verification-feasibility/evidence/runs/integer-complete-C2/usage.json create mode 100644 research/c-verification-feasibility/evidence/runs/integer-complete-C3/receipt.json create mode 100644 research/c-verification-feasibility/evidence/runs/integer-complete-C3/stderr.txt create mode 100644 research/c-verification-feasibility/evidence/runs/integer-complete-C3/stdout.txt create mode 100644 research/c-verification-feasibility/evidence/runs/integer-complete-C3/usage.json create mode 100644 research/c-verification-feasibility/evidence/runs/integer-format-finite-O/receipt.json create mode 100644 research/c-verification-feasibility/evidence/runs/integer-format-finite-O/stderr.txt create mode 100644 research/c-verification-feasibility/evidence/runs/integer-format-finite-O/stdout.txt create mode 100644 research/c-verification-feasibility/evidence/runs/integer-format-finite-O/usage.json create mode 100644 research/c-verification-feasibility/evidence/runs/integer-format-finite-v1/receipt.json create mode 100644 research/c-verification-feasibility/evidence/runs/integer-format-finite-v1/stderr.txt create mode 100644 research/c-verification-feasibility/evidence/runs/integer-format-finite-v1/stdout.txt create mode 100644 research/c-verification-feasibility/evidence/runs/integer-format-finite-v1/usage.json create mode 100644 research/c-verification-feasibility/evidence/runs/integer-format-micro-B1/receipt.json create mode 100644 research/c-verification-feasibility/evidence/runs/integer-format-micro-B1/stderr.txt create mode 100644 research/c-verification-feasibility/evidence/runs/integer-format-micro-B1/stdout.txt create mode 100644 research/c-verification-feasibility/evidence/runs/integer-format-micro-B1/usage.json create mode 100644 research/c-verification-feasibility/evidence/runs/integer-format-micro-B2/receipt.json create mode 100644 research/c-verification-feasibility/evidence/runs/integer-format-micro-B2/stderr.txt create mode 100644 research/c-verification-feasibility/evidence/runs/integer-format-micro-B2/stdout.txt create mode 100644 research/c-verification-feasibility/evidence/runs/integer-format-micro-B2/usage.json create mode 100644 research/c-verification-feasibility/evidence/runs/integer-format-micro-C1/receipt.json create mode 100644 research/c-verification-feasibility/evidence/runs/integer-format-micro-C1/stderr.txt create mode 100644 research/c-verification-feasibility/evidence/runs/integer-format-micro-C1/stdout.txt create mode 100644 research/c-verification-feasibility/evidence/runs/integer-format-micro-C1/usage.json create mode 100644 research/c-verification-feasibility/evidence/runs/integer-format-micro-C2/receipt.json create mode 100644 research/c-verification-feasibility/evidence/runs/integer-format-micro-C2/stderr.txt create mode 100644 research/c-verification-feasibility/evidence/runs/integer-format-micro-C2/stdout.txt create mode 100644 research/c-verification-feasibility/evidence/runs/integer-format-micro-C2/usage.json create mode 100644 research/c-verification-feasibility/evidence/runs/rational-final-finite-O/receipt.json create mode 100644 research/c-verification-feasibility/evidence/runs/rational-final-finite-O/stderr.txt create mode 100644 research/c-verification-feasibility/evidence/runs/rational-final-finite-O/stdout.txt create mode 100644 research/c-verification-feasibility/evidence/runs/rational-final-finite-O/usage.json create mode 100644 research/c-verification-feasibility/evidence/runs/rational-final-finite/receipt.json create mode 100644 research/c-verification-feasibility/evidence/runs/rational-final-finite/stderr.txt create mode 100644 research/c-verification-feasibility/evidence/runs/rational-final-finite/stdout.txt create mode 100644 research/c-verification-feasibility/evidence/runs/rational-final-finite/usage.json create mode 100644 research/c-verification-feasibility/evidence/runs/rational-finite-micro-v1/receipt.json create mode 100644 research/c-verification-feasibility/evidence/runs/rational-finite-micro-v1/stderr.txt create mode 100644 research/c-verification-feasibility/evidence/runs/rational-finite-micro-v1/stdout.txt create mode 100644 research/c-verification-feasibility/evidence/runs/rational-finite-micro-v1/usage.json create mode 100644 research/c-verification-feasibility/full_B.py create mode 100644 research/c-verification-feasibility/full_C.py create mode 100644 research/c-verification-feasibility/guard.py create mode 100644 research/c-verification-feasibility/integer/finite_probe.py create mode 100644 research/c-verification-feasibility/integer/integer_binding.py create mode 100644 research/c-verification-feasibility/integer/integer_format.c create mode 100644 research/c-verification-feasibility/integer/micro_probe.py create mode 100644 research/c-verification-feasibility/integer/native_loader.py create mode 100644 research/c-verification-feasibility/portable.py create mode 100644 research/c-verification-feasibility/rational/arithmetic_binding.py create mode 100644 research/c-verification-feasibility/rational/bulk_backend.py create mode 100644 research/c-verification-feasibility/rational/finite_probe.py create mode 100644 research/c-verification-feasibility/rational/native_bulk.c create mode 100644 research/c-verification-feasibility/replay.py create mode 100644 research/c-verification-feasibility/verify.py diff --git a/research/c-verification-feasibility/CODE-SOURCES.json b/research/c-verification-feasibility/CODE-SOURCES.json new file mode 100644 index 0000000000..75f4102fae --- /dev/null +++ b/research/c-verification-feasibility/CODE-SOURCES.json @@ -0,0 +1,19 @@ +{ + "drivers/baseline_full.py": "470096a40078958bd4e32f99e312a44672613c2d93a76c9cbfd8d8fb6474471f", + "drivers/candidate_full.py": "e0978a90c63e5294a1ed04863c3966016b64a62a561e914d50821b08846ace72", + "full_B.py": "805d68c55f6565da489a90504e5488ce1636ebdb7be0c7b7e730227a5dad54de", + "full_C.py": "2800f8785d719152a99c70a561ce54ab7b1a5f6482fb40d50766aa93beafcf5d", + "guard.py": "7540f8cc4ae4d12ed86c844ef0837a74184d3ada653979608c295c09f200a751", + "integer/finite_probe.py": "1b804c882833e2628d843bade00dfcbb282e0f53f6712e2d978af9b5c1ce8378", + "integer/integer_binding.py": "dd3e4387dfb8882a524d938d866ed7ae04cd5ac938bbbcbec4eefd15f4bdcc9d", + "integer/integer_format.c": "804cc25bd9ad0912de81fe97bc65b95ebcb0dec06453739e1d4863e7946c4f3d", + "integer/micro_probe.py": "f1d39f830987fcabe8ca5453ddbb1eca1df10a9670a95db510efbe5f21dd76aa", + "integer/native_loader.py": "2592bef50e5338ad562d9a69bca1183ef0d88a4d34bdc497af4452304dca25c3", + "portable.py": "77f8910fb9ba1ed8dcc23bc574e2998105b86818f7391b48efa77eda6ea3d859", + "rational/arithmetic_binding.py": "2115d639fac0262352a3091cc1fcce2c9aefd892992b92e5740ffd173330fdbd", + "rational/bulk_backend.py": "9b440bd3d921bb06ff5035cb8ae85053f3e0b6880b6ec37d364b55da012449ca", + "rational/finite_probe.py": "362bcd2bc967ed223ed303835048d1c51697f0293cfc83cffd4a9e02e2efcccd", + "rational/native_bulk.c": "4a4949e36cff4ff2894dd1f9379b58a58346ec7c888903271d4b98bbe4cfc7ae", + "replay.py": "a25304bed5fcf7ed56802569d648707b73c83666fa6f645ddffc5a5cc0bae2a8", + "verify.py": "57bd03c6134a6eb92d4889e43cce0f3f97fd8f7fc0bce39b8cfb015bd9aecd09" +} diff --git a/research/c-verification-feasibility/README.md b/research/c-verification-feasibility/README.md new file mode 100644 index 0000000000..c9af4e0f74 --- /dev/null +++ b/research/c-verification-feasibility/README.md @@ -0,0 +1,168 @@ +# C verification feasibility: rational batching, integer loops and witness bytes + +This source-pinned engineering screen retains useful exact C prototypes and a +negative complete-performance result. **It does not establish a further 15% +improvement or any qualified positive increment over PR5864.** All six retained +frozen-qualifier scientific receipts agree, but the integer/format candidate +fails both the 15% target and the declared conservative noise gate. The rational +candidate stops at an adverse independent-oracle cost screen. + +This evaluates priorities 1, 2 and 4 of the donor's four-opportunity review. +Exact matrix/GF(2) kernels are a separate workload and are not credited toward +the PR5864 target. No kappa, mathematical construction, physical-cost, +selected-frontier, merge or maintainer-acceptance claim is made. + +## Fixed question and sources + +Can further C exact-arithmetic or serialization work accelerate the complete +frozen PR5864 qualifier while preserving its inputs, independent numerical +contracts, output types, full signed witnesses, hashes and coverage? + +Canonical main is `de5ec2e7a6074068452f45b1a191b5c72832df4a`. The official +163-file PR5864 export is pinned at +`3f15c943e4ad6479f03e674c80fff1269a16ccfe`, SHA-256 +`7b142567acacac5182045bf8daa8780e916661c2cf343dbf81b13c88ead85d64`. +The immutable input retains the complete attribution and predecessor chain. +The original archives, packages and mathematical sources are unchanged. + +Nearest predecessors are [PR5848](https://github.com/CrocSwap/integer-mult-bounds/pull/5848), +[PR5852](https://github.com/CrocSwap/integer-mult-bounds/pull/5852), +[PR5853](https://github.com/CrocSwap/integer-mult-bounds/pull/5853), +[PR5864](https://github.com/CrocSwap/integer-mult-bounds/pull/5864) and the scoped +negative score-dispatch [PR5875](https://github.com/CrocSwap/integer-mult-bounds/pull/5875). +The visible open Fraction PR search and active discussion search are bounded +overlap checks, not exhaustive novelty evidence. + +## Integer loops and canonical formatting: exact outputs, failed performance gate + +The candidate changes the integer `Engine` implementation: checked C batches +sparse additions, signed score updates, scaling, reverse updates and canonical +dyadic byte formatting using arbitrary-size Python integers. The PR5864 +Fraction numerical operations, contribution cache and native bookkeeping remain +unchanged. They provide the same separately executed comparison path, with +shared CPython big-integer primitives acknowledged. This does not claim wholly +independent arithmetic implementations. + +All original timed finite/native/Observation checks and the 120 independent +fixtures remain active. All actual ideal metadata, local weights, error traces, +signed witness rows, reverse comparisons, hashes and the frozen scientific +receipt remain equal on 25,984 events and 799 coordinates. Added finite checks +cover eight row cases, six ordered prefixes, 8,192-bit values, signed +cancellation, complete byte ordering, aliases and 27 labeled checks (six positive +groups and 21 rejection paths). Normal and optimized finite modes pass. + +Each candidate timing pays the added C compile/link/load and every added finite +check. GNU time includes compiler-child CPU. The fixed order is B,C,C,B,B,C; +every sample is retained in [the raw runs](evidence/runs/). + +| Complete frozen qualifier | Median wall seconds | Median CPU seconds | +| --- | ---: | ---: | +| PR5864 baseline | 34.661785392 | 34.47 | +| Integer/format candidate | 32.418777812 | 32.33 | +| Observed fractional reduction | 6.4711% | 6.2083% | +| Maximum within-arm repeat spread | 2.713637238 | 2.35 | +| Absolute median saving | 2.243007580 | 2.14 | + +The observed median savings are smaller than their repeat spreads. The +predeclared final gate requires an absolute saving greater than 0.50 seconds +and either arm's observed spread in both wall and CPU, plus the 15% target. +Both noise gates and the target fail. These observations are not a qualified +speedup. No sample was discarded and no timing was rerolled. See +[INTEGER-COMPLETE-GATE.json](evidence/INTEGER-COMPLETE-GATE.json). + +The timed scope matches PR5864's `benchmark.py` / `full_C.py` frozen qualifier. +As in that predecessor, four unchanged source-custody controls are separate +from both timed arms. The registered baseline command below freshly runs them +with all predecessor finite/native checks. The timings are not the larger +portable `replay_driver.py` total. A new full optimized or readonly complete +performance qualification was not pursued after the failed gate. + +The internal `add_row` helper now returns a fresh dictionary. The compatibility +promise is the checked `Engine` workload contract; arbitrary external callers +expecting mutation/`None` are not covered. Historical binder metadata fields +such as `source_only_handoff` describe the worker's handoff, while the parent +run receipts state what was actually executed. + +## Rational batching: independent-oracle bill stops construction + +The prototype retains the existing contribution callback/cache and batches +three score accumulators as general normalized rational pairs backed by Python +integers. It materializes exact built-in Fractions at each event boundary and +supports odd denominators. Exact Fraction output types do not make its changed +arithmetic an untouched literal Python Fraction oracle. + +The bounded probe passed 178 literal/predecessor/candidate comparisons and 19 +added controls. The final binder also rejects destructor drift; its exact final +bytes pass finite normal and optimized replay. The earlier binder and every +declared BCCB micro observation are retained. The micro excludes cold build +and has no complete-performance or source-independent oracle admission. + +Under the required literal-oracle contract, a complete candidate must pay for +the untouched literal Fraction path, the unchanged integer path, and the new +rational path with separate mutable state. Historical, same-audit observations +retained inside the official export give 20.534678 wall / 20.523067 CPU seconds +for the literal trace and 11.886980 wall / 11.883083 CPU seconds for the entire +replaceable native trace including cold build. Even granting zero cost to the +new rational kernel, conversions, build and all new checks, that replacement +adds about 8.65 wall / 8.64 CPU seconds in this historical screen. + +This defeats credible headroom for this exact restoration design. It is a +source-pinned engineering stop, not a fresh complete benchmark, universal +runtime lower bound, or impossibility result. No new actual-word or complete +rational run was performed. The source-qualified packet interface does not +promise arbitrary callback observational equivalence or allocator-level OOM +partial-state equivalence. See [the detailed report](evidence/astra-rational-design.md) +for the complete added validation bill and unresolved construction obligations. + +## Fresh verification and reproduction + +Tested on Linux x86-64, CPython 3.12.3 and GCC 13.3. Existing `cc` and Python +development headers are required. No dependency installation, compiled binary, +new mathematical search or shared mutable answer cache is included. + +```sh +python3.12 -B scripts/research_package.py --package research/c-verification-feasibility +``` + +The registered commands freshly authenticate the full export and exact prototype +code, run the original custody/finite/native verifier, and run integer and +rational finite checks in normal and optimized modes. They do not execute the +actual word or admit performance. Source export and readonly Git-free finite +verification are independent packaging checks. + +For a separately authorized complete correctness replay, the guarded optional +entry point takes a new external evidence directory and an arm: + +```sh +python3.12 -B research/c-verification-feasibility/replay.py C /tmp/c-feasibility-new-evidence +``` + +This reconstructs the exact scientific source layout from the archive and adds +portable extraction overhead. Its fresh times are separate from the retained +six-process screen. It refuses evidence reuse and retains the 180-second / +1-GiB sampled process-group RSS / serial / zero-automatic-retry policy. Do not +reroll the failed retained timing round. + +## Credit and open next questions + +Original mathematics, P104 source, integer replay, literal scalar and reverse +oracles: Ali Romman and all predecessor authors retained in the complete input +archive and its NOTICE. Earlier source-bound contribution-table, entry, +compact/slot and C-bookkeeping work is retained and credited through PR5852, +PR5853 and PR5864; PR5875 supplies the separate failed thin score-dispatch +screen. The inherited Ali Romman PR5761 three-file routing-test repair remains +credited and unchanged. Apache-2.0 notices remain in the archive and new source. + +Prepared by Chris R / Clear1nsight with substantial OpenAI Codex implementation +and user-requested GPT-6-astra xhigh static design/source review. Only the parent +ran numerical/compiler work, serially. These are assisted engineering checks, +without independent human or proof-kernel acceptance. + +The requested further 15% PR5864 improvement remains unmet. A different exact +arithmetic ownership boundary would need a new source-pinned cost screen, +unchanged required independent oracle and full added verification bill before +construction. No further timing or construction is justified for these frozen +nominations in this round. The separate matrix/GF(2) opportunity must be priced +against its own complete verification scope; its savings cannot be added to +these percentages. [Structured questions](TASK.json) and both retained design +reports name the boundaries and smallest useful next steps. diff --git a/research/c-verification-feasibility/SOURCES.json b/research/c-verification-feasibility/SOURCES.json new file mode 100644 index 0000000000..df793edcb6 --- /dev/null +++ b/research/c-verification-feasibility/SOURCES.json @@ -0,0 +1,40 @@ +{ + "schema_version": 1, + "base_commit": "de5ec2e7a6074068452f45b1a191b5c72832df4a", + "files": [ + { + "path": "docs/research/agent-task-catalog.json", + "usage": "provenance", + "git_blob": "3404fbdd5e7529a0674eef26114b5071e4586cec", + "sha256": "ead6cdc9d0af6d58e8a49744d8ec8c7c15e13d2ba93c276c434bcf9b51b93a81" + }, + { + "path": "certificates/selected-result.json", + "usage": "provenance", + "git_blob": "581f8d87008354eb5b869f7ed9de1317ad837ce8", + "sha256": "2a0220e866417774606e0f991e41b9c1d26b1f43b97857238cf478dbc7d330b5" + }, + { + "path": "research/c-verification-feasibility/inputs/PR5864.tar", + "usage": "input", + "git_blob": "bb9fc302168df0bf66cf43d08bce70544eeffc4e", + "sha256": "7b142567acacac5182045bf8daa8780e916661c2cf343dbf81b13c88ead85d64", + "pin": "head:ccb92b752ab31df4220780a580cc14d9e86ffeca:research/c-verification-feasibility/inputs/PR5864.tar" + } + ], + "external_origin": { + "repository": "CrocSwap/integer-mult-bounds", + "pr": 5864, + "head": "3f15c943e4ad6479f03e674c80fff1269a16ccfe", + "official_export_sha256": "7b142567acacac5182045bf8daa8780e916661c2cf343dbf81b13c88ead85d64", + "complete_files": 163 + }, + "predecessors": [ + 5848, + 5852, + 5853, + 5864, + 5875 + ], + "scope": "No new kappa, construction, selected-frontier or qualified performance claim." +} diff --git a/research/c-verification-feasibility/TASK.json b/research/c-verification-feasibility/TASK.json new file mode 100644 index 0000000000..4baeb84156 --- /dev/null +++ b/research/c-verification-feasibility/TASK.json @@ -0,0 +1,60 @@ +{ + "schema_version": 1, + "task_id": "replay-runtime", + "original_card": { + "id": "replay-runtime", + "question": "Can one measured replay bottleneck be sped up without dropping coverage?", + "starting_points": [ + "scripts/run_isolated_tests.py", + "scripts/verify_replay_coverage.py", + "certificates/selected-result.json" + ], + "methods": [ + "Profile one isolated replay and optimize the measured bottleneck.", + "Design source-bound reuse with explicit dependency invalidation and negative controls." + ], + "acceptance_gate": "Report before/after wall time on the same fixture, retained checks and invalidation behavior.", + "first_step": { + "command": [ + "python3", + "-B", + "scripts/research_selected_baseline.py" + ], + "expected": "PASS_RESEARCH_BASELINE_BINDINGS_ONLY", + "inspect": "Resolve the current selected review, separate complex/ordinary BIT/admitted BIT/outer budgets, and compare the card against live handoffs before starting. Historical ceilings require exact source/model equivalence.", + "scope": "Source-binding orientation only; not a scientific replay or all-size proof. Materialize selected inputs if this checkout is sparse." + }, + "first_experiment": "Measure one unchanged fixture, preserve check coverage, and test one optimization with invalidation controls.", + "bottleneck_link": "Faster trustworthy replays increase review throughput and let mechanism candidates be checked sooner.", + "allowed_variations": [ + "Profile one stage or design one source-bound cache boundary." + ], + "scope_change_triggers": [ + "Skipping coverage or comparing different fixtures to claim speedup." + ], + "overlap_terms": [ + "replay runtime", + "cache invalidation", + "isolated tests" + ] + }, + "bottleneck_link": "Faster trustworthy replays increase review throughput and let mechanism candidates be checked sooner.", + "author": "Chris R / Clear1nsight", + "base_commit": "de5ec2e7a6074068452f45b1a191b5c72832df4a", + "scope_status": "refined", + "scope_change_reason": "User requested all four C verification opportunities and a minimum15% improvement. This scoped package retains rational oracle-cost rejection and integer/format frozen-qualifier negative performance screen; matrix verification is separate.", + "actual_scope": "PR5864/source-pinned-C-rational-integer-format-feasibility", + "stop_rule": "No timing rerolls after failed noise/15% gates; no full rational run after adverse oracle-cost screen. Keep all scoped negative evidence and attribution.", + "time_budget_minutes": 60, + "outcome": "completed", + "evidence": "README.md, evidence/INTEGER-COMPLETE-GATE.json, evidence/runs/, exact source manifests and independent Astra source reviews", + "ai_assistance": "Substantial OpenAI Codex implementation and user-requested GPT-6-astra xhigh static source/design review. One parent-owned serial numerical runner; no human or proof-kernel acceptance.", + "open_questions": [ + { + "question": "Could a different exact arithmetic ownership boundary fund a complete gain while retaining the required independent oracle?", + "why_it_matters": "The requested further15% frozen-qualifier target remains unmet by these mechanisms.", + "first_step": "Give a source-pinned static cost screen and complete validation bill before any new construction or timing round.", + "blocked_by": "Current rational oracle restoration is losing; integer/format samples failed the declared noise gate and15% target." + } + ] +} diff --git a/research/c-verification-feasibility/VALIDATION.json b/research/c-verification-feasibility/VALIDATION.json new file mode 100644 index 0000000000..ea132e6e5d --- /dev/null +++ b/research/c-verification-feasibility/VALIDATION.json @@ -0,0 +1,30 @@ +{ + "status": "PASS_SCOPED_CORRECTNESS_NEGATIVE_PERFORMANCE_GATES", + "fresh_original_custody_controls": 4, + "fresh_original_complete_finite_comparisons": 964, + "fresh_original_inherited_controls": 73, + "fresh_original_native_controls": 45, + "new_integer_checks": 27, + "new_integer_ordered_prefixes": 6, + "new_integer_bigint_bits": 8192, + "new_rational_comparisons": 178, + "new_rational_controls": 19, + "extra_final_binder_destructor_control": 1, + "finite_normal_optimized": "PASS", + "complete_frozen_qualifier_six_scientific_receipts_equal": true, + "complete_frozen_qualifier_samples": 6, + "complete_frozen_qualifier_15_percent_gate": false, + "complete_frozen_qualifier_noise_wall_gate": false, + "complete_frozen_qualifier_noise_cpu_gate": false, + "qualified_speed_claim": false, + "new_rational_actual_word_or_complete_runs": 0, + "new_complete_optimized_or_readonly_replays": 0, + "readonly_gitfree_finite": "PENDING", + "metadata_committed_bytes": "PENDING", + "hosted_exact_head": "PENDING", + "scope_notes": [ + "Four unchanged custody checks are separate from timed arms, matching frozen PR5864 benchmark.", + "Complete actual witness/ideal/weights outputs equal and all120 independent fixtures retained.", + "Prototype author also performed integer source review; independent human/proof-kernel acceptance unclaimed." + ] +} diff --git a/research/c-verification-feasibility/VERIFY.json b/research/c-verification-feasibility/VERIFY.json new file mode 100644 index 0000000000..279d71428d --- /dev/null +++ b/research/c-verification-feasibility/VERIFY.json @@ -0,0 +1,63 @@ +{ + "schema_version": 1, + "status": "ready", + "python": "3.12", + "requirements": [], + "inputs": [ + "research/c-verification-feasibility/inputs/PR5864.tar" + ], + "commands": [ + { + "argv": [ + "{python}", + "-B", + "{package}/verify.py", + "baseline" + ], + "timeout_seconds": 30, + "checks": "Fresh scoped baseline controls; existing compiler and CPython3.12 headers required; no install or full performance replay." + }, + { + "argv": [ + "{python}", + "-B", + "{package}/verify.py", + "integer" + ], + "timeout_seconds": 30, + "checks": "Fresh scoped integer controls; existing compiler and CPython3.12 headers required; no install or full performance replay." + }, + { + "argv": [ + "{python}", + "-B", + "-O", + "{package}/verify.py", + "integer" + ], + "timeout_seconds": 30, + "checks": "Fresh scoped integer controls; existing compiler and CPython3.12 headers required; no install or full performance replay." + }, + { + "argv": [ + "{python}", + "-B", + "{package}/verify.py", + "rational" + ], + "timeout_seconds": 30, + "checks": "Fresh scoped rational controls; existing compiler and CPython3.12 headers required; no install or full performance replay." + }, + { + "argv": [ + "{python}", + "-B", + "-O", + "{package}/verify.py", + "rational" + ], + "timeout_seconds": 30, + "checks": "Fresh scoped rational controls; existing compiler and CPython3.12 headers required; no install or full performance replay." + } + ] +} diff --git a/research/c-verification-feasibility/drivers/baseline_full.py b/research/c-verification-feasibility/drivers/baseline_full.py new file mode 100644 index 0000000000..413320010c --- /dev/null +++ b/research/c-verification-feasibility/drivers/baseline_full.py @@ -0,0 +1,6 @@ +from pathlib import Path +import sys +root=Path(__file__).resolve().parents[2] +sys.path.insert(0,str(root/'baseline-public')) +from full import main +main(True) diff --git a/research/c-verification-feasibility/drivers/candidate_full.py b/research/c-verification-feasibility/drivers/candidate_full.py new file mode 100644 index 0000000000..189be60ccd --- /dev/null +++ b/research/c-verification-feasibility/drivers/candidate_full.py @@ -0,0 +1,74 @@ +from pathlib import Path +import sys +STAGE=Path(__file__).resolve().parent +ROUND=STAGE.parents[1] +sys.path.insert(0,str(STAGE)) +sys.path.insert(0,str(ROUND/'baseline-public')) +import native_loader,integer_binding +from finite_probe import run as _extra_finite +_NATIVE=native_loader.load('804cc25bd9ad0912de81fe97bc65b95ebcb0dec06453739e1d4863e7946c4f3d') +_EXTRA=_extra_finite(_NATIVE) +_BINDINGS=[] +def _native_integer(path): + module,receipt=integer_binding.derive(path,_NATIVE,'82a73e4bcf1835bfdd510c7ad5538625c1b380c559b671e6a67be490615a743a') + _BINDINGS.append(receipt) + return module +"""Complete frozen qualifier with one source-bound Fraction seam changed.""" +import importlib.util,inspect,json,sys +from pathlib import Path +from frozen import baseline,require + +ACTUAL_STATS=dict(calls=2579750,hits=2252966,misses=326784,evictions=310400,bypasses=0,resident=16384,capacity=16384) +OUTPUT='954c7448ff74d78753828e9623ad44c46da9e5ce459420b6e50a5d47294250b9' + +def main(native=False): + if native: + import finite + finite.main() + # The inherited finite harness imports its own sealed temporary source. + # Remove only expired, owned temporary modules before the fresh qualifier. + for name in ('source','observe'): + value=sys.modules.get(name);file=getattr(value,'__file__','') + if file.startswith('/tmp/precision-linux-source-') and not Path(file).exists():del sys.modules[name] + with baseline() as package: + sys.path.insert(0,str(package)) + spec=importlib.util.spec_from_file_location('native_complete_frozen_entry',package/'candidate.py') + entry=importlib.util.module_from_spec(spec);spec.loader.exec_module(entry) + if not native: + entry.main();return + import fraction_table,native_backend + captures=[] + def native_trace(reference,expected_word): + trace=fraction_table.derive(reference) + def call(word,weights,rounded): + result=trace(word,weights,rounded) + if len(word['program'])==len(expected_word['program']): + require(trace.compacted_selected() is True,'actual native route selected') + require(trace.statistics()==ACTUAL_STATS,'all actual native counters') + require(reference.digest(result)==OUTPUT,'complete actual native output digest') + captures.append(dict(statistics=trace.statistics(),output_sha256=OUTPUT,tokens=trace.token_count())) + return result + return call + raw=(package/'candidate.py').read_text() + seam=' value = Observation(value, reference.digest, word)\n' + require(raw.count(seam)==1,'one authenticated actual Fraction seam') + changed=raw.replace(seam,' value.error_trace = _native_trace(value, word)\n'+seam) + integer_seam=" integer = v.load('integer_backend', package/'integer.py')\n" + require(changed.count(integer_seam)==1,'one authenticated integer candidate seam') + changed=changed.replace(integer_seam," integer = _native_integer(package/'integer.py')\n") + namespace=dict(entry.__dict__);namespace['_native_trace']=native_trace + namespace['_native_integer']=_native_integer + exec(compile(changed,str(package/'candidate.py'),'exec'),namespace) + qualify=namespace['qualify'] + def qualified(): + result=qualify() + require(len(captures)==1,'one complete actual native observation') + print(json.dumps(dict(status='PASS_COMPLETE_NATIVE_COVERAGE',actual=captures[0],build=native_backend.receipt(),native_finite_included=True,compiler_children_charged=True,integer_backend_changed=True,baseline_fraction_arithmetic_unchanged=True),sort_keys=True)) + return result + namespace['qualify']=qualified + namespace['main']() + + +main(True) +require(len(_BINDINGS)==1,'one authenticated changed integer backend') +print(json.dumps(dict(status='PASS_COMPLETE_INTEGER_FORMAT_CANDIDATE',added_finite=_EXTRA,native_integer_build=native_loader.receipt(),source_binding=_BINDINGS[0],fraction_backend='unchanged PR5864 Python Fraction arithmetic and native bookkeeping',integer_backend_changed=True),sort_keys=True)) diff --git a/research/c-verification-feasibility/evidence/BASELINE-IDENTITY.json b/research/c-verification-feasibility/evidence/BASELINE-IDENTITY.json new file mode 100644 index 0000000000..3e6a3b9b7f --- /dev/null +++ b/research/c-verification-feasibility/evidence/BASELINE-IDENTITY.json @@ -0,0 +1,15 @@ +{ + "official_export_head": "3f15c943e4ad6479f03e674c80fff1269a16ccfe", + "official_archive_sha256": "7b142567acacac5182045bf8daa8780e916661c2cf343dbf81b13c88ead85d64", + "same_bytes_count": 157, + "differing_bytes": [ + "VALIDATION.json" + ], + "missing_from_sealed": [ + "evidence/SEALED-RESULT.json", + "evidence/portable/runs/complete-native/receipt.json", + "evidence/portable/runs/complete-native/stderr.txt", + "evidence/portable/runs/complete-native/stdout.txt", + "evidence/portable/runs/complete-native/usage.json" + ] +} diff --git a/research/c-verification-feasibility/evidence/INTEGER-COMPLETE-GATE.json b/research/c-verification-feasibility/evidence/INTEGER-COMPLETE-GATE.json new file mode 100644 index 0000000000..7fe1e6b71a --- /dev/null +++ b/research/c-verification-feasibility/evidence/INTEGER-COMPLETE-GATE.json @@ -0,0 +1,84 @@ +{ + "status": "COMPLETE_FIXED_SIX_PROCESS_COMPARISON", + "order": [ + "B1", + "C1", + "C2", + "B2", + "B3", + "C3" + ], + "samples": { + "B": [ + { + "label": "B1", + "wall": 36.543337017006706, + "cpu": 35.769999999999996 + }, + { + "label": "B2", + "wall": 34.66178539200337, + "cpu": 34.47 + }, + { + "label": "B3", + "wall": 33.855156300996896, + "cpu": 33.589999999999996 + } + ], + "C": [ + { + "label": "C1", + "wall": 34.77152032399317, + "cpu": 34.32 + }, + { + "label": "C2", + "wall": 32.41877781198127, + "cpu": 32.33 + }, + { + "label": "C3", + "wall": 32.05788308600313, + "cpu": 31.97 + } + ] + }, + "medians": { + "B": { + "wall": 34.66178539200337, + "cpu": 34.47 + }, + "C": { + "wall": 32.41877781198127, + "cpu": 32.33 + } + }, + "spreads": { + "B": { + "wall": 2.6881807160098106, + "cpu": 2.1799999999999997 + }, + "C": { + "wall": 2.713637237990042, + "cpu": 2.3500000000000014 + } + }, + "absolute_saving_seconds": { + "wall": 2.2430075800220948, + "cpu": 2.1400000000000006 + }, + "fractional_saving": { + "wall": 0.06471125346415552, + "cpu": 0.06208297069915869 + }, + "all_scientific_receipts_equal": true, + "cold_compile_and_added_checks_included": true, + "target_15_percent_passed": false, + "declared_noise_gate": { + "wall": false, + "cpu": false + }, + "qualified_positive_increment": false, + "interpretation": "Record all samples; no reroll. Any failed 15% or noise gate remains failed." +} diff --git a/research/c-verification-feasibility/evidence/OVERLAP.json b/research/c-verification-feasibility/evidence/OVERLAP.json new file mode 100644 index 0000000000..8bd76f09e2 --- /dev/null +++ b/research/c-verification-feasibility/evidence/OVERLAP.json @@ -0,0 +1,28 @@ +{ + "canonical_main_fetched": "de5ec2e7a6074068452f45b1a191b5c72832df4a", + "chrome_start_here_read": "https://github.com/CrocSwap/integer-mult-bounds/discussions/1163", + "chrome_open_fraction_search": "https://github.com/CrocSwap/integer-mult-bounds/pulls?q=is%3Apr+is%3Aopen+Fraction", + "open_fraction_matches": 18, + "nearest": [ + 5875, + 5864, + 5853, + 5852, + 5848, + 5839, + 2409, + 2357, + 2263, + 1922 + ], + "active_discussion_index_read": "https://github.com/CrocSwap/integer-mult-bounds/discussions", + "coverage_limits": "Bounded visible open PR body/title search for Fraction and active discussion index; no exhaustive novelty claim. Existing complete-performance packages and failed thin score wrapper are preserved. Recheck focused overlap at pivot/submission.", + "predecessors_from_checkpoint": [ + 5168, + 5382, + 2853, + 3143 + ], + "chrome_active_verification_search": "https://github.com/CrocSwap/integer-mult-bounds/discussions?discussions_q=is%3Aopen+verification", + "active_discussion_search_coverage": "Read first visible page: verification engineering precedents and handoff hub, no same bulk-rational/integer-format scope visible; not exhaustive." +} diff --git a/research/c-verification-feasibility/evidence/PLAN.json b/research/c-verification-feasibility/evidence/PLAN.json new file mode 100644 index 0000000000..076a830b35 --- /dev/null +++ b/research/c-verification-feasibility/evidence/PLAN.json @@ -0,0 +1,51 @@ +{ + "status": "ACTIVE_AUTHORIZED_ALL_FOUR", + "created_utc": "2026-10-27T12:01:43.486342+00:00", + "base_main": "de5ec2e7a6074068452f45b1a191b5c72832df4a", + "performance_baseline": "PR5864 3f15c943e4ad6479f03e674c80fff1269a16ccfe", + "target": "At least 15% further complete wall AND CPU reduction over frozen PR5864, with a full assessment of all four opportunities. Positive smaller independent increments may be retained; goal remains unfulfilled until target/all-assessments/publication are complete.", + "opportunities": { + "1": "bulk exact rational batching", + "2": "native arbitrary-width integer sparse/reverse loops", + "3": "exact matrix and finite-field kernels, separate workload", + "4": "canonical dyadic witness formatting" + }, + "coverage": "All original and PR5864 checks retained and charged; independent Python Fraction oracle unchanged, exact output types/witnesses/hash bytes and all inputs preserved.", + "measurement_rule": { + "order": [ + "B1", + "C1", + "C2", + "B2", + "B3", + "C3" + ], + "baseline": "fresh cold complete PR5864", + "candidate": "same workload plus every new finite/native/binding check and cold compiler/link/load", + "preliminary_pair_gate": "both wall/CPU positive, greater than declared 0.50 sec absolute conservative noise allowance, with optimistic route to 15% cumulative. No dropped samples or automatic retries.", + "final_gate": "both median wall and CPU improvement >=15%, absolute saving >0.50 sec and > observed complete repeat spread, exact scientific receipts all equal", + "platform": "frozen Linux CPython 3.12", + "profiling": "diagnostic only; never convert nested totals to complete speed claims" + }, + "caps": { + "serial_numerical_runner": true, + "command_seconds": 180, + "sampled_process_group_rss_bytes": 1073741824, + "initial_feasibility_seconds": 600, + "shared_round_seconds": 1500, + "automatic_retries": 0 + }, + "roles": { + "parent": "sole numerical runner, integration, matrix assessment, Chrome publication", + "astra_rational_design": "static creative design/source rational/ only", + "astra_integer_format": "static source integer-format/ only" + }, + "publication": "fresh upstream main/overlap checks, isolated scoped worktree, source pins/credit, upstream PR template, normal/O/readonly export/committed-byte checks, exact-head CI and seven-field handoff readback; Chrome for GitHub writes; nonforce SSH fork push", + "paused": [ + "kappa research", + "Work1/Work2 mathematics", + "unrelated feeds", + "automations" + ], + "preservation": "No modification of synced sources/, old checkpoints, old evidence or original thread" +} diff --git a/research/c-verification-feasibility/evidence/astra-integer-format-review.md b/research/c-verification-feasibility/evidence/astra-integer-format-review.md new file mode 100644 index 0000000000..d5655fbbd2 --- /dev/null +++ b/research/c-verification-feasibility/evidence/astra-integer-format-review.md @@ -0,0 +1,221 @@ +# Integer/format measured candidate: static review and stop assessment + +**Decision: the scoped negative result is supported, subject to the boundaries +below. No new qualified speedup or further 15% result is admitted. No additional +implementation or timing round is recommended from the current evidence.** + +This review inspected saved source and receipts only. It did not compile, +import scientific modules, execute arithmetic/tests, time anything, change +measured source, dispatch work, operate a browser or mutate Git. The reviewer +is separate from the parent's numerical execution, but authored the original +C/binder prototype. Therefore this is not an independent-author code audit or +an independent execution replay. It is a static second pass over integration, +coverage, independence and the recorded stopping decision. + +## Reviewed artifacts and identity + +All paths below are relative to `outputs/c-verification-all-opportunities-20261027/`. + +- `stages/integer-complete-v1/candidate_full.py`, SHA256 + `e0978a90c63e5294a1ed04863c3966016b64a62a561e914d50821b08846ace72`. +- `stages/integer-complete-v1/baseline_full.py`, SHA256 + `470096a40078958bd4e32f99e312a44672613c2d93a76c9cbfd8d8fb6474471f`. +- Measured `integer_format.c` and `integer_binding.py` match the handed-off + source hashes exactly: respectively + `804cc25bd9ad0912de81fe97bc65b95ebcb0dec06453739e1d4863e7946c4f3d` and + `dd3e4387dfb8882a524d938d866ed7ae04cd5ac938bbbcbec4eefd15f4bdcc9d`. +- `INTEGER-COMPLETE-GATE.json`, observed SHA256 + `85b9bca95c83e312f55f5d60748292033e3802697c21f757dec912fc95fe6b6e`. +- All six `runtime/runs/integer-complete-{B1,C1,C2,B2,B3,C3}/` final scientific + receipt lines and guarded process receipts; fuller B2/C2 native/Observation + records; archived original single-pass `candidate.py` and `custody.py`. +- The frozen PR5864 `baseline-public/{full.py,finite.py,frozen.py,README.md, + benchmark.py,VALIDATION.json,VERIFY.json,verify.py,replay_driver.py,custody.py}` + boundaries, and original `Observation` implementation. + +The raw six scientific receipts have the same source result digest +`cc7739703ed23532d187949c8507d09c13ac4c152e07a930f0087cde0d7a3d98`, +25,984 events, 799 coordinates, 120 finite programs / 4,240 fixture events, +three integer rejections, six source controls, and complete actual witness +comparison. Every guarded process receipt inspected records exit 0, empty +stderr, unchanged source bytes/modes, no termination, and sampled RSS below +the parent cap. These are saved execution records, not executions by this +reviewer. + +## Recorded performance decision + +The fixed BCCBBC comparison records median wall/CPU of +34.661785392 / 34.47 seconds for B and 32.418777812 / 32.33 seconds for C. +The descriptive reductions are 6.471125% wall and 6.208297% CPU. The absolute +median differences, 2.243007580 wall and 2.14 CPU seconds, are smaller than the +recorded maximum repeat spreads, 2.713637238 wall and 2.35 CPU seconds. + +Thus both the 15% target and the declared conservative noise gates failed. +The median numbers may be reported as descriptive raw observations, accompanied +by the failed gates. They are not a qualified smaller positive increment. +No sample may be discarded, and source edits or repeated timings cannot +retroactively repair this six-process result. The synthetic micro result does +not overturn this decision; its candidate commands paid cold compilation and +checks outside the inner batch timer. + +## Coverage review + +The new wrapper retains the frozen `full.main(True)` native finite work and +original source-bound Fraction trace adaptation. Its only additional complete +qualification seam is the authenticated integer module load at +`candidate_full.py:56-58`. The replacement checks an exact occurrence and +constructs a fresh candidate integer module using the pinned original source. +The new finite probe and integer cold build execute before `main(True)` and +are therefore inside the parent's outer process timing. The prior Fraction +native build, checks and actual bookkeeping counters remain present. + +The archived original `qualify()` still performs the following work after the +integer replacement: + +1. It runs `contract.calculate(p, candidate)` and compares the complete result + against the frozen expected result, including source controls. +2. It runs a fresh original calculation through the unchanged PR5864 Fraction + arithmetic/native-bookkeeping path and compares complete results. +3. Separate one-use Observations retain the actual ideal metadata/local weights + and full error trace/signed witnesses, then compare both full values. +4. It runs the unchanged 120-program differential against the literal reference, + including reverse equality, and checks the exact frozen qualification receipt. + +The 27 Observation labels remain in the inherited entry-point finite run. The +118 inherited/native controls remain in the PR5864 finite run. The added +integer probe's 27 labels comprise six positive case groups and 21 rejection +paths; they are not 27 independent rejection cases. The eight row cases and +six ordered prefixes are separately recorded. Nothing in the candidate binder +replaces a full witness comparison with a digest-only check or samples hash +entries. Peaks, role tie-breaking, Pareto selection, returned Fraction types +and the public Engine call signatures remain in the unchanged Python outer +code. No additional scientific coverage omission was found in this review. + +### Custody is separate from this timed scope + +Neither measured wrapper invokes `custody.main()`. The portable +`replay_driver.py` does invoke it. This initially looked like missing timed +coverage, but the frozen PR5864 README line 19 and VALIDATION scope explicitly +place all four unchanged custody controls outside both timed candidate stages. +Its original `benchmark.py` uses `full_B.py`/`full_C.py` under that same boundary. +The current six samples therefore match the **complete frozen qualifier** +benchmark scope; they do not measure the full portable replay-driver command. + +Publication must preserve and freshly run the separate registered custody +checks. The parent has stated it will do so; this review does not pre-claim +that later result. A separate successful custody replay must remain separately +identified and must not be added retroactively to the six measured commands. +No timing reroll is needed to preserve the scoped negative conclusion. + +## Independence review + +The integer numerical implementation has changed. The wrapper correctly emits +`integer_backend_changed=True` and `baseline_fraction_arithmetic_unchanged=True`. +It does not carry forward `integer_oracle_unchanged=True` as a current claim. +The fresh binder modifies only its newly created integer module. The inherited +PR5864 adaptation of a separate Fraction module remains exactly the same +numerical operation/bookkeeping route as before this round. + +This means no **new integer C arithmetic** is shared with the Fraction +reference path. The two paths still share CPython's arbitrary-size integer +substrate and some original semantic helpers, as the predecessor already did. +They are distinct representations and computation paths, not independent +big-integer implementations, a proof of arbitrary C memory safety, or a +machine-checked correctness theorem. The retained source pins and output +agreement must not be described more strongly. + +The literal `reference` used by the original finite differential is loaded +separately from the original calculation's observed Fraction module. The +new wrapper patches neither that literal reference nor its finite algorithms. +The actual PR5864 Fraction cache counters, output digest and one-use +Observation remain independently checked in the complete qualifier. + +The binder receipt fields `source_only_handoff=True` and +`whole_replay_qualified=False` are historical construction metadata emitted by +`derive()`. They describe what that binder itself establishes; the surrounding +run later produces the actual qualifier receipt. Preserve the measured record, +but explain this distinction so readers do not interpret those fields either +as a later execution failure or as evidence that the binder alone qualified a +whole replay. Likewise, retained source docstrings saying all arithmetic is +unchanged are predecessor text, not the new candidate's scope statement. + +## C and API limitations + +The implementation keeps coefficients, scales, products and scores as exact +arbitrary-size PyLong objects. `PyLong_AsSsize_t` is confined to Python sequence +indices; it does not narrow numeric coefficients. Exact division tests the +remainder before accepting the quotient. The signed dyadic formatter uses +positive common power-of-two reduction, preserves zero and signs, and keeps +coefficient `/1` formatting distinct from Fraction-style score strings. +The parent finite/full receipts supply observed checks for this implementation; +this static inspection found no arithmetic or canonical-byte mismatch in the +supported path. + +Fresh output dictionaries and score tuples avoid ordinary input alias mutation +and preserve inputs after failed row operations. The internal `add_row` helper +now returns a fresh dictionary instead of mutating its destination and returning +None; the binder changes both internal call sites accordingly. The supported +compatibility statement is the selected Engine/qualification workload, not a +drop-in replacement for arbitrary downstream code importing that old helper. +The new C API deliberately rejects bool/subclasses/foreign containers; it is a +new guarded interface, not semantic equivalence for every Python object the +old unguarded helper might accidentally accept. + +The code assumes stable inputs/runtime during each native operation, matching +the scoped predecessor assumption. It retains borrowed dictionary items across +allocations and `PyDict_Next` loops. It does not establish safety against +arbitrary signal handlers, finalizers, reentrant callbacks or concurrent code +mutating supplied dictionaries during such a call. Ordinary alias fixtures do +not prove hostile asynchronous-mutation safety. In the complete Engine path, +those rows/scores are internal and no foreign callbacks are intentionally +invoked. Do not advertise this feasibility module as a generally reentrant or +free-threaded library. No claim of abi3, subinterpreter or other Python-version +support follows from Linux CPython 3.12 checks. + +These limits do not reverse the scoped negative engineering result. They are +reasons to retain the prototype label and precise supported domain rather than +promote it as a generally qualified native library. + +## Bounded broader batching assessment + +A fundamentally broader design is conceivable while leaving PR5864 Fraction +numerical arithmetic untouched: a per-invocation native owner for validated +integer state. It would snapshot/validate the input operation and weight plan +once, own all mutable rows and score triples, and traverse a whole forward or +reverse integer program without returning a fresh row and revalidating it after +each event. Inside that ownership boundary it could mutate its own dicts, +retain constant scale metadata, and append canonical bytes directly, exposing +only the same completed outputs and required witness snapshots. + +That is materially different from replacing another small Python arithmetic +call. It targets concrete bills in this candidate: repeated `int_row` scans, +`PyDict_Copy` per sparse update, temporary score tuples followed by Python list +conversion, per-event crossing/packet handling, and repeated scale validation. +It would retain arbitrary-size integer operations, exact dyadic rejection, +full event ordering, complete bytes and all observations. The unchanged +Fraction run would still execute afresh; no candidate result could stand in +for it. Any input plan reuse would need an explicit per-invocation ownership +contract and could not become cross-trace answers or cached PASS receipts. + +However, the present data does **not** show that those removable bills contain +the several additional seconds necessary to move from the descriptive current +result to a further 15% complete reduction with its larger validation/build bill. +The source profile is instrumented and nested. The measured candidate is already +native inside the large sparse loops. Row validation/copying might be the +remaining bottleneck, or might account for far less than the shortfall; this +review cannot distinguish those possibilities. Moving the outer loop also +expands the proof/qualification surface for peak cuts, ordering, clearing, +source isolation, exception behavior and witness snapshots. + +Therefore the architecture is a deferred hypothesis, not a presently funded +construction or an impossibility result. Current evidence supports stopping +this round and publishing its bounded negative result. If a future separately +authorized round is considered, its first gate should be a fixed diagnostic +attribution of the unchanged candidate's integer-state and crossing/copy costs, +with all outputs still computed and compared. Only evidence that a sufficiently +large removable bill exists after the complete new control/build/ownership +cost should authorize a private-state prototype. Freeze that gate and one +bounded discriminating fixture before implementation; do not reuse this +round's failed six timings as a new performance admission. + +No such diagnostic, implementation, test or new route was performed here. diff --git a/research/c-verification-feasibility/evidence/astra-integer-format.md b/research/c-verification-feasibility/evidence/astra-integer-format.md new file mode 100644 index 0000000000..0bd7cd3146 --- /dev/null +++ b/research/c-verification-feasibility/evidence/astra-integer-format.md @@ -0,0 +1,220 @@ +# Integer replay and canonical formatting: source-only feasibility handoff + +Status: **SOURCE_ONLY_READY_FOR_PARENT_SERIAL_FEASIBILITY; no compilation, +execution, qualification, timing, complete speedup, or kappa claim.** + +This worker owns only `integer-format/` and this report. It read the project +AGENTS instructions, current working plan, opportunity record, saved complete +profile, literal integer/reference source and frozen PR5864 boundary code. +It did not modify any synced source, frozen package, Fraction oracle, feed, +automation, mathematical research, Git state, or browser state. One initial +static read used the wrong filename `source/precision.py`; the actual source +is `source/reference_precision.py`. That failed read caused no execution. + +## Source pins and scope + +- Frozen complete PR5864: head `3f15c943e4ad6479f03e674c80fff1269a16ccfe`. +- Literal integer source: + `outputs/c-native-opportunities-20261027/source/integer.py`; + SHA256 `82a73e4bcf1835bfdd510c7ad5538625c1b380c559b671e6a67be490615a743a`. +- New C source: + `integer-format/integer_format.c`; + SHA256 `804cc25bd9ad0912de81fe97bc65b95ebcb0dec06453739e1d4863e7946c4f3d`. +- `finite_probe.py` SHA256 + `1b804c882833e2628d843bade00dfcbb282e0f53f6712e2d978af9b5c1ce8378`. +- `native_loader.py` SHA256 + `2592bef50e5338ad562d9a69bca1183ef0d88a4d34bdc497af4452304dca25c3`. +- `integer_binding.py` SHA256 + `dd3e4387dfb8882a524d938d866ed7ae04cd5ac938bbbcbec4eefd15f4bdcc9d`. +- `micro_probe.py` SHA256 + `f1d39f830987fcabe8ca5453ddbb1eca1df10a9670a95db510efbe5f21dd76aa`. + +This is a derivative of Ali Romman's integer replay, with substantial OpenAI +Codex assistance, under Apache-2.0. The new feasibility source credits Chris R / +Clear1nsight and OpenAI Codex assistance. Preserve the full predecessor NOTICE, +including PR5848/5839/5816/5818/5832/5761 lineage and existing native cache +attribution. It is not a novel arithmetic algorithm or an independent human +review. No code was copied from CPython's integer implementation. + +## Headroom and bounded decision + +The profile is an instrumented complete PR5864 replay. Its recorded 91.703902 +seconds inside the profiling scope is diagnostic, not the unprofiled complete +32.771297-second published median. The following are individual observations; +these cumulative figures must not be summed with their nested helpers: + +| Function | Calls | Self seconds | Cumulative seconds | +| --- | ---: | ---: | ---: | +| integer `error_trace` | 121 | 3.576433853 | 8.431311677 | +| integer `reverse_all` | 121 | 0.483597588 | 3.187265222 | +| integer `ideal` | 4 | 0.400506658 | 2.622130628 | +| integer `multiply` | 3,357,683 | 1.185891057 | 1.419735399 | +| integer `add_row` | 56,819 | 0.390191792 | 0.833139426 | +| integer `update_hash` | 775,218 | 1.092006952 | 2.669192520 | + +There is enough repeated Python traversal and formatting to justify one bounded +finite/micro feasibility test. There is **not** presently a defensible claim that +this route alone can save the approximately five complete seconds needed for a +further 15% improvement over PR5864. Cumulative regions retain setup, Fraction +boundary construction, sorting, hashing, outer Python control and output work. +The prototype also pays full exact-type validation, row copies, returned tuple +allocations, list conversions, and a second cold native build. Instrumentation +may disproportionately inflate the Python calls being removed. Do not convert +profile shares or the synthetic batch into promised whole-run savings. + +The integer/format route is a candidate for one bounded test, not an admitted +complete construction. Stop if finite correctness fails. If the fixed micro +comparison is unhelpful after its full allocation/copy costs, do not expand to a +full candidate. If it is helpful, the parent's declared complete-cost/noise rule +must decide whether one fresh full pair is justified. Preserve all attempts and +failures. No automatic retry or benchmark selection. A successful incremental +saving below 15% would remain below this round's user-requested complete target. + +The parent owns the single runner, 180 seconds per command, 1 GiB sampled +process-group RSS, 600 seconds initial feasibility and 1,500 seconds shared +round budget. This worker used none of that scientific execution slot. + +## Native API and semantics + +All coefficient arithmetic uses public Python number APIs on **exact built-in +arbitrary-size int** objects. No coefficient, numerator, denominator or score is +converted to a fixed-width C arithmetic type. `Py_ssize_t` is used only for +container length/indexing, which is already bounded by Python sequence storage. +The test source includes 8,192-bit values, exceeding both 64 and 4,096 bits. + +| API | Return | Use | +| --- | --- | --- | +| `add_row(dst, src, numerator, exponent)` | fresh dict | Ideal/reverse sparse row update | +| `error_row(dst, src, numerator, exponent, scores, weights)` | `(fresh dict, three-score tuple)` | Signed forward sparse update and score changes | +| `scale_row(row, numerator, exponent)` | fresh dict | Exact dyadic scaling | +| `coefficient_bytes(row, scale)` | bytes | Complete descending-event coefficient hash input | +| `coefficient_item_bytes(event, value, scale)` | bytes | One signed coefficient hash chunk | +| `score_bytes(event, scores, units)` | bytes | Exact three-value score stream | +| `reverse_updates(column, scores, wa, wc, event, scale)` | list of `(index, score tuple, bytes)` | Reverse contributions in source insertion order | + +The row/scoring methods return fresh objects and leave every supplied object +unchanged even when a later source entry fails exact division. This handles +`dst is src`, aliased score rows, and shared input integer objects without +mutation. No claimed optimization depends on undocumented alias exclusions. +A cost is the destination copy and validation on every call; those costs are +part of the candidate, not omitted setup. + +Exact built-in dict/list/tuple/int guards reject bool, integer subclasses, +container subclasses and other foreign objects before their user methods can +run. Only accessed weight/score rows are validated; validating the whole +25,984-entry weight table on every sparse update would create an avoidable +quadratic bill. The source/destination sparse rows are fully validated. The +public typed setup/word guards remain in literal integer.py. + +A row multiplication computes an arbitrary-size product and exact `divmod` by +`2**exponent`; any nonzero remainder raises `ValueError('exact dyadic division')`. +Negative values retain Python's exact signed arithmetic. Negative exponents are +rejected. Scale-row retains zero entries, matching the original comprehension; +sparse addition deletes zero sums, matching the original loop. No fixed-width +narrowing or silent signed overflow is present in the design. + +For a nonzero signed integer `v`, `v & -v` is the positive power-of-two factor +in `v`. The factor common to `v` and a checked positive power-of-two `scale` is +the smaller of that value and `scale`. Dividing both by this factor creates the +same normalized pair as `Fraction(v, scale)`. Zero is explicitly `0/1`. + +The two byte contracts are deliberately distinct: + +- Coefficients always encode `event:numerator/denominator;`, including `/1`. + Final row bytes include **every entry**, sorted by descending event exactly + as the original hash loop. Combining those chunks into one bytes argument + preserves the ordered digest input. +- Scores encode `event:a,b,c;` using Fraction string conventions, omitting `/1` + for integers. Negative signs, zero and separators are unchanged. + +All decimal conversion goes through Python integer string conversion; its +configured decimal-digit guard is neither disabled nor bypassed. The reverse +batch returns signed coefficient bytes in column dict insertion order. The +outer reverse event loop remains unchanged, preserving per-hash event order. +No digest, peak, score, witness, or PASS result is cached between invocations. + +## Fresh candidate binder and independence + +`integer_binding.derive(path, native, expected_integer_sha256)` authenticates +one original integer source, checks exact replacement counts, and constructs a +fresh candidate module in memory. It changes only sparse row/scale loops, +forward row+score loop, integer score/coefficient serialization, and the reverse +contribution loop. It preserves the original public Engine signatures, all +setup/word guards, weights, peak updates, strict comparisons, final-role tie +breaking, Pareto ordering, witness construction and Fraction output objects. +It does not patch the original file, an existing module, or a Fraction oracle. +The old `multiply`, `dyadic` and `scaled` rejection contracts remain intact. + +The frozen PR5864 `full.py` receipt explicitly emits +`integer_oracle_unchanged=True`; its NOTICE also says the independent exact +integer engine is unchanged. Those claims **must not** be carried forward as +true for this candidate. The new package must say integer backend changed and +show complete comparison against the unchanged PR5864 Fraction route. The +existing Fraction route already uses native bookkeeping/cache machinery, but +its literal built-in Fraction numerical operations stay unchanged in this +integer-only arm. Its source arithmetic must not be replaced by this helper. + +Combining this integer arm with a new native rational arithmetic arm changes +both formerly cross-checking numerical paths. That requires a separately fresh +literal Fraction audit and its full paid cost; two changed C paths cannot be +called an untouched oracle. Do not silently amortize/share candidate answers, +carry over PASS receipts, or share any new arithmetic helper with the literal +oracle. A combined arm may fail headroom once that independence bill is paid. +This report supports the integer-only arm with preserved PR5864 Fraction +numerical arithmetic, not an unpriced combined admission. + +Original 120-program differential, reverse/literal equality, all actual events +and coordinates, ideal/weight/error outputs, full signed witnesses and hashes, +all adopted predecessor/native controls, custody controls and Observation +contracts still need to run in the **complete** candidate. The new small probe +is additional coverage, not a replacement or a qualification receipt reuse. + +## Ready commands and integration + +All files are under: +`/home/d3lerium/.codex/.chatgpt-projects/g-p-6ad5817fd84881918865926b6fd51453/outputs/c-verification-all-opportunities-20261027/integer-format/`. +The following are proposed commands for the parent's guarded serial runner; +this worker did not run them: + +```sh +python3 finite_probe.py --source-sha256 804cc25bd9ad0912de81fe97bc65b95ebcb0dec06453739e1d4863e7946c4f3d +python3 micro_probe.py --mode baseline +python3 micro_probe.py --mode candidate --source-sha256 804cc25bd9ad0912de81fe97bc65b95ebcb0dec06453739e1d4863e7946c4f3d +``` + +The loader pins source bytes supplied by the parent, builds a read-only snapshot +using the existing compiler with `-O2 -shared -fPIC -std=c11 -Wall -Werror`, checks +empty compiler output, checks original source remained unchanged, and loads the +fresh extension in a temporary directory. It caches only the code module within +one process. Compiler children CPU must be charged by the parent's outer runner. + +The finite source covers eight signed row/score differential cases, scale rows, +six ordered prefixes including all complete bytes, 8,192-bit values, alias +safety and ownership, reverse scores/signed bytes, distinct coefficient/score +formatting contracts, and 21 explicit rejection paths. It uses explicit raises, +so checks remain present under `python -O`. That is planned coverage; no PASS +has been observed by this worker. + +`micro_probe.py` performs one fixed 1,024-step synthetic row+score+format batch +per process. Baseline and candidate regenerate their inputs independently. +The result digest covers complete final rows, scores and the full byte stream. +The candidate additionally pays cold build/load and finite checks before the +batch timing. The inner timing describes only the synthetic batch; compare +outer guarded process costs separately. Root controls order and repetitions; +there is no script retry or best-sample selection. This synthetic batch does +not represent an actual-word distribution and supplies no complete saving. + +Suggested integration in the parent's authenticated candidate loader: + +```python +native = native_loader.load(FROZEN_C_SHA256) +integer_candidate, binding_receipt = integer_binding.derive( + authenticated_integer_path, native, FROZEN_INTEGER_SHA256) +engine = integer_candidate.Engine(unchanged_fraction_reference) +``` + +The parent must adapt only the candidate integer selection seam and rerun the +complete existing contract. Retain raw outputs, ordered comparisons, failed +attempts, source/binder/cold-build receipts, all memory/cost bills, and exact +changed-oracle declarations. The parent may reject this source-only candidate +without constructing or publishing a complete optimization. diff --git a/research/c-verification-feasibility/evidence/astra-rational-design.md b/research/c-verification-feasibility/evidence/astra-rational-design.md new file mode 100644 index 0000000000..49867db557 --- /dev/null +++ b/research/c-verification-feasibility/evidence/astra-rational-design.md @@ -0,0 +1,306 @@ +# Bulk rational arithmetic: static design and bounded prototype + +Status: source-only review and prototype, 2026-10-27. No compiler invocation, +module import of this prototype, numerical execution, timing, browser action, +or remote action was performed by this reviewer. The parent owns the sole +serial execution slot and any qualification. Kappa, Work 1/2 mathematics, +feeds and automations remain paused. Synced sources were not modified. + +The narrow row-batch mechanism is technically plausible, but **this nomination +has no credible complete-performance headroom under the required unchanged +literal Python Fraction oracle**. Restoring that oracle costs more in the +retained observation than the entire PR5864 trace this mechanism could remove, +even with zero cost for the new candidate. Finite qualification can establish a +reusable scoped prototype and negative screen; it does not authorize an actual +word audit or a complete rational benchmark in this round. + +## Evidence and source boundaries + +The read-only design inputs were the workspace AGENTS.md, current +VERIFICATION-PERFORMANCE-WORKING-PLAN.md, and +outputs/c-native-opportunities-20261027/OPPORTUNITIES.json. The implementation +was inspected in the frozen package +outputs/fraction-native-cache-20261027/SEALED/research/fraction-native-qualification, +including native_cache.c, fraction_table.py, native_backend.py, slot_binding.py, +entry_parent.py, compact_parent.py, full.py, finite.py, actual_audit.py and +PROOF.md. The literal reference was inspected at +outputs/c-native-opportunities-20261027/source/reference_precision.py. +The instrumented census was read as existing diagnostic evidence, never run. +The upstream predecessor index and old conversations were not read. + +The authoritative public PR5864 pin is +3f15c943e4ad6479f03e674c80fff1269a16ccfe. The parent reports the authenticated +public archive SHA256 as +7b142567acacac5182045bf8daa8780e916661c2cf343dbf81b13c88ead85d64 and the extracted +163-file baseline as outputs/c-verification-all-opportunities-20261027/baseline-public. +That authentication is the parent's evidence; this reviewer did not repeat it. +The local owned C fork starts from the scientifically identical frozen C file. + +The runtime binding initially supports the inspected Linux CPython 3.12 source +/usr/lib/python3.12/fractions.py, SHA256 +cf33568f7b767f66896995a7a81cc662e8be226f2e58efb61d2028f64eb5d231. This is a deliberate +narrow source pin. Another supported Python patch build needs its own inspected +binding/qualification; it must not silently broaden this pin. + +## Hotspot selected + +PR5864 native_cache.c:event_apply already batches the sparse row loop, but +executes three PyNumber_InPlaceAdd calls on Fractions for every coefficient. +Its actual trace has 2,579,750 contribution calls. Consequently those three score +lanes account for 7,739,250 Fraction addition sites in that trace. The census +records 13,144,283 Fraction._add calls over the complete profiled qualification, +which also includes other paths and finite tests. These quantities identify a +mechanism; they are not an unprofiled time estimate. + +The selected change keeps each score as an owned numerator/denominator pair of +arbitrary-width Python integers for one ADD/COPY event. It performs the same +ordered lane updates, then materializes the three exact built-in Fractions +before the unchanged outer Python code performs rounded injection, pair capture, +stream serialization, peak comparison and witness copying. The reference records +prefix observations at event boundaries, not after every coefficient. The finite +probe additionally compares every coefficient prefix to expose arithmetic errors. + +The contribution cache, callback on every miss, exact seven-field keys, complete +FIFO order/counters, original source-site indexing, row iteration and row writes +are unchanged. In particular the per-coefficient F(0) construction is retained. +This nomination does not revive the failed direct-add dispatch or constructor +elision nomination. + +## Concrete source-only interface + +Owned files are under outputs/c-verification-all-opportunities-20261027/rational/: + +- native_bulk.c: an owned fork of native_cache.c adding + event.apply_rational(dst, src, scores, authenticated_math_gcd). + The original Event.apply, Cache API, module name _fraction_native and all + inherited controls remain present. +- bulk_fragment.c.txt: the added kernel retained separately for easy review. +- arithmetic_binding.py: source/runtime qualification of bypassed Fraction + operations, fallback closures, owned descriptors, inherited in-place protocol, + attribute setters, finalizer absence and builtin gcd; freshness is checked + before each selected trace. +- bulk_backend.py: a separate derive/install wrapper. It authenticates the same + source seam and preserves the predecessor route for unsupported or changed + domains. It does not patch the literal reference or construct a complete + replacement qualification. +- finite_probe.py: source for bounded finite checks and optional fixed BCCB micro + diagnostic. It does not execute the actual word. + +The parent may stage native_bulk.c as native_cache.c in its owned baseline copy, +update the staged NATIVE-SOURCE.json hash, and invoke finite_probe.py with the +staged package path. native_backend.load supplies the existing cold compilation, +source authentication and load receipt. The probe accepts an optional --micro; +its samples are illustrative kernel observations only. They exclude cold build +from the inner micro interval, so the outer receipt remains necessary. + +No source was imported or compiled by this reviewer. These files are not claimed +to pass even their finite harness until the parent runs and records it. A first +write to the copied C file failed because its copied mode was readonly; only the +new owned copy's user-write bit was added, then the source edit completed. This +was a static file-write failure, not a numerical or compiler failure. + +## Rational representation and proof obligations + +The prototype deliberately implements **general normalized rational pairs**, not +only dyadics. entry_parent.certified_domain accepts arbitrary exact Fraction +weights, and permitted string scalars can contain odd denominators. For example, +1/3 and -5/7 are valid error_trace scalars. The ideal verifier's separate dyadic +constraint does not justify narrowing the public error-trace API or its controls. + +For normalized a=n/d and b=m/e, the kernel computes g=gcd(d,e). If g=1, the +result is (n*e+d*m)/(d*e). Otherwise it computes s=d/g, t=n*(e/g)+m*s, +g2=gcd(t,g), and returns (t/g2)/(s*(e/g2)). An equal-denominator branch computes +(n+m)/d and reduces by gcd(n+m,d). Denominators stay positive and zero reduces +to 0/1. All products, sums, divisions and comparisons use Python integer C API +operations on exact PyLong values; C machine words hold only checked indices +and inherited counters. No int64 approximation, private PyLong digit access, +floating point, machine-word rational denominator or silently truncated exponent +is introduced. Arithmetic order remains coefficient order, with score lanes +0, 1, 2 updated in that order. + +Only the score accumulators use pairs; all cache values and sparse coefficients +remain exact Fraction objects. At each event boundary the kernel allocates an +exact Fraction object and writes its normalized integer slots through the +already authenticated owned member descriptors. This is a new construction +obligation, not justified merely by equal numeric values. Output tree types, +positive canonical denominators, zero representation and signed serialization +must all be checked. Live changes to the original arithmetic or factory select +the predecessor rather than silently bypassing the changed operation. + +A future dyadic specialization could retain (n,k) for n/2^k and align integer +numerators, reducing only at event boundaries. Because denominators are powers +of two, the event denominator can remain the largest encountered power, rather +than a product. This could avoid much gcd work. It requires an explicit proven +dyadic eligibility condition, arbitrary-width numerator handling, bounded +exponent conversion, a general fallback, and exact materialization at every +observed prefix. It is deferred here: it does not remove the oracle-restoration +bill, and no second mechanism or favorable micro sample justifies construction. + +## Literal oracle independence and complete-cost stop + +Retaining exact Fraction output types is not retaining an independent literal +Fraction oracle. The new kernel replaces the additions that PR5864 deliberately +left to Python Fraction. Its output cannot validate itself through another call +to the same new C arithmetic. The independent integer engine is useful additional +cross-checking, but does not meet an explicit requirement for an untouched +literal Python Fraction oracle by itself. + +The admissible strict design for this nomination therefore has three separately +executed paths: untouched literal Fraction, unchanged integer, and new rational +candidate. Mutable inputs, caches, answers and PASS receipts cannot be shared +between those paths. Restoring the literal Fraction error trace is a new full +control cost and belongs in every claimed complete candidate command. An offline +comparison, prior digest, cached expected result or a benchmark B sample cannot +be relabeled as a free live oracle in C. + +The frozen retained observation is: +outputs/fraction-native-cache-20261027/SEALED/research/fraction-native-qualification/ +evidence/runtime/runs/actual-native-apply/stdout.txt. +Its original raw outer receipt is beside it as receipt.json and usage.json. +The producing source is actual_audit.py. It reports 25,984 events, 799 coordinates, +identical complete output digest +954c7448ff74d78753828e9623ad44c46da9e5ce459420b6e50a5d47294250b9, +and these historical, same-audit component observations: + +| Component | Wall seconds | CPU seconds | +| --- | ---: | ---: | +| Untouched original Fraction error trace | 20.534678025986068 | 20.523067174 | +| PR5864 native apply, including cold build | 11.886980237992248 | 11.883082538000005 | + +Grant the rational candidate zero runtime, zero cold build, zero new checks and +zero conversion cost. The most optimistic replacement saving from these retained +components is still: + +- wall: 11.886980237992248 - 20.534678025986068 = **-8.647697787993820 s**; +- CPU: 11.883082538000005 - 20.523067174 = **-8.639984635999995 s**. + +The negative signs mean an added cost. The cold build included in the removed +component makes this screen especially generous to the new candidate. Positive +candidate runtime and required new checks only worsen this historical scenario. +The new 15% complete target requires about 4.915695 seconds wall saving from the +recorded PR5864 median 32.771297 seconds, and 4.911 seconds CPU from 32.74 seconds. +The zero-cost candidate screen is already adverse before seeking that target. + +These are source-pinned historical observations, not fresh measurements, not a +measured lower bound on all future machines, not a sum of profiler cumulative +times, and not a universal impossibility result. They are sufficient to reject +credible headroom for this exact additive restoration design in the current +bounded round. No new actual-word or complete rational run is recommended. +A different ownership/algorithm boundary would require its own explicit contract +and cost screen; calling an optimized path "literal" would not create headroom. + +## Complete added validation bill + +Any later proposal that changes the design enough to reopen the gate must pay +all of the following; none is a deferred free service: + +1. Preserve all 118 adopted native/predecessor controls, four custody controls, + 27 observation controls, the original 120-program differential, six semantic + rejections, three integer rejections, source guards and every original output. +2. Add native rational arithmetic checks covering odd denominators, equal and + coprime denominator branches, negative values, complete cancellation, zero, + large numerators/denominators, repeated hits, FIFO wrap and every counter. +3. Check exact built-in output types and canonical slots at each coefficient + prefix in bounded fixtures and every event prefix; compare full signed + witnesses, tie-breaking, Pareto order, scores, hashes and inputs unchanged. +4. Add arithmetic-source, code-object, closure, defaults, builtin/global, + getter/descriptor and inherited-protocol drift controls, with a pure fallback + decision. Noncanonical manually mutated Fraction slots must not enter the + normalized-pair assumptions. General non-dyadic canonical Fractions must work. +5. Preserve low-level memory safety: strong references, partial initialization, + allocation/error cleanup, original dict iterator mutation errors, score-list + mutation detection, safe callback/reentry handling and no repair of mutated + caller data. Retain all legacy generic callback controls on Event.apply. +6. Independently execute the literal Fraction oracle in the complete command, + compare all 25,984 events/799 coordinates and full output materialization, + retain the unchanged integer path, and charge this new oracle cost. +7. Charge source/runtime binding, input qualification, conversions, per-event + materialization, native bookkeeping, cold compile/link/load, compiler-child + CPU and peak process-group RSS. Only immutable loaded code may be reused + inside a process; never reuse mutable answers or receipts across backends. +8. Complete normal/-O, readonly Git-free replay, source bytes/modes, committed + inventory, metadata/source pins, final-head CI and publication/handoff checks + if and only if a complete positive screen actually reopens construction. + +The finite probe deliberately addresses a bounded subset: 165 coefficient +prefix comparisons (five scalar choices, 33 prefixes each), 13 complete event +prefix comparisons, source/fallback controls, generic non-dyadic arithmetic, +mutation checks and a fixed optional BCCB micro. It does not assert that this is +the complete added validation union or discharge item 6. + +## Static safety limits and next decision + +Event.apply_rational is a source-qualified packet interface. Arbitrary callbacks +can observe intermediate score-list values under the old Event.apply API; +batching intentionally delays those values until the event boundary. The new +method therefore does not claim arbitrary callback observational equivalence. +The wrapper admits only the authenticated pure callback, and the legacy method +retains its original public callback behavior and tests. New direct hostile +callback probes test safe rejection/cleanup, not a broader semantic theorem. + +Scores and source entries are held strongly across callback activity. Score-list +size and identities are checked after the callback and before publishing. Source +iteration retains the original Python items iterator. A failure attempts to +publish completed exact score updates only when the caller list still has its +original identity contents; it never resizes or repairs a mutated list. Allocation +failure during this recovery is not claimed to preserve the exact allocator-level +partial state of the original sequence; the original exception is retained. +Successful stable-input execution is the arithmetic equivalence domain. Full OOM +fault-injection/lifetime review remains an added construction obligation if the +scope reopens. + +The initial binder is deliberately source-pinned and conservative; a rejection +is a fallback, not an excuse to relax it. Live runtime/input mutation during a +trace remains excluded by the inherited stable-input/runtime premise, while +explicit low-level mutation checks continue to protect memory safety. This is +ordinary CPython 3.12 with the GIL, not abi3, free-threaded or subinterpreter support. + +The parent's chosen next step is finite qualification plus the fixed micro only, +if useful as a scoped negative artifact. Every failure and correction must remain. +No actual-word audit or full rational qualification follows merely because the +micro improves. The result to publish, if finite qualification succeeds, is a +reusable exact batching prototype and an explicit oracle-cost engineering stop, +with no new complete speedup or global-optimality claim. + +## Parent-run bounded v1 receipt + +After this source-only implementation, the parent executed its frozen +stages/rational-v1/run_finite.py in the serial guard. I inspected the retained +stdout and receipt at outputs/c-verification-all-opportunities-20261027/runtime/ +runs/rational-finite-micro-v1/. They record exit 0, no stderr, unchanged staged +source bytes/modes, 178 comparisons and 19 added named controls. Outer wall was +1.3062437750049867 seconds; recorded user+system CPU was 1.24 seconds; sampled +process-group RSS was 79,007,744 bytes. The extended C source SHA256 is +4a4949e36cff4ff2894dd1f9379b58a58346ec7c888903271d4b98bbe4cfc7ae. + +The single fixed BCCB micro retained all four samples: + +| Sample | Wall seconds | CPU seconds | +| --- | ---: | ---: | +| B1 | 0.06855765299405903 | 0.06854380399999993 | +| C1 | 0.06020033897948451 | 0.060203247000000015 | +| C2 | 0.04673448100220412 | 0.046702148000000054 | +| B2 | 0.07398301700595766 | 0.073957787 | + +Each sample has 16,384 contribution calls, 16,352 hits and 32 misses, with no +FIFO eviction. This deliberately small repeated fixture is not an actual-word +cost model. It excludes cold compilation from its inner interval and does not +include a complete restored literal oracle. The smaller first-pair gross micro +improvement cannot overcome the separately identified oracle cost. No actual +word or complete rational replay was performed. + +The reviewer subsequently made conservative binding-only source edits for an +exact expected Fraction MRO, finalizer absence/freshness, and predecessor factory +identity. Those final Python bytes must be matched to the parent's frozen stage +before extending the v1 pass to them. The current owned sources are: + +- arithmetic_binding.py SHA256 + 2115d639fac0262352a3091cc1fcce2c9aefd892992b92e5740ffd173330fdbd; +- bulk_backend.py SHA256 + 9b440bd3d921bb06ff5035cb8ae85053f3e0b6880b6ec37d364b55da012449ca; +- finite_probe.py SHA256 + 362bcd2bc967ed223ed303835048d1c51697f0293cfc83cffd4a9e02e2efcccd. + +The C source is unchanged from the passed v1 receipt. A final finite-only replay +of changed Python binding bytes is appropriate; another micro sequence is not +needed to preserve the negative engineering decision. diff --git a/research/c-verification-feasibility/evidence/drafts/arithmetic_binding-v1.py.txt b/research/c-verification-feasibility/evidence/drafts/arithmetic_binding-v1.py.txt new file mode 100644 index 0000000000..1c857e029c --- /dev/null +++ b/research/c-verification-feasibility/evidence/drafts/arithmetic_binding-v1.py.txt @@ -0,0 +1,114 @@ +"""Source-only prototype: authenticate operations bypassed by score batching. + +A compiled source tree is inspected as data; the independent Fraction oracle +is never patched. The first supported runtime is the pinned host CPython3.12. +""" +import builtins +from fractions import Fraction as F +import fractions +from hashlib import sha256 +import math +import operator +from pathlib import Path +import sys +from types import CodeType, FunctionType, BuiltinFunctionType +import slot_binding + +SOURCE_SHA256='cf33568f7b767f66896995a7a81cc662e8be226f2e58efb61d2028f64eb5d231' +DIRECT=('_add','_sub','_mul','__abs__','__bool__','__new__') +WRAPPED=(('__add__','_add','add','forward'),('__radd__','_add','add','reverse'), + ('__sub__','_sub','sub','forward'),('__rsub__','_sub','sub','reverse'), + ('__mul__','_mul','mul','forward'),('__rmul__','_mul','mul','reverse')) +BUILTINS=('isinstance','type','int','float','complex','super','abs') +_expected=None + +def _shape(code): + return (code.co_code,tuple(_shape(x) if type(x) is CodeType else x for x in code.co_consts), + code.co_names,code.co_varnames,code.co_freevars,code.co_cellvars, + code.co_argcount,code.co_posonlyargcount,code.co_kwonlyargcount, + code.co_flags,code.co_exceptiontable) + +def _codes(): + global _expected + if _expected is not None:return _expected + path=Path(fractions.__file__) + raw=path.read_bytes() + if path.is_symlink() or sha256(raw).hexdigest()!=SOURCE_SHA256:raise ValueError('pinned Fraction source') + compiled=compile(raw,str(path),'exec',optimize=sys.flags.optimize) + result={} + def visit(code): + result[code.co_qualname]=code + for value in code.co_consts: + if type(value) is CodeType:visit(value) + visit(compiled) + _expected=result + return result + +def _function(fn,qualname): + if type(fn) is not FunctionType or fn.__kwdefaults__ is not None: + raise ValueError('ordinary arithmetic function') + defaults=fn.__defaults__ + if qualname=='Fraction.__new__': + if type(defaults) is not tuple or len(defaults)!=2 or type(defaults[0]) is not int or defaults[0]!=0 or defaults[1] is not None:raise ValueError('arithmetic defaults') + elif defaults is not None:raise ValueError('arithmetic defaults') + if _shape(fn.__code__)!=_shape(_codes()[qualname]):raise ValueError('arithmetic executable shape') + if fn.__globals__ is not fractions.__dict__:raise ValueError('arithmetic globals owner') + if type(fn.__builtins__) is not dict:raise ValueError('arithmetic builtins mapping') + for name in BUILTINS: + if fn.__builtins__.get(name) is not getattr(builtins,name):raise ValueError('arithmetic builtins identity') + return fn + +def _snapshot(): + ns=type.__getattribute__(F,'__dict__') + out=[F,fractions.Fraction,math.gcd,operator.add,operator.sub,operator.mul] + for name in DIRECT+('_from_coprime_ints',)+tuple(x[0] for x in WRAPPED): + raw=ns.get(name);fn=raw.__func__ if type(raw) in (classmethod,staticmethod) else raw + out.append(raw) + if type(fn) is FunctionType: + out.extend((fn,fn.__code__,fn.__defaults__,fn.__kwdefaults__,fn.__closure__)) + if fn.__closure__: + for cell in fn.__closure__:out.extend((cell,cell.cell_contents)) + out.extend(fn.__globals__.get(x) for x in ('Fraction','math','numbers','operator')) + out.extend(fn.__builtins__.get(x) for x in BUILTINS) + for cls in F.__mro__: + ns=type.__getattribute__(cls,'__dict__') + out.extend((cls,ns.get('__iadd__'),ns.get('__setattr__'),ns.get('__delattr__'))) + return tuple(out) + +def bind(): + try: + if sys.implementation.name!='cpython' or sys.version_info[:2]!=(3,12):return None + slots=slot_binding.bind(strict=True) + ns=type.__getattribute__(F,'__dict__') + owned_slots=ns.get('__slots__') + if fractions.Fraction is not F or type(owned_slots) is not tuple or len(owned_slots)!=2 or any(type(x) is not str for x in owned_slots) or owned_slots!=('_numerator','_denominator'):return None + if fractions.__dict__.get('math') is not math or fractions.__dict__.get('operator') is not operator:return None + if type(math.gcd) is not BuiltinFunctionType or math.gcd.__name__!='gcd' or math.gcd.__self__ is not math:return None + for name in ('add','sub','mul'): + fn=getattr(operator,name) + if type(fn) is not BuiltinFunctionType or fn.__name__!=name or fn.__module__!='_operator':return None + for name in DIRECT: + raw=ns.get(name) + fn=_function(raw.__func__ if type(raw) is staticmethod else raw,'Fraction.'+name) + if fn.__closure__ is not None and not (fn.__code__.co_freevars==('__class__',) and len(fn.__closure__)==1 and fn.__closure__[0].cell_contents is F):return None + factory=ns.get('_from_coprime_ints') + if type(factory) is not classmethod:return None + fn=_function(factory.__func__,'Fraction._from_coprime_ints') + if fn.__closure__ is not None and not (fn.__code__.co_freevars==('__class__',) and len(fn.__closure__)==1 and fn.__closure__[0].cell_contents is F):return None + for name,mono,op,direction in WRAPPED: + fn=_function(ns.get(name),'Fraction._operator_fallbacks..'+direction) + closure=dict(zip(fn.__code__.co_freevars,(c.cell_contents for c in fn.__closure__ or ()))) + if len(closure)!=2 or closure.get('fallback_operator') is not getattr(operator,op) or closure.get('monomorphic_operator') is not ns[mono]:return None + for cls in F.__mro__: + raw=type.__getattribute__(cls,'__dict__') + if '__iadd__' in raw:return None + if '__setattr__' in raw and raw['__setattr__'] is not object.__dict__['__setattr__']:return None + if '__delattr__' in raw and raw['__delattr__'] is not object.__dict__['__delattr__']:return None + return slots,_snapshot(),math.gcd + except (AttributeError,KeyError,TypeError,ValueError,OSError):return None + +def fresh(token): + if token is None or not slot_binding.fresh(token[0]):return False + try:now=_snapshot() + except (AttributeError,ValueError,TypeError):return False + return len(now)==len(token[1]) and all(x is y for x,y in zip(now,token[1])) diff --git a/research/c-verification-feasibility/evidence/drafts/bulk_fragment.c.txt b/research/c-verification-feasibility/evidence/drafts/bulk_fragment.c.txt new file mode 100644 index 0000000000..fe169ef62e --- /dev/null +++ b/research/c-verification-feasibility/evidence/drafts/bulk_fragment.c.txt @@ -0,0 +1,160 @@ +/* Owned extension: normalized, arbitrary-width score accumulators. + * Preconditions are established by arithmetic_binding.py and the wrapper. + * The legacy apply() method and its generic callback semantics are unchanged. + */ +typedef struct { PyObject *n, *d; } Rational; +static void rational_clear(Rational *x) { Py_CLEAR(x->n); Py_CLEAR(x->d); } +static int rational_read(Cache *s, PyObject *f, Rational *x, PyObject *zero) { + if(!Py_IS_TYPE(f,(PyTypeObject *)s->fraction)) { + PyErr_SetString(PyExc_TypeError,"exact Fraction score/increment");return -1; + } + x->n=member(s->num,f,s->fraction); + if(!x->n)return -1; + x->d=member(s->den,f,s->fraction); + if(!x->d)return -1; + if(!PyLong_CheckExact(x->n)||!PyLong_CheckExact(x->d)) { + PyErr_SetString(PyExc_TypeError,"exact integer rational slots");return -1; + } + int positive=PyObject_RichCompareBool(x->d,zero,Py_GT); + if(positive<0)return -1; + if(!positive){PyErr_SetString(PyExc_ValueError,"positive rational denominator");return -1;} + return 0; +} +static PyObject *rational_gcd(PyObject *gcd,PyObject *a,PyObject *b,PyObject *zero) { + PyObject *g=PyObject_CallFunctionObjArgs(gcd,a,b,NULL); + if(!g)return NULL; + if(!PyLong_CheckExact(g)){Py_DECREF(g);PyErr_SetString(PyExc_TypeError,"exact gcd result");return NULL;} + int positive=PyObject_RichCompareBool(g,zero,Py_GT); + if(positive<=0){Py_DECREF(g);if(!PyErr_Occurred())PyErr_SetString(PyExc_ValueError,"positive gcd result");return NULL;} + return g; +} +static int rational_add(Rational *a,const Rational *b,PyObject *gcd,PyObject *zero,PyObject *one) { + PyObject *g=NULL,*s=NULL,*u=NULL,*v=NULL,*t=NULL,*g2=NULL,*nn=NULL,*dd=NULL; + int equal=PyObject_RichCompareBool(a->d,b->d,Py_EQ); + if(equal<0)goto fail; + if(equal){ + t=PyNumber_Add(a->n,b->n);if(!t)goto fail; + g2=rational_gcd(gcd,t,a->d,zero);if(!g2)goto fail; + int unit=PyObject_RichCompareBool(g2,one,Py_EQ);if(unit<0)goto fail; + if(unit){nn=Py_NewRef(t);dd=Py_NewRef(a->d);} + else{nn=PyNumber_FloorDivide(t,g2);if(!nn)goto fail;dd=PyNumber_FloorDivide(a->d,g2);if(!dd)goto fail;} + }else{ + g=rational_gcd(gcd,a->d,b->d,zero);if(!g)goto fail; + int unit=PyObject_RichCompareBool(g,one,Py_EQ);if(unit<0)goto fail; + if(unit){ + u=PyNumber_Multiply(a->n,b->d);if(!u)goto fail; + v=PyNumber_Multiply(a->d,b->n);if(!v)goto fail; + nn=PyNumber_Add(u,v);if(!nn)goto fail; + dd=PyNumber_Multiply(a->d,b->d);if(!dd)goto fail; + }else{ + s=PyNumber_FloorDivide(a->d,g);if(!s)goto fail; + u=PyNumber_FloorDivide(b->d,g);if(!u)goto fail; + v=PyNumber_Multiply(a->n,u);if(!v)goto fail; + Py_CLEAR(u);u=PyNumber_Multiply(b->n,s);if(!u)goto fail; + t=PyNumber_Add(v,u);if(!t)goto fail; + g2=rational_gcd(gcd,t,g,zero);if(!g2)goto fail; + unit=PyObject_RichCompareBool(g2,one,Py_EQ);if(unit<0)goto fail; + if(unit){nn=Py_NewRef(t);dd=PyNumber_Multiply(s,b->d);if(!dd)goto fail;} + else{ + nn=PyNumber_FloorDivide(t,g2);if(!nn)goto fail; + Py_CLEAR(u);u=PyNumber_FloorDivide(b->d,g2);if(!u)goto fail; + dd=PyNumber_Multiply(s,u);if(!dd)goto fail; + } + } + } + Py_SETREF(a->n,nn);nn=NULL;Py_SETREF(a->d,dd);dd=NULL; + Py_XDECREF(g);Py_XDECREF(s);Py_XDECREF(u);Py_XDECREF(v);Py_XDECREF(t);Py_XDECREF(g2); + return 0; +fail: + Py_XDECREF(g);Py_XDECREF(s);Py_XDECREF(u);Py_XDECREF(v);Py_XDECREF(t);Py_XDECREF(g2);Py_XDECREF(nn);Py_XDECREF(dd); + return -1; +} +static PyObject *rational_fraction(Cache *s,const Rational *x) { + /* The wrapper binds exact owned slot descriptors and object allocation. + No PyLong internals, machine-word truncation or foreign Fraction type. */ + if(!Py_TYPE(s->num)->tp_descr_set||!Py_TYPE(s->den)->tp_descr_set){ + PyErr_SetString(PyExc_TypeError,"writable owned Fraction slots");return NULL; + } + PyObject *f=PyType_GenericAlloc((PyTypeObject *)s->fraction,0); + if(!f)return NULL; + if(Py_TYPE(s->num)->tp_descr_set(s->num,f,x->n)<0||Py_TYPE(s->den)->tp_descr_set(s->den,f,x->d)<0){Py_DECREF(f);return NULL;} + return f; +} +static int rational_scores_unchanged(PyObject *scores,PyObject **initial) { + if(PyList_GET_SIZE(scores)!=3){PyErr_SetString(PyExc_IndexError,"score list changed during rational apply");return -1;} + for(int k=0;k<3;k++)if(PyList_GET_ITEM(scores,k)!=initial[k]){ + PyErr_SetString(PyExc_RuntimeError,"score value changed during rational apply");return -1; + } + return 0; +} +static int rational_publish(Cache *s,PyObject *scores,PyObject **initial,Rational *acc) { + PyObject *out[3]={NULL,NULL,NULL}; + if(rational_scores_unchanged(scores,initial)<0)return -1; + for(int k=0;k<3;k++){out[k]=rational_fraction(s,&acc[k]);if(!out[k])goto fail;} + if(rational_scores_unchanged(scores,initial)<0)goto fail; + for(int k=0;k<3;k++){if(PyList_SetItem(scores,k,out[k])<0){out[k]=NULL;goto fail;}out[k]=NULL;} + return 0; +fail:for(int k=0;k<3;k++)Py_XDECREF(out[k]);return -1; +} +static PyObject *event_apply_rational(Event *e,PyObject *args) { + PyObject *dst,*src,*scores,*gcd; + if(!PyArg_UnpackTuple(args,"apply_rational",4,4,&dst,&src,&scores,&gcd))return NULL; + if(!PyDict_CheckExact(dst)||!PyDict_CheckExact(src)||dst==src||!PyList_CheckExact(scores)||PyList_GET_SIZE(scores)!=3||!PyCFunction_Check(gcd)){ + PyErr_SetString(PyExc_TypeError,"distinct exact rows, three scores, builtin gcd");return NULL; + } + if(begin_event(e)<0)return NULL; + Cache *s=e->cache; + Rational acc[3]={{NULL,NULL},{NULL,NULL},{NULL,NULL}}; + Rational inc={NULL,NULL}; + PyObject *initial[3]={NULL,NULL,NULL},*pair=NULL,*result=NULL,*iterator=NULL; + PyObject *zero=PyLong_FromLong(0),*one=PyLong_FromLong(1); + int accumulated=0,ready=0; + if(!zero||!one)goto fail; + for(int k=0;k<3;k++){ + initial[k]=Py_NewRef(PyList_GET_ITEM(scores,k)); + if(rational_read(s,initial[k],&acc[k],zero)<0)goto fail; + } + ready=1; + PyObject *view=PyObject_CallMethod(src,"items",NULL); + iterator=view?PyObject_GetIter(view):NULL;Py_XDECREF(view); + if(!iterator)goto fail; + while((pair=PyIter_Next(iterator))){ + if(!PyTuple_CheckExact(pair)||PyTuple_GET_SIZE(pair)!=2){PyErr_SetString(PyExc_TypeError,"dict item pair");goto fail;} + PyObject *index=PyTuple_GET_ITEM(pair,0),*value=PyTuple_GET_ITEM(pair,1); + if(!PyLong_CheckExact(index)){PyErr_SetString(PyExc_TypeError,"integer source site");goto fail;} + Py_ssize_t i=PyLong_AsSsize_t(index);if(PyErr_Occurred())goto fail; + /* Retain the literal per-coefficient Fraction(0) construction. */ + PyObject *z=PyObject_CallOneArg(s->fraction,zero);if(!z)goto fail; + PyObject *old=PyDict_GetItemWithError(dst,index); + if(old){Py_INCREF(old);Py_DECREF(z);}else if(PyErr_Occurred()){Py_DECREF(z);goto fail;}else old=z; + result=contribution(e,old,value,i);Py_DECREF(old);if(!result)goto fail; + if(rational_scores_unchanged(scores,initial)<0)goto fail; + for(int k=0;k<3;k++){ + if(rational_read(s,PyTuple_GET_ITEM(result,k+1),&inc,zero)<0)goto fail; + if(rational_add(&acc[k],&inc,gcd,zero,one)<0)goto fail; + rational_clear(&inc);accumulated=1; + } + int truth=PyObject_IsTrue(PyTuple_GET_ITEM(result,0));if(truth<0)goto fail; + if(truth){if(PyDict_SetItem(dst,index,PyTuple_GET_ITEM(result,0))<0)goto fail;} + else{ + PyObject *present=PyDict_GetItemWithError(dst,index); + if(present){if(PyDict_DelItem(dst,index)<0)goto fail;} + else if(PyErr_Occurred())goto fail; + } + Py_CLEAR(result);Py_CLEAR(pair); + } + if(PyErr_Occurred())goto fail; + if(accumulated&&rational_publish(s,scores,initial,acc)<0)goto fail; + for(int k=0;k<3;k++){rational_clear(&acc[k]);Py_DECREF(initial[k]);} + Py_DECREF(iterator);Py_DECREF(zero);Py_DECREF(one);s->busy=0;Py_RETURN_NONE; +fail:{ + PyObject *error=PyErr_GetRaisedException(); + /* Publish completed exact additions on an ordinary failure where safe. + A mutated caller list is never repaired, resized or silently ignored. */ + if(ready&&accumulated){if(rational_publish(s,scores,initial,acc)<0)PyErr_Clear();} + rational_clear(&inc); + for(int k=0;k<3;k++){rational_clear(&acc[k]);Py_XDECREF(initial[k]);} + Py_XDECREF(pair);Py_XDECREF(result);Py_XDECREF(iterator);Py_XDECREF(zero);Py_XDECREF(one);s->busy=0; + if(error)PyErr_SetRaisedException(error);else PyErr_SetString(PyExc_RuntimeError,"rational apply failed without exception"); + return NULL; +}} diff --git a/research/c-verification-feasibility/evidence/publication/fresh-all-scopes/receipt.json b/research/c-verification-feasibility/evidence/publication/fresh-all-scopes/receipt.json new file mode 100644 index 0000000000..61e5cb1e99 --- /dev/null +++ b/research/c-verification-feasibility/evidence/publication/fresh-all-scopes/receipt.json @@ -0,0 +1,26 @@ +{ + "exit": 0, + "label": "feasibility-package-all-v1", + "optimized": false, + "platform": "Linux-7.0.0-38-generic-x86_64-with-glibc2.39", + "python": "3.12.3 (main, Aug 31 2026, 10:18:26) [GCC 13.3.0]", + "runner_sha256": "7540f8cc4ae4d12ed86c844ef0837a74184d3ada653979608c295c09f200a751", + "runtime_policy_sha256": "ce6e0fe47d52d118439a6494b1f9c54958e2d472b1bb28c6d5c19598b0e3b83c", + "sampled_process_group_rss_bytes": 98725888, + "script": "stages/publication-feasibility-v1/run_all.py", + "source_bytes_and_modes_unchanged": true, + "source_inventory_sha256": "97ff3d4388d2fe4a9d8e08b1d37f47d13a913a293c697f4366be4e50a7c65324", + "status": "PASS", + "stderr_bytes": 0, + "stderr_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stdout_bytes": 18303, + "stdout_sha256": "bb806e658bfa759e41dda4bbd8ab47a9a1971b2307282f0adbf43211cc518e60", + "termination": null, + "usage": { + "exit": 0, + "kernel_max_rss_kib": 48524, + "system_seconds": 0.4, + "user_seconds": 6.14 + }, + "wall_seconds": 6.586904727999354 +} diff --git a/research/c-verification-feasibility/evidence/publication/fresh-all-scopes/stderr.txt b/research/c-verification-feasibility/evidence/publication/fresh-all-scopes/stderr.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/research/c-verification-feasibility/evidence/publication/fresh-all-scopes/stdout.txt b/research/c-verification-feasibility/evidence/publication/fresh-all-scopes/stdout.txt new file mode 100644 index 0000000000..7aecc7939f --- /dev/null +++ b/research/c-verification-feasibility/evidence/publication/fresh-all-scopes/stdout.txt @@ -0,0 +1,19 @@ +PASS_PRECISION_LINUX_SOURCE_CONTROLS {"contract": "declared contract edits", "declared_edit": "unique backend seam", "inner_archive": "source hash", "official_export_byte": "Exact PR5831 bundle"} +{"all_complete_values_and_types_equal": true, "cases": 241, "controls": ["returned-mutation-isolated", "source-drift", "Fraction-type-drift", "module-byte-drift", "live-code-drift", "nested-live-code-drift", "omitted-witness", "omitted-rounded-sites", "wrong-coefficient", "wrong-weighted-increment", "bad-role", "bad-scalar", "missing-weight", "restore-success", "restore-exception", "fresh-derivation", "key-field-0", "key-field-1", "key-field-2", "key-field-3", "key-field-4", "FIFO-eviction", "canonical-key", "hash-collision", "disabled", "invalid-capacity--1", "invalid-capacity-16385", "invalid-capacity-True", "invalid-capacity-1.5", "uncached-exception-0", "uncached-exception-1", "fresh-call-table", "stats-mutation", "failed-call-clears-stats"], "events": 10164, "status": "PASS_FINITE_FRACTION_TABLE_FEASIBILITY"} +{"all_coverage_preserved": true, "inherited": {"all_complete_values_and_types_equal": true, "cases": 241, "controls": ["returned-mutation-isolated", "source-drift", "Fraction-type-drift", "module-byte-drift", "live-code-drift", "nested-live-code-drift", "omitted-witness", "omitted-rounded-sites", "wrong-coefficient", "wrong-weighted-increment", "bad-role", "bad-scalar", "missing-weight", "restore-success", "restore-exception", "fresh-derivation", "key-field-0", "key-field-1", "key-field-2", "key-field-3", "key-field-4", "FIFO-eviction", "canonical-key", "hash-collision", "disabled", "invalid-capacity--1", "invalid-capacity-16385", "invalid-capacity-True", "invalid-capacity-1.5", "uncached-exception-0", "uncached-exception-1", "fresh-call-table", "stats-mutation", "failed-call-clears-stats"], "events": 10164, "status": "PASS_FINITE_FRACTION_TABLE_FEASIBILITY"}, "new_control_count": 20, "new_controls": ["all-241-fixtures-take-certified-domain", "subtypes-and-foreign-types-fall-back-without-custom-methods", "metaclass-container", "metaclass-scalar", "original-fallback-dict-subclass", "original-fallback-program-subclass", "original-fallback-event-subclass", "original-fallback-weights-subclass", "original-fallback-row-subclass", "original-fallback-rounded-subclass", "original-fallback-Fraction-subclass", "original-fallback-integer-weights", "original-fallback-boolean-public", "exact-internal-type-preservation-at-certified-updates", "malformed-outcome-missing-weight", "malformed-outcome-bad-role", "malformed-outcome-bad-scalar", "malformed-outcome-short-event", "recertification-invalidates-certified-method", "disabled-capacity-not-certified"], "status": "PASS_TYPE_GATE_FINITE_FEASIBILITY"} +{"all_coverage_preserved": true, "inherited": {"all_coverage_preserved": true, "inherited": {"all_complete_values_and_types_equal": true, "cases": 241, "controls": ["returned-mutation-isolated", "source-drift", "Fraction-type-drift", "module-byte-drift", "live-code-drift", "nested-live-code-drift", "omitted-witness", "omitted-rounded-sites", "wrong-coefficient", "wrong-weighted-increment", "bad-role", "bad-scalar", "missing-weight", "restore-success", "restore-exception", "fresh-derivation", "key-field-0", "key-field-1", "key-field-2", "key-field-3", "key-field-4", "FIFO-eviction", "canonical-key", "hash-collision", "disabled", "invalid-capacity--1", "invalid-capacity-16385", "invalid-capacity-True", "invalid-capacity-1.5", "uncached-exception-0", "uncached-exception-1", "fresh-call-table", "stats-mutation", "failed-call-clears-stats"], "events": 10164, "status": "PASS_FINITE_FRACTION_TABLE_FEASIBILITY"}, "new_control_count": 20, "new_controls": ["all-241-fixtures-take-certified-domain", "subtypes-and-foreign-types-fall-back-without-custom-methods", "metaclass-container", "metaclass-scalar", "original-fallback-dict-subclass", "original-fallback-program-subclass", "original-fallback-event-subclass", "original-fallback-weights-subclass", "original-fallback-row-subclass", "original-fallback-rounded-subclass", "original-fallback-Fraction-subclass", "original-fallback-integer-weights", "original-fallback-boolean-public", "exact-internal-type-preservation-at-certified-updates", "malformed-outcome-missing-weight", "malformed-outcome-bad-role", "malformed-outcome-bad-scalar", "malformed-outcome-short-event", "recertification-invalidates-certified-method", "disabled-capacity-not-certified"], "status": "PASS_TYPE_GATE_FINITE_FEASIBILITY"}, "new_control_count": 9, "new_controls": ["canonical-full-pair-tokens", "weight-token-hash-collision", "bounded-context-overflow", "event-q-canonical-equality-and-FIFO-counters", "six-complete-trace-counter-and-type-comparisons", "source-site-weight-ownership", "wrong-token-alias-detected", "overflow-fallback-preserves-original", "fresh-token-and-cache-lifetimes"], "status": "PASS_COMPACT_KEY_FINITE_ONLY"} +{"all_coverage_preserved": true, "inherited": {"all_coverage_preserved": true, "inherited": {"all_coverage_preserved": true, "inherited": {"all_complete_values_and_types_equal": true, "cases": 241, "controls": ["returned-mutation-isolated", "source-drift", "Fraction-type-drift", "module-byte-drift", "live-code-drift", "nested-live-code-drift", "omitted-witness", "omitted-rounded-sites", "wrong-coefficient", "wrong-weighted-increment", "bad-role", "bad-scalar", "missing-weight", "restore-success", "restore-exception", "fresh-derivation", "key-field-0", "key-field-1", "key-field-2", "key-field-3", "key-field-4", "FIFO-eviction", "canonical-key", "hash-collision", "disabled", "invalid-capacity--1", "invalid-capacity-16385", "invalid-capacity-True", "invalid-capacity-1.5", "uncached-exception-0", "uncached-exception-1", "fresh-call-table", "stats-mutation", "failed-call-clears-stats"], "events": 10164, "status": "PASS_FINITE_FRACTION_TABLE_FEASIBILITY"}, "new_control_count": 20, "new_controls": ["all-241-fixtures-take-certified-domain", "subtypes-and-foreign-types-fall-back-without-custom-methods", "metaclass-container", "metaclass-scalar", "original-fallback-dict-subclass", "original-fallback-program-subclass", "original-fallback-event-subclass", "original-fallback-weights-subclass", "original-fallback-row-subclass", "original-fallback-rounded-subclass", "original-fallback-Fraction-subclass", "original-fallback-integer-weights", "original-fallback-boolean-public", "exact-internal-type-preservation-at-certified-updates", "malformed-outcome-missing-weight", "malformed-outcome-bad-role", "malformed-outcome-bad-scalar", "malformed-outcome-short-event", "recertification-invalidates-certified-method", "disabled-capacity-not-certified"], "status": "PASS_TYPE_GATE_FINITE_FEASIBILITY"}, "new_control_count": 9, "new_controls": ["canonical-full-pair-tokens", "weight-token-hash-collision", "bounded-context-overflow", "event-q-canonical-equality-and-FIFO-counters", "six-complete-trace-counter-and-type-comparisons", "source-site-weight-ownership", "wrong-token-alias-detected", "overflow-fallback-preserves-original", "fresh-token-and-cache-lifetimes"], "status": "PASS_COMPACT_KEY_FINITE_ONLY"}, "new_control_count": 10, "new_controls": ["changed-getter-invalidates", "changed-live-getter-code", "foreign-slot-probe-is-pure", "changed-attribute-lookup", "missing-attribute-handler-presence", "binding-restored", "slot-path-selected", "post-derive-getter-drift-literal-fallback", "uninitialized-unused-weight-fallback", "foreign-slot-value-fallback"], "status": "PASS_SLOT_KEY_FINITE_ONLY"} +{"all_coverage_preserved": true, "build": {"SOABI": "cpython-312-x86_64-linux-gnu", "binary_sha256": "059347e799691087d3e649761540537865254a473647fece00207a4ad5925f60", "cold_build_load_wall_seconds": 0.3292266380158253, "compiler": "/usr/bin/cc", "compiler_cpu_accounting": "outer GNU time user+system includes compiler children", "compiler_version": "cc (Ubuntu 13.3.0-6ubuntu2~24.04.1) 13.3.0", "extension_suffix": ".cpython-312-x86_64-linux-gnu.so", "flags": ["-O2", "-shared", "-fPIC", "-std=c11", "-Wall", "-Werror", "-I/usr/include/python3.12"], "python": "3.12.3 (main, Aug 31 2026, 10:18:26) [GCC 13.3.0]", "source_sha256": "78ed2e240ee40ce4989a4718e77e8b3967b092d2bf8c900124a26942c98a14cb"}, "inherited": {"all_coverage_preserved": true, "inherited": {"all_coverage_preserved": true, "inherited": {"all_coverage_preserved": true, "inherited": {"all_complete_values_and_types_equal": true, "cases": 241, "controls": ["returned-mutation-isolated", "source-drift", "Fraction-type-drift", "module-byte-drift", "live-code-drift", "nested-live-code-drift", "omitted-witness", "omitted-rounded-sites", "wrong-coefficient", "wrong-weighted-increment", "bad-role", "bad-scalar", "missing-weight", "restore-success", "restore-exception", "fresh-derivation", "key-field-0", "key-field-1", "key-field-2", "key-field-3", "key-field-4", "FIFO-eviction", "canonical-key", "hash-collision", "disabled", "invalid-capacity--1", "invalid-capacity-16385", "invalid-capacity-True", "invalid-capacity-1.5", "uncached-exception-0", "uncached-exception-1", "fresh-call-table", "stats-mutation", "failed-call-clears-stats"], "events": 10164, "status": "PASS_FINITE_FRACTION_TABLE_FEASIBILITY"}, "new_control_count": 20, "new_controls": ["all-241-fixtures-take-certified-domain", "subtypes-and-foreign-types-fall-back-without-custom-methods", "metaclass-container", "metaclass-scalar", "original-fallback-dict-subclass", "original-fallback-program-subclass", "original-fallback-event-subclass", "original-fallback-weights-subclass", "original-fallback-row-subclass", "original-fallback-rounded-subclass", "original-fallback-Fraction-subclass", "original-fallback-integer-weights", "original-fallback-boolean-public", "exact-internal-type-preservation-at-certified-updates", "malformed-outcome-missing-weight", "malformed-outcome-bad-role", "malformed-outcome-bad-scalar", "malformed-outcome-short-event", "recertification-invalidates-certified-method", "disabled-capacity-not-certified"], "status": "PASS_TYPE_GATE_FINITE_FEASIBILITY"}, "new_control_count": 9, "new_controls": ["canonical-full-pair-tokens", "weight-token-hash-collision", "bounded-context-overflow", "event-q-canonical-equality-and-FIFO-counters", "six-complete-trace-counter-and-type-comparisons", "source-site-weight-ownership", "wrong-token-alias-detected", "overflow-fallback-preserves-original", "fresh-token-and-cache-lifetimes"], "status": "PASS_COMPACT_KEY_FINITE_ONLY"}, "new_control_count": 10, "new_controls": ["changed-getter-invalidates", "changed-live-getter-code", "foreign-slot-probe-is-pure", "changed-attribute-lookup", "missing-attribute-handler-presence", "binding-restored", "slot-path-selected", "post-derive-getter-drift-literal-fallback", "uninitialized-unused-weight-fallback", "foreign-slot-value-fallback"], "status": "PASS_SLOT_KEY_FINITE_ONLY"}, "native_control_count": 45, "native_controls": ["canonical-keys-FIFO-wrap-counters", "native-hash-collision", "exact-one-callback-per-miss", "uncached-native-error-0", "uncached-native-error-1", "full-cache-failure-before-eviction", "cache-survives-callback-exception", "capacity-0", "capacity--1", "capacity-16385", "capacity-True", "capacity-1.5", "capacity-10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "index--1", "index-3", "index-10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "index-True", "index-0", "arity", "keywords", "exact-operand", "exact-scalar", "event-creation", "descriptor-protocol", "token-length", "token-range", "partial-init-length", "partial-init-weight", "callback-result-shape", "callback-result-type", "callback-reentry", "event-owns-parent", "GC-callback-cycle", "native-statistics-isolated", "native-coefficient-loop", "same-row-lowlevel-rejection", "dict-iterator-mutation-safe", "callback-list-mutation-safe", "native-source-authenticated", "callback-descriptor-is-pure", "plain-callback-rejected", "live-callback-code-drift", "owned-metadata-snapshot", "same-row-source-fallback", "malformed-scalar-literal-fallback"], "status": "PASS_NATIVE_FINITE_ONLY"} +PASS_FRACTION_NATIVE_FINITE_AND_CUSTODY +PASS_C_VERIFICATION_SCOPED_FINITE baseline +{"build": {"SOABI": "cpython-312-x86_64-linux-gnu", "binary_sha256": "06a2a90fa00d74d3955c046e70a78642649df374e8c1c3529f63b01647f6b719", "cold_build_load_wall_seconds": 0.39444788097171113, "compiler": "/usr/bin/cc", "compiler_cpu_accounting": "parent outer process must include compiler children", "extension_suffix": ".cpython-312-x86_64-linux-gnu.so", "flags": ["-O2", "-shared", "-fPIC", "-std=c11", "-Wall", "-Werror", "-I/usr/include/python3.12"], "python": "3.12.3 (main, Aug 31 2026, 10:18:26) [GCC 13.3.0]", "source_sha256": "804cc25bd9ad0912de81fe97bc65b95ebcb0dec06453739e1d4863e7946c4f3d"}, "result": {"checks": ["eight-row-and-score-differentials", "aliased-inputs-return-fresh-outputs", "six-ordered-prefixes-and-complete-bytes", "zero-negative-large-reduced-and-ordered-formatting", "score-string-contract-distinct-from-coefficient-contract", "reverse-scores-signed-bytes-and-aliases", "bool-numerator", "foreign-int-value", "foreign-dict", "foreign-key", "float-value", "negative-exponent", "bool-exponent", "inexact-division-transaction", "inexact-scaled-row", "nondyadic-scale", "zero-scale", "negative-scale", "bool-scale", "short-score", "foreign-scores", "foreign-weight", "weight-index-range", "negative-weight-index", "reverse-index-range", "score-nondyadic-unit", "event-type"], "independent_fraction_formatting": true, "ordered_prefixes": 6, "row_cases": 8, "status": "PASS_FINITE_INTEGER_FORMAT", "timing_claim": false, "whole_replay": false}} +PASS_C_VERIFICATION_SCOPED_FINITE integer +{"build": {"SOABI": "cpython-312-x86_64-linux-gnu", "binary_sha256": "087a4cc15b90cb036bc8d8c2c1e8835cd9db51128b6249f55e257f15b49c1afd", "cold_build_load_wall_seconds": 0.35868534998735413, "compiler": "/usr/bin/cc", "compiler_cpu_accounting": "parent outer process must include compiler children", "extension_suffix": ".cpython-312-x86_64-linux-gnu.so", "flags": ["-O2", "-shared", "-fPIC", "-std=c11", "-Wall", "-Werror", "-I/usr/include/python3.12"], "python": "3.12.3 (main, Aug 31 2026, 10:18:26) [GCC 13.3.0]", "source_sha256": "804cc25bd9ad0912de81fe97bc65b95ebcb0dec06453739e1d4863e7946c4f3d"}, "result": {"checks": ["eight-row-and-score-differentials", "aliased-inputs-return-fresh-outputs", "six-ordered-prefixes-and-complete-bytes", "zero-negative-large-reduced-and-ordered-formatting", "score-string-contract-distinct-from-coefficient-contract", "reverse-scores-signed-bytes-and-aliases", "bool-numerator", "foreign-int-value", "foreign-dict", "foreign-key", "float-value", "negative-exponent", "bool-exponent", "inexact-division-transaction", "inexact-scaled-row", "nondyadic-scale", "zero-scale", "negative-scale", "bool-scale", "short-score", "foreign-scores", "foreign-weight", "weight-index-range", "negative-weight-index", "reverse-index-range", "score-nondyadic-unit", "event-type"], "independent_fraction_formatting": true, "ordered_prefixes": 6, "row_cases": 8, "status": "PASS_FINITE_INTEGER_FORMAT", "timing_claim": false, "whole_replay": false}} +PASS_C_VERIFICATION_SCOPED_FINITE integer +{"actual_word_run": false, "added_controls": ["165-general-rational-coefficient-prefixes", "batch-FIFO-and-full-counters", "exact-score-type", "score-subclass", "negative-score-denominator", "same-row", "nonbuiltin-gcd", "source-iterator-mutation", "score-list-mutation", "score-value-mutation", "callback-failure-publishes-completed-prefix", "arithmetic-code-drift", "inplace-protocol-drift", "materialization-source-drift", "gcd-drift", "operator-closure-drift", "13-complete-event-prefixes-with-nondyadic-weights-and-scalars", "noncanonical-weight-fallback", "changed-arithmetic-fallback"], "build": {"SOABI": "cpython-312-x86_64-linux-gnu", "binary_sha256": "b454117c7a0ddc9c9cb6ec066c1b45bbe228f27df64bb28d158c3af1dfc73da0", "cold_build_load_wall_seconds": 0.4579789729905315, "compiler": "/usr/bin/cc", "compiler_cpu_accounting": "outer GNU time user+system includes compiler children", "compiler_version": "cc (Ubuntu 13.3.0-6ubuntu2~24.04.1) 13.3.0", "extension_suffix": ".cpython-312-x86_64-linux-gnu.so", "flags": ["-O2", "-shared", "-fPIC", "-std=c11", "-Wall", "-Werror", "-I/usr/include/python3.12"], "python": "3.12.3 (main, Aug 31 2026, 10:18:26) [GCC 13.3.0]", "source_sha256": "4a4949e36cff4ff2894dd1f9379b58a58346ec7c888903271d4b98bbe4cfc7ae"}, "comparisons": 178, "complete_performance": false, "control_count": 19, "independent_literal_oracle_used": true, "status": "PASS_BOUNDED_RATIONAL_PROTOTYPE_ONLY"} +PASS_ADDED_DESTRUCTOR_BINDING_CONTROL +PASS_C_VERIFICATION_SCOPED_FINITE rational +{"actual_word_run": false, "added_controls": ["165-general-rational-coefficient-prefixes", "batch-FIFO-and-full-counters", "exact-score-type", "score-subclass", "negative-score-denominator", "same-row", "nonbuiltin-gcd", "source-iterator-mutation", "score-list-mutation", "score-value-mutation", "callback-failure-publishes-completed-prefix", "arithmetic-code-drift", "inplace-protocol-drift", "materialization-source-drift", "gcd-drift", "operator-closure-drift", "13-complete-event-prefixes-with-nondyadic-weights-and-scalars", "noncanonical-weight-fallback", "changed-arithmetic-fallback"], "build": {"SOABI": "cpython-312-x86_64-linux-gnu", "binary_sha256": "4a274d3af9aed7a758b131cc66437740a10abff5711c67b084c3fa125a98b0e1", "cold_build_load_wall_seconds": 0.4748963229940273, "compiler": "/usr/bin/cc", "compiler_cpu_accounting": "outer GNU time user+system includes compiler children", "compiler_version": "cc (Ubuntu 13.3.0-6ubuntu2~24.04.1) 13.3.0", "extension_suffix": ".cpython-312-x86_64-linux-gnu.so", "flags": ["-O2", "-shared", "-fPIC", "-std=c11", "-Wall", "-Werror", "-I/usr/include/python3.12"], "python": "3.12.3 (main, Aug 31 2026, 10:18:26) [GCC 13.3.0]", "source_sha256": "4a4949e36cff4ff2894dd1f9379b58a58346ec7c888903271d4b98bbe4cfc7ae"}, "comparisons": 178, "complete_performance": false, "control_count": 19, "independent_literal_oracle_used": true, "status": "PASS_BOUNDED_RATIONAL_PROTOTYPE_ONLY"} +PASS_ADDED_DESTRUCTOR_BINDING_CONTROL +PASS_C_VERIFICATION_SCOPED_FINITE rational +PASS_ALL_FRESH_SCOPED_PACKAGE_COMMANDS diff --git a/research/c-verification-feasibility/evidence/publication/fresh-all-scopes/usage.json b/research/c-verification-feasibility/evidence/publication/fresh-all-scopes/usage.json new file mode 100644 index 0000000000..7c987ae1a0 --- /dev/null +++ b/research/c-verification-feasibility/evidence/publication/fresh-all-scopes/usage.json @@ -0,0 +1 @@ +{"user_seconds":6.14,"system_seconds":0.40,"kernel_max_rss_kib":48524,"exit":0} diff --git a/research/c-verification-feasibility/evidence/runs/integer-complete-B1/receipt.json b/research/c-verification-feasibility/evidence/runs/integer-complete-B1/receipt.json new file mode 100644 index 0000000000..1792021afb --- /dev/null +++ b/research/c-verification-feasibility/evidence/runs/integer-complete-B1/receipt.json @@ -0,0 +1,26 @@ +{ + "exit": 0, + "label": "integer-complete-B1", + "optimized": false, + "platform": "Linux-7.0.0-38-generic-x86_64-with-glibc2.39", + "python": "3.12.3 (main, Aug 31 2026, 10:18:26) [GCC 13.3.0]", + "runner_sha256": "7540f8cc4ae4d12ed86c844ef0837a74184d3ada653979608c295c09f200a751", + "runtime_policy_sha256": "9b5c8f4d125a6fef058549e83c34b7fab656b569be059346ac2ee8b147057c99", + "sampled_process_group_rss_bytes": 116232192, + "script": "stages/integer-complete-v1/baseline_full.py", + "source_bytes_and_modes_unchanged": true, + "source_inventory_sha256": "cc42383ed2afc04b54af061eab285fc964a1a9d76461377a2fc6e29de9059dad", + "status": "PASS", + "stderr_bytes": 0, + "stderr_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stdout_bytes": 14103, + "stdout_sha256": "594672fbe81ebb90cc4ffbef278e6d374c962241dc2c2e53dc3ffb6b0f9bc4cd", + "termination": null, + "usage": { + "exit": 0, + "kernel_max_rss_kib": 112056, + "system_seconds": 0.22, + "user_seconds": 35.55 + }, + "wall_seconds": 36.543337017006706 +} diff --git a/research/c-verification-feasibility/evidence/runs/integer-complete-B1/stderr.txt b/research/c-verification-feasibility/evidence/runs/integer-complete-B1/stderr.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/research/c-verification-feasibility/evidence/runs/integer-complete-B1/stdout.txt b/research/c-verification-feasibility/evidence/runs/integer-complete-B1/stdout.txt new file mode 100644 index 0000000000..350f6ce62b --- /dev/null +++ b/research/c-verification-feasibility/evidence/runs/integer-complete-B1/stdout.txt @@ -0,0 +1,9 @@ +{"all_complete_values_and_types_equal": true, "cases": 241, "controls": ["returned-mutation-isolated", "source-drift", "Fraction-type-drift", "module-byte-drift", "live-code-drift", "nested-live-code-drift", "omitted-witness", "omitted-rounded-sites", "wrong-coefficient", "wrong-weighted-increment", "bad-role", "bad-scalar", "missing-weight", "restore-success", "restore-exception", "fresh-derivation", "key-field-0", "key-field-1", "key-field-2", "key-field-3", "key-field-4", "FIFO-eviction", "canonical-key", "hash-collision", "disabled", "invalid-capacity--1", "invalid-capacity-16385", "invalid-capacity-True", "invalid-capacity-1.5", "uncached-exception-0", "uncached-exception-1", "fresh-call-table", "stats-mutation", "failed-call-clears-stats"], "events": 10164, "status": "PASS_FINITE_FRACTION_TABLE_FEASIBILITY"} +{"all_coverage_preserved": true, "inherited": {"all_complete_values_and_types_equal": true, "cases": 241, "controls": ["returned-mutation-isolated", "source-drift", "Fraction-type-drift", "module-byte-drift", "live-code-drift", "nested-live-code-drift", "omitted-witness", "omitted-rounded-sites", "wrong-coefficient", "wrong-weighted-increment", "bad-role", "bad-scalar", "missing-weight", "restore-success", "restore-exception", "fresh-derivation", "key-field-0", "key-field-1", "key-field-2", "key-field-3", "key-field-4", "FIFO-eviction", "canonical-key", "hash-collision", "disabled", "invalid-capacity--1", "invalid-capacity-16385", "invalid-capacity-True", "invalid-capacity-1.5", "uncached-exception-0", "uncached-exception-1", "fresh-call-table", "stats-mutation", "failed-call-clears-stats"], "events": 10164, "status": "PASS_FINITE_FRACTION_TABLE_FEASIBILITY"}, "new_control_count": 20, "new_controls": ["all-241-fixtures-take-certified-domain", "subtypes-and-foreign-types-fall-back-without-custom-methods", "metaclass-container", "metaclass-scalar", "original-fallback-dict-subclass", "original-fallback-program-subclass", "original-fallback-event-subclass", "original-fallback-weights-subclass", "original-fallback-row-subclass", "original-fallback-rounded-subclass", "original-fallback-Fraction-subclass", "original-fallback-integer-weights", "original-fallback-boolean-public", "exact-internal-type-preservation-at-certified-updates", "malformed-outcome-missing-weight", "malformed-outcome-bad-role", "malformed-outcome-bad-scalar", "malformed-outcome-short-event", "recertification-invalidates-certified-method", "disabled-capacity-not-certified"], "status": "PASS_TYPE_GATE_FINITE_FEASIBILITY"} +{"all_coverage_preserved": true, "inherited": {"all_coverage_preserved": true, "inherited": {"all_complete_values_and_types_equal": true, "cases": 241, "controls": ["returned-mutation-isolated", "source-drift", "Fraction-type-drift", "module-byte-drift", "live-code-drift", "nested-live-code-drift", "omitted-witness", "omitted-rounded-sites", "wrong-coefficient", "wrong-weighted-increment", "bad-role", "bad-scalar", "missing-weight", "restore-success", "restore-exception", "fresh-derivation", "key-field-0", "key-field-1", "key-field-2", "key-field-3", "key-field-4", "FIFO-eviction", "canonical-key", "hash-collision", "disabled", "invalid-capacity--1", "invalid-capacity-16385", "invalid-capacity-True", "invalid-capacity-1.5", "uncached-exception-0", "uncached-exception-1", "fresh-call-table", "stats-mutation", "failed-call-clears-stats"], "events": 10164, "status": "PASS_FINITE_FRACTION_TABLE_FEASIBILITY"}, "new_control_count": 20, "new_controls": ["all-241-fixtures-take-certified-domain", "subtypes-and-foreign-types-fall-back-without-custom-methods", "metaclass-container", "metaclass-scalar", "original-fallback-dict-subclass", "original-fallback-program-subclass", "original-fallback-event-subclass", "original-fallback-weights-subclass", "original-fallback-row-subclass", "original-fallback-rounded-subclass", "original-fallback-Fraction-subclass", "original-fallback-integer-weights", "original-fallback-boolean-public", "exact-internal-type-preservation-at-certified-updates", "malformed-outcome-missing-weight", "malformed-outcome-bad-role", "malformed-outcome-bad-scalar", "malformed-outcome-short-event", "recertification-invalidates-certified-method", "disabled-capacity-not-certified"], "status": "PASS_TYPE_GATE_FINITE_FEASIBILITY"}, "new_control_count": 9, "new_controls": ["canonical-full-pair-tokens", "weight-token-hash-collision", "bounded-context-overflow", "event-q-canonical-equality-and-FIFO-counters", "six-complete-trace-counter-and-type-comparisons", "source-site-weight-ownership", "wrong-token-alias-detected", "overflow-fallback-preserves-original", "fresh-token-and-cache-lifetimes"], "status": "PASS_COMPACT_KEY_FINITE_ONLY"} +{"all_coverage_preserved": true, "inherited": {"all_coverage_preserved": true, "inherited": {"all_coverage_preserved": true, "inherited": {"all_complete_values_and_types_equal": true, "cases": 241, "controls": ["returned-mutation-isolated", "source-drift", "Fraction-type-drift", "module-byte-drift", "live-code-drift", "nested-live-code-drift", "omitted-witness", "omitted-rounded-sites", "wrong-coefficient", "wrong-weighted-increment", "bad-role", "bad-scalar", "missing-weight", "restore-success", "restore-exception", "fresh-derivation", "key-field-0", "key-field-1", "key-field-2", "key-field-3", "key-field-4", "FIFO-eviction", "canonical-key", "hash-collision", "disabled", "invalid-capacity--1", "invalid-capacity-16385", "invalid-capacity-True", "invalid-capacity-1.5", "uncached-exception-0", "uncached-exception-1", "fresh-call-table", "stats-mutation", "failed-call-clears-stats"], "events": 10164, "status": "PASS_FINITE_FRACTION_TABLE_FEASIBILITY"}, "new_control_count": 20, "new_controls": ["all-241-fixtures-take-certified-domain", "subtypes-and-foreign-types-fall-back-without-custom-methods", "metaclass-container", "metaclass-scalar", "original-fallback-dict-subclass", "original-fallback-program-subclass", "original-fallback-event-subclass", "original-fallback-weights-subclass", "original-fallback-row-subclass", "original-fallback-rounded-subclass", "original-fallback-Fraction-subclass", "original-fallback-integer-weights", "original-fallback-boolean-public", "exact-internal-type-preservation-at-certified-updates", "malformed-outcome-missing-weight", "malformed-outcome-bad-role", "malformed-outcome-bad-scalar", "malformed-outcome-short-event", "recertification-invalidates-certified-method", "disabled-capacity-not-certified"], "status": "PASS_TYPE_GATE_FINITE_FEASIBILITY"}, "new_control_count": 9, "new_controls": ["canonical-full-pair-tokens", "weight-token-hash-collision", "bounded-context-overflow", "event-q-canonical-equality-and-FIFO-counters", "six-complete-trace-counter-and-type-comparisons", "source-site-weight-ownership", "wrong-token-alias-detected", "overflow-fallback-preserves-original", "fresh-token-and-cache-lifetimes"], "status": "PASS_COMPACT_KEY_FINITE_ONLY"}, "new_control_count": 10, "new_controls": ["changed-getter-invalidates", "changed-live-getter-code", "foreign-slot-probe-is-pure", "changed-attribute-lookup", "missing-attribute-handler-presence", "binding-restored", "slot-path-selected", "post-derive-getter-drift-literal-fallback", "uninitialized-unused-weight-fallback", "foreign-slot-value-fallback"], "status": "PASS_SLOT_KEY_FINITE_ONLY"} +{"all_coverage_preserved": true, "build": {"SOABI": "cpython-312-x86_64-linux-gnu", "binary_sha256": "a79edfebbc99b8787229cdbee3626d46ce01d7e0bbe636d25e7360a8f842097f", "cold_build_load_wall_seconds": 0.3252279229927808, "compiler": "/usr/bin/cc", "compiler_cpu_accounting": "outer GNU time user+system includes compiler children", "compiler_version": "cc (Ubuntu 13.3.0-6ubuntu2~24.04.1) 13.3.0", "extension_suffix": ".cpython-312-x86_64-linux-gnu.so", "flags": ["-O2", "-shared", "-fPIC", "-std=c11", "-Wall", "-Werror", "-I/usr/include/python3.12"], "python": "3.12.3 (main, Aug 31 2026, 10:18:26) [GCC 13.3.0]", "source_sha256": "78ed2e240ee40ce4989a4718e77e8b3967b092d2bf8c900124a26942c98a14cb"}, "inherited": {"all_coverage_preserved": true, "inherited": {"all_coverage_preserved": true, "inherited": {"all_coverage_preserved": true, "inherited": {"all_complete_values_and_types_equal": true, "cases": 241, "controls": ["returned-mutation-isolated", "source-drift", "Fraction-type-drift", "module-byte-drift", "live-code-drift", "nested-live-code-drift", "omitted-witness", "omitted-rounded-sites", "wrong-coefficient", "wrong-weighted-increment", "bad-role", "bad-scalar", "missing-weight", "restore-success", "restore-exception", "fresh-derivation", "key-field-0", "key-field-1", "key-field-2", "key-field-3", "key-field-4", "FIFO-eviction", "canonical-key", "hash-collision", "disabled", "invalid-capacity--1", "invalid-capacity-16385", "invalid-capacity-True", "invalid-capacity-1.5", "uncached-exception-0", "uncached-exception-1", "fresh-call-table", "stats-mutation", "failed-call-clears-stats"], "events": 10164, "status": "PASS_FINITE_FRACTION_TABLE_FEASIBILITY"}, "new_control_count": 20, "new_controls": ["all-241-fixtures-take-certified-domain", "subtypes-and-foreign-types-fall-back-without-custom-methods", "metaclass-container", "metaclass-scalar", "original-fallback-dict-subclass", "original-fallback-program-subclass", "original-fallback-event-subclass", "original-fallback-weights-subclass", "original-fallback-row-subclass", "original-fallback-rounded-subclass", "original-fallback-Fraction-subclass", "original-fallback-integer-weights", "original-fallback-boolean-public", "exact-internal-type-preservation-at-certified-updates", "malformed-outcome-missing-weight", "malformed-outcome-bad-role", "malformed-outcome-bad-scalar", "malformed-outcome-short-event", "recertification-invalidates-certified-method", "disabled-capacity-not-certified"], "status": "PASS_TYPE_GATE_FINITE_FEASIBILITY"}, "new_control_count": 9, "new_controls": ["canonical-full-pair-tokens", "weight-token-hash-collision", "bounded-context-overflow", "event-q-canonical-equality-and-FIFO-counters", "six-complete-trace-counter-and-type-comparisons", "source-site-weight-ownership", "wrong-token-alias-detected", "overflow-fallback-preserves-original", "fresh-token-and-cache-lifetimes"], "status": "PASS_COMPACT_KEY_FINITE_ONLY"}, "new_control_count": 10, "new_controls": ["changed-getter-invalidates", "changed-live-getter-code", "foreign-slot-probe-is-pure", "changed-attribute-lookup", "missing-attribute-handler-presence", "binding-restored", "slot-path-selected", "post-derive-getter-drift-literal-fallback", "uninitialized-unused-weight-fallback", "foreign-slot-value-fallback"], "status": "PASS_SLOT_KEY_FINITE_ONLY"}, "native_control_count": 45, "native_controls": ["canonical-keys-FIFO-wrap-counters", "native-hash-collision", "exact-one-callback-per-miss", "uncached-native-error-0", "uncached-native-error-1", "full-cache-failure-before-eviction", "cache-survives-callback-exception", "capacity-0", "capacity--1", "capacity-16385", "capacity-True", "capacity-1.5", "capacity-10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "index--1", "index-3", "index-10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "index-True", "index-0", "arity", "keywords", "exact-operand", "exact-scalar", "event-creation", "descriptor-protocol", "token-length", "token-range", "partial-init-length", "partial-init-weight", "callback-result-shape", "callback-result-type", "callback-reentry", "event-owns-parent", "GC-callback-cycle", "native-statistics-isolated", "native-coefficient-loop", "same-row-lowlevel-rejection", "dict-iterator-mutation-safe", "callback-list-mutation-safe", "native-source-authenticated", "callback-descriptor-is-pure", "plain-callback-rejected", "live-callback-code-drift", "owned-metadata-snapshot", "same-row-source-fallback", "malformed-scalar-literal-fallback"], "status": "PASS_NATIVE_FINITE_ONLY"} +{"backends": 2, "controls": ["one-use", "closed-call", "missing", "duplicate", "changed-weights", "changed-rounding", "changed-word", "original-malformed-rejection", "propagated-exception", "failed-finish", "failed-take", "fresh-context-not-previous-pass", "aborted-take", "one-use", "closed-call", "missing", "duplicate", "changed-weights", "changed-rounding", "changed-word", "original-malformed-rejection", "propagated-exception", "failed-finish", "failed-take", "fresh-context-not-previous-pass", "aborted-take", "input-mutation"], "events": 5, "status": "PASS_FINITE_FEASIBILITY_ONLY"} +{"actual": {"output_sha256": "954c7448ff74d78753828e9623ad44c46da9e5ce459420b6e50a5d47294250b9", "statistics": {"bypasses": 0, "calls": 2579750, "capacity": 16384, "evictions": 310400, "hits": 2252966, "misses": 326784, "resident": 16384}, "tokens": 3587}, "build": {"SOABI": "cpython-312-x86_64-linux-gnu", "binary_sha256": "a79edfebbc99b8787229cdbee3626d46ce01d7e0bbe636d25e7360a8f842097f", "cold_build_load_wall_seconds": 0.3252279229927808, "compiler": "/usr/bin/cc", "compiler_cpu_accounting": "outer GNU time user+system includes compiler children", "compiler_version": "cc (Ubuntu 13.3.0-6ubuntu2~24.04.1) 13.3.0", "extension_suffix": ".cpython-312-x86_64-linux-gnu.so", "flags": ["-O2", "-shared", "-fPIC", "-std=c11", "-Wall", "-Werror", "-I/usr/include/python3.12"], "python": "3.12.3 (main, Aug 31 2026, 10:18:26) [GCC 13.3.0]", "source_sha256": "78ed2e240ee40ce4989a4718e77e8b3967b092d2bf8c900124a26942c98a14cb"}, "compiler_children_charged": true, "integer_oracle_unchanged": true, "native_finite_included": true, "status": "PASS_COMPLETE_NATIVE_COVERAGE"} +PASS_P104_SINGLE_PASS_QUALIFICATION +{"mode": "qualify", "receipt": {"all_actual_witness_rows_equal": true, "coefficient_scale_bits": 55, "coordinates": 799, "events": 25984, "finite_fixtures": {"cases": 120, "controls": ["nondyadic scalar", "inexact scale division", "nondyadic weight"], "events": 4240}, "guards": {"owned": 22, "prefix": 26, "public": 23}, "source_controls": 6, "source_result_sha256": "cc7739703ed23532d187949c8507d09c13ac4c152e07a930f0087cde0d7a3d98"}, "seconds": 33.817265} diff --git a/research/c-verification-feasibility/evidence/runs/integer-complete-B1/usage.json b/research/c-verification-feasibility/evidence/runs/integer-complete-B1/usage.json new file mode 100644 index 0000000000..d0c86fefb4 --- /dev/null +++ b/research/c-verification-feasibility/evidence/runs/integer-complete-B1/usage.json @@ -0,0 +1 @@ +{"user_seconds":35.55,"system_seconds":0.22,"kernel_max_rss_kib":112056,"exit":0} diff --git a/research/c-verification-feasibility/evidence/runs/integer-complete-B2/receipt.json b/research/c-verification-feasibility/evidence/runs/integer-complete-B2/receipt.json new file mode 100644 index 0000000000..3a0d31fbb8 --- /dev/null +++ b/research/c-verification-feasibility/evidence/runs/integer-complete-B2/receipt.json @@ -0,0 +1,26 @@ +{ + "exit": 0, + "label": "integer-complete-B2", + "optimized": false, + "platform": "Linux-7.0.0-38-generic-x86_64-with-glibc2.39", + "python": "3.12.3 (main, Aug 31 2026, 10:18:26) [GCC 13.3.0]", + "runner_sha256": "7540f8cc4ae4d12ed86c844ef0837a74184d3ada653979608c295c09f200a751", + "runtime_policy_sha256": "9b5c8f4d125a6fef058549e83c34b7fab656b569be059346ac2ee8b147057c99", + "sampled_process_group_rss_bytes": 115580928, + "script": "stages/integer-complete-v1/baseline_full.py", + "source_bytes_and_modes_unchanged": true, + "source_inventory_sha256": "cc42383ed2afc04b54af061eab285fc964a1a9d76461377a2fc6e29de9059dad", + "status": "PASS", + "stderr_bytes": 0, + "stderr_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stdout_bytes": 14105, + "stdout_sha256": "58fae507363d9bce3855cbb6b3f0a2640f80770ab95d3a82251124f1315e8870", + "termination": null, + "usage": { + "exit": 0, + "kernel_max_rss_kib": 111420, + "system_seconds": 0.22, + "user_seconds": 34.25 + }, + "wall_seconds": 34.66178539200337 +} diff --git a/research/c-verification-feasibility/evidence/runs/integer-complete-B2/stderr.txt b/research/c-verification-feasibility/evidence/runs/integer-complete-B2/stderr.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/research/c-verification-feasibility/evidence/runs/integer-complete-B2/stdout.txt b/research/c-verification-feasibility/evidence/runs/integer-complete-B2/stdout.txt new file mode 100644 index 0000000000..48da043bfd --- /dev/null +++ b/research/c-verification-feasibility/evidence/runs/integer-complete-B2/stdout.txt @@ -0,0 +1,9 @@ +{"all_complete_values_and_types_equal": true, "cases": 241, "controls": ["returned-mutation-isolated", "source-drift", "Fraction-type-drift", "module-byte-drift", "live-code-drift", "nested-live-code-drift", "omitted-witness", "omitted-rounded-sites", "wrong-coefficient", "wrong-weighted-increment", "bad-role", "bad-scalar", "missing-weight", "restore-success", "restore-exception", "fresh-derivation", "key-field-0", "key-field-1", "key-field-2", "key-field-3", "key-field-4", "FIFO-eviction", "canonical-key", "hash-collision", "disabled", "invalid-capacity--1", "invalid-capacity-16385", "invalid-capacity-True", "invalid-capacity-1.5", "uncached-exception-0", "uncached-exception-1", "fresh-call-table", "stats-mutation", "failed-call-clears-stats"], "events": 10164, "status": "PASS_FINITE_FRACTION_TABLE_FEASIBILITY"} +{"all_coverage_preserved": true, "inherited": {"all_complete_values_and_types_equal": true, "cases": 241, "controls": ["returned-mutation-isolated", "source-drift", "Fraction-type-drift", "module-byte-drift", "live-code-drift", "nested-live-code-drift", "omitted-witness", "omitted-rounded-sites", "wrong-coefficient", "wrong-weighted-increment", "bad-role", "bad-scalar", "missing-weight", "restore-success", "restore-exception", "fresh-derivation", "key-field-0", "key-field-1", "key-field-2", "key-field-3", "key-field-4", "FIFO-eviction", "canonical-key", "hash-collision", "disabled", "invalid-capacity--1", "invalid-capacity-16385", "invalid-capacity-True", "invalid-capacity-1.5", "uncached-exception-0", "uncached-exception-1", "fresh-call-table", "stats-mutation", "failed-call-clears-stats"], "events": 10164, "status": "PASS_FINITE_FRACTION_TABLE_FEASIBILITY"}, "new_control_count": 20, "new_controls": ["all-241-fixtures-take-certified-domain", "subtypes-and-foreign-types-fall-back-without-custom-methods", "metaclass-container", "metaclass-scalar", "original-fallback-dict-subclass", "original-fallback-program-subclass", "original-fallback-event-subclass", "original-fallback-weights-subclass", "original-fallback-row-subclass", "original-fallback-rounded-subclass", "original-fallback-Fraction-subclass", "original-fallback-integer-weights", "original-fallback-boolean-public", "exact-internal-type-preservation-at-certified-updates", "malformed-outcome-missing-weight", "malformed-outcome-bad-role", "malformed-outcome-bad-scalar", "malformed-outcome-short-event", "recertification-invalidates-certified-method", "disabled-capacity-not-certified"], "status": "PASS_TYPE_GATE_FINITE_FEASIBILITY"} +{"all_coverage_preserved": true, "inherited": {"all_coverage_preserved": true, "inherited": {"all_complete_values_and_types_equal": true, "cases": 241, "controls": ["returned-mutation-isolated", "source-drift", "Fraction-type-drift", "module-byte-drift", "live-code-drift", "nested-live-code-drift", "omitted-witness", "omitted-rounded-sites", "wrong-coefficient", "wrong-weighted-increment", "bad-role", "bad-scalar", "missing-weight", "restore-success", "restore-exception", "fresh-derivation", "key-field-0", "key-field-1", "key-field-2", "key-field-3", "key-field-4", "FIFO-eviction", "canonical-key", "hash-collision", "disabled", "invalid-capacity--1", "invalid-capacity-16385", "invalid-capacity-True", "invalid-capacity-1.5", "uncached-exception-0", "uncached-exception-1", "fresh-call-table", "stats-mutation", "failed-call-clears-stats"], "events": 10164, "status": "PASS_FINITE_FRACTION_TABLE_FEASIBILITY"}, "new_control_count": 20, "new_controls": ["all-241-fixtures-take-certified-domain", "subtypes-and-foreign-types-fall-back-without-custom-methods", "metaclass-container", "metaclass-scalar", "original-fallback-dict-subclass", "original-fallback-program-subclass", "original-fallback-event-subclass", "original-fallback-weights-subclass", "original-fallback-row-subclass", "original-fallback-rounded-subclass", "original-fallback-Fraction-subclass", "original-fallback-integer-weights", "original-fallback-boolean-public", "exact-internal-type-preservation-at-certified-updates", "malformed-outcome-missing-weight", "malformed-outcome-bad-role", "malformed-outcome-bad-scalar", "malformed-outcome-short-event", "recertification-invalidates-certified-method", "disabled-capacity-not-certified"], "status": "PASS_TYPE_GATE_FINITE_FEASIBILITY"}, "new_control_count": 9, "new_controls": ["canonical-full-pair-tokens", "weight-token-hash-collision", "bounded-context-overflow", "event-q-canonical-equality-and-FIFO-counters", "six-complete-trace-counter-and-type-comparisons", "source-site-weight-ownership", "wrong-token-alias-detected", "overflow-fallback-preserves-original", "fresh-token-and-cache-lifetimes"], "status": "PASS_COMPACT_KEY_FINITE_ONLY"} +{"all_coverage_preserved": true, "inherited": {"all_coverage_preserved": true, "inherited": {"all_coverage_preserved": true, "inherited": {"all_complete_values_and_types_equal": true, "cases": 241, "controls": ["returned-mutation-isolated", "source-drift", "Fraction-type-drift", "module-byte-drift", "live-code-drift", "nested-live-code-drift", "omitted-witness", "omitted-rounded-sites", "wrong-coefficient", "wrong-weighted-increment", "bad-role", "bad-scalar", "missing-weight", "restore-success", "restore-exception", "fresh-derivation", "key-field-0", "key-field-1", "key-field-2", "key-field-3", "key-field-4", "FIFO-eviction", "canonical-key", "hash-collision", "disabled", "invalid-capacity--1", "invalid-capacity-16385", "invalid-capacity-True", "invalid-capacity-1.5", "uncached-exception-0", "uncached-exception-1", "fresh-call-table", "stats-mutation", "failed-call-clears-stats"], "events": 10164, "status": "PASS_FINITE_FRACTION_TABLE_FEASIBILITY"}, "new_control_count": 20, "new_controls": ["all-241-fixtures-take-certified-domain", "subtypes-and-foreign-types-fall-back-without-custom-methods", "metaclass-container", "metaclass-scalar", "original-fallback-dict-subclass", "original-fallback-program-subclass", "original-fallback-event-subclass", "original-fallback-weights-subclass", "original-fallback-row-subclass", "original-fallback-rounded-subclass", "original-fallback-Fraction-subclass", "original-fallback-integer-weights", "original-fallback-boolean-public", "exact-internal-type-preservation-at-certified-updates", "malformed-outcome-missing-weight", "malformed-outcome-bad-role", "malformed-outcome-bad-scalar", "malformed-outcome-short-event", "recertification-invalidates-certified-method", "disabled-capacity-not-certified"], "status": "PASS_TYPE_GATE_FINITE_FEASIBILITY"}, "new_control_count": 9, "new_controls": ["canonical-full-pair-tokens", "weight-token-hash-collision", "bounded-context-overflow", "event-q-canonical-equality-and-FIFO-counters", "six-complete-trace-counter-and-type-comparisons", "source-site-weight-ownership", "wrong-token-alias-detected", "overflow-fallback-preserves-original", "fresh-token-and-cache-lifetimes"], "status": "PASS_COMPACT_KEY_FINITE_ONLY"}, "new_control_count": 10, "new_controls": ["changed-getter-invalidates", "changed-live-getter-code", "foreign-slot-probe-is-pure", "changed-attribute-lookup", "missing-attribute-handler-presence", "binding-restored", "slot-path-selected", "post-derive-getter-drift-literal-fallback", "uninitialized-unused-weight-fallback", "foreign-slot-value-fallback"], "status": "PASS_SLOT_KEY_FINITE_ONLY"} +{"all_coverage_preserved": true, "build": {"SOABI": "cpython-312-x86_64-linux-gnu", "binary_sha256": "0c5b52fd2b1a495739f51880b731557d4b6b41c6b102baa6c81b07df2677b165", "cold_build_load_wall_seconds": 0.32438887798343785, "compiler": "/usr/bin/cc", "compiler_cpu_accounting": "outer GNU time user+system includes compiler children", "compiler_version": "cc (Ubuntu 13.3.0-6ubuntu2~24.04.1) 13.3.0", "extension_suffix": ".cpython-312-x86_64-linux-gnu.so", "flags": ["-O2", "-shared", "-fPIC", "-std=c11", "-Wall", "-Werror", "-I/usr/include/python3.12"], "python": "3.12.3 (main, Aug 31 2026, 10:18:26) [GCC 13.3.0]", "source_sha256": "78ed2e240ee40ce4989a4718e77e8b3967b092d2bf8c900124a26942c98a14cb"}, "inherited": {"all_coverage_preserved": true, "inherited": {"all_coverage_preserved": true, "inherited": {"all_coverage_preserved": true, "inherited": {"all_complete_values_and_types_equal": true, "cases": 241, "controls": ["returned-mutation-isolated", "source-drift", "Fraction-type-drift", "module-byte-drift", "live-code-drift", "nested-live-code-drift", "omitted-witness", "omitted-rounded-sites", "wrong-coefficient", "wrong-weighted-increment", "bad-role", "bad-scalar", "missing-weight", "restore-success", "restore-exception", "fresh-derivation", "key-field-0", "key-field-1", "key-field-2", "key-field-3", "key-field-4", "FIFO-eviction", "canonical-key", "hash-collision", "disabled", "invalid-capacity--1", "invalid-capacity-16385", "invalid-capacity-True", "invalid-capacity-1.5", "uncached-exception-0", "uncached-exception-1", "fresh-call-table", "stats-mutation", "failed-call-clears-stats"], "events": 10164, "status": "PASS_FINITE_FRACTION_TABLE_FEASIBILITY"}, "new_control_count": 20, "new_controls": ["all-241-fixtures-take-certified-domain", "subtypes-and-foreign-types-fall-back-without-custom-methods", "metaclass-container", "metaclass-scalar", "original-fallback-dict-subclass", "original-fallback-program-subclass", "original-fallback-event-subclass", "original-fallback-weights-subclass", "original-fallback-row-subclass", "original-fallback-rounded-subclass", "original-fallback-Fraction-subclass", "original-fallback-integer-weights", "original-fallback-boolean-public", "exact-internal-type-preservation-at-certified-updates", "malformed-outcome-missing-weight", "malformed-outcome-bad-role", "malformed-outcome-bad-scalar", "malformed-outcome-short-event", "recertification-invalidates-certified-method", "disabled-capacity-not-certified"], "status": "PASS_TYPE_GATE_FINITE_FEASIBILITY"}, "new_control_count": 9, "new_controls": ["canonical-full-pair-tokens", "weight-token-hash-collision", "bounded-context-overflow", "event-q-canonical-equality-and-FIFO-counters", "six-complete-trace-counter-and-type-comparisons", "source-site-weight-ownership", "wrong-token-alias-detected", "overflow-fallback-preserves-original", "fresh-token-and-cache-lifetimes"], "status": "PASS_COMPACT_KEY_FINITE_ONLY"}, "new_control_count": 10, "new_controls": ["changed-getter-invalidates", "changed-live-getter-code", "foreign-slot-probe-is-pure", "changed-attribute-lookup", "missing-attribute-handler-presence", "binding-restored", "slot-path-selected", "post-derive-getter-drift-literal-fallback", "uninitialized-unused-weight-fallback", "foreign-slot-value-fallback"], "status": "PASS_SLOT_KEY_FINITE_ONLY"}, "native_control_count": 45, "native_controls": ["canonical-keys-FIFO-wrap-counters", "native-hash-collision", "exact-one-callback-per-miss", "uncached-native-error-0", "uncached-native-error-1", "full-cache-failure-before-eviction", "cache-survives-callback-exception", "capacity-0", "capacity--1", "capacity-16385", "capacity-True", "capacity-1.5", "capacity-10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "index--1", "index-3", "index-10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "index-True", "index-0", "arity", "keywords", "exact-operand", "exact-scalar", "event-creation", "descriptor-protocol", "token-length", "token-range", "partial-init-length", "partial-init-weight", "callback-result-shape", "callback-result-type", "callback-reentry", "event-owns-parent", "GC-callback-cycle", "native-statistics-isolated", "native-coefficient-loop", "same-row-lowlevel-rejection", "dict-iterator-mutation-safe", "callback-list-mutation-safe", "native-source-authenticated", "callback-descriptor-is-pure", "plain-callback-rejected", "live-callback-code-drift", "owned-metadata-snapshot", "same-row-source-fallback", "malformed-scalar-literal-fallback"], "status": "PASS_NATIVE_FINITE_ONLY"} +{"backends": 2, "controls": ["one-use", "closed-call", "missing", "duplicate", "changed-weights", "changed-rounding", "changed-word", "original-malformed-rejection", "propagated-exception", "failed-finish", "failed-take", "fresh-context-not-previous-pass", "aborted-take", "one-use", "closed-call", "missing", "duplicate", "changed-weights", "changed-rounding", "changed-word", "original-malformed-rejection", "propagated-exception", "failed-finish", "failed-take", "fresh-context-not-previous-pass", "aborted-take", "input-mutation"], "events": 5, "status": "PASS_FINITE_FEASIBILITY_ONLY"} +{"actual": {"output_sha256": "954c7448ff74d78753828e9623ad44c46da9e5ce459420b6e50a5d47294250b9", "statistics": {"bypasses": 0, "calls": 2579750, "capacity": 16384, "evictions": 310400, "hits": 2252966, "misses": 326784, "resident": 16384}, "tokens": 3587}, "build": {"SOABI": "cpython-312-x86_64-linux-gnu", "binary_sha256": "0c5b52fd2b1a495739f51880b731557d4b6b41c6b102baa6c81b07df2677b165", "cold_build_load_wall_seconds": 0.32438887798343785, "compiler": "/usr/bin/cc", "compiler_cpu_accounting": "outer GNU time user+system includes compiler children", "compiler_version": "cc (Ubuntu 13.3.0-6ubuntu2~24.04.1) 13.3.0", "extension_suffix": ".cpython-312-x86_64-linux-gnu.so", "flags": ["-O2", "-shared", "-fPIC", "-std=c11", "-Wall", "-Werror", "-I/usr/include/python3.12"], "python": "3.12.3 (main, Aug 31 2026, 10:18:26) [GCC 13.3.0]", "source_sha256": "78ed2e240ee40ce4989a4718e77e8b3967b092d2bf8c900124a26942c98a14cb"}, "compiler_children_charged": true, "integer_oracle_unchanged": true, "native_finite_included": true, "status": "PASS_COMPLETE_NATIVE_COVERAGE"} +PASS_P104_SINGLE_PASS_QUALIFICATION +{"mode": "qualify", "receipt": {"all_actual_witness_rows_equal": true, "coefficient_scale_bits": 55, "coordinates": 799, "events": 25984, "finite_fixtures": {"cases": 120, "controls": ["nondyadic scalar", "inexact scale division", "nondyadic weight"], "events": 4240}, "guards": {"owned": 22, "prefix": 26, "public": 23}, "source_controls": 6, "source_result_sha256": "cc7739703ed23532d187949c8507d09c13ac4c152e07a930f0087cde0d7a3d98"}, "seconds": 31.936547} diff --git a/research/c-verification-feasibility/evidence/runs/integer-complete-B2/usage.json b/research/c-verification-feasibility/evidence/runs/integer-complete-B2/usage.json new file mode 100644 index 0000000000..64a76c5012 --- /dev/null +++ b/research/c-verification-feasibility/evidence/runs/integer-complete-B2/usage.json @@ -0,0 +1 @@ +{"user_seconds":34.25,"system_seconds":0.22,"kernel_max_rss_kib":111420,"exit":0} diff --git a/research/c-verification-feasibility/evidence/runs/integer-complete-B3/receipt.json b/research/c-verification-feasibility/evidence/runs/integer-complete-B3/receipt.json new file mode 100644 index 0000000000..40ba0f0594 --- /dev/null +++ b/research/c-verification-feasibility/evidence/runs/integer-complete-B3/receipt.json @@ -0,0 +1,26 @@ +{ + "exit": 0, + "label": "integer-complete-B3", + "optimized": false, + "platform": "Linux-7.0.0-38-generic-x86_64-with-glibc2.39", + "python": "3.12.3 (main, Aug 31 2026, 10:18:26) [GCC 13.3.0]", + "runner_sha256": "7540f8cc4ae4d12ed86c844ef0837a74184d3ada653979608c295c09f200a751", + "runtime_policy_sha256": "9b5c8f4d125a6fef058549e83c34b7fab656b569be059346ac2ee8b147057c99", + "sampled_process_group_rss_bytes": 115953664, + "script": "stages/integer-complete-v1/baseline_full.py", + "source_bytes_and_modes_unchanged": true, + "source_inventory_sha256": "cc42383ed2afc04b54af061eab285fc964a1a9d76461377a2fc6e29de9059dad", + "status": "PASS", + "stderr_bytes": 0, + "stderr_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stdout_bytes": 14102, + "stdout_sha256": "22b70c360d2f9f55dffc8f78cc48fe04329a9ebf05ec34a1aa1c012729d3b70c", + "termination": null, + "usage": { + "exit": 0, + "kernel_max_rss_kib": 111784, + "system_seconds": 0.23, + "user_seconds": 33.36 + }, + "wall_seconds": 33.855156300996896 +} diff --git a/research/c-verification-feasibility/evidence/runs/integer-complete-B3/stderr.txt b/research/c-verification-feasibility/evidence/runs/integer-complete-B3/stderr.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/research/c-verification-feasibility/evidence/runs/integer-complete-B3/stdout.txt b/research/c-verification-feasibility/evidence/runs/integer-complete-B3/stdout.txt new file mode 100644 index 0000000000..5379d604b5 --- /dev/null +++ b/research/c-verification-feasibility/evidence/runs/integer-complete-B3/stdout.txt @@ -0,0 +1,9 @@ +{"all_complete_values_and_types_equal": true, "cases": 241, "controls": ["returned-mutation-isolated", "source-drift", "Fraction-type-drift", "module-byte-drift", "live-code-drift", "nested-live-code-drift", "omitted-witness", "omitted-rounded-sites", "wrong-coefficient", "wrong-weighted-increment", "bad-role", "bad-scalar", "missing-weight", "restore-success", "restore-exception", "fresh-derivation", "key-field-0", "key-field-1", "key-field-2", "key-field-3", "key-field-4", "FIFO-eviction", "canonical-key", "hash-collision", "disabled", "invalid-capacity--1", "invalid-capacity-16385", "invalid-capacity-True", "invalid-capacity-1.5", "uncached-exception-0", "uncached-exception-1", "fresh-call-table", "stats-mutation", "failed-call-clears-stats"], "events": 10164, "status": "PASS_FINITE_FRACTION_TABLE_FEASIBILITY"} +{"all_coverage_preserved": true, "inherited": {"all_complete_values_and_types_equal": true, "cases": 241, "controls": ["returned-mutation-isolated", "source-drift", "Fraction-type-drift", "module-byte-drift", "live-code-drift", "nested-live-code-drift", "omitted-witness", "omitted-rounded-sites", "wrong-coefficient", "wrong-weighted-increment", "bad-role", "bad-scalar", "missing-weight", "restore-success", "restore-exception", "fresh-derivation", "key-field-0", "key-field-1", "key-field-2", "key-field-3", "key-field-4", "FIFO-eviction", "canonical-key", "hash-collision", "disabled", "invalid-capacity--1", "invalid-capacity-16385", "invalid-capacity-True", "invalid-capacity-1.5", "uncached-exception-0", "uncached-exception-1", "fresh-call-table", "stats-mutation", "failed-call-clears-stats"], "events": 10164, "status": "PASS_FINITE_FRACTION_TABLE_FEASIBILITY"}, "new_control_count": 20, "new_controls": ["all-241-fixtures-take-certified-domain", "subtypes-and-foreign-types-fall-back-without-custom-methods", "metaclass-container", "metaclass-scalar", "original-fallback-dict-subclass", "original-fallback-program-subclass", "original-fallback-event-subclass", "original-fallback-weights-subclass", "original-fallback-row-subclass", "original-fallback-rounded-subclass", "original-fallback-Fraction-subclass", "original-fallback-integer-weights", "original-fallback-boolean-public", "exact-internal-type-preservation-at-certified-updates", "malformed-outcome-missing-weight", "malformed-outcome-bad-role", "malformed-outcome-bad-scalar", "malformed-outcome-short-event", "recertification-invalidates-certified-method", "disabled-capacity-not-certified"], "status": "PASS_TYPE_GATE_FINITE_FEASIBILITY"} +{"all_coverage_preserved": true, "inherited": {"all_coverage_preserved": true, "inherited": {"all_complete_values_and_types_equal": true, "cases": 241, "controls": ["returned-mutation-isolated", "source-drift", "Fraction-type-drift", "module-byte-drift", "live-code-drift", "nested-live-code-drift", "omitted-witness", "omitted-rounded-sites", "wrong-coefficient", "wrong-weighted-increment", "bad-role", "bad-scalar", "missing-weight", "restore-success", "restore-exception", "fresh-derivation", "key-field-0", "key-field-1", "key-field-2", "key-field-3", "key-field-4", "FIFO-eviction", "canonical-key", "hash-collision", "disabled", "invalid-capacity--1", "invalid-capacity-16385", "invalid-capacity-True", "invalid-capacity-1.5", "uncached-exception-0", "uncached-exception-1", "fresh-call-table", "stats-mutation", "failed-call-clears-stats"], "events": 10164, "status": "PASS_FINITE_FRACTION_TABLE_FEASIBILITY"}, "new_control_count": 20, "new_controls": ["all-241-fixtures-take-certified-domain", "subtypes-and-foreign-types-fall-back-without-custom-methods", "metaclass-container", "metaclass-scalar", "original-fallback-dict-subclass", "original-fallback-program-subclass", "original-fallback-event-subclass", "original-fallback-weights-subclass", "original-fallback-row-subclass", "original-fallback-rounded-subclass", "original-fallback-Fraction-subclass", "original-fallback-integer-weights", "original-fallback-boolean-public", "exact-internal-type-preservation-at-certified-updates", "malformed-outcome-missing-weight", "malformed-outcome-bad-role", "malformed-outcome-bad-scalar", "malformed-outcome-short-event", "recertification-invalidates-certified-method", "disabled-capacity-not-certified"], "status": "PASS_TYPE_GATE_FINITE_FEASIBILITY"}, "new_control_count": 9, "new_controls": ["canonical-full-pair-tokens", "weight-token-hash-collision", "bounded-context-overflow", "event-q-canonical-equality-and-FIFO-counters", "six-complete-trace-counter-and-type-comparisons", "source-site-weight-ownership", "wrong-token-alias-detected", "overflow-fallback-preserves-original", "fresh-token-and-cache-lifetimes"], "status": "PASS_COMPACT_KEY_FINITE_ONLY"} +{"all_coverage_preserved": true, "inherited": {"all_coverage_preserved": true, "inherited": {"all_coverage_preserved": true, "inherited": {"all_complete_values_and_types_equal": true, "cases": 241, "controls": ["returned-mutation-isolated", "source-drift", "Fraction-type-drift", "module-byte-drift", "live-code-drift", "nested-live-code-drift", "omitted-witness", "omitted-rounded-sites", "wrong-coefficient", "wrong-weighted-increment", "bad-role", "bad-scalar", "missing-weight", "restore-success", "restore-exception", "fresh-derivation", "key-field-0", "key-field-1", "key-field-2", "key-field-3", "key-field-4", "FIFO-eviction", "canonical-key", "hash-collision", "disabled", "invalid-capacity--1", "invalid-capacity-16385", "invalid-capacity-True", "invalid-capacity-1.5", "uncached-exception-0", "uncached-exception-1", "fresh-call-table", "stats-mutation", "failed-call-clears-stats"], "events": 10164, "status": "PASS_FINITE_FRACTION_TABLE_FEASIBILITY"}, "new_control_count": 20, "new_controls": ["all-241-fixtures-take-certified-domain", "subtypes-and-foreign-types-fall-back-without-custom-methods", "metaclass-container", "metaclass-scalar", "original-fallback-dict-subclass", "original-fallback-program-subclass", "original-fallback-event-subclass", "original-fallback-weights-subclass", "original-fallback-row-subclass", "original-fallback-rounded-subclass", "original-fallback-Fraction-subclass", "original-fallback-integer-weights", "original-fallback-boolean-public", "exact-internal-type-preservation-at-certified-updates", "malformed-outcome-missing-weight", "malformed-outcome-bad-role", "malformed-outcome-bad-scalar", "malformed-outcome-short-event", "recertification-invalidates-certified-method", "disabled-capacity-not-certified"], "status": "PASS_TYPE_GATE_FINITE_FEASIBILITY"}, "new_control_count": 9, "new_controls": ["canonical-full-pair-tokens", "weight-token-hash-collision", "bounded-context-overflow", "event-q-canonical-equality-and-FIFO-counters", "six-complete-trace-counter-and-type-comparisons", "source-site-weight-ownership", "wrong-token-alias-detected", "overflow-fallback-preserves-original", "fresh-token-and-cache-lifetimes"], "status": "PASS_COMPACT_KEY_FINITE_ONLY"}, "new_control_count": 10, "new_controls": ["changed-getter-invalidates", "changed-live-getter-code", "foreign-slot-probe-is-pure", "changed-attribute-lookup", "missing-attribute-handler-presence", "binding-restored", "slot-path-selected", "post-derive-getter-drift-literal-fallback", "uninitialized-unused-weight-fallback", "foreign-slot-value-fallback"], "status": "PASS_SLOT_KEY_FINITE_ONLY"} +{"all_coverage_preserved": true, "build": {"SOABI": "cpython-312-x86_64-linux-gnu", "binary_sha256": "171da0072e3bb80d835d7b24b61c550a477214c6dca71f36c1b8a4b21cac3072", "cold_build_load_wall_seconds": 0.6534075719828252, "compiler": "/usr/bin/cc", "compiler_cpu_accounting": "outer GNU time user+system includes compiler children", "compiler_version": "cc (Ubuntu 13.3.0-6ubuntu2~24.04.1) 13.3.0", "extension_suffix": ".cpython-312-x86_64-linux-gnu.so", "flags": ["-O2", "-shared", "-fPIC", "-std=c11", "-Wall", "-Werror", "-I/usr/include/python3.12"], "python": "3.12.3 (main, Aug 31 2026, 10:18:26) [GCC 13.3.0]", "source_sha256": "78ed2e240ee40ce4989a4718e77e8b3967b092d2bf8c900124a26942c98a14cb"}, "inherited": {"all_coverage_preserved": true, "inherited": {"all_coverage_preserved": true, "inherited": {"all_coverage_preserved": true, "inherited": {"all_complete_values_and_types_equal": true, "cases": 241, "controls": ["returned-mutation-isolated", "source-drift", "Fraction-type-drift", "module-byte-drift", "live-code-drift", "nested-live-code-drift", "omitted-witness", "omitted-rounded-sites", "wrong-coefficient", "wrong-weighted-increment", "bad-role", "bad-scalar", "missing-weight", "restore-success", "restore-exception", "fresh-derivation", "key-field-0", "key-field-1", "key-field-2", "key-field-3", "key-field-4", "FIFO-eviction", "canonical-key", "hash-collision", "disabled", "invalid-capacity--1", "invalid-capacity-16385", "invalid-capacity-True", "invalid-capacity-1.5", "uncached-exception-0", "uncached-exception-1", "fresh-call-table", "stats-mutation", "failed-call-clears-stats"], "events": 10164, "status": "PASS_FINITE_FRACTION_TABLE_FEASIBILITY"}, "new_control_count": 20, "new_controls": ["all-241-fixtures-take-certified-domain", "subtypes-and-foreign-types-fall-back-without-custom-methods", "metaclass-container", "metaclass-scalar", "original-fallback-dict-subclass", "original-fallback-program-subclass", "original-fallback-event-subclass", "original-fallback-weights-subclass", "original-fallback-row-subclass", "original-fallback-rounded-subclass", "original-fallback-Fraction-subclass", "original-fallback-integer-weights", "original-fallback-boolean-public", "exact-internal-type-preservation-at-certified-updates", "malformed-outcome-missing-weight", "malformed-outcome-bad-role", "malformed-outcome-bad-scalar", "malformed-outcome-short-event", "recertification-invalidates-certified-method", "disabled-capacity-not-certified"], "status": "PASS_TYPE_GATE_FINITE_FEASIBILITY"}, "new_control_count": 9, "new_controls": ["canonical-full-pair-tokens", "weight-token-hash-collision", "bounded-context-overflow", "event-q-canonical-equality-and-FIFO-counters", "six-complete-trace-counter-and-type-comparisons", "source-site-weight-ownership", "wrong-token-alias-detected", "overflow-fallback-preserves-original", "fresh-token-and-cache-lifetimes"], "status": "PASS_COMPACT_KEY_FINITE_ONLY"}, "new_control_count": 10, "new_controls": ["changed-getter-invalidates", "changed-live-getter-code", "foreign-slot-probe-is-pure", "changed-attribute-lookup", "missing-attribute-handler-presence", "binding-restored", "slot-path-selected", "post-derive-getter-drift-literal-fallback", "uninitialized-unused-weight-fallback", "foreign-slot-value-fallback"], "status": "PASS_SLOT_KEY_FINITE_ONLY"}, "native_control_count": 45, "native_controls": ["canonical-keys-FIFO-wrap-counters", "native-hash-collision", "exact-one-callback-per-miss", "uncached-native-error-0", "uncached-native-error-1", "full-cache-failure-before-eviction", "cache-survives-callback-exception", "capacity-0", "capacity--1", "capacity-16385", "capacity-True", "capacity-1.5", "capacity-10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "index--1", "index-3", "index-10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "index-True", "index-0", "arity", "keywords", "exact-operand", "exact-scalar", "event-creation", "descriptor-protocol", "token-length", "token-range", "partial-init-length", "partial-init-weight", "callback-result-shape", "callback-result-type", "callback-reentry", "event-owns-parent", "GC-callback-cycle", "native-statistics-isolated", "native-coefficient-loop", "same-row-lowlevel-rejection", "dict-iterator-mutation-safe", "callback-list-mutation-safe", "native-source-authenticated", "callback-descriptor-is-pure", "plain-callback-rejected", "live-callback-code-drift", "owned-metadata-snapshot", "same-row-source-fallback", "malformed-scalar-literal-fallback"], "status": "PASS_NATIVE_FINITE_ONLY"} +{"backends": 2, "controls": ["one-use", "closed-call", "missing", "duplicate", "changed-weights", "changed-rounding", "changed-word", "original-malformed-rejection", "propagated-exception", "failed-finish", "failed-take", "fresh-context-not-previous-pass", "aborted-take", "one-use", "closed-call", "missing", "duplicate", "changed-weights", "changed-rounding", "changed-word", "original-malformed-rejection", "propagated-exception", "failed-finish", "failed-take", "fresh-context-not-previous-pass", "aborted-take", "input-mutation"], "events": 5, "status": "PASS_FINITE_FEASIBILITY_ONLY"} +{"actual": {"output_sha256": "954c7448ff74d78753828e9623ad44c46da9e5ce459420b6e50a5d47294250b9", "statistics": {"bypasses": 0, "calls": 2579750, "capacity": 16384, "evictions": 310400, "hits": 2252966, "misses": 326784, "resident": 16384}, "tokens": 3587}, "build": {"SOABI": "cpython-312-x86_64-linux-gnu", "binary_sha256": "171da0072e3bb80d835d7b24b61c550a477214c6dca71f36c1b8a4b21cac3072", "cold_build_load_wall_seconds": 0.6534075719828252, "compiler": "/usr/bin/cc", "compiler_cpu_accounting": "outer GNU time user+system includes compiler children", "compiler_version": "cc (Ubuntu 13.3.0-6ubuntu2~24.04.1) 13.3.0", "extension_suffix": ".cpython-312-x86_64-linux-gnu.so", "flags": ["-O2", "-shared", "-fPIC", "-std=c11", "-Wall", "-Werror", "-I/usr/include/python3.12"], "python": "3.12.3 (main, Aug 31 2026, 10:18:26) [GCC 13.3.0]", "source_sha256": "78ed2e240ee40ce4989a4718e77e8b3967b092d2bf8c900124a26942c98a14cb"}, "compiler_children_charged": true, "integer_oracle_unchanged": true, "native_finite_included": true, "status": "PASS_COMPLETE_NATIVE_COVERAGE"} +PASS_P104_SINGLE_PASS_QUALIFICATION +{"mode": "qualify", "receipt": {"all_actual_witness_rows_equal": true, "coefficient_scale_bits": 55, "coordinates": 799, "events": 25984, "finite_fixtures": {"cases": 120, "controls": ["nondyadic scalar", "inexact scale division", "nondyadic weight"], "events": 4240}, "guards": {"owned": 22, "prefix": 26, "public": 23}, "source_controls": 6, "source_result_sha256": "cc7739703ed23532d187949c8507d09c13ac4c152e07a930f0087cde0d7a3d98"}, "seconds": 30.12237} diff --git a/research/c-verification-feasibility/evidence/runs/integer-complete-B3/usage.json b/research/c-verification-feasibility/evidence/runs/integer-complete-B3/usage.json new file mode 100644 index 0000000000..77cf061567 --- /dev/null +++ b/research/c-verification-feasibility/evidence/runs/integer-complete-B3/usage.json @@ -0,0 +1 @@ +{"user_seconds":33.36,"system_seconds":0.23,"kernel_max_rss_kib":111784,"exit":0} diff --git a/research/c-verification-feasibility/evidence/runs/integer-complete-C1/receipt.json b/research/c-verification-feasibility/evidence/runs/integer-complete-C1/receipt.json new file mode 100644 index 0000000000..5e0f1b1e12 --- /dev/null +++ b/research/c-verification-feasibility/evidence/runs/integer-complete-C1/receipt.json @@ -0,0 +1,26 @@ +{ + "exit": 0, + "label": "integer-complete-C1", + "optimized": false, + "platform": "Linux-7.0.0-38-generic-x86_64-with-glibc2.39", + "python": "3.12.3 (main, Aug 31 2026, 10:18:26) [GCC 13.3.0]", + "runner_sha256": "7540f8cc4ae4d12ed86c844ef0837a74184d3ada653979608c295c09f200a751", + "runtime_policy_sha256": "9b5c8f4d125a6fef058549e83c34b7fab656b569be059346ac2ee8b147057c99", + "sampled_process_group_rss_bytes": 118079488, + "script": "stages/integer-complete-v1/candidate_full.py", + "source_bytes_and_modes_unchanged": true, + "source_inventory_sha256": "cc42383ed2afc04b54af061eab285fc964a1a9d76461377a2fc6e29de9059dad", + "status": "PASS", + "stderr_bytes": 0, + "stderr_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stdout_bytes": 16672, + "stdout_sha256": "eae9f6db82a301166f3bc06b3cd2dc345ac1cced43b66791ac237c3eee5d9cf2", + "termination": null, + "usage": { + "exit": 0, + "kernel_max_rss_kib": 113860, + "system_seconds": 0.22, + "user_seconds": 34.1 + }, + "wall_seconds": 34.77152032399317 +} diff --git a/research/c-verification-feasibility/evidence/runs/integer-complete-C1/stderr.txt b/research/c-verification-feasibility/evidence/runs/integer-complete-C1/stderr.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/research/c-verification-feasibility/evidence/runs/integer-complete-C1/stdout.txt b/research/c-verification-feasibility/evidence/runs/integer-complete-C1/stdout.txt new file mode 100644 index 0000000000..a79e42bab2 --- /dev/null +++ b/research/c-verification-feasibility/evidence/runs/integer-complete-C1/stdout.txt @@ -0,0 +1,10 @@ +{"all_complete_values_and_types_equal": true, "cases": 241, "controls": ["returned-mutation-isolated", "source-drift", "Fraction-type-drift", "module-byte-drift", "live-code-drift", "nested-live-code-drift", "omitted-witness", "omitted-rounded-sites", "wrong-coefficient", "wrong-weighted-increment", "bad-role", "bad-scalar", "missing-weight", "restore-success", "restore-exception", "fresh-derivation", "key-field-0", "key-field-1", "key-field-2", "key-field-3", "key-field-4", "FIFO-eviction", "canonical-key", "hash-collision", "disabled", "invalid-capacity--1", "invalid-capacity-16385", "invalid-capacity-True", "invalid-capacity-1.5", "uncached-exception-0", "uncached-exception-1", "fresh-call-table", "stats-mutation", "failed-call-clears-stats"], "events": 10164, "status": "PASS_FINITE_FRACTION_TABLE_FEASIBILITY"} +{"all_coverage_preserved": true, "inherited": {"all_complete_values_and_types_equal": true, "cases": 241, "controls": ["returned-mutation-isolated", "source-drift", "Fraction-type-drift", "module-byte-drift", "live-code-drift", "nested-live-code-drift", "omitted-witness", "omitted-rounded-sites", "wrong-coefficient", "wrong-weighted-increment", "bad-role", "bad-scalar", "missing-weight", "restore-success", "restore-exception", "fresh-derivation", "key-field-0", "key-field-1", "key-field-2", "key-field-3", "key-field-4", "FIFO-eviction", "canonical-key", "hash-collision", "disabled", "invalid-capacity--1", "invalid-capacity-16385", "invalid-capacity-True", "invalid-capacity-1.5", "uncached-exception-0", "uncached-exception-1", "fresh-call-table", "stats-mutation", "failed-call-clears-stats"], "events": 10164, "status": "PASS_FINITE_FRACTION_TABLE_FEASIBILITY"}, "new_control_count": 20, "new_controls": ["all-241-fixtures-take-certified-domain", "subtypes-and-foreign-types-fall-back-without-custom-methods", "metaclass-container", "metaclass-scalar", "original-fallback-dict-subclass", "original-fallback-program-subclass", "original-fallback-event-subclass", "original-fallback-weights-subclass", "original-fallback-row-subclass", "original-fallback-rounded-subclass", "original-fallback-Fraction-subclass", "original-fallback-integer-weights", "original-fallback-boolean-public", "exact-internal-type-preservation-at-certified-updates", "malformed-outcome-missing-weight", "malformed-outcome-bad-role", "malformed-outcome-bad-scalar", "malformed-outcome-short-event", "recertification-invalidates-certified-method", "disabled-capacity-not-certified"], "status": "PASS_TYPE_GATE_FINITE_FEASIBILITY"} +{"all_coverage_preserved": true, "inherited": {"all_coverage_preserved": true, "inherited": {"all_complete_values_and_types_equal": true, "cases": 241, "controls": ["returned-mutation-isolated", "source-drift", "Fraction-type-drift", "module-byte-drift", "live-code-drift", "nested-live-code-drift", "omitted-witness", "omitted-rounded-sites", "wrong-coefficient", "wrong-weighted-increment", "bad-role", "bad-scalar", "missing-weight", "restore-success", "restore-exception", "fresh-derivation", "key-field-0", "key-field-1", "key-field-2", "key-field-3", "key-field-4", "FIFO-eviction", "canonical-key", "hash-collision", "disabled", "invalid-capacity--1", "invalid-capacity-16385", "invalid-capacity-True", "invalid-capacity-1.5", "uncached-exception-0", "uncached-exception-1", "fresh-call-table", "stats-mutation", "failed-call-clears-stats"], "events": 10164, "status": "PASS_FINITE_FRACTION_TABLE_FEASIBILITY"}, "new_control_count": 20, "new_controls": ["all-241-fixtures-take-certified-domain", "subtypes-and-foreign-types-fall-back-without-custom-methods", "metaclass-container", "metaclass-scalar", "original-fallback-dict-subclass", "original-fallback-program-subclass", "original-fallback-event-subclass", "original-fallback-weights-subclass", "original-fallback-row-subclass", "original-fallback-rounded-subclass", "original-fallback-Fraction-subclass", "original-fallback-integer-weights", "original-fallback-boolean-public", "exact-internal-type-preservation-at-certified-updates", "malformed-outcome-missing-weight", "malformed-outcome-bad-role", "malformed-outcome-bad-scalar", "malformed-outcome-short-event", "recertification-invalidates-certified-method", "disabled-capacity-not-certified"], "status": "PASS_TYPE_GATE_FINITE_FEASIBILITY"}, "new_control_count": 9, "new_controls": ["canonical-full-pair-tokens", "weight-token-hash-collision", "bounded-context-overflow", "event-q-canonical-equality-and-FIFO-counters", "six-complete-trace-counter-and-type-comparisons", "source-site-weight-ownership", "wrong-token-alias-detected", "overflow-fallback-preserves-original", "fresh-token-and-cache-lifetimes"], "status": "PASS_COMPACT_KEY_FINITE_ONLY"} +{"all_coverage_preserved": true, "inherited": {"all_coverage_preserved": true, "inherited": {"all_coverage_preserved": true, "inherited": {"all_complete_values_and_types_equal": true, "cases": 241, "controls": ["returned-mutation-isolated", "source-drift", "Fraction-type-drift", "module-byte-drift", "live-code-drift", "nested-live-code-drift", "omitted-witness", "omitted-rounded-sites", "wrong-coefficient", "wrong-weighted-increment", "bad-role", "bad-scalar", "missing-weight", "restore-success", "restore-exception", "fresh-derivation", "key-field-0", "key-field-1", "key-field-2", "key-field-3", "key-field-4", "FIFO-eviction", "canonical-key", "hash-collision", "disabled", "invalid-capacity--1", "invalid-capacity-16385", "invalid-capacity-True", "invalid-capacity-1.5", "uncached-exception-0", "uncached-exception-1", "fresh-call-table", "stats-mutation", "failed-call-clears-stats"], "events": 10164, "status": "PASS_FINITE_FRACTION_TABLE_FEASIBILITY"}, "new_control_count": 20, "new_controls": ["all-241-fixtures-take-certified-domain", "subtypes-and-foreign-types-fall-back-without-custom-methods", "metaclass-container", "metaclass-scalar", "original-fallback-dict-subclass", "original-fallback-program-subclass", "original-fallback-event-subclass", "original-fallback-weights-subclass", "original-fallback-row-subclass", "original-fallback-rounded-subclass", "original-fallback-Fraction-subclass", "original-fallback-integer-weights", "original-fallback-boolean-public", "exact-internal-type-preservation-at-certified-updates", "malformed-outcome-missing-weight", "malformed-outcome-bad-role", "malformed-outcome-bad-scalar", "malformed-outcome-short-event", "recertification-invalidates-certified-method", "disabled-capacity-not-certified"], "status": "PASS_TYPE_GATE_FINITE_FEASIBILITY"}, "new_control_count": 9, "new_controls": ["canonical-full-pair-tokens", "weight-token-hash-collision", "bounded-context-overflow", "event-q-canonical-equality-and-FIFO-counters", "six-complete-trace-counter-and-type-comparisons", "source-site-weight-ownership", "wrong-token-alias-detected", "overflow-fallback-preserves-original", "fresh-token-and-cache-lifetimes"], "status": "PASS_COMPACT_KEY_FINITE_ONLY"}, "new_control_count": 10, "new_controls": ["changed-getter-invalidates", "changed-live-getter-code", "foreign-slot-probe-is-pure", "changed-attribute-lookup", "missing-attribute-handler-presence", "binding-restored", "slot-path-selected", "post-derive-getter-drift-literal-fallback", "uninitialized-unused-weight-fallback", "foreign-slot-value-fallback"], "status": "PASS_SLOT_KEY_FINITE_ONLY"} +{"all_coverage_preserved": true, "build": {"SOABI": "cpython-312-x86_64-linux-gnu", "binary_sha256": "89dfa458845dc66c0327f01962161aba273f9e0ef3c7764c79c2cb0852bfacdb", "cold_build_load_wall_seconds": 0.32714867300819606, "compiler": "/usr/bin/cc", "compiler_cpu_accounting": "outer GNU time user+system includes compiler children", "compiler_version": "cc (Ubuntu 13.3.0-6ubuntu2~24.04.1) 13.3.0", "extension_suffix": ".cpython-312-x86_64-linux-gnu.so", "flags": ["-O2", "-shared", "-fPIC", "-std=c11", "-Wall", "-Werror", "-I/usr/include/python3.12"], "python": "3.12.3 (main, Aug 31 2026, 10:18:26) [GCC 13.3.0]", "source_sha256": "78ed2e240ee40ce4989a4718e77e8b3967b092d2bf8c900124a26942c98a14cb"}, "inherited": {"all_coverage_preserved": true, "inherited": {"all_coverage_preserved": true, "inherited": {"all_coverage_preserved": true, "inherited": {"all_complete_values_and_types_equal": true, "cases": 241, "controls": ["returned-mutation-isolated", "source-drift", "Fraction-type-drift", "module-byte-drift", "live-code-drift", "nested-live-code-drift", "omitted-witness", "omitted-rounded-sites", "wrong-coefficient", "wrong-weighted-increment", "bad-role", "bad-scalar", "missing-weight", "restore-success", "restore-exception", "fresh-derivation", "key-field-0", "key-field-1", "key-field-2", "key-field-3", "key-field-4", "FIFO-eviction", "canonical-key", "hash-collision", "disabled", "invalid-capacity--1", "invalid-capacity-16385", "invalid-capacity-True", "invalid-capacity-1.5", "uncached-exception-0", "uncached-exception-1", "fresh-call-table", "stats-mutation", "failed-call-clears-stats"], "events": 10164, "status": "PASS_FINITE_FRACTION_TABLE_FEASIBILITY"}, "new_control_count": 20, "new_controls": ["all-241-fixtures-take-certified-domain", "subtypes-and-foreign-types-fall-back-without-custom-methods", "metaclass-container", "metaclass-scalar", "original-fallback-dict-subclass", "original-fallback-program-subclass", "original-fallback-event-subclass", "original-fallback-weights-subclass", "original-fallback-row-subclass", "original-fallback-rounded-subclass", "original-fallback-Fraction-subclass", "original-fallback-integer-weights", "original-fallback-boolean-public", "exact-internal-type-preservation-at-certified-updates", "malformed-outcome-missing-weight", "malformed-outcome-bad-role", "malformed-outcome-bad-scalar", "malformed-outcome-short-event", "recertification-invalidates-certified-method", "disabled-capacity-not-certified"], "status": "PASS_TYPE_GATE_FINITE_FEASIBILITY"}, "new_control_count": 9, "new_controls": ["canonical-full-pair-tokens", "weight-token-hash-collision", "bounded-context-overflow", "event-q-canonical-equality-and-FIFO-counters", "six-complete-trace-counter-and-type-comparisons", "source-site-weight-ownership", "wrong-token-alias-detected", "overflow-fallback-preserves-original", "fresh-token-and-cache-lifetimes"], "status": "PASS_COMPACT_KEY_FINITE_ONLY"}, "new_control_count": 10, "new_controls": ["changed-getter-invalidates", "changed-live-getter-code", "foreign-slot-probe-is-pure", "changed-attribute-lookup", "missing-attribute-handler-presence", "binding-restored", "slot-path-selected", "post-derive-getter-drift-literal-fallback", "uninitialized-unused-weight-fallback", "foreign-slot-value-fallback"], "status": "PASS_SLOT_KEY_FINITE_ONLY"}, "native_control_count": 45, "native_controls": ["canonical-keys-FIFO-wrap-counters", "native-hash-collision", "exact-one-callback-per-miss", "uncached-native-error-0", "uncached-native-error-1", "full-cache-failure-before-eviction", "cache-survives-callback-exception", "capacity-0", "capacity--1", "capacity-16385", "capacity-True", "capacity-1.5", "capacity-10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "index--1", "index-3", "index-10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "index-True", "index-0", "arity", "keywords", "exact-operand", "exact-scalar", "event-creation", "descriptor-protocol", "token-length", "token-range", "partial-init-length", "partial-init-weight", "callback-result-shape", "callback-result-type", "callback-reentry", "event-owns-parent", "GC-callback-cycle", "native-statistics-isolated", "native-coefficient-loop", "same-row-lowlevel-rejection", "dict-iterator-mutation-safe", "callback-list-mutation-safe", "native-source-authenticated", "callback-descriptor-is-pure", "plain-callback-rejected", "live-callback-code-drift", "owned-metadata-snapshot", "same-row-source-fallback", "malformed-scalar-literal-fallback"], "status": "PASS_NATIVE_FINITE_ONLY"} +{"backends": 2, "controls": ["one-use", "closed-call", "missing", "duplicate", "changed-weights", "changed-rounding", "changed-word", "original-malformed-rejection", "propagated-exception", "failed-finish", "failed-take", "fresh-context-not-previous-pass", "aborted-take", "one-use", "closed-call", "missing", "duplicate", "changed-weights", "changed-rounding", "changed-word", "original-malformed-rejection", "propagated-exception", "failed-finish", "failed-take", "fresh-context-not-previous-pass", "aborted-take", "input-mutation"], "events": 5, "status": "PASS_FINITE_FEASIBILITY_ONLY"} +{"actual": {"output_sha256": "954c7448ff74d78753828e9623ad44c46da9e5ce459420b6e50a5d47294250b9", "statistics": {"bypasses": 0, "calls": 2579750, "capacity": 16384, "evictions": 310400, "hits": 2252966, "misses": 326784, "resident": 16384}, "tokens": 3587}, "baseline_fraction_arithmetic_unchanged": true, "build": {"SOABI": "cpython-312-x86_64-linux-gnu", "binary_sha256": "89dfa458845dc66c0327f01962161aba273f9e0ef3c7764c79c2cb0852bfacdb", "cold_build_load_wall_seconds": 0.32714867300819606, "compiler": "/usr/bin/cc", "compiler_cpu_accounting": "outer GNU time user+system includes compiler children", "compiler_version": "cc (Ubuntu 13.3.0-6ubuntu2~24.04.1) 13.3.0", "extension_suffix": ".cpython-312-x86_64-linux-gnu.so", "flags": ["-O2", "-shared", "-fPIC", "-std=c11", "-Wall", "-Werror", "-I/usr/include/python3.12"], "python": "3.12.3 (main, Aug 31 2026, 10:18:26) [GCC 13.3.0]", "source_sha256": "78ed2e240ee40ce4989a4718e77e8b3967b092d2bf8c900124a26942c98a14cb"}, "compiler_children_charged": true, "integer_backend_changed": true, "native_finite_included": true, "status": "PASS_COMPLETE_NATIVE_COVERAGE"} +PASS_P104_SINGLE_PASS_QUALIFICATION +{"mode": "qualify", "receipt": {"all_actual_witness_rows_equal": true, "coefficient_scale_bits": 55, "coordinates": 799, "events": 25984, "finite_fixtures": {"cases": 120, "controls": ["nondyadic scalar", "inexact scale division", "nondyadic weight"], "events": 4240}, "guards": {"owned": 22, "prefix": 26, "public": 23}, "source_controls": 6, "source_result_sha256": "cc7739703ed23532d187949c8507d09c13ac4c152e07a930f0087cde0d7a3d98"}, "seconds": 31.704104} +{"added_finite": {"checks": ["eight-row-and-score-differentials", "aliased-inputs-return-fresh-outputs", "six-ordered-prefixes-and-complete-bytes", "zero-negative-large-reduced-and-ordered-formatting", "score-string-contract-distinct-from-coefficient-contract", "reverse-scores-signed-bytes-and-aliases", "bool-numerator", "foreign-int-value", "foreign-dict", "foreign-key", "float-value", "negative-exponent", "bool-exponent", "inexact-division-transaction", "inexact-scaled-row", "nondyadic-scale", "zero-scale", "negative-scale", "bool-scale", "short-score", "foreign-scores", "foreign-weight", "weight-index-range", "negative-weight-index", "reverse-index-range", "score-nondyadic-unit", "event-type"], "independent_fraction_formatting": true, "ordered_prefixes": 6, "row_cases": 8, "status": "PASS_FINITE_INTEGER_FORMAT", "timing_claim": false, "whole_replay": false}, "fraction_backend": "unchanged PR5864 Python Fraction arithmetic and native bookkeeping", "integer_backend_changed": true, "native_integer_build": {"SOABI": "cpython-312-x86_64-linux-gnu", "binary_sha256": "2c269172566710bdfdcc4cf74980a53e893d87cb0530ca9f917cbddc4d66185a", "cold_build_load_wall_seconds": 0.34473578399047256, "compiler": "/usr/bin/cc", "compiler_cpu_accounting": "parent outer process must include compiler children", "extension_suffix": ".cpython-312-x86_64-linux-gnu.so", "flags": ["-O2", "-shared", "-fPIC", "-std=c11", "-Wall", "-Werror", "-I/usr/include/python3.12"], "python": "3.12.3 (main, Aug 31 2026, 10:18:26) [GCC 13.3.0]", "source_sha256": "804cc25bd9ad0912de81fe97bc65b95ebcb0dec06453739e1d4863e7946c4f3d"}, "source_binding": {"changes": [{"count": 1, "name": "fresh-native-sparse-add"}, {"count": 1, "name": "ideal-adopts-fresh-row"}, {"count": 2, "name": "ideal-and-error-native-scale"}, {"count": 1, "name": "native-signed-error-row-and-scores"}, {"count": 1, "name": "exact-three-score-stream-bytes"}, {"count": 1, "name": "full-descending-coefficient-bytes"}, {"count": 1, "name": "native-reverse-scores-and-signed-byte-chunks"}, {"count": 1, "name": "reverse-native-scale"}, {"count": 1, "name": "reverse-adopts-fresh-row"}], "derived_integer_sha256": "93c9212e9f014ef5cc84ce2d2c4b7b61fd81b2ffc12b73d5c54fffb0d58e713e", "fraction_reference_module_modified": false, "integer_backend_changed": true, "original_integer_sha256": "82a73e4bcf1835bfdd510c7ad5538625c1b380c559b671e6a67be490615a743a", "source_only_handoff": true, "whole_replay_qualified": false}, "status": "PASS_COMPLETE_INTEGER_FORMAT_CANDIDATE"} diff --git a/research/c-verification-feasibility/evidence/runs/integer-complete-C1/usage.json b/research/c-verification-feasibility/evidence/runs/integer-complete-C1/usage.json new file mode 100644 index 0000000000..92c77db67d --- /dev/null +++ b/research/c-verification-feasibility/evidence/runs/integer-complete-C1/usage.json @@ -0,0 +1 @@ +{"user_seconds":34.10,"system_seconds":0.22,"kernel_max_rss_kib":113860,"exit":0} diff --git a/research/c-verification-feasibility/evidence/runs/integer-complete-C2/receipt.json b/research/c-verification-feasibility/evidence/runs/integer-complete-C2/receipt.json new file mode 100644 index 0000000000..952003f4b9 --- /dev/null +++ b/research/c-verification-feasibility/evidence/runs/integer-complete-C2/receipt.json @@ -0,0 +1,26 @@ +{ + "exit": 0, + "label": "integer-complete-C2", + "optimized": false, + "platform": "Linux-7.0.0-38-generic-x86_64-with-glibc2.39", + "python": "3.12.3 (main, Aug 31 2026, 10:18:26) [GCC 13.3.0]", + "runner_sha256": "7540f8cc4ae4d12ed86c844ef0837a74184d3ada653979608c295c09f200a751", + "runtime_policy_sha256": "9b5c8f4d125a6fef058549e83c34b7fab656b569be059346ac2ee8b147057c99", + "sampled_process_group_rss_bytes": 117424128, + "script": "stages/integer-complete-v1/candidate_full.py", + "source_bytes_and_modes_unchanged": true, + "source_inventory_sha256": "cc42383ed2afc04b54af061eab285fc964a1a9d76461377a2fc6e29de9059dad", + "status": "PASS", + "stderr_bytes": 0, + "stderr_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stdout_bytes": 16669, + "stdout_sha256": "f6ddbfcf55e5b8b67ef61cccf8d11d1d2197a5ccfd8e798c8b0b2ff623d7b7e0", + "termination": null, + "usage": { + "exit": 0, + "kernel_max_rss_kib": 113220, + "system_seconds": 0.23, + "user_seconds": 32.1 + }, + "wall_seconds": 32.41877781198127 +} diff --git a/research/c-verification-feasibility/evidence/runs/integer-complete-C2/stderr.txt b/research/c-verification-feasibility/evidence/runs/integer-complete-C2/stderr.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/research/c-verification-feasibility/evidence/runs/integer-complete-C2/stdout.txt b/research/c-verification-feasibility/evidence/runs/integer-complete-C2/stdout.txt new file mode 100644 index 0000000000..cea40797b5 --- /dev/null +++ b/research/c-verification-feasibility/evidence/runs/integer-complete-C2/stdout.txt @@ -0,0 +1,10 @@ +{"all_complete_values_and_types_equal": true, "cases": 241, "controls": ["returned-mutation-isolated", "source-drift", "Fraction-type-drift", "module-byte-drift", "live-code-drift", "nested-live-code-drift", "omitted-witness", "omitted-rounded-sites", "wrong-coefficient", "wrong-weighted-increment", "bad-role", "bad-scalar", "missing-weight", "restore-success", "restore-exception", "fresh-derivation", "key-field-0", "key-field-1", "key-field-2", "key-field-3", "key-field-4", "FIFO-eviction", "canonical-key", "hash-collision", "disabled", "invalid-capacity--1", "invalid-capacity-16385", "invalid-capacity-True", "invalid-capacity-1.5", "uncached-exception-0", "uncached-exception-1", "fresh-call-table", "stats-mutation", "failed-call-clears-stats"], "events": 10164, "status": "PASS_FINITE_FRACTION_TABLE_FEASIBILITY"} +{"all_coverage_preserved": true, "inherited": {"all_complete_values_and_types_equal": true, "cases": 241, "controls": ["returned-mutation-isolated", "source-drift", "Fraction-type-drift", "module-byte-drift", "live-code-drift", "nested-live-code-drift", "omitted-witness", "omitted-rounded-sites", "wrong-coefficient", "wrong-weighted-increment", "bad-role", "bad-scalar", "missing-weight", "restore-success", "restore-exception", "fresh-derivation", "key-field-0", "key-field-1", "key-field-2", "key-field-3", "key-field-4", "FIFO-eviction", "canonical-key", "hash-collision", "disabled", "invalid-capacity--1", "invalid-capacity-16385", "invalid-capacity-True", "invalid-capacity-1.5", "uncached-exception-0", "uncached-exception-1", "fresh-call-table", "stats-mutation", "failed-call-clears-stats"], "events": 10164, "status": "PASS_FINITE_FRACTION_TABLE_FEASIBILITY"}, "new_control_count": 20, "new_controls": ["all-241-fixtures-take-certified-domain", "subtypes-and-foreign-types-fall-back-without-custom-methods", "metaclass-container", "metaclass-scalar", "original-fallback-dict-subclass", "original-fallback-program-subclass", "original-fallback-event-subclass", "original-fallback-weights-subclass", "original-fallback-row-subclass", "original-fallback-rounded-subclass", "original-fallback-Fraction-subclass", "original-fallback-integer-weights", "original-fallback-boolean-public", "exact-internal-type-preservation-at-certified-updates", "malformed-outcome-missing-weight", "malformed-outcome-bad-role", "malformed-outcome-bad-scalar", "malformed-outcome-short-event", "recertification-invalidates-certified-method", "disabled-capacity-not-certified"], "status": "PASS_TYPE_GATE_FINITE_FEASIBILITY"} +{"all_coverage_preserved": true, "inherited": {"all_coverage_preserved": true, "inherited": {"all_complete_values_and_types_equal": true, "cases": 241, "controls": ["returned-mutation-isolated", "source-drift", "Fraction-type-drift", "module-byte-drift", "live-code-drift", "nested-live-code-drift", "omitted-witness", "omitted-rounded-sites", "wrong-coefficient", "wrong-weighted-increment", "bad-role", "bad-scalar", "missing-weight", "restore-success", "restore-exception", "fresh-derivation", "key-field-0", "key-field-1", "key-field-2", "key-field-3", "key-field-4", "FIFO-eviction", "canonical-key", "hash-collision", "disabled", "invalid-capacity--1", "invalid-capacity-16385", "invalid-capacity-True", "invalid-capacity-1.5", "uncached-exception-0", "uncached-exception-1", "fresh-call-table", "stats-mutation", "failed-call-clears-stats"], "events": 10164, "status": "PASS_FINITE_FRACTION_TABLE_FEASIBILITY"}, "new_control_count": 20, "new_controls": ["all-241-fixtures-take-certified-domain", "subtypes-and-foreign-types-fall-back-without-custom-methods", "metaclass-container", "metaclass-scalar", "original-fallback-dict-subclass", "original-fallback-program-subclass", "original-fallback-event-subclass", "original-fallback-weights-subclass", "original-fallback-row-subclass", "original-fallback-rounded-subclass", "original-fallback-Fraction-subclass", "original-fallback-integer-weights", "original-fallback-boolean-public", "exact-internal-type-preservation-at-certified-updates", "malformed-outcome-missing-weight", "malformed-outcome-bad-role", "malformed-outcome-bad-scalar", "malformed-outcome-short-event", "recertification-invalidates-certified-method", "disabled-capacity-not-certified"], "status": "PASS_TYPE_GATE_FINITE_FEASIBILITY"}, "new_control_count": 9, "new_controls": ["canonical-full-pair-tokens", "weight-token-hash-collision", "bounded-context-overflow", "event-q-canonical-equality-and-FIFO-counters", "six-complete-trace-counter-and-type-comparisons", "source-site-weight-ownership", "wrong-token-alias-detected", "overflow-fallback-preserves-original", "fresh-token-and-cache-lifetimes"], "status": "PASS_COMPACT_KEY_FINITE_ONLY"} +{"all_coverage_preserved": true, "inherited": {"all_coverage_preserved": true, "inherited": {"all_coverage_preserved": true, "inherited": {"all_complete_values_and_types_equal": true, "cases": 241, "controls": ["returned-mutation-isolated", "source-drift", "Fraction-type-drift", "module-byte-drift", "live-code-drift", "nested-live-code-drift", "omitted-witness", "omitted-rounded-sites", "wrong-coefficient", "wrong-weighted-increment", "bad-role", "bad-scalar", "missing-weight", "restore-success", "restore-exception", "fresh-derivation", "key-field-0", "key-field-1", "key-field-2", "key-field-3", "key-field-4", "FIFO-eviction", "canonical-key", "hash-collision", "disabled", "invalid-capacity--1", "invalid-capacity-16385", "invalid-capacity-True", "invalid-capacity-1.5", "uncached-exception-0", "uncached-exception-1", "fresh-call-table", "stats-mutation", "failed-call-clears-stats"], "events": 10164, "status": "PASS_FINITE_FRACTION_TABLE_FEASIBILITY"}, "new_control_count": 20, "new_controls": ["all-241-fixtures-take-certified-domain", "subtypes-and-foreign-types-fall-back-without-custom-methods", "metaclass-container", "metaclass-scalar", "original-fallback-dict-subclass", "original-fallback-program-subclass", "original-fallback-event-subclass", "original-fallback-weights-subclass", "original-fallback-row-subclass", "original-fallback-rounded-subclass", "original-fallback-Fraction-subclass", "original-fallback-integer-weights", "original-fallback-boolean-public", "exact-internal-type-preservation-at-certified-updates", "malformed-outcome-missing-weight", "malformed-outcome-bad-role", "malformed-outcome-bad-scalar", "malformed-outcome-short-event", "recertification-invalidates-certified-method", "disabled-capacity-not-certified"], "status": "PASS_TYPE_GATE_FINITE_FEASIBILITY"}, "new_control_count": 9, "new_controls": ["canonical-full-pair-tokens", "weight-token-hash-collision", "bounded-context-overflow", "event-q-canonical-equality-and-FIFO-counters", "six-complete-trace-counter-and-type-comparisons", "source-site-weight-ownership", "wrong-token-alias-detected", "overflow-fallback-preserves-original", "fresh-token-and-cache-lifetimes"], "status": "PASS_COMPACT_KEY_FINITE_ONLY"}, "new_control_count": 10, "new_controls": ["changed-getter-invalidates", "changed-live-getter-code", "foreign-slot-probe-is-pure", "changed-attribute-lookup", "missing-attribute-handler-presence", "binding-restored", "slot-path-selected", "post-derive-getter-drift-literal-fallback", "uninitialized-unused-weight-fallback", "foreign-slot-value-fallback"], "status": "PASS_SLOT_KEY_FINITE_ONLY"} +{"all_coverage_preserved": true, "build": {"SOABI": "cpython-312-x86_64-linux-gnu", "binary_sha256": "bc2f71ff301f44d3488a492f7823a71fcf9611e88aa51773953072d7b9897941", "cold_build_load_wall_seconds": 0.3109650560072623, "compiler": "/usr/bin/cc", "compiler_cpu_accounting": "outer GNU time user+system includes compiler children", "compiler_version": "cc (Ubuntu 13.3.0-6ubuntu2~24.04.1) 13.3.0", "extension_suffix": ".cpython-312-x86_64-linux-gnu.so", "flags": ["-O2", "-shared", "-fPIC", "-std=c11", "-Wall", "-Werror", "-I/usr/include/python3.12"], "python": "3.12.3 (main, Aug 31 2026, 10:18:26) [GCC 13.3.0]", "source_sha256": "78ed2e240ee40ce4989a4718e77e8b3967b092d2bf8c900124a26942c98a14cb"}, "inherited": {"all_coverage_preserved": true, "inherited": {"all_coverage_preserved": true, "inherited": {"all_coverage_preserved": true, "inherited": {"all_complete_values_and_types_equal": true, "cases": 241, "controls": ["returned-mutation-isolated", "source-drift", "Fraction-type-drift", "module-byte-drift", "live-code-drift", "nested-live-code-drift", "omitted-witness", "omitted-rounded-sites", "wrong-coefficient", "wrong-weighted-increment", "bad-role", "bad-scalar", "missing-weight", "restore-success", "restore-exception", "fresh-derivation", "key-field-0", "key-field-1", "key-field-2", "key-field-3", "key-field-4", "FIFO-eviction", "canonical-key", "hash-collision", "disabled", "invalid-capacity--1", "invalid-capacity-16385", "invalid-capacity-True", "invalid-capacity-1.5", "uncached-exception-0", "uncached-exception-1", "fresh-call-table", "stats-mutation", "failed-call-clears-stats"], "events": 10164, "status": "PASS_FINITE_FRACTION_TABLE_FEASIBILITY"}, "new_control_count": 20, "new_controls": ["all-241-fixtures-take-certified-domain", "subtypes-and-foreign-types-fall-back-without-custom-methods", "metaclass-container", "metaclass-scalar", "original-fallback-dict-subclass", "original-fallback-program-subclass", "original-fallback-event-subclass", "original-fallback-weights-subclass", "original-fallback-row-subclass", "original-fallback-rounded-subclass", "original-fallback-Fraction-subclass", "original-fallback-integer-weights", "original-fallback-boolean-public", "exact-internal-type-preservation-at-certified-updates", "malformed-outcome-missing-weight", "malformed-outcome-bad-role", "malformed-outcome-bad-scalar", "malformed-outcome-short-event", "recertification-invalidates-certified-method", "disabled-capacity-not-certified"], "status": "PASS_TYPE_GATE_FINITE_FEASIBILITY"}, "new_control_count": 9, "new_controls": ["canonical-full-pair-tokens", "weight-token-hash-collision", "bounded-context-overflow", "event-q-canonical-equality-and-FIFO-counters", "six-complete-trace-counter-and-type-comparisons", "source-site-weight-ownership", "wrong-token-alias-detected", "overflow-fallback-preserves-original", "fresh-token-and-cache-lifetimes"], "status": "PASS_COMPACT_KEY_FINITE_ONLY"}, "new_control_count": 10, "new_controls": ["changed-getter-invalidates", "changed-live-getter-code", "foreign-slot-probe-is-pure", "changed-attribute-lookup", "missing-attribute-handler-presence", "binding-restored", "slot-path-selected", "post-derive-getter-drift-literal-fallback", "uninitialized-unused-weight-fallback", "foreign-slot-value-fallback"], "status": "PASS_SLOT_KEY_FINITE_ONLY"}, "native_control_count": 45, "native_controls": ["canonical-keys-FIFO-wrap-counters", "native-hash-collision", "exact-one-callback-per-miss", "uncached-native-error-0", "uncached-native-error-1", "full-cache-failure-before-eviction", "cache-survives-callback-exception", "capacity-0", "capacity--1", "capacity-16385", "capacity-True", "capacity-1.5", "capacity-10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "index--1", "index-3", "index-10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "index-True", "index-0", "arity", "keywords", "exact-operand", "exact-scalar", "event-creation", "descriptor-protocol", "token-length", "token-range", "partial-init-length", "partial-init-weight", "callback-result-shape", "callback-result-type", "callback-reentry", "event-owns-parent", "GC-callback-cycle", "native-statistics-isolated", "native-coefficient-loop", "same-row-lowlevel-rejection", "dict-iterator-mutation-safe", "callback-list-mutation-safe", "native-source-authenticated", "callback-descriptor-is-pure", "plain-callback-rejected", "live-callback-code-drift", "owned-metadata-snapshot", "same-row-source-fallback", "malformed-scalar-literal-fallback"], "status": "PASS_NATIVE_FINITE_ONLY"} +{"backends": 2, "controls": ["one-use", "closed-call", "missing", "duplicate", "changed-weights", "changed-rounding", "changed-word", "original-malformed-rejection", "propagated-exception", "failed-finish", "failed-take", "fresh-context-not-previous-pass", "aborted-take", "one-use", "closed-call", "missing", "duplicate", "changed-weights", "changed-rounding", "changed-word", "original-malformed-rejection", "propagated-exception", "failed-finish", "failed-take", "fresh-context-not-previous-pass", "aborted-take", "input-mutation"], "events": 5, "status": "PASS_FINITE_FEASIBILITY_ONLY"} +{"actual": {"output_sha256": "954c7448ff74d78753828e9623ad44c46da9e5ce459420b6e50a5d47294250b9", "statistics": {"bypasses": 0, "calls": 2579750, "capacity": 16384, "evictions": 310400, "hits": 2252966, "misses": 326784, "resident": 16384}, "tokens": 3587}, "baseline_fraction_arithmetic_unchanged": true, "build": {"SOABI": "cpython-312-x86_64-linux-gnu", "binary_sha256": "bc2f71ff301f44d3488a492f7823a71fcf9611e88aa51773953072d7b9897941", "cold_build_load_wall_seconds": 0.3109650560072623, "compiler": "/usr/bin/cc", "compiler_cpu_accounting": "outer GNU time user+system includes compiler children", "compiler_version": "cc (Ubuntu 13.3.0-6ubuntu2~24.04.1) 13.3.0", "extension_suffix": ".cpython-312-x86_64-linux-gnu.so", "flags": ["-O2", "-shared", "-fPIC", "-std=c11", "-Wall", "-Werror", "-I/usr/include/python3.12"], "python": "3.12.3 (main, Aug 31 2026, 10:18:26) [GCC 13.3.0]", "source_sha256": "78ed2e240ee40ce4989a4718e77e8b3967b092d2bf8c900124a26942c98a14cb"}, "compiler_children_charged": true, "integer_backend_changed": true, "native_finite_included": true, "status": "PASS_COMPLETE_NATIVE_COVERAGE"} +PASS_P104_SINGLE_PASS_QUALIFICATION +{"mode": "qualify", "receipt": {"all_actual_witness_rows_equal": true, "coefficient_scale_bits": 55, "coordinates": 799, "events": 25984, "finite_fixtures": {"cases": 120, "controls": ["nondyadic scalar", "inexact scale division", "nondyadic weight"], "events": 4240}, "guards": {"owned": 22, "prefix": 26, "public": 23}, "source_controls": 6, "source_result_sha256": "cc7739703ed23532d187949c8507d09c13ac4c152e07a930f0087cde0d7a3d98"}, "seconds": 29.273319} +{"added_finite": {"checks": ["eight-row-and-score-differentials", "aliased-inputs-return-fresh-outputs", "six-ordered-prefixes-and-complete-bytes", "zero-negative-large-reduced-and-ordered-formatting", "score-string-contract-distinct-from-coefficient-contract", "reverse-scores-signed-bytes-and-aliases", "bool-numerator", "foreign-int-value", "foreign-dict", "foreign-key", "float-value", "negative-exponent", "bool-exponent", "inexact-division-transaction", "inexact-scaled-row", "nondyadic-scale", "zero-scale", "negative-scale", "bool-scale", "short-score", "foreign-scores", "foreign-weight", "weight-index-range", "negative-weight-index", "reverse-index-range", "score-nondyadic-unit", "event-type"], "independent_fraction_formatting": true, "ordered_prefixes": 6, "row_cases": 8, "status": "PASS_FINITE_INTEGER_FORMAT", "timing_claim": false, "whole_replay": false}, "fraction_backend": "unchanged PR5864 Python Fraction arithmetic and native bookkeeping", "integer_backend_changed": true, "native_integer_build": {"SOABI": "cpython-312-x86_64-linux-gnu", "binary_sha256": "8020394e06802c5bcf4a444f621ab6bc7cf6fd4a64ca6edfaa5864378d499873", "cold_build_load_wall_seconds": 0.3771791290200781, "compiler": "/usr/bin/cc", "compiler_cpu_accounting": "parent outer process must include compiler children", "extension_suffix": ".cpython-312-x86_64-linux-gnu.so", "flags": ["-O2", "-shared", "-fPIC", "-std=c11", "-Wall", "-Werror", "-I/usr/include/python3.12"], "python": "3.12.3 (main, Aug 31 2026, 10:18:26) [GCC 13.3.0]", "source_sha256": "804cc25bd9ad0912de81fe97bc65b95ebcb0dec06453739e1d4863e7946c4f3d"}, "source_binding": {"changes": [{"count": 1, "name": "fresh-native-sparse-add"}, {"count": 1, "name": "ideal-adopts-fresh-row"}, {"count": 2, "name": "ideal-and-error-native-scale"}, {"count": 1, "name": "native-signed-error-row-and-scores"}, {"count": 1, "name": "exact-three-score-stream-bytes"}, {"count": 1, "name": "full-descending-coefficient-bytes"}, {"count": 1, "name": "native-reverse-scores-and-signed-byte-chunks"}, {"count": 1, "name": "reverse-native-scale"}, {"count": 1, "name": "reverse-adopts-fresh-row"}], "derived_integer_sha256": "93c9212e9f014ef5cc84ce2d2c4b7b61fd81b2ffc12b73d5c54fffb0d58e713e", "fraction_reference_module_modified": false, "integer_backend_changed": true, "original_integer_sha256": "82a73e4bcf1835bfdd510c7ad5538625c1b380c559b671e6a67be490615a743a", "source_only_handoff": true, "whole_replay_qualified": false}, "status": "PASS_COMPLETE_INTEGER_FORMAT_CANDIDATE"} diff --git a/research/c-verification-feasibility/evidence/runs/integer-complete-C2/usage.json b/research/c-verification-feasibility/evidence/runs/integer-complete-C2/usage.json new file mode 100644 index 0000000000..1004bc864c --- /dev/null +++ b/research/c-verification-feasibility/evidence/runs/integer-complete-C2/usage.json @@ -0,0 +1 @@ +{"user_seconds":32.10,"system_seconds":0.23,"kernel_max_rss_kib":113220,"exit":0} diff --git a/research/c-verification-feasibility/evidence/runs/integer-complete-C3/receipt.json b/research/c-verification-feasibility/evidence/runs/integer-complete-C3/receipt.json new file mode 100644 index 0000000000..788809b382 --- /dev/null +++ b/research/c-verification-feasibility/evidence/runs/integer-complete-C3/receipt.json @@ -0,0 +1,26 @@ +{ + "exit": 0, + "label": "integer-complete-C3", + "optimized": false, + "platform": "Linux-7.0.0-38-generic-x86_64-with-glibc2.39", + "python": "3.12.3 (main, Aug 31 2026, 10:18:26) [GCC 13.3.0]", + "runner_sha256": "7540f8cc4ae4d12ed86c844ef0837a74184d3ada653979608c295c09f200a751", + "runtime_policy_sha256": "9b5c8f4d125a6fef058549e83c34b7fab656b569be059346ac2ee8b147057c99", + "sampled_process_group_rss_bytes": 117526528, + "script": "stages/integer-complete-v1/candidate_full.py", + "source_bytes_and_modes_unchanged": true, + "source_inventory_sha256": "cc42383ed2afc04b54af061eab285fc964a1a9d76461377a2fc6e29de9059dad", + "status": "PASS", + "stderr_bytes": 0, + "stderr_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stdout_bytes": 16669, + "stdout_sha256": "211e17a57b1da28522c7b06b62b22bc6453ffe83a76704e7c56ec4db179de509", + "termination": null, + "usage": { + "exit": 0, + "kernel_max_rss_kib": 113320, + "system_seconds": 0.23, + "user_seconds": 31.74 + }, + "wall_seconds": 32.05788308600313 +} diff --git a/research/c-verification-feasibility/evidence/runs/integer-complete-C3/stderr.txt b/research/c-verification-feasibility/evidence/runs/integer-complete-C3/stderr.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/research/c-verification-feasibility/evidence/runs/integer-complete-C3/stdout.txt b/research/c-verification-feasibility/evidence/runs/integer-complete-C3/stdout.txt new file mode 100644 index 0000000000..d07456d76e --- /dev/null +++ b/research/c-verification-feasibility/evidence/runs/integer-complete-C3/stdout.txt @@ -0,0 +1,10 @@ +{"all_complete_values_and_types_equal": true, "cases": 241, "controls": ["returned-mutation-isolated", "source-drift", "Fraction-type-drift", "module-byte-drift", "live-code-drift", "nested-live-code-drift", "omitted-witness", "omitted-rounded-sites", "wrong-coefficient", "wrong-weighted-increment", "bad-role", "bad-scalar", "missing-weight", "restore-success", "restore-exception", "fresh-derivation", "key-field-0", "key-field-1", "key-field-2", "key-field-3", "key-field-4", "FIFO-eviction", "canonical-key", "hash-collision", "disabled", "invalid-capacity--1", "invalid-capacity-16385", "invalid-capacity-True", "invalid-capacity-1.5", "uncached-exception-0", "uncached-exception-1", "fresh-call-table", "stats-mutation", "failed-call-clears-stats"], "events": 10164, "status": "PASS_FINITE_FRACTION_TABLE_FEASIBILITY"} +{"all_coverage_preserved": true, "inherited": {"all_complete_values_and_types_equal": true, "cases": 241, "controls": ["returned-mutation-isolated", "source-drift", "Fraction-type-drift", "module-byte-drift", "live-code-drift", "nested-live-code-drift", "omitted-witness", "omitted-rounded-sites", "wrong-coefficient", "wrong-weighted-increment", "bad-role", "bad-scalar", "missing-weight", "restore-success", "restore-exception", "fresh-derivation", "key-field-0", "key-field-1", "key-field-2", "key-field-3", "key-field-4", "FIFO-eviction", "canonical-key", "hash-collision", "disabled", "invalid-capacity--1", "invalid-capacity-16385", "invalid-capacity-True", "invalid-capacity-1.5", "uncached-exception-0", "uncached-exception-1", "fresh-call-table", "stats-mutation", "failed-call-clears-stats"], "events": 10164, "status": "PASS_FINITE_FRACTION_TABLE_FEASIBILITY"}, "new_control_count": 20, "new_controls": ["all-241-fixtures-take-certified-domain", "subtypes-and-foreign-types-fall-back-without-custom-methods", "metaclass-container", "metaclass-scalar", "original-fallback-dict-subclass", "original-fallback-program-subclass", "original-fallback-event-subclass", "original-fallback-weights-subclass", "original-fallback-row-subclass", "original-fallback-rounded-subclass", "original-fallback-Fraction-subclass", "original-fallback-integer-weights", "original-fallback-boolean-public", "exact-internal-type-preservation-at-certified-updates", "malformed-outcome-missing-weight", "malformed-outcome-bad-role", "malformed-outcome-bad-scalar", "malformed-outcome-short-event", "recertification-invalidates-certified-method", "disabled-capacity-not-certified"], "status": "PASS_TYPE_GATE_FINITE_FEASIBILITY"} +{"all_coverage_preserved": true, "inherited": {"all_coverage_preserved": true, "inherited": {"all_complete_values_and_types_equal": true, "cases": 241, "controls": ["returned-mutation-isolated", "source-drift", "Fraction-type-drift", "module-byte-drift", "live-code-drift", "nested-live-code-drift", "omitted-witness", "omitted-rounded-sites", "wrong-coefficient", "wrong-weighted-increment", "bad-role", "bad-scalar", "missing-weight", "restore-success", "restore-exception", "fresh-derivation", "key-field-0", "key-field-1", "key-field-2", "key-field-3", "key-field-4", "FIFO-eviction", "canonical-key", "hash-collision", "disabled", "invalid-capacity--1", "invalid-capacity-16385", "invalid-capacity-True", "invalid-capacity-1.5", "uncached-exception-0", "uncached-exception-1", "fresh-call-table", "stats-mutation", "failed-call-clears-stats"], "events": 10164, "status": "PASS_FINITE_FRACTION_TABLE_FEASIBILITY"}, "new_control_count": 20, "new_controls": ["all-241-fixtures-take-certified-domain", "subtypes-and-foreign-types-fall-back-without-custom-methods", "metaclass-container", "metaclass-scalar", "original-fallback-dict-subclass", "original-fallback-program-subclass", "original-fallback-event-subclass", "original-fallback-weights-subclass", "original-fallback-row-subclass", "original-fallback-rounded-subclass", "original-fallback-Fraction-subclass", "original-fallback-integer-weights", "original-fallback-boolean-public", "exact-internal-type-preservation-at-certified-updates", "malformed-outcome-missing-weight", "malformed-outcome-bad-role", "malformed-outcome-bad-scalar", "malformed-outcome-short-event", "recertification-invalidates-certified-method", "disabled-capacity-not-certified"], "status": "PASS_TYPE_GATE_FINITE_FEASIBILITY"}, "new_control_count": 9, "new_controls": ["canonical-full-pair-tokens", "weight-token-hash-collision", "bounded-context-overflow", "event-q-canonical-equality-and-FIFO-counters", "six-complete-trace-counter-and-type-comparisons", "source-site-weight-ownership", "wrong-token-alias-detected", "overflow-fallback-preserves-original", "fresh-token-and-cache-lifetimes"], "status": "PASS_COMPACT_KEY_FINITE_ONLY"} +{"all_coverage_preserved": true, "inherited": {"all_coverage_preserved": true, "inherited": {"all_coverage_preserved": true, "inherited": {"all_complete_values_and_types_equal": true, "cases": 241, "controls": ["returned-mutation-isolated", "source-drift", "Fraction-type-drift", "module-byte-drift", "live-code-drift", "nested-live-code-drift", "omitted-witness", "omitted-rounded-sites", "wrong-coefficient", "wrong-weighted-increment", "bad-role", "bad-scalar", "missing-weight", "restore-success", "restore-exception", "fresh-derivation", "key-field-0", "key-field-1", "key-field-2", "key-field-3", "key-field-4", "FIFO-eviction", "canonical-key", "hash-collision", "disabled", "invalid-capacity--1", "invalid-capacity-16385", "invalid-capacity-True", "invalid-capacity-1.5", "uncached-exception-0", "uncached-exception-1", "fresh-call-table", "stats-mutation", "failed-call-clears-stats"], "events": 10164, "status": "PASS_FINITE_FRACTION_TABLE_FEASIBILITY"}, "new_control_count": 20, "new_controls": ["all-241-fixtures-take-certified-domain", "subtypes-and-foreign-types-fall-back-without-custom-methods", "metaclass-container", "metaclass-scalar", "original-fallback-dict-subclass", "original-fallback-program-subclass", "original-fallback-event-subclass", "original-fallback-weights-subclass", "original-fallback-row-subclass", "original-fallback-rounded-subclass", "original-fallback-Fraction-subclass", "original-fallback-integer-weights", "original-fallback-boolean-public", "exact-internal-type-preservation-at-certified-updates", "malformed-outcome-missing-weight", "malformed-outcome-bad-role", "malformed-outcome-bad-scalar", "malformed-outcome-short-event", "recertification-invalidates-certified-method", "disabled-capacity-not-certified"], "status": "PASS_TYPE_GATE_FINITE_FEASIBILITY"}, "new_control_count": 9, "new_controls": ["canonical-full-pair-tokens", "weight-token-hash-collision", "bounded-context-overflow", "event-q-canonical-equality-and-FIFO-counters", "six-complete-trace-counter-and-type-comparisons", "source-site-weight-ownership", "wrong-token-alias-detected", "overflow-fallback-preserves-original", "fresh-token-and-cache-lifetimes"], "status": "PASS_COMPACT_KEY_FINITE_ONLY"}, "new_control_count": 10, "new_controls": ["changed-getter-invalidates", "changed-live-getter-code", "foreign-slot-probe-is-pure", "changed-attribute-lookup", "missing-attribute-handler-presence", "binding-restored", "slot-path-selected", "post-derive-getter-drift-literal-fallback", "uninitialized-unused-weight-fallback", "foreign-slot-value-fallback"], "status": "PASS_SLOT_KEY_FINITE_ONLY"} +{"all_coverage_preserved": true, "build": {"SOABI": "cpython-312-x86_64-linux-gnu", "binary_sha256": "3e541789775731eb9af69cb4ce4dbf9e5dbc211e4f5639c7cc071f611cbc736f", "cold_build_load_wall_seconds": 0.3189755599887576, "compiler": "/usr/bin/cc", "compiler_cpu_accounting": "outer GNU time user+system includes compiler children", "compiler_version": "cc (Ubuntu 13.3.0-6ubuntu2~24.04.1) 13.3.0", "extension_suffix": ".cpython-312-x86_64-linux-gnu.so", "flags": ["-O2", "-shared", "-fPIC", "-std=c11", "-Wall", "-Werror", "-I/usr/include/python3.12"], "python": "3.12.3 (main, Aug 31 2026, 10:18:26) [GCC 13.3.0]", "source_sha256": "78ed2e240ee40ce4989a4718e77e8b3967b092d2bf8c900124a26942c98a14cb"}, "inherited": {"all_coverage_preserved": true, "inherited": {"all_coverage_preserved": true, "inherited": {"all_coverage_preserved": true, "inherited": {"all_complete_values_and_types_equal": true, "cases": 241, "controls": ["returned-mutation-isolated", "source-drift", "Fraction-type-drift", "module-byte-drift", "live-code-drift", "nested-live-code-drift", "omitted-witness", "omitted-rounded-sites", "wrong-coefficient", "wrong-weighted-increment", "bad-role", "bad-scalar", "missing-weight", "restore-success", "restore-exception", "fresh-derivation", "key-field-0", "key-field-1", "key-field-2", "key-field-3", "key-field-4", "FIFO-eviction", "canonical-key", "hash-collision", "disabled", "invalid-capacity--1", "invalid-capacity-16385", "invalid-capacity-True", "invalid-capacity-1.5", "uncached-exception-0", "uncached-exception-1", "fresh-call-table", "stats-mutation", "failed-call-clears-stats"], "events": 10164, "status": "PASS_FINITE_FRACTION_TABLE_FEASIBILITY"}, "new_control_count": 20, "new_controls": ["all-241-fixtures-take-certified-domain", "subtypes-and-foreign-types-fall-back-without-custom-methods", "metaclass-container", "metaclass-scalar", "original-fallback-dict-subclass", "original-fallback-program-subclass", "original-fallback-event-subclass", "original-fallback-weights-subclass", "original-fallback-row-subclass", "original-fallback-rounded-subclass", "original-fallback-Fraction-subclass", "original-fallback-integer-weights", "original-fallback-boolean-public", "exact-internal-type-preservation-at-certified-updates", "malformed-outcome-missing-weight", "malformed-outcome-bad-role", "malformed-outcome-bad-scalar", "malformed-outcome-short-event", "recertification-invalidates-certified-method", "disabled-capacity-not-certified"], "status": "PASS_TYPE_GATE_FINITE_FEASIBILITY"}, "new_control_count": 9, "new_controls": ["canonical-full-pair-tokens", "weight-token-hash-collision", "bounded-context-overflow", "event-q-canonical-equality-and-FIFO-counters", "six-complete-trace-counter-and-type-comparisons", "source-site-weight-ownership", "wrong-token-alias-detected", "overflow-fallback-preserves-original", "fresh-token-and-cache-lifetimes"], "status": "PASS_COMPACT_KEY_FINITE_ONLY"}, "new_control_count": 10, "new_controls": ["changed-getter-invalidates", "changed-live-getter-code", "foreign-slot-probe-is-pure", "changed-attribute-lookup", "missing-attribute-handler-presence", "binding-restored", "slot-path-selected", "post-derive-getter-drift-literal-fallback", "uninitialized-unused-weight-fallback", "foreign-slot-value-fallback"], "status": "PASS_SLOT_KEY_FINITE_ONLY"}, "native_control_count": 45, "native_controls": ["canonical-keys-FIFO-wrap-counters", "native-hash-collision", "exact-one-callback-per-miss", "uncached-native-error-0", "uncached-native-error-1", "full-cache-failure-before-eviction", "cache-survives-callback-exception", "capacity-0", "capacity--1", "capacity-16385", "capacity-True", "capacity-1.5", "capacity-10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "index--1", "index-3", "index-10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "index-True", "index-0", "arity", "keywords", "exact-operand", "exact-scalar", "event-creation", "descriptor-protocol", "token-length", "token-range", "partial-init-length", "partial-init-weight", "callback-result-shape", "callback-result-type", "callback-reentry", "event-owns-parent", "GC-callback-cycle", "native-statistics-isolated", "native-coefficient-loop", "same-row-lowlevel-rejection", "dict-iterator-mutation-safe", "callback-list-mutation-safe", "native-source-authenticated", "callback-descriptor-is-pure", "plain-callback-rejected", "live-callback-code-drift", "owned-metadata-snapshot", "same-row-source-fallback", "malformed-scalar-literal-fallback"], "status": "PASS_NATIVE_FINITE_ONLY"} +{"backends": 2, "controls": ["one-use", "closed-call", "missing", "duplicate", "changed-weights", "changed-rounding", "changed-word", "original-malformed-rejection", "propagated-exception", "failed-finish", "failed-take", "fresh-context-not-previous-pass", "aborted-take", "one-use", "closed-call", "missing", "duplicate", "changed-weights", "changed-rounding", "changed-word", "original-malformed-rejection", "propagated-exception", "failed-finish", "failed-take", "fresh-context-not-previous-pass", "aborted-take", "input-mutation"], "events": 5, "status": "PASS_FINITE_FEASIBILITY_ONLY"} +{"actual": {"output_sha256": "954c7448ff74d78753828e9623ad44c46da9e5ce459420b6e50a5d47294250b9", "statistics": {"bypasses": 0, "calls": 2579750, "capacity": 16384, "evictions": 310400, "hits": 2252966, "misses": 326784, "resident": 16384}, "tokens": 3587}, "baseline_fraction_arithmetic_unchanged": true, "build": {"SOABI": "cpython-312-x86_64-linux-gnu", "binary_sha256": "3e541789775731eb9af69cb4ce4dbf9e5dbc211e4f5639c7cc071f611cbc736f", "cold_build_load_wall_seconds": 0.3189755599887576, "compiler": "/usr/bin/cc", "compiler_cpu_accounting": "outer GNU time user+system includes compiler children", "compiler_version": "cc (Ubuntu 13.3.0-6ubuntu2~24.04.1) 13.3.0", "extension_suffix": ".cpython-312-x86_64-linux-gnu.so", "flags": ["-O2", "-shared", "-fPIC", "-std=c11", "-Wall", "-Werror", "-I/usr/include/python3.12"], "python": "3.12.3 (main, Aug 31 2026, 10:18:26) [GCC 13.3.0]", "source_sha256": "78ed2e240ee40ce4989a4718e77e8b3967b092d2bf8c900124a26942c98a14cb"}, "compiler_children_charged": true, "integer_backend_changed": true, "native_finite_included": true, "status": "PASS_COMPLETE_NATIVE_COVERAGE"} +PASS_P104_SINGLE_PASS_QUALIFICATION +{"mode": "qualify", "receipt": {"all_actual_witness_rows_equal": true, "coefficient_scale_bits": 55, "coordinates": 799, "events": 25984, "finite_fixtures": {"cases": 120, "controls": ["nondyadic scalar", "inexact scale division", "nondyadic weight"], "events": 4240}, "guards": {"owned": 22, "prefix": 26, "public": 23}, "source_controls": 6, "source_result_sha256": "cc7739703ed23532d187949c8507d09c13ac4c152e07a930f0087cde0d7a3d98"}, "seconds": 28.961286} +{"added_finite": {"checks": ["eight-row-and-score-differentials", "aliased-inputs-return-fresh-outputs", "six-ordered-prefixes-and-complete-bytes", "zero-negative-large-reduced-and-ordered-formatting", "score-string-contract-distinct-from-coefficient-contract", "reverse-scores-signed-bytes-and-aliases", "bool-numerator", "foreign-int-value", "foreign-dict", "foreign-key", "float-value", "negative-exponent", "bool-exponent", "inexact-division-transaction", "inexact-scaled-row", "nondyadic-scale", "zero-scale", "negative-scale", "bool-scale", "short-score", "foreign-scores", "foreign-weight", "weight-index-range", "negative-weight-index", "reverse-index-range", "score-nondyadic-unit", "event-type"], "independent_fraction_formatting": true, "ordered_prefixes": 6, "row_cases": 8, "status": "PASS_FINITE_INTEGER_FORMAT", "timing_claim": false, "whole_replay": false}, "fraction_backend": "unchanged PR5864 Python Fraction arithmetic and native bookkeeping", "integer_backend_changed": true, "native_integer_build": {"SOABI": "cpython-312-x86_64-linux-gnu", "binary_sha256": "f7b89a186385676a2a1a9a28a8b2d9678eb57ca99ade7cef15d1fc81c015b3f2", "cold_build_load_wall_seconds": 0.3512439139885828, "compiler": "/usr/bin/cc", "compiler_cpu_accounting": "parent outer process must include compiler children", "extension_suffix": ".cpython-312-x86_64-linux-gnu.so", "flags": ["-O2", "-shared", "-fPIC", "-std=c11", "-Wall", "-Werror", "-I/usr/include/python3.12"], "python": "3.12.3 (main, Aug 31 2026, 10:18:26) [GCC 13.3.0]", "source_sha256": "804cc25bd9ad0912de81fe97bc65b95ebcb0dec06453739e1d4863e7946c4f3d"}, "source_binding": {"changes": [{"count": 1, "name": "fresh-native-sparse-add"}, {"count": 1, "name": "ideal-adopts-fresh-row"}, {"count": 2, "name": "ideal-and-error-native-scale"}, {"count": 1, "name": "native-signed-error-row-and-scores"}, {"count": 1, "name": "exact-three-score-stream-bytes"}, {"count": 1, "name": "full-descending-coefficient-bytes"}, {"count": 1, "name": "native-reverse-scores-and-signed-byte-chunks"}, {"count": 1, "name": "reverse-native-scale"}, {"count": 1, "name": "reverse-adopts-fresh-row"}], "derived_integer_sha256": "93c9212e9f014ef5cc84ce2d2c4b7b61fd81b2ffc12b73d5c54fffb0d58e713e", "fraction_reference_module_modified": false, "integer_backend_changed": true, "original_integer_sha256": "82a73e4bcf1835bfdd510c7ad5538625c1b380c559b671e6a67be490615a743a", "source_only_handoff": true, "whole_replay_qualified": false}, "status": "PASS_COMPLETE_INTEGER_FORMAT_CANDIDATE"} diff --git a/research/c-verification-feasibility/evidence/runs/integer-complete-C3/usage.json b/research/c-verification-feasibility/evidence/runs/integer-complete-C3/usage.json new file mode 100644 index 0000000000..9e7b19175a --- /dev/null +++ b/research/c-verification-feasibility/evidence/runs/integer-complete-C3/usage.json @@ -0,0 +1 @@ +{"user_seconds":31.74,"system_seconds":0.23,"kernel_max_rss_kib":113320,"exit":0} diff --git a/research/c-verification-feasibility/evidence/runs/integer-format-finite-O/receipt.json b/research/c-verification-feasibility/evidence/runs/integer-format-finite-O/receipt.json new file mode 100644 index 0000000000..614a462fbd --- /dev/null +++ b/research/c-verification-feasibility/evidence/runs/integer-format-finite-O/receipt.json @@ -0,0 +1,26 @@ +{ + "exit": 0, + "label": "integer-format-finite-O", + "optimized": true, + "platform": "Linux-7.0.0-38-generic-x86_64-with-glibc2.39", + "python": "3.12.3 (main, Aug 31 2026, 10:18:26) [GCC 13.3.0]", + "runner_sha256": "7540f8cc4ae4d12ed86c844ef0837a74184d3ada653979608c295c09f200a751", + "runtime_policy_sha256": "d4dbcbb9000a28babe33ed0060fd683f3f8d954609daeb713daf02ab125ae157", + "sampled_process_group_rss_bytes": 71835648, + "script": "stages/integer-format-v1/finite.py", + "source_bytes_and_modes_unchanged": true, + "source_inventory_sha256": "4d96fa0cedd16b0eac975a317918568ac3659cf5b48b2ab517ded261514402ce", + "status": "PASS", + "stderr_bytes": 0, + "stderr_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stdout_bytes": 1469, + "stdout_sha256": "caac0259f5218ea2bec0968868d4901d2568439e5efd397d3d56ed038ed39562", + "termination": null, + "usage": { + "exit": 0, + "kernel_max_rss_kib": 43940, + "system_seconds": 0.05, + "user_seconds": 0.62 + }, + "wall_seconds": 0.715429417003179 +} diff --git a/research/c-verification-feasibility/evidence/runs/integer-format-finite-O/stderr.txt b/research/c-verification-feasibility/evidence/runs/integer-format-finite-O/stderr.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/research/c-verification-feasibility/evidence/runs/integer-format-finite-O/stdout.txt b/research/c-verification-feasibility/evidence/runs/integer-format-finite-O/stdout.txt new file mode 100644 index 0000000000..9186f2ccba --- /dev/null +++ b/research/c-verification-feasibility/evidence/runs/integer-format-finite-O/stdout.txt @@ -0,0 +1 @@ +{"build": {"SOABI": "cpython-312-x86_64-linux-gnu", "binary_sha256": "8abcb0f69bd2d6fbbc203c0c621c353775a70095a8be45fa106e8934a5f273b3", "cold_build_load_wall_seconds": 0.4015332090202719, "compiler": "/usr/bin/cc", "compiler_cpu_accounting": "parent outer process must include compiler children", "extension_suffix": ".cpython-312-x86_64-linux-gnu.so", "flags": ["-O2", "-shared", "-fPIC", "-std=c11", "-Wall", "-Werror", "-I/usr/include/python3.12"], "python": "3.12.3 (main, Aug 31 2026, 10:18:26) [GCC 13.3.0]", "source_sha256": "804cc25bd9ad0912de81fe97bc65b95ebcb0dec06453739e1d4863e7946c4f3d"}, "result": {"checks": ["eight-row-and-score-differentials", "aliased-inputs-return-fresh-outputs", "six-ordered-prefixes-and-complete-bytes", "zero-negative-large-reduced-and-ordered-formatting", "score-string-contract-distinct-from-coefficient-contract", "reverse-scores-signed-bytes-and-aliases", "bool-numerator", "foreign-int-value", "foreign-dict", "foreign-key", "float-value", "negative-exponent", "bool-exponent", "inexact-division-transaction", "inexact-scaled-row", "nondyadic-scale", "zero-scale", "negative-scale", "bool-scale", "short-score", "foreign-scores", "foreign-weight", "weight-index-range", "negative-weight-index", "reverse-index-range", "score-nondyadic-unit", "event-type"], "independent_fraction_formatting": true, "ordered_prefixes": 6, "row_cases": 8, "status": "PASS_FINITE_INTEGER_FORMAT", "timing_claim": false, "whole_replay": false}} diff --git a/research/c-verification-feasibility/evidence/runs/integer-format-finite-O/usage.json b/research/c-verification-feasibility/evidence/runs/integer-format-finite-O/usage.json new file mode 100644 index 0000000000..681093cbcf --- /dev/null +++ b/research/c-verification-feasibility/evidence/runs/integer-format-finite-O/usage.json @@ -0,0 +1 @@ +{"user_seconds":0.62,"system_seconds":0.05,"kernel_max_rss_kib":43940,"exit":0} diff --git a/research/c-verification-feasibility/evidence/runs/integer-format-finite-v1/receipt.json b/research/c-verification-feasibility/evidence/runs/integer-format-finite-v1/receipt.json new file mode 100644 index 0000000000..ddad38bd6a --- /dev/null +++ b/research/c-verification-feasibility/evidence/runs/integer-format-finite-v1/receipt.json @@ -0,0 +1,26 @@ +{ + "exit": 0, + "label": "integer-format-finite-v1", + "optimized": false, + "platform": "Linux-7.0.0-38-generic-x86_64-with-glibc2.39", + "python": "3.12.3 (main, Aug 31 2026, 10:18:26) [GCC 13.3.0]", + "runner_sha256": "7540f8cc4ae4d12ed86c844ef0837a74184d3ada653979608c295c09f200a751", + "runtime_policy_sha256": "d4dbcbb9000a28babe33ed0060fd683f3f8d954609daeb713daf02ab125ae157", + "sampled_process_group_rss_bytes": 70549504, + "script": "stages/integer-format-v1/finite.py", + "source_bytes_and_modes_unchanged": true, + "source_inventory_sha256": "4d96fa0cedd16b0eac975a317918568ac3659cf5b48b2ab517ded261514402ce", + "status": "PASS", + "stderr_bytes": 0, + "stderr_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stdout_bytes": 1469, + "stdout_sha256": "c8cb8a639aa27fe2490056763c8d6f503f42c5d8492d23722c74cf885058c882", + "termination": null, + "usage": { + "exit": 0, + "kernel_max_rss_kib": 42764, + "system_seconds": 0.06, + "user_seconds": 0.59 + }, + "wall_seconds": 0.8020448149763979 +} diff --git a/research/c-verification-feasibility/evidence/runs/integer-format-finite-v1/stderr.txt b/research/c-verification-feasibility/evidence/runs/integer-format-finite-v1/stderr.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/research/c-verification-feasibility/evidence/runs/integer-format-finite-v1/stdout.txt b/research/c-verification-feasibility/evidence/runs/integer-format-finite-v1/stdout.txt new file mode 100644 index 0000000000..a3566d8611 --- /dev/null +++ b/research/c-verification-feasibility/evidence/runs/integer-format-finite-v1/stdout.txt @@ -0,0 +1 @@ +{"build": {"SOABI": "cpython-312-x86_64-linux-gnu", "binary_sha256": "a0d1175dd4a0e1427f92219a6b5ac7cf9fd204d7f4b39c1aa05f1905d8f32477", "cold_build_load_wall_seconds": 0.5015519380103797, "compiler": "/usr/bin/cc", "compiler_cpu_accounting": "parent outer process must include compiler children", "extension_suffix": ".cpython-312-x86_64-linux-gnu.so", "flags": ["-O2", "-shared", "-fPIC", "-std=c11", "-Wall", "-Werror", "-I/usr/include/python3.12"], "python": "3.12.3 (main, Aug 31 2026, 10:18:26) [GCC 13.3.0]", "source_sha256": "804cc25bd9ad0912de81fe97bc65b95ebcb0dec06453739e1d4863e7946c4f3d"}, "result": {"checks": ["eight-row-and-score-differentials", "aliased-inputs-return-fresh-outputs", "six-ordered-prefixes-and-complete-bytes", "zero-negative-large-reduced-and-ordered-formatting", "score-string-contract-distinct-from-coefficient-contract", "reverse-scores-signed-bytes-and-aliases", "bool-numerator", "foreign-int-value", "foreign-dict", "foreign-key", "float-value", "negative-exponent", "bool-exponent", "inexact-division-transaction", "inexact-scaled-row", "nondyadic-scale", "zero-scale", "negative-scale", "bool-scale", "short-score", "foreign-scores", "foreign-weight", "weight-index-range", "negative-weight-index", "reverse-index-range", "score-nondyadic-unit", "event-type"], "independent_fraction_formatting": true, "ordered_prefixes": 6, "row_cases": 8, "status": "PASS_FINITE_INTEGER_FORMAT", "timing_claim": false, "whole_replay": false}} diff --git a/research/c-verification-feasibility/evidence/runs/integer-format-finite-v1/usage.json b/research/c-verification-feasibility/evidence/runs/integer-format-finite-v1/usage.json new file mode 100644 index 0000000000..4380257400 --- /dev/null +++ b/research/c-verification-feasibility/evidence/runs/integer-format-finite-v1/usage.json @@ -0,0 +1 @@ +{"user_seconds":0.59,"system_seconds":0.06,"kernel_max_rss_kib":42764,"exit":0} diff --git a/research/c-verification-feasibility/evidence/runs/integer-format-micro-B1/receipt.json b/research/c-verification-feasibility/evidence/runs/integer-format-micro-B1/receipt.json new file mode 100644 index 0000000000..767e15737e --- /dev/null +++ b/research/c-verification-feasibility/evidence/runs/integer-format-micro-B1/receipt.json @@ -0,0 +1,26 @@ +{ + "exit": 0, + "label": "integer-format-micro-B1", + "optimized": false, + "platform": "Linux-7.0.0-38-generic-x86_64-with-glibc2.39", + "python": "3.12.3 (main, Aug 31 2026, 10:18:26) [GCC 13.3.0]", + "runner_sha256": "7540f8cc4ae4d12ed86c844ef0837a74184d3ada653979608c295c09f200a751", + "runtime_policy_sha256": "d4dbcbb9000a28babe33ed0060fd683f3f8d954609daeb713daf02ab125ae157", + "sampled_process_group_rss_bytes": 25661440, + "script": "stages/integer-format-v1/micro_B1.py", + "source_bytes_and_modes_unchanged": true, + "source_inventory_sha256": "4d96fa0cedd16b0eac975a317918568ac3659cf5b48b2ab517ded261514402ce", + "status": "PASS", + "stderr_bytes": 0, + "stderr_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stdout_bytes": 371, + "stdout_sha256": "13ba13ca18b32e867f47aba027583138272207f13dad7ccccd19e6b91bc0f9ff", + "termination": null, + "usage": { + "exit": 0, + "kernel_max_rss_kib": 23740, + "system_seconds": 0.01, + "user_seconds": 0.34 + }, + "wall_seconds": 0.3698824430175591 +} diff --git a/research/c-verification-feasibility/evidence/runs/integer-format-micro-B1/stderr.txt b/research/c-verification-feasibility/evidence/runs/integer-format-micro-B1/stderr.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/research/c-verification-feasibility/evidence/runs/integer-format-micro-B1/stdout.txt b/research/c-verification-feasibility/evidence/runs/integer-format-micro-B1/stdout.txt new file mode 100644 index 0000000000..1baa49e022 --- /dev/null +++ b/research/c-verification-feasibility/evidence/runs/integer-format-micro-B1/stdout.txt @@ -0,0 +1 @@ +{"build": null, "complete_byte_stream_sha256": "6f43a95d483f0454a0528fa368b3bc905f137542faaf19f643db9e3ad9e5b6eb", "complete_speed_claim": false, "finite": null, "mode": "baseline", "result_sha256": "dbab9ae512339b2fb29e9c3a752801c4c4fd93fedefa15ff92a1242e6f09b56f", "synthetic_batch_cpu_seconds": 0.14198134999999998, "synthetic_batch_wall_seconds": 0.1420025120023638} diff --git a/research/c-verification-feasibility/evidence/runs/integer-format-micro-B1/usage.json b/research/c-verification-feasibility/evidence/runs/integer-format-micro-B1/usage.json new file mode 100644 index 0000000000..7f91d778c5 --- /dev/null +++ b/research/c-verification-feasibility/evidence/runs/integer-format-micro-B1/usage.json @@ -0,0 +1 @@ +{"user_seconds":0.34,"system_seconds":0.01,"kernel_max_rss_kib":23740,"exit":0} diff --git a/research/c-verification-feasibility/evidence/runs/integer-format-micro-B2/receipt.json b/research/c-verification-feasibility/evidence/runs/integer-format-micro-B2/receipt.json new file mode 100644 index 0000000000..c30baf6654 --- /dev/null +++ b/research/c-verification-feasibility/evidence/runs/integer-format-micro-B2/receipt.json @@ -0,0 +1,26 @@ +{ + "exit": 0, + "label": "integer-format-micro-B2", + "optimized": false, + "platform": "Linux-7.0.0-38-generic-x86_64-with-glibc2.39", + "python": "3.12.3 (main, Aug 31 2026, 10:18:26) [GCC 13.3.0]", + "runner_sha256": "7540f8cc4ae4d12ed86c844ef0837a74184d3ada653979608c295c09f200a751", + "runtime_policy_sha256": "d4dbcbb9000a28babe33ed0060fd683f3f8d954609daeb713daf02ab125ae157", + "sampled_process_group_rss_bytes": 25690112, + "script": "stages/integer-format-v1/micro_B2.py", + "source_bytes_and_modes_unchanged": true, + "source_inventory_sha256": "4d96fa0cedd16b0eac975a317918568ac3659cf5b48b2ab517ded261514402ce", + "status": "PASS", + "stderr_bytes": 0, + "stderr_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stdout_bytes": 372, + "stdout_sha256": "59ca555e634f7ab6ceabe14dd15e3ea9ed2a61179675e595fd57c240e1b262fc", + "termination": null, + "usage": { + "exit": 0, + "kernel_max_rss_kib": 23772, + "system_seconds": 0.01, + "user_seconds": 0.33 + }, + "wall_seconds": 0.4286254330072552 +} diff --git a/research/c-verification-feasibility/evidence/runs/integer-format-micro-B2/stderr.txt b/research/c-verification-feasibility/evidence/runs/integer-format-micro-B2/stderr.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/research/c-verification-feasibility/evidence/runs/integer-format-micro-B2/stdout.txt b/research/c-verification-feasibility/evidence/runs/integer-format-micro-B2/stdout.txt new file mode 100644 index 0000000000..f747954e90 --- /dev/null +++ b/research/c-verification-feasibility/evidence/runs/integer-format-micro-B2/stdout.txt @@ -0,0 +1 @@ +{"build": null, "complete_byte_stream_sha256": "6f43a95d483f0454a0528fa368b3bc905f137542faaf19f643db9e3ad9e5b6eb", "complete_speed_claim": false, "finite": null, "mode": "baseline", "result_sha256": "dbab9ae512339b2fb29e9c3a752801c4c4fd93fedefa15ff92a1242e6f09b56f", "synthetic_batch_cpu_seconds": 0.13797490999999998, "synthetic_batch_wall_seconds": 0.13797231801436283} diff --git a/research/c-verification-feasibility/evidence/runs/integer-format-micro-B2/usage.json b/research/c-verification-feasibility/evidence/runs/integer-format-micro-B2/usage.json new file mode 100644 index 0000000000..91f5a992f0 --- /dev/null +++ b/research/c-verification-feasibility/evidence/runs/integer-format-micro-B2/usage.json @@ -0,0 +1 @@ +{"user_seconds":0.33,"system_seconds":0.01,"kernel_max_rss_kib":23772,"exit":0} diff --git a/research/c-verification-feasibility/evidence/runs/integer-format-micro-C1/receipt.json b/research/c-verification-feasibility/evidence/runs/integer-format-micro-C1/receipt.json new file mode 100644 index 0000000000..12636f23ea --- /dev/null +++ b/research/c-verification-feasibility/evidence/runs/integer-format-micro-C1/receipt.json @@ -0,0 +1,26 @@ +{ + "exit": 0, + "label": "integer-format-micro-C1", + "optimized": false, + "platform": "Linux-7.0.0-38-generic-x86_64-with-glibc2.39", + "python": "3.12.3 (main, Aug 31 2026, 10:18:26) [GCC 13.3.0]", + "runner_sha256": "7540f8cc4ae4d12ed86c844ef0837a74184d3ada653979608c295c09f200a751", + "runtime_policy_sha256": "d4dbcbb9000a28babe33ed0060fd683f3f8d954609daeb713daf02ab125ae157", + "sampled_process_group_rss_bytes": 72945664, + "script": "stages/integer-format-v1/micro_C1.py", + "source_bytes_and_modes_unchanged": true, + "source_inventory_sha256": "4d96fa0cedd16b0eac975a317918568ac3659cf5b48b2ab517ded261514402ce", + "status": "PASS", + "stderr_bytes": 0, + "stderr_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stdout_bytes": 1803, + "stdout_sha256": "0d1718af155df26e16f7baaf0a2f2c0863ec24cf51516d041742e1642772b1f8", + "termination": null, + "usage": { + "exit": 0, + "kernel_max_rss_kib": 43964, + "system_seconds": 0.04, + "user_seconds": 0.67 + }, + "wall_seconds": 0.7898205800156575 +} diff --git a/research/c-verification-feasibility/evidence/runs/integer-format-micro-C1/stderr.txt b/research/c-verification-feasibility/evidence/runs/integer-format-micro-C1/stderr.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/research/c-verification-feasibility/evidence/runs/integer-format-micro-C1/stdout.txt b/research/c-verification-feasibility/evidence/runs/integer-format-micro-C1/stdout.txt new file mode 100644 index 0000000000..387cb31815 --- /dev/null +++ b/research/c-verification-feasibility/evidence/runs/integer-format-micro-C1/stdout.txt @@ -0,0 +1 @@ +{"build": {"SOABI": "cpython-312-x86_64-linux-gnu", "binary_sha256": "991a8d7efc367ce8a1c55ce73e2cad56b3bb6a9e530f0c556e785cd8f5875d24", "cold_build_load_wall_seconds": 0.35763743601273745, "compiler": "/usr/bin/cc", "compiler_cpu_accounting": "parent outer process must include compiler children", "extension_suffix": ".cpython-312-x86_64-linux-gnu.so", "flags": ["-O2", "-shared", "-fPIC", "-std=c11", "-Wall", "-Werror", "-I/usr/include/python3.12"], "python": "3.12.3 (main, Aug 31 2026, 10:18:26) [GCC 13.3.0]", "source_sha256": "804cc25bd9ad0912de81fe97bc65b95ebcb0dec06453739e1d4863e7946c4f3d"}, "complete_byte_stream_sha256": "6f43a95d483f0454a0528fa368b3bc905f137542faaf19f643db9e3ad9e5b6eb", "complete_speed_claim": false, "finite": {"checks": ["eight-row-and-score-differentials", "aliased-inputs-return-fresh-outputs", "six-ordered-prefixes-and-complete-bytes", "zero-negative-large-reduced-and-ordered-formatting", "score-string-contract-distinct-from-coefficient-contract", "reverse-scores-signed-bytes-and-aliases", "bool-numerator", "foreign-int-value", "foreign-dict", "foreign-key", "float-value", "negative-exponent", "bool-exponent", "inexact-division-transaction", "inexact-scaled-row", "nondyadic-scale", "zero-scale", "negative-scale", "bool-scale", "short-score", "foreign-scores", "foreign-weight", "weight-index-range", "negative-weight-index", "reverse-index-range", "score-nondyadic-unit", "event-type"], "independent_fraction_formatting": true, "ordered_prefixes": 6, "row_cases": 8, "status": "PASS_FINITE_INTEGER_FORMAT", "timing_claim": false, "whole_replay": false}, "mode": "candidate", "result_sha256": "dbab9ae512339b2fb29e9c3a752801c4c4fd93fedefa15ff92a1242e6f09b56f", "synthetic_batch_cpu_seconds": 0.109128595, "synthetic_batch_wall_seconds": 0.10961332099395804} diff --git a/research/c-verification-feasibility/evidence/runs/integer-format-micro-C1/usage.json b/research/c-verification-feasibility/evidence/runs/integer-format-micro-C1/usage.json new file mode 100644 index 0000000000..06371c2f07 --- /dev/null +++ b/research/c-verification-feasibility/evidence/runs/integer-format-micro-C1/usage.json @@ -0,0 +1 @@ +{"user_seconds":0.67,"system_seconds":0.04,"kernel_max_rss_kib":43964,"exit":0} diff --git a/research/c-verification-feasibility/evidence/runs/integer-format-micro-C2/receipt.json b/research/c-verification-feasibility/evidence/runs/integer-format-micro-C2/receipt.json new file mode 100644 index 0000000000..bd9ca75e57 --- /dev/null +++ b/research/c-verification-feasibility/evidence/runs/integer-format-micro-C2/receipt.json @@ -0,0 +1,26 @@ +{ + "exit": 0, + "label": "integer-format-micro-C2", + "optimized": false, + "platform": "Linux-7.0.0-38-generic-x86_64-with-glibc2.39", + "python": "3.12.3 (main, Aug 31 2026, 10:18:26) [GCC 13.3.0]", + "runner_sha256": "7540f8cc4ae4d12ed86c844ef0837a74184d3ada653979608c295c09f200a751", + "runtime_policy_sha256": "d4dbcbb9000a28babe33ed0060fd683f3f8d954609daeb713daf02ab125ae157", + "sampled_process_group_rss_bytes": 73027584, + "script": "stages/integer-format-v1/micro_C2.py", + "source_bytes_and_modes_unchanged": true, + "source_inventory_sha256": "4d96fa0cedd16b0eac975a317918568ac3659cf5b48b2ab517ded261514402ce", + "status": "PASS", + "stderr_bytes": 0, + "stderr_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stdout_bytes": 1803, + "stdout_sha256": "c695ede465ec5b4d12b5f04b51fafdbf03e8a8be0f4d2bfb2d0c6105e4c02be7", + "termination": null, + "usage": { + "exit": 0, + "kernel_max_rss_kib": 44028, + "system_seconds": 0.04, + "user_seconds": 0.71 + }, + "wall_seconds": 0.811024858005112 +} diff --git a/research/c-verification-feasibility/evidence/runs/integer-format-micro-C2/stderr.txt b/research/c-verification-feasibility/evidence/runs/integer-format-micro-C2/stderr.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/research/c-verification-feasibility/evidence/runs/integer-format-micro-C2/stdout.txt b/research/c-verification-feasibility/evidence/runs/integer-format-micro-C2/stdout.txt new file mode 100644 index 0000000000..1879657b03 --- /dev/null +++ b/research/c-verification-feasibility/evidence/runs/integer-format-micro-C2/stdout.txt @@ -0,0 +1 @@ +{"build": {"SOABI": "cpython-312-x86_64-linux-gnu", "binary_sha256": "0e6c2b1dfcd4aa15b46a5b356d02f1985f9a92447c78464293d03cece452ff5b", "cold_build_load_wall_seconds": 0.39532300698920153, "compiler": "/usr/bin/cc", "compiler_cpu_accounting": "parent outer process must include compiler children", "extension_suffix": ".cpython-312-x86_64-linux-gnu.so", "flags": ["-O2", "-shared", "-fPIC", "-std=c11", "-Wall", "-Werror", "-I/usr/include/python3.12"], "python": "3.12.3 (main, Aug 31 2026, 10:18:26) [GCC 13.3.0]", "source_sha256": "804cc25bd9ad0912de81fe97bc65b95ebcb0dec06453739e1d4863e7946c4f3d"}, "complete_byte_stream_sha256": "6f43a95d483f0454a0528fa368b3bc905f137542faaf19f643db9e3ad9e5b6eb", "complete_speed_claim": false, "finite": {"checks": ["eight-row-and-score-differentials", "aliased-inputs-return-fresh-outputs", "six-ordered-prefixes-and-complete-bytes", "zero-negative-large-reduced-and-ordered-formatting", "score-string-contract-distinct-from-coefficient-contract", "reverse-scores-signed-bytes-and-aliases", "bool-numerator", "foreign-int-value", "foreign-dict", "foreign-key", "float-value", "negative-exponent", "bool-exponent", "inexact-division-transaction", "inexact-scaled-row", "nondyadic-scale", "zero-scale", "negative-scale", "bool-scale", "short-score", "foreign-scores", "foreign-weight", "weight-index-range", "negative-weight-index", "reverse-index-range", "score-nondyadic-unit", "event-type"], "independent_fraction_formatting": true, "ordered_prefixes": 6, "row_cases": 8, "status": "PASS_FINITE_INTEGER_FORMAT", "timing_claim": false, "whole_replay": false}, "mode": "candidate", "result_sha256": "dbab9ae512339b2fb29e9c3a752801c4c4fd93fedefa15ff92a1242e6f09b56f", "synthetic_batch_cpu_seconds": 0.108635123, "synthetic_batch_wall_seconds": 0.10865863302024081} diff --git a/research/c-verification-feasibility/evidence/runs/integer-format-micro-C2/usage.json b/research/c-verification-feasibility/evidence/runs/integer-format-micro-C2/usage.json new file mode 100644 index 0000000000..fe5d6702a7 --- /dev/null +++ b/research/c-verification-feasibility/evidence/runs/integer-format-micro-C2/usage.json @@ -0,0 +1 @@ +{"user_seconds":0.71,"system_seconds":0.04,"kernel_max_rss_kib":44028,"exit":0} diff --git a/research/c-verification-feasibility/evidence/runs/rational-final-finite-O/receipt.json b/research/c-verification-feasibility/evidence/runs/rational-final-finite-O/receipt.json new file mode 100644 index 0000000000..fb9834d947 --- /dev/null +++ b/research/c-verification-feasibility/evidence/runs/rational-final-finite-O/receipt.json @@ -0,0 +1,26 @@ +{ + "exit": 0, + "label": "rational-final-finite-O", + "optimized": true, + "platform": "Linux-7.0.0-38-generic-x86_64-with-glibc2.39", + "python": "3.12.3 (main, Aug 31 2026, 10:18:26) [GCC 13.3.0]", + "runner_sha256": "7540f8cc4ae4d12ed86c844ef0837a74184d3ada653979608c295c09f200a751", + "runtime_policy_sha256": "301795ac2e5a61c7a86b8b9e630ccf563fe5d60e0f49893824d716c725a07c3f", + "sampled_process_group_rss_bytes": 78520320, + "script": "stages/rational-v2/run_finite.py", + "source_bytes_and_modes_unchanged": true, + "source_inventory_sha256": "40d4501c0cccda5cd1baeea5318c8383ef27f9f304fb74916a357803a2f321e5", + "status": "PASS", + "stderr_bytes": 0, + "stderr_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stdout_bytes": 1464, + "stdout_sha256": "49169c3cb17e9ec5bec115d54346e1567d51aabf2338c3e0afaac5596551300f", + "termination": null, + "usage": { + "exit": 0, + "kernel_max_rss_kib": 48500, + "system_seconds": 0.05, + "user_seconds": 1.03 + }, + "wall_seconds": 1.1661804470058996 +} diff --git a/research/c-verification-feasibility/evidence/runs/rational-final-finite-O/stderr.txt b/research/c-verification-feasibility/evidence/runs/rational-final-finite-O/stderr.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/research/c-verification-feasibility/evidence/runs/rational-final-finite-O/stdout.txt b/research/c-verification-feasibility/evidence/runs/rational-final-finite-O/stdout.txt new file mode 100644 index 0000000000..a3819bc2f0 --- /dev/null +++ b/research/c-verification-feasibility/evidence/runs/rational-final-finite-O/stdout.txt @@ -0,0 +1,2 @@ +{"actual_word_run": false, "added_controls": ["165-general-rational-coefficient-prefixes", "batch-FIFO-and-full-counters", "exact-score-type", "score-subclass", "negative-score-denominator", "same-row", "nonbuiltin-gcd", "source-iterator-mutation", "score-list-mutation", "score-value-mutation", "callback-failure-publishes-completed-prefix", "arithmetic-code-drift", "inplace-protocol-drift", "materialization-source-drift", "gcd-drift", "operator-closure-drift", "13-complete-event-prefixes-with-nondyadic-weights-and-scalars", "noncanonical-weight-fallback", "changed-arithmetic-fallback"], "build": {"SOABI": "cpython-312-x86_64-linux-gnu", "binary_sha256": "058ecafd588a31b7d9ee5ad7925b2b3f8a42b2716d89643a728de0497f80660b", "cold_build_load_wall_seconds": 0.5330755350005347, "compiler": "/usr/bin/cc", "compiler_cpu_accounting": "outer GNU time user+system includes compiler children", "compiler_version": "cc (Ubuntu 13.3.0-6ubuntu2~24.04.1) 13.3.0", "extension_suffix": ".cpython-312-x86_64-linux-gnu.so", "flags": ["-O2", "-shared", "-fPIC", "-std=c11", "-Wall", "-Werror", "-I/usr/include/python3.12"], "python": "3.12.3 (main, Aug 31 2026, 10:18:26) [GCC 13.3.0]", "source_sha256": "4a4949e36cff4ff2894dd1f9379b58a58346ec7c888903271d4b98bbe4cfc7ae"}, "comparisons": 178, "complete_performance": false, "control_count": 19, "independent_literal_oracle_used": true, "status": "PASS_BOUNDED_RATIONAL_PROTOTYPE_ONLY"} +PASS_ADDED_DESTRUCTOR_BINDING_CONTROL diff --git a/research/c-verification-feasibility/evidence/runs/rational-final-finite-O/usage.json b/research/c-verification-feasibility/evidence/runs/rational-final-finite-O/usage.json new file mode 100644 index 0000000000..efedc6a01b --- /dev/null +++ b/research/c-verification-feasibility/evidence/runs/rational-final-finite-O/usage.json @@ -0,0 +1 @@ +{"user_seconds":1.03,"system_seconds":0.05,"kernel_max_rss_kib":48500,"exit":0} diff --git a/research/c-verification-feasibility/evidence/runs/rational-final-finite/receipt.json b/research/c-verification-feasibility/evidence/runs/rational-final-finite/receipt.json new file mode 100644 index 0000000000..310e27316d --- /dev/null +++ b/research/c-verification-feasibility/evidence/runs/rational-final-finite/receipt.json @@ -0,0 +1,26 @@ +{ + "exit": 0, + "label": "rational-final-finite", + "optimized": false, + "platform": "Linux-7.0.0-38-generic-x86_64-with-glibc2.39", + "python": "3.12.3 (main, Aug 31 2026, 10:18:26) [GCC 13.3.0]", + "runner_sha256": "7540f8cc4ae4d12ed86c844ef0837a74184d3ada653979608c295c09f200a751", + "runtime_policy_sha256": "301795ac2e5a61c7a86b8b9e630ccf563fe5d60e0f49893824d716c725a07c3f", + "sampled_process_group_rss_bytes": 78573568, + "script": "stages/rational-v2/run_finite.py", + "source_bytes_and_modes_unchanged": true, + "source_inventory_sha256": "40d4501c0cccda5cd1baeea5318c8383ef27f9f304fb74916a357803a2f321e5", + "status": "PASS", + "stderr_bytes": 0, + "stderr_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stdout_bytes": 1464, + "stdout_sha256": "b162af2597001ea976830675d044f8a938931c51a8de3fc37a087a88c8c132ba", + "termination": null, + "usage": { + "exit": 0, + "kernel_max_rss_kib": 48448, + "system_seconds": 0.06, + "user_seconds": 0.98 + }, + "wall_seconds": 1.0730973040044773 +} diff --git a/research/c-verification-feasibility/evidence/runs/rational-final-finite/stderr.txt b/research/c-verification-feasibility/evidence/runs/rational-final-finite/stderr.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/research/c-verification-feasibility/evidence/runs/rational-final-finite/stdout.txt b/research/c-verification-feasibility/evidence/runs/rational-final-finite/stdout.txt new file mode 100644 index 0000000000..c1a7ceca2b --- /dev/null +++ b/research/c-verification-feasibility/evidence/runs/rational-final-finite/stdout.txt @@ -0,0 +1,2 @@ +{"actual_word_run": false, "added_controls": ["165-general-rational-coefficient-prefixes", "batch-FIFO-and-full-counters", "exact-score-type", "score-subclass", "negative-score-denominator", "same-row", "nonbuiltin-gcd", "source-iterator-mutation", "score-list-mutation", "score-value-mutation", "callback-failure-publishes-completed-prefix", "arithmetic-code-drift", "inplace-protocol-drift", "materialization-source-drift", "gcd-drift", "operator-closure-drift", "13-complete-event-prefixes-with-nondyadic-weights-and-scalars", "noncanonical-weight-fallback", "changed-arithmetic-fallback"], "build": {"SOABI": "cpython-312-x86_64-linux-gnu", "binary_sha256": "78687893ce31dfc1c18d09d8c0b3d515f18ed1e1043c879c2fa5b65e11fc0596", "cold_build_load_wall_seconds": 0.5003387480101082, "compiler": "/usr/bin/cc", "compiler_cpu_accounting": "outer GNU time user+system includes compiler children", "compiler_version": "cc (Ubuntu 13.3.0-6ubuntu2~24.04.1) 13.3.0", "extension_suffix": ".cpython-312-x86_64-linux-gnu.so", "flags": ["-O2", "-shared", "-fPIC", "-std=c11", "-Wall", "-Werror", "-I/usr/include/python3.12"], "python": "3.12.3 (main, Aug 31 2026, 10:18:26) [GCC 13.3.0]", "source_sha256": "4a4949e36cff4ff2894dd1f9379b58a58346ec7c888903271d4b98bbe4cfc7ae"}, "comparisons": 178, "complete_performance": false, "control_count": 19, "independent_literal_oracle_used": true, "status": "PASS_BOUNDED_RATIONAL_PROTOTYPE_ONLY"} +PASS_ADDED_DESTRUCTOR_BINDING_CONTROL diff --git a/research/c-verification-feasibility/evidence/runs/rational-final-finite/usage.json b/research/c-verification-feasibility/evidence/runs/rational-final-finite/usage.json new file mode 100644 index 0000000000..4dec3df80e --- /dev/null +++ b/research/c-verification-feasibility/evidence/runs/rational-final-finite/usage.json @@ -0,0 +1 @@ +{"user_seconds":0.98,"system_seconds":0.06,"kernel_max_rss_kib":48448,"exit":0} diff --git a/research/c-verification-feasibility/evidence/runs/rational-finite-micro-v1/receipt.json b/research/c-verification-feasibility/evidence/runs/rational-finite-micro-v1/receipt.json new file mode 100644 index 0000000000..1d6bed1a86 --- /dev/null +++ b/research/c-verification-feasibility/evidence/runs/rational-finite-micro-v1/receipt.json @@ -0,0 +1,26 @@ +{ + "exit": 0, + "label": "rational-finite-micro-v1", + "optimized": false, + "platform": "Linux-7.0.0-38-generic-x86_64-with-glibc2.39", + "python": "3.12.3 (main, Aug 31 2026, 10:18:26) [GCC 13.3.0]", + "runner_sha256": "7540f8cc4ae4d12ed86c844ef0837a74184d3ada653979608c295c09f200a751", + "runtime_policy_sha256": "555fd5392118c4a534a518c673f6e984bf1a6325af5026dd48ddfd91f526bfb4", + "sampled_process_group_rss_bytes": 79007744, + "script": "stages/rational-v1/run_finite.py", + "source_bytes_and_modes_unchanged": true, + "source_inventory_sha256": "1f0300155f94d92cfbd39e01db9d2644f3319c1526ed7e27823d26cf12de4237", + "status": "PASS", + "stderr_bytes": 0, + "stderr_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stdout_bytes": 2482, + "stdout_sha256": "731a66a66e6661f7701c193bcf15b6f47b56851554bbb9e8b6495aa9af11c2e4", + "termination": null, + "usage": { + "exit": 0, + "kernel_max_rss_kib": 48324, + "system_seconds": 0.05, + "user_seconds": 1.19 + }, + "wall_seconds": 1.3062437750049867 +} diff --git a/research/c-verification-feasibility/evidence/runs/rational-finite-micro-v1/stderr.txt b/research/c-verification-feasibility/evidence/runs/rational-finite-micro-v1/stderr.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/research/c-verification-feasibility/evidence/runs/rational-finite-micro-v1/stdout.txt b/research/c-verification-feasibility/evidence/runs/rational-finite-micro-v1/stdout.txt new file mode 100644 index 0000000000..86b62cd1e5 --- /dev/null +++ b/research/c-verification-feasibility/evidence/runs/rational-finite-micro-v1/stdout.txt @@ -0,0 +1 @@ +{"actual_word_run": false, "added_controls": ["165-general-rational-coefficient-prefixes", "batch-FIFO-and-full-counters", "exact-score-type", "score-subclass", "negative-score-denominator", "same-row", "nonbuiltin-gcd", "source-iterator-mutation", "score-list-mutation", "score-value-mutation", "callback-failure-publishes-completed-prefix", "arithmetic-code-drift", "inplace-protocol-drift", "materialization-source-drift", "gcd-drift", "operator-closure-drift", "13-complete-event-prefixes-with-nondyadic-weights-and-scalars", "noncanonical-weight-fallback", "changed-arithmetic-fallback"], "build": {"SOABI": "cpython-312-x86_64-linux-gnu", "binary_sha256": "e512c567bf329e4e2877f49125e015236eb6f374e8d82ed0cd54fe366499f9ff", "cold_build_load_wall_seconds": 0.48050388900446706, "compiler": "/usr/bin/cc", "compiler_cpu_accounting": "outer GNU time user+system includes compiler children", "compiler_version": "cc (Ubuntu 13.3.0-6ubuntu2~24.04.1) 13.3.0", "extension_suffix": ".cpython-312-x86_64-linux-gnu.so", "flags": ["-O2", "-shared", "-fPIC", "-std=c11", "-Wall", "-Werror", "-I/usr/include/python3.12"], "python": "3.12.3 (main, Aug 31 2026, 10:18:26) [GCC 13.3.0]", "source_sha256": "4a4949e36cff4ff2894dd1f9379b58a58346ec7c888903271d4b98bbe4cfc7ae"}, "comparisons": 178, "complete_performance": false, "control_count": 19, "independent_literal_oracle_used": true, "micro": {"batches": 512, "coefficients": 32, "cold_build_excluded_from_micro": true, "complete_oracle_restoration_unpriced": true, "illustrative_only": true, "samples": [{"cpu_seconds": 0.06854380399999993, "label": "B1", "statistics": {"bypasses": 0, "calls": 16384, "capacity": 16384, "evictions": 0, "hits": 16352, "misses": 32, "resident": 32}, "wall_seconds": 0.06855765299405903}, {"cpu_seconds": 0.060203247000000015, "label": "C1", "statistics": {"bypasses": 0, "calls": 16384, "capacity": 16384, "evictions": 0, "hits": 16352, "misses": 32, "resident": 32}, "wall_seconds": 0.06020033897948451}, {"cpu_seconds": 0.046702148000000054, "label": "C2", "statistics": {"bypasses": 0, "calls": 16384, "capacity": 16384, "evictions": 0, "hits": 16352, "misses": 32, "resident": 32}, "wall_seconds": 0.04673448100220412}, {"cpu_seconds": 0.073957787, "label": "B2", "statistics": {"bypasses": 0, "calls": 16384, "capacity": 16384, "evictions": 0, "hits": 16352, "misses": 32, "resident": 32}, "wall_seconds": 0.07398301700595766}], "sequence": "BCCB"}, "status": "PASS_BOUNDED_RATIONAL_PROTOTYPE_ONLY"} diff --git a/research/c-verification-feasibility/evidence/runs/rational-finite-micro-v1/usage.json b/research/c-verification-feasibility/evidence/runs/rational-finite-micro-v1/usage.json new file mode 100644 index 0000000000..fef21d8609 --- /dev/null +++ b/research/c-verification-feasibility/evidence/runs/rational-finite-micro-v1/usage.json @@ -0,0 +1 @@ +{"user_seconds":1.19,"system_seconds":0.05,"kernel_max_rss_kib":48324,"exit":0} diff --git a/research/c-verification-feasibility/full_B.py b/research/c-verification-feasibility/full_B.py new file mode 100644 index 0000000000..b5117cef66 --- /dev/null +++ b/research/c-verification-feasibility/full_B.py @@ -0,0 +1,4 @@ +from portable import prepared +import runpy +with prepared('complete-B') as (_,baseline,stage): + runpy.run_path(str(stage/'baseline_full.py'),run_name='__main__') diff --git a/research/c-verification-feasibility/full_C.py b/research/c-verification-feasibility/full_C.py new file mode 100644 index 0000000000..0f987cd86e --- /dev/null +++ b/research/c-verification-feasibility/full_C.py @@ -0,0 +1,4 @@ +from portable import prepared +import runpy +with prepared('complete-C') as (_,baseline,stage): + runpy.run_path(str(stage/'candidate_full.py'),run_name='__main__') diff --git a/research/c-verification-feasibility/guard.py b/research/c-verification-feasibility/guard.py new file mode 100644 index 0000000000..bf4265b129 --- /dev/null +++ b/research/c-verification-feasibility/guard.py @@ -0,0 +1,120 @@ +"""Serial bounded Linux measurements; preserve the complete frozen precision contract.""" +import argparse +import fcntl +import hashlib +import json +import os +from pathlib import Path +import platform +import signal +import statistics +import subprocess +import sys +import tempfile +import time + +HERE = Path(__file__).resolve().parent +SOURCE = HERE +CLOSURE = ('frozen.py','primitive_profile.py','guard.py','dispatch.py','inputs/PR5848.tar','../feasibility/fraction_table.py','../feasibility/finite.py','/usr/lib/python3.12/fractions.py','../feasibility/actual_audit.py') +TIMEOUT = 180 +RSS_CAP = 1024**3 +OUTPUT_CAP = 2*1024**2 +AGGREGATE = 600 +PREVIOUS_WALL_SECONDS = 0 + +def sha(raw): + return hashlib.sha256(raw).hexdigest() + +def inventory(): + result = {} + for name in CLOSURE: + path = SOURCE / name + if path.is_symlink() or not path.is_file(): + raise ValueError('Regular complete runtime file: ' + name) + result[name] = [sha(path.read_bytes()), path.stat().st_mode & 0o777] + return result + +def group_rss(group): + total = 0 + count = 0 + for p in Path('/proc').iterdir(): + if not p.name.isdigit(): + continue + try: + raw = (p/'stat').read_text() + fields = raw[raw.rfind(')')+2:].split() + if int(fields[2]) == group: + total += int(fields[21])*os.sysconf('SC_PAGE_SIZE') + count += 1 + except (FileNotFoundError, ProcessLookupError, PermissionError): + pass + return total, count + +def run(label, script, optimized=False): + records = HERE/'runs' + records.mkdir(exist_ok=True) + prior = list(records.glob('*/receipt.json')) + spent = PREVIOUS_WALL_SECONDS + sum(json.loads(p.read_bytes())['wall_seconds'] for p in prior) + if spent >= AGGREGATE: + raise ValueError('Aggregate budget consumed') + folder = records/label + folder.mkdir() + before = inventory() + env = os.environ.copy() + for key in ('PYTHONPATH','PYTHONOPTIMIZE','PYTHONINSPECT','PYTHONSTARTUP','PYTHONPYCACHEPREFIX'): + env.pop(key,None) + env.update(PYTHONHASHSEED='0', LC_ALL='C.UTF-8', TZ='UTC') + usage = folder/'usage.json' + with tempfile.TemporaryDirectory(prefix='linux5757-bytecode-') as cache: + command = ['/usr/bin/python3.12', '-B', '-X', 'pycache_prefix='+cache] + if optimized: + command.append('-O') + command.append(str(SOURCE/script)) + timed = ['/usr/bin/time','-f','{"user_seconds":%U,"system_seconds":%S,"kernel_max_rss_kib":%M,"exit":%x}', '-o', str(usage),'--',*command] + start = time.monotonic() + peak = 0 + stop = None + with (folder/'stdout.txt').open('wb') as out, (folder/'stderr.txt').open('wb') as err: + p = subprocess.Popen(timed, cwd=SOURCE, env=env, stdout=out, stderr=err, start_new_session=True) + try: + while p.poll() is None: + rss, _ = group_rss(p.pid) + peak = max(peak,rss) + elapsed = time.monotonic()-start + if rss > RSS_CAP: + stop='sampled_group_rss_cap' + elif elapsed > min(TIMEOUT,AGGREGATE-spent): + stop='wall_or_aggregate_cap' + elif max((folder/'stdout.txt').stat().st_size,(folder/'stderr.txt').stat().st_size)>OUTPUT_CAP: + stop='output_cap' + if stop: + os.killpg(p.pid,signal.SIGKILL) + break + time.sleep(0.05) + code=p.wait() + finally: + try: os.killpg(p.pid,signal.SIGKILL) + except ProcessLookupError: pass + p.wait() + elapsed = time.monotonic()-start + stdout=(folder/'stdout.txt').read_bytes() + stderr=(folder/'stderr.txt').read_bytes() + after=inventory() + measurement=None + if usage.exists(): + try: measurement=json.loads(usage.read_bytes()) + except json.JSONDecodeError: measurement={'raw':usage.read_text()} + receipt={'label':label,'script':script,'optimized':optimized,'wall_seconds':elapsed, + 'exit':code,'termination':stop,'sampled_process_group_rss_bytes':peak, + 'usage':measurement,'stdout_sha256':sha(stdout),'stdout_bytes':len(stdout), + 'stderr_sha256':sha(stderr),'stderr_bytes':len(stderr), + 'source_inventory_sha256':sha(json.dumps(before,sort_keys=True,separators=(',',':')).encode()), + 'source_bytes_and_modes_unchanged':before==after, + 'python':sys.version,'platform':platform.platform(), + 'runner_sha256':sha(Path(__file__).read_bytes()),'runtime_policy_sha256':sha(json.dumps(CLOSURE).encode())} + receipt['status']='PASS' if code==0 and stop is None and not stderr and before==after else 'STOP' + (folder/'receipt.json').write_text(json.dumps(receipt,indent=2,sort_keys=True)+'\n') + print(json.dumps(receipt,sort_keys=True),flush=True) + if receipt['status']!='PASS': + raise SystemExit(1) + return receipt diff --git a/research/c-verification-feasibility/integer/finite_probe.py b/research/c-verification-feasibility/integer/finite_probe.py new file mode 100644 index 0000000000..c0457d346c --- /dev/null +++ b/research/c-verification-feasibility/integer/finite_probe.py @@ -0,0 +1,194 @@ +"""Finite qualification source for the source-only integer/format prototype. + +Not executed by its author. Parent-owned serial runner must pay compilation, +loading, all checks, allocation/copy costs and complete qualification costs. +Literal expected arithmetic below does not call any candidate helper. +Ali Romman predecessor integer replay; Chris R / Clear1nsight and substantial +OpenAI Codex assistance for this derivative feasibility source. Apache-2.0. +""" +from fractions import Fraction + + +def need(ok, message): + if not ok: + raise ValueError(message) + + +def multiply(value, numerator, exponent): + value *= numerator + need(not exponent or value % (1 << exponent) == 0, 'exact dyadic division') + return value >> exponent + + +def literal_row(dst, src, numerator, exponent, scores=None, weights=None): + out = dict(dst) + totals = None if scores is None else list(scores) + for event, value in src.items(): + old = out.get(event, 0) + new = old + multiply(value, numerator, exponent) + if totals is not None: + change = abs(new) - abs(old) + totals[0] += change * weights[event][0] + totals[1] += change * weights[event][1] + totals[2] += change + if new: + out[event] = new + else: + out.pop(event, None) + return out if totals is None else (out, tuple(totals)) + + +def literal_coefficient_bytes(row, scale): + parts = [] + for event in sorted(row, reverse=True): + value = Fraction(row[event], scale) + parts.append(f'{event}:{value.numerator}/{value.denominator};'.encode()) + return b''.join(parts) + + +def run(native): + checks = [] + + def reject(label, fn, exception): + try: + fn() + except exception: + checks.append(label) + else: + raise ValueError('accepted rejected fixture: ' + label) + + big = 1 << 8192 + cases = [ + ({}, {}, 1, 0), + ({0: 8}, {0: 8}, -1, 0), + ({0: 3, 1: -2}, {0: -8, 2: 16}, 3, 2), + ({0: -3}, {0: 8, 3: -24}, -5, 3), + ({0: big, 1: -big}, {0: big, 2: -3 * big}, 3, 130), + ({0: 0, 1: 7}, {0: 0, 2: 8}, 0, 1), + ({3: -1}, {0: -16, 1: 48}, -7, 4), + ({0: big + 1}, {0: -(big + 1), 3: big - 1}, 1, 0), + ] + weights = [(3, 5), (7, 11), (13, 17), (19, 23)] + scores = [29, 31, 37] + for dst, src, numerator, exponent in cases: + before = (dict(dst), dict(src), list(scores), list(weights)) + need(native.add_row(dst, src, numerator, exponent) == + literal_row(dst, src, numerator, exponent), 'sparse row equality') + need(native.error_row(dst, src, numerator, exponent, scores, weights) == + literal_row(dst, src, numerator, exponent, scores, weights), + 'signed cancellation and weighted score equality') + need(native.scale_row(src, numerator, exponent) == + {i: multiply(v, numerator, exponent) for i, v in src.items()}, + 'scaled row equality including retained zero entries') + need((dst, src, scores, weights) == before, 'all row inputs unchanged') + checks.append('eight-row-and-score-differentials') + + same = {0: 8, 2: -16} + snapshot = dict(same) + need(native.add_row(same, same, -1, 0) == {}, 'safe aliased cancellation') + need(native.error_row(same, same, -1, 0, scores, weights) == + literal_row(same, same, -1, 0, scores, weights), 'safe aliased error row') + need(same == snapshot, 'alias source unchanged') + checks.append('aliased-inputs-return-fresh-outputs') + + # Prefix comparisons preserve source insertion order and every full row. + candidate, literal = {}, {} + candidate_scores = literal_scores = (0, 0, 0) + prefix_count = 0 + for src, numerator, exponent in [ + ({0: 64, 1: -32}, 1, 0), ({0: 32, 2: 16}, -2, 0), + ({1: 64, 3: -128}, 3, 1), ({2: -64, 3: 128}, 1, 2), + ({0: big, 1: -big}, 3, 130), ({0: big, 1: -big}, -3, 130)]: + candidate, candidate_scores = native.error_row( + candidate, src, numerator, exponent, candidate_scores, weights) + literal, literal_scores = literal_row( + literal, src, numerator, exponent, literal_scores, weights) + need((candidate, candidate_scores) == (literal, literal_scores), 'every signed prefix') + need(native.coefficient_bytes(candidate, 64) == + literal_coefficient_bytes(literal, 64), 'every prefix full canonical bytes') + prefix_count += 1 + checks.append('six-ordered-prefixes-and-complete-bytes') + + hash_rows = [({}, 1), ({0: 0}, 8), ({3: -8, 0: 16, 2: -3, 1: 0}, 8), + ({big: -(big + 1), 0: big, -2: -big}, 1 << 130), + ({1: -big, 0: big, 2: 3}, 1)] + for row, scale in hash_rows: + expected = literal_coefficient_bytes(row, scale) + got = native.coefficient_bytes(row, scale) + need(type(got) is bytes and got == expected, 'complete descending canonical bytes') + for event, value in row.items(): + need(native.coefficient_item_bytes(event, value, scale) == + literal_coefficient_bytes({event: value}, scale), 'signed one-event bytes') + checks.append('zero-negative-large-reduced-and-ordered-formatting') + for event, values, units in [ + (0, (0, 8, -8), (1, 8, 8)), + (17, (-3, 12, big + 1), (8, 8, 1 << 130)), + (-1, (-big, big, 0), (1, 1, 16))]: + expected = (str(event) + ':' + ','.join(str(Fraction(v, u)) + for v, u in zip(values, units)) + ';').encode() + need(native.score_bytes(event, values, units) == expected, 'score stream bytes omit /1') + checks.append('score-string-contract-distinct-from-coefficient-contract') + + column = {2: -64, 0: 128, 1: 0} + table = [[2, 3, 5], [7, 11, 13], [17, 19, 23]] + before = [list(row) for row in table] + expected = [(i, (table[i][0] + abs(v) * 3, + table[i][1] + abs(v) * 7, table[i][2] + abs(v)), + literal_coefficient_bytes({9: v}, 64)) for i, v in column.items()] + need(native.reverse_updates(column, table, 3, 7, 9, 64) == expected, + 'reverse scores and signed bytes in dict insertion order') + need(table == before, 'reverse score inputs unchanged') + shared = [2, 3, 5] + aliased_table = [shared] * 3 + native.reverse_updates(column, aliased_table, 3, 7, 9, 64) + need(aliased_table == [[2, 3, 5]] * 3 and shared == [2, 3, 5], 'reverse score alias safety') + checks.append('reverse-scores-signed-bytes-and-aliases') + + class ForeignInt(int): + def __mul__(self, other): + raise RuntimeError('foreign arithmetic must never execute') + + class ForeignDict(dict): + pass + + class ForeignList(list): + pass + + reject('bool-numerator', lambda: native.add_row({}, {}, True, 0), TypeError) + reject('foreign-int-value', lambda: native.add_row({}, {0: ForeignInt(2)}, 1, 0), TypeError) + reject('foreign-dict', lambda: native.add_row(ForeignDict(), {}, 1, 0), TypeError) + reject('foreign-key', lambda: native.add_row({}, {ForeignInt(0): 2}, 1, 0), TypeError) + reject('float-value', lambda: native.add_row({}, {0: 2.0}, 1, 0), TypeError) + reject('negative-exponent', lambda: native.add_row({}, {}, 1, -1), ValueError) + reject('bool-exponent', lambda: native.add_row({}, {}, 1, True), TypeError) + failed_dst, failed_src = {0: 9}, {0: 4, 1: 3} + reject('inexact-division-transaction', lambda: native.add_row(failed_dst, failed_src, 1, 1), ValueError) + need(failed_dst == {0: 9} and failed_src == {0: 4, 1: 3}, 'failure leaves inputs unchanged') + reject('inexact-scaled-row', lambda: native.scale_row({0: -3}, 1, 1), ValueError) + reject('nondyadic-scale', lambda: native.coefficient_bytes({0: 1}, 3), ValueError) + reject('zero-scale', lambda: native.coefficient_bytes({}, 0), ValueError) + reject('negative-scale', lambda: native.coefficient_bytes({}, -8), ValueError) + reject('bool-scale', lambda: native.coefficient_bytes({}, True), TypeError) + reject('short-score', lambda: native.error_row({}, {}, 1, 0, (0, 0), weights), ValueError) + reject('foreign-scores', lambda: native.error_row({}, {}, 1, 0, ForeignList([0, 0, 0]), weights), TypeError) + reject('foreign-weight', lambda: native.error_row({}, {0: 1}, 1, 0, scores, [(1, True)]), TypeError) + reject('weight-index-range', lambda: native.error_row({}, {4: 1}, 1, 0, scores, weights), IndexError) + reject('negative-weight-index', lambda: native.error_row({}, {-1: 1}, 1, 0, scores, weights), IndexError) + reject('reverse-index-range', lambda: native.reverse_updates({3: 1}, table, 1, 1, 0, 1), IndexError) + reject('score-nondyadic-unit', lambda: native.score_bytes(0, (0, 0, 0), (1, 1, 3)), ValueError) + reject('event-type', lambda: native.coefficient_item_bytes(True, 1, 1), TypeError) + return dict(status='PASS_FINITE_INTEGER_FORMAT', checks=checks, + row_cases=len(cases), ordered_prefixes=prefix_count, + independent_fraction_formatting=True, whole_replay=False, + timing_claim=False) + + +if __name__ == '__main__': + import argparse + import json + import native_loader + parser = argparse.ArgumentParser() + parser.add_argument('--source-sha256', required=True) + args = parser.parse_args() + result = run(native_loader.load(args.source_sha256)) + print(json.dumps(dict(result=result, build=native_loader.receipt()), sort_keys=True)) diff --git a/research/c-verification-feasibility/integer/integer_binding.py b/research/c-verification-feasibility/integer/integer_binding.py new file mode 100644 index 0000000000..8f888a1c42 --- /dev/null +++ b/research/c-verification-feasibility/integer/integer_binding.py @@ -0,0 +1,84 @@ +"""Derive a fresh candidate module from one authenticated integer.py source. + +No file is patched and no Fraction/reference function is monkeypatched. +All complete controls must run against this candidate as an explicitly changed +integer backend. The frozen PR5864 original remains separately loadable. +Source-only at handoff: not executed by its author. +""" +from hashlib import sha256 +from pathlib import Path +import types + + +REPLACEMENTS = [ + ('''def add_row(dst,src,n,k): + for i,v in src.items(): + value=dst.get(i,0)+multiply(v,n,k) + if value:dst[i]=value + else:dst.pop(i,None) +''', '''def add_row(dst,src,n,k): + return _integer_native.add_row(dst,src,n,k) +''', 1, 'fresh-native-sparse-add'), + (' add_row(rows[r],rows[s],a,k)', + ' rows[r]=add_row(rows[r],rows[s],a,k)', + 1, 'ideal-adopts-fresh-row'), + ('rows[r]={i:multiply(v,a,k) for i,v in rows[r].items()}', + 'rows[r]=_integer_native.scale_row(rows[r],a,k)', + 2, 'ideal-and-error-native-scale'), + (''' for i,v in rows[s].items(): + old=rows[r].get(i,0);value=old+multiply(v,a,k);change=abs(value)-abs(old) + scores[r][0]+=change*w[i][0];scores[r][1]+=change*w[i][1];scores[r][2]+=change + if value:rows[r][i]=value + else:rows[r].pop(i,None) +''', ''' rows[r],native_scores=_integer_native.error_row(rows[r],rows[s],a,k,scores[r],w) + scores[r]=list(native_scores) +''', 1, 'native-signed-error-row-and-scores'), + (" stream.update((str(j)+':'+','.join(str(F(v,u)) for v,u in zip(scores[r],units))+';').encode())", + ' stream.update(_integer_native.score_bytes(j,scores[r],units))', + 1, 'exact-three-score-stream-bytes'), + (' for j in sorted(row,reverse=True):update_hash(h,j,row[j],S)', + ' h.update(_integer_native.coefficient_bytes(row,S))', + 1, 'full-descending-coefficient-bytes'), + (''' for i,v in columns[r].items(): + scores[i][0]+=abs(v)*w[j][0];scores[i][1]+=abs(v)*w[j][1];scores[i][2]+=abs(v) + update_hash(hashes[i],j,v,S) +''', ''' for i,native_scores,native_bytes in _integer_native.reverse_updates(columns[r],scores,w[j][0],w[j][1],j,S): + scores[i]=list(native_scores) + hashes[i].update(native_bytes) +''', 1, 'native-reverse-scores-and-signed-byte-chunks'), + ('columns[r]={i:multiply(v,a,k) for i,v in columns[r].items()}', + 'columns[r]=_integer_native.scale_row(columns[r],a,k)', + 1, 'reverse-native-scale'), + ("elif op in ('ADD','COPY'):add_row(columns[s],columns[r],a,k)", + "elif op in ('ADD','COPY'):columns[s]=add_row(columns[s],columns[r],a,k)", + 1, 'reverse-adopts-fresh-row'), +] + + +def derive(source_path, native, expected_source_sha256): + source_path = Path(source_path) + if source_path.is_symlink() or not source_path.is_file(): + raise ValueError('integer input is a regular non-symlink source') + raw = source_path.read_bytes() + digest = sha256(raw).hexdigest() + if digest != expected_source_sha256: + raise ValueError('exact frozen integer source') + source = raw.decode('utf-8') + changes = [] + for before, after, count, name in REPLACEMENTS: + if source.count(before) != count: + raise ValueError('declared candidate seam count: ' + name) + source = source.replace(before, after) + changes.append(dict(name=name, count=count)) + module = types.ModuleType('integer_native_candidate') + module.__file__ = str(source_path) + module._integer_native = native + exec(compile(source, '', 'exec'), module.__dict__) + receipt = dict(original_integer_sha256=digest, + derived_integer_sha256=sha256(source.encode()).hexdigest(), + changes=changes, + integer_backend_changed=True, + fraction_reference_module_modified=False, + whole_replay_qualified=False, + source_only_handoff=True) + return module, receipt diff --git a/research/c-verification-feasibility/integer/integer_format.c b/research/c-verification-feasibility/integer/integer_format.c new file mode 100644 index 0000000000..a7f21fc93b --- /dev/null +++ b/research/c-verification-feasibility/integer/integer_format.c @@ -0,0 +1,470 @@ +/* + * Exact integer sparse-row and canonical dyadic formatting feasibility source. + * Derived from integer.py: Ali Romman with substantial OpenAI Codex assistance. + * Original literal scalar and reverse-cut oracles remain in the authenticated + * reference. New C implementation: OpenAI Codex assistance, 2026-10-27. + * Apache-2.0; preserve the predecessor NOTICE and complete attribution chain. + * + * SOURCE-ONLY PROTOTYPE: not compiled, executed, qualified, or benchmarked by + * its author. Uses public Python C API and arbitrary-size exact PyLong values. + * No mutable process-global answer cache and no sharing with Fraction oracle. + * Row functions return fresh objects and never mutate any supplied object. + */ +#define PY_SSIZE_T_CLEAN +#include + +static int exact_int(PyObject *value) +{ + if (!PyLong_CheckExact(value)) { + PyErr_SetString(PyExc_TypeError, "exact built-in int required"); + return 0; + } + return 1; +} + +static Py_ssize_t sequence_length(PyObject *value) +{ + if (PyList_CheckExact(value)) return PyList_GET_SIZE(value); + if (PyTuple_CheckExact(value)) return PyTuple_GET_SIZE(value); + PyErr_SetString(PyExc_TypeError, "exact built-in list or tuple required"); + return -1; +} + +static PyObject *sequence_item(PyObject *value, Py_ssize_t index) +{ + return PyList_CheckExact(value) ? PyList_GET_ITEM(value, index) + : PyTuple_GET_ITEM(value, index); +} + +static int int_sequence(PyObject *value, Py_ssize_t length) +{ + Py_ssize_t size = sequence_length(value); + if (size < 0) return 0; + if (size != length) { + PyErr_SetString(PyExc_ValueError, "integer sequence has required length"); + return 0; + } + for (Py_ssize_t i = 0; i < size; ++i) + if (!exact_int(sequence_item(value, i))) return 0; + return 1; +} + +static int int_row(PyObject *row) +{ + Py_ssize_t pos = 0; + PyObject *key, *value; + if (!PyDict_CheckExact(row)) { + PyErr_SetString(PyExc_TypeError, "exact built-in dict required"); + return 0; + } + while (PyDict_Next(row, &pos, &key, &value)) + if (!exact_int(key) || !exact_int(value)) return 0; + return 1; +} + +/* Positive power-of-two scale only; zero and negative scales cannot enter + * the dyadic normalizer. All operations remain PyLong operations. */ +static int dyadic_scale(PyObject *scale) +{ + PyObject *zero = NULL, *one = NULL, *less = NULL, *mask = NULL; + int positive, nonzero, ok = 0; + if (!exact_int(scale)) return 0; + zero = PyLong_FromLong(0); + one = PyLong_FromLong(1); + if (!zero || !one) goto done; + positive = PyObject_RichCompareBool(scale, zero, Py_GT); + if (positive < 0) goto done; + if (!positive) { + PyErr_SetString(PyExc_ValueError, "positive dyadic scale required"); + goto done; + } + less = PyNumber_Subtract(scale, one); + if (!less) goto done; + mask = PyNumber_And(scale, less); + if (!mask) goto done; + nonzero = PyObject_IsTrue(mask); + if (nonzero < 0) goto done; + if (nonzero) { + PyErr_SetString(PyExc_ValueError, "positive dyadic scale required"); + goto done; + } + ok = 1; + done: + Py_XDECREF(zero); Py_XDECREF(one); Py_XDECREF(less); Py_XDECREF(mask); + return ok; +} + +static PyObject *shift_denominator(PyObject *exponent, int *divide) +{ + PyObject *zero = NULL, *one = NULL, *result = NULL; + int negative; + if (!exact_int(exponent)) return NULL; + zero = PyLong_FromLong(0); + one = PyLong_FromLong(1); + if (!zero || !one) goto done; + negative = PyObject_RichCompareBool(exponent, zero, Py_LT); + if (negative < 0) goto done; + if (negative) { + PyErr_SetString(PyExc_ValueError, "nonnegative dyadic exponent required"); + goto done; + } + *divide = PyObject_IsTrue(exponent); + if (*divide < 0) goto done; + result = PyNumber_Lshift(one, exponent); + done: + Py_XDECREF(zero); Py_XDECREF(one); + return result; +} + +static PyObject *multiply_exact(PyObject *value, PyObject *numerator, + PyObject *denominator, int divide) +{ + PyObject *product = PyNumber_Multiply(value, numerator), *pair, *result; + int remainder; + if (!product || !divide) return product; + pair = PyNumber_Divmod(product, denominator); + Py_DECREF(product); + if (!pair) return NULL; + remainder = PyObject_IsTrue(PyTuple_GET_ITEM(pair, 1)); + if (remainder < 0) { Py_DECREF(pair); return NULL; } + if (remainder) { + Py_DECREF(pair); + PyErr_SetString(PyExc_ValueError, "exact dyadic division"); + return NULL; + } + result = Py_NewRef(PyTuple_GET_ITEM(pair, 0)); + Py_DECREF(pair); + return result; +} + +static int add_product(PyObject **score, PyObject *value, PyObject *weight) +{ + PyObject *product = weight ? PyNumber_Multiply(value, weight) + : Py_NewRef(value); + PyObject *next; + if (!product) return 0; + next = PyNumber_Add(*score, product); + Py_DECREF(product); + if (!next) return 0; + Py_SETREF(*score, next); + return 1; +} + +static PyObject *indexed_pair(PyObject *weights, PyObject *key) +{ + Py_ssize_t size = sequence_length(weights), index; + PyObject *pair; + if (size < 0) return NULL; + index = PyLong_AsSsize_t(key); + if (index == -1 && PyErr_Occurred()) return NULL; + if (index < 0 || index >= size) { + PyErr_SetString(PyExc_IndexError, "weight event index out of range"); + return NULL; + } + pair = sequence_item(weights, index); + return int_sequence(pair, 2) ? pair : NULL; +} + +static PyObject *row_add(PyObject *dst, PyObject *src, PyObject *numerator, + PyObject *exponent, PyObject *scores, PyObject *weights) +{ + PyObject *out = NULL, *den = NULL, *zero = NULL, *score_tuple = NULL; + PyObject *s[3] = {NULL, NULL, NULL}; + PyObject *key, *value, *scaled = NULL, *next = NULL; + PyObject *old_abs = NULL, *new_abs = NULL, *change = NULL, *result = NULL; + Py_ssize_t pos = 0; + int divide = 0, nonzero; + if (!int_row(dst) || !int_row(src) || !exact_int(numerator)) goto done; + if (scores) { + if (!int_sequence(scores, 3) || sequence_length(weights) < 0) goto done; + for (int c = 0; c < 3; ++c) s[c] = Py_NewRef(sequence_item(scores, c)); + } + den = shift_denominator(exponent, ÷); + zero = PyLong_FromLong(0); + if (!den || !zero) goto done; + out = PyDict_Copy(dst); + if (!out) goto done; + while (PyDict_Next(src, &pos, &key, &value)) { + PyObject *old = PyDict_GetItemWithError(out, key); + PyObject *pair = NULL; + int existed = old != NULL; + if (!old && PyErr_Occurred()) goto done; + if (!old) old = zero; + if (scores) { + pair = indexed_pair(weights, key); + if (!pair) goto done; + } + scaled = multiply_exact(value, numerator, den, divide); + if (!scaled) goto done; + next = PyNumber_Add(old, scaled); + Py_CLEAR(scaled); + if (!next) goto done; + if (scores) { + old_abs = PyNumber_Absolute(old); + new_abs = PyNumber_Absolute(next); + if (!old_abs || !new_abs) goto done; + change = PyNumber_Subtract(new_abs, old_abs); + Py_CLEAR(old_abs); Py_CLEAR(new_abs); + if (!change) goto done; + if (!add_product(&s[0], change, sequence_item(pair, 0)) || + !add_product(&s[1], change, sequence_item(pair, 1)) || + !add_product(&s[2], change, NULL)) goto done; + Py_CLEAR(change); + } + nonzero = PyObject_IsTrue(next); + if (nonzero < 0) goto done; + if (nonzero) { + if (PyDict_SetItem(out, key, next) < 0) goto done; + } else if (existed && PyDict_DelItem(out, key) < 0) goto done; + Py_CLEAR(next); + } + if (scores) { + score_tuple = PyTuple_New(3); + if (!score_tuple) goto done; + for (int c = 0; c < 3; ++c) { + PyTuple_SET_ITEM(score_tuple, c, s[c]); s[c] = NULL; + } + result = PyTuple_Pack(2, out, score_tuple); + } else result = Py_NewRef(out); + done: + Py_XDECREF(out); Py_XDECREF(den); Py_XDECREF(zero); + Py_XDECREF(score_tuple); Py_XDECREF(scaled); Py_XDECREF(next); + Py_XDECREF(old_abs); Py_XDECREF(new_abs); Py_XDECREF(change); + for (int c = 0; c < 3; ++c) Py_XDECREF(s[c]); + return result; +} + +static PyObject *add_row_method(PyObject *self, PyObject *args) +{ + PyObject *dst, *src, *numerator, *exponent; + (void)self; + if (!PyArg_ParseTuple(args, "OOOO:add_row", &dst, &src, &numerator, &exponent)) return NULL; + return row_add(dst, src, numerator, exponent, NULL, NULL); +} + +static PyObject *error_row_method(PyObject *self, PyObject *args) +{ + PyObject *dst, *src, *numerator, *exponent, *scores, *weights; + (void)self; + if (!PyArg_ParseTuple(args, "OOOOOO:error_row", &dst, &src, &numerator, + &exponent, &scores, &weights)) return NULL; + return row_add(dst, src, numerator, exponent, scores, weights); +} + +static PyObject *scale_row_method(PyObject *self, PyObject *args) +{ + PyObject *row, *numerator, *exponent, *den = NULL, *out = NULL, *result = NULL; + PyObject *key, *value, *next = NULL; + Py_ssize_t pos = 0; + int divide = 0; + (void)self; + if (!PyArg_ParseTuple(args, "OOO:scale_row", &row, &numerator, &exponent)) return NULL; + if (!int_row(row) || !exact_int(numerator)) goto done; + den = shift_denominator(exponent, ÷); + out = PyDict_New(); + if (!den || !out) goto done; + while (PyDict_Next(row, &pos, &key, &value)) { + next = multiply_exact(value, numerator, den, divide); + if (!next || PyDict_SetItem(out, key, next) < 0) goto done; + Py_CLEAR(next); + } + result = Py_NewRef(out); + done: + Py_XDECREF(den); Py_XDECREF(out); Py_XDECREF(next); + return result; +} + +/* scale was checked once by the batch entry point. For nonzero signed v, + * v & -v is its positive power-of-two divisor. Intersect with scale by min; + * dividing by that factor gives the same canonical pair as Fraction(v,scale). + * Exact integer decimal conversion retains CPython's configured digit guard. */ +static PyObject *ratio_text(PyObject *value, PyObject *scale, int always_denominator) +{ + PyObject *negative = NULL, *low = NULL, *factor = NULL, *num = NULL; + PyObject *den = NULL, *one = NULL, *result = NULL; + int nonzero = PyObject_IsTrue(value), larger, unit; + if (nonzero < 0) return NULL; + if (!nonzero) return PyUnicode_FromString(always_denominator ? "0/1" : "0"); + negative = PyNumber_Negative(value); + if (!negative) goto done; + low = PyNumber_And(value, negative); + if (!low) goto done; + larger = PyObject_RichCompareBool(low, scale, Py_GT); + if (larger < 0) goto done; + factor = larger ? scale : low; + num = PyNumber_FloorDivide(value, factor); + den = PyNumber_FloorDivide(scale, factor); + one = PyLong_FromLong(1); + if (!num || !den || !one) goto done; + unit = PyObject_RichCompareBool(den, one, Py_EQ); + if (unit < 0) goto done; + result = !always_denominator && unit ? PyObject_Str(num) + : PyUnicode_FromFormat("%S/%S", num, den); + done: + Py_XDECREF(negative); Py_XDECREF(low); Py_XDECREF(num); + Py_XDECREF(den); Py_XDECREF(one); + return result; +} + +static PyObject *event_text(PyObject *event, PyObject *value, PyObject *scale) +{ + PyObject *ratio = ratio_text(value, scale, 1), *result; + if (!ratio) return NULL; + result = PyUnicode_FromFormat("%S:%U;", event, ratio); + Py_DECREF(ratio); + return result; +} + +static PyObject *coefficient_bytes_method(PyObject *self, PyObject *args) +{ + PyObject *row, *scale, *keys = NULL, *parts = NULL, *empty = NULL; + PyObject *text = NULL, *result = NULL; + Py_ssize_t count; + (void)self; + if (!PyArg_ParseTuple(args, "OO:coefficient_bytes", &row, &scale)) return NULL; + if (!int_row(row) || !dyadic_scale(scale)) goto done; + keys = PyDict_Keys(row); + if (!keys || PyList_Sort(keys) < 0 || PyList_Reverse(keys) < 0) goto done; + count = PyList_GET_SIZE(keys); + parts = PyTuple_New(count); + if (!parts) goto done; + for (Py_ssize_t i = 0; i < count; ++i) { + PyObject *key = PyList_GET_ITEM(keys, i); + PyObject *value = PyDict_GetItemWithError(row, key); + PyObject *part; + if (!value) goto done; + part = event_text(key, value, scale); + if (!part) goto done; + PyTuple_SET_ITEM(parts, i, part); + } + empty = PyUnicode_FromString(""); + if (!empty) goto done; + text = PyUnicode_Join(empty, parts); + if (!text) goto done; + result = PyUnicode_AsUTF8String(text); + done: + Py_XDECREF(keys); Py_XDECREF(parts); Py_XDECREF(empty); Py_XDECREF(text); + return result; +} + +static PyObject *coefficient_item_bytes_method(PyObject *self, PyObject *args) +{ + PyObject *event, *value, *scale, *text, *result; + (void)self; + if (!PyArg_ParseTuple(args, "OOO:coefficient_item_bytes", &event, &value, &scale)) return NULL; + if (!exact_int(event) || !exact_int(value) || !dyadic_scale(scale)) return NULL; + text = event_text(event, value, scale); + if (!text) return NULL; + result = PyUnicode_AsUTF8String(text); + Py_DECREF(text); + return result; +} + +static PyObject *score_bytes_method(PyObject *self, PyObject *args) +{ + PyObject *event, *scores, *units, *parts = NULL, *comma = NULL; + PyObject *joined = NULL, *text = NULL, *result = NULL; + (void)self; + if (!PyArg_ParseTuple(args, "OOO:score_bytes", &event, &scores, &units)) return NULL; + if (!exact_int(event) || !int_sequence(scores, 3) || !int_sequence(units, 3)) goto done; + parts = PyTuple_New(3); + if (!parts) goto done; + for (int c = 0; c < 3; ++c) { + PyObject *unit = sequence_item(units, c), *part; + if (!dyadic_scale(unit)) goto done; + part = ratio_text(sequence_item(scores, c), unit, 0); + if (!part) goto done; + PyTuple_SET_ITEM(parts, c, part); + } + comma = PyUnicode_FromString(","); + if (!comma) goto done; + joined = PyUnicode_Join(comma, parts); + if (!joined) goto done; + text = PyUnicode_FromFormat("%S:%U;", event, joined); + if (!text) goto done; + result = PyUnicode_AsUTF8String(text); + done: + Py_XDECREF(parts); Py_XDECREF(comma); Py_XDECREF(joined); Py_XDECREF(text); + return result; +} + +/* Each returned tuple is (column index, new three-score tuple, exact bytes). + * Iteration order is the original column's dict insertion order. The caller + * assigns scores[index] and updates hashes[index] in that order. Input score + * triples may alias: no mutation occurs here or in any other exported API. */ +static PyObject *reverse_updates_method(PyObject *self, PyObject *args) +{ + PyObject *column, *scores, *wa, *wc, *event, *scale; + PyObject *out = NULL, *s[3] = {NULL, NULL, NULL}, *magnitude = NULL; + PyObject *st = NULL, *text = NULL, *bytes = NULL, *item = NULL, *result = NULL; + PyObject *key, *value; + Py_ssize_t pos = 0, count, offset = 0; + (void)self; + if (!PyArg_ParseTuple(args, "OOOOOO:reverse_updates", &column, &scores, + &wa, &wc, &event, &scale)) return NULL; + if (!int_row(column) || !exact_int(wa) || !exact_int(wc) || + !exact_int(event) || !dyadic_scale(scale)) goto done; + count = sequence_length(scores); + if (count < 0) goto done; + out = PyList_New(PyDict_Size(column)); + if (!out) goto done; + while (PyDict_Next(column, &pos, &key, &value)) { + Py_ssize_t index = PyLong_AsSsize_t(key); + PyObject *old; + if (index == -1 && PyErr_Occurred()) goto done; + if (index < 0 || index >= count) { + PyErr_SetString(PyExc_IndexError, "reverse score index out of range"); + goto done; + } + old = sequence_item(scores, index); + if (!int_sequence(old, 3)) goto done; + for (int c = 0; c < 3; ++c) s[c] = Py_NewRef(sequence_item(old, c)); + magnitude = PyNumber_Absolute(value); + if (!magnitude || !add_product(&s[0], magnitude, wa) || + !add_product(&s[1], magnitude, wc) || !add_product(&s[2], magnitude, NULL)) goto done; + Py_CLEAR(magnitude); + st = PyTuple_New(3); + if (!st) goto done; + for (int c = 0; c < 3; ++c) { PyTuple_SET_ITEM(st, c, s[c]); s[c] = NULL; } + text = event_text(event, value, scale); + if (!text) goto done; + bytes = PyUnicode_AsUTF8String(text); + Py_CLEAR(text); + if (!bytes) goto done; + item = PyTuple_Pack(3, key, st, bytes); + Py_CLEAR(st); Py_CLEAR(bytes); + if (!item) goto done; + PyList_SET_ITEM(out, offset++, item); item = NULL; + } + result = Py_NewRef(out); + done: + Py_XDECREF(out); Py_XDECREF(magnitude); Py_XDECREF(st); + Py_XDECREF(text); Py_XDECREF(bytes); Py_XDECREF(item); + for (int c = 0; c < 3; ++c) Py_XDECREF(s[c]); + return result; +} + +static PyMethodDef methods[] = { + {"add_row", add_row_method, METH_VARARGS, "Return dst + (n/2**k)*src as a fresh exact-int dict."}, + {"error_row", error_row_method, METH_VARARGS, "Return fresh (row, three-score tuple) after sparse signed update."}, + {"scale_row", scale_row_method, METH_VARARGS, "Return fresh exact scaled row; reject non-exact divisions."}, + {"coefficient_bytes", coefficient_bytes_method, METH_VARARGS, "Descending full row bytes: event:numerator/denominator;."}, + {"coefficient_item_bytes", coefficient_item_bytes_method, METH_VARARGS, "One exact coefficient chunk for an ordered reverse stream."}, + {"score_bytes", score_bytes_method, METH_VARARGS, "Three score values with Fraction string conventions."}, + {"reverse_updates", reverse_updates_method, METH_VARARGS, "Fresh sparse reverse score updates with exact signed coefficient bytes."}, + {NULL, NULL, 0, NULL} +}; + +static struct PyModuleDef module = { + PyModuleDef_HEAD_INIT, + "_integer_format", + "Source-only exact integer and dyadic formatting feasibility prototype.", + -1, + methods, + NULL, NULL, NULL, NULL +}; + +PyMODINIT_FUNC PyInit__integer_format(void) +{ + return PyModule_Create(&module); +} diff --git a/research/c-verification-feasibility/integer/micro_probe.py b/research/c-verification-feasibility/integer/micro_probe.py new file mode 100644 index 0000000000..9037a2e2ca --- /dev/null +++ b/research/c-verification-feasibility/integer/micro_probe.py @@ -0,0 +1,77 @@ +"""One fixed synthetic batch per process; root controls ordering and budgets. + +No actual-word speed projection follows from this batch. The candidate command +includes cold compilation/loading and finite qualification before batch timing; +outer guarded wall/CPU is authoritative for the complete command bill. +This source was not executed by its author. +""" +import argparse +from fractions import Fraction +from hashlib import sha256 +import json +import time + +from finite_probe import literal_row, literal_coefficient_bytes, run as finite_run + + +def batch(native): + # Fixed inputs, generated afresh inside each batch invocation. No result or + # answer sharing across baseline/candidate processes or separate invocations. + weights = [(i + 1, 2 * i + 3) for i in range(64)] + rows = [{i: ((-1) ** i) * ((1 << 192) + i * 64) for i in range(32)} + for _ in range(4)] + scores = [[0, 0, 0] for _ in rows] + scale = 64 + units = (128, 256, 64) + stream = sha256() + for step in range(1024): + destination = step % 4 + source = {i: (-1 if (step + i) % 3 == 0 else 1) * + ((1 << 192) + (i + 1) * 64) + for i in range(step % 32, step % 32 + 32)} + numerator = -3 if step % 2 else 3 + if native is None: + row, score = literal_row(rows[destination], source, numerator, 3, + scores[destination], weights) + score_bytes = (str(step) + ':' + ','.join( + str(Fraction(v, u)) for v, u in zip(score, units)) + ';').encode() + coefficient_bytes = literal_coefficient_bytes(row, scale) + else: + row, score = native.error_row(rows[destination], source, numerator, 3, + scores[destination], weights) + score_bytes = native.score_bytes(step, score, units) + coefficient_bytes = native.coefficient_bytes(row, scale) + rows[destination], scores[destination] = row, list(score) + stream.update(score_bytes) + stream.update(coefficient_bytes) + return dict(batch='fixed-1024-synthetic-sparse-score-format-v1', + steps=1024, final_rows=rows, final_scores=scores, + complete_byte_stream_sha256=stream.hexdigest()) + + +if __name__ == '__main__': + parser = argparse.ArgumentParser() + parser.add_argument('--mode', choices=['baseline', 'candidate'], required=True) + parser.add_argument('--source-sha256') + args = parser.parse_args() + native = None + finite = None + build = None + if args.mode == 'candidate': + if args.source_sha256 is None: + parser.error('candidate requires --source-sha256') + import native_loader + native = native_loader.load(args.source_sha256) + finite = finite_run(native) + build = native_loader.receipt() + started_wall, started_cpu = time.perf_counter(), time.process_time() + result = batch(native) + batch_wall = time.perf_counter() - started_wall + batch_cpu = time.process_time() - started_cpu + result_digest = sha256(json.dumps(result, sort_keys=True, separators=(',', ':')).encode()).hexdigest() + print(json.dumps(dict(mode=args.mode, result_sha256=result_digest, + complete_byte_stream_sha256=result['complete_byte_stream_sha256'], + synthetic_batch_wall_seconds=batch_wall, + synthetic_batch_cpu_seconds=batch_cpu, + finite=finite, build=build, + complete_speed_claim=False), sort_keys=True)) diff --git a/research/c-verification-feasibility/integer/native_loader.py b/research/c-verification-feasibility/integer/native_loader.py new file mode 100644 index 0000000000..cb4534abef --- /dev/null +++ b/research/c-verification-feasibility/integer/native_loader.py @@ -0,0 +1,76 @@ +"""Paid cold build/load for root-owned, source-pinned serial feasibility only. + +This source was not executed by its author. A caller supplies the frozen C +source digest explicitly. No implicit acceptance of freshly edited C source. +""" +import atexit +from hashlib import sha256 +import importlib.util +from pathlib import Path +import platform +import shutil +import subprocess +import sys +import sysconfig +import tempfile +import time + +HERE = Path(__file__).resolve().parent +_loaded = None +_temporary = None +_receipt = None + + +def load(expected_source_sha256): + global _loaded, _temporary, _receipt + path = HERE / 'integer_format.c' + if path.is_symlink() or not path.is_file(): + raise ValueError('owned C source is a regular non-symlink file') + raw = path.read_bytes() + digest = sha256(raw).hexdigest() + if digest != expected_source_sha256: + raise ValueError('exact frozen owned C source') + if _loaded is not None: + if _receipt['source_sha256'] != digest: + raise ValueError('already loaded code has this exact source') + return _loaded + if platform.python_implementation() != 'CPython' or sys.version_info[:2] != (3, 12) or sys.platform != 'linux': + raise RuntimeError('feasibility requires Linux CPython 3.12') + compiler = shutil.which('cc') + if compiler is None: + raise RuntimeError('feasibility requires an existing C compiler') + started = time.perf_counter() + _temporary = tempfile.TemporaryDirectory(prefix='integer-format-owned-') + atexit.register(_temporary.cleanup) + directory = Path(_temporary.name) + snapshot = directory / 'integer_format.c' + snapshot.write_bytes(raw) + snapshot.chmod(0o444) + binary = directory / ('_integer_format' + sysconfig.get_config_var('EXT_SUFFIX')) + flags = ['-O2', '-shared', '-fPIC', '-std=c11', '-Wall', '-Werror', + '-I' + sysconfig.get_path('include')] + command = [compiler, *flags, str(snapshot), '-o', str(binary)] + build = subprocess.run(command, capture_output=True, text=True, check=False) + if build.returncode or build.stdout or build.stderr: + raise RuntimeError('native build rejected: ' + repr(dict( + command=command, returncode=build.returncode, + stdout=build.stdout, stderr=build.stderr))) + if path.is_symlink() or sha256(path.read_bytes()).hexdigest() != digest: + raise ValueError('owned C source unchanged through cold build') + binary.chmod(0o444) + spec = importlib.util.spec_from_file_location('_integer_format', binary) + module = importlib.util.module_from_spec(spec) + spec.loader.exec_module(module) + _receipt = dict(source_sha256=digest, compiler=compiler, flags=flags, + SOABI=sysconfig.get_config_var('SOABI'), + extension_suffix=sysconfig.get_config_var('EXT_SUFFIX'), + python=sys.version, + binary_sha256=sha256(binary.read_bytes()).hexdigest(), + cold_build_load_wall_seconds=time.perf_counter() - started, + compiler_cpu_accounting='parent outer process must include compiler children') + _loaded = module + return module + + +def receipt(): + return None if _receipt is None else dict(_receipt) diff --git a/research/c-verification-feasibility/portable.py b/research/c-verification-feasibility/portable.py new file mode 100644 index 0000000000..0c4702d90e --- /dev/null +++ b/research/c-verification-feasibility/portable.py @@ -0,0 +1,102 @@ +"""Reconstruct exact measured source layout from the official frozen export. + +Chris R / Clear1nsight with substantial OpenAI Codex assistance. Apache-2.0. +Only immutable source bytes are reused. No scientific answers or PASS receipts +are reused. Every fresh invocation pays extraction, binding, compile and checks. +""" +from contextlib import contextmanager +from hashlib import sha256 +import json +from pathlib import Path +import shutil +import tarfile +import tempfile + +HERE = Path(__file__).resolve().parent +ARCHIVE_SHA256 = '7b142567acacac5182045bf8daa8780e916661c2cf343dbf81b13c88ead85d64' +HEAD = '3f15c943e4ad6479f03e674c80fff1269a16ccfe' + + +def require(ok, message): + if not ok: + raise ValueError(message) + + +def unpack(destination): + archive = HERE / 'inputs' / 'PR5864.tar' + require(not archive.is_symlink() and sha256(archive.read_bytes()).hexdigest() == ARCHIVE_SHA256, + 'exact official PR5864 export') + with tarfile.open(archive, 'r:') as stream: + members = stream.getmembers() + require(len(members) == 164 and len({m.name for m in members}) == 164, + 'unique complete official export') + receipt = json.loads(stream.extractfile('.research-export.json').read()) + require(receipt['commit'] == HEAD and len(receipt['files']) == 163, + 'exact published source head and file census') + rows = {row['path']: row for row in receipt['files']} + require(set(rows) | {'.research-export.json'} == {m.name for m in members}, + 'exact declared export members') + for member in members: + path = Path(member.name) + require(member.isfile() and 0 <= member.size <= 8 * 1024**2 and + not path.is_absolute() and '..' not in path.parts, + 'bounded regular safe member') + raw = stream.extractfile(member).read() + if member.name == '.research-export.json': + relative = path + else: + row = rows[member.name] + require(len(raw) == row['size'] and sha256(raw).hexdigest() == row['sha256'] + and row['mode'] in (0o644, 0o755), 'exact source bytes and mode declaration') + relative = path.relative_to('research/fraction-native-qualification') + target = destination / relative + target.parent.mkdir(parents=True, exist_ok=True) + target.write_bytes(raw) + target.chmod(0o444) + + +def inventory(root): + return {str(p.relative_to(root)): [sha256(p.read_bytes()).hexdigest(), p.stat().st_mode & 0o777] + for p in root.rglob('*') if p.is_file() and not p.is_symlink()} + + +@contextmanager +def prepared(mode): + require(mode in ('baseline', 'integer', 'rational', 'complete-B', 'complete-C'), 'known replay scope') + with tempfile.TemporaryDirectory(prefix='c-verification-screen-') as temporary: + root = Path(temporary) + baseline = root / 'baseline-public' + baseline.mkdir() + unpack(baseline) + before = inventory(baseline) + stage = root / 'stages' / 'integer-complete-v1' + stage.parent.mkdir() + stage.mkdir() + for p in (HERE / 'integer').iterdir(): + if p.is_file(): + shutil.copy2(p, stage / p.name) + for name in ('baseline_full.py', 'candidate_full.py'): + shutil.copy2(HERE / 'drivers' / name, stage / name) + if mode == 'rational': + stage = root / 'stages' / 'rational-v2' + stage.mkdir() + for p in (HERE / 'rational').iterdir(): + if p.is_file(): + shutil.copy2(p, stage / p.name) + package = stage / 'package' + shutil.copytree(baseline, package) + source = package / 'native_cache.c' + source.chmod(0o644) + source.write_bytes((stage / 'native_bulk.c').read_bytes()) + source_manifest = package / 'NATIVE-SOURCE.json' + manifest = json.loads(source_manifest.read_text()) + manifest['sha256'] = sha256(source.read_bytes()).hexdigest() + source_manifest.chmod(0o644) + source_manifest.write_text(json.dumps(manifest, indent=2) + '\n') + try: + yield root, baseline, stage + finally: + require(inventory(baseline) == before and + not any(p.is_symlink() for p in baseline.rglob('*')), + 'all original PR5864 baseline bytes and modes remain unchanged') + diff --git a/research/c-verification-feasibility/rational/arithmetic_binding.py b/research/c-verification-feasibility/rational/arithmetic_binding.py new file mode 100644 index 0000000000..2f6acf4333 --- /dev/null +++ b/research/c-verification-feasibility/rational/arithmetic_binding.py @@ -0,0 +1,117 @@ +"""Source-only prototype: authenticate operations bypassed by score batching. + +A compiled source tree is inspected as data; the independent Fraction oracle +is never patched. The first supported runtime is the pinned host CPython3.12. +""" +import builtins +from fractions import Fraction as F +import fractions +from hashlib import sha256 +import math +import numbers +import operator +from pathlib import Path +import sys +from types import CodeType, FunctionType, BuiltinFunctionType +import slot_binding + +SOURCE_SHA256='cf33568f7b767f66896995a7a81cc662e8be226f2e58efb61d2028f64eb5d231' +DIRECT=('_add','_sub','_mul','__abs__','__bool__','__new__') +WRAPPED=(('__add__','_add','add','forward'),('__radd__','_add','add','reverse'), + ('__sub__','_sub','sub','forward'),('__rsub__','_sub','sub','reverse'), + ('__mul__','_mul','mul','forward'),('__rmul__','_mul','mul','reverse')) +BUILTINS=('isinstance','type','int','float','complex','super','abs') +_expected=None + +def _shape(code): + return (code.co_code,tuple(_shape(x) if type(x) is CodeType else x for x in code.co_consts), + code.co_names,code.co_varnames,code.co_freevars,code.co_cellvars, + code.co_argcount,code.co_posonlyargcount,code.co_kwonlyargcount, + code.co_flags,code.co_exceptiontable) + +def _codes(): + global _expected + if _expected is not None:return _expected + path=Path(fractions.__file__) + raw=path.read_bytes() + if path.is_symlink() or sha256(raw).hexdigest()!=SOURCE_SHA256:raise ValueError('pinned Fraction source') + compiled=compile(raw,str(path),'exec',optimize=sys.flags.optimize) + result={} + def visit(code): + result[code.co_qualname]=code + for value in code.co_consts: + if type(value) is CodeType:visit(value) + visit(compiled) + _expected=result + return result + +def _function(fn,qualname): + if type(fn) is not FunctionType or fn.__kwdefaults__ is not None: + raise ValueError('ordinary arithmetic function') + defaults=fn.__defaults__ + if qualname=='Fraction.__new__': + if type(defaults) is not tuple or len(defaults)!=2 or type(defaults[0]) is not int or defaults[0]!=0 or defaults[1] is not None:raise ValueError('arithmetic defaults') + elif defaults is not None:raise ValueError('arithmetic defaults') + if _shape(fn.__code__)!=_shape(_codes()[qualname]):raise ValueError('arithmetic executable shape') + if fn.__globals__ is not fractions.__dict__:raise ValueError('arithmetic globals owner') + if type(fn.__builtins__) is not dict:raise ValueError('arithmetic builtins mapping') + for name in BUILTINS: + if fn.__builtins__.get(name) is not getattr(builtins,name):raise ValueError('arithmetic builtins identity') + return fn + +def _snapshot(): + ns=type.__getattribute__(F,'__dict__') + out=[F,fractions.Fraction,math.gcd,operator.add,operator.sub,operator.mul] + for name in DIRECT+('_from_coprime_ints',)+tuple(x[0] for x in WRAPPED): + raw=ns.get(name);fn=raw.__func__ if type(raw) in (classmethod,staticmethod) else raw + out.append(raw) + if type(fn) is FunctionType: + out.extend((fn,fn.__code__,fn.__defaults__,fn.__kwdefaults__,fn.__closure__)) + if fn.__closure__: + for cell in fn.__closure__:out.extend((cell,cell.cell_contents)) + out.extend(fn.__globals__.get(x) for x in ('Fraction','math','numbers','operator')) + out.extend(fn.__builtins__.get(x) for x in BUILTINS) + for cls in F.__mro__: + ns=type.__getattribute__(cls,'__dict__') + out.extend((cls,ns.get('__iadd__'),ns.get('__setattr__'),ns.get('__delattr__'),ns.get('__del__'))) + return tuple(out) + +def bind(): + try: + if sys.implementation.name!='cpython' or sys.version_info[:2]!=(3,12):return None + slots=slot_binding.bind(strict=True) + expected_mro=(F,numbers.Rational,numbers.Real,numbers.Complex,numbers.Number,object) + if len(F.__mro__)!=len(expected_mro) or any(x is not y for x,y in zip(F.__mro__,expected_mro)):return None + ns=type.__getattribute__(F,'__dict__') + owned_slots=ns.get('__slots__') + if fractions.Fraction is not F or type(owned_slots) is not tuple or len(owned_slots)!=2 or any(type(x) is not str for x in owned_slots) or owned_slots!=('_numerator','_denominator'):return None + if fractions.__dict__.get('math') is not math or fractions.__dict__.get('operator') is not operator:return None + if type(math.gcd) is not BuiltinFunctionType or math.gcd.__name__!='gcd' or math.gcd.__self__ is not math:return None + for name in ('add','sub','mul'): + fn=getattr(operator,name) + if type(fn) is not BuiltinFunctionType or fn.__name__!=name or fn.__module__!='_operator':return None + for name in DIRECT: + raw=ns.get(name) + fn=_function(raw.__func__ if type(raw) is staticmethod else raw,'Fraction.'+name) + if fn.__closure__ is not None and not (fn.__code__.co_freevars==('__class__',) and len(fn.__closure__)==1 and fn.__closure__[0].cell_contents is F):return None + factory=ns.get('_from_coprime_ints') + if type(factory) is not classmethod:return None + fn=_function(factory.__func__,'Fraction._from_coprime_ints') + if fn.__closure__ is not None and not (fn.__code__.co_freevars==('__class__',) and len(fn.__closure__)==1 and fn.__closure__[0].cell_contents is F):return None + for name,mono,op,direction in WRAPPED: + fn=_function(ns.get(name),'Fraction._operator_fallbacks..'+direction) + closure=dict(zip(fn.__code__.co_freevars,(c.cell_contents for c in fn.__closure__ or ()))) + if len(closure)!=2 or closure.get('fallback_operator') is not getattr(operator,op) or closure.get('monomorphic_operator') is not ns[mono]:return None + for cls in F.__mro__: + raw=type.__getattribute__(cls,'__dict__') + if '__iadd__' in raw or '__del__' in raw:return None + if '__setattr__' in raw and raw['__setattr__'] is not object.__dict__['__setattr__']:return None + if '__delattr__' in raw and raw['__delattr__'] is not object.__dict__['__delattr__']:return None + return slots,_snapshot(),math.gcd + except (AttributeError,KeyError,TypeError,ValueError,OSError):return None + +def fresh(token): + if token is None or not slot_binding.fresh(token[0]):return False + try:now=_snapshot() + except (AttributeError,ValueError,TypeError):return False + return len(now)==len(token[1]) and all(x is y for x,y in zip(now,token[1])) diff --git a/research/c-verification-feasibility/rational/bulk_backend.py b/research/c-verification-feasibility/rational/bulk_backend.py new file mode 100644 index 0000000000..2d669b78de --- /dev/null +++ b/research/c-verification-feasibility/rational/bulk_backend.py @@ -0,0 +1,83 @@ +"""Source-only wrapper for the extended, staged PR5864 native package. + +Root stages native_bulk.c as native_cache.c and updates its source receipt. +No build is performed merely by importing this wrapper. +""" +from contextlib import contextmanager +from hashlib import sha256 +import inspect +from pathlib import Path +from fractions import Fraction as F +import math +import fraction_table as predecessor +import native_backend +import arithmetic_binding + +CAPACITY=predecessor.CAPACITY +BASE_DERIVE=predecessor.derive + +def canonical_fraction(value): + if type(value) is not F:return False + try:n,d=value._numerator,value._denominator + except AttributeError:return False + return type(n) is int and type(d) is int and d>0 and math.gcd(n,d)==1 + +def rational_domain(word,weights,rounded): + if not predecessor.certified_domain(word,weights,rounded):return False + if not predecessor.native_domain(word,weights):return False + if any(not canonical_fraction(value) for pair in weights for value in pair[:2]):return False + # Scalars are still converted at their original event, in original order. + # Exact strings remain permitted: F(str) returns a canonical Fraction or + # raises at the original point. No dyadic assumption or eager parsing. + for event in word['program']: + if any(type(x) is F and not canonical_fraction(x) for x in event):return False + return True + +class CompactContributions: + def __init__(self,capacity,weights,tokens): + callback=predecessor.checked_compute() + if callback is None:raise ValueError('original Fraction contribution callback') + self.native=native_backend.load().Cache(capacity,weights,tokens,callback, + F.__dict__['_numerator'],F.__dict__['_denominator'],F) + def event(self,q):return self.native.event(q) + def statistics(self):return self.native.statistics() + +def derive(reference,capacity=CAPACITY,mode='apply'): + fallback=BASE_DERIVE(reference,capacity,mode) + token=arithmetic_binding.bind() + source=predecessor.parent.parent.entry.parent + raw=inspect.getsource(reference.error_trace) + source.need(sha256(Path(reference.__file__).read_bytes()).hexdigest()==source.MODULE_SHA256,'exact rational reference source') + text=predecessor.native_text(raw,'apply') + before='contributions.event(q).apply(rows[r],rows[event[2]],scores[r])' + source.need(text.count(before)==1,'one rational score batch seam') + text=text.replace(before,'contributions.event(q).apply_rational(rows[r],rows[event[2]],scores[r],_rational_gcd)') + state=[None,False,None] + def report(value):state[0]=None if value is None else dict(value) + namespace=dict(reference.__dict__) + namespace.update(_compact_factory=lambda weights,tokens:CompactContributions(capacity,weights,tokens), + _contribution_report=report,_rational_gcd=None if token is None else token[2]) + exec(compile(text,'','exec'),namespace) + specialized=namespace['error_trace'] + def call(word,weights,rounded): + state[:]=[None,False,None] + if mode!='apply' or not capacity or predecessor.Contributions is not predecessor.NORMAL_CONTRIBUTIONS or not arithmetic_binding.fresh(token) or predecessor.checked_compute() is None: + return fallback(word,weights,rounded) + if not rational_domain(word,weights,rounded):return fallback(word,weights,rounded) + tokens=predecessor.weight_tokens(weights) + if tokens is None:return fallback(word,weights,rounded) + state[1]=True;state[2]=max(tokens)+1 if tokens else 0 + return specialized(word,weights,rounded,tokens) + call.rational_selected=lambda:state[1] + call.statistics=lambda:dict(state[0]) if state[1] and state[0] is not None else fallback.statistics() + call.compacted_selected=lambda:True if state[1] else fallback.compacted_selected() + call.token_count=lambda:state[2] if state[1] else fallback.token_count() + return call + +@contextmanager +def installed(reference,capacity=CAPACITY): + original=reference.error_trace + value=derive(reference,capacity) + reference.error_trace=value + try:yield value + finally:reference.error_trace=original diff --git a/research/c-verification-feasibility/rational/finite_probe.py b/research/c-verification-feasibility/rational/finite_probe.py new file mode 100644 index 0000000000..54ab450030 --- /dev/null +++ b/research/c-verification-feasibility/rational/finite_probe.py @@ -0,0 +1,219 @@ +"""Added bounded controls and an optional fixed BCCB diagnostic. + +SOURCE ONLY until executed by the sole serial parent runner. Invoke with the +staged extended PR5864 package path. --micro enables the declared diagnostic; +no actual-word run and no complete-performance claim are made here. +""" +from contextlib import contextmanager +from copy import deepcopy +from fractions import Fraction as F +import importlib.util +import json +import math +from pathlib import Path +import sys +import time + + +def need(ok,message): + if not ok:raise ValueError(message) + +def typed(value): + if type(value) is dict:return ('dict',tuple((typed(k),typed(v)) for k,v in value.items())) + if type(value) in (list,tuple):return (type(value).__name__,tuple(map(typed,value))) + return type(value).__module__,type(value).__qualname__ + +@contextmanager +def reference_source(): + from frozen import baseline + with baseline() as package: + sys.path.insert(0,str(package)) + spec=importlib.util.spec_from_file_location('rational_probe_bundle',package/'source.py') + source=importlib.util.module_from_spec(spec);spec.loader.exec_module(source) + with source.baseline() as p: + spec=importlib.util.spec_from_file_location('rational_probe_source',p/'verify.py') + v=importlib.util.module_from_spec(spec);spec.loader.exec_module(v) + with v.source() as (_,_,reference):yield reference + +def fixture(n=32): + # Odd denominators, negative terms, cancellation and values beyond int64. + ws=[(F((1<<130)+i,2*i+3),F((-1)**i*(i+1),2*i+5)) for i in range(n)] + src={i:F((-1)**i*((1<<80)+i+1),2*i+7) for i in range(n)} + dst={i:(-src[i] if i%3==0 else F(i-9,2*i+11)) for i in range(n) if i%2==0} + return ws,src,dst,[F(5,17),F(-7,19),F(1,23)] + +def main(package,micro=False): + sys.path.insert(0,str(Path(package).resolve())) + import arithmetic_binding as binding + import bulk_backend as bulk + import fraction_table as predecessor + import native_backend + native=native_backend.load() + token=binding.bind();need(token is not None and binding.fresh(token),'supported pinned arithmetic binder') + controls=[] + compute=predecessor.Contributions.compute + ws,src,start,scores=fixture() + def make(weights=ws,capacity=16,callback=compute): + return native.Cache(capacity,weights,list(range(len(weights))),callback, + F.__dict__['_numerator'],F.__dict__['_denominator'],F) + # Every source coefficient prefix, plus every event prefix below. + comparisons=0 + for q in (F(1),F(-1),F(1,2),F(7,11),F(-37,13)): + for cut in range(len(src)+1): + subset=dict(list(src.items())[:cut]) + expected=dict(start);expected_scores=list(scores) + for i,v in subset.items(): + old=expected.get(i,F(0));value=old+q*v;change=abs(value)-abs(old) + expected_scores[0]+=change*ws[i][0] + expected_scores[1]+=change*ws[i][1] + expected_scores[2]+=change + if value:expected[i]=value + else:expected.pop(i,None) + outputs=[];stats=[] + for method in ('apply','apply_rational'): + c=make();d=dict(start);s=list(scores);e=c.event(q) + if method=='apply':e.apply(d,subset,s) + else:e.apply_rational(d,subset,s,math.gcd) + outputs.append((d,s));stats.append(c.statistics()) + need(outputs[0]==outputs[1]==(expected,expected_scores),'literal, cache, rational coefficient prefix') + need(typed(outputs[0])==typed(outputs[1])==typed((expected,expected_scores)),'exact coefficient-prefix types') + need(stats[0]==stats[1],'all counters at coefficient prefix') + comparisons+=1 + controls.append('165-general-rational-coefficient-prefixes') + # Repeated hits and full FIFO wraps share no cache across implementations. + caches=[make(capacity=2),make(capacity=2)] + for q in (F(1),F(-1),F(7,11),F(1),F(-1)): + outputs=[] + for k,c in enumerate(caches): + d=dict(start);s=list(scores);e=c.event(q) + if k:e.apply_rational(d,src,s,math.gcd) + else:e.apply(d,src,s) + outputs.append((d,s)) + need(outputs[0]==outputs[1] and caches[0].statistics()==caches[1].statistics(),'FIFO exact after batch') + controls.append('batch-FIFO-and-full-counters') + def rejects(fn,kind,label): + try:fn() + except kind:controls.append(label) + else:raise ValueError('accepted '+label) + rejects(lambda:make().event(F(1)).apply_rational({},src,[0,F(0),F(0)],math.gcd),TypeError,'exact-score-type') + class ForeignFraction(F):pass + rejects(lambda:make().event(F(1)).apply_rational({},src,[ForeignFraction(0),F(0),F(0)],math.gcd),TypeError,'score-subclass') + bad=object.__new__(F);bad._numerator=1;bad._denominator=-3 + rejects(lambda:make().event(F(1)).apply_rational({},src,[bad,F(0),F(0)],math.gcd),ValueError,'negative-score-denominator') + rejects(lambda:make().event(F(1)).apply_rational(src,src,list(scores),math.gcd),TypeError,'same-row') + rejects(lambda:make().event(F(1)).apply_rational({},src,list(scores),lambda a,b:1),TypeError,'nonbuiltin-gcd') + # Low-level malformed callback tests check safety, not arbitrary callback equivalence. + moving={0:F(1)} + def mutate_source(*args):moving.clear();return compute(*args) + rejects(lambda:make(callback=mutate_source).event(F(1)).apply_rational({},moving,[F(0)]*3,math.gcd),RuntimeError,'source-iterator-mutation') + changing=[F(0)]*3 + def mutate_scores(*args):changing.clear();return compute(*args) + rejects(lambda:make(callback=mutate_scores).event(F(1)).apply_rational({}, {0:F(1)},changing,math.gcd),IndexError,'score-list-mutation') + changing=[F(0)]*3 + def replace_score(*args):changing[0]=F(9);return compute(*args) + rejects(lambda:make(callback=replace_score).event(F(1)).apply_rational({}, {0:F(1)},changing,math.gcd),RuntimeError,'score-value-mutation') + outcomes=[] + for method in ('apply','apply_rational'): + calls=[0] + def intermittent(*args): + calls[0]+=1 + if calls[0]==2:raise ArithmeticError('fixed callback failure') + return compute(*args) + c=make(callback=intermittent);d={};s=[F(0)]*3;e=c.event(F(1)) + try: + if method=='apply':e.apply(d,{0:F(1),1:F(1)},s) + else:e.apply_rational(d,{0:F(1),1:F(1)},s,math.gcd) + except ArithmeticError as error:outcomes.append((type(error).__name__,str(error),d,s,c.statistics())) + else:raise ValueError('missing callback exception') + need(outcomes[0]==outcomes[1],'completed score state before callback failure') + controls.append('callback-failure-publishes-completed-prefix') + # Every changed operation must force fresh() false and bind() rejection. + code=F._add.__code__ + try: + F._add.__code__=code.replace(co_consts=code.co_consts+('drift',)) + need(not binding.fresh(token) and binding.bind() is None,'live arithmetic code drift') + finally:F._add.__code__=code + controls.append('arithmetic-code-drift') + try: + F.__iadd__=lambda self,other:self + need(not binding.fresh(token) and binding.bind() is None,'added in-place operation') + finally:del F.__iadd__ + controls.append('inplace-protocol-drift') + factory=F.__dict__['_from_coprime_ints'];code=factory.__func__.__code__ + try: + factory.__func__.__code__=code.replace(co_consts=code.co_consts+('drift',)) + need(not binding.fresh(token) and binding.bind() is None,'factory code drift') + finally:factory.__func__.__code__=code + controls.append('materialization-source-drift') + gcd=math.gcd + try: + math.gcd=math.lcm + need(not binding.fresh(token) and binding.bind() is None,'gcd identity drift') + finally:math.gcd=gcd + controls.append('gcd-drift') + fn=F.__add__;position=fn.__code__.co_freevars.index('monomorphic_operator');cell=fn.__closure__[position];saved=cell.cell_contents + try: + cell.cell_contents=F._sub + need(not binding.fresh(token) and binding.bind() is None,'operator closure drift') + finally:cell.cell_contents=saved + controls.append('operator-closure-drift') + with reference_source() as reference: + word=dict(public=2,owned_fields=1,program=[['INIT',2,0],['MOVE',0,0,0,False], + ['ADD',1,0,'1/3',0],['COPY',2,1,1,0],['SCALE',1,'-5/7',0], + ['ADD',1,2,'-1',0],['CLEAR',2,0],['INIT',2,0],['ADD',2,0,'2',0], + ['SCALE',0,'1/2',0],['ADD',0,1,'3/5',0],['CLEAR',2,0]]) + weights=[(F(j+1,2*j+3),F(j+2,2*j+5)) for j in range(len(word['program']))] + rounded={'INIT','MOVE','ADD','COPY','SCALE','CLEAR'} + before=reference.digest((word,weights,sorted(rounded))) + fast=bulk.derive(reference);prior=predecessor.derive(reference) + for cut in range(len(word['program'])+1): + prefix=dict(word,program=word['program'][:cut]);w=weights[:cut] + literal=reference.error_trace(prefix,w,rounded);old=prior(prefix,w,rounded);new=fast(prefix,w,rounded) + need(literal==old==new and typed(literal)==typed(old)==typed(new),'complete event prefix values/types') + need(reference.digest(literal)==reference.digest(new),'event prefix witnesses and hashes') + need(fast.rational_selected(),'general non-dyadic rational route selected') + need(prior.statistics()==fast.statistics(),'event prefix counters') + comparisons+=1 + need(reference.digest((word,weights,sorted(rounded)))==before,'all inputs unchanged') + controls.append('13-complete-event-prefixes-with-nondyadic-weights-and-scalars') + # Unsupported exact-Fraction slot states retain the predecessor outcome. + malformed=object.__new__(F);malformed._numerator=2;malformed._denominator=4 + ws2=list(weights);ws2[0]=(malformed,F(1)) + old=prior(word,ws2,rounded);new=fast(word,ws2,rounded) + need(old==new and not fast.rational_selected(),'noncanonical slot fallback') + controls.append('noncanonical-weight-fallback') + # A changed __add__ that remains semantically equivalent is observable + # through selection: no rational arithmetic bypass is permitted. + add=F.__add__ + try: + F.__add__=lambda self,other:add(self,other) + literal=reference.error_trace(word,weights,rounded);new=fast(word,weights,rounded) + need(literal==new and not fast.rational_selected(),'changed arithmetic literal fallback') + finally:F.__add__=add + controls.append('changed-arithmetic-fallback') + result=dict(status='PASS_BOUNDED_RATIONAL_PROTOTYPE_ONLY',comparisons=comparisons, + added_controls=controls,control_count=len(controls),build=native_backend.receipt(), + independent_literal_oracle_used=True,actual_word_run=False,complete_performance=False) + if micro: + # One declared BCCB sequence, no retries and no projected complete gain. + samples=[] + for label in ('B1','C1','C2','B2'): + wall=time.perf_counter();cpu=time.process_time();c=make(capacity=16384) + check=None + for repeat in range(512): + d=dict(start);s=list(scores);e=c.event(F(7,11)) + if label.startswith('B'):e.apply(d,src,s) + else:e.apply_rational(d,src,s,math.gcd) + if check is None:check=(d,s) + else:need((d,s)==check,'micro every repeated result') + samples.append(dict(label=label,wall_seconds=time.perf_counter()-wall, + cpu_seconds=time.process_time()-cpu,statistics=c.statistics())) + result['micro']=dict(sequence='BCCB',samples=samples,batches=512,coefficients=32, + cold_build_excluded_from_micro=True,illustrative_only=True, + complete_oracle_restoration_unpriced=True) + print(json.dumps(result,sort_keys=True));return result + +if __name__=='__main__': + need(len(sys.argv) in (2,3),'finite_probe.py STAGED_PACKAGE [--micro]') + need(len(sys.argv)==2 or sys.argv[2]=='--micro','known diagnostic option') + main(sys.argv[1],len(sys.argv)==3) diff --git a/research/c-verification-feasibility/rational/native_bulk.c b/research/c-verification-feasibility/rational/native_bulk.c new file mode 100644 index 0000000000..1e908b9acd --- /dev/null +++ b/research/c-verification-feasibility/rational/native_bulk.c @@ -0,0 +1,388 @@ +/* Bounded cache plus source-qualified native rational score accumulation. + * Chris R / Clear1nsight, substantial OpenAI Codex/Astra assistance. Apache-2.0. + */ +#define PY_SSIZE_T_CLEAN +#include +#include + +typedef struct { + PyObject_HEAD + PyObject *dict, *weights, *tokens, *compute, *num, *den, *fraction; + PyObject **ring; + Py_ssize_t capacity, used, head, calls, hits, misses, evictions; + int ready, busy; +} Cache; +typedef struct { + PyObject_HEAD + vectorcallfunc vectorcall; + Cache *cache; + PyObject *q, *qn, *qd; +} Event; +static PyTypeObject CacheType, EventType; + +static int cache_traverse(Cache *s, visitproc visit, void *arg) { + Py_VISIT(s->dict); Py_VISIT(s->weights); Py_VISIT(s->tokens); + Py_VISIT(s->compute); Py_VISIT(s->num); Py_VISIT(s->den); Py_VISIT(s->fraction); + if (s->ring) for (Py_ssize_t i=0;icapacity;i++) Py_VISIT(s->ring[i]); + return 0; +} +static int cache_clear(Cache *s) { + s->ready=0; s->busy=1; + if (s->ring) { + for (Py_ssize_t i=0;icapacity;i++) Py_CLEAR(s->ring[i]); + PyMem_Free(s->ring); s->ring=NULL; + } + Py_CLEAR(s->dict); Py_CLEAR(s->weights); Py_CLEAR(s->tokens); + Py_CLEAR(s->compute); Py_CLEAR(s->num); Py_CLEAR(s->den); Py_CLEAR(s->fraction); + return 0; +} +static void cache_dealloc(Cache *s) { + PyObject_GC_UnTrack(s); cache_clear(s); Py_TYPE(s)->tp_free((PyObject *)s); +} +static int event_traverse(Event *s, visitproc visit, void *arg) { + Py_VISIT(s->cache); Py_VISIT(s->q); Py_VISIT(s->qn); Py_VISIT(s->qd); return 0; +} +static int event_clear(Event *s) { + Py_CLEAR(s->cache); Py_CLEAR(s->q); Py_CLEAR(s->qn); Py_CLEAR(s->qd); return 0; +} +static void event_dealloc(Event *s) { + PyObject_GC_UnTrack(s); event_clear(s); Py_TYPE(s)->tp_free((PyObject *)s); +} +static PyObject *event_disabled(PyTypeObject *type, PyObject *args, PyObject *kw) { + (void)type; (void)args; (void)kw; + PyErr_SetString(PyExc_TypeError,"events are created only by Cache.event"); return NULL; +} +static int is_pair(PyObject *p) { + return (PyList_CheckExact(p)||PyTuple_CheckExact(p)) && PySequence_Size(p)>=2; +} +static PyObject *cache_new(PyTypeObject *type, PyObject *args, PyObject *kw) { + if (kw && PyDict_Size(kw)) { PyErr_SetString(PyExc_TypeError,"positional cache arguments only");return NULL; } + PyObject *cap,*weights,*tokens,*compute,*num,*den,*fraction; + if (!PyArg_UnpackTuple(args,"Cache",7,7,&cap,&weights,&tokens,&compute,&num,&den,&fraction)) return NULL; + if (!PyLong_CheckExact(cap)) { PyErr_SetString(PyExc_ValueError,"integer capacity");return NULL; } + Py_ssize_t ncap=PyLong_AsSsize_t(cap); + if (ncap<1 || ncap>16384 || PyErr_Occurred()) { if(!PyErr_Occurred()) PyErr_SetString(PyExc_ValueError,"capacity 1..16384");return NULL; } + if (!(PyList_CheckExact(weights)||PyTuple_CheckExact(weights)) || !PyList_CheckExact(tokens) || !PyFunction_Check(compute) || !PyType_Check(fraction) || Py_TYPE(num)!=&PyMemberDescr_Type || Py_TYPE(den)!=&PyMemberDescr_Type || !Py_TYPE(num)->tp_descr_get || !Py_TYPE(den)->tp_descr_get) { + PyErr_SetString(PyExc_TypeError,"exact native packet types");return NULL; + } + Py_ssize_t n=PySequence_Size(weights); + if (PyList_GET_SIZE(tokens)!=n) { PyErr_SetString(PyExc_ValueError,"weight/token size");return NULL; } + Cache *s=(Cache *)type->tp_alloc(type,0); + if (!s) return NULL; + s->capacity=ncap; + s->dict=PyDict_New();s->weights=PyTuple_New(n);s->tokens=PyTuple_New(n); + s->ring=PyMem_Calloc((size_t)ncap,sizeof(PyObject *)); + if (!s->dict || !s->weights || !s->tokens || !s->ring) { if(!PyErr_Occurred())PyErr_NoMemory();Py_DECREF(s);return NULL; } + s->compute=Py_NewRef(compute);s->num=Py_NewRef(num);s->den=Py_NewRef(den);s->fraction=Py_NewRef(fraction); + for (Py_ssize_t i=0;iweights,i,pair); + PyObject *token=PySequence_GetItem(tokens,i); + if (!token) { Py_DECREF(s);return NULL; } + if (!PyLong_CheckExact(token)) { Py_DECREF(token);Py_DECREF(s);PyErr_SetString(PyExc_TypeError,"integer token");return NULL; } + Py_ssize_t t=PyLong_AsSsize_t(token); + if (t<0 || t>=16384 || PyErr_Occurred()) { Py_DECREF(token);Py_DECREF(s);if(!PyErr_Occurred())PyErr_SetString(PyExc_ValueError,"bounded token");return NULL; } + PyTuple_SET_ITEM(s->tokens,i,token); + } + s->ready=1;return (PyObject *)s; +} +static PyObject *member(PyObject *descriptor, PyObject *object, PyObject *type) { + return Py_TYPE(descriptor)->tp_descr_get(descriptor,object,type); +} +static PyObject *contribution(Event *e, PyObject *old, PyObject *v, Py_ssize_t i) { + Cache *s=e->cache; + if (i<0 || i>=PyTuple_GET_SIZE(s->tokens)) { PyErr_SetString(PyExc_IndexError,"native site index");return NULL; } + if (!Py_IS_TYPE(old,(PyTypeObject *)s->fraction)||!Py_IS_TYPE(v,(PyTypeObject *)s->fraction)) { PyErr_SetString(PyExc_TypeError,"exact Fraction coefficients");return NULL; } + PyObject *parts[4]={NULL,NULL,NULL,NULL}; + for (int k=0;k<4;k++) { + parts[k]=member(k%2?s->den:s->num,k<2?old:v,s->fraction); + if (!parts[k] || !PyLong_CheckExact(parts[k])) { + for(int j=0;j<4;j++)Py_XDECREF(parts[j]); + if(!PyErr_Occurred())PyErr_SetString(PyExc_TypeError,"integer Fraction slots"); + return NULL; + } + } + PyObject *key=PyTuple_New(7); + if(!key){for(int j=0;j<4;j++)Py_DECREF(parts[j]);return NULL;} + PyTuple_SET_ITEM(key,0,parts[0]);PyTuple_SET_ITEM(key,1,parts[1]); + PyTuple_SET_ITEM(key,2,Py_NewRef(e->qn));PyTuple_SET_ITEM(key,3,Py_NewRef(e->qd)); + PyTuple_SET_ITEM(key,4,parts[2]);PyTuple_SET_ITEM(key,5,parts[3]);PyTuple_SET_ITEM(key,6,Py_NewRef(PyTuple_GET_ITEM(s->tokens,i))); + if(s->calls==PY_SSIZE_T_MAX){Py_DECREF(key);PyErr_SetString(PyExc_OverflowError,"native counter overflow");return NULL;} + s->calls++; + PyObject *result=PyDict_GetItemWithError(s->dict,key); + if(result){s->hits++;Py_INCREF(result);Py_DECREF(key);return result;} + if(PyErr_Occurred()){Py_DECREF(key);return NULL;} + s->misses++; + PyObject *pair=PyTuple_GET_ITEM(s->weights,i); + PyObject *argv[5]={old,e->q,v,PyTuple_GET_ITEM(pair,0),PyTuple_GET_ITEM(pair,1)}; + result=PyObject_Vectorcall(s->compute,argv,5,NULL); + if(!result){Py_DECREF(key);return NULL;} + if(!PyTuple_CheckExact(result)||PyTuple_GET_SIZE(result)!=4){Py_DECREF(result);Py_DECREF(key);PyErr_SetString(PyExc_TypeError,"four exact contributions");return NULL;} + for(int k=0;k<4;k++)if(!Py_IS_TYPE(PyTuple_GET_ITEM(result,k),(PyTypeObject *)s->fraction)){Py_DECREF(result);Py_DECREF(key);PyErr_SetString(PyExc_TypeError,"Fraction contributions");return NULL;} + if(s->used==s->capacity){ + PyObject *oldkey=s->ring[s->head]; + if(PyDict_DelItem(s->dict,oldkey)<0){Py_DECREF(result);Py_DECREF(key);return NULL;} + Py_CLEAR(s->ring[s->head]);s->used--;s->evictions++; + } + if(PyDict_SetItem(s->dict,key,result)<0){Py_DECREF(result);Py_DECREF(key);return NULL;} + s->ring[s->head]=key;s->head=(s->head+1)%s->capacity;s->used++; + return result; +} +static int begin_event(Event *e) { + if(!e->cache||!e->cache->ready){PyErr_SetString(PyExc_RuntimeError,"cleared native event");return -1;} + if(e->cache->busy){PyErr_SetString(PyExc_RuntimeError,"reentrant native event");return -1;} + e->cache->busy=1;return 0; +} +static PyObject *event_call(PyObject *obj, PyObject *const *args, size_t nargsf, PyObject *kw) { + Event *e=(Event *)obj; + if(PyVectorcall_NARGS(nargsf)!=3 || (kw&&PyTuple_GET_SIZE(kw))){PyErr_SetString(PyExc_TypeError,"event(old,v,index)");return NULL;} + if(!PyLong_CheckExact(args[2])){PyErr_SetString(PyExc_TypeError,"integer site index");return NULL;} + Py_ssize_t i=PyLong_AsSsize_t(args[2]);if(PyErr_Occurred())return NULL; + if(begin_event(e)<0)return NULL; + PyObject *result=contribution(e,args[0],args[1],i);e->cache->busy=0;return result; +} +static PyObject *cache_event(Cache *s, PyObject *q) { + if(!s->ready){PyErr_SetString(PyExc_RuntimeError,"cleared cache");return NULL;} + if(!Py_IS_TYPE(q,(PyTypeObject *)s->fraction)){PyErr_SetString(PyExc_TypeError,"exact Fraction scalar");return NULL;} + Event *e=(Event *)EventType.tp_alloc(&EventType,0);if(!e)return NULL; + e->vectorcall=event_call;e->cache=(Cache *)Py_NewRef((PyObject *)s);e->q=Py_NewRef(q); + e->qn=member(s->num,q,s->fraction); + if(!e->qn){Py_DECREF(e);return NULL;} + e->qd=member(s->den,q,s->fraction); + if(!e->qd){Py_DECREF(e);return NULL;} + if(!PyLong_CheckExact(e->qn)||!PyLong_CheckExact(e->qd)){Py_DECREF(e);PyErr_SetString(PyExc_TypeError,"integer scalar slots");return NULL;} + return (PyObject *)e; +} +static PyObject *cache_statistics(Cache *s, PyObject *unused) { + (void)unused; + if(!s->ready){PyErr_SetString(PyExc_RuntimeError,"cleared cache");return NULL;} + return Py_BuildValue("{s:n,s:n,s:n,s:n,s:n,s:n,s:n}","calls",s->calls,"hits",s->hits,"misses",s->misses,"evictions",s->evictions,"bypasses",(Py_ssize_t)0,"resident",PyDict_Size(s->dict),"capacity",s->capacity); +} +static PyObject *event_apply(Event *e, PyObject *args) { + PyObject *dst,*src,*scores; + if(!PyArg_UnpackTuple(args,"apply",3,3,&dst,&src,&scores))return NULL; + if(!PyDict_CheckExact(dst)||!PyDict_CheckExact(src)||dst==src||!PyList_CheckExact(scores)||PyList_GET_SIZE(scores)!=3){PyErr_SetString(PyExc_TypeError,"distinct exact rows and three scores");return NULL;} + if(begin_event(e)<0)return NULL; + Cache *s=e->cache; + PyObject *pair=NULL,*result=NULL; + PyObject *view=PyObject_CallMethod(src,"items",NULL); + PyObject *iterator=view?PyObject_GetIter(view):NULL; + Py_XDECREF(view); + if(!iterator)goto fail; + while((pair=PyIter_Next(iterator))){ + if(!PyTuple_CheckExact(pair)||PyTuple_GET_SIZE(pair)!=2){PyErr_SetString(PyExc_TypeError,"dict item pair");goto fail;} + PyObject *index=PyTuple_GET_ITEM(pair,0),*value=PyTuple_GET_ITEM(pair,1); + if(!PyLong_CheckExact(index)){PyErr_SetString(PyExc_TypeError,"integer source site");goto fail;} + Py_ssize_t i=PyLong_AsSsize_t(index);if(PyErr_Occurred())goto fail; + PyObject *zeroarg=PyLong_FromLong(0);if(!zeroarg)goto fail; + PyObject *zero=PyObject_CallOneArg(s->fraction,zeroarg);Py_DECREF(zeroarg);if(!zero)goto fail; + PyObject *old=PyDict_GetItemWithError(dst,index); + if(old){Py_INCREF(old);Py_DECREF(zero);}else if(PyErr_Occurred()){Py_DECREF(zero);goto fail;}else old=zero; + result=contribution(e,old,value,i);Py_DECREF(old);if(!result)goto fail; + for(int k=0;k<3;k++){ + PyObject *score=PyList_GetItem(scores,k); + if(!score)goto fail; + Py_INCREF(score); + PyObject *next=PyNumber_InPlaceAdd(score,PyTuple_GET_ITEM(result,k+1)); + Py_DECREF(score); + if(!next)goto fail; + if(PyList_SetItem(scores,k,next)<0)goto fail; + } + int truth=PyObject_IsTrue(PyTuple_GET_ITEM(result,0)); + if(truth<0)goto fail; + if(truth){if(PyDict_SetItem(dst,index,PyTuple_GET_ITEM(result,0))<0)goto fail;} + else{ + PyObject *present=PyDict_GetItemWithError(dst,index); + if(present){if(PyDict_DelItem(dst,index)<0)goto fail;} + else if(PyErr_Occurred())goto fail; + } + Py_CLEAR(result);Py_CLEAR(pair); + } + if(PyErr_Occurred())goto fail; + Py_DECREF(iterator);s->busy=0;Py_RETURN_NONE; +fail:Py_XDECREF(result);Py_XDECREF(pair);Py_XDECREF(iterator);s->busy=0;return NULL; +} +/* Owned extension: normalized, arbitrary-width score accumulators. + * Preconditions are established by arithmetic_binding.py and the wrapper. + * The legacy apply() method and its generic callback semantics are unchanged. + */ +typedef struct { PyObject *n, *d; } Rational; +static void rational_clear(Rational *x) { Py_CLEAR(x->n); Py_CLEAR(x->d); } +static int rational_read(Cache *s, PyObject *f, Rational *x, PyObject *zero) { + if(!Py_IS_TYPE(f,(PyTypeObject *)s->fraction)) { + PyErr_SetString(PyExc_TypeError,"exact Fraction score/increment");return -1; + } + x->n=member(s->num,f,s->fraction); + if(!x->n)return -1; + x->d=member(s->den,f,s->fraction); + if(!x->d)return -1; + if(!PyLong_CheckExact(x->n)||!PyLong_CheckExact(x->d)) { + PyErr_SetString(PyExc_TypeError,"exact integer rational slots");return -1; + } + int positive=PyObject_RichCompareBool(x->d,zero,Py_GT); + if(positive<0)return -1; + if(!positive){PyErr_SetString(PyExc_ValueError,"positive rational denominator");return -1;} + return 0; +} +static PyObject *rational_gcd(PyObject *gcd,PyObject *a,PyObject *b,PyObject *zero) { + PyObject *g=PyObject_CallFunctionObjArgs(gcd,a,b,NULL); + if(!g)return NULL; + if(!PyLong_CheckExact(g)){Py_DECREF(g);PyErr_SetString(PyExc_TypeError,"exact gcd result");return NULL;} + int positive=PyObject_RichCompareBool(g,zero,Py_GT); + if(positive<=0){Py_DECREF(g);if(!PyErr_Occurred())PyErr_SetString(PyExc_ValueError,"positive gcd result");return NULL;} + return g; +} +static int rational_add(Rational *a,const Rational *b,PyObject *gcd,PyObject *zero,PyObject *one) { + PyObject *g=NULL,*s=NULL,*u=NULL,*v=NULL,*t=NULL,*g2=NULL,*nn=NULL,*dd=NULL; + int equal=PyObject_RichCompareBool(a->d,b->d,Py_EQ); + if(equal<0)goto fail; + if(equal){ + t=PyNumber_Add(a->n,b->n);if(!t)goto fail; + g2=rational_gcd(gcd,t,a->d,zero);if(!g2)goto fail; + int unit=PyObject_RichCompareBool(g2,one,Py_EQ);if(unit<0)goto fail; + if(unit){nn=Py_NewRef(t);dd=Py_NewRef(a->d);} + else{nn=PyNumber_FloorDivide(t,g2);if(!nn)goto fail;dd=PyNumber_FloorDivide(a->d,g2);if(!dd)goto fail;} + }else{ + g=rational_gcd(gcd,a->d,b->d,zero);if(!g)goto fail; + int unit=PyObject_RichCompareBool(g,one,Py_EQ);if(unit<0)goto fail; + if(unit){ + u=PyNumber_Multiply(a->n,b->d);if(!u)goto fail; + v=PyNumber_Multiply(a->d,b->n);if(!v)goto fail; + nn=PyNumber_Add(u,v);if(!nn)goto fail; + dd=PyNumber_Multiply(a->d,b->d);if(!dd)goto fail; + }else{ + s=PyNumber_FloorDivide(a->d,g);if(!s)goto fail; + u=PyNumber_FloorDivide(b->d,g);if(!u)goto fail; + v=PyNumber_Multiply(a->n,u);if(!v)goto fail; + Py_CLEAR(u);u=PyNumber_Multiply(b->n,s);if(!u)goto fail; + t=PyNumber_Add(v,u);if(!t)goto fail; + g2=rational_gcd(gcd,t,g,zero);if(!g2)goto fail; + unit=PyObject_RichCompareBool(g2,one,Py_EQ);if(unit<0)goto fail; + if(unit){nn=Py_NewRef(t);dd=PyNumber_Multiply(s,b->d);if(!dd)goto fail;} + else{ + nn=PyNumber_FloorDivide(t,g2);if(!nn)goto fail; + Py_CLEAR(u);u=PyNumber_FloorDivide(b->d,g2);if(!u)goto fail; + dd=PyNumber_Multiply(s,u);if(!dd)goto fail; + } + } + } + Py_SETREF(a->n,nn);nn=NULL;Py_SETREF(a->d,dd);dd=NULL; + Py_XDECREF(g);Py_XDECREF(s);Py_XDECREF(u);Py_XDECREF(v);Py_XDECREF(t);Py_XDECREF(g2); + return 0; +fail: + Py_XDECREF(g);Py_XDECREF(s);Py_XDECREF(u);Py_XDECREF(v);Py_XDECREF(t);Py_XDECREF(g2);Py_XDECREF(nn);Py_XDECREF(dd); + return -1; +} +static PyObject *rational_fraction(Cache *s,const Rational *x) { + /* The wrapper binds exact owned slot descriptors and object allocation. + No PyLong internals, machine-word truncation or foreign Fraction type. */ + if(!Py_TYPE(s->num)->tp_descr_set||!Py_TYPE(s->den)->tp_descr_set){ + PyErr_SetString(PyExc_TypeError,"writable owned Fraction slots");return NULL; + } + PyObject *f=PyType_GenericAlloc((PyTypeObject *)s->fraction,0); + if(!f)return NULL; + if(Py_TYPE(s->num)->tp_descr_set(s->num,f,x->n)<0||Py_TYPE(s->den)->tp_descr_set(s->den,f,x->d)<0){Py_DECREF(f);return NULL;} + return f; +} +static int rational_scores_unchanged(PyObject *scores,PyObject **initial) { + if(PyList_GET_SIZE(scores)!=3){PyErr_SetString(PyExc_IndexError,"score list changed during rational apply");return -1;} + for(int k=0;k<3;k++)if(PyList_GET_ITEM(scores,k)!=initial[k]){ + PyErr_SetString(PyExc_RuntimeError,"score value changed during rational apply");return -1; + } + return 0; +} +static int rational_publish(Cache *s,PyObject *scores,PyObject **initial,Rational *acc) { + PyObject *out[3]={NULL,NULL,NULL}; + if(rational_scores_unchanged(scores,initial)<0)return -1; + for(int k=0;k<3;k++){out[k]=rational_fraction(s,&acc[k]);if(!out[k])goto fail;} + if(rational_scores_unchanged(scores,initial)<0)goto fail; + for(int k=0;k<3;k++){if(PyList_SetItem(scores,k,out[k])<0){out[k]=NULL;goto fail;}out[k]=NULL;} + return 0; +fail:for(int k=0;k<3;k++)Py_XDECREF(out[k]);return -1; +} +static PyObject *event_apply_rational(Event *e,PyObject *args) { + PyObject *dst,*src,*scores,*gcd; + if(!PyArg_UnpackTuple(args,"apply_rational",4,4,&dst,&src,&scores,&gcd))return NULL; + if(!PyDict_CheckExact(dst)||!PyDict_CheckExact(src)||dst==src||!PyList_CheckExact(scores)||PyList_GET_SIZE(scores)!=3||!PyCFunction_Check(gcd)){ + PyErr_SetString(PyExc_TypeError,"distinct exact rows, three scores, builtin gcd");return NULL; + } + if(begin_event(e)<0)return NULL; + Cache *s=e->cache; + Rational acc[3]={{NULL,NULL},{NULL,NULL},{NULL,NULL}}; + Rational inc={NULL,NULL}; + PyObject *initial[3]={NULL,NULL,NULL},*pair=NULL,*result=NULL,*iterator=NULL; + PyObject *zero=PyLong_FromLong(0),*one=PyLong_FromLong(1); + int accumulated=0,ready=0; + if(!zero||!one)goto fail; + for(int k=0;k<3;k++){ + initial[k]=Py_NewRef(PyList_GET_ITEM(scores,k)); + if(rational_read(s,initial[k],&acc[k],zero)<0)goto fail; + } + ready=1; + PyObject *view=PyObject_CallMethod(src,"items",NULL); + iterator=view?PyObject_GetIter(view):NULL;Py_XDECREF(view); + if(!iterator)goto fail; + while((pair=PyIter_Next(iterator))){ + if(!PyTuple_CheckExact(pair)||PyTuple_GET_SIZE(pair)!=2){PyErr_SetString(PyExc_TypeError,"dict item pair");goto fail;} + PyObject *index=PyTuple_GET_ITEM(pair,0),*value=PyTuple_GET_ITEM(pair,1); + if(!PyLong_CheckExact(index)){PyErr_SetString(PyExc_TypeError,"integer source site");goto fail;} + Py_ssize_t i=PyLong_AsSsize_t(index);if(PyErr_Occurred())goto fail; + /* Retain the literal per-coefficient Fraction(0) construction. */ + PyObject *z=PyObject_CallOneArg(s->fraction,zero);if(!z)goto fail; + PyObject *old=PyDict_GetItemWithError(dst,index); + if(old){Py_INCREF(old);Py_DECREF(z);}else if(PyErr_Occurred()){Py_DECREF(z);goto fail;}else old=z; + result=contribution(e,old,value,i);Py_DECREF(old);if(!result)goto fail; + if(rational_scores_unchanged(scores,initial)<0)goto fail; + for(int k=0;k<3;k++){ + if(rational_read(s,PyTuple_GET_ITEM(result,k+1),&inc,zero)<0)goto fail; + if(rational_add(&acc[k],&inc,gcd,zero,one)<0)goto fail; + rational_clear(&inc);accumulated=1; + } + int truth=PyObject_IsTrue(PyTuple_GET_ITEM(result,0));if(truth<0)goto fail; + if(truth){if(PyDict_SetItem(dst,index,PyTuple_GET_ITEM(result,0))<0)goto fail;} + else{ + PyObject *present=PyDict_GetItemWithError(dst,index); + if(present){if(PyDict_DelItem(dst,index)<0)goto fail;} + else if(PyErr_Occurred())goto fail; + } + Py_CLEAR(result);Py_CLEAR(pair); + } + if(PyErr_Occurred())goto fail; + if(accumulated&&rational_publish(s,scores,initial,acc)<0)goto fail; + for(int k=0;k<3;k++){rational_clear(&acc[k]);Py_DECREF(initial[k]);} + Py_DECREF(iterator);Py_DECREF(zero);Py_DECREF(one);s->busy=0;Py_RETURN_NONE; +fail:{ + PyObject *error=PyErr_GetRaisedException(); + /* Publish completed exact additions on an ordinary failure where safe. + A mutated caller list is never repaired, resized or silently ignored. */ + if(ready&&accumulated){if(rational_publish(s,scores,initial,acc)<0)PyErr_Clear();} + rational_clear(&inc); + for(int k=0;k<3;k++){rational_clear(&acc[k]);Py_XDECREF(initial[k]);} + Py_XDECREF(pair);Py_XDECREF(result);Py_XDECREF(iterator);Py_XDECREF(zero);Py_XDECREF(one);s->busy=0; + if(error)PyErr_SetRaisedException(error);else PyErr_SetString(PyExc_RuntimeError,"rational apply failed without exception"); + return NULL; +}} + +static PyMethodDef cache_methods[]={{"event",(PyCFunction)cache_event,METH_O,"Fresh scalar context."},{"statistics",(PyCFunction)cache_statistics,METH_NOARGS,"Full counters."},{NULL,NULL,0,NULL}}; +static PyMethodDef event_methods[]={{"apply_rational",(PyCFunction)event_apply_rational,METH_VARARGS,"Source-qualified exact rational score batch."},{"apply",(PyCFunction)event_apply,METH_VARARGS,"Same coefficient loop and Python numeric operations."},{NULL,NULL,0,NULL}}; +static PyTypeObject CacheType={PyVarObject_HEAD_INIT(NULL,0) + .tp_name="_fraction_native.Cache",.tp_basicsize=sizeof(Cache),.tp_flags=Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_GC, + .tp_new=cache_new,.tp_dealloc=(destructor)cache_dealloc,.tp_traverse=(traverseproc)cache_traverse,.tp_clear=(inquiry)cache_clear,.tp_methods=cache_methods}; +static PyTypeObject EventType={PyVarObject_HEAD_INIT(NULL,0) + .tp_name="_fraction_native.Event",.tp_basicsize=sizeof(Event),.tp_flags=Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_GC|Py_TPFLAGS_HAVE_VECTORCALL, + .tp_new=event_disabled,.tp_dealloc=(destructor)event_dealloc,.tp_traverse=(traverseproc)event_traverse,.tp_clear=(inquiry)event_clear, + .tp_call=PyVectorcall_Call,.tp_vectorcall_offset=offsetof(Event,vectorcall),.tp_methods=event_methods}; +static struct PyModuleDef module={PyModuleDef_HEAD_INIT,"_fraction_native","Bounded cache; exact Python arithmetic.",-1,NULL}; +PyMODINIT_FUNC PyInit__fraction_native(void){ + if(PyType_Ready(&CacheType)<0||PyType_Ready(&EventType)<0)return NULL; + PyObject *m=PyModule_Create(&module);if(!m)return NULL; + if(PyModule_AddObjectRef(m,"Cache",(PyObject *)&CacheType)<0){Py_DECREF(m);return NULL;} + return m; +} diff --git a/research/c-verification-feasibility/replay.py b/research/c-verification-feasibility/replay.py new file mode 100644 index 0000000000..2461155efe --- /dev/null +++ b/research/c-verification-feasibility/replay.py @@ -0,0 +1,21 @@ +"""Optional single guarded complete frozen-qualifier replay; no retry or benchmark fishing.""" +import fcntl +from pathlib import Path +import sys +import guard + +PACKAGE = Path(__file__).resolve().parent +if len(sys.argv) != 3 or sys.argv[1] not in ('B', 'C'): + raise ValueError('replay.py B|C NEW_EXTERNAL_EVIDENCE_DIRECTORY') +evidence = Path(sys.argv[2]).resolve() +if evidence.is_relative_to(PACKAGE) or evidence.exists(): + raise ValueError('new evidence directory outside the immutable package required') +evidence.mkdir(parents=True) +guard.HERE = evidence +guard.SOURCE = PACKAGE +guard.CLOSURE = tuple(sorted(str(p.relative_to(PACKAGE)) for p in PACKAGE.rglob('*') + if p.is_file() and '__pycache__' not in p.parts)) + ('/usr/lib/python3.12/fractions.py',) +guard.AGGREGATE = 600 +with (evidence / 'execution.lock').open('a') as lock: + fcntl.flock(lock, fcntl.LOCK_EX | fcntl.LOCK_NB) + guard.run('complete-' + sys.argv[1], 'full_' + sys.argv[1] + '.py') diff --git a/research/c-verification-feasibility/verify.py b/research/c-verification-feasibility/verify.py new file mode 100644 index 0000000000..52d3ac140a --- /dev/null +++ b/research/c-verification-feasibility/verify.py @@ -0,0 +1,41 @@ +"""Scoped fresh checks. This command does not admit a performance improvement.""" +from hashlib import sha256 +import json +from pathlib import Path +import runpy +import sys +from portable import prepared, require + +HERE = Path(__file__).resolve().parent +require(len(sys.argv) == 2 and sys.argv[1] in ('baseline', 'integer', 'rational'), 'explicit finite scope') +mode = sys.argv[1] +manifest = json.loads((HERE / 'CODE-SOURCES.json').read_text()) +for name, digest in manifest.items(): + path = HERE / name + require(not path.is_symlink() and sha256(path.read_bytes()).hexdigest() == digest, + 'exact qualified prototype source: ' + name) +with prepared(mode) as (root, baseline, stage): + if mode == 'baseline': + sys.path.insert(0, str(baseline)) + sys.argv = [str(baseline / 'verify.py')] + runpy.run_path(sys.argv[0], run_name='__main__') + elif mode == 'integer': + sys.path.insert(0, str(stage)) + sys.argv = [str(stage / 'finite_probe.py'), '--source-sha256', manifest['integer/integer_format.c']] + runpy.run_path(sys.argv[0], run_name='__main__') + else: + sys.path.insert(0, str(stage)) + from finite_probe import main + main(stage / 'package', micro=False) + import arithmetic_binding as binding + from fractions import Fraction as F + token = binding.bind() + require(token is not None, 'original arithmetic binding') + F.__del__ = lambda self: None + try: + require(binding.bind() is None and not binding.fresh(token), 'destructor drift rejects') + finally: + del F.__del__ + print('PASS_ADDED_DESTRUCTOR_BINDING_CONTROL') +print('PASS_C_VERIFICATION_SCOPED_FINITE ' + mode) + From 9ddf0d4a4a7d6f56ae9a2a6ca9ff994f9edbba6d Mon Sep 17 00:00:00 2001 From: d3lerium Date: Tue, 27 Oct 2026 23:33:02 +1100 Subject: [PATCH 4/7] Expose structured open questions in feasibility report --- research/c-verification-feasibility/README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/research/c-verification-feasibility/README.md b/research/c-verification-feasibility/README.md index c9af4e0f74..7342b67f47 100644 --- a/research/c-verification-feasibility/README.md +++ b/research/c-verification-feasibility/README.md @@ -143,7 +143,7 @@ six-process screen. It refuses evidence reuse and retains the 180-second / 1-GiB sampled process-group RSS / serial / zero-automatic-retry policy. Do not reroll the failed retained timing round. -## Credit and open next questions +## Credit Original mathematics, P104 source, integer replay, literal scalar and reverse oracles: Ali Romman and all predecessor authors retained in the complete input @@ -158,6 +158,8 @@ and user-requested GPT-6-astra xhigh static design/source review. Only the paren ran numerical/compiler work, serially. These are assisted engineering checks, without independent human or proof-kernel acceptance. +## Open next questions + The requested further 15% PR5864 improvement remains unmet. A different exact arithmetic ownership boundary would need a new source-pinned cost screen, unchanged required independent oracle and full added verification bill before From ec0afa7633ff72e1c5ea26bb5726ec569a3f59ac Mon Sep 17 00:00:00 2001 From: d3lerium Date: Tue, 27 Oct 2026 23:35:47 +1100 Subject: [PATCH 5/7] Record fresh readonly export and publication checks --- .../VALIDATION.json | 6 ++--- .../publication/preparation-failures.json | 7 +++++ .../publication/readonly-gitfree/receipt.json | 26 +++++++++++++++++++ .../publication/readonly-gitfree/stderr.txt | 0 .../publication/readonly-gitfree/stdout.txt | 19 ++++++++++++++ .../publication/readonly-gitfree/usage.json | 1 + 6 files changed, 56 insertions(+), 3 deletions(-) create mode 100644 research/c-verification-feasibility/evidence/publication/preparation-failures.json create mode 100644 research/c-verification-feasibility/evidence/publication/readonly-gitfree/receipt.json create mode 100644 research/c-verification-feasibility/evidence/publication/readonly-gitfree/stderr.txt create mode 100644 research/c-verification-feasibility/evidence/publication/readonly-gitfree/stdout.txt create mode 100644 research/c-verification-feasibility/evidence/publication/readonly-gitfree/usage.json diff --git a/research/c-verification-feasibility/VALIDATION.json b/research/c-verification-feasibility/VALIDATION.json index ea132e6e5d..5413964404 100644 --- a/research/c-verification-feasibility/VALIDATION.json +++ b/research/c-verification-feasibility/VALIDATION.json @@ -19,9 +19,9 @@ "qualified_speed_claim": false, "new_rational_actual_word_or_complete_runs": 0, "new_complete_optimized_or_readonly_replays": 0, - "readonly_gitfree_finite": "PENDING", - "metadata_committed_bytes": "PENDING", - "hosted_exact_head": "PENDING", + "readonly_gitfree_finite": "PASS_ALL_FIVE_COMMANDS", + "metadata_committed_bytes": "PASS_METADATA_PINS_97_FILES_BEFORE_PUBLICATION_METADATA_ADDITION", + "hosted_exact_head": "UNCLAIMED_BY_LOCAL_ARTIFACT_SEE_PR_CHECKS", "scope_notes": [ "Four unchanged custody checks are separate from timed arms, matching frozen PR5864 benchmark.", "Complete actual witness/ideal/weights outputs equal and all120 independent fixtures retained.", diff --git a/research/c-verification-feasibility/evidence/publication/preparation-failures.json b/research/c-verification-feasibility/evidence/publication/preparation-failures.json new file mode 100644 index 0000000000..3aab1996b5 --- /dev/null +++ b/research/c-verification-feasibility/evidence/publication/preparation-failures.json @@ -0,0 +1,7 @@ +[ + { + "step": "initial metadata check", + "result": "README.md needs an exact Open next questions section", + "repair": "Split combined Credit and open next questions heading; no code/evidence change" + } +] diff --git a/research/c-verification-feasibility/evidence/publication/readonly-gitfree/receipt.json b/research/c-verification-feasibility/evidence/publication/readonly-gitfree/receipt.json new file mode 100644 index 0000000000..8862df229c --- /dev/null +++ b/research/c-verification-feasibility/evidence/publication/readonly-gitfree/receipt.json @@ -0,0 +1,26 @@ +{ + "exit": 0, + "label": "feasibility-readonly-gitfree-v1", + "optimized": false, + "platform": "Linux-7.0.0-38-generic-x86_64-with-glibc2.39", + "python": "3.12.3 (main, Aug 31 2026, 10:18:26) [GCC 13.3.0]", + "runner_sha256": "7540f8cc4ae4d12ed86c844ef0837a74184d3ada653979608c295c09f200a751", + "runtime_policy_sha256": "141066a7be95c7dc52b944a33dd79579fee9d76112fd31aa9f6771e7959b5cbf", + "sampled_process_group_rss_bytes": 105820160, + "script": "stages/readonly-feasibility-v1/run.py", + "source_bytes_and_modes_unchanged": true, + "source_inventory_sha256": "91e6b4e2bc47b50bf046e5281e2ca28e350b2888cb12f5caec51ad27adeb5d5c", + "status": "PASS", + "stderr_bytes": 0, + "stderr_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stdout_bytes": 18311, + "stdout_sha256": "9d918a8cb7225a7af3efb3882ae27bf198880cbcfe4e53f296cbf694ce09ab3a", + "termination": null, + "usage": { + "exit": 0, + "kernel_max_rss_kib": 48684, + "system_seconds": 0.4, + "user_seconds": 6.27 + }, + "wall_seconds": 6.748948573978851 +} diff --git a/research/c-verification-feasibility/evidence/publication/readonly-gitfree/stderr.txt b/research/c-verification-feasibility/evidence/publication/readonly-gitfree/stderr.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/research/c-verification-feasibility/evidence/publication/readonly-gitfree/stdout.txt b/research/c-verification-feasibility/evidence/publication/readonly-gitfree/stdout.txt new file mode 100644 index 0000000000..8afbd07458 --- /dev/null +++ b/research/c-verification-feasibility/evidence/publication/readonly-gitfree/stdout.txt @@ -0,0 +1,19 @@ +PASS_PRECISION_LINUX_SOURCE_CONTROLS {"contract": "declared contract edits", "declared_edit": "unique backend seam", "inner_archive": "source hash", "official_export_byte": "Exact PR5831 bundle"} +{"all_complete_values_and_types_equal": true, "cases": 241, "controls": ["returned-mutation-isolated", "source-drift", "Fraction-type-drift", "module-byte-drift", "live-code-drift", "nested-live-code-drift", "omitted-witness", "omitted-rounded-sites", "wrong-coefficient", "wrong-weighted-increment", "bad-role", "bad-scalar", "missing-weight", "restore-success", "restore-exception", "fresh-derivation", "key-field-0", "key-field-1", "key-field-2", "key-field-3", "key-field-4", "FIFO-eviction", "canonical-key", "hash-collision", "disabled", "invalid-capacity--1", "invalid-capacity-16385", "invalid-capacity-True", "invalid-capacity-1.5", "uncached-exception-0", "uncached-exception-1", "fresh-call-table", "stats-mutation", "failed-call-clears-stats"], "events": 10164, "status": "PASS_FINITE_FRACTION_TABLE_FEASIBILITY"} +{"all_coverage_preserved": true, "inherited": {"all_complete_values_and_types_equal": true, "cases": 241, "controls": ["returned-mutation-isolated", "source-drift", "Fraction-type-drift", "module-byte-drift", "live-code-drift", "nested-live-code-drift", "omitted-witness", "omitted-rounded-sites", "wrong-coefficient", "wrong-weighted-increment", "bad-role", "bad-scalar", "missing-weight", "restore-success", "restore-exception", "fresh-derivation", "key-field-0", "key-field-1", "key-field-2", "key-field-3", "key-field-4", "FIFO-eviction", "canonical-key", "hash-collision", "disabled", "invalid-capacity--1", "invalid-capacity-16385", "invalid-capacity-True", "invalid-capacity-1.5", "uncached-exception-0", "uncached-exception-1", "fresh-call-table", "stats-mutation", "failed-call-clears-stats"], "events": 10164, "status": "PASS_FINITE_FRACTION_TABLE_FEASIBILITY"}, "new_control_count": 20, "new_controls": ["all-241-fixtures-take-certified-domain", "subtypes-and-foreign-types-fall-back-without-custom-methods", "metaclass-container", "metaclass-scalar", "original-fallback-dict-subclass", "original-fallback-program-subclass", "original-fallback-event-subclass", "original-fallback-weights-subclass", "original-fallback-row-subclass", "original-fallback-rounded-subclass", "original-fallback-Fraction-subclass", "original-fallback-integer-weights", "original-fallback-boolean-public", "exact-internal-type-preservation-at-certified-updates", "malformed-outcome-missing-weight", "malformed-outcome-bad-role", "malformed-outcome-bad-scalar", "malformed-outcome-short-event", "recertification-invalidates-certified-method", "disabled-capacity-not-certified"], "status": "PASS_TYPE_GATE_FINITE_FEASIBILITY"} +{"all_coverage_preserved": true, "inherited": {"all_coverage_preserved": true, "inherited": {"all_complete_values_and_types_equal": true, "cases": 241, "controls": ["returned-mutation-isolated", "source-drift", "Fraction-type-drift", "module-byte-drift", "live-code-drift", "nested-live-code-drift", "omitted-witness", "omitted-rounded-sites", "wrong-coefficient", "wrong-weighted-increment", "bad-role", "bad-scalar", "missing-weight", "restore-success", "restore-exception", "fresh-derivation", "key-field-0", "key-field-1", "key-field-2", "key-field-3", "key-field-4", "FIFO-eviction", "canonical-key", "hash-collision", "disabled", "invalid-capacity--1", "invalid-capacity-16385", "invalid-capacity-True", "invalid-capacity-1.5", "uncached-exception-0", "uncached-exception-1", "fresh-call-table", "stats-mutation", "failed-call-clears-stats"], "events": 10164, "status": "PASS_FINITE_FRACTION_TABLE_FEASIBILITY"}, "new_control_count": 20, "new_controls": ["all-241-fixtures-take-certified-domain", "subtypes-and-foreign-types-fall-back-without-custom-methods", "metaclass-container", "metaclass-scalar", "original-fallback-dict-subclass", "original-fallback-program-subclass", "original-fallback-event-subclass", "original-fallback-weights-subclass", "original-fallback-row-subclass", "original-fallback-rounded-subclass", "original-fallback-Fraction-subclass", "original-fallback-integer-weights", "original-fallback-boolean-public", "exact-internal-type-preservation-at-certified-updates", "malformed-outcome-missing-weight", "malformed-outcome-bad-role", "malformed-outcome-bad-scalar", "malformed-outcome-short-event", "recertification-invalidates-certified-method", "disabled-capacity-not-certified"], "status": "PASS_TYPE_GATE_FINITE_FEASIBILITY"}, "new_control_count": 9, "new_controls": ["canonical-full-pair-tokens", "weight-token-hash-collision", "bounded-context-overflow", "event-q-canonical-equality-and-FIFO-counters", "six-complete-trace-counter-and-type-comparisons", "source-site-weight-ownership", "wrong-token-alias-detected", "overflow-fallback-preserves-original", "fresh-token-and-cache-lifetimes"], "status": "PASS_COMPACT_KEY_FINITE_ONLY"} +{"all_coverage_preserved": true, "inherited": {"all_coverage_preserved": true, "inherited": {"all_coverage_preserved": true, "inherited": {"all_complete_values_and_types_equal": true, "cases": 241, "controls": ["returned-mutation-isolated", "source-drift", "Fraction-type-drift", "module-byte-drift", "live-code-drift", "nested-live-code-drift", "omitted-witness", "omitted-rounded-sites", "wrong-coefficient", "wrong-weighted-increment", "bad-role", "bad-scalar", "missing-weight", "restore-success", "restore-exception", "fresh-derivation", "key-field-0", "key-field-1", "key-field-2", "key-field-3", "key-field-4", "FIFO-eviction", "canonical-key", "hash-collision", "disabled", "invalid-capacity--1", "invalid-capacity-16385", "invalid-capacity-True", "invalid-capacity-1.5", "uncached-exception-0", "uncached-exception-1", "fresh-call-table", "stats-mutation", "failed-call-clears-stats"], "events": 10164, "status": "PASS_FINITE_FRACTION_TABLE_FEASIBILITY"}, "new_control_count": 20, "new_controls": ["all-241-fixtures-take-certified-domain", "subtypes-and-foreign-types-fall-back-without-custom-methods", "metaclass-container", "metaclass-scalar", "original-fallback-dict-subclass", "original-fallback-program-subclass", "original-fallback-event-subclass", "original-fallback-weights-subclass", "original-fallback-row-subclass", "original-fallback-rounded-subclass", "original-fallback-Fraction-subclass", "original-fallback-integer-weights", "original-fallback-boolean-public", "exact-internal-type-preservation-at-certified-updates", "malformed-outcome-missing-weight", "malformed-outcome-bad-role", "malformed-outcome-bad-scalar", "malformed-outcome-short-event", "recertification-invalidates-certified-method", "disabled-capacity-not-certified"], "status": "PASS_TYPE_GATE_FINITE_FEASIBILITY"}, "new_control_count": 9, "new_controls": ["canonical-full-pair-tokens", "weight-token-hash-collision", "bounded-context-overflow", "event-q-canonical-equality-and-FIFO-counters", "six-complete-trace-counter-and-type-comparisons", "source-site-weight-ownership", "wrong-token-alias-detected", "overflow-fallback-preserves-original", "fresh-token-and-cache-lifetimes"], "status": "PASS_COMPACT_KEY_FINITE_ONLY"}, "new_control_count": 10, "new_controls": ["changed-getter-invalidates", "changed-live-getter-code", "foreign-slot-probe-is-pure", "changed-attribute-lookup", "missing-attribute-handler-presence", "binding-restored", "slot-path-selected", "post-derive-getter-drift-literal-fallback", "uninitialized-unused-weight-fallback", "foreign-slot-value-fallback"], "status": "PASS_SLOT_KEY_FINITE_ONLY"} +{"all_coverage_preserved": true, "build": {"SOABI": "cpython-312-x86_64-linux-gnu", "binary_sha256": "328eef13e56b6c3b5e5159553b14f9d7d451630ae22eb17ed1bab34b8b0badde", "cold_build_load_wall_seconds": 0.3227188430028036, "compiler": "/usr/bin/cc", "compiler_cpu_accounting": "outer GNU time user+system includes compiler children", "compiler_version": "cc (Ubuntu 13.3.0-6ubuntu2~24.04.1) 13.3.0", "extension_suffix": ".cpython-312-x86_64-linux-gnu.so", "flags": ["-O2", "-shared", "-fPIC", "-std=c11", "-Wall", "-Werror", "-I/usr/include/python3.12"], "python": "3.12.3 (main, Aug 31 2026, 10:18:26) [GCC 13.3.0]", "source_sha256": "78ed2e240ee40ce4989a4718e77e8b3967b092d2bf8c900124a26942c98a14cb"}, "inherited": {"all_coverage_preserved": true, "inherited": {"all_coverage_preserved": true, "inherited": {"all_coverage_preserved": true, "inherited": {"all_complete_values_and_types_equal": true, "cases": 241, "controls": ["returned-mutation-isolated", "source-drift", "Fraction-type-drift", "module-byte-drift", "live-code-drift", "nested-live-code-drift", "omitted-witness", "omitted-rounded-sites", "wrong-coefficient", "wrong-weighted-increment", "bad-role", "bad-scalar", "missing-weight", "restore-success", "restore-exception", "fresh-derivation", "key-field-0", "key-field-1", "key-field-2", "key-field-3", "key-field-4", "FIFO-eviction", "canonical-key", "hash-collision", "disabled", "invalid-capacity--1", "invalid-capacity-16385", "invalid-capacity-True", "invalid-capacity-1.5", "uncached-exception-0", "uncached-exception-1", "fresh-call-table", "stats-mutation", "failed-call-clears-stats"], "events": 10164, "status": "PASS_FINITE_FRACTION_TABLE_FEASIBILITY"}, "new_control_count": 20, "new_controls": ["all-241-fixtures-take-certified-domain", "subtypes-and-foreign-types-fall-back-without-custom-methods", "metaclass-container", "metaclass-scalar", "original-fallback-dict-subclass", "original-fallback-program-subclass", "original-fallback-event-subclass", "original-fallback-weights-subclass", "original-fallback-row-subclass", "original-fallback-rounded-subclass", "original-fallback-Fraction-subclass", "original-fallback-integer-weights", "original-fallback-boolean-public", "exact-internal-type-preservation-at-certified-updates", "malformed-outcome-missing-weight", "malformed-outcome-bad-role", "malformed-outcome-bad-scalar", "malformed-outcome-short-event", "recertification-invalidates-certified-method", "disabled-capacity-not-certified"], "status": "PASS_TYPE_GATE_FINITE_FEASIBILITY"}, "new_control_count": 9, "new_controls": ["canonical-full-pair-tokens", "weight-token-hash-collision", "bounded-context-overflow", "event-q-canonical-equality-and-FIFO-counters", "six-complete-trace-counter-and-type-comparisons", "source-site-weight-ownership", "wrong-token-alias-detected", "overflow-fallback-preserves-original", "fresh-token-and-cache-lifetimes"], "status": "PASS_COMPACT_KEY_FINITE_ONLY"}, "new_control_count": 10, "new_controls": ["changed-getter-invalidates", "changed-live-getter-code", "foreign-slot-probe-is-pure", "changed-attribute-lookup", "missing-attribute-handler-presence", "binding-restored", "slot-path-selected", "post-derive-getter-drift-literal-fallback", "uninitialized-unused-weight-fallback", "foreign-slot-value-fallback"], "status": "PASS_SLOT_KEY_FINITE_ONLY"}, "native_control_count": 45, "native_controls": ["canonical-keys-FIFO-wrap-counters", "native-hash-collision", "exact-one-callback-per-miss", "uncached-native-error-0", "uncached-native-error-1", "full-cache-failure-before-eviction", "cache-survives-callback-exception", "capacity-0", "capacity--1", "capacity-16385", "capacity-True", "capacity-1.5", "capacity-10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "index--1", "index-3", "index-10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "index-True", "index-0", "arity", "keywords", "exact-operand", "exact-scalar", "event-creation", "descriptor-protocol", "token-length", "token-range", "partial-init-length", "partial-init-weight", "callback-result-shape", "callback-result-type", "callback-reentry", "event-owns-parent", "GC-callback-cycle", "native-statistics-isolated", "native-coefficient-loop", "same-row-lowlevel-rejection", "dict-iterator-mutation-safe", "callback-list-mutation-safe", "native-source-authenticated", "callback-descriptor-is-pure", "plain-callback-rejected", "live-callback-code-drift", "owned-metadata-snapshot", "same-row-source-fallback", "malformed-scalar-literal-fallback"], "status": "PASS_NATIVE_FINITE_ONLY"} +PASS_FRACTION_NATIVE_FINITE_AND_CUSTODY +PASS_C_VERIFICATION_SCOPED_FINITE baseline +{"build": {"SOABI": "cpython-312-x86_64-linux-gnu", "binary_sha256": "aefa1e23f4b0153240e77ccde8e11417b4296678e8d9d05693463a6154d20376", "cold_build_load_wall_seconds": 0.34818927399464883, "compiler": "/usr/bin/cc", "compiler_cpu_accounting": "parent outer process must include compiler children", "extension_suffix": ".cpython-312-x86_64-linux-gnu.so", "flags": ["-O2", "-shared", "-fPIC", "-std=c11", "-Wall", "-Werror", "-I/usr/include/python3.12"], "python": "3.12.3 (main, Aug 31 2026, 10:18:26) [GCC 13.3.0]", "source_sha256": "804cc25bd9ad0912de81fe97bc65b95ebcb0dec06453739e1d4863e7946c4f3d"}, "result": {"checks": ["eight-row-and-score-differentials", "aliased-inputs-return-fresh-outputs", "six-ordered-prefixes-and-complete-bytes", "zero-negative-large-reduced-and-ordered-formatting", "score-string-contract-distinct-from-coefficient-contract", "reverse-scores-signed-bytes-and-aliases", "bool-numerator", "foreign-int-value", "foreign-dict", "foreign-key", "float-value", "negative-exponent", "bool-exponent", "inexact-division-transaction", "inexact-scaled-row", "nondyadic-scale", "zero-scale", "negative-scale", "bool-scale", "short-score", "foreign-scores", "foreign-weight", "weight-index-range", "negative-weight-index", "reverse-index-range", "score-nondyadic-unit", "event-type"], "independent_fraction_formatting": true, "ordered_prefixes": 6, "row_cases": 8, "status": "PASS_FINITE_INTEGER_FORMAT", "timing_claim": false, "whole_replay": false}} +PASS_C_VERIFICATION_SCOPED_FINITE integer +{"build": {"SOABI": "cpython-312-x86_64-linux-gnu", "binary_sha256": "cda9dc3131beda3526aea1211e7d39a76a74f7718f64618a9c7eb03ac0789a60", "cold_build_load_wall_seconds": 0.3513044470164459, "compiler": "/usr/bin/cc", "compiler_cpu_accounting": "parent outer process must include compiler children", "extension_suffix": ".cpython-312-x86_64-linux-gnu.so", "flags": ["-O2", "-shared", "-fPIC", "-std=c11", "-Wall", "-Werror", "-I/usr/include/python3.12"], "python": "3.12.3 (main, Aug 31 2026, 10:18:26) [GCC 13.3.0]", "source_sha256": "804cc25bd9ad0912de81fe97bc65b95ebcb0dec06453739e1d4863e7946c4f3d"}, "result": {"checks": ["eight-row-and-score-differentials", "aliased-inputs-return-fresh-outputs", "six-ordered-prefixes-and-complete-bytes", "zero-negative-large-reduced-and-ordered-formatting", "score-string-contract-distinct-from-coefficient-contract", "reverse-scores-signed-bytes-and-aliases", "bool-numerator", "foreign-int-value", "foreign-dict", "foreign-key", "float-value", "negative-exponent", "bool-exponent", "inexact-division-transaction", "inexact-scaled-row", "nondyadic-scale", "zero-scale", "negative-scale", "bool-scale", "short-score", "foreign-scores", "foreign-weight", "weight-index-range", "negative-weight-index", "reverse-index-range", "score-nondyadic-unit", "event-type"], "independent_fraction_formatting": true, "ordered_prefixes": 6, "row_cases": 8, "status": "PASS_FINITE_INTEGER_FORMAT", "timing_claim": false, "whole_replay": false}} +PASS_C_VERIFICATION_SCOPED_FINITE integer +{"actual_word_run": false, "added_controls": ["165-general-rational-coefficient-prefixes", "batch-FIFO-and-full-counters", "exact-score-type", "score-subclass", "negative-score-denominator", "same-row", "nonbuiltin-gcd", "source-iterator-mutation", "score-list-mutation", "score-value-mutation", "callback-failure-publishes-completed-prefix", "arithmetic-code-drift", "inplace-protocol-drift", "materialization-source-drift", "gcd-drift", "operator-closure-drift", "13-complete-event-prefixes-with-nondyadic-weights-and-scalars", "noncanonical-weight-fallback", "changed-arithmetic-fallback"], "build": {"SOABI": "cpython-312-x86_64-linux-gnu", "binary_sha256": "757ba1b335c1901142586d7ed59f6c124a4eb0d8a82d025adf1b14f8fd00178f", "cold_build_load_wall_seconds": 0.4672614769951906, "compiler": "/usr/bin/cc", "compiler_cpu_accounting": "outer GNU time user+system includes compiler children", "compiler_version": "cc (Ubuntu 13.3.0-6ubuntu2~24.04.1) 13.3.0", "extension_suffix": ".cpython-312-x86_64-linux-gnu.so", "flags": ["-O2", "-shared", "-fPIC", "-std=c11", "-Wall", "-Werror", "-I/usr/include/python3.12"], "python": "3.12.3 (main, Aug 31 2026, 10:18:26) [GCC 13.3.0]", "source_sha256": "4a4949e36cff4ff2894dd1f9379b58a58346ec7c888903271d4b98bbe4cfc7ae"}, "comparisons": 178, "complete_performance": false, "control_count": 19, "independent_literal_oracle_used": true, "status": "PASS_BOUNDED_RATIONAL_PROTOTYPE_ONLY"} +PASS_ADDED_DESTRUCTOR_BINDING_CONTROL +PASS_C_VERIFICATION_SCOPED_FINITE rational +{"actual_word_run": false, "added_controls": ["165-general-rational-coefficient-prefixes", "batch-FIFO-and-full-counters", "exact-score-type", "score-subclass", "negative-score-denominator", "same-row", "nonbuiltin-gcd", "source-iterator-mutation", "score-list-mutation", "score-value-mutation", "callback-failure-publishes-completed-prefix", "arithmetic-code-drift", "inplace-protocol-drift", "materialization-source-drift", "gcd-drift", "operator-closure-drift", "13-complete-event-prefixes-with-nondyadic-weights-and-scalars", "noncanonical-weight-fallback", "changed-arithmetic-fallback"], "build": {"SOABI": "cpython-312-x86_64-linux-gnu", "binary_sha256": "c5f112525f05d298958336bfe3e75282728c4a0ccbb3fa68364068aa7370885a", "cold_build_load_wall_seconds": 0.48878167901420966, "compiler": "/usr/bin/cc", "compiler_cpu_accounting": "outer GNU time user+system includes compiler children", "compiler_version": "cc (Ubuntu 13.3.0-6ubuntu2~24.04.1) 13.3.0", "extension_suffix": ".cpython-312-x86_64-linux-gnu.so", "flags": ["-O2", "-shared", "-fPIC", "-std=c11", "-Wall", "-Werror", "-I/usr/include/python3.12"], "python": "3.12.3 (main, Aug 31 2026, 10:18:26) [GCC 13.3.0]", "source_sha256": "4a4949e36cff4ff2894dd1f9379b58a58346ec7c888903271d4b98bbe4cfc7ae"}, "comparisons": 178, "complete_performance": false, "control_count": 19, "independent_literal_oracle_used": true, "status": "PASS_BOUNDED_RATIONAL_PROTOTYPE_ONLY"} +PASS_ADDED_DESTRUCTOR_BINDING_CONTROL +PASS_C_VERIFICATION_SCOPED_FINITE rational +PASS_READONLY_GITFREE_ALL_FIVE_FINITE_COMMANDS diff --git a/research/c-verification-feasibility/evidence/publication/readonly-gitfree/usage.json b/research/c-verification-feasibility/evidence/publication/readonly-gitfree/usage.json new file mode 100644 index 0000000000..ff109c9f8f --- /dev/null +++ b/research/c-verification-feasibility/evidence/publication/readonly-gitfree/usage.json @@ -0,0 +1 @@ +{"user_seconds":6.27,"system_seconds":0.40,"kernel_max_rss_kib":48684,"exit":0} From 31aa459f90708bf5a9f75a79a4878859d5e05878 Mon Sep 17 00:00:00 2001 From: d3lerium Date: Wed, 28 Oct 2026 00:01:37 +1100 Subject: [PATCH 6/7] Bind reviewed CPython runtime source pairs without weakening drift guards --- .../CODE-SOURCES.json | 4 +- research/c-verification-feasibility/README.md | 14 +- .../c-verification-feasibility/SOURCES.json | 13 +- .../VALIDATION.json | 7 +- .../CI-FAILED-5908-40505352497.json | 1 + .../CI-PORTABILITY-CORRECTION.json | 14 ++ .../publication/astra-ci-binding-review.md | 182 ++++++++++++++++++ .../receipt.json | 26 +++ .../explicit-source-pairs-normal-O/stderr.txt | 0 .../explicit-source-pairs-normal-O/stdout.txt | 9 + .../explicit-source-pairs-normal-O/usage.json | 1 + .../local-portability-rerun/receipt.json | 26 +++ .../local-portability-rerun/stderr.txt | 0 .../local-portability-rerun/stdout.txt | 21 ++ .../local-portability-rerun/usage.json | 1 + .../rational/arithmetic_binding.py | 7 +- research/c-verification-feasibility/verify.py | 16 +- 17 files changed, 333 insertions(+), 9 deletions(-) create mode 100644 research/c-verification-feasibility/evidence/publication/CI-FAILED-5908-40505352497.json create mode 100644 research/c-verification-feasibility/evidence/publication/CI-PORTABILITY-CORRECTION.json create mode 100644 research/c-verification-feasibility/evidence/publication/astra-ci-binding-review.md create mode 100644 research/c-verification-feasibility/evidence/publication/explicit-source-pairs-normal-O/receipt.json create mode 100644 research/c-verification-feasibility/evidence/publication/explicit-source-pairs-normal-O/stderr.txt create mode 100644 research/c-verification-feasibility/evidence/publication/explicit-source-pairs-normal-O/stdout.txt create mode 100644 research/c-verification-feasibility/evidence/publication/explicit-source-pairs-normal-O/usage.json create mode 100644 research/c-verification-feasibility/evidence/publication/local-portability-rerun/receipt.json create mode 100644 research/c-verification-feasibility/evidence/publication/local-portability-rerun/stderr.txt create mode 100644 research/c-verification-feasibility/evidence/publication/local-portability-rerun/stdout.txt create mode 100644 research/c-verification-feasibility/evidence/publication/local-portability-rerun/usage.json diff --git a/research/c-verification-feasibility/CODE-SOURCES.json b/research/c-verification-feasibility/CODE-SOURCES.json index 75f4102fae..5464343fb2 100644 --- a/research/c-verification-feasibility/CODE-SOURCES.json +++ b/research/c-verification-feasibility/CODE-SOURCES.json @@ -10,10 +10,10 @@ "integer/micro_probe.py": "f1d39f830987fcabe8ca5453ddbb1eca1df10a9670a95db510efbe5f21dd76aa", "integer/native_loader.py": "2592bef50e5338ad562d9a69bca1183ef0d88a4d34bdc497af4452304dca25c3", "portable.py": "77f8910fb9ba1ed8dcc23bc574e2998105b86818f7391b48efa77eda6ea3d859", - "rational/arithmetic_binding.py": "2115d639fac0262352a3091cc1fcce2c9aefd892992b92e5740ffd173330fdbd", + "rational/arithmetic_binding.py": "db9c2778be538e1a7ae975b7e2108e52da53600a268c76d5e27b9965f0bb622a", "rational/bulk_backend.py": "9b440bd3d921bb06ff5035cb8ae85053f3e0b6880b6ec37d364b55da012449ca", "rational/finite_probe.py": "362bcd2bc967ed223ed303835048d1c51697f0293cfc83cffd4a9e02e2efcccd", "rational/native_bulk.c": "4a4949e36cff4ff2894dd1f9379b58a58346ec7c888903271d4b98bbe4cfc7ae", "replay.py": "a25304bed5fcf7ed56802569d648707b73c83666fa6f645ddffc5a5cc0bae2a8", - "verify.py": "57bd03c6134a6eb92d4889e43cce0f3f97fd8f7fc0bce39b8cfb015bd9aecd09" + "verify.py": "6c25ffb97cbe940f8414d97c668a0b0d2d759e0d37d46283316e577b7bb38372" } diff --git a/research/c-verification-feasibility/README.md b/research/c-verification-feasibility/README.md index 7342b67f47..fd04ebe2c7 100644 --- a/research/c-verification-feasibility/README.md +++ b/research/c-verification-feasibility/README.md @@ -92,7 +92,7 @@ supports odd denominators. Exact Fraction output types do not make its changed arithmetic an untouched literal Python Fraction oracle. The bounded probe passed 178 literal/predecessor/candidate comparisons and 19 -added controls. The final binder also rejects destructor drift; its exact final +added controls. The final binder also rejects destructor and unknown-source drift; its exact final bytes pass finite normal and optimized replay. The earlier binder and every declared BCCB micro observation are retained. The micro excludes cold build and has no complete-performance or source-independent oracle admission. @@ -143,6 +143,18 @@ six-process screen. It refuses evidence reuse and retains the 180-second / 1-GiB sampled process-group RSS / serial / zero-automatic-retry policy. Do not reroll the failed retained timing round. +## Hosted runtime correction + +The first hosted replay rejected CPython 3.12.15 at the strict full-file +Fraction source hash, after the baseline and integer normal/optimized checks +passed. The failure is retained. An explicit second reviewed source hash admits +the official 3.12.15 file; its only source difference is in `Fraction.__pow__`, +outside the bypassed score operations. Exact live operation, closure, defaults, +MRO and descriptor checks remain. Unknown source bytes reject even after the +expected-code cache is populated. This compatibility correction changes no +measured integer source, C kernel, timing sample or failed performance gate. +See [the retained correction](evidence/publication/CI-PORTABILITY-CORRECTION.json). + ## Credit Original mathematics, P104 source, integer replay, literal scalar and reverse diff --git a/research/c-verification-feasibility/SOURCES.json b/research/c-verification-feasibility/SOURCES.json index df793edcb6..9715496334 100644 --- a/research/c-verification-feasibility/SOURCES.json +++ b/research/c-verification-feasibility/SOURCES.json @@ -36,5 +36,16 @@ 5864, 5875 ], - "scope": "No new kappa, construction, selected-frontier or qualified performance claim." + "scope": "No new kappa, construction, selected-frontier or qualified performance claim.", + "runtime_fraction_source_pins": [ + { + "sha256": "cf33568f7b767f66896995a7a81cc662e8be226f2e58efb61d2028f64eb5d231", + "origin": "local Linux CPython3.12.3 stdlib, unchanged timed environment" + }, + { + "sha256": "d52d1ab9d5be26924e4914a5e40069c992bbfa68f773694c2e5ee8452d0766a0", + "origin": "https://raw.githubusercontent.com/python/cpython/v3.12.15/Lib/fractions.py", + "scope": "explicit compatibility pin; all live operation shape guards retained" + } + ] } diff --git a/research/c-verification-feasibility/VALIDATION.json b/research/c-verification-feasibility/VALIDATION.json index 5413964404..339369cbe2 100644 --- a/research/c-verification-feasibility/VALIDATION.json +++ b/research/c-verification-feasibility/VALIDATION.json @@ -21,10 +21,13 @@ "new_complete_optimized_or_readonly_replays": 0, "readonly_gitfree_finite": "PASS_ALL_FIVE_COMMANDS", "metadata_committed_bytes": "PASS_METADATA_PINS_97_FILES_BEFORE_PUBLICATION_METADATA_ADDITION", - "hosted_exact_head": "UNCLAIMED_BY_LOCAL_ARTIFACT_SEE_PR_CHECKS", + "hosted_exact_head": "FIRST_HEAD_FAILED_SOURCE_COMPATIBILITY; CORRECTED_HEAD_REPLAY_REQUIRED", "scope_notes": [ "Four unchanged custody checks are separate from timed arms, matching frozen PR5864 benchmark.", "Complete actual witness/ideal/weights outputs equal and all120 independent fixtures retained.", "Prototype author also performed integer source review; independent human/proof-kernel acceptance unclaimed." - ] + ], + "extra_unknown_source_rejection_control": 1, + "first_hosted_failure": "run40505352497 / ec0afa... rejected rational binding after baseline+integer normalO passed; retained diagnostic and reviewed compatibility correction", + "explicit_runtime_source_pairs_local": "PASS_NORMAL_AND_OPTIMIZED" } diff --git a/research/c-verification-feasibility/evidence/publication/CI-FAILED-5908-40505352497.json b/research/c-verification-feasibility/evidence/publication/CI-FAILED-5908-40505352497.json new file mode 100644 index 0000000000..2b1d39f438 --- /dev/null +++ b/research/c-verification-feasibility/evidence/publication/CI-FAILED-5908-40505352497.json @@ -0,0 +1 @@ +{"headRevision":"ec0afa7633ff72e1c5ea26bb5726ec569a3f59ac","checks":[],"statuses":[],"annotations":[],"hasMore":false,"job":{"id":122195099408,"head_sha":"ec0afa7633ff72e1c5ea26bb5726ec569a3f59ac","name":"replay (research/c-verification-feasibility) / replay (research/c-verification-feasibility)","status":"completed","conclusion":"failure"},"jobs":[],"log":"2026-10-27T12:42:50.2533622Z Current runner version: '2.338.0'\n2026-10-27T12:42:50.2561909Z ##[group]Runner Image Provisioner\n2026-10-27T12:42:50.2562747Z Hosted Compute Agent\n2026-10-27T12:42:50.2563465Z Version: 20261021.618\n2026-10-27T12:42:50.2564135Z Commit: 21505ad2541d5be6135ed84fc33697146cf75b8e\n2026-10-27T12:42:50.2564890Z Build Date: 2026-10-21T00:45:21Z\n2026-10-27T12:42:50.2565587Z Worker ID: {2f8826cf-c71f-418d-97ea-5a0a1836171d}\n2026-10-27T12:42:50.2566295Z Region: eastus\n2026-10-27T12:42:50.2566884Z Cloud: Azure\n2026-10-27T12:42:50.2567447Z ##[endgroup]\n2026-10-27T12:42:50.2569283Z ##[group]Operating System\n2026-10-27T12:42:50.2570318Z Ubuntu\n2026-10-27T12:42:50.2570837Z 24.04.5\n2026-10-27T12:42:50.2571500Z LTS\n2026-10-27T12:42:50.2572012Z ##[endgroup]\n2026-10-27T12:42:50.2572600Z ##[group]Runner Image\n2026-10-27T12:42:50.2573225Z Image: ubuntu-24.04\n2026-10-27T12:42:50.2573788Z Version: 20261012.334.1\n2026-10-27T12:42:50.2575152Z Included Software: https://github.com/actions/runner-images/blob/ubuntu24/20261012.334/images/ubuntu/Ubuntu2404-Readme.md\n2026-10-27T12:42:50.2576743Z Image Release: https://github.com/actions/runner-images/releases/tag/ubuntu24%2F20261012.334\n2026-10-27T12:42:50.2577765Z ##[endgroup]\n2026-10-27T12:42:50.2578922Z ##[group]GITHUB_TOKEN Permissions\n2026-10-27T12:42:50.2581519Z Contents: read\n2026-10-27T12:42:50.2582148Z Metadata: read\n2026-10-27T12:42:50.2582824Z ##[endgroup]\n2026-10-27T12:42:50.2585204Z Secret source: None\n2026-10-27T12:42:50.2586236Z Cache mode: write\n2026-10-27T12:42:50.2587202Z Prepare workflow directory\n2026-10-27T12:42:50.3122823Z Prepare all required actions\n2026-10-27T12:42:50.3172620Z Getting action download info\n2026-10-27T12:42:50.5340512Z Download action repository 'actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1' (SHA:3d3c42e5aac5ba805825da76410c181273ba90b1)\n2026-10-27T12:42:50.6424100Z Download action repository 'actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97' (SHA:5fda3b95a4ea91299a34e894583c3862153e4b97)\n2026-10-27T12:42:50.8545636Z Uses: CrocSwap/integer-mult-bounds/.github/workflows/research-package-batch.yml@refs/pull/5908/merge (137e1a59ee878b08a45d42bed939b9ba8139bda4)\n2026-10-27T12:42:50.8550713Z ##[group] Inputs\n2026-10-27T12:42:50.8551370Z packages: [\n \"research/c-verification-feasibility\"\n]\n2026-10-27T12:42:50.8552021Z ##[endgroup]\n2026-10-27T12:42:50.8552891Z Complete job name: replay (research/c-verification-feasibility) / replay (research/c-verification-feasibility)\n2026-10-27T12:42:50.9291744Z ##[group]Run actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1\n2026-10-27T12:42:50.9292818Z with:\n2026-10-27T12:42:50.9293254Z fetch-depth: 0\n2026-10-27T12:42:50.9293723Z persist-credentials: false\n2026-10-27T12:42:50.9294282Z repository: CrocSwap/integer-mult-bounds\n2026-10-27T12:42:50.9298089Z token: ***\n2026-10-27T12:42:50.9298520Z ssh-strict: true\n2026-10-27T12:42:50.9298961Z ssh-user: git\n2026-10-27T12:42:50.9299376Z clean: true\n2026-10-27T12:42:50.9300029Z sparse-checkout-cone-mode: true\n2026-10-27T12:42:50.9300575Z fetch-tags: false\n2026-10-27T12:42:50.9301021Z show-progress: true\n2026-10-27T12:42:50.9301466Z lfs: false\n2026-10-27T12:42:50.9301877Z submodules: false\n2026-10-27T12:42:50.9302320Z set-safe-directory: true\n2026-10-27T12:42:50.9302823Z allow-unsafe-pr-checkout: false\n2026-10-27T12:42:50.9303586Z env:\n2026-10-27T12:42:50.9304015Z PYTHONDONTWRITEBYTECODE: 1\n2026-10-27T12:42:50.9304658Z RESEARCH_PACKAGE: research/c-verification-feasibility\n2026-10-27T12:42:50.9305283Z ##[endgroup]\n2026-10-27T12:42:51.0366023Z Syncing repository: CrocSwap/integer-mult-bounds\n2026-10-27T12:42:51.0368110Z ##[group]Getting Git version info\n2026-10-27T12:42:51.0368967Z Working directory is '/home/runner/work/integer-mult-bounds/integer-mult-bounds'\n2026-10-27T12:42:51.0370610Z [command]/usr/bin/git version\n2026-10-27T12:42:51.0447909Z git version 2.55.0\n2026-10-27T12:42:51.0471409Z ##[endgroup]\n2026-10-27T12:42:51.0484712Z Temporarily overriding HOME='/home/runner/work/_temp/a42295f7-5a10-44f6-949c-cb7d0d3713f5' before making global git config changes\n2026-10-27T12:42:51.0487427Z Adding repository directory to the temporary git global config as a safe directory\n2026-10-27T12:42:51.0492500Z [command]/usr/bin/git config --global --add safe.directory /home/runner/work/integer-mult-bounds/integer-mult-bounds\n2026-10-27T12:42:51.0548003Z Deleting the contents of '/home/runner/work/integer-mult-bounds/integer-mult-bounds'\n2026-10-27T12:42:51.0552084Z ##[group]Determining repository object format\n2026-10-27T12:42:51.0554274Z ##[endgroup]\n2026-10-27T12:42:51.0555075Z ##[group]Initializing the repository\n2026-10-27T12:42:51.0560543Z [command]/usr/bin/git init /home/runner/work/integer-mult-bounds/integer-mult-bounds\n2026-10-27T12:42:51.0678664Z hint: Using 'master' as the name for the initial branch. This default branch name\n2026-10-27T12:42:51.0681103Z hint: will change to \"main\" in Git 3.0. To configure the initial branch name\n2026-10-27T12:42:51.0682816Z hint: to use in all of your new repositories, which will suppress this warning,\n2026-10-27T12:42:51.0684193Z hint: call:\n2026-10-27T12:42:51.0684850Z hint:\n2026-10-27T12:42:51.0685677Z hint: \tgit config --global init.defaultBranch \n2026-10-27T12:42:51.0686667Z hint:\n2026-10-27T12:42:51.0687614Z hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and\n2026-10-27T12:42:51.0688734Z hint: 'development'. The just-created branch can be renamed via this command:\n2026-10-27T12:42:51.0689480Z hint:\n2026-10-27T12:42:51.0690430Z hint: \tgit branch -m \n2026-10-27T12:42:51.0691251Z hint:\n2026-10-27T12:42:51.0692345Z hint: Disable this message with \"git config set advice.defaultBranchName false\"\n2026-10-27T12:42:51.0693854Z Initialized empty Git repository in /home/runner/work/integer-mult-bounds/integer-mult-bounds/.git/\n2026-10-27T12:42:51.0695810Z [command]/usr/bin/git remote add origin https://github.com/CrocSwap/integer-mult-bounds\n2026-10-27T12:42:51.0748926Z ##[endgroup]\n2026-10-27T12:42:51.0750433Z ##[group]Disabling automatic garbage collection\n2026-10-27T12:42:51.0752676Z [command]/usr/bin/git config --local gc.auto 0\n2026-10-27T12:42:51.0785333Z ##[endgroup]\n2026-10-27T12:42:51.0786485Z ##[group]Setting up auth\n2026-10-27T12:42:51.0787110Z Removing SSH command configuration\n2026-10-27T12:42:51.0792743Z [command]/usr/bin/git config --local --name-only --get-regexp core\\.sshCommand\n2026-10-27T12:42:51.0827236Z [command]/usr/bin/git submodule foreach --recursive sh -c \"git config --local --name-only --get-regexp 'core\\.sshCommand' && git config --local --unset-all 'core.sshCommand' || :\"\n2026-10-27T12:42:51.1192282Z Removing HTTP extra header\n2026-10-27T12:42:51.1199915Z [command]/usr/bin/git config --local --name-only --get-regexp http\\.https\\:\\/\\/github\\.com\\/\\.extraheader\n2026-10-27T12:42:51.1235117Z [command]/usr/bin/git submodule foreach --recursive sh -c \"git config --local --name-only --get-regexp 'http\\.https\\:\\/\\/github\\.com\\/\\.extraheader' && git config --local --unset-all 'http.https://github.com/.extraheader' || :\"\n2026-10-27T12:42:51.1460650Z Removing includeIf entries pointing to credentials config files\n2026-10-27T12:42:51.1465868Z [command]/usr/bin/git config --local --name-only --get-regexp ^includeIf\\.gitdir:\n2026-10-27T12:42:51.1498925Z [command]/usr/bin/git submodule foreach --recursive git config --local --show-origin --name-only --get-regexp remote.origin.url\n2026-10-27T12:42:51.1733196Z [command]/usr/bin/git config --file /home/runner/work/_temp/git-credentials-79faf164-9762-4e67-8ef7-5995b77b3024.config http.https://github.com/.extraheader AUTHORIZATION: basic ***\n2026-10-27T12:42:51.1774023Z [command]/usr/bin/git config --local includeIf.gitdir:/home/runner/work/integer-mult-bounds/integer-mult-bounds/.git.path /home/runner/work/_temp/git-credentials-79faf164-9762-4e67-8ef7-5995b77b3024.config\n2026-10-27T12:42:51.1806402Z [command]/usr/bin/git config --local includeIf.gitdir:/home/runner/work/integer-mult-bounds/integer-mult-bounds/.git/worktrees/*.path /home/runner/work/_temp/git-credentials-79faf164-9762-4e67-8ef7-5995b77b3024.config\n2026-10-27T12:42:51.1842317Z [command]/usr/bin/git config --local includeIf.gitdir:/github/workspace/.git.path /github/runner_temp/git-credentials-79faf164-9762-4e67-8ef7-5995b77b3024.config\n2026-10-27T12:42:51.1874216Z [command]/usr/bin/git config --local includeIf.gitdir:/github/workspace/.git/worktrees/*.path /github/runner_temp/git-credentials-79faf164-9762-4e67-8ef7-5995b77b3024.config\n2026-10-27T12:42:51.1904811Z ##[endgroup]\n2026-10-27T12:42:51.1912933Z ##[group]Fetching the repository\n2026-10-27T12:42:51.1915771Z [command]/usr/bin/git -c protocol.version=2 fetch --no-tags --prune --no-recurse-submodules origin +refs/heads/*:refs/remotes/origin/* +refs/tags/*:refs/tags/* +137e1a59ee878b08a45d42bed939b9ba8139bda4:refs/remotes/pull/5908/merge\n2026-10-27T12:43:36.0879436Z From https://github.com/CrocSwap/integer-mult-bounds\n2026-10-27T12:43:36.0884409Z * [new branch] complex-local-word-ceiling -> origin/complex-local-word-ceiling\n2026-10-27T12:43:36.0885107Z * [new branch] complex-queue-ceiling-census -> origin/complex-queue-ceiling-census\n2026-10-27T12:43:36.0885851Z * [new branch] current-status-heading-repair -> origin/current-status-heading-repair\n2026-10-27T12:43:36.0886493Z * [new branch] integration/community -> origin/integration/community\n2026-10-27T12:43:36.0887407Z * [new branch] integration/community-followups -> origin/integration/community-followups\n2026-10-27T12:43:36.0888721Z * [new branch] integration/community-round2 -> origin/integration/community-round2\n2026-10-27T12:43:36.0890224Z * [new branch] integration/community-round8-20261009 -> origin/integration/community-round8-20261009\n2026-10-27T12:43:36.0891498Z * [new branch] integration/overnight-20261009 -> origin/integration/overnight-20261009\n2026-10-27T12:43:36.0892593Z * [new branch] integration/pr144-reviewed -> origin/integration/pr144-reviewed\n2026-10-27T12:43:36.0893652Z * [new branch] integration/preserved-research-20261008 -> origin/integration/preserved-research-20261008\n2026-10-27T12:43:36.0894385Z * [new branch] integration/swapnil-review -> origin/integration/swapnil-review\n2026-10-27T12:43:36.0895020Z * [new branch] lean-pending-derivation -> origin/lean-pending-derivation\n2026-10-27T12:43:36.0895528Z * [new branch] main -> origin/main\n2026-10-27T12:43:36.0897050Z * [new branch] pending-range-derivation-pr540 -> origin/pending-range-derivation-pr540\n2026-10-27T12:43:36.0898015Z * [new branch] priority-revision-3 -> origin/priority-revision-3\n2026-10-27T12:43:36.0898581Z * [new branch] release/ternary-30 -> origin/release/ternary-30\n2026-10-27T12:43:36.0899127Z * [new branch] research/complex-seed24 -> origin/research/complex-seed24\n2026-10-27T12:43:36.0900093Z * [new branch] research/decoder-seed43 -> origin/research/decoder-seed43\n2026-10-27T12:43:36.0900823Z * [new branch] research/decoder-seed49 -> origin/research/decoder-seed49\n2026-10-27T12:43:36.0901523Z * [new branch] research/seed51-clean-residual-dilation -> origin/research/seed51-clean-residual-dilation\n2026-10-27T12:43:36.0902320Z * [new branch] research/universal-connector-six-source -> origin/research/universal-connector-six-source\n2026-10-27T12:43:36.0903058Z * [new branch] review/community-round8-20261009 -> origin/review/community-round8-20261009\n2026-10-27T12:43:36.0903753Z * [new branch] review/windows-replay-20261016 -> origin/review/windows-replay-20261016\n2026-10-27T12:43:36.0904331Z * [new branch] stack/pr540-base -> origin/stack/pr540-base\n2026-10-27T12:43:36.0905006Z * [new tag] archive/pr-reconciliation-fourth100-20261013 -> archive/pr-reconciliation-fourth100-20261013\n2026-10-27T12:43:36.0905810Z * [new tag] archive/pr-reconciliation-next100-20261013 -> archive/pr-reconciliation-next100-20261013\n2026-10-27T12:43:36.0906813Z * [new tag] archive/pr-reconciliation-third100-20261013 -> archive/pr-reconciliation-third100-20261013\n2026-10-27T12:43:36.0907831Z * [new tag] archive/pr-reconciliation100-20261013 -> archive/pr-reconciliation100-20261013\n2026-10-27T12:43:36.0908563Z * [new tag] community-kappa-15-2026-10-08 -> community-kappa-15-2026-10-08\n2026-10-27T12:43:36.0909189Z * [new ref] 137e1a59ee878b08a45d42bed939b9ba8139bda4 -> pull/5908/merge\n2026-10-27T12:43:36.0910853Z ##[endgroup]\n2026-10-27T12:43:36.0911320Z ##[group]Determining the checkout info\n2026-10-27T12:43:36.0911814Z ##[endgroup]\n2026-10-27T12:43:36.0912106Z [command]/usr/bin/git sparse-checkout disable\n2026-10-27T12:43:36.0952968Z [command]/usr/bin/git config --local --unset-all extensions.worktreeConfig\n2026-10-27T12:43:36.0981739Z ##[group]Checking out the ref\n2026-10-27T12:43:36.0985357Z [command]/usr/bin/git checkout --progress --force refs/remotes/pull/5908/merge\n2026-10-27T12:43:37.2644258Z Updating files: 3% (4744/124082)\n2026-10-27T12:43:37.4490479Z Updating files: 4% (4964/124082)\n2026-10-27T12:43:37.7338368Z Updating files: 5% (6205/124082)\n2026-10-27T12:43:37.8951962Z Updating files: 6% (7445/124082)\n2026-10-27T12:43:38.0841505Z Updating files: 7% (8686/124082)\n2026-10-27T12:43:38.2170436Z Updating files: 8% (9927/124082)\n2026-10-27T12:43:38.5138993Z Updating files: 8% (10442/124082)\n2026-10-27T12:43:38.6588480Z Updating files: 9% (11168/124082)\n2026-10-27T12:43:38.9387896Z Updating files: 10% (12409/124082)\n2026-10-27T12:43:39.2176635Z Updating files: 11% (13650/124082)\n2026-10-27T12:43:39.2813455Z Updating files: 11% (14601/124082)\n2026-10-27T12:43:39.4524629Z Updating files: 12% (14890/124082)\n2026-10-27T12:43:39.6023711Z Updating files: 13% (16131/124082)\n2026-10-27T12:43:39.8954776Z Updating files: 14% (17372/124082)\n2026-10-27T12:43:40.1524114Z Updating files: 15% (18613/124082)\n2026-10-27T12:43:40.2169439Z Updating files: 16% (19854/124082)\n2026-10-27T12:43:40.3528831Z Updating files: 16% (20358/124082)\n2026-10-27T12:43:40.6245571Z Updating files: 17% (21094/124082)\n2026-10-27T12:43:40.9991177Z Updating files: 18% (22335/124082)\n2026-10-27T12:43:41.0540895Z Updating files: 19% (23576/124082)\n2026-10-27T12:43:41.1636855Z Updating files: 20% (24817/124082)\n2026-10-27T12:43:41.2168489Z Updating files: 21% (26058/124082)\n2026-10-27T12:43:41.2337512Z Updating files: 21% (27049/124082)\n2026-10-27T12:43:41.5175082Z Updating files: 22% (27299/124082)\n2026-10-27T12:43:41.6619220Z Updating files: 23% (28539/124082)\n2026-10-27T12:43:41.8153690Z Updating files: 24% (29780/124082)\n2026-10-27T12:43:41.9324126Z Updating files: 25% (31021/124082)\n2026-10-27T12:43:42.0384890Z Updating files: 26% (32262/124082)\n2026-10-27T12:43:42.1644494Z Updating files: 27% (33503/124082)\n2026-10-27T12:43:42.2169639Z Updating files: 28% (34743/124082)\n2026-10-27T12:43:42.3151876Z Updating files: 28% (35162/124082)\n2026-10-27T12:43:42.5125501Z Updating files: 29% (35984/124082)\n2026-10-27T12:43:42.8416141Z Updating files: 30% (37225/124082)\n2026-10-27T12:43:43.0506660Z Updating files: 31% (38466/124082)\n2026-10-27T12:43:43.2209458Z Updating files: 32% (39707/124082)\n2026-10-27T12:43:43.4170496Z Updating files: 32% (40746/124082)\n2026-10-27T12:43:43.6226896Z Updating files: 33% (40948/124082)\n2026-10-27T12:43:43.7772863Z Updating files: 34% (42188/124082)\n2026-10-27T12:43:43.9221425Z Updating files: 35% (43429/124082)\n2026-10-27T12:43:44.0923315Z Updating files: 36% (44670/124082)\n2026-10-27T12:43:44.2193137Z Updating files: 37% (45911/124082)\n2026-10-27T12:43:44.4216943Z Updating files: 37% (46334/124082)\n2026-10-27T12:43:44.5501244Z Updating files: 38% (47152/124082)\n2026-10-27T12:43:44.6747321Z Updating files: 39% (48392/124082)\n2026-10-27T12:43:44.8818172Z Updating files: 40% (49633/124082)\n2026-10-27T12:43:45.1060872Z Updating files: 41% (50874/124082)\n2026-10-27T12:43:45.2171825Z Updating files: 42% (52115/124082)\n2026-10-27T12:43:45.5410172Z Updating files: 42% (52652/124082)\n2026-10-27T12:43:45.7717140Z Updating files: 43% (53356/124082)\n2026-10-27T12:43:45.9897688Z Updating files: 44% (54597/124082)\n2026-10-27T12:43:46.1080163Z Updating files: 45% (55837/124082)\n2026-10-27T12:43:46.2375886Z Updating files: 46% (57078/124082)\n2026-10-27T12:43:46.6618692Z Updating files: 46% (57427/124082)\n2026-10-27T12:43:47.0360639Z Updating files: 47% (58319/124082)\n2026-10-27T12:43:47.2169421Z Updating files: 48% (59560/124082)\n2026-10-27T12:43:47.3826349Z Updating files: 48% (60216/124082)\n2026-10-27T12:43:48.2098911Z Updating files: 49% (60801/124082)\n2026-10-27T12:43:48.2179304Z Updating files: 50% (62041/124082)\n2026-10-27T12:43:48.7322879Z Updating files: 50% (62053/124082)\n2026-10-27T12:43:48.8859291Z Updating files: 51% (63282/124082)\n2026-10-27T12:43:49.0110954Z Updating files: 52% (64523/124082)\n2026-10-27T12:43:49.1793046Z Updating files: 53% (65764/124082)\n2026-10-27T12:43:49.2178404Z Updating files: 54% (67005/124082)\n2026-10-27T12:43:49.5884478Z Updating files: 54% (67121/124082)\n2026-10-27T12:43:49.9279856Z Updating files: 55% (68246/124082)\n2026-10-27T12:43:50.0804350Z Updating files: 56% (69486/124082)\n2026-10-27T12:43:50.2170789Z Updating files: 57% (70727/124082)\n2026-10-27T12:43:50.3567665Z Updating files: 57% (71106/124082)\n2026-10-27T12:43:50.5100661Z Updating files: 58% (71968/124082)\n2026-10-27T12:43:50.7166155Z Updating files: 59% (73209/124082)\n2026-10-27T12:43:50.9057202Z Updating files: 60% (74450/124082)\n2026-10-27T12:43:51.2116849Z Updating files: 61% (75691/124082)\n2026-10-27T12:43:51.2171393Z Updating files: 62% (76931/124082)\n2026-10-27T12:43:51.3728776Z Updating files: 62% (76963/124082)\n2026-10-27T12:43:51.5008456Z Updating files: 63% (78172/124082)\n2026-10-27T12:43:51.6664305Z Updating files: 64% (79413/124082)\n2026-10-27T12:43:51.8241826Z Updating files: 65% (80654/124082)\n2026-10-27T12:43:51.9478320Z Updating files: 66% (81895/124082)\n2026-10-27T12:43:52.0716406Z Updating files: 67% (83135/124082)\n2026-10-27T12:43:52.1858787Z Updating files: 68% (84376/124082)\n2026-10-27T12:43:52.2168402Z Updating files: 69% (85617/124082)\n2026-10-27T12:43:52.4249580Z Updating files: 69% (86078/124082)\n2026-10-27T12:43:52.5866411Z Updating files: 70% (86858/124082)\n2026-10-27T12:43:52.9938158Z Updating files: 71% (88099/124082)\n2026-10-27T12:43:53.2186404Z Updating files: 72% (89340/124082)\n2026-10-27T12:43:53.3630668Z Updating files: 72% (89950/124082)\n2026-10-27T12:43:53.5838206Z Updating files: 73% (90580/124082)\n2026-10-27T12:43:53.7643702Z Updating files: 74% (91821/124082)\n2026-10-27T12:43:53.9037325Z Updating files: 75% (93062/124082)\n2026-10-27T12:43:54.0227161Z Updating files: 76% (94303/124082)\n2026-10-27T12:43:54.1347253Z Updating files: 77% (95544/124082)\n2026-10-27T12:43:54.2168199Z Updating files: 78% (96784/124082)\n2026-10-27T12:43:54.2405651Z Updating files: 78% (97791/124082)\n2026-10-27T12:43:54.4140038Z Updating files: 79% (98025/124082)\n2026-10-27T12:43:54.5612319Z Updating files: 80% (99266/124082)\n2026-10-27T12:43:54.7438087Z Updating files: 81% (100507/124082)\n2026-10-27T12:43:54.9176610Z Updating files: 82% (101748/124082)\n2026-10-27T12:43:55.2168976Z Updating files: 83% (102989/124082)\n2026-10-27T12:43:55.2608322Z Updating files: 83% (103853/124082)\n2026-10-27T12:43:55.3964834Z Updating files: 84% (104229/124082)\n2026-10-27T12:43:55.4886860Z Updating files: 85% (105470/124082)\n2026-10-27T12:43:55.6174297Z Updating files: 86% (106711/124082)\n2026-10-27T12:43:55.8270645Z Updating files: 87% (107952/124082)\n2026-10-27T12:43:55.9577931Z Updating files: 88% (109193/124082)\n2026-10-27T12:43:56.2341738Z Updating files: 89% (110433/124082)\n2026-10-27T12:43:56.2459625Z Updating files: 89% (111531/124082)\n2026-10-27T12:43:56.7848369Z Updating files: 90% (111674/124082)\n2026-10-27T12:43:56.9802615Z Updating files: 91% (112915/124082)\n2026-10-27T12:43:57.1574935Z Updating files: 92% (114156/124082)\n2026-10-27T12:43:57.2167684Z Updating files: 93% (115397/124082)\n2026-10-27T12:43:57.4138117Z Updating files: 93% (115665/124082)\n2026-10-27T12:43:58.2196066Z Updating files: 94% (116638/124082)\n2026-10-27T12:43:58.2561489Z Updating files: 94% (117774/124082)\n2026-10-27T12:43:58.7017768Z Updating files: 95% (117878/124082)\n2026-10-27T12:43:59.0952205Z Updating files: 96% (119119/124082)\n2026-10-27T12:43:59.2168640Z Updating files: 97% (120360/124082)\n2026-10-27T12:43:59.2341102Z Updating files: 97% (121404/124082)\n2026-10-27T12:43:59.3476450Z Updating files: 98% (121601/124082)\n2026-10-27T12:43:59.4942165Z Updating files: 99% (122842/124082)\n2026-10-27T12:43:59.4942711Z Updating files: 100% (124082/124082)\n2026-10-27T12:43:59.4943128Z Updating files: 100% (124082/124082), done.\n2026-10-27T12:43:59.6378956Z Note: switching to 'refs/remotes/pull/5908/merge'.\n2026-10-27T12:43:59.6380018Z \n2026-10-27T12:43:59.6380384Z You are in 'detached HEAD' state. You can look around, make experimental\n2026-10-27T12:43:59.6381205Z changes and commit them, and you can discard any commits you make in this\n2026-10-27T12:43:59.6381988Z state without impacting any branches by switching back to a branch.\n2026-10-27T12:43:59.6382508Z \n2026-10-27T12:43:59.6382824Z If you want to create a new branch to retain commits you create, you may\n2026-10-27T12:43:59.6383586Z do so (now or later) by using -c with the switch command. Example:\n2026-10-27T12:43:59.6384027Z \n2026-10-27T12:43:59.6384210Z git switch -c \n2026-10-27T12:43:59.6384499Z \n2026-10-27T12:43:59.6384672Z Or undo this operation with:\n2026-10-27T12:43:59.6384958Z \n2026-10-27T12:43:59.6385107Z git switch -\n2026-10-27T12:43:59.6385309Z \n2026-10-27T12:43:59.6385675Z Turn off this advice by setting config variable advice.detachedHead to false\n2026-10-27T12:43:59.6386211Z \n2026-10-27T12:43:59.6386831Z HEAD is now at 137e1a59e Merge ec0afa7633ff72e1c5ea26bb5726ec569a3f59ac into de5ec2e7a6074068452f45b1a191b5c72832df4a\n2026-10-27T12:43:59.6712730Z ##[endgroup]\n2026-10-27T12:43:59.6755749Z [command]/usr/bin/git log -1 --format=%H\n2026-10-27T12:43:59.6782000Z 137e1a59ee878b08a45d42bed939b9ba8139bda4\n2026-10-27T12:43:59.6791998Z ##[group]Removing auth\n2026-10-27T12:43:59.6792446Z Removing SSH command configuration\n2026-10-27T12:43:59.6796843Z [command]/usr/bin/git config --local --name-only --get-regexp core\\.sshCommand\n2026-10-27T12:43:59.6828474Z [command]/usr/bin/git submodule foreach --recursive sh -c \"git config --local --name-only --get-regexp 'core\\.sshCommand' && git config --local --unset-all 'core.sshCommand' || :\"\n2026-10-27T12:43:59.7154064Z Removing HTTP extra header\n2026-10-27T12:43:59.7157790Z [command]/usr/bin/git config --local --name-only --get-regexp http\\.https\\:\\/\\/github\\.com\\/\\.extraheader\n2026-10-27T12:43:59.7192137Z [command]/usr/bin/git submodule foreach --recursive sh -c \"git config --local --name-only --get-regexp 'http\\.https\\:\\/\\/github\\.com\\/\\.extraheader' && git config --local --unset-all 'http.https://github.com/.extraheader' || :\"\n2026-10-27T12:43:59.7516762Z Removing includeIf entries pointing to credentials config files\n2026-10-27T12:43:59.7521025Z [command]/usr/bin/git config --local --name-only --get-regexp ^includeIf\\.gitdir:\n2026-10-27T12:43:59.7575381Z includeif.gitdir:/home/runner/work/integer-mult-bounds/integer-mult-bounds/.git.path\n2026-10-27T12:43:59.7576577Z includeif.gitdir:/home/runner/work/integer-mult-bounds/integer-mult-bounds/.git/worktrees/*.path\n2026-10-27T12:43:59.7577496Z includeif.gitdir:/github/workspace/.git.path\n2026-10-27T12:43:59.7578088Z includeif.gitdir:/github/workspace/.git/worktrees/*.path\n2026-10-27T12:43:59.7584283Z [command]/usr/bin/git config --local --get-all includeif.gitdir:/home/runner/work/integer-mult-bounds/integer-mult-bounds/.git.path\n2026-10-27T12:43:59.7607055Z /home/runner/work/_temp/git-credentials-79faf164-9762-4e67-8ef7-5995b77b3024.config\n2026-10-27T12:43:59.7617838Z [command]/usr/bin/git config --local --unset includeif.gitdir:/home/runner/work/integer-mult-bounds/integer-mult-bounds/.git.path \\/home\\/runner\\/work\\/_temp\\/git\\-credentials\\-79faf164\\-9762\\-4e67\\-8ef7\\-5995b77b3024\\.config\n2026-10-27T12:43:59.7651372Z [command]/usr/bin/git config --local --get-all includeif.gitdir:/home/runner/work/integer-mult-bounds/integer-mult-bounds/.git/worktrees/*.path\n2026-10-27T12:43:59.7673222Z /home/runner/work/_temp/git-credentials-79faf164-9762-4e67-8ef7-5995b77b3024.config\n2026-10-27T12:43:59.7685580Z [command]/usr/bin/git config --local --unset includeif.gitdir:/home/runner/work/integer-mult-bounds/integer-mult-bounds/.git/worktrees/*.path \\/home\\/runner\\/work\\/_temp\\/git\\-credentials\\-79faf164\\-9762\\-4e67\\-8ef7\\-5995b77b3024\\.config\n2026-10-27T12:43:59.7716455Z [command]/usr/bin/git config --local --get-all includeif.gitdir:/github/workspace/.git.path\n2026-10-27T12:43:59.7743342Z /github/runner_temp/git-credentials-79faf164-9762-4e67-8ef7-5995b77b3024.config\n2026-10-27T12:43:59.7749251Z [command]/usr/bin/git config --local --unset includeif.gitdir:/github/workspace/.git.path \\/github\\/runner_temp\\/git\\-credentials\\-79faf164\\-9762\\-4e67\\-8ef7\\-5995b77b3024\\.config\n2026-10-27T12:43:59.7781702Z [command]/usr/bin/git config --local --get-all includeif.gitdir:/github/workspace/.git/worktrees/*.path\n2026-10-27T12:43:59.7803955Z /github/runner_temp/git-credentials-79faf164-9762-4e67-8ef7-5995b77b3024.config\n2026-10-27T12:43:59.7811837Z [command]/usr/bin/git config --local --unset includeif.gitdir:/github/workspace/.git/worktrees/*.path \\/github\\/runner_temp\\/git\\-credentials\\-79faf164\\-9762\\-4e67\\-8ef7\\-5995b77b3024\\.config\n2026-10-27T12:43:59.7842209Z [command]/usr/bin/git submodule foreach --recursive git config --local --show-origin --name-only --get-regexp remote.origin.url\n2026-10-27T12:43:59.8161843Z Removing credentials config '/home/runner/work/_temp/git-credentials-79faf164-9762-4e67-8ef7-5995b77b3024.config'\n2026-10-27T12:43:59.8173115Z ##[endgroup]\n2026-10-27T12:43:59.8417724Z ##[group]Run actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97\n2026-10-27T12:43:59.8418141Z with:\n2026-10-27T12:43:59.8418343Z python-version: 3.12\n2026-10-27T12:43:59.8418567Z check-latest: false\n2026-10-27T12:43:59.8421364Z token: ***\n2026-10-27T12:43:59.8421604Z update-environment: true\n2026-10-27T12:43:59.8421858Z allow-prereleases: false\n2026-10-27T12:43:59.8422099Z freethreaded: false\n2026-10-27T12:43:59.8422308Z env:\n2026-10-27T12:43:59.8422506Z PYTHONDONTWRITEBYTECODE: 1\n2026-10-27T12:43:59.8422810Z RESEARCH_PACKAGE: research/c-verification-feasibility\n2026-10-27T12:43:59.8423126Z ##[endgroup]\n2026-10-27T12:43:59.9608635Z ##[group]Installed versions\n2026-10-27T12:43:59.9699134Z Successfully set up CPython (3.12.15)\n2026-10-27T12:43:59.9700056Z ##[endgroup]\n2026-10-27T12:43:59.9815848Z ##[group]Run python -B scripts/research_package.py --package \"$RESEARCH_PACKAGE\" --install-deps\n2026-10-27T12:43:59.9816626Z \u001b[36;1mpython -B scripts/research_package.py --package \"$RESEARCH_PACKAGE\" --install-deps\u001b[0m\n2026-10-27T12:44:00.0148786Z shell: /usr/bin/bash -e {0}\n2026-10-27T12:44:00.0149065Z env:\n2026-10-27T12:44:00.0149287Z PYTHONDONTWRITEBYTECODE: 1\n2026-10-27T12:44:00.0149965Z RESEARCH_PACKAGE: research/c-verification-feasibility\n2026-10-27T12:44:00.0150398Z pythonLocation: /opt/hostedtoolcache/Python/3.12.15/x64\n2026-10-27T12:44:00.0150868Z PKG_CONFIG_PATH: /opt/hostedtoolcache/Python/3.12.15/x64/lib/pkgconfig\n2026-10-27T12:44:00.0151327Z Python_ROOT_DIR: /opt/hostedtoolcache/Python/3.12.15/x64\n2026-10-27T12:44:00.0151721Z Python2_ROOT_DIR: /opt/hostedtoolcache/Python/3.12.15/x64\n2026-10-27T12:44:00.0152118Z Python3_ROOT_DIR: /opt/hostedtoolcache/Python/3.12.15/x64\n2026-10-27T12:44:00.0152544Z LD_LIBRARY_PATH: /opt/hostedtoolcache/Python/3.12.15/x64/lib\n2026-10-27T12:44:00.0152876Z ##[endgroup]\n2026-10-27T12:44:01.1605765Z CHECK Fresh scoped baseline controls; existing compiler and CPython3.12 headers required; no install or full performance replay.\n2026-10-27T12:44:05.8364463Z PASS_PRECISION_LINUX_SOURCE_CONTROLS {\"contract\": \"declared contract edits\", \"declared_edit\": \"unique backend seam\", \"inner_archive\": \"source hash\", \"official_export_byte\": \"Exact PR5831 bundle\"}\n2026-10-27T12:44:05.8371239Z {\"all_complete_values_and_types_equal\": true, \"cases\": 241, \"controls\": [\"returned-mutation-isolated\", \"source-drift\", \"Fraction-type-drift\", \"module-byte-drift\", \"live-code-drift\", \"nested-live-code-drift\", \"omitted-witness\", \"omitted-rounded-sites\", \"wrong-coefficient\", \"wrong-weighted-increment\", \"bad-role\", \"bad-scalar\", \"missing-weight\", \"restore-success\", \"restore-exception\", \"fresh-derivation\", \"key-field-0\", \"key-field-1\", \"key-field-2\", \"key-field-3\", \"key-field-4\", \"FIFO-eviction\", \"canonical-key\", \"hash-collision\", \"disabled\", \"invalid-capacity--1\", \"invalid-capacity-16385\", \"invalid-capacity-True\", \"invalid-capacity-1.5\", \"uncached-exception-0\", \"uncached-exception-1\", \"fresh-call-table\", \"stats-mutation\", \"failed-call-clears-stats\"], \"events\": 10164, \"status\": \"PASS_FINITE_FRACTION_TABLE_FEASIBILITY\"}\n2026-10-27T12:44:05.8388010Z {\"all_coverage_preserved\": true, \"inherited\": {\"all_complete_values_and_types_equal\": true, \"cases\": 241, \"controls\": [\"returned-mutation-isolated\", \"source-drift\", \"Fraction-type-drift\", \"module-byte-drift\", \"live-code-drift\", \"nested-live-code-drift\", \"omitted-witness\", \"omitted-rounded-sites\", \"wrong-coefficient\", \"wrong-weighted-increment\", \"bad-role\", \"bad-scalar\", \"missing-weight\", \"restore-success\", \"restore-exception\", \"fresh-derivation\", \"key-field-0\", \"key-field-1\", \"key-field-2\", \"key-field-3\", \"key-field-4\", \"FIFO-eviction\", \"canonical-key\", \"hash-collision\", \"disabled\", \"invalid-capacity--1\", \"invalid-capacity-16385\", \"invalid-capacity-True\", \"invalid-capacity-1.5\", \"uncached-exception-0\", \"uncached-exception-1\", \"fresh-call-table\", \"stats-mutation\", \"failed-call-clears-stats\"], \"events\": 10164, \"status\": \"PASS_FINITE_FRACTION_TABLE_FEASIBILITY\"}, \"new_control_count\": 20, \"new_controls\": [\"all-241-fixtures-take-certified-domain\", \"subtypes-and-foreign-types-fall-back-without-custom-methods\", \"metaclass-container\", \"metaclass-scalar\", \"original-fallback-dict-subclass\", \"original-fallback-program-subclass\", \"original-fallback-event-subclass\", \"original-fallback-weights-subclass\", \"original-fallback-row-subclass\", \"original-fallback-rounded-subclass\", \"original-fallback-Fraction-subclass\", \"original-fallback-integer-weights\", \"original-fallback-boolean-public\", \"exact-internal-type-preservation-at-certified-updates\", \"malformed-outcome-missing-weight\", \"malformed-outcome-bad-role\", \"malformed-outcome-bad-scalar\", \"malformed-outcome-short-event\", \"recertification-invalidates-certified-method\", \"disabled-capacity-not-certified\"], \"status\": \"PASS_TYPE_GATE_FINITE_FEASIBILITY\"}\n2026-10-27T12:44:05.8414728Z {\"all_coverage_preserved\": true, \"inherited\": {\"all_coverage_preserved\": true, \"inherited\": {\"all_complete_values_and_types_equal\": true, \"cases\": 241, \"controls\": [\"returned-mutation-isolated\", \"source-drift\", \"Fraction-type-drift\", \"module-byte-drift\", \"live-code-drift\", \"nested-live-code-drift\", \"omitted-witness\", \"omitted-rounded-sites\", \"wrong-coefficient\", \"wrong-weighted-increment\", \"bad-role\", \"bad-scalar\", \"missing-weight\", \"restore-success\", \"restore-exception\", \"fresh-derivation\", \"key-field-0\", \"key-field-1\", \"key-field-2\", \"key-field-3\", \"key-field-4\", \"FIFO-eviction\", \"canonical-key\", \"hash-collision\", \"disabled\", \"invalid-capacity--1\", \"invalid-capacity-16385\", \"invalid-capacity-True\", \"invalid-capacity-1.5\", \"uncached-exception-0\", \"uncached-exception-1\", \"fresh-call-table\", \"stats-mutation\", \"failed-call-clears-stats\"], \"events\": 10164, \"status\": \"PASS_FINITE_FRACTION_TABLE_FEASIBILITY\"}, \"new_control_count\": 20, \"new_controls\": [\"all-241-fixtures-take-certified-domain\", \"subtypes-and-foreign-types-fall-back-without-custom-methods\", \"metaclass-container\", \"metaclass-scalar\", \"original-fallback-dict-subclass\", \"original-fallback-program-subclass\", \"original-fallback-event-subclass\", \"original-fallback-weights-subclass\", \"original-fallback-row-subclass\", \"original-fallback-rounded-subclass\", \"original-fallback-Fraction-subclass\", \"original-fallback-integer-weights\", \"original-fallback-boolean-public\", \"exact-internal-type-preservation-at-certified-updates\", \"malformed-outcome-missing-weight\", \"malformed-outcome-bad-role\", \"malformed-outcome-bad-scalar\", \"malformed-outcome-short-event\", \"recertification-invalidates-certified-method\", \"disabled-capacity-not-certified\"], \"status\": \"PASS_TYPE_GATE_FINITE_FEASIBILITY\"}, \"new_control_count\": 9, \"new_controls\": [\"canonical-full-pair-tokens\", \"weight-token-hash-collision\", \"bounded-context-overflow\", \"event-q-canonical-equality-and-FIFO-counters\", \"six-complete-trace-counter-and-type-comparisons\", \"source-site-weight-ownership\", \"wrong-token-alias-detected\", \"overflow-fallback-preserves-original\", \"fresh-token-and-cache-lifetimes\"], \"status\": \"PASS_COMPACT_KEY_FINITE_ONLY\"}\n2026-10-27T12:44:05.8446546Z {\"all_coverage_preserved\": true, \"inherited\": {\"all_coverage_preserved\": true, \"inherited\": {\"all_coverage_preserved\": true, \"inherited\": {\"all_complete_values_and_types_equal\": true, \"cases\": 241, \"controls\": [\"returned-mutation-isolated\", \"source-drift\", \"Fraction-type-drift\", \"module-byte-drift\", \"live-code-drift\", \"nested-live-code-drift\", \"omitted-witness\", \"omitted-rounded-sites\", \"wrong-coefficient\", \"wrong-weighted-increment\", \"bad-role\", \"bad-scalar\", \"missing-weight\", \"restore-success\", \"restore-exception\", \"fresh-derivation\", \"key-field-0\", \"key-field-1\", \"key-field-2\", \"key-field-3\", \"key-field-4\", \"FIFO-eviction\", \"canonical-key\", \"hash-collision\", \"disabled\", \"invalid-capacity--1\", \"invalid-capacity-16385\", \"invalid-capacity-True\", \"invalid-capacity-1.5\", \"uncached-exception-0\", \"uncached-exception-1\", \"fresh-call-table\", \"stats-mutation\", \"failed-call-clears-stats\"], \"events\": 10164, \"status\": \"PASS_FINITE_FRACTION_TABLE_FEASIBILITY\"}, \"new_control_count\": 20, \"new_controls\": [\"all-241-fixtures-take-certified-domain\", \"subtypes-and-foreign-types-fall-back-without-custom-methods\", \"metaclass-container\", \"metaclass-scalar\", \"original-fallback-dict-subclass\", \"original-fallback-program-subclass\", \"original-fallback-event-subclass\", \"original-fallback-weights-subclass\", \"original-fallback-row-subclass\", \"original-fallback-rounded-subclass\", \"original-fallback-Fraction-subclass\", \"original-fallback-integer-weights\", \"original-fallback-boolean-public\", \"exact-internal-type-preservation-at-certified-updates\", \"malformed-outcome-missing-weight\", \"malformed-outcome-bad-role\", \"malformed-outcome-bad-scalar\", \"malformed-outcome-short-event\", \"recertification-invalidates-certified-method\", \"disabled-capacity-not-certified\"], \"status\": \"PASS_TYPE_GATE_FINITE_FEASIBILITY\"}, \"new_control_count\": 9, \"new_controls\": [\"canonical-full-pair-tokens\", \"weight-token-hash-collision\", \"bounded-context-overflow\", \"event-q-canonical-equality-and-FIFO-counters\", \"six-complete-trace-counter-and-type-comparisons\", \"source-site-weight-ownership\", \"wrong-token-alias-detected\", \"overflow-fallback-preserves-original\", \"fresh-token-and-cache-lifetimes\"], \"status\": \"PASS_COMPACT_KEY_FINITE_ONLY\"}, \"new_control_count\": 10, \"new_controls\": [\"changed-getter-invalidates\", \"changed-live-getter-code\", \"foreign-slot-probe-is-pure\", \"changed-attribute-lookup\", \"missing-attribute-handler-presence\", \"binding-restored\", \"slot-path-selected\", \"post-derive-getter-drift-literal-fallback\", \"uninitialized-unused-weight-fallback\", \"foreign-slot-value-fallback\"], \"status\": \"PASS_SLOT_KEY_FINITE_ONLY\"}\n2026-10-27T12:44:05.8672882Z {\"all_coverage_preserved\": true, \"build\": {\"SOABI\": \"cpython-312-x86_64-linux-gnu\", \"binary_sha256\": \"55f89ebfc93d0afaa09e958b76399aaf130fa8060ebcde2be8d3f2c33b978760\", \"cold_build_load_wall_seconds\": 1.6129818549999868, \"compiler\": \"/usr/bin/cc\", \"compiler_cpu_accounting\": \"outer GNU time user+system includes compiler children\", \"compiler_version\": \"cc (Ubuntu 13.3.0-6ubuntu2~24.04.1) 13.3.0\", \"extension_suffix\": \".cpython-312-x86_64-linux-gnu.so\", \"flags\": [\"-O2\", \"-shared\", \"-fPIC\", \"-std=c11\", \"-Wall\", \"-Werror\", \"-I/opt/hostedtoolcache/Python/3.12.15/x64/include/python3.12\"], \"python\": \"3.12.15 (main, Oct 1 2026, 02:35:59) [GCC 13.3.0]\", \"source_sha256\": \"78ed2e240ee40ce4989a4718e77e8b3967b092d2bf8c900124a26942c98a14cb\"}, \"inherited\": {\"all_coverage_preserved\": true, \"inherited\": {\"all_coverage_preserved\": true, \"inherited\": {\"all_coverage_preserved\": true, \"inherited\": {\"all_complete_values_and_types_equal\": true, \"cases\": 241, \"controls\": [\"returned-mutation-isolated\", \"source-drift\", \"Fraction-type-drift\", \"module-byte-drift\", \"live-code-drift\", \"nested-live-code-drift\", \"omitted-witness\", \"omitted-rounded-sites\", \"wrong-coefficient\", \"wrong-weighted-increment\", \"bad-role\", \"bad-scalar\", \"missing-weight\", \"restore-success\", \"restore-exception\", \"fresh-derivation\", \"key-field-0\", \"key-field-1\", \"key-field-2\", \"key-field-3\", \"key-field-4\", \"FIFO-eviction\", \"canonical-key\", \"hash-collision\", \"disabled\", \"invalid-capacity--1\", \"invalid-capacity-16385\", \"invalid-capacity-True\", \"invalid-capacity-1.5\", \"uncached-exception-0\", \"uncached-exception-1\", \"fresh-call-table\", \"stats-mutation\", \"failed-call-clears-stats\"], \"events\": 10164, \"status\": \"PASS_FINITE_FRACTION_TABLE_FEASIBILITY\"}, \"new_control_count\": 20, \"new_controls\": [\"all-241-fixtures-take-certified-domain\", \"subtypes-and-foreign-types-fall-back-without-custom-methods\", \"metaclass-container\", \"metaclass-scalar\", \"original-fallback-dict-subclass\", \"original-fallback-program-subclass\", \"original-fallback-event-subclass\", \"original-fallback-weights-subclass\", \"original-fallback-row-subclass\", \"original-fallback-rounded-subclass\", \"original-fallback-Fraction-subclass\", \"original-fallback-integer-weights\", \"original-fallback-boolean-public\", \"exact-internal-type-preservation-at-certified-updates\", \"malformed-outcome-missing-weight\", \"malformed-outcome-bad-role\", \"malformed-outcome-bad-scalar\", \"malformed-outcome-short-event\", \"recertification-invalidates-certified-method\", \"disabled-capacity-not-certified\"], \"status\": \"PASS_TYPE_GATE_FINITE_FEASIBILITY\"}, \"new_control_count\": 9, \"new_controls\": [\"canonical-full-pair-tokens\", \"weight-token-hash-collision\", \"bounded-context-overflow\", \"event-q-canonical-equality-and-FIFO-counters\", \"six-complete-trace-counter-and-type-comparisons\", \"source-site-weight-ownership\", \"wrong-token-alias-detected\", \"overflow-fallback-preserves-original\", \"fresh-token-and-cache-lifetimes\"], \"status\": \"PASS_COMPACT_KEY_FINITE_ONLY\"}, \"new_control_count\": 10, \"new_controls\": [\"changed-getter-invalidates\", \"changed-live-getter-code\", \"foreign-slot-probe-is-pure\", \"changed-attribute-lookup\", \"missing-attribute-handler-presence\", \"binding-restored\", \"slot-path-selected\", \"post-derive-getter-drift-literal-fallback\", \"uninitialized-unused-weight-fallback\", \"foreign-slot-value-fallback\"], \"status\": \"PASS_SLOT_KEY_FINITE_ONLY\"}, \"native_control_count\": 45, \"native_controls\": [\"canonical-keys-FIFO-wrap-counters\", \"native-hash-collision\", \"exact-one-callback-per-miss\", \"uncached-native-error-0\", \"uncached-native-error-1\", \"full-cache-failure-before-eviction\", \"cache-survives-callback-exception\", \"capacity-0\", \"capacity--1\", \"capacity-16385\", \"capacity-True\", \"capacity-1.5\", \"capacity-10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"index--1\", \"index-3\", \"index-10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"index-True\", \"index-0\", \"arity\", \"keywords\", \"exact-operand\", \"exact-scalar\", \"event-creation\", \"descriptor-protocol\", \"token-length\", \"token-range\", \"partial-init-length\", \"partial-init-weight\", \"callback-result-shape\", \"callback-result-type\", \"callback-reentry\", \"event-owns-parent\", \"GC-callback-cycle\", \"native-statistics-isolated\", \"native-coefficient-loop\", \"same-row-lowlevel-rejection\", \"dict-iterator-mutation-safe\", \"callback-list-mutation-safe\", \"native-source-authenticated\", \"callback-descriptor-is-pure\", \"plain-callback-rejected\", \"live-callback-code-drift\", \"owned-metadata-snapshot\", \"same-row-source-fallback\", \"malformed-scalar-literal-fallback\"], \"status\": \"PASS_NATIVE_FINITE_ONLY\"}\n2026-10-27T12:44:05.8700941Z PASS_FRACTION_NATIVE_FINITE_AND_CUSTODY\n2026-10-27T12:44:05.8701454Z PASS_C_VERIFICATION_SCOPED_FINITE baseline\n2026-10-27T12:44:05.8929805Z CHECK Fresh scoped integer controls; existing compiler and CPython3.12 headers required; no install or full performance replay.\n2026-10-27T12:44:06.5892935Z {\"build\": {\"SOABI\": \"cpython-312-x86_64-linux-gnu\", \"binary_sha256\": \"988bc68fc779d2098f31521cc526d84690729195c0fed52d8e7d748aa0911cf6\", \"cold_build_load_wall_seconds\": 0.30884723100000144, \"compiler\": \"/usr/bin/cc\", \"compiler_cpu_accounting\": \"parent outer process must include compiler children\", \"extension_suffix\": \".cpython-312-x86_64-linux-gnu.so\", \"flags\": [\"-O2\", \"-shared\", \"-fPIC\", \"-std=c11\", \"-Wall\", \"-Werror\", \"-I/opt/hostedtoolcache/Python/3.12.15/x64/include/python3.12\"], \"python\": \"3.12.15 (main, Oct 1 2026, 02:35:59) [GCC 13.3.0]\", \"source_sha256\": \"804cc25bd9ad0912de81fe97bc65b95ebcb0dec06453739e1d4863e7946c4f3d\"}, \"result\": {\"checks\": [\"eight-row-and-score-differentials\", \"aliased-inputs-return-fresh-outputs\", \"six-ordered-prefixes-and-complete-bytes\", \"zero-negative-large-reduced-and-ordered-formatting\", \"score-string-contract-distinct-from-coefficient-contract\", \"reverse-scores-signed-bytes-and-aliases\", \"bool-numerator\", \"foreign-int-value\", \"foreign-dict\", \"foreign-key\", \"float-value\", \"negative-exponent\", \"bool-exponent\", \"inexact-division-transaction\", \"inexact-scaled-row\", \"nondyadic-scale\", \"zero-scale\", \"negative-scale\", \"bool-scale\", \"short-score\", \"foreign-scores\", \"foreign-weight\", \"weight-index-range\", \"negative-weight-index\", \"reverse-index-range\", \"score-nondyadic-unit\", \"event-type\"], \"independent_fraction_formatting\": true, \"ordered_prefixes\": 6, \"row_cases\": 8, \"status\": \"PASS_FINITE_INTEGER_FORMAT\", \"timing_claim\": false, \"whole_replay\": false}}\n2026-10-27T12:44:06.5898528Z PASS_C_VERIFICATION_SCOPED_FINITE integer\n2026-10-27T12:44:06.6088088Z CHECK Fresh scoped integer controls; existing compiler and CPython3.12 headers required; no install or full performance replay.\n2026-10-27T12:44:07.2668430Z {\"build\": {\"SOABI\": \"cpython-312-x86_64-linux-gnu\", \"binary_sha256\": \"8bf32a3419ad77e38073a619bf4ee6e141629212f280e8925222cfc5d6dc9d22\", \"cold_build_load_wall_seconds\": 0.3058329930000099, \"compiler\": \"/usr/bin/cc\", \"compiler_cpu_accounting\": \"parent outer process must include compiler children\", \"extension_suffix\": \".cpython-312-x86_64-linux-gnu.so\", \"flags\": [\"-O2\", \"-shared\", \"-fPIC\", \"-std=c11\", \"-Wall\", \"-Werror\", \"-I/opt/hostedtoolcache/Python/3.12.15/x64/include/python3.12\"], \"python\": \"3.12.15 (main, Oct 1 2026, 02:35:59) [GCC 13.3.0]\", \"source_sha256\": \"804cc25bd9ad0912de81fe97bc65b95ebcb0dec06453739e1d4863e7946c4f3d\"}, \"result\": {\"checks\": [\"eight-row-and-score-differentials\", \"aliased-inputs-return-fresh-outputs\", \"six-ordered-prefixes-and-complete-bytes\", \"zero-negative-large-reduced-and-ordered-formatting\", \"score-string-contract-distinct-from-coefficient-contract\", \"reverse-scores-signed-bytes-and-aliases\", \"bool-numerator\", \"foreign-int-value\", \"foreign-dict\", \"foreign-key\", \"float-value\", \"negative-exponent\", \"bool-exponent\", \"inexact-division-transaction\", \"inexact-scaled-row\", \"nondyadic-scale\", \"zero-scale\", \"negative-scale\", \"bool-scale\", \"short-score\", \"foreign-scores\", \"foreign-weight\", \"weight-index-range\", \"negative-weight-index\", \"reverse-index-range\", \"score-nondyadic-unit\", \"event-type\"], \"independent_fraction_formatting\": true, \"ordered_prefixes\": 6, \"row_cases\": 8, \"status\": \"PASS_FINITE_INTEGER_FORMAT\", \"timing_claim\": false, \"whole_replay\": false}}\n2026-10-27T12:44:07.2674341Z PASS_C_VERIFICATION_SCOPED_FINITE integer\n2026-10-27T12:44:07.3248933Z CHECK Fresh scoped rational controls; existing compiler and CPython3.12 headers required; no install or full performance replay.\n2026-10-27T12:44:08.1374545Z Traceback (most recent call last):\n2026-10-27T12:44:08.1384403Z File \"/home/runner/work/integer-mult-bounds/integer-mult-bounds/research/c-verification-feasibility/verify.py\", line 29, in \n2026-10-27T12:44:08.1385505Z main(stage / 'package', micro=False)\n2026-10-27T12:44:08.1386334Z File \"/tmp/c-verification-screen-ecny7nc1/stages/rational-v2/finite_probe.py\", line 52, in main\n2026-10-27T12:44:08.1387662Z File \"/tmp/c-verification-screen-ecny7nc1/stages/rational-v2/finite_probe.py\", line 19, in need\n2026-10-27T12:44:08.1388892Z ValueError: supported pinned arithmetic binder\n2026-10-27T12:44:08.1912759Z verification command exited 1\n2026-10-27T12:44:08.2045106Z ##[error]Process completed with exit code 1.\n2026-10-27T12:44:08.2201792Z Post job cleanup.\n2026-10-27T12:44:08.3065211Z [command]/usr/bin/git version\n2026-10-27T12:44:08.3102997Z git version 2.55.0\n2026-10-27T12:44:08.3139830Z Temporarily overriding HOME='/home/runner/work/_temp/a27ac0bf-4038-43c0-8e02-4eba58e0fb77' before making global git config changes\n2026-10-27T12:44:08.3141259Z Adding repository directory to the temporary git global config as a safe directory\n2026-10-27T12:44:08.3146167Z [command]/usr/bin/git config --global --add safe.directory /home/runner/work/integer-mult-bounds/integer-mult-bounds\n2026-10-27T12:44:08.3177623Z Removing SSH command configuration\n2026-10-27T12:44:08.3183842Z [command]/usr/bin/git config --local --name-only --get-regexp core\\.sshCommand\n2026-10-27T12:44:08.3216004Z [command]/usr/bin/git submodule foreach --recursive sh -c \"git config --local --name-only --get-regexp 'core\\.sshCommand' && git config --local --unset-all 'core.sshCommand' || :\"\n2026-10-27T12:44:08.3551951Z Removing HTTP extra header\n2026-10-27T12:44:08.3557716Z [command]/usr/bin/git config --local --name-only --get-regexp http\\.https\\:\\/\\/github\\.com\\/\\.extraheader\n2026-10-27T12:44:08.3598035Z [command]/usr/bin/git submodule foreach --recursive sh -c \"git config --local --name-only --get-regexp 'http\\.https\\:\\/\\/github\\.com\\/\\.extraheader' && git config --local --unset-all 'http.https://github.com/.extraheader' || :\"\n2026-10-27T12:44:08.3953411Z Removing includeIf entries pointing to credentials config files\n2026-10-27T12:44:08.3960907Z [command]/usr/bin/git config --local --name-only --get-regexp ^includeIf\\.gitdir:\n2026-10-27T12:44:08.3998341Z [command]/usr/bin/git submodule foreach --recursive git config --local --show-origin --name-only --get-regexp remote.origin.url\n2026-10-27T12:44:08.4499281Z Cleaning up orphan processes\n","logTruncated":false} diff --git a/research/c-verification-feasibility/evidence/publication/CI-PORTABILITY-CORRECTION.json b/research/c-verification-feasibility/evidence/publication/CI-PORTABILITY-CORRECTION.json new file mode 100644 index 0000000000..5677b2976d --- /dev/null +++ b/research/c-verification-feasibility/evidence/publication/CI-PORTABILITY-CORRECTION.json @@ -0,0 +1,14 @@ +{ + "status": "DOCUMENTED_CI_PORTABILITY_CORRECTION", + "failed_head": "ec0afa7633ff72e1c5ea26bb5726ec569a3f59ac", + "failed_run": 40505352497, + "hosted_python": "3.12.15", + "failure": "strict full-file fractions.py source hash rejected hosted release before native rational selection", + "known_local_sha256": "cf33568f7b767f66896995a7a81cc662e8be226f2e58efb61d2028f64eb5d231", + "official_3_12_15_sha256": "d52d1ab9d5be26924e4914a5e40069c992bbfa68f773694c2e5ee8452d0766a0", + "official_source": "https://raw.githubusercontent.com/python/cpython/v3.12.15/Lib/fractions.py", + "reviewed_difference": "One hunk in Fraction.__pow__: only float/complex exponents use float fallback; foreign types return NotImplemented. Outside the C score-batching guarded DIRECT/WRAPPED/factory set.", + "repair": "Explicit two-hash allowlist; exact live code/default/closure/MRO/descriptors/global arithmetic checks retained. Check source even when expected-code cache populated. Added unknown-source rejection control.", + "performance": "All original samples and failed gates retained; no timing or numerical actual-word reroll.", + "diagnostic_precision": "The first binder swallowed its failure reason; official/local source incompatibility is independently verified. Hosted actual hash is emitted by the corrected replay and further gates must still pass." +} diff --git a/research/c-verification-feasibility/evidence/publication/astra-ci-binding-review.md b/research/c-verification-feasibility/evidence/publication/astra-ci-binding-review.md new file mode 100644 index 0000000000..fc9ceb1068 --- /dev/null +++ b/research/c-verification-feasibility/evidence/publication/astra-ci-binding-review.md @@ -0,0 +1,182 @@ +# PR5908 rational binder: static CPython 3.12.15 compatibility review + +**Finding: the shipped whole-file source pin rejects the fetched official +CPython 3.12.15 `fractions.py`, although its only difference from the accepted +local file is an unrelated `Fraction.__pow__` branch. Add only an explicitly +reviewed source/runtime identity; preserve all executable, slot, closure, +default, MRO, operator and gcd checks.** + +The requested failing head is `ec0afa7633ff72e1c5ea26bb5726ec569a3f59ac`, +CI run `40505352497`. The parent reports the original registered verifier and +integer normal/optimized stages passed, with the rational probe failing at +`finite_probe.py:52` because `arithmetic_binding.bind()` returned None. +This review did not fetch CI, execute Python, import scientific modules, +compile code, run tests, perform arithmetic, use the network/browser, mutate +Git, or edit measured/published source. It read local source, compared bytes, +and wrote only this review document. + +## Exact source difference + +Inspected binding: +`repo/research/c-verification-feasibility/rational/arithmetic_binding.py`. + +| Source | Observed SHA256 | +| --- | --- | +| Accepted local `/usr/lib/python3.12/fractions.py` | `cf33568f7b767f66896995a7a81cc662e8be226f2e58efb61d2028f64eb5d231` | +| Parent-fetched `ci-python/fractions-3.12.15.py` | `d52d1ab9d5be26924e4914a5e40069c992bbfa68f773694c2e5ee8452d0766a0` | + +The second file was supplied by the parent as the official CPython v3.12.15 +source. This reviewer verified its local hash and complete textual diff, not +its network provenance. Retain the parent's source URL/fetch receipt when +adding the new pin. Expected upstream provenance is the CPython v3.12.15 +`Lib/fractions.py` source, with exact tag/URL retained by the parent. + +The complete unified diff has one hunk, around local line 828: + +```diff +- else: ++ elif isinstance(b, (float, complex)): + return float(a) ** b ++ else: ++ return NotImplemented +``` + +This is in `Fraction.__pow__`. The guarded batching methods `_add`, `_sub`, +`_mul`, `__abs__`, `__bool__`, `__new__`, `_from_coprime_ints` and the +`_operator_fallbacks` forward/reverse closures have unchanged text. The +Fraction base-class declaration, owned slots and constructor defaults are +also unchanged. The edit shifts later source line numbers, including +`__abs__` and `__bool__`, by two lines. + +## Why the current guard rejects it + +`SOURCE_SHA256` at arithmetic_binding.py line 18 contains only the accepted +local hash. `_codes()` at line 37 rejects any other full-file digest with +`ValueError('pinned Fraction source')`. `bind()` catches that ValueError and +returns None. `finite_probe.py:52` therefore reports only the generic +'supported pinned arithmetic binder' failure. + +The first `DIRECT` method is `_add`. Once preceding runtime/slot checks pass, +its `_function()` comparison invokes `_codes()` and encounters this rejection. +Thus the official 3.12.15 source cannot pass the shipped binder, regardless of +whether its selected methods would otherwise pass every executable check. +This is a definite source-compatibility defect. The original hosted traceback +did not expose its actual stdlib path/hash or the swallowed reason, so this +review cannot prove that no later runtime condition would also fail after the +pin repair. The next fresh hosted run or a narrow diagnostic must show that. + +## Why the other guards should remain unchanged + +- **Slot binder:** `slot_binding.bind(strict=True)` authenticates pure getter + executable shapes and exact owned member descriptors. It does not use the + new rational whole-file hash. The inherited verifier passing is consistent + with that separate contract. The fetched diff changes neither getter. +- **MRO:** both files declare `Fraction(numbers.Rational)`. No difference in + the source suggests relaxing the exact `(Fraction, Rational, Real, Complex, + Number, object)` identity chain. Hosted identities still need live checking. +- **Defaults:** `__new__(cls, numerator=0, denominator=None)` is unchanged. + The two exact defaults and all no-default/no-kwdefault requirements remain. +- **Closures:** `_operator_fallbacks` and its forward/reverse bodies are + unchanged. Preserve the exact two closure cells and identities of + `fallback_operator` and `monomorphic_operator`, plus allowed `__class__` + closures for direct/factory functions. +- **Gcd/operator identities:** those are live module/builtin identities, not + the changed `__pow__` branch. No evidence supports weakening them. +- **Compiled code flags:** `_shape()` deliberately includes `co_flags` and + the exception table. `_codes()` recompiles the authenticated file on the + current interpreter with `optimize=sys.flags.optimize`. Preserve this + check. It does not compare `co_firstlineno`, line tables, or filenames, so + the two-line offset alone is not a reason to remove code-shape fields. +- **Future/compiler inheritance:** neither compared fractions source nor + the inspected arithmetic binder has a future import. There is no observed + future-flag mismatch. `dont_inherit=True` may make the compilation context + explicit if the parent chooses that small hardening, but it is not the + diagnosed source-pin fix and must not replace exact flag checking. +- **Materialization:** `_from_coprime_ints` remains a classmethod with the same + source and allowed class closure. Preserve its drift rejection. + +The fetched source therefore supplies no reason to accept unknown MROs, +foreign functions, alternate math/gcd implementations, arbitrary source +files, or masked bytecode differences. + +## Minimal pin-preserving repair + +Replace the single allowed source identity with an explicit reviewed mapping, +preferably recording both exact patch version and digest: + +```text +CPython 3.12.3 / observed Ubuntu host source: + cf33568f7b767f66896995a7a81cc662e8be226f2e58efb61d2028f64eb5d231 +CPython 3.12.15 / reviewed official tagged source: + d52d1ab9d5be26924e4914a5e40069c992bbfa68f773694c2e5ee8452d0766a0 +``` + +Keep the CPython implementation requirement, reject all unlisted runtime/source +pairs, reject source symlinks, and compile only the authenticated bytes. Keep +all current `_function`, `_snapshot`, `fresh` and strict slot-binding checks. +A version-to-exact-digest mapping is preferable to treating every 3.12 patch +release as tested. Never use a wildcard version/hash, automatically enroll +the installed digest, accept a digest on first use, substitute AST equivalence +for source authentication, or bypass a failed binder in the finite probe. + +This mapping makes a second reviewed input admissible; it does not change the +numerical algorithm or admit an unreviewed runtime. The source review must +record that the full difference is the separate power-dispatch change. The +fixed rational finite controls and all existing fallback/drift controls must +then run unchanged in fresh normal and optimized processes on the supported +hosts. The hosted exact-head run must pass before CI compatibility is claimed. +Retain the original failed head/run and its error as evidence. + +The binder's `_expected` cache is process-local expected code data, not an +arithmetic answer cache. If refactoring it for multiple supported identities, +key or annotate it with the authenticated version/digest/optimization identity +so an old cache cannot stand in for an independently selected source. Do not +silently reuse a cached successful source check in a negative-source test. +No complete performance claim is affected or newly established by this repair; +the primary 15% target remains unmet. + +## Narrow diagnostic proposal + +The existing fallback-compatible `bind()` can continue returning either a token +or None. Add an internal strict path which labels the same existing rejection +predicates, then let the diagnostic surface report that result without changing +the acceptance decision. For example, an internal source predicate can expose: + +```text +stage: source_identity +implementation: cpython +version: [3, 12, 15] +fractions_path: +actual_sha256: +supported_identities: +reason: unlisted runtime/source identity +``` + +A successful diagnostic should report the selected source identity and that +the existing executable/default/closure/slot/MRO checks completed. If a later +predicate fails, report a stable stage label such as `slot_binding`, `mro`, +`arithmetic_defaults`, `arithmetic_executable_shape`, `operator_closure`, +`gcd_identity`, or `inplace_protocol`, plus the exception class where relevant. +Do not catch every unexpected exception and call it an unsupported runtime; +retain the existing narrow exception boundary or expose unexpected errors. + +The probe should still fail when its token is None. It may include this +read-only diagnostic in that failure message; diagnostics must never turn +None into a successful token or skip the source/finite controls. The strict +path must be shared with normal binding so the diagnostic cannot drift into +a different acceptance rule. This needs no arithmetic experiment. + +Useful bounded additional source-guard controls are rejection of an unlisted +version/digest pair and rejection of bytes changed from either reviewed source, +while the known pair is selected explicitly. Test a pure authentication helper +or use isolated temporary fixtures with restored binder state; do not modify +the installed stdlib file. Preserve every current arithmetic-code, factory, +closure, gcd, in-place-operation and fallback rejection. + +## Status + +The static source incompatibility is identified and a narrow repair is +specified. Hosted live binding after repair remains unverified by this worker. +No evidence supports changing the integer result, loosening rational guards, +skipping a finite control, admitting a speedup, or starting another numerical +route. Only this report was written. diff --git a/research/c-verification-feasibility/evidence/publication/explicit-source-pairs-normal-O/receipt.json b/research/c-verification-feasibility/evidence/publication/explicit-source-pairs-normal-O/receipt.json new file mode 100644 index 0000000000..df5ee99b49 --- /dev/null +++ b/research/c-verification-feasibility/evidence/publication/explicit-source-pairs-normal-O/receipt.json @@ -0,0 +1,26 @@ +{ + "exit": 0, + "label": "feasibility-source-pairs-final", + "optimized": false, + "platform": "Linux-7.0.0-38-generic-x86_64-with-glibc2.39", + "python": "3.12.3 (main, Aug 31 2026, 10:18:26) [GCC 13.3.0]", + "runner_sha256": "7540f8cc4ae4d12ed86c844ef0837a74184d3ada653979608c295c09f200a751", + "runtime_policy_sha256": "ffba23e0e710564f3eee7aeb546200015cbb026b238515ee3f4fedd2b271385e", + "sampled_process_group_rss_bytes": 98885632, + "script": "stages/publication-feasibility-v3/run_rational.py", + "source_bytes_and_modes_unchanged": true, + "source_inventory_sha256": "eb23e51854d0a4aeb81fae2d07e70e2fc7d80fa3c1f9ada35c85dfbe7022fbd5", + "status": "PASS", + "stderr_bytes": 0, + "stderr_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stdout_bytes": 3525, + "stdout_sha256": "789d1925e59b2d4031169a0778ed563e2aae37db6d9df2ca5742d0aa55193f2f", + "termination": null, + "usage": { + "exit": 0, + "kernel_max_rss_kib": 48856, + "system_seconds": 0.16, + "user_seconds": 2.2 + }, + "wall_seconds": 2.4060761780128814 +} diff --git a/research/c-verification-feasibility/evidence/publication/explicit-source-pairs-normal-O/stderr.txt b/research/c-verification-feasibility/evidence/publication/explicit-source-pairs-normal-O/stderr.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/research/c-verification-feasibility/evidence/publication/explicit-source-pairs-normal-O/stdout.txt b/research/c-verification-feasibility/evidence/publication/explicit-source-pairs-normal-O/stdout.txt new file mode 100644 index 0000000000..43cef2950c --- /dev/null +++ b/research/c-verification-feasibility/evidence/publication/explicit-source-pairs-normal-O/stdout.txt @@ -0,0 +1,9 @@ +{"python": "3.12.3 (main, Aug 31 2026, 10:18:26) [GCC 13.3.0]", "runtime_fraction_source_sha256": "cf33568f7b767f66896995a7a81cc662e8be226f2e58efb61d2028f64eb5d231", "scope": "rational-source-pin-diagnostic"} +{"actual_word_run": false, "added_controls": ["165-general-rational-coefficient-prefixes", "batch-FIFO-and-full-counters", "exact-score-type", "score-subclass", "negative-score-denominator", "same-row", "nonbuiltin-gcd", "source-iterator-mutation", "score-list-mutation", "score-value-mutation", "callback-failure-publishes-completed-prefix", "arithmetic-code-drift", "inplace-protocol-drift", "materialization-source-drift", "gcd-drift", "operator-closure-drift", "13-complete-event-prefixes-with-nondyadic-weights-and-scalars", "noncanonical-weight-fallback", "changed-arithmetic-fallback"], "build": {"SOABI": "cpython-312-x86_64-linux-gnu", "binary_sha256": "d58a7789119cc04cda2e45c2a1f65e11295686e611a11b27b3c66b42aeb74d9a", "cold_build_load_wall_seconds": 0.5084090070158709, "compiler": "/usr/bin/cc", "compiler_cpu_accounting": "outer GNU time user+system includes compiler children", "compiler_version": "cc (Ubuntu 13.3.0-6ubuntu2~24.04.1) 13.3.0", "extension_suffix": ".cpython-312-x86_64-linux-gnu.so", "flags": ["-O2", "-shared", "-fPIC", "-std=c11", "-Wall", "-Werror", "-I/usr/include/python3.12"], "python": "3.12.3 (main, Aug 31 2026, 10:18:26) [GCC 13.3.0]", "source_sha256": "4a4949e36cff4ff2894dd1f9379b58a58346ec7c888903271d4b98bbe4cfc7ae"}, "comparisons": 178, "complete_performance": false, "control_count": 19, "independent_literal_oracle_used": true, "status": "PASS_BOUNDED_RATIONAL_PROTOTYPE_ONLY"} +PASS_ADDED_DESTRUCTOR_AND_UNKNOWN_SOURCE_BINDING_CONTROLS +PASS_C_VERIFICATION_SCOPED_FINITE rational +{"python": "3.12.3 (main, Aug 31 2026, 10:18:26) [GCC 13.3.0]", "runtime_fraction_source_sha256": "cf33568f7b767f66896995a7a81cc662e8be226f2e58efb61d2028f64eb5d231", "scope": "rational-source-pin-diagnostic"} +{"actual_word_run": false, "added_controls": ["165-general-rational-coefficient-prefixes", "batch-FIFO-and-full-counters", "exact-score-type", "score-subclass", "negative-score-denominator", "same-row", "nonbuiltin-gcd", "source-iterator-mutation", "score-list-mutation", "score-value-mutation", "callback-failure-publishes-completed-prefix", "arithmetic-code-drift", "inplace-protocol-drift", "materialization-source-drift", "gcd-drift", "operator-closure-drift", "13-complete-event-prefixes-with-nondyadic-weights-and-scalars", "noncanonical-weight-fallback", "changed-arithmetic-fallback"], "build": {"SOABI": "cpython-312-x86_64-linux-gnu", "binary_sha256": "8801785b85df072537310d317f7832efa6580c013baa45e11efcf867a7284464", "cold_build_load_wall_seconds": 0.48717045702505857, "compiler": "/usr/bin/cc", "compiler_cpu_accounting": "outer GNU time user+system includes compiler children", "compiler_version": "cc (Ubuntu 13.3.0-6ubuntu2~24.04.1) 13.3.0", "extension_suffix": ".cpython-312-x86_64-linux-gnu.so", "flags": ["-O2", "-shared", "-fPIC", "-std=c11", "-Wall", "-Werror", "-I/usr/include/python3.12"], "python": "3.12.3 (main, Aug 31 2026, 10:18:26) [GCC 13.3.0]", "source_sha256": "4a4949e36cff4ff2894dd1f9379b58a58346ec7c888903271d4b98bbe4cfc7ae"}, "comparisons": 178, "complete_performance": false, "control_count": 19, "independent_literal_oracle_used": true, "status": "PASS_BOUNDED_RATIONAL_PROTOTYPE_ONLY"} +PASS_ADDED_DESTRUCTOR_AND_UNKNOWN_SOURCE_BINDING_CONTROLS +PASS_C_VERIFICATION_SCOPED_FINITE rational +PASS_EXPLICIT_RUNTIME_SOURCE_PAIRS_NORMAL_OPTIMIZED diff --git a/research/c-verification-feasibility/evidence/publication/explicit-source-pairs-normal-O/usage.json b/research/c-verification-feasibility/evidence/publication/explicit-source-pairs-normal-O/usage.json new file mode 100644 index 0000000000..866d181183 --- /dev/null +++ b/research/c-verification-feasibility/evidence/publication/explicit-source-pairs-normal-O/usage.json @@ -0,0 +1 @@ +{"user_seconds":2.20,"system_seconds":0.16,"kernel_max_rss_kib":48856,"exit":0} diff --git a/research/c-verification-feasibility/evidence/publication/local-portability-rerun/receipt.json b/research/c-verification-feasibility/evidence/publication/local-portability-rerun/receipt.json new file mode 100644 index 0000000000..d58fd02f4e --- /dev/null +++ b/research/c-verification-feasibility/evidence/publication/local-portability-rerun/receipt.json @@ -0,0 +1,26 @@ +{ + "exit": 0, + "label": "feasibility-package-all-v2", + "optimized": false, + "platform": "Linux-7.0.0-38-generic-x86_64-with-glibc2.39", + "python": "3.12.3 (main, Aug 31 2026, 10:18:26) [GCC 13.3.0]", + "runner_sha256": "7540f8cc4ae4d12ed86c844ef0837a74184d3ada653979608c295c09f200a751", + "runtime_policy_sha256": "bb4b7e7c226e983bf3621e4215fd591efd7d79787270c0962e50c75227d59a7c", + "sampled_process_group_rss_bytes": 98811904, + "script": "stages/publication-feasibility-v2/run_all.py", + "source_bytes_and_modes_unchanged": true, + "source_inventory_sha256": "5485f2ca4087f694512ff90222b7f474234876a19abf50e2bcea7efc2360b7a4", + "status": "PASS", + "stderr_bytes": 0, + "stderr_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stdout_bytes": 18762, + "stdout_sha256": "860a36f93f9c871f66d236288f19d8849a7228a32479d80ee2feb873f71cf239", + "termination": null, + "usage": { + "exit": 0, + "kernel_max_rss_kib": 48620, + "system_seconds": 0.36, + "user_seconds": 6.18 + }, + "wall_seconds": 6.609581090015126 +} diff --git a/research/c-verification-feasibility/evidence/publication/local-portability-rerun/stderr.txt b/research/c-verification-feasibility/evidence/publication/local-portability-rerun/stderr.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/research/c-verification-feasibility/evidence/publication/local-portability-rerun/stdout.txt b/research/c-verification-feasibility/evidence/publication/local-portability-rerun/stdout.txt new file mode 100644 index 0000000000..7d197db50e --- /dev/null +++ b/research/c-verification-feasibility/evidence/publication/local-portability-rerun/stdout.txt @@ -0,0 +1,21 @@ +PASS_PRECISION_LINUX_SOURCE_CONTROLS {"contract": "declared contract edits", "declared_edit": "unique backend seam", "inner_archive": "source hash", "official_export_byte": "Exact PR5831 bundle"} +{"all_complete_values_and_types_equal": true, "cases": 241, "controls": ["returned-mutation-isolated", "source-drift", "Fraction-type-drift", "module-byte-drift", "live-code-drift", "nested-live-code-drift", "omitted-witness", "omitted-rounded-sites", "wrong-coefficient", "wrong-weighted-increment", "bad-role", "bad-scalar", "missing-weight", "restore-success", "restore-exception", "fresh-derivation", "key-field-0", "key-field-1", "key-field-2", "key-field-3", "key-field-4", "FIFO-eviction", "canonical-key", "hash-collision", "disabled", "invalid-capacity--1", "invalid-capacity-16385", "invalid-capacity-True", "invalid-capacity-1.5", "uncached-exception-0", "uncached-exception-1", "fresh-call-table", "stats-mutation", "failed-call-clears-stats"], "events": 10164, "status": "PASS_FINITE_FRACTION_TABLE_FEASIBILITY"} +{"all_coverage_preserved": true, "inherited": {"all_complete_values_and_types_equal": true, "cases": 241, "controls": ["returned-mutation-isolated", "source-drift", "Fraction-type-drift", "module-byte-drift", "live-code-drift", "nested-live-code-drift", "omitted-witness", "omitted-rounded-sites", "wrong-coefficient", "wrong-weighted-increment", "bad-role", "bad-scalar", "missing-weight", "restore-success", "restore-exception", "fresh-derivation", "key-field-0", "key-field-1", "key-field-2", "key-field-3", "key-field-4", "FIFO-eviction", "canonical-key", "hash-collision", "disabled", "invalid-capacity--1", "invalid-capacity-16385", "invalid-capacity-True", "invalid-capacity-1.5", "uncached-exception-0", "uncached-exception-1", "fresh-call-table", "stats-mutation", "failed-call-clears-stats"], "events": 10164, "status": "PASS_FINITE_FRACTION_TABLE_FEASIBILITY"}, "new_control_count": 20, "new_controls": ["all-241-fixtures-take-certified-domain", "subtypes-and-foreign-types-fall-back-without-custom-methods", "metaclass-container", "metaclass-scalar", "original-fallback-dict-subclass", "original-fallback-program-subclass", "original-fallback-event-subclass", "original-fallback-weights-subclass", "original-fallback-row-subclass", "original-fallback-rounded-subclass", "original-fallback-Fraction-subclass", "original-fallback-integer-weights", "original-fallback-boolean-public", "exact-internal-type-preservation-at-certified-updates", "malformed-outcome-missing-weight", "malformed-outcome-bad-role", "malformed-outcome-bad-scalar", "malformed-outcome-short-event", "recertification-invalidates-certified-method", "disabled-capacity-not-certified"], "status": "PASS_TYPE_GATE_FINITE_FEASIBILITY"} +{"all_coverage_preserved": true, "inherited": {"all_coverage_preserved": true, "inherited": {"all_complete_values_and_types_equal": true, "cases": 241, "controls": ["returned-mutation-isolated", "source-drift", "Fraction-type-drift", "module-byte-drift", "live-code-drift", "nested-live-code-drift", "omitted-witness", "omitted-rounded-sites", "wrong-coefficient", "wrong-weighted-increment", "bad-role", "bad-scalar", "missing-weight", "restore-success", "restore-exception", "fresh-derivation", "key-field-0", "key-field-1", "key-field-2", "key-field-3", "key-field-4", "FIFO-eviction", "canonical-key", "hash-collision", "disabled", "invalid-capacity--1", "invalid-capacity-16385", "invalid-capacity-True", "invalid-capacity-1.5", "uncached-exception-0", "uncached-exception-1", "fresh-call-table", "stats-mutation", "failed-call-clears-stats"], "events": 10164, "status": "PASS_FINITE_FRACTION_TABLE_FEASIBILITY"}, "new_control_count": 20, "new_controls": ["all-241-fixtures-take-certified-domain", "subtypes-and-foreign-types-fall-back-without-custom-methods", "metaclass-container", "metaclass-scalar", "original-fallback-dict-subclass", "original-fallback-program-subclass", "original-fallback-event-subclass", "original-fallback-weights-subclass", "original-fallback-row-subclass", "original-fallback-rounded-subclass", "original-fallback-Fraction-subclass", "original-fallback-integer-weights", "original-fallback-boolean-public", "exact-internal-type-preservation-at-certified-updates", "malformed-outcome-missing-weight", "malformed-outcome-bad-role", "malformed-outcome-bad-scalar", "malformed-outcome-short-event", "recertification-invalidates-certified-method", "disabled-capacity-not-certified"], "status": "PASS_TYPE_GATE_FINITE_FEASIBILITY"}, "new_control_count": 9, "new_controls": ["canonical-full-pair-tokens", "weight-token-hash-collision", "bounded-context-overflow", "event-q-canonical-equality-and-FIFO-counters", "six-complete-trace-counter-and-type-comparisons", "source-site-weight-ownership", "wrong-token-alias-detected", "overflow-fallback-preserves-original", "fresh-token-and-cache-lifetimes"], "status": "PASS_COMPACT_KEY_FINITE_ONLY"} +{"all_coverage_preserved": true, "inherited": {"all_coverage_preserved": true, "inherited": {"all_coverage_preserved": true, "inherited": {"all_complete_values_and_types_equal": true, "cases": 241, "controls": ["returned-mutation-isolated", "source-drift", "Fraction-type-drift", "module-byte-drift", "live-code-drift", "nested-live-code-drift", "omitted-witness", "omitted-rounded-sites", "wrong-coefficient", "wrong-weighted-increment", "bad-role", "bad-scalar", "missing-weight", "restore-success", "restore-exception", "fresh-derivation", "key-field-0", "key-field-1", "key-field-2", "key-field-3", "key-field-4", "FIFO-eviction", "canonical-key", "hash-collision", "disabled", "invalid-capacity--1", "invalid-capacity-16385", "invalid-capacity-True", "invalid-capacity-1.5", "uncached-exception-0", "uncached-exception-1", "fresh-call-table", "stats-mutation", "failed-call-clears-stats"], "events": 10164, "status": "PASS_FINITE_FRACTION_TABLE_FEASIBILITY"}, "new_control_count": 20, "new_controls": ["all-241-fixtures-take-certified-domain", "subtypes-and-foreign-types-fall-back-without-custom-methods", "metaclass-container", "metaclass-scalar", "original-fallback-dict-subclass", "original-fallback-program-subclass", "original-fallback-event-subclass", "original-fallback-weights-subclass", "original-fallback-row-subclass", "original-fallback-rounded-subclass", "original-fallback-Fraction-subclass", "original-fallback-integer-weights", "original-fallback-boolean-public", "exact-internal-type-preservation-at-certified-updates", "malformed-outcome-missing-weight", "malformed-outcome-bad-role", "malformed-outcome-bad-scalar", "malformed-outcome-short-event", "recertification-invalidates-certified-method", "disabled-capacity-not-certified"], "status": "PASS_TYPE_GATE_FINITE_FEASIBILITY"}, "new_control_count": 9, "new_controls": ["canonical-full-pair-tokens", "weight-token-hash-collision", "bounded-context-overflow", "event-q-canonical-equality-and-FIFO-counters", "six-complete-trace-counter-and-type-comparisons", "source-site-weight-ownership", "wrong-token-alias-detected", "overflow-fallback-preserves-original", "fresh-token-and-cache-lifetimes"], "status": "PASS_COMPACT_KEY_FINITE_ONLY"}, "new_control_count": 10, "new_controls": ["changed-getter-invalidates", "changed-live-getter-code", "foreign-slot-probe-is-pure", "changed-attribute-lookup", "missing-attribute-handler-presence", "binding-restored", "slot-path-selected", "post-derive-getter-drift-literal-fallback", "uninitialized-unused-weight-fallback", "foreign-slot-value-fallback"], "status": "PASS_SLOT_KEY_FINITE_ONLY"} +{"all_coverage_preserved": true, "build": {"SOABI": "cpython-312-x86_64-linux-gnu", "binary_sha256": "0c0e6ac8a50603ebdbbfbcf2c53cd72e0b217767738e98d570f624592ecf0443", "cold_build_load_wall_seconds": 0.34453865999239497, "compiler": "/usr/bin/cc", "compiler_cpu_accounting": "outer GNU time user+system includes compiler children", "compiler_version": "cc (Ubuntu 13.3.0-6ubuntu2~24.04.1) 13.3.0", "extension_suffix": ".cpython-312-x86_64-linux-gnu.so", "flags": ["-O2", "-shared", "-fPIC", "-std=c11", "-Wall", "-Werror", "-I/usr/include/python3.12"], "python": "3.12.3 (main, Aug 31 2026, 10:18:26) [GCC 13.3.0]", "source_sha256": "78ed2e240ee40ce4989a4718e77e8b3967b092d2bf8c900124a26942c98a14cb"}, "inherited": {"all_coverage_preserved": true, "inherited": {"all_coverage_preserved": true, "inherited": {"all_coverage_preserved": true, "inherited": {"all_complete_values_and_types_equal": true, "cases": 241, "controls": ["returned-mutation-isolated", "source-drift", "Fraction-type-drift", "module-byte-drift", "live-code-drift", "nested-live-code-drift", "omitted-witness", "omitted-rounded-sites", "wrong-coefficient", "wrong-weighted-increment", "bad-role", "bad-scalar", "missing-weight", "restore-success", "restore-exception", "fresh-derivation", "key-field-0", "key-field-1", "key-field-2", "key-field-3", "key-field-4", "FIFO-eviction", "canonical-key", "hash-collision", "disabled", "invalid-capacity--1", "invalid-capacity-16385", "invalid-capacity-True", "invalid-capacity-1.5", "uncached-exception-0", "uncached-exception-1", "fresh-call-table", "stats-mutation", "failed-call-clears-stats"], "events": 10164, "status": "PASS_FINITE_FRACTION_TABLE_FEASIBILITY"}, "new_control_count": 20, "new_controls": ["all-241-fixtures-take-certified-domain", "subtypes-and-foreign-types-fall-back-without-custom-methods", "metaclass-container", "metaclass-scalar", "original-fallback-dict-subclass", "original-fallback-program-subclass", "original-fallback-event-subclass", "original-fallback-weights-subclass", "original-fallback-row-subclass", "original-fallback-rounded-subclass", "original-fallback-Fraction-subclass", "original-fallback-integer-weights", "original-fallback-boolean-public", "exact-internal-type-preservation-at-certified-updates", "malformed-outcome-missing-weight", "malformed-outcome-bad-role", "malformed-outcome-bad-scalar", "malformed-outcome-short-event", "recertification-invalidates-certified-method", "disabled-capacity-not-certified"], "status": "PASS_TYPE_GATE_FINITE_FEASIBILITY"}, "new_control_count": 9, "new_controls": ["canonical-full-pair-tokens", "weight-token-hash-collision", "bounded-context-overflow", "event-q-canonical-equality-and-FIFO-counters", "six-complete-trace-counter-and-type-comparisons", "source-site-weight-ownership", "wrong-token-alias-detected", "overflow-fallback-preserves-original", "fresh-token-and-cache-lifetimes"], "status": "PASS_COMPACT_KEY_FINITE_ONLY"}, "new_control_count": 10, "new_controls": ["changed-getter-invalidates", "changed-live-getter-code", "foreign-slot-probe-is-pure", "changed-attribute-lookup", "missing-attribute-handler-presence", "binding-restored", "slot-path-selected", "post-derive-getter-drift-literal-fallback", "uninitialized-unused-weight-fallback", "foreign-slot-value-fallback"], "status": "PASS_SLOT_KEY_FINITE_ONLY"}, "native_control_count": 45, "native_controls": ["canonical-keys-FIFO-wrap-counters", "native-hash-collision", "exact-one-callback-per-miss", "uncached-native-error-0", "uncached-native-error-1", "full-cache-failure-before-eviction", "cache-survives-callback-exception", "capacity-0", "capacity--1", "capacity-16385", "capacity-True", "capacity-1.5", "capacity-10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "index--1", "index-3", "index-10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "index-True", "index-0", "arity", "keywords", "exact-operand", "exact-scalar", "event-creation", "descriptor-protocol", "token-length", "token-range", "partial-init-length", "partial-init-weight", "callback-result-shape", "callback-result-type", "callback-reentry", "event-owns-parent", "GC-callback-cycle", "native-statistics-isolated", "native-coefficient-loop", "same-row-lowlevel-rejection", "dict-iterator-mutation-safe", "callback-list-mutation-safe", "native-source-authenticated", "callback-descriptor-is-pure", "plain-callback-rejected", "live-callback-code-drift", "owned-metadata-snapshot", "same-row-source-fallback", "malformed-scalar-literal-fallback"], "status": "PASS_NATIVE_FINITE_ONLY"} +PASS_FRACTION_NATIVE_FINITE_AND_CUSTODY +PASS_C_VERIFICATION_SCOPED_FINITE baseline +{"build": {"SOABI": "cpython-312-x86_64-linux-gnu", "binary_sha256": "ce14493aa93c741d406054f2d47e5e7e14b8b8852dabafd9ef69d3a52391aacb", "cold_build_load_wall_seconds": 0.3581186310038902, "compiler": "/usr/bin/cc", "compiler_cpu_accounting": "parent outer process must include compiler children", "extension_suffix": ".cpython-312-x86_64-linux-gnu.so", "flags": ["-O2", "-shared", "-fPIC", "-std=c11", "-Wall", "-Werror", "-I/usr/include/python3.12"], "python": "3.12.3 (main, Aug 31 2026, 10:18:26) [GCC 13.3.0]", "source_sha256": "804cc25bd9ad0912de81fe97bc65b95ebcb0dec06453739e1d4863e7946c4f3d"}, "result": {"checks": ["eight-row-and-score-differentials", "aliased-inputs-return-fresh-outputs", "six-ordered-prefixes-and-complete-bytes", "zero-negative-large-reduced-and-ordered-formatting", "score-string-contract-distinct-from-coefficient-contract", "reverse-scores-signed-bytes-and-aliases", "bool-numerator", "foreign-int-value", "foreign-dict", "foreign-key", "float-value", "negative-exponent", "bool-exponent", "inexact-division-transaction", "inexact-scaled-row", "nondyadic-scale", "zero-scale", "negative-scale", "bool-scale", "short-score", "foreign-scores", "foreign-weight", "weight-index-range", "negative-weight-index", "reverse-index-range", "score-nondyadic-unit", "event-type"], "independent_fraction_formatting": true, "ordered_prefixes": 6, "row_cases": 8, "status": "PASS_FINITE_INTEGER_FORMAT", "timing_claim": false, "whole_replay": false}} +PASS_C_VERIFICATION_SCOPED_FINITE integer +{"build": {"SOABI": "cpython-312-x86_64-linux-gnu", "binary_sha256": "527566e6166a120c5c29ce0e47883c5655bc10223a1d03a83a73499b6e102f43", "cold_build_load_wall_seconds": 0.3654571740189567, "compiler": "/usr/bin/cc", "compiler_cpu_accounting": "parent outer process must include compiler children", "extension_suffix": ".cpython-312-x86_64-linux-gnu.so", "flags": ["-O2", "-shared", "-fPIC", "-std=c11", "-Wall", "-Werror", "-I/usr/include/python3.12"], "python": "3.12.3 (main, Aug 31 2026, 10:18:26) [GCC 13.3.0]", "source_sha256": "804cc25bd9ad0912de81fe97bc65b95ebcb0dec06453739e1d4863e7946c4f3d"}, "result": {"checks": ["eight-row-and-score-differentials", "aliased-inputs-return-fresh-outputs", "six-ordered-prefixes-and-complete-bytes", "zero-negative-large-reduced-and-ordered-formatting", "score-string-contract-distinct-from-coefficient-contract", "reverse-scores-signed-bytes-and-aliases", "bool-numerator", "foreign-int-value", "foreign-dict", "foreign-key", "float-value", "negative-exponent", "bool-exponent", "inexact-division-transaction", "inexact-scaled-row", "nondyadic-scale", "zero-scale", "negative-scale", "bool-scale", "short-score", "foreign-scores", "foreign-weight", "weight-index-range", "negative-weight-index", "reverse-index-range", "score-nondyadic-unit", "event-type"], "independent_fraction_formatting": true, "ordered_prefixes": 6, "row_cases": 8, "status": "PASS_FINITE_INTEGER_FORMAT", "timing_claim": false, "whole_replay": false}} +PASS_C_VERIFICATION_SCOPED_FINITE integer +{"python": "3.12.3 (main, Aug 31 2026, 10:18:26) [GCC 13.3.0]", "runtime_fraction_source_sha256": "cf33568f7b767f66896995a7a81cc662e8be226f2e58efb61d2028f64eb5d231", "scope": "rational-source-pin-diagnostic"} +{"actual_word_run": false, "added_controls": ["165-general-rational-coefficient-prefixes", "batch-FIFO-and-full-counters", "exact-score-type", "score-subclass", "negative-score-denominator", "same-row", "nonbuiltin-gcd", "source-iterator-mutation", "score-list-mutation", "score-value-mutation", "callback-failure-publishes-completed-prefix", "arithmetic-code-drift", "inplace-protocol-drift", "materialization-source-drift", "gcd-drift", "operator-closure-drift", "13-complete-event-prefixes-with-nondyadic-weights-and-scalars", "noncanonical-weight-fallback", "changed-arithmetic-fallback"], "build": {"SOABI": "cpython-312-x86_64-linux-gnu", "binary_sha256": "198a90d4129f2a387f5329b38fdf89a64c8e5c2352db38a693edd5cbdbb27825", "cold_build_load_wall_seconds": 0.46449961999314837, "compiler": "/usr/bin/cc", "compiler_cpu_accounting": "outer GNU time user+system includes compiler children", "compiler_version": "cc (Ubuntu 13.3.0-6ubuntu2~24.04.1) 13.3.0", "extension_suffix": ".cpython-312-x86_64-linux-gnu.so", "flags": ["-O2", "-shared", "-fPIC", "-std=c11", "-Wall", "-Werror", "-I/usr/include/python3.12"], "python": "3.12.3 (main, Aug 31 2026, 10:18:26) [GCC 13.3.0]", "source_sha256": "4a4949e36cff4ff2894dd1f9379b58a58346ec7c888903271d4b98bbe4cfc7ae"}, "comparisons": 178, "complete_performance": false, "control_count": 19, "independent_literal_oracle_used": true, "status": "PASS_BOUNDED_RATIONAL_PROTOTYPE_ONLY"} +PASS_ADDED_DESTRUCTOR_AND_UNKNOWN_SOURCE_BINDING_CONTROLS +PASS_C_VERIFICATION_SCOPED_FINITE rational +{"python": "3.12.3 (main, Aug 31 2026, 10:18:26) [GCC 13.3.0]", "runtime_fraction_source_sha256": "cf33568f7b767f66896995a7a81cc662e8be226f2e58efb61d2028f64eb5d231", "scope": "rational-source-pin-diagnostic"} +{"actual_word_run": false, "added_controls": ["165-general-rational-coefficient-prefixes", "batch-FIFO-and-full-counters", "exact-score-type", "score-subclass", "negative-score-denominator", "same-row", "nonbuiltin-gcd", "source-iterator-mutation", "score-list-mutation", "score-value-mutation", "callback-failure-publishes-completed-prefix", "arithmetic-code-drift", "inplace-protocol-drift", "materialization-source-drift", "gcd-drift", "operator-closure-drift", "13-complete-event-prefixes-with-nondyadic-weights-and-scalars", "noncanonical-weight-fallback", "changed-arithmetic-fallback"], "build": {"SOABI": "cpython-312-x86_64-linux-gnu", "binary_sha256": "3afed55ba095af7d32a5b3290f92a378a9e073927161eb09d6e552e77dff1d46", "cold_build_load_wall_seconds": 0.49015142902499065, "compiler": "/usr/bin/cc", "compiler_cpu_accounting": "outer GNU time user+system includes compiler children", "compiler_version": "cc (Ubuntu 13.3.0-6ubuntu2~24.04.1) 13.3.0", "extension_suffix": ".cpython-312-x86_64-linux-gnu.so", "flags": ["-O2", "-shared", "-fPIC", "-std=c11", "-Wall", "-Werror", "-I/usr/include/python3.12"], "python": "3.12.3 (main, Aug 31 2026, 10:18:26) [GCC 13.3.0]", "source_sha256": "4a4949e36cff4ff2894dd1f9379b58a58346ec7c888903271d4b98bbe4cfc7ae"}, "comparisons": 178, "complete_performance": false, "control_count": 19, "independent_literal_oracle_used": true, "status": "PASS_BOUNDED_RATIONAL_PROTOTYPE_ONLY"} +PASS_ADDED_DESTRUCTOR_AND_UNKNOWN_SOURCE_BINDING_CONTROLS +PASS_C_VERIFICATION_SCOPED_FINITE rational +PASS_ALL_FRESH_SCOPED_PACKAGE_COMMANDS diff --git a/research/c-verification-feasibility/evidence/publication/local-portability-rerun/usage.json b/research/c-verification-feasibility/evidence/publication/local-portability-rerun/usage.json new file mode 100644 index 0000000000..1a27c57a3c --- /dev/null +++ b/research/c-verification-feasibility/evidence/publication/local-portability-rerun/usage.json @@ -0,0 +1 @@ +{"user_seconds":6.18,"system_seconds":0.36,"kernel_max_rss_kib":48620,"exit":0} diff --git a/research/c-verification-feasibility/rational/arithmetic_binding.py b/research/c-verification-feasibility/rational/arithmetic_binding.py index 2f6acf4333..f33affe523 100644 --- a/research/c-verification-feasibility/rational/arithmetic_binding.py +++ b/research/c-verification-feasibility/rational/arithmetic_binding.py @@ -16,6 +16,9 @@ import slot_binding SOURCE_SHA256='cf33568f7b767f66896995a7a81cc662e8be226f2e58efb61d2028f64eb5d231' +# Explicitly reviewed CPython source revisions; all live operation guards remain. +SUPPORTED_RUNTIME_SOURCES={(3,12,3):frozenset((SOURCE_SHA256,)), + (3,12,15):frozenset(('d52d1ab9d5be26924e4914a5e40069c992bbfa68f773694c2e5ee8452d0766a0',))} DIRECT=('_add','_sub','_mul','__abs__','__bool__','__new__') WRAPPED=(('__add__','_add','add','forward'),('__radd__','_add','add','reverse'), ('__sub__','_sub','sub','forward'),('__rsub__','_sub','sub','reverse'), @@ -31,10 +34,10 @@ def _shape(code): def _codes(): global _expected - if _expected is not None:return _expected path=Path(fractions.__file__) raw=path.read_bytes() - if path.is_symlink() or sha256(raw).hexdigest()!=SOURCE_SHA256:raise ValueError('pinned Fraction source') + if path.is_symlink() or sha256(raw).hexdigest() not in SUPPORTED_RUNTIME_SOURCES.get(sys.version_info[:3],()):raise ValueError('pinned Fraction source') + if _expected is not None:return _expected compiled=compile(raw,str(path),'exec',optimize=sys.flags.optimize) result={} def visit(code): diff --git a/research/c-verification-feasibility/verify.py b/research/c-verification-feasibility/verify.py index 52d3ac140a..c5626ffabd 100644 --- a/research/c-verification-feasibility/verify.py +++ b/research/c-verification-feasibility/verify.py @@ -25,6 +25,8 @@ runpy.run_path(sys.argv[0], run_name='__main__') else: sys.path.insert(0, str(stage)) + import fractions + print(json.dumps(dict(runtime_fraction_source_sha256=sha256(Path(fractions.__file__).read_bytes()).hexdigest(),python=sys.version,scope='rational-source-pin-diagnostic'),sort_keys=True)) from finite_probe import main main(stage / 'package', micro=False) import arithmetic_binding as binding @@ -36,6 +38,18 @@ require(binding.bind() is None and not binding.fresh(token), 'destructor drift rejects') finally: del F.__del__ - print('PASS_ADDED_DESTRUCTOR_BINDING_CONTROL') + # A populated expected-code cache must not admit an unknown file. + import fractions, tempfile + saved=fractions.__file__ + with tempfile.TemporaryDirectory(prefix='unknown-fraction-source-') as temp: + foreign=Path(temp)/'fractions.py' + foreign.write_bytes(Path(saved).read_bytes()+b'\n# unapproved source revision\n') + fractions.__file__=str(foreign) + try: + require(binding.bind() is None, 'unknown Fraction source rejects after cache populated') + finally: + fractions.__file__=saved + require(binding.bind() is not None, 'known Fraction source binding restored') + print('PASS_ADDED_DESTRUCTOR_AND_UNKNOWN_SOURCE_BINDING_CONTROLS') print('PASS_C_VERIFICATION_SCOPED_FINITE ' + mode) From 4b6d9c0d630b7809e43651eadcb4921ea5dbde56 Mon Sep 17 00:00:00 2001 From: d3lerium Date: Wed, 28 Oct 2026 00:22:13 +1100 Subject: [PATCH 7/7] Retain owned-state rejection screen and readonly compatibility replay --- .../CODE-SOURCES.json | 4 +- research/c-verification-feasibility/README.md | 23 + .../VALIDATION.json | 5 +- .../INTEGER-OWNED-BOUNDARY-SCREEN.json | 2259 +++++++++++++++++ .../astra-next-boundary-cost-screen.md | 257 ++ .../readonly-compatibility/receipt.json | 26 + .../readonly-compatibility/stderr.txt | 0 .../readonly-compatibility/stdout.txt | 21 + .../readonly-compatibility/usage.json | 1 + .../integer-owned-boundary-v1/receipt.json | 26 + .../runs/integer-owned-boundary-v1/stderr.txt | 0 .../runs/integer-owned-boundary-v1/stdout.txt | 10 + .../runs/integer-owned-boundary-v1/usage.json | 1 + .../owned_integer/diagnostic.py | 202 ++ .../owned_screen.py | 9 + research/c-verification-feasibility/replay.py | 7 +- 16 files changed, 2845 insertions(+), 6 deletions(-) create mode 100644 research/c-verification-feasibility/evidence/INTEGER-OWNED-BOUNDARY-SCREEN.json create mode 100644 research/c-verification-feasibility/evidence/astra-next-boundary-cost-screen.md create mode 100644 research/c-verification-feasibility/evidence/publication/readonly-compatibility/receipt.json create mode 100644 research/c-verification-feasibility/evidence/publication/readonly-compatibility/stderr.txt create mode 100644 research/c-verification-feasibility/evidence/publication/readonly-compatibility/stdout.txt create mode 100644 research/c-verification-feasibility/evidence/publication/readonly-compatibility/usage.json create mode 100644 research/c-verification-feasibility/evidence/runs/integer-owned-boundary-v1/receipt.json create mode 100644 research/c-verification-feasibility/evidence/runs/integer-owned-boundary-v1/stderr.txt create mode 100644 research/c-verification-feasibility/evidence/runs/integer-owned-boundary-v1/stdout.txt create mode 100644 research/c-verification-feasibility/evidence/runs/integer-owned-boundary-v1/usage.json create mode 100644 research/c-verification-feasibility/owned_integer/diagnostic.py create mode 100644 research/c-verification-feasibility/owned_screen.py diff --git a/research/c-verification-feasibility/CODE-SOURCES.json b/research/c-verification-feasibility/CODE-SOURCES.json index 5464343fb2..edd43b50b2 100644 --- a/research/c-verification-feasibility/CODE-SOURCES.json +++ b/research/c-verification-feasibility/CODE-SOURCES.json @@ -9,11 +9,13 @@ "integer/integer_format.c": "804cc25bd9ad0912de81fe97bc65b95ebcb0dec06453739e1d4863e7946c4f3d", "integer/micro_probe.py": "f1d39f830987fcabe8ca5453ddbb1eca1df10a9670a95db510efbe5f21dd76aa", "integer/native_loader.py": "2592bef50e5338ad562d9a69bca1183ef0d88a4d34bdc497af4452304dca25c3", + "owned_integer/diagnostic.py": "4efeb040398c6d5204d552b6211e5a99aa3a3cb156ca422f05fbf0edd58e817b", + "owned_screen.py": "93fe1f8039e3a3442f561eb5463182d558d459d7335c882b009256780539419e", "portable.py": "77f8910fb9ba1ed8dcc23bc574e2998105b86818f7391b48efa77eda6ea3d859", "rational/arithmetic_binding.py": "db9c2778be538e1a7ae975b7e2108e52da53600a268c76d5e27b9965f0bb622a", "rational/bulk_backend.py": "9b440bd3d921bb06ff5035cb8ae85053f3e0b6880b6ec37d364b55da012449ca", "rational/finite_probe.py": "362bcd2bc967ed223ed303835048d1c51697f0293cfc83cffd4a9e02e2efcccd", "rational/native_bulk.c": "4a4949e36cff4ff2894dd1f9379b58a58346ec7c888903271d4b98bbe4cfc7ae", - "replay.py": "a25304bed5fcf7ed56802569d648707b73c83666fa6f645ddffc5a5cc0bae2a8", + "replay.py": "ec80c3da976fe23987ce7da568185ee0d76a28f7c6ac38c8a5cf969c3cf6603c", "verify.py": "6c25ffb97cbe940f8414d97c668a0b0d2d759e0d37d46283316e577b7bb38372" } diff --git a/research/c-verification-feasibility/README.md b/research/c-verification-feasibility/README.md index fd04ebe2c7..6834e75c69 100644 --- a/research/c-verification-feasibility/README.md +++ b/research/c-verification-feasibility/README.md @@ -83,6 +83,29 @@ expecting mutation/`None` are not covered. Historical binder metadata fields such as `source_only_handoff` describe the worker's handoff, while the parent run receipts state what was actually executed. +## Broader integer ownership: one rejection-only cost diagnostic + +Before constructing another integer state owner, one source-bound diagnostic +ran the original PR5864 qualifier without replacing arithmetic. A facade timed +4 original ideal, 121 error-trace and 121 reverse calls, accounting for their +disjoint union and retaining every scientific check and exception. No timing +sample was rerolled or added to the BCCBBC comparison. + +The observed eligible union was 4.855752 wall / 4.853204 CPU seconds, below the +fixed 15% thresholds of 5.199268 / 5.170500 seconds from the chosen baseline +medians, even granting zero replacement and validation costs. The diagnostic's +whole command was faster than those earlier baseline samples; these are scoped +observations under host variation, not a machine-independent upper bound or +universal obstruction. Relative to its own entire command the free union is +only about 15.2%, before retained computation and added controls. No fully +priced construction is funded by this screen. + +[All 246 boundary records](evidence/INTEGER-OWNED-BOUNDARY-SCREEN.json), the +unchanged [diagnostic source](owned_integer/diagnostic.py), and the +[complete ownership-cost review](evidence/astra-next-boundary-cost-screen.md) +remain visible. Optional guarded arm `D` reproduces this diagnostic; it is not +a performance sample or permission to repeat a failed screen automatically. + ## Rational batching: independent-oracle bill stops construction The prototype retains the existing contribution callback/cache and batches diff --git a/research/c-verification-feasibility/VALIDATION.json b/research/c-verification-feasibility/VALIDATION.json index 339369cbe2..05fdbb179a 100644 --- a/research/c-verification-feasibility/VALIDATION.json +++ b/research/c-verification-feasibility/VALIDATION.json @@ -19,7 +19,7 @@ "qualified_speed_claim": false, "new_rational_actual_word_or_complete_runs": 0, "new_complete_optimized_or_readonly_replays": 0, - "readonly_gitfree_finite": "PASS_ALL_FIVE_COMMANDS", + "readonly_gitfree_finite": "PASS_ALL_FIVE_COMMANDS_FOR_REVIEWED_RUNTIME_SOURCE_PAIRS", "metadata_committed_bytes": "PASS_METADATA_PINS_97_FILES_BEFORE_PUBLICATION_METADATA_ADDITION", "hosted_exact_head": "FIRST_HEAD_FAILED_SOURCE_COMPATIBILITY; CORRECTED_HEAD_REPLAY_REQUIRED", "scope_notes": [ @@ -29,5 +29,6 @@ ], "extra_unknown_source_rejection_control": 1, "first_hosted_failure": "run40505352497 / ec0afa... rejected rational binding after baseline+integer normalO passed; retained diagnostic and reviewed compatibility correction", - "explicit_runtime_source_pairs_local": "PASS_NORMAL_AND_OPTIMIZED" + "explicit_runtime_source_pairs_local": "PASS_NORMAL_AND_OPTIMIZED", + "owned_integer_rejection_diagnostic": "PASS_ALL246_BOUNDARIES_UNCHANGED_ARITHMETIC; observed4.855752wall/4.853204CPU belowfixed5.199268/5.170500thresholds; no construction" } diff --git a/research/c-verification-feasibility/evidence/INTEGER-OWNED-BOUNDARY-SCREEN.json b/research/c-verification-feasibility/evidence/INTEGER-OWNED-BOUNDARY-SCREEN.json new file mode 100644 index 0000000000..bf7203db7e --- /dev/null +++ b/research/c-verification-feasibility/evidence/INTEGER-OWNED-BOUNDARY-SCREEN.json @@ -0,0 +1,2259 @@ +{ + "arithmetic_changed": false, + "complete_speed_claim": false, + "construction_admitted": false, + "counts": { + "error_trace": 121, + "ideal": 4, + "reverse_all": 121 + }, + "eligible_disjoint_union_seconds": { + "cpu": 4.853204029000002, + "wall": 4.855752163886791 + }, + "expected_actual_program_length": 25984, + "fixed_baseline_medians": { + "cpu": 34.47, + "wall": 34.66178539200337 + }, + "fixed_noise_spreads": { + "cpu": 2.3500000000000014, + "wall": 2.713637237990042 + }, + "fraction_path_changed": false, + "full_source_sha256": "ce6f15ca892db095d4b9f79b58cb3c199b18da341def761c577cc8651abc0cc0", + "instrumented_driver_sha256": "90b1eaba6b1a52c5d03a5cb19e6a294d30a5ca6192648eab0ae8af8cb54ec896", + "integer_source_sha256": "82a73e4bcf1835bfdd510c7ad5538625c1b380c559b671e6a67be490615a743a", + "interpretation": "Even deleting every timed original integer call cannot fund the fixed gate.", + "metadata_and_output_costs_outside_eligible_union": true, + "necessary_zero_cost_threshold_seconds": { + "cpu": 5.1705, + "wall": 5.199267808800505 + }, + "nomination_rejected": true, + "outer_cpu_must_include_existing_compiler_children": true, + "own_process_cpu_only_inside_engine": true, + "performance_sample": false, + "records": [ + { + "classification": "actual_word", + "cpu_seconds": 0.544413971, + "exception": null, + "family": "ideal", + "outermost": true, + "program_length": 25984, + "wall_seconds": 0.5448808490182273 + }, + { + "classification": "actual_word", + "cpu_seconds": 2.915196117, + "exception": null, + "family": "error_trace", + "outermost": true, + "program_length": 25984, + "wall_seconds": 2.9158753560041077 + }, + { + "classification": "actual_word", + "cpu_seconds": 0.9534440719999999, + "exception": null, + "family": "reverse_all", + "outermost": true, + "program_length": 25984, + "wall_seconds": 0.9542549859907012 + }, + { + "classification": "modified_word_control", + "cpu_seconds": 0.2735104669999995, + "exception": "ValueError", + "family": "ideal", + "outermost": true, + "program_length": 25985, + "wall_seconds": 0.273615426995093 + }, + { + "classification": "modified_word_control", + "cpu_seconds": 0.034584928000001014, + "exception": "ValueError", + "family": "ideal", + "outermost": true, + "program_length": 25984, + "wall_seconds": 0.03460642998106778 + }, + { + "classification": "modified_word_control", + "cpu_seconds": 0.03475777200000074, + "exception": "ValueError", + "family": "ideal", + "outermost": true, + "program_length": 25984, + "wall_seconds": 0.03476152999792248 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.00014471599999765772, + "exception": null, + "family": "error_trace", + "outermost": true, + "program_length": 5, + "wall_seconds": 0.0001474670134484768 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 7.746800000063558e-05, + "exception": null, + "family": "reverse_all", + "outermost": true, + "program_length": 5, + "wall_seconds": 7.892798748798668e-05 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.00013194900000002008, + "exception": null, + "family": "error_trace", + "outermost": true, + "program_length": 6, + "wall_seconds": 0.00013346201740205288 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 9.150900000065576e-05, + "exception": null, + "family": "reverse_all", + "outermost": true, + "program_length": 6, + "wall_seconds": 0.00010158601799048483 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.00015420100000085313, + "exception": null, + "family": "error_trace", + "outermost": true, + "program_length": 7, + "wall_seconds": 0.00015565802459605038 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 8.906100000061201e-05, + "exception": null, + "family": "reverse_all", + "outermost": true, + "program_length": 7, + "wall_seconds": 9.053500252775848e-05 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.00018328199999828598, + "exception": null, + "family": "error_trace", + "outermost": true, + "program_length": 8, + "wall_seconds": 0.0001848780084401369 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 8.795500000147172e-05, + "exception": null, + "family": "reverse_all", + "outermost": true, + "program_length": 8, + "wall_seconds": 8.932701894082129e-05 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.00016741900000027954, + "exception": null, + "family": "error_trace", + "outermost": true, + "program_length": 9, + "wall_seconds": 0.0001688519841991365 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.00011472100000275987, + "exception": null, + "family": "reverse_all", + "outermost": true, + "program_length": 9, + "wall_seconds": 0.00011616700794547796 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.00020741000000157328, + "exception": null, + "family": "error_trace", + "outermost": true, + "program_length": 10, + "wall_seconds": 0.00020901800598949194 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.00012040800000079344, + "exception": null, + "family": "reverse_all", + "outermost": true, + "program_length": 10, + "wall_seconds": 0.00012188797700218856 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.0001990519999992557, + "exception": null, + "family": "error_trace", + "outermost": true, + "program_length": 11, + "wall_seconds": 0.00020067801233381033 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.00012447800000003895, + "exception": null, + "family": "reverse_all", + "outermost": true, + "program_length": 11, + "wall_seconds": 0.00012583599891513586 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.00027867400000047837, + "exception": null, + "family": "error_trace", + "outermost": true, + "program_length": 12, + "wall_seconds": 0.00028870298410765827 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.00013027800000031675, + "exception": null, + "family": "reverse_all", + "outermost": true, + "program_length": 12, + "wall_seconds": 0.00013167198630981147 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.00024971900000281266, + "exception": null, + "family": "error_trace", + "outermost": true, + "program_length": 13, + "wall_seconds": 0.0002512560167815536 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.0001288959999996564, + "exception": null, + "family": "reverse_all", + "outermost": true, + "program_length": 13, + "wall_seconds": 0.0001302319869864732 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.0002744400000018743, + "exception": null, + "family": "error_trace", + "outermost": true, + "program_length": 14, + "wall_seconds": 0.00027590198442339897 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.00016587800000067432, + "exception": null, + "family": "reverse_all", + "outermost": true, + "program_length": 14, + "wall_seconds": 0.00016731300274841487 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.000302288999996847, + "exception": null, + "family": "error_trace", + "outermost": true, + "program_length": 15, + "wall_seconds": 0.00030385301215574145 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.00018540800000010904, + "exception": null, + "family": "reverse_all", + "outermost": true, + "program_length": 15, + "wall_seconds": 0.00018674900638870895 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.0002557129999978258, + "exception": null, + "family": "error_trace", + "outermost": true, + "program_length": 16, + "wall_seconds": 0.00025730099878273904 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.00016728000000298948, + "exception": null, + "family": "reverse_all", + "outermost": true, + "program_length": 16, + "wall_seconds": 0.00016876199515536427 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.0002651769999992837, + "exception": null, + "family": "error_trace", + "outermost": true, + "program_length": 17, + "wall_seconds": 0.0002667150110937655 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.00014855300000249372, + "exception": null, + "family": "reverse_all", + "outermost": true, + "program_length": 17, + "wall_seconds": 0.0001498789933975786 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.0003102179999991961, + "exception": null, + "family": "error_trace", + "outermost": true, + "program_length": 18, + "wall_seconds": 0.00032151301275007427 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.00019853699999927699, + "exception": null, + "family": "reverse_all", + "outermost": true, + "program_length": 18, + "wall_seconds": 0.00020003700046800077 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.0003246320000016567, + "exception": null, + "family": "error_trace", + "outermost": true, + "program_length": 19, + "wall_seconds": 0.0003263560065533966 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.00017023299999863184, + "exception": null, + "family": "reverse_all", + "outermost": true, + "program_length": 19, + "wall_seconds": 0.00017164502060040832 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.00032911200000285135, + "exception": null, + "family": "error_trace", + "outermost": true, + "program_length": 20, + "wall_seconds": 0.0003306700091343373 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.00018308599999983244, + "exception": null, + "family": "reverse_all", + "outermost": true, + "program_length": 20, + "wall_seconds": 0.00018449698109179735 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.00032679499999943573, + "exception": null, + "family": "error_trace", + "outermost": true, + "program_length": 21, + "wall_seconds": 0.00032843698863871396 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.0001944350000009365, + "exception": null, + "family": "reverse_all", + "outermost": true, + "program_length": 21, + "wall_seconds": 0.00019584799883887172 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.00033027599999968515, + "exception": null, + "family": "error_trace", + "outermost": true, + "program_length": 22, + "wall_seconds": 0.0003317139926366508 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.00018561000000261174, + "exception": null, + "family": "reverse_all", + "outermost": true, + "program_length": 22, + "wall_seconds": 0.0001870489795692265 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.0003872020000024179, + "exception": null, + "family": "error_trace", + "outermost": true, + "program_length": 23, + "wall_seconds": 0.00038884198875166476 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.00021157000000116, + "exception": null, + "family": "reverse_all", + "outermost": true, + "program_length": 23, + "wall_seconds": 0.00021340098464861512 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.0003424239999993972, + "exception": null, + "family": "error_trace", + "outermost": true, + "program_length": 24, + "wall_seconds": 0.00034396699629724026 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.00021890200000029836, + "exception": null, + "family": "reverse_all", + "outermost": true, + "program_length": 24, + "wall_seconds": 0.00022039099712856114 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.0005009969999996144, + "exception": null, + "family": "error_trace", + "outermost": true, + "program_length": 25, + "wall_seconds": 0.0005025969876442105 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.00026900599999990504, + "exception": null, + "family": "reverse_all", + "outermost": true, + "program_length": 25, + "wall_seconds": 0.00027043800218962133 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.00042107699999860415, + "exception": null, + "family": "error_trace", + "outermost": true, + "program_length": 26, + "wall_seconds": 0.00042271800339221954 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.00022539500000107182, + "exception": null, + "family": "reverse_all", + "outermost": true, + "program_length": 26, + "wall_seconds": 0.00022688298486173153 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.0003836340000020755, + "exception": null, + "family": "error_trace", + "outermost": true, + "program_length": 27, + "wall_seconds": 0.000385160994483158 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.00021930300000150282, + "exception": null, + "family": "reverse_all", + "outermost": true, + "program_length": 27, + "wall_seconds": 0.0002207560173701495 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.0004667900000008274, + "exception": null, + "family": "error_trace", + "outermost": true, + "program_length": 28, + "wall_seconds": 0.0004683589795604348 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.00023473400000284528, + "exception": null, + "family": "reverse_all", + "outermost": true, + "program_length": 28, + "wall_seconds": 0.00023622700246050954 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.00042273999999764555, + "exception": null, + "family": "error_trace", + "outermost": true, + "program_length": 29, + "wall_seconds": 0.00042432500049471855 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.0002402650000021822, + "exception": null, + "family": "reverse_all", + "outermost": true, + "program_length": 29, + "wall_seconds": 0.0002417630166746676 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.0004001630000018963, + "exception": null, + "family": "error_trace", + "outermost": true, + "program_length": 30, + "wall_seconds": 0.0004020819906145334 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.00022455399999898873, + "exception": null, + "family": "reverse_all", + "outermost": true, + "program_length": 30, + "wall_seconds": 0.0002259699977003038 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.0004824320000018645, + "exception": null, + "family": "error_trace", + "outermost": true, + "program_length": 31, + "wall_seconds": 0.0004841220215894282 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.0002588750000001028, + "exception": null, + "family": "reverse_all", + "outermost": true, + "program_length": 31, + "wall_seconds": 0.0002603379834908992 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.0004832789999973386, + "exception": null, + "family": "error_trace", + "outermost": true, + "program_length": 32, + "wall_seconds": 0.0004848829994443804 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.00027825199999753636, + "exception": null, + "family": "reverse_all", + "outermost": true, + "program_length": 32, + "wall_seconds": 0.00027969799702987075 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.00044181000000165227, + "exception": null, + "family": "error_trace", + "outermost": true, + "program_length": 33, + "wall_seconds": 0.00044336600694805384 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.0002375239999992118, + "exception": null, + "family": "reverse_all", + "outermost": true, + "program_length": 33, + "wall_seconds": 0.00023893799516372383 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.000515075000002696, + "exception": null, + "family": "error_trace", + "outermost": true, + "program_length": 34, + "wall_seconds": 0.0005209480004850775 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.0002741630000002715, + "exception": null, + "family": "reverse_all", + "outermost": true, + "program_length": 34, + "wall_seconds": 0.0002756309986580163 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.00047766499999823964, + "exception": null, + "family": "error_trace", + "outermost": true, + "program_length": 35, + "wall_seconds": 0.0004792070249095559 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.0002729370000018605, + "exception": null, + "family": "reverse_all", + "outermost": true, + "program_length": 35, + "wall_seconds": 0.00027442400460131466 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.000451267999999061, + "exception": null, + "family": "error_trace", + "outermost": true, + "program_length": 36, + "wall_seconds": 0.00045272998977452517 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.0002461969999991709, + "exception": null, + "family": "reverse_all", + "outermost": true, + "program_length": 36, + "wall_seconds": 0.0002476199879311025 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.000563020999997832, + "exception": null, + "family": "error_trace", + "outermost": true, + "program_length": 37, + "wall_seconds": 0.0005646209756378084 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.00032334799999844677, + "exception": null, + "family": "reverse_all", + "outermost": true, + "program_length": 37, + "wall_seconds": 0.0003247929853387177 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.0005040869999994868, + "exception": null, + "family": "error_trace", + "outermost": true, + "program_length": 38, + "wall_seconds": 0.0005056480003986508 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.0002870460000004016, + "exception": null, + "family": "reverse_all", + "outermost": true, + "program_length": 38, + "wall_seconds": 0.00028857699362561107 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.0004982330000018464, + "exception": null, + "family": "error_trace", + "outermost": true, + "program_length": 39, + "wall_seconds": 0.0004997489741072059 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.00028332700000177624, + "exception": null, + "family": "reverse_all", + "outermost": true, + "program_length": 39, + "wall_seconds": 0.0002846480056177825 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.0005944079999977703, + "exception": null, + "family": "error_trace", + "outermost": true, + "program_length": 40, + "wall_seconds": 0.0005959420232102275 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.0003390080000009732, + "exception": null, + "family": "reverse_all", + "outermost": true, + "program_length": 40, + "wall_seconds": 0.0003404789895284921 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.0005831050000004723, + "exception": null, + "family": "error_trace", + "outermost": true, + "program_length": 41, + "wall_seconds": 0.0005849339941050857 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.0003328210000006493, + "exception": null, + "family": "reverse_all", + "outermost": true, + "program_length": 41, + "wall_seconds": 0.0003341799892950803 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.0005662019999981283, + "exception": null, + "family": "error_trace", + "outermost": true, + "program_length": 42, + "wall_seconds": 0.000567914015846327 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.00032214100000160784, + "exception": null, + "family": "reverse_all", + "outermost": true, + "program_length": 42, + "wall_seconds": 0.00032367100357078016 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.0006203029999980458, + "exception": null, + "family": "error_trace", + "outermost": true, + "program_length": 43, + "wall_seconds": 0.0006219460046850145 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.0003744539999992469, + "exception": null, + "family": "reverse_all", + "outermost": true, + "program_length": 43, + "wall_seconds": 0.0003760499821510166 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.0005911219999994444, + "exception": null, + "family": "error_trace", + "outermost": true, + "program_length": 44, + "wall_seconds": 0.0005927000020164996 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.000358529999999746, + "exception": null, + "family": "reverse_all", + "outermost": true, + "program_length": 44, + "wall_seconds": 0.0003603899967856705 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.0005802680000002169, + "exception": null, + "family": "error_trace", + "outermost": true, + "program_length": 45, + "wall_seconds": 0.0005821859813295305 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.0003126299999998139, + "exception": null, + "family": "reverse_all", + "outermost": true, + "program_length": 45, + "wall_seconds": 0.00031408597715198994 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.0006835909999978185, + "exception": null, + "family": "error_trace", + "outermost": true, + "program_length": 46, + "wall_seconds": 0.0006852189835626632 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.00036558699999744704, + "exception": null, + "family": "reverse_all", + "outermost": true, + "program_length": 46, + "wall_seconds": 0.0003671080048661679 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.0006191549999989832, + "exception": null, + "family": "error_trace", + "outermost": true, + "program_length": 47, + "wall_seconds": 0.0006208900013007224 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.00035314599999836105, + "exception": null, + "family": "reverse_all", + "outermost": true, + "program_length": 47, + "wall_seconds": 0.00035462298546917737 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.0005804040000008115, + "exception": null, + "family": "error_trace", + "outermost": true, + "program_length": 48, + "wall_seconds": 0.0005820700025651604 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.0003381469999972353, + "exception": null, + "family": "reverse_all", + "outermost": true, + "program_length": 48, + "wall_seconds": 0.00034028998925350606 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.0006347590000004288, + "exception": null, + "family": "error_trace", + "outermost": true, + "program_length": 49, + "wall_seconds": 0.0006366260058712214 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.0003806960000005688, + "exception": null, + "family": "reverse_all", + "outermost": true, + "program_length": 49, + "wall_seconds": 0.0003823380102403462 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.0006646980000013514, + "exception": null, + "family": "error_trace", + "outermost": true, + "program_length": 50, + "wall_seconds": 0.0006662849918939173 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.00037217599999905815, + "exception": null, + "family": "reverse_all", + "outermost": true, + "program_length": 50, + "wall_seconds": 0.00037373299710452557 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.0007132340000026716, + "exception": null, + "family": "error_trace", + "outermost": true, + "program_length": 51, + "wall_seconds": 0.0007149899902287871 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.0004019960000007927, + "exception": null, + "family": "reverse_all", + "outermost": true, + "program_length": 51, + "wall_seconds": 0.00040360799175687134 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.0006844319999999016, + "exception": null, + "family": "error_trace", + "outermost": true, + "program_length": 52, + "wall_seconds": 0.0006863849994260818 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.00037204099999854634, + "exception": null, + "family": "reverse_all", + "outermost": true, + "program_length": 52, + "wall_seconds": 0.0003735939972102642 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.0006140389999984563, + "exception": null, + "family": "error_trace", + "outermost": true, + "program_length": 53, + "wall_seconds": 0.0006155809969641268 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.0003599980000004166, + "exception": null, + "family": "reverse_all", + "outermost": true, + "program_length": 53, + "wall_seconds": 0.0003614879969973117 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.0007541029999984517, + "exception": null, + "family": "error_trace", + "outermost": true, + "program_length": 54, + "wall_seconds": 0.0007557990029454231 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.00045773399999760045, + "exception": null, + "family": "reverse_all", + "outermost": true, + "program_length": 54, + "wall_seconds": 0.0004591410106513649 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.0007229100000003541, + "exception": null, + "family": "error_trace", + "outermost": true, + "program_length": 55, + "wall_seconds": 0.000724475015886128 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.0003985819999989815, + "exception": null, + "family": "reverse_all", + "outermost": true, + "program_length": 55, + "wall_seconds": 0.0003999430045951158 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.0007212849999973514, + "exception": null, + "family": "error_trace", + "outermost": true, + "program_length": 56, + "wall_seconds": 0.0007231429917737842 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.00038292700000042146, + "exception": null, + "family": "reverse_all", + "outermost": true, + "program_length": 56, + "wall_seconds": 0.0003844439925160259 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.0008024509999984275, + "exception": null, + "family": "error_trace", + "outermost": true, + "program_length": 57, + "wall_seconds": 0.0008041580149438232 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.00040003499999841097, + "exception": null, + "family": "reverse_all", + "outermost": true, + "program_length": 57, + "wall_seconds": 0.00040146801620721817 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.0009311499999995476, + "exception": null, + "family": "error_trace", + "outermost": true, + "program_length": 58, + "wall_seconds": 0.0009328779997304082 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.0004957419999982449, + "exception": null, + "family": "reverse_all", + "outermost": true, + "program_length": 58, + "wall_seconds": 0.0004973300092387944 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.0008640409999998155, + "exception": null, + "family": "error_trace", + "outermost": true, + "program_length": 59, + "wall_seconds": 0.0008656879945192486 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.0004302980000012724, + "exception": null, + "family": "reverse_all", + "outermost": true, + "program_length": 59, + "wall_seconds": 0.0004319259896874428 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.0009355430000006493, + "exception": null, + "family": "error_trace", + "outermost": true, + "program_length": 60, + "wall_seconds": 0.0009370930201839656 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.0005227119999986485, + "exception": null, + "family": "reverse_all", + "outermost": true, + "program_length": 60, + "wall_seconds": 0.000524084985954687 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.000801855999998935, + "exception": null, + "family": "error_trace", + "outermost": true, + "program_length": 61, + "wall_seconds": 0.0008034810016397387 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.0004594509999975571, + "exception": null, + "family": "reverse_all", + "outermost": true, + "program_length": 61, + "wall_seconds": 0.0004611089825630188 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.0010093320000024164, + "exception": null, + "family": "error_trace", + "outermost": true, + "program_length": 62, + "wall_seconds": 0.001011182990623638 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.000521484999996602, + "exception": null, + "family": "reverse_all", + "outermost": true, + "program_length": 62, + "wall_seconds": 0.0005231040122453123 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.0009533130000001222, + "exception": null, + "family": "error_trace", + "outermost": true, + "program_length": 63, + "wall_seconds": 0.0009551009861752391 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.0005033559999993997, + "exception": null, + "family": "reverse_all", + "outermost": true, + "program_length": 63, + "wall_seconds": 0.0005049110040999949 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.0008759749999995847, + "exception": null, + "family": "error_trace", + "outermost": true, + "program_length": 64, + "wall_seconds": 0.0008778490009717643 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.0004851190000003669, + "exception": null, + "family": "reverse_all", + "outermost": true, + "program_length": 64, + "wall_seconds": 0.00048672399134375155 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.0011565579999981423, + "exception": null, + "family": "error_trace", + "outermost": true, + "program_length": 65, + "wall_seconds": 0.001158358994871378 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.0005371259999975564, + "exception": null, + "family": "reverse_all", + "outermost": true, + "program_length": 65, + "wall_seconds": 0.0005385729891713709 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.0011456480000013869, + "exception": null, + "family": "error_trace", + "outermost": true, + "program_length": 66, + "wall_seconds": 0.001147719012806192 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.0005801260000026787, + "exception": null, + "family": "reverse_all", + "outermost": true, + "program_length": 66, + "wall_seconds": 0.0005938370013609529 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.0009714560000020356, + "exception": null, + "family": "error_trace", + "outermost": true, + "program_length": 67, + "wall_seconds": 0.000973180023720488 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.0005081800000006353, + "exception": null, + "family": "reverse_all", + "outermost": true, + "program_length": 67, + "wall_seconds": 0.0005096539971418679 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.0009652819999992346, + "exception": null, + "family": "error_trace", + "outermost": true, + "program_length": 68, + "wall_seconds": 0.000991638022242114 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.0004665060000021981, + "exception": null, + "family": "reverse_all", + "outermost": true, + "program_length": 68, + "wall_seconds": 0.00046804899466224015 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.000895700000000943, + "exception": null, + "family": "error_trace", + "outermost": true, + "program_length": 69, + "wall_seconds": 0.0008975160017143935 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.0004653129999994121, + "exception": null, + "family": "reverse_all", + "outermost": true, + "program_length": 69, + "wall_seconds": 0.0004668269830290228 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.0008054810000004409, + "exception": null, + "family": "error_trace", + "outermost": true, + "program_length": 70, + "wall_seconds": 0.000807060016086325 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.0004457010000002981, + "exception": null, + "family": "reverse_all", + "outermost": true, + "program_length": 70, + "wall_seconds": 0.00044724601320922375 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.0008873069999992822, + "exception": null, + "family": "error_trace", + "outermost": true, + "program_length": 71, + "wall_seconds": 0.0008890499884728342 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.0005177230000015243, + "exception": null, + "family": "reverse_all", + "outermost": true, + "program_length": 71, + "wall_seconds": 0.0005194690020289272 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.0009829499999973734, + "exception": null, + "family": "error_trace", + "outermost": true, + "program_length": 72, + "wall_seconds": 0.0009845379972830415 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.0005426279999980466, + "exception": null, + "family": "reverse_all", + "outermost": true, + "program_length": 72, + "wall_seconds": 0.0005442629917524755 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.0008931889999992393, + "exception": null, + "family": "error_trace", + "outermost": true, + "program_length": 73, + "wall_seconds": 0.0008950020128395408 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.0005082499999993217, + "exception": null, + "family": "reverse_all", + "outermost": true, + "program_length": 73, + "wall_seconds": 0.0005098290275782347 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.000977463999998207, + "exception": null, + "family": "error_trace", + "outermost": true, + "program_length": 74, + "wall_seconds": 0.0009792600176297128 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.0005312150000023053, + "exception": null, + "family": "reverse_all", + "outermost": true, + "program_length": 74, + "wall_seconds": 0.0005327419785317034 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.00015259899999975346, + "exception": null, + "family": "error_trace", + "outermost": true, + "program_length": 5, + "wall_seconds": 0.00015424098819494247 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 8.160500000187199e-05, + "exception": null, + "family": "reverse_all", + "outermost": true, + "program_length": 5, + "wall_seconds": 8.292400161735713e-05 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.00014379699999977902, + "exception": null, + "family": "error_trace", + "outermost": true, + "program_length": 6, + "wall_seconds": 0.00014516498777084053 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 7.52689999998779e-05, + "exception": null, + "family": "reverse_all", + "outermost": true, + "program_length": 6, + "wall_seconds": 7.656199159100652e-05 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.0001336670000000595, + "exception": null, + "family": "error_trace", + "outermost": true, + "program_length": 7, + "wall_seconds": 0.00013516200124286115 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 7.598000000186289e-05, + "exception": null, + "family": "reverse_all", + "outermost": true, + "program_length": 7, + "wall_seconds": 7.720600115135312e-05 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.00015224900000276875, + "exception": null, + "family": "error_trace", + "outermost": true, + "program_length": 8, + "wall_seconds": 0.00015357602387666702 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 8.422000000152252e-05, + "exception": null, + "family": "reverse_all", + "outermost": true, + "program_length": 8, + "wall_seconds": 8.539101690985262e-05 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.00015739499999867235, + "exception": null, + "family": "error_trace", + "outermost": true, + "program_length": 9, + "wall_seconds": 0.00015879998682066798 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 9.448700000191934e-05, + "exception": null, + "family": "reverse_all", + "outermost": true, + "program_length": 9, + "wall_seconds": 9.571699774824083e-05 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.0001509569999988969, + "exception": null, + "family": "error_trace", + "outermost": true, + "program_length": 10, + "wall_seconds": 0.0001523930113762617 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 9.209099999907266e-05, + "exception": null, + "family": "reverse_all", + "outermost": true, + "program_length": 10, + "wall_seconds": 9.332399349659681e-05 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.00018066700000218816, + "exception": null, + "family": "error_trace", + "outermost": true, + "program_length": 11, + "wall_seconds": 0.00018207798711955547 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.00010734299999981545, + "exception": null, + "family": "reverse_all", + "outermost": true, + "program_length": 11, + "wall_seconds": 0.00010869998368434608 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.00018535000000241553, + "exception": null, + "family": "error_trace", + "outermost": true, + "program_length": 12, + "wall_seconds": 0.00018678398919291794 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.00010954599999735137, + "exception": null, + "family": "reverse_all", + "outermost": true, + "program_length": 12, + "wall_seconds": 0.00011085599544458091 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.0002038529999985883, + "exception": null, + "family": "error_trace", + "outermost": true, + "program_length": 13, + "wall_seconds": 0.00020534801296889782 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.0001108820000013111, + "exception": null, + "family": "reverse_all", + "outermost": true, + "program_length": 13, + "wall_seconds": 0.00011211499804630876 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.0002217120000018724, + "exception": null, + "family": "error_trace", + "outermost": true, + "program_length": 14, + "wall_seconds": 0.00022316499962471426 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.00011760499999979857, + "exception": null, + "family": "reverse_all", + "outermost": true, + "program_length": 14, + "wall_seconds": 0.00011889901361428201 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.0002598240000004637, + "exception": null, + "family": "error_trace", + "outermost": true, + "program_length": 15, + "wall_seconds": 0.00026135300868190825 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.00013238800000081596, + "exception": null, + "family": "reverse_all", + "outermost": true, + "program_length": 15, + "wall_seconds": 0.00013369799125939608 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.00025406099999969456, + "exception": null, + "family": "error_trace", + "outermost": true, + "program_length": 16, + "wall_seconds": 0.00025546300457790494 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.00013271199999920213, + "exception": null, + "family": "reverse_all", + "outermost": true, + "program_length": 16, + "wall_seconds": 0.00013409199891611934 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.0002568079999996087, + "exception": null, + "family": "error_trace", + "outermost": true, + "program_length": 17, + "wall_seconds": 0.0002582629967946559 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.00015575200000128575, + "exception": null, + "family": "reverse_all", + "outermost": true, + "program_length": 17, + "wall_seconds": 0.00015709002036601305 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.00023024399999727052, + "exception": null, + "family": "error_trace", + "outermost": true, + "program_length": 18, + "wall_seconds": 0.0002316450118087232 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.00014447600000266902, + "exception": null, + "family": "reverse_all", + "outermost": true, + "program_length": 18, + "wall_seconds": 0.0001458320184610784 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.0002840550000016151, + "exception": null, + "family": "error_trace", + "outermost": true, + "program_length": 19, + "wall_seconds": 0.0002855050261132419 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.00018312699999967208, + "exception": null, + "family": "reverse_all", + "outermost": true, + "program_length": 19, + "wall_seconds": 0.00018462497973814607 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.00031345799999726864, + "exception": null, + "family": "error_trace", + "outermost": true, + "program_length": 20, + "wall_seconds": 0.0003149470139760524 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.0001616579999996759, + "exception": null, + "family": "reverse_all", + "outermost": true, + "program_length": 20, + "wall_seconds": 0.00016296299872919917 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.00040074400000023047, + "exception": null, + "family": "error_trace", + "outermost": true, + "program_length": 21, + "wall_seconds": 0.00040234799962490797 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.0002005099999990989, + "exception": null, + "family": "reverse_all", + "outermost": true, + "program_length": 21, + "wall_seconds": 0.00020196198602207005 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.0003034070000005329, + "exception": null, + "family": "error_trace", + "outermost": true, + "program_length": 22, + "wall_seconds": 0.0003049529914278537 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.00024201699999792936, + "exception": null, + "family": "reverse_all", + "outermost": true, + "program_length": 22, + "wall_seconds": 0.0002440699900034815 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.00037885499999745775, + "exception": null, + "family": "error_trace", + "outermost": true, + "program_length": 23, + "wall_seconds": 0.0003806510067079216 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.00018845600000005902, + "exception": null, + "family": "reverse_all", + "outermost": true, + "program_length": 23, + "wall_seconds": 0.00018994699348695576 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.0003611219999974935, + "exception": null, + "family": "error_trace", + "outermost": true, + "program_length": 24, + "wall_seconds": 0.0003627039841376245 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.00019244699999987347, + "exception": null, + "family": "reverse_all", + "outermost": true, + "program_length": 24, + "wall_seconds": 0.00019382100435905159 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.00036277799999950844, + "exception": null, + "family": "error_trace", + "outermost": true, + "program_length": 25, + "wall_seconds": 0.0003643709933385253 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.00023032200000017156, + "exception": null, + "family": "reverse_all", + "outermost": true, + "program_length": 25, + "wall_seconds": 0.00023177798721008003 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.0005676549999975578, + "exception": null, + "family": "error_trace", + "outermost": true, + "program_length": 26, + "wall_seconds": 0.0005691930127795786 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.00030704399999947896, + "exception": null, + "family": "reverse_all", + "outermost": true, + "program_length": 26, + "wall_seconds": 0.00030844099819660187 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.00039996900000005553, + "exception": null, + "family": "error_trace", + "outermost": true, + "program_length": 27, + "wall_seconds": 0.0004015119920950383 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.0002251920000020391, + "exception": null, + "family": "reverse_all", + "outermost": true, + "program_length": 27, + "wall_seconds": 0.00022657000226899981 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.00046611999999868203, + "exception": null, + "family": "error_trace", + "outermost": true, + "program_length": 28, + "wall_seconds": 0.0004677840042859316 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.00026438699999786763, + "exception": null, + "family": "reverse_all", + "outermost": true, + "program_length": 28, + "wall_seconds": 0.00026571800117380917 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.00040834599999683974, + "exception": null, + "family": "error_trace", + "outermost": true, + "program_length": 29, + "wall_seconds": 0.0004099129873793572 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.00022373799999897415, + "exception": null, + "family": "reverse_all", + "outermost": true, + "program_length": 29, + "wall_seconds": 0.00022508000256493688 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.0003256799999995508, + "exception": null, + "family": "error_trace", + "outermost": true, + "program_length": 30, + "wall_seconds": 0.00032719000591896474 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.00019090900000051647, + "exception": null, + "family": "reverse_all", + "outermost": true, + "program_length": 30, + "wall_seconds": 0.00019222599803470075 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.0004873039999999662, + "exception": null, + "family": "error_trace", + "outermost": true, + "program_length": 31, + "wall_seconds": 0.0004889099800493568 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.00027466100000239635, + "exception": null, + "family": "reverse_all", + "outermost": true, + "program_length": 31, + "wall_seconds": 0.00027608999516814947 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.0005151330000003895, + "exception": null, + "family": "error_trace", + "outermost": true, + "program_length": 32, + "wall_seconds": 0.0005168509960640222 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.00029117700000114155, + "exception": null, + "family": "reverse_all", + "outermost": true, + "program_length": 32, + "wall_seconds": 0.00029256701236590743 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.0004471210000005499, + "exception": null, + "family": "error_trace", + "outermost": true, + "program_length": 33, + "wall_seconds": 0.0004486969846766442 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.00028580700000091497, + "exception": null, + "family": "reverse_all", + "outermost": true, + "program_length": 33, + "wall_seconds": 0.00029401600477285683 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.000540269999998344, + "exception": null, + "family": "error_trace", + "outermost": true, + "program_length": 34, + "wall_seconds": 0.000541912013432011 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.0003104100000008714, + "exception": null, + "family": "reverse_all", + "outermost": true, + "program_length": 34, + "wall_seconds": 0.00031177999335341156 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.0005327560000019105, + "exception": null, + "family": "error_trace", + "outermost": true, + "program_length": 35, + "wall_seconds": 0.0005431369936559349 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.00029573700000185, + "exception": null, + "family": "reverse_all", + "outermost": true, + "program_length": 35, + "wall_seconds": 0.00029710200033150613 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.0005220000000001335, + "exception": null, + "family": "error_trace", + "outermost": true, + "program_length": 36, + "wall_seconds": 0.0005236729921307415 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.00028518999999960215, + "exception": null, + "family": "reverse_all", + "outermost": true, + "program_length": 36, + "wall_seconds": 0.00028661798569373786 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.0005586720000003709, + "exception": null, + "family": "error_trace", + "outermost": true, + "program_length": 37, + "wall_seconds": 0.0005602489982265979 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.0003273259999971856, + "exception": null, + "family": "reverse_all", + "outermost": true, + "program_length": 37, + "wall_seconds": 0.0003287639992777258 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.0005172590000022126, + "exception": null, + "family": "error_trace", + "outermost": true, + "program_length": 38, + "wall_seconds": 0.0005187490023672581 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.0002770299999994563, + "exception": null, + "family": "reverse_all", + "outermost": true, + "program_length": 38, + "wall_seconds": 0.00027843101997859776 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.0005501119999991033, + "exception": null, + "family": "error_trace", + "outermost": true, + "program_length": 39, + "wall_seconds": 0.0005515750090125948 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.0002954970000033086, + "exception": null, + "family": "reverse_all", + "outermost": true, + "program_length": 39, + "wall_seconds": 0.0002970100031234324 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.0006926010000007921, + "exception": null, + "family": "error_trace", + "outermost": true, + "program_length": 40, + "wall_seconds": 0.0006946109933778644 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.00034711400000020376, + "exception": null, + "family": "reverse_all", + "outermost": true, + "program_length": 40, + "wall_seconds": 0.0003486709902063012 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.0005777209999990873, + "exception": null, + "family": "error_trace", + "outermost": true, + "program_length": 41, + "wall_seconds": 0.0005793180025648326 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.00035479099999946584, + "exception": null, + "family": "reverse_all", + "outermost": true, + "program_length": 41, + "wall_seconds": 0.00035663897870108485 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.0005956639999986635, + "exception": null, + "family": "error_trace", + "outermost": true, + "program_length": 42, + "wall_seconds": 0.0005979069974273443 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.0003422890000024381, + "exception": null, + "family": "reverse_all", + "outermost": true, + "program_length": 42, + "wall_seconds": 0.0003438080020714551 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.0006236490000013362, + "exception": null, + "family": "error_trace", + "outermost": true, + "program_length": 43, + "wall_seconds": 0.0006252790044527501 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.0005167059999990897, + "exception": null, + "family": "reverse_all", + "outermost": true, + "program_length": 43, + "wall_seconds": 0.0005189670191612095 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.0010927040000012767, + "exception": null, + "family": "error_trace", + "outermost": true, + "program_length": 44, + "wall_seconds": 0.0010976890043821186 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.00046655200000245145, + "exception": null, + "family": "reverse_all", + "outermost": true, + "program_length": 44, + "wall_seconds": 0.0004692859947681427 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.000704907999999449, + "exception": null, + "family": "error_trace", + "outermost": true, + "program_length": 45, + "wall_seconds": 0.0007071979925967753 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.0003584930000002373, + "exception": null, + "family": "reverse_all", + "outermost": true, + "program_length": 45, + "wall_seconds": 0.0003600630152504891 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.0005944920000011678, + "exception": null, + "family": "error_trace", + "outermost": true, + "program_length": 46, + "wall_seconds": 0.0005961139977443963 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.0003461359999974434, + "exception": null, + "family": "reverse_all", + "outermost": true, + "program_length": 46, + "wall_seconds": 0.0003475929843261838 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.0007127279999998848, + "exception": null, + "family": "error_trace", + "outermost": true, + "program_length": 47, + "wall_seconds": 0.0007143809925764799 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.0003941389999972955, + "exception": null, + "family": "reverse_all", + "outermost": true, + "program_length": 47, + "wall_seconds": 0.00039561299490742385 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.0006830660000005651, + "exception": null, + "family": "error_trace", + "outermost": true, + "program_length": 48, + "wall_seconds": 0.0006846199976280332 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.0003783589999990511, + "exception": null, + "family": "reverse_all", + "outermost": true, + "program_length": 48, + "wall_seconds": 0.0003797959943767637 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.0007999249999990354, + "exception": null, + "family": "error_trace", + "outermost": true, + "program_length": 49, + "wall_seconds": 0.0008015579951461405 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.00043738300000129016, + "exception": null, + "family": "reverse_all", + "outermost": true, + "program_length": 49, + "wall_seconds": 0.0004388770030345768 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.0007498149999989323, + "exception": null, + "family": "error_trace", + "outermost": true, + "program_length": 50, + "wall_seconds": 0.0007513450109399855 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.00036613900000048716, + "exception": null, + "family": "reverse_all", + "outermost": true, + "program_length": 50, + "wall_seconds": 0.00036753699532710016 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.0007951649999995425, + "exception": null, + "family": "error_trace", + "outermost": true, + "program_length": 51, + "wall_seconds": 0.0007966859848238528 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.0004382249999999033, + "exception": null, + "family": "reverse_all", + "outermost": true, + "program_length": 51, + "wall_seconds": 0.0004397610027808696 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.0007184680000023036, + "exception": null, + "family": "error_trace", + "outermost": true, + "program_length": 52, + "wall_seconds": 0.0007200730033218861 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.00038140400000230557, + "exception": null, + "family": "reverse_all", + "outermost": true, + "program_length": 52, + "wall_seconds": 0.0003829510242212564 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.0006821049999992113, + "exception": null, + "family": "error_trace", + "outermost": true, + "program_length": 53, + "wall_seconds": 0.000683632999425754 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.00038840400000239583, + "exception": null, + "family": "reverse_all", + "outermost": true, + "program_length": 53, + "wall_seconds": 0.0003898270078934729 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.0007169010000005471, + "exception": null, + "family": "error_trace", + "outermost": true, + "program_length": 54, + "wall_seconds": 0.0007185660069808364 + }, + { + "classification": "finite_fixture", + "cpu_seconds": 0.00037520199999718784, + "exception": null, + "family": "reverse_all", + "outermost": true, + "program_length": 54, + "wall_seconds": 0.0003766200097743422 + } + ], + "scope": "frozen PR5864 full_C qualifier; separate custody checks excluded as before", + "status": "PASS_ORIGINAL_INTEGER_BOUNDARY_DIAGNOSTIC", + "strictly_exceeds_zero_cost_threshold": { + "cpu": false, + "wall": false + } +} diff --git a/research/c-verification-feasibility/evidence/astra-next-boundary-cost-screen.md b/research/c-verification-feasibility/evidence/astra-next-boundary-cost-screen.md new file mode 100644 index 0000000000..69f5103326 --- /dev/null +++ b/research/c-verification-feasibility/evidence/astra-next-boundary-cost-screen.md @@ -0,0 +1,257 @@ +# One bounded reassessment: owned integer state and Fraction ideal control + +**Decision before the optional diagnostic: do not construct another route.** +The existing evidence does not establish enough headroom for a further 15% +complete PR5864 wall/CPU reduction. A per-invocation owned integer state is a +materially different boundary and merits, at most, one generous call-boundary +rejection screen. The proposed Fraction ideal loop-control variant is not +currently funded. Neither can borrow the stopped rational-arithmetic or thin +score-wrapper results as a qualified gain. + +This worker performed static source inspection only and wrote this report plus +`integer-owned-screen/diagnostic.py` at the parent's explicit further request. +No compiler, Python import, arithmetic/test/timing run, network/browser, Git +mutation or additional agent was used. The diagnostic source has not been +executed by this worker. Parent owns the single guarded runner and decides +whether remaining initial/shared budget funds its one execution. + +## Evidence that constrains the decision + +The first integer/format nomination preserved its recorded scientific outputs +but failed both the requested 15% threshold and the declared repeat-spread +noise gates. Its descriptive six-process median differences are not an admitted +increment and may not be credited as money already available to a new design. +The fixed comparison remains unchanged and will not be rerolled. + +The original complete instrumented profile records individual integer method +cumulative costs of 8.431 seconds (`error_trace`), 3.187 seconds (`reverse_all`) +and 2.622 seconds (`ideal`). It records Fraction `ideal` at 12.508 cumulative +seconds but only 0.756 self seconds, and its `add` helper at 4.422 cumulative / +1.003 self seconds. These are diagnostic observations, not unprofiled costs. +Do not sum the nested helper totals, scale the profile by the 33-second median, +or treat Fraction arithmetic retained inside `ideal` as removable loop cost. + +The first C candidate removed large Python sparse loops but added validation, +row copying and packet conversion. It does not establish whether those added +bills are a sufficiently large remaining target. No measured attribution +currently answers that question. The separate matrix workload result cannot +supply any contribution to this PR5864 target. + +## Candidate A: exact boundary for private owned integer state + +The only candidate boundary retained for screening is the ORIGINAL integer +module at source SHA256 +`82a73e4bcf1835bfdd510c7ad5538625c1b380c559b671e6a67be490615a743a`, +specifically `Engine.ideal`, `Engine.error_trace`, and `Engine.reverse_all`. +There would be one private native state per invocation, with no state or answer +reuse across these calls, across repeated words, across backends, or across +processes. The public Engine signatures and complete returned structures would +remain unchanged. + +The proposed mechanism is ownership, not another arithmetic wrapper: + +- Validate/snapshot a call's allowed immutable operation/weight descriptors + once. Allocate that call's private rows, columns, score triples and output + buffers once. Keep original word/setup rejection order and semantics. +- Traverse the program using the existing arbitrary-size Python integer + primitives and exact division checks. Mutate only privately owned state; + no external row dictionary can alias an internal row after admission. +- Remove repeated whole-row type scans and `PyDict_Copy` on every sparse + addition. Avoid returning a score tuple solely to convert it back to a + Python list at every event. Remove per-event ownership/crossing packets + where a whole method can run inside the owner. +- Keep full signed coefficient and score byte streams and required witness + snapshots. Integrate formatting inside the owned traversal; do not count + the already-tested formatting improvement a second time. +- Materialize the same built-in Fraction boundary values and ordinary output + containers at the same externally observable method boundaries. Retain + peak cuts, strict comparison/tie rules, Pareto order, frame/ownership checks, + all event counts and exact complete hash input. + +Original `coefficients`, `setup`, semantic frame helpers, arbitrary-size integer +operations, required Fraction materialization and final hashing/output remain +real work. Even if some of that work moves into C control, it cannot simply be +subtracted from the bill. The screen deliberately includes the entire method +calls, including these retained costs, to give the route the most generous +possible rejection envelope before implementing anything. + +The unchanged PR5864 Fraction numerical and bookkeeping route would remain a +fresh independently executed comparison. No new integer state, arithmetic +helper, coefficient result, normalization table or answer cache would enter +that route. New source/code bindings would select the candidate explicitly; +`integer_oracle_unchanged=True` would again be false for an implemented owner. + +## Candidate B: C control of Fraction ideal, with unchanged arithmetic + +The potential source boundary is `reference_precision.py:49` `ideal()` and, +only where called from that method, its row `add()` loop. It would leave every +actual Python Fraction operation, constructor call, operand, call order and +exception point unchanged. It could move only traversal/dispatch and private +container bookkeeping to C. For example, it must not eliminate the eager +`F(0)` argument in `dst.get(i, F(0))`, bypass `Fraction.__add__` dispatch with a +private `_add` shortcut, cache `abs(q)` calls, or replace the Fraction norm sum +with integer/rational arithmetic. Those would be different nominations. + +This is weaker headroom than its 12.508-second cumulative profile suggests: +most of that cumulative region consists of the arithmetic the premise requires +retaining. Built-in iteration, dict operations, sum/map, hashing and string +primitives also already have compiled portions. New C-to-Python arithmetic +calls and source/operation-order checks remain payable. There is no credible +current basis for attributing the approximately five required complete seconds +to removable control overhead in this region. + +Under the parent's stated numerical-oracle interpretation, a separately +declared C loop-control implementation could retain unchanged Python Fraction +numerical operations, but its control implementation would still be changed. +It must not be called an unchanged literal Fraction source path. Combining it +with changed integer control cannot silently claim either old control path is +untouched. If the acceptance boundary instead requires the full original +literal Fraction `ideal()` call to remain in the complete qualifier, that call +must execute in addition and its whole cost is paid; the proposed replacement +then does not earn that original call's runtime as a saving. + +For this bounded reassessment, Candidate B is deferred without construction. +Do not enlarge Candidate A's eligible bill by adding the whole Fraction ideal +cumulative time. Do not initiate a separate timer/variant search for Candidate B +because the integer screen disappoints. + +## Complete new validation and cost bill + +A new owner cannot inherit a PASS merely from the return-a-fresh-row prototype. +At minimum its complete candidate must retain/pay the following: + +1. The original PR5864 full qualifier, 118 inherited/native controls, 27 + Observation labels, original 120 differential programs, all actual + 25,984 events / 799 coordinates, ideal/weight/error results, full signed + witnesses, reverse/literal checks and all existing source/integer rejections. + The unchanged four custody checks stay separately registered and must run + fresh, as in the baseline; they do not become a hidden omitted obligation. +2. Current signed row/score/format cases, 8,192-bit integers, exact division + rejection, canonical zero/sign/denominator/order bytes, alias and foreign-type + rejections. Tests remain active in normal and optimized Python processes. +3. New owner lifecycle controls: fresh invocation identity, no cross-call + answers, no private mutable row escape, returned mutation isolation, + aliased input snapshots, empty rows, cancellation/reinsertion ordering, + interrupted/failed run cleanup, closed/reused owner rejection if exposed, + reentry rules and stable-runtime fallback semantics. +4. Every newly moved event-control branch and its original exception order: + INIT/CLEAR/MOVE ownership, COPY preconditions, ADD/SCALE signs and exact + division, rounded residual insertion, earliest strict peak, final-role + tie-breaking, Pareto sorting, every reverse event and every witness snapshot. + Compare complete prefixes on declared fixtures, not selected scores alone. +5. Memory/reference ownership and overflow-safe buffer allocation; full RSS + accounting for owned plans, rows, snapshots and byte buffers. No fixed-width + coefficient shortcut, raised resource limit, or unsampled allocation claim. +6. Exact source/binder/runtime identities on the supported CPython platforms, + fresh code build/link/load, all native bookkeeping, input/output conversion, + serialization, registration, normal/O, read-only export and publication + verification. Compiler-child CPU and fresh controls are part of the bill. + +Candidate B would additionally need source-bound operation-order equivalence +for the original Fraction operations, constructor/default/closure checks, +well-formed ideal-program fixtures beyond error-only random fixtures, and +explicit independent comparison of all ideal outputs and malformed-event +rejections. Any extra original actual ideal run needed to retain the oracle +belongs in its bill. Nothing here prices that cost as zero for admission. + +## Necessary break-even, fixed before the diagnostic + +For each metric independently, let: + +- B be the already chosen frozen current-round baseline median: + wall 34.66178539200337 seconds; CPU 34.47 seconds. +- U be the diagnostic's disjoint union of original selected integer Engine + call intervals across that complete qualifier, including rejected controls + and finite cases actually touched by the proposed boundary. +- R be runtime retained or introduced inside the replacement boundary. +- A be every added outside-boundary cost: source/runtime/owner checks, cold + compiler/link/load, extra finite/independence checks and conversions. +- N be the declared noise requirement. This rejection screen uses the frozen + observed maximum spreads, wall 2.713637237990042 seconds and CPU 2.35 seconds, + plus the original 0.50-second floor. A later candidate still faces its own + complete repeat/noise gate; this diagnostic cannot waive it. + +The necessary complete saving is + +```text +saving = U - R - A +saving >= 0.15 * B +saving > max(0.50 seconds, applicable complete repeat spread) +``` + +A deliberately optimistic necessary screen sets R=A=0. Since a real +replacement necessarily does some positive work, U must strictly exceed +`max(0.15*B, 0.50, frozen_spread)` in **both** wall and CPU to avoid immediate +engineering rejection. Failure in either metric stops this nomination before +construction. This is a necessary screen, not a sufficient construction gate. +Passing leaves R, A and future repeat noise unpriced and does not authorize +another implementation automatically. + +U is a generous observed call-boundary envelope, not a mathematical upper +bound on every machine or future scheduling condition. A one-run rejection is +a predeclared engineering stop for this nomination. It is not a universal +obstruction. This diagnostic is not a replacement performance sample and does +not enter or repair the earlier BCCBBC series. + +## Source-only one-run diagnostic delivered + +File: `integer-owned-screen/diagnostic.py`. +Handoff SHA256: +`4efeb040398c6d5204d552b6211e5a99aa3a3cb156ca422f05fbf0edd58e817b`. + +Proposed parent-owned guarded invocation, from the round directory: + +```sh +python3 integer-owned-screen/diagnostic.py +``` + +The script pins the original PR5864 `full.py` at +`ce6f15ca892db095d4b9f79b58cb3c199b18da341def761c577cc8651abc0cc0`, +retains its existing native Fraction adaptation, and injects only a local +constructor facade at the authenticated original integer-load seam. The loaded +original module, original Engine class/functions/globals and all archive bytes +remain unchanged. All original complete qualifier stdout/receipts and the +existing compiler cost remain. No scientific method is executed a second time +for timing or classification. + +Timers use `perf_counter` and the current process CPU clock directly around +original Engine calls. A depth counter counts only outer intervals in U, +preventing nested double counting. Source inspection says these three original +methods do not recursively call each other; the diagnostic additionally asserts +all captured boundaries are disjoint. It expects ideal=4, error_trace=121, +reverse_all=121, matching the frozen selected family. Metadata classifies +actual-word calls by the original digest, finite fixtures, and modified-word +controls outside the eligible intervals and includes input program lengths. +Returned objects pass through unchanged and callee exceptions are re-raised; +classification has a separate failure record and no scientific acceptance role. + +The script emits 246 per-call boundary records and the fixed zero-cost screen. +It reports current-process CPU inside original integer methods, which spawn no +compiler. The parent's outer GNU time remains responsible for complete process +CPU including the unchanged native compiler children. Extra diagnostic digest, +timing and JSON output overhead is not a potential optimization saving and is +outside U where possible. Some clock-call overhead remains inside the envelope, +making it deliberately generous. The diagnostic's outer duration is not a new +unprofiled performance claim. + +The script performs the same complete frozen qualifier scope as original +PR5864 `full_C.py`, not the longer portable replay-driver command with separate +custody execution. It cannot share prior finite PASS receipts or skip any +scientific check to fit the budget. If the parent's remaining initial/shared +budget cannot fund it, preserve the source unrun; do not rush an alternate +shortened workload or retry automatically. + +## Stop recommendation + +Without this one optional diagnostic, stop: existing evidence does not fund +construction. If its zero-cost ceiling fails either metric, stop this owned +integer nomination and record that bounded reason. If the ceiling passes, +record only that the necessary envelope did not reject it; the current round +still has no priced positive case for the owner, and no Fraction-control +headroom has been established. Do not convert that ambiguity into an endless +sequence of smaller variants, repeated measurements or reopened arithmetic +nominations. Any future construction would require a separately declared, +complete R+A estimate and an affirmative bounded gate. + +This reassessment changes neither the failed primary performance result nor +the separate matrix result. No new optimization has been constructed here. diff --git a/research/c-verification-feasibility/evidence/publication/readonly-compatibility/receipt.json b/research/c-verification-feasibility/evidence/publication/readonly-compatibility/receipt.json new file mode 100644 index 0000000000..5fb73c3e1c --- /dev/null +++ b/research/c-verification-feasibility/evidence/publication/readonly-compatibility/receipt.json @@ -0,0 +1,26 @@ +{ + "exit": 0, + "label": "feasibility-readonly-compatibility", + "optimized": false, + "platform": "Linux-7.0.0-38-generic-x86_64-with-glibc2.39", + "python": "3.12.3 (main, Aug 31 2026, 10:18:26) [GCC 13.3.0]", + "runner_sha256": "7540f8cc4ae4d12ed86c844ef0837a74184d3ada653979608c295c09f200a751", + "runtime_policy_sha256": "24f54273dae5ebe4e33f7898e4fd40a4e84235611ea1c1fb73b5b43f6ce92bc3", + "sampled_process_group_rss_bytes": 105222144, + "script": "stages/readonly-feasibility-v2/run.py", + "source_bytes_and_modes_unchanged": true, + "source_inventory_sha256": "f2a90b3c3087d1a8f465732519236f69181857814dc9cbeaa3228d92bd118923", + "status": "PASS", + "stderr_bytes": 0, + "stderr_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stdout_bytes": 18768, + "stdout_sha256": "310bd090080b7c1a93131383df323f592d8588ea7296bce9d00811db94e85aac", + "termination": null, + "usage": { + "exit": 0, + "kernel_max_rss_kib": 48668, + "system_seconds": 0.41, + "user_seconds": 5.81 + }, + "wall_seconds": 6.288718279014574 +} diff --git a/research/c-verification-feasibility/evidence/publication/readonly-compatibility/stderr.txt b/research/c-verification-feasibility/evidence/publication/readonly-compatibility/stderr.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/research/c-verification-feasibility/evidence/publication/readonly-compatibility/stdout.txt b/research/c-verification-feasibility/evidence/publication/readonly-compatibility/stdout.txt new file mode 100644 index 0000000000..f184ed8b04 --- /dev/null +++ b/research/c-verification-feasibility/evidence/publication/readonly-compatibility/stdout.txt @@ -0,0 +1,21 @@ +PASS_PRECISION_LINUX_SOURCE_CONTROLS {"contract": "declared contract edits", "declared_edit": "unique backend seam", "inner_archive": "source hash", "official_export_byte": "Exact PR5831 bundle"} +{"all_complete_values_and_types_equal": true, "cases": 241, "controls": ["returned-mutation-isolated", "source-drift", "Fraction-type-drift", "module-byte-drift", "live-code-drift", "nested-live-code-drift", "omitted-witness", "omitted-rounded-sites", "wrong-coefficient", "wrong-weighted-increment", "bad-role", "bad-scalar", "missing-weight", "restore-success", "restore-exception", "fresh-derivation", "key-field-0", "key-field-1", "key-field-2", "key-field-3", "key-field-4", "FIFO-eviction", "canonical-key", "hash-collision", "disabled", "invalid-capacity--1", "invalid-capacity-16385", "invalid-capacity-True", "invalid-capacity-1.5", "uncached-exception-0", "uncached-exception-1", "fresh-call-table", "stats-mutation", "failed-call-clears-stats"], "events": 10164, "status": "PASS_FINITE_FRACTION_TABLE_FEASIBILITY"} +{"all_coverage_preserved": true, "inherited": {"all_complete_values_and_types_equal": true, "cases": 241, "controls": ["returned-mutation-isolated", "source-drift", "Fraction-type-drift", "module-byte-drift", "live-code-drift", "nested-live-code-drift", "omitted-witness", "omitted-rounded-sites", "wrong-coefficient", "wrong-weighted-increment", "bad-role", "bad-scalar", "missing-weight", "restore-success", "restore-exception", "fresh-derivation", "key-field-0", "key-field-1", "key-field-2", "key-field-3", "key-field-4", "FIFO-eviction", "canonical-key", "hash-collision", "disabled", "invalid-capacity--1", "invalid-capacity-16385", "invalid-capacity-True", "invalid-capacity-1.5", "uncached-exception-0", "uncached-exception-1", "fresh-call-table", "stats-mutation", "failed-call-clears-stats"], "events": 10164, "status": "PASS_FINITE_FRACTION_TABLE_FEASIBILITY"}, "new_control_count": 20, "new_controls": ["all-241-fixtures-take-certified-domain", "subtypes-and-foreign-types-fall-back-without-custom-methods", "metaclass-container", "metaclass-scalar", "original-fallback-dict-subclass", "original-fallback-program-subclass", "original-fallback-event-subclass", "original-fallback-weights-subclass", "original-fallback-row-subclass", "original-fallback-rounded-subclass", "original-fallback-Fraction-subclass", "original-fallback-integer-weights", "original-fallback-boolean-public", "exact-internal-type-preservation-at-certified-updates", "malformed-outcome-missing-weight", "malformed-outcome-bad-role", "malformed-outcome-bad-scalar", "malformed-outcome-short-event", "recertification-invalidates-certified-method", "disabled-capacity-not-certified"], "status": "PASS_TYPE_GATE_FINITE_FEASIBILITY"} +{"all_coverage_preserved": true, "inherited": {"all_coverage_preserved": true, "inherited": {"all_complete_values_and_types_equal": true, "cases": 241, "controls": ["returned-mutation-isolated", "source-drift", "Fraction-type-drift", "module-byte-drift", "live-code-drift", "nested-live-code-drift", "omitted-witness", "omitted-rounded-sites", "wrong-coefficient", "wrong-weighted-increment", "bad-role", "bad-scalar", "missing-weight", "restore-success", "restore-exception", "fresh-derivation", "key-field-0", "key-field-1", "key-field-2", "key-field-3", "key-field-4", "FIFO-eviction", "canonical-key", "hash-collision", "disabled", "invalid-capacity--1", "invalid-capacity-16385", "invalid-capacity-True", "invalid-capacity-1.5", "uncached-exception-0", "uncached-exception-1", "fresh-call-table", "stats-mutation", "failed-call-clears-stats"], "events": 10164, "status": "PASS_FINITE_FRACTION_TABLE_FEASIBILITY"}, "new_control_count": 20, "new_controls": ["all-241-fixtures-take-certified-domain", "subtypes-and-foreign-types-fall-back-without-custom-methods", "metaclass-container", "metaclass-scalar", "original-fallback-dict-subclass", "original-fallback-program-subclass", "original-fallback-event-subclass", "original-fallback-weights-subclass", "original-fallback-row-subclass", "original-fallback-rounded-subclass", "original-fallback-Fraction-subclass", "original-fallback-integer-weights", "original-fallback-boolean-public", "exact-internal-type-preservation-at-certified-updates", "malformed-outcome-missing-weight", "malformed-outcome-bad-role", "malformed-outcome-bad-scalar", "malformed-outcome-short-event", "recertification-invalidates-certified-method", "disabled-capacity-not-certified"], "status": "PASS_TYPE_GATE_FINITE_FEASIBILITY"}, "new_control_count": 9, "new_controls": ["canonical-full-pair-tokens", "weight-token-hash-collision", "bounded-context-overflow", "event-q-canonical-equality-and-FIFO-counters", "six-complete-trace-counter-and-type-comparisons", "source-site-weight-ownership", "wrong-token-alias-detected", "overflow-fallback-preserves-original", "fresh-token-and-cache-lifetimes"], "status": "PASS_COMPACT_KEY_FINITE_ONLY"} +{"all_coverage_preserved": true, "inherited": {"all_coverage_preserved": true, "inherited": {"all_coverage_preserved": true, "inherited": {"all_complete_values_and_types_equal": true, "cases": 241, "controls": ["returned-mutation-isolated", "source-drift", "Fraction-type-drift", "module-byte-drift", "live-code-drift", "nested-live-code-drift", "omitted-witness", "omitted-rounded-sites", "wrong-coefficient", "wrong-weighted-increment", "bad-role", "bad-scalar", "missing-weight", "restore-success", "restore-exception", "fresh-derivation", "key-field-0", "key-field-1", "key-field-2", "key-field-3", "key-field-4", "FIFO-eviction", "canonical-key", "hash-collision", "disabled", "invalid-capacity--1", "invalid-capacity-16385", "invalid-capacity-True", "invalid-capacity-1.5", "uncached-exception-0", "uncached-exception-1", "fresh-call-table", "stats-mutation", "failed-call-clears-stats"], "events": 10164, "status": "PASS_FINITE_FRACTION_TABLE_FEASIBILITY"}, "new_control_count": 20, "new_controls": ["all-241-fixtures-take-certified-domain", "subtypes-and-foreign-types-fall-back-without-custom-methods", "metaclass-container", "metaclass-scalar", "original-fallback-dict-subclass", "original-fallback-program-subclass", "original-fallback-event-subclass", "original-fallback-weights-subclass", "original-fallback-row-subclass", "original-fallback-rounded-subclass", "original-fallback-Fraction-subclass", "original-fallback-integer-weights", "original-fallback-boolean-public", "exact-internal-type-preservation-at-certified-updates", "malformed-outcome-missing-weight", "malformed-outcome-bad-role", "malformed-outcome-bad-scalar", "malformed-outcome-short-event", "recertification-invalidates-certified-method", "disabled-capacity-not-certified"], "status": "PASS_TYPE_GATE_FINITE_FEASIBILITY"}, "new_control_count": 9, "new_controls": ["canonical-full-pair-tokens", "weight-token-hash-collision", "bounded-context-overflow", "event-q-canonical-equality-and-FIFO-counters", "six-complete-trace-counter-and-type-comparisons", "source-site-weight-ownership", "wrong-token-alias-detected", "overflow-fallback-preserves-original", "fresh-token-and-cache-lifetimes"], "status": "PASS_COMPACT_KEY_FINITE_ONLY"}, "new_control_count": 10, "new_controls": ["changed-getter-invalidates", "changed-live-getter-code", "foreign-slot-probe-is-pure", "changed-attribute-lookup", "missing-attribute-handler-presence", "binding-restored", "slot-path-selected", "post-derive-getter-drift-literal-fallback", "uninitialized-unused-weight-fallback", "foreign-slot-value-fallback"], "status": "PASS_SLOT_KEY_FINITE_ONLY"} +{"all_coverage_preserved": true, "build": {"SOABI": "cpython-312-x86_64-linux-gnu", "binary_sha256": "644008abf381aa620728f6d4545a59af66afc89794cd365fc0b158dcd5b99293", "cold_build_load_wall_seconds": 0.311225101002492, "compiler": "/usr/bin/cc", "compiler_cpu_accounting": "outer GNU time user+system includes compiler children", "compiler_version": "cc (Ubuntu 13.3.0-6ubuntu2~24.04.1) 13.3.0", "extension_suffix": ".cpython-312-x86_64-linux-gnu.so", "flags": ["-O2", "-shared", "-fPIC", "-std=c11", "-Wall", "-Werror", "-I/usr/include/python3.12"], "python": "3.12.3 (main, Aug 31 2026, 10:18:26) [GCC 13.3.0]", "source_sha256": "78ed2e240ee40ce4989a4718e77e8b3967b092d2bf8c900124a26942c98a14cb"}, "inherited": {"all_coverage_preserved": true, "inherited": {"all_coverage_preserved": true, "inherited": {"all_coverage_preserved": true, "inherited": {"all_complete_values_and_types_equal": true, "cases": 241, "controls": ["returned-mutation-isolated", "source-drift", "Fraction-type-drift", "module-byte-drift", "live-code-drift", "nested-live-code-drift", "omitted-witness", "omitted-rounded-sites", "wrong-coefficient", "wrong-weighted-increment", "bad-role", "bad-scalar", "missing-weight", "restore-success", "restore-exception", "fresh-derivation", "key-field-0", "key-field-1", "key-field-2", "key-field-3", "key-field-4", "FIFO-eviction", "canonical-key", "hash-collision", "disabled", "invalid-capacity--1", "invalid-capacity-16385", "invalid-capacity-True", "invalid-capacity-1.5", "uncached-exception-0", "uncached-exception-1", "fresh-call-table", "stats-mutation", "failed-call-clears-stats"], "events": 10164, "status": "PASS_FINITE_FRACTION_TABLE_FEASIBILITY"}, "new_control_count": 20, "new_controls": ["all-241-fixtures-take-certified-domain", "subtypes-and-foreign-types-fall-back-without-custom-methods", "metaclass-container", "metaclass-scalar", "original-fallback-dict-subclass", "original-fallback-program-subclass", "original-fallback-event-subclass", "original-fallback-weights-subclass", "original-fallback-row-subclass", "original-fallback-rounded-subclass", "original-fallback-Fraction-subclass", "original-fallback-integer-weights", "original-fallback-boolean-public", "exact-internal-type-preservation-at-certified-updates", "malformed-outcome-missing-weight", "malformed-outcome-bad-role", "malformed-outcome-bad-scalar", "malformed-outcome-short-event", "recertification-invalidates-certified-method", "disabled-capacity-not-certified"], "status": "PASS_TYPE_GATE_FINITE_FEASIBILITY"}, "new_control_count": 9, "new_controls": ["canonical-full-pair-tokens", "weight-token-hash-collision", "bounded-context-overflow", "event-q-canonical-equality-and-FIFO-counters", "six-complete-trace-counter-and-type-comparisons", "source-site-weight-ownership", "wrong-token-alias-detected", "overflow-fallback-preserves-original", "fresh-token-and-cache-lifetimes"], "status": "PASS_COMPACT_KEY_FINITE_ONLY"}, "new_control_count": 10, "new_controls": ["changed-getter-invalidates", "changed-live-getter-code", "foreign-slot-probe-is-pure", "changed-attribute-lookup", "missing-attribute-handler-presence", "binding-restored", "slot-path-selected", "post-derive-getter-drift-literal-fallback", "uninitialized-unused-weight-fallback", "foreign-slot-value-fallback"], "status": "PASS_SLOT_KEY_FINITE_ONLY"}, "native_control_count": 45, "native_controls": ["canonical-keys-FIFO-wrap-counters", "native-hash-collision", "exact-one-callback-per-miss", "uncached-native-error-0", "uncached-native-error-1", "full-cache-failure-before-eviction", "cache-survives-callback-exception", "capacity-0", "capacity--1", "capacity-16385", "capacity-True", "capacity-1.5", "capacity-10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "index--1", "index-3", "index-10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "index-True", "index-0", "arity", "keywords", "exact-operand", "exact-scalar", "event-creation", "descriptor-protocol", "token-length", "token-range", "partial-init-length", "partial-init-weight", "callback-result-shape", "callback-result-type", "callback-reentry", "event-owns-parent", "GC-callback-cycle", "native-statistics-isolated", "native-coefficient-loop", "same-row-lowlevel-rejection", "dict-iterator-mutation-safe", "callback-list-mutation-safe", "native-source-authenticated", "callback-descriptor-is-pure", "plain-callback-rejected", "live-callback-code-drift", "owned-metadata-snapshot", "same-row-source-fallback", "malformed-scalar-literal-fallback"], "status": "PASS_NATIVE_FINITE_ONLY"} +PASS_FRACTION_NATIVE_FINITE_AND_CUSTODY +PASS_C_VERIFICATION_SCOPED_FINITE baseline +{"build": {"SOABI": "cpython-312-x86_64-linux-gnu", "binary_sha256": "d14fc8d5468c2286f0ade7b11135ef21085d8c46b2967f8bdbcd00b17258ca47", "cold_build_load_wall_seconds": 0.3306800250138622, "compiler": "/usr/bin/cc", "compiler_cpu_accounting": "parent outer process must include compiler children", "extension_suffix": ".cpython-312-x86_64-linux-gnu.so", "flags": ["-O2", "-shared", "-fPIC", "-std=c11", "-Wall", "-Werror", "-I/usr/include/python3.12"], "python": "3.12.3 (main, Aug 31 2026, 10:18:26) [GCC 13.3.0]", "source_sha256": "804cc25bd9ad0912de81fe97bc65b95ebcb0dec06453739e1d4863e7946c4f3d"}, "result": {"checks": ["eight-row-and-score-differentials", "aliased-inputs-return-fresh-outputs", "six-ordered-prefixes-and-complete-bytes", "zero-negative-large-reduced-and-ordered-formatting", "score-string-contract-distinct-from-coefficient-contract", "reverse-scores-signed-bytes-and-aliases", "bool-numerator", "foreign-int-value", "foreign-dict", "foreign-key", "float-value", "negative-exponent", "bool-exponent", "inexact-division-transaction", "inexact-scaled-row", "nondyadic-scale", "zero-scale", "negative-scale", "bool-scale", "short-score", "foreign-scores", "foreign-weight", "weight-index-range", "negative-weight-index", "reverse-index-range", "score-nondyadic-unit", "event-type"], "independent_fraction_formatting": true, "ordered_prefixes": 6, "row_cases": 8, "status": "PASS_FINITE_INTEGER_FORMAT", "timing_claim": false, "whole_replay": false}} +PASS_C_VERIFICATION_SCOPED_FINITE integer +{"build": {"SOABI": "cpython-312-x86_64-linux-gnu", "binary_sha256": "10f7d72601188d2ffff41dea397ef477ec37278e4ec192e91684c1cbaade1eb1", "cold_build_load_wall_seconds": 0.33824119399650954, "compiler": "/usr/bin/cc", "compiler_cpu_accounting": "parent outer process must include compiler children", "extension_suffix": ".cpython-312-x86_64-linux-gnu.so", "flags": ["-O2", "-shared", "-fPIC", "-std=c11", "-Wall", "-Werror", "-I/usr/include/python3.12"], "python": "3.12.3 (main, Aug 31 2026, 10:18:26) [GCC 13.3.0]", "source_sha256": "804cc25bd9ad0912de81fe97bc65b95ebcb0dec06453739e1d4863e7946c4f3d"}, "result": {"checks": ["eight-row-and-score-differentials", "aliased-inputs-return-fresh-outputs", "six-ordered-prefixes-and-complete-bytes", "zero-negative-large-reduced-and-ordered-formatting", "score-string-contract-distinct-from-coefficient-contract", "reverse-scores-signed-bytes-and-aliases", "bool-numerator", "foreign-int-value", "foreign-dict", "foreign-key", "float-value", "negative-exponent", "bool-exponent", "inexact-division-transaction", "inexact-scaled-row", "nondyadic-scale", "zero-scale", "negative-scale", "bool-scale", "short-score", "foreign-scores", "foreign-weight", "weight-index-range", "negative-weight-index", "reverse-index-range", "score-nondyadic-unit", "event-type"], "independent_fraction_formatting": true, "ordered_prefixes": 6, "row_cases": 8, "status": "PASS_FINITE_INTEGER_FORMAT", "timing_claim": false, "whole_replay": false}} +PASS_C_VERIFICATION_SCOPED_FINITE integer +{"python": "3.12.3 (main, Aug 31 2026, 10:18:26) [GCC 13.3.0]", "runtime_fraction_source_sha256": "cf33568f7b767f66896995a7a81cc662e8be226f2e58efb61d2028f64eb5d231", "scope": "rational-source-pin-diagnostic"} +{"actual_word_run": false, "added_controls": ["165-general-rational-coefficient-prefixes", "batch-FIFO-and-full-counters", "exact-score-type", "score-subclass", "negative-score-denominator", "same-row", "nonbuiltin-gcd", "source-iterator-mutation", "score-list-mutation", "score-value-mutation", "callback-failure-publishes-completed-prefix", "arithmetic-code-drift", "inplace-protocol-drift", "materialization-source-drift", "gcd-drift", "operator-closure-drift", "13-complete-event-prefixes-with-nondyadic-weights-and-scalars", "noncanonical-weight-fallback", "changed-arithmetic-fallback"], "build": {"SOABI": "cpython-312-x86_64-linux-gnu", "binary_sha256": "ffb010a3f951ac1c74c12b9a93c50cce68dd2923f2005c86d5f4ea2f51209486", "cold_build_load_wall_seconds": 0.44992048499989323, "compiler": "/usr/bin/cc", "compiler_cpu_accounting": "outer GNU time user+system includes compiler children", "compiler_version": "cc (Ubuntu 13.3.0-6ubuntu2~24.04.1) 13.3.0", "extension_suffix": ".cpython-312-x86_64-linux-gnu.so", "flags": ["-O2", "-shared", "-fPIC", "-std=c11", "-Wall", "-Werror", "-I/usr/include/python3.12"], "python": "3.12.3 (main, Aug 31 2026, 10:18:26) [GCC 13.3.0]", "source_sha256": "4a4949e36cff4ff2894dd1f9379b58a58346ec7c888903271d4b98bbe4cfc7ae"}, "comparisons": 178, "complete_performance": false, "control_count": 19, "independent_literal_oracle_used": true, "status": "PASS_BOUNDED_RATIONAL_PROTOTYPE_ONLY"} +PASS_ADDED_DESTRUCTOR_AND_UNKNOWN_SOURCE_BINDING_CONTROLS +PASS_C_VERIFICATION_SCOPED_FINITE rational +{"python": "3.12.3 (main, Aug 31 2026, 10:18:26) [GCC 13.3.0]", "runtime_fraction_source_sha256": "cf33568f7b767f66896995a7a81cc662e8be226f2e58efb61d2028f64eb5d231", "scope": "rational-source-pin-diagnostic"} +{"actual_word_run": false, "added_controls": ["165-general-rational-coefficient-prefixes", "batch-FIFO-and-full-counters", "exact-score-type", "score-subclass", "negative-score-denominator", "same-row", "nonbuiltin-gcd", "source-iterator-mutation", "score-list-mutation", "score-value-mutation", "callback-failure-publishes-completed-prefix", "arithmetic-code-drift", "inplace-protocol-drift", "materialization-source-drift", "gcd-drift", "operator-closure-drift", "13-complete-event-prefixes-with-nondyadic-weights-and-scalars", "noncanonical-weight-fallback", "changed-arithmetic-fallback"], "build": {"SOABI": "cpython-312-x86_64-linux-gnu", "binary_sha256": "6c3b357a3a2752f9501c89feaec0cf03d0c369ac4709517355f278a5ce70018a", "cold_build_load_wall_seconds": 0.4424143409996759, "compiler": "/usr/bin/cc", "compiler_cpu_accounting": "outer GNU time user+system includes compiler children", "compiler_version": "cc (Ubuntu 13.3.0-6ubuntu2~24.04.1) 13.3.0", "extension_suffix": ".cpython-312-x86_64-linux-gnu.so", "flags": ["-O2", "-shared", "-fPIC", "-std=c11", "-Wall", "-Werror", "-I/usr/include/python3.12"], "python": "3.12.3 (main, Aug 31 2026, 10:18:26) [GCC 13.3.0]", "source_sha256": "4a4949e36cff4ff2894dd1f9379b58a58346ec7c888903271d4b98bbe4cfc7ae"}, "comparisons": 178, "complete_performance": false, "control_count": 19, "independent_literal_oracle_used": true, "status": "PASS_BOUNDED_RATIONAL_PROTOTYPE_ONLY"} +PASS_ADDED_DESTRUCTOR_AND_UNKNOWN_SOURCE_BINDING_CONTROLS +PASS_C_VERIFICATION_SCOPED_FINITE rational +PASS_READONLY_GITFREE_ALL_FIVE_FINITE_COMMANDS diff --git a/research/c-verification-feasibility/evidence/publication/readonly-compatibility/usage.json b/research/c-verification-feasibility/evidence/publication/readonly-compatibility/usage.json new file mode 100644 index 0000000000..cd1275379a --- /dev/null +++ b/research/c-verification-feasibility/evidence/publication/readonly-compatibility/usage.json @@ -0,0 +1 @@ +{"user_seconds":5.81,"system_seconds":0.41,"kernel_max_rss_kib":48668,"exit":0} diff --git a/research/c-verification-feasibility/evidence/runs/integer-owned-boundary-v1/receipt.json b/research/c-verification-feasibility/evidence/runs/integer-owned-boundary-v1/receipt.json new file mode 100644 index 0000000000..7ce2e2dbab --- /dev/null +++ b/research/c-verification-feasibility/evidence/runs/integer-owned-boundary-v1/receipt.json @@ -0,0 +1,26 @@ +{ + "exit": 0, + "label": "integer-owned-boundary-v1", + "optimized": false, + "platform": "Linux-7.0.0-38-generic-x86_64-with-glibc2.39", + "python": "3.12.3 (main, Aug 31 2026, 10:18:26) [GCC 13.3.0]", + "runner_sha256": "7540f8cc4ae4d12ed86c844ef0837a74184d3ada653979608c295c09f200a751", + "runtime_policy_sha256": "aeb34b5beb1d87290de173cc233f027df0c7557db633751c6f555566f59ffa14", + "sampled_process_group_rss_bytes": 116543488, + "script": "stages/integer-owned-screen-v1/run.py", + "source_bytes_and_modes_unchanged": true, + "source_inventory_sha256": "ba2e6b4a07c1fac8752e3fdb69389288e3e015c0c9f4ca21e1914dc1ba09ccf9", + "status": "PASS", + "stderr_bytes": 0, + "stderr_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stdout_bytes": 64792, + "stdout_sha256": "dadf9a5bc0e75e1dee8d75d58498e7685578c0a59290b525fa83e45835230733", + "termination": null, + "usage": { + "exit": 0, + "kernel_max_rss_kib": 112360, + "system_seconds": 0.2, + "user_seconds": 31.54 + }, + "wall_seconds": 31.856106446008198 +} diff --git a/research/c-verification-feasibility/evidence/runs/integer-owned-boundary-v1/stderr.txt b/research/c-verification-feasibility/evidence/runs/integer-owned-boundary-v1/stderr.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/research/c-verification-feasibility/evidence/runs/integer-owned-boundary-v1/stdout.txt b/research/c-verification-feasibility/evidence/runs/integer-owned-boundary-v1/stdout.txt new file mode 100644 index 0000000000..628e0003f0 --- /dev/null +++ b/research/c-verification-feasibility/evidence/runs/integer-owned-boundary-v1/stdout.txt @@ -0,0 +1,10 @@ +{"all_complete_values_and_types_equal": true, "cases": 241, "controls": ["returned-mutation-isolated", "source-drift", "Fraction-type-drift", "module-byte-drift", "live-code-drift", "nested-live-code-drift", "omitted-witness", "omitted-rounded-sites", "wrong-coefficient", "wrong-weighted-increment", "bad-role", "bad-scalar", "missing-weight", "restore-success", "restore-exception", "fresh-derivation", "key-field-0", "key-field-1", "key-field-2", "key-field-3", "key-field-4", "FIFO-eviction", "canonical-key", "hash-collision", "disabled", "invalid-capacity--1", "invalid-capacity-16385", "invalid-capacity-True", "invalid-capacity-1.5", "uncached-exception-0", "uncached-exception-1", "fresh-call-table", "stats-mutation", "failed-call-clears-stats"], "events": 10164, "status": "PASS_FINITE_FRACTION_TABLE_FEASIBILITY"} +{"all_coverage_preserved": true, "inherited": {"all_complete_values_and_types_equal": true, "cases": 241, "controls": ["returned-mutation-isolated", "source-drift", "Fraction-type-drift", "module-byte-drift", "live-code-drift", "nested-live-code-drift", "omitted-witness", "omitted-rounded-sites", "wrong-coefficient", "wrong-weighted-increment", "bad-role", "bad-scalar", "missing-weight", "restore-success", "restore-exception", "fresh-derivation", "key-field-0", "key-field-1", "key-field-2", "key-field-3", "key-field-4", "FIFO-eviction", "canonical-key", "hash-collision", "disabled", "invalid-capacity--1", "invalid-capacity-16385", "invalid-capacity-True", "invalid-capacity-1.5", "uncached-exception-0", "uncached-exception-1", "fresh-call-table", "stats-mutation", "failed-call-clears-stats"], "events": 10164, "status": "PASS_FINITE_FRACTION_TABLE_FEASIBILITY"}, "new_control_count": 20, "new_controls": ["all-241-fixtures-take-certified-domain", "subtypes-and-foreign-types-fall-back-without-custom-methods", "metaclass-container", "metaclass-scalar", "original-fallback-dict-subclass", "original-fallback-program-subclass", "original-fallback-event-subclass", "original-fallback-weights-subclass", "original-fallback-row-subclass", "original-fallback-rounded-subclass", "original-fallback-Fraction-subclass", "original-fallback-integer-weights", "original-fallback-boolean-public", "exact-internal-type-preservation-at-certified-updates", "malformed-outcome-missing-weight", "malformed-outcome-bad-role", "malformed-outcome-bad-scalar", "malformed-outcome-short-event", "recertification-invalidates-certified-method", "disabled-capacity-not-certified"], "status": "PASS_TYPE_GATE_FINITE_FEASIBILITY"} +{"all_coverage_preserved": true, "inherited": {"all_coverage_preserved": true, "inherited": {"all_complete_values_and_types_equal": true, "cases": 241, "controls": ["returned-mutation-isolated", "source-drift", "Fraction-type-drift", "module-byte-drift", "live-code-drift", "nested-live-code-drift", "omitted-witness", "omitted-rounded-sites", "wrong-coefficient", "wrong-weighted-increment", "bad-role", "bad-scalar", "missing-weight", "restore-success", "restore-exception", "fresh-derivation", "key-field-0", "key-field-1", "key-field-2", "key-field-3", "key-field-4", "FIFO-eviction", "canonical-key", "hash-collision", "disabled", "invalid-capacity--1", "invalid-capacity-16385", "invalid-capacity-True", "invalid-capacity-1.5", "uncached-exception-0", "uncached-exception-1", "fresh-call-table", "stats-mutation", "failed-call-clears-stats"], "events": 10164, "status": "PASS_FINITE_FRACTION_TABLE_FEASIBILITY"}, "new_control_count": 20, "new_controls": ["all-241-fixtures-take-certified-domain", "subtypes-and-foreign-types-fall-back-without-custom-methods", "metaclass-container", "metaclass-scalar", "original-fallback-dict-subclass", "original-fallback-program-subclass", "original-fallback-event-subclass", "original-fallback-weights-subclass", "original-fallback-row-subclass", "original-fallback-rounded-subclass", "original-fallback-Fraction-subclass", "original-fallback-integer-weights", "original-fallback-boolean-public", "exact-internal-type-preservation-at-certified-updates", "malformed-outcome-missing-weight", "malformed-outcome-bad-role", "malformed-outcome-bad-scalar", "malformed-outcome-short-event", "recertification-invalidates-certified-method", "disabled-capacity-not-certified"], "status": "PASS_TYPE_GATE_FINITE_FEASIBILITY"}, "new_control_count": 9, "new_controls": ["canonical-full-pair-tokens", "weight-token-hash-collision", "bounded-context-overflow", "event-q-canonical-equality-and-FIFO-counters", "six-complete-trace-counter-and-type-comparisons", "source-site-weight-ownership", "wrong-token-alias-detected", "overflow-fallback-preserves-original", "fresh-token-and-cache-lifetimes"], "status": "PASS_COMPACT_KEY_FINITE_ONLY"} +{"all_coverage_preserved": true, "inherited": {"all_coverage_preserved": true, "inherited": {"all_coverage_preserved": true, "inherited": {"all_complete_values_and_types_equal": true, "cases": 241, "controls": ["returned-mutation-isolated", "source-drift", "Fraction-type-drift", "module-byte-drift", "live-code-drift", "nested-live-code-drift", "omitted-witness", "omitted-rounded-sites", "wrong-coefficient", "wrong-weighted-increment", "bad-role", "bad-scalar", "missing-weight", "restore-success", "restore-exception", "fresh-derivation", "key-field-0", "key-field-1", "key-field-2", "key-field-3", "key-field-4", "FIFO-eviction", "canonical-key", "hash-collision", "disabled", "invalid-capacity--1", "invalid-capacity-16385", "invalid-capacity-True", "invalid-capacity-1.5", "uncached-exception-0", "uncached-exception-1", "fresh-call-table", "stats-mutation", "failed-call-clears-stats"], "events": 10164, "status": "PASS_FINITE_FRACTION_TABLE_FEASIBILITY"}, "new_control_count": 20, "new_controls": ["all-241-fixtures-take-certified-domain", "subtypes-and-foreign-types-fall-back-without-custom-methods", "metaclass-container", "metaclass-scalar", "original-fallback-dict-subclass", "original-fallback-program-subclass", "original-fallback-event-subclass", "original-fallback-weights-subclass", "original-fallback-row-subclass", "original-fallback-rounded-subclass", "original-fallback-Fraction-subclass", "original-fallback-integer-weights", "original-fallback-boolean-public", "exact-internal-type-preservation-at-certified-updates", "malformed-outcome-missing-weight", "malformed-outcome-bad-role", "malformed-outcome-bad-scalar", "malformed-outcome-short-event", "recertification-invalidates-certified-method", "disabled-capacity-not-certified"], "status": "PASS_TYPE_GATE_FINITE_FEASIBILITY"}, "new_control_count": 9, "new_controls": ["canonical-full-pair-tokens", "weight-token-hash-collision", "bounded-context-overflow", "event-q-canonical-equality-and-FIFO-counters", "six-complete-trace-counter-and-type-comparisons", "source-site-weight-ownership", "wrong-token-alias-detected", "overflow-fallback-preserves-original", "fresh-token-and-cache-lifetimes"], "status": "PASS_COMPACT_KEY_FINITE_ONLY"}, "new_control_count": 10, "new_controls": ["changed-getter-invalidates", "changed-live-getter-code", "foreign-slot-probe-is-pure", "changed-attribute-lookup", "missing-attribute-handler-presence", "binding-restored", "slot-path-selected", "post-derive-getter-drift-literal-fallback", "uninitialized-unused-weight-fallback", "foreign-slot-value-fallback"], "status": "PASS_SLOT_KEY_FINITE_ONLY"} +{"all_coverage_preserved": true, "build": {"SOABI": "cpython-312-x86_64-linux-gnu", "binary_sha256": "31abc2170757ffcd74bd8931a6c85c5d3269cfc8e65f9c25406b3479ba2259ba", "cold_build_load_wall_seconds": 0.32623240098473616, "compiler": "/usr/bin/cc", "compiler_cpu_accounting": "outer GNU time user+system includes compiler children", "compiler_version": "cc (Ubuntu 13.3.0-6ubuntu2~24.04.1) 13.3.0", "extension_suffix": ".cpython-312-x86_64-linux-gnu.so", "flags": ["-O2", "-shared", "-fPIC", "-std=c11", "-Wall", "-Werror", "-I/usr/include/python3.12"], "python": "3.12.3 (main, Aug 31 2026, 10:18:26) [GCC 13.3.0]", "source_sha256": "78ed2e240ee40ce4989a4718e77e8b3967b092d2bf8c900124a26942c98a14cb"}, "inherited": {"all_coverage_preserved": true, "inherited": {"all_coverage_preserved": true, "inherited": {"all_coverage_preserved": true, "inherited": {"all_complete_values_and_types_equal": true, "cases": 241, "controls": ["returned-mutation-isolated", "source-drift", "Fraction-type-drift", "module-byte-drift", "live-code-drift", "nested-live-code-drift", "omitted-witness", "omitted-rounded-sites", "wrong-coefficient", "wrong-weighted-increment", "bad-role", "bad-scalar", "missing-weight", "restore-success", "restore-exception", "fresh-derivation", "key-field-0", "key-field-1", "key-field-2", "key-field-3", "key-field-4", "FIFO-eviction", "canonical-key", "hash-collision", "disabled", "invalid-capacity--1", "invalid-capacity-16385", "invalid-capacity-True", "invalid-capacity-1.5", "uncached-exception-0", "uncached-exception-1", "fresh-call-table", "stats-mutation", "failed-call-clears-stats"], "events": 10164, "status": "PASS_FINITE_FRACTION_TABLE_FEASIBILITY"}, "new_control_count": 20, "new_controls": ["all-241-fixtures-take-certified-domain", "subtypes-and-foreign-types-fall-back-without-custom-methods", "metaclass-container", "metaclass-scalar", "original-fallback-dict-subclass", "original-fallback-program-subclass", "original-fallback-event-subclass", "original-fallback-weights-subclass", "original-fallback-row-subclass", "original-fallback-rounded-subclass", "original-fallback-Fraction-subclass", "original-fallback-integer-weights", "original-fallback-boolean-public", "exact-internal-type-preservation-at-certified-updates", "malformed-outcome-missing-weight", "malformed-outcome-bad-role", "malformed-outcome-bad-scalar", "malformed-outcome-short-event", "recertification-invalidates-certified-method", "disabled-capacity-not-certified"], "status": "PASS_TYPE_GATE_FINITE_FEASIBILITY"}, "new_control_count": 9, "new_controls": ["canonical-full-pair-tokens", "weight-token-hash-collision", "bounded-context-overflow", "event-q-canonical-equality-and-FIFO-counters", "six-complete-trace-counter-and-type-comparisons", "source-site-weight-ownership", "wrong-token-alias-detected", "overflow-fallback-preserves-original", "fresh-token-and-cache-lifetimes"], "status": "PASS_COMPACT_KEY_FINITE_ONLY"}, "new_control_count": 10, "new_controls": ["changed-getter-invalidates", "changed-live-getter-code", "foreign-slot-probe-is-pure", "changed-attribute-lookup", "missing-attribute-handler-presence", "binding-restored", "slot-path-selected", "post-derive-getter-drift-literal-fallback", "uninitialized-unused-weight-fallback", "foreign-slot-value-fallback"], "status": "PASS_SLOT_KEY_FINITE_ONLY"}, "native_control_count": 45, "native_controls": ["canonical-keys-FIFO-wrap-counters", "native-hash-collision", "exact-one-callback-per-miss", "uncached-native-error-0", "uncached-native-error-1", "full-cache-failure-before-eviction", "cache-survives-callback-exception", "capacity-0", "capacity--1", "capacity-16385", "capacity-True", "capacity-1.5", "capacity-10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "index--1", "index-3", "index-10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "index-True", "index-0", "arity", "keywords", "exact-operand", "exact-scalar", "event-creation", "descriptor-protocol", "token-length", "token-range", "partial-init-length", "partial-init-weight", "callback-result-shape", "callback-result-type", "callback-reentry", "event-owns-parent", "GC-callback-cycle", "native-statistics-isolated", "native-coefficient-loop", "same-row-lowlevel-rejection", "dict-iterator-mutation-safe", "callback-list-mutation-safe", "native-source-authenticated", "callback-descriptor-is-pure", "plain-callback-rejected", "live-callback-code-drift", "owned-metadata-snapshot", "same-row-source-fallback", "malformed-scalar-literal-fallback"], "status": "PASS_NATIVE_FINITE_ONLY"} +{"backends": 2, "controls": ["one-use", "closed-call", "missing", "duplicate", "changed-weights", "changed-rounding", "changed-word", "original-malformed-rejection", "propagated-exception", "failed-finish", "failed-take", "fresh-context-not-previous-pass", "aborted-take", "one-use", "closed-call", "missing", "duplicate", "changed-weights", "changed-rounding", "changed-word", "original-malformed-rejection", "propagated-exception", "failed-finish", "failed-take", "fresh-context-not-previous-pass", "aborted-take", "input-mutation"], "events": 5, "status": "PASS_FINITE_FEASIBILITY_ONLY"} +{"actual": {"output_sha256": "954c7448ff74d78753828e9623ad44c46da9e5ce459420b6e50a5d47294250b9", "statistics": {"bypasses": 0, "calls": 2579750, "capacity": 16384, "evictions": 310400, "hits": 2252966, "misses": 326784, "resident": 16384}, "tokens": 3587}, "build": {"SOABI": "cpython-312-x86_64-linux-gnu", "binary_sha256": "31abc2170757ffcd74bd8931a6c85c5d3269cfc8e65f9c25406b3479ba2259ba", "cold_build_load_wall_seconds": 0.32623240098473616, "compiler": "/usr/bin/cc", "compiler_cpu_accounting": "outer GNU time user+system includes compiler children", "compiler_version": "cc (Ubuntu 13.3.0-6ubuntu2~24.04.1) 13.3.0", "extension_suffix": ".cpython-312-x86_64-linux-gnu.so", "flags": ["-O2", "-shared", "-fPIC", "-std=c11", "-Wall", "-Werror", "-I/usr/include/python3.12"], "python": "3.12.3 (main, Aug 31 2026, 10:18:26) [GCC 13.3.0]", "source_sha256": "78ed2e240ee40ce4989a4718e77e8b3967b092d2bf8c900124a26942c98a14cb"}, "compiler_children_charged": true, "integer_oracle_unchanged": true, "native_finite_included": true, "status": "PASS_COMPLETE_NATIVE_COVERAGE"} +PASS_P104_SINGLE_PASS_QUALIFICATION +{"mode": "qualify", "receipt": {"all_actual_witness_rows_equal": true, "coefficient_scale_bits": 55, "coordinates": 799, "events": 25984, "finite_fixtures": {"cases": 120, "controls": ["nondyadic scalar", "inexact scale division", "nondyadic weight"], "events": 4240}, "guards": {"owned": 22, "prefix": 26, "public": 23}, "source_controls": 6, "source_result_sha256": "cc7739703ed23532d187949c8507d09c13ac4c152e07a930f0087cde0d7a3d98"}, "seconds": 28.945226} +{"arithmetic_changed": false, "complete_speed_claim": false, "construction_admitted": false, "counts": {"error_trace": 121, "ideal": 4, "reverse_all": 121}, "eligible_disjoint_union_seconds": {"cpu": 4.853204029000002, "wall": 4.855752163886791}, "expected_actual_program_length": 25984, "fixed_baseline_medians": {"cpu": 34.47, "wall": 34.66178539200337}, "fixed_noise_spreads": {"cpu": 2.3500000000000014, "wall": 2.713637237990042}, "fraction_path_changed": false, "full_source_sha256": "ce6f15ca892db095d4b9f79b58cb3c199b18da341def761c577cc8651abc0cc0", "instrumented_driver_sha256": "90b1eaba6b1a52c5d03a5cb19e6a294d30a5ca6192648eab0ae8af8cb54ec896", "integer_source_sha256": "82a73e4bcf1835bfdd510c7ad5538625c1b380c559b671e6a67be490615a743a", "interpretation": "Even deleting every timed original integer call cannot fund the fixed gate.", "metadata_and_output_costs_outside_eligible_union": true, "necessary_zero_cost_threshold_seconds": {"cpu": 5.1705, "wall": 5.199267808800505}, "nomination_rejected": true, "outer_cpu_must_include_existing_compiler_children": true, "own_process_cpu_only_inside_engine": true, "performance_sample": false, "records": [{"classification": "actual_word", "cpu_seconds": 0.544413971, "exception": null, "family": "ideal", "outermost": true, "program_length": 25984, "wall_seconds": 0.5448808490182273}, {"classification": "actual_word", "cpu_seconds": 2.915196117, "exception": null, "family": "error_trace", "outermost": true, "program_length": 25984, "wall_seconds": 2.9158753560041077}, {"classification": "actual_word", "cpu_seconds": 0.9534440719999999, "exception": null, "family": "reverse_all", "outermost": true, "program_length": 25984, "wall_seconds": 0.9542549859907012}, {"classification": "modified_word_control", "cpu_seconds": 0.2735104669999995, "exception": "ValueError", "family": "ideal", "outermost": true, "program_length": 25985, "wall_seconds": 0.273615426995093}, {"classification": "modified_word_control", "cpu_seconds": 0.034584928000001014, "exception": "ValueError", "family": "ideal", "outermost": true, "program_length": 25984, "wall_seconds": 0.03460642998106778}, {"classification": "modified_word_control", "cpu_seconds": 0.03475777200000074, "exception": "ValueError", "family": "ideal", "outermost": true, "program_length": 25984, "wall_seconds": 0.03476152999792248}, {"classification": "finite_fixture", "cpu_seconds": 0.00014471599999765772, "exception": null, "family": "error_trace", "outermost": true, "program_length": 5, "wall_seconds": 0.0001474670134484768}, {"classification": "finite_fixture", "cpu_seconds": 7.746800000063558e-05, "exception": null, "family": "reverse_all", "outermost": true, "program_length": 5, "wall_seconds": 7.892798748798668e-05}, {"classification": "finite_fixture", "cpu_seconds": 0.00013194900000002008, "exception": null, "family": "error_trace", "outermost": true, "program_length": 6, "wall_seconds": 0.00013346201740205288}, {"classification": "finite_fixture", "cpu_seconds": 9.150900000065576e-05, "exception": null, "family": "reverse_all", "outermost": true, "program_length": 6, "wall_seconds": 0.00010158601799048483}, {"classification": "finite_fixture", "cpu_seconds": 0.00015420100000085313, "exception": null, "family": "error_trace", "outermost": true, "program_length": 7, "wall_seconds": 0.00015565802459605038}, {"classification": "finite_fixture", "cpu_seconds": 8.906100000061201e-05, "exception": null, "family": "reverse_all", "outermost": true, "program_length": 7, "wall_seconds": 9.053500252775848e-05}, {"classification": "finite_fixture", "cpu_seconds": 0.00018328199999828598, "exception": null, "family": "error_trace", "outermost": true, "program_length": 8, "wall_seconds": 0.0001848780084401369}, {"classification": "finite_fixture", "cpu_seconds": 8.795500000147172e-05, "exception": null, "family": "reverse_all", "outermost": true, "program_length": 8, "wall_seconds": 8.932701894082129e-05}, {"classification": "finite_fixture", "cpu_seconds": 0.00016741900000027954, "exception": null, "family": "error_trace", "outermost": true, "program_length": 9, "wall_seconds": 0.0001688519841991365}, {"classification": "finite_fixture", "cpu_seconds": 0.00011472100000275987, "exception": null, "family": "reverse_all", "outermost": true, "program_length": 9, "wall_seconds": 0.00011616700794547796}, {"classification": "finite_fixture", "cpu_seconds": 0.00020741000000157328, "exception": null, "family": "error_trace", "outermost": true, "program_length": 10, "wall_seconds": 0.00020901800598949194}, {"classification": "finite_fixture", "cpu_seconds": 0.00012040800000079344, "exception": null, "family": "reverse_all", "outermost": true, "program_length": 10, "wall_seconds": 0.00012188797700218856}, {"classification": "finite_fixture", "cpu_seconds": 0.0001990519999992557, "exception": null, "family": "error_trace", "outermost": true, "program_length": 11, "wall_seconds": 0.00020067801233381033}, {"classification": "finite_fixture", "cpu_seconds": 0.00012447800000003895, "exception": null, "family": "reverse_all", "outermost": true, "program_length": 11, "wall_seconds": 0.00012583599891513586}, {"classification": "finite_fixture", "cpu_seconds": 0.00027867400000047837, "exception": null, "family": "error_trace", "outermost": true, "program_length": 12, "wall_seconds": 0.00028870298410765827}, {"classification": "finite_fixture", "cpu_seconds": 0.00013027800000031675, "exception": null, "family": "reverse_all", "outermost": true, "program_length": 12, "wall_seconds": 0.00013167198630981147}, {"classification": "finite_fixture", "cpu_seconds": 0.00024971900000281266, "exception": null, "family": "error_trace", "outermost": true, "program_length": 13, "wall_seconds": 0.0002512560167815536}, {"classification": "finite_fixture", "cpu_seconds": 0.0001288959999996564, "exception": null, "family": "reverse_all", "outermost": true, "program_length": 13, "wall_seconds": 0.0001302319869864732}, {"classification": "finite_fixture", "cpu_seconds": 0.0002744400000018743, "exception": null, "family": "error_trace", "outermost": true, "program_length": 14, "wall_seconds": 0.00027590198442339897}, {"classification": "finite_fixture", "cpu_seconds": 0.00016587800000067432, "exception": null, "family": "reverse_all", "outermost": true, "program_length": 14, "wall_seconds": 0.00016731300274841487}, {"classification": "finite_fixture", "cpu_seconds": 0.000302288999996847, "exception": null, "family": "error_trace", "outermost": true, "program_length": 15, "wall_seconds": 0.00030385301215574145}, {"classification": "finite_fixture", "cpu_seconds": 0.00018540800000010904, "exception": null, "family": "reverse_all", "outermost": true, "program_length": 15, "wall_seconds": 0.00018674900638870895}, {"classification": "finite_fixture", "cpu_seconds": 0.0002557129999978258, "exception": null, "family": "error_trace", "outermost": true, "program_length": 16, "wall_seconds": 0.00025730099878273904}, {"classification": "finite_fixture", "cpu_seconds": 0.00016728000000298948, "exception": null, "family": "reverse_all", "outermost": true, "program_length": 16, "wall_seconds": 0.00016876199515536427}, {"classification": "finite_fixture", "cpu_seconds": 0.0002651769999992837, "exception": null, "family": "error_trace", "outermost": true, "program_length": 17, "wall_seconds": 0.0002667150110937655}, {"classification": "finite_fixture", "cpu_seconds": 0.00014855300000249372, "exception": null, "family": "reverse_all", "outermost": true, "program_length": 17, "wall_seconds": 0.0001498789933975786}, {"classification": "finite_fixture", "cpu_seconds": 0.0003102179999991961, "exception": null, "family": "error_trace", "outermost": true, "program_length": 18, "wall_seconds": 0.00032151301275007427}, {"classification": "finite_fixture", "cpu_seconds": 0.00019853699999927699, "exception": null, "family": "reverse_all", "outermost": true, "program_length": 18, "wall_seconds": 0.00020003700046800077}, {"classification": "finite_fixture", "cpu_seconds": 0.0003246320000016567, "exception": null, "family": "error_trace", "outermost": true, "program_length": 19, "wall_seconds": 0.0003263560065533966}, {"classification": "finite_fixture", "cpu_seconds": 0.00017023299999863184, "exception": null, "family": "reverse_all", "outermost": true, "program_length": 19, "wall_seconds": 0.00017164502060040832}, {"classification": "finite_fixture", "cpu_seconds": 0.00032911200000285135, "exception": null, "family": "error_trace", "outermost": true, "program_length": 20, "wall_seconds": 0.0003306700091343373}, {"classification": "finite_fixture", "cpu_seconds": 0.00018308599999983244, "exception": null, "family": "reverse_all", "outermost": true, "program_length": 20, "wall_seconds": 0.00018449698109179735}, {"classification": "finite_fixture", "cpu_seconds": 0.00032679499999943573, "exception": null, "family": "error_trace", "outermost": true, "program_length": 21, "wall_seconds": 0.00032843698863871396}, {"classification": "finite_fixture", "cpu_seconds": 0.0001944350000009365, "exception": null, "family": "reverse_all", "outermost": true, "program_length": 21, "wall_seconds": 0.00019584799883887172}, {"classification": "finite_fixture", "cpu_seconds": 0.00033027599999968515, "exception": null, "family": "error_trace", "outermost": true, "program_length": 22, "wall_seconds": 0.0003317139926366508}, {"classification": "finite_fixture", "cpu_seconds": 0.00018561000000261174, "exception": null, "family": "reverse_all", "outermost": true, "program_length": 22, "wall_seconds": 0.0001870489795692265}, {"classification": "finite_fixture", "cpu_seconds": 0.0003872020000024179, "exception": null, "family": "error_trace", "outermost": true, "program_length": 23, "wall_seconds": 0.00038884198875166476}, {"classification": "finite_fixture", "cpu_seconds": 0.00021157000000116, "exception": null, "family": "reverse_all", "outermost": true, "program_length": 23, "wall_seconds": 0.00021340098464861512}, {"classification": "finite_fixture", "cpu_seconds": 0.0003424239999993972, "exception": null, "family": "error_trace", "outermost": true, "program_length": 24, "wall_seconds": 0.00034396699629724026}, {"classification": "finite_fixture", "cpu_seconds": 0.00021890200000029836, "exception": null, "family": "reverse_all", "outermost": true, "program_length": 24, "wall_seconds": 0.00022039099712856114}, {"classification": "finite_fixture", "cpu_seconds": 0.0005009969999996144, "exception": null, "family": "error_trace", "outermost": true, "program_length": 25, "wall_seconds": 0.0005025969876442105}, {"classification": "finite_fixture", "cpu_seconds": 0.00026900599999990504, "exception": null, "family": "reverse_all", "outermost": true, "program_length": 25, "wall_seconds": 0.00027043800218962133}, {"classification": "finite_fixture", "cpu_seconds": 0.00042107699999860415, "exception": null, "family": "error_trace", "outermost": true, "program_length": 26, "wall_seconds": 0.00042271800339221954}, {"classification": "finite_fixture", "cpu_seconds": 0.00022539500000107182, "exception": null, "family": "reverse_all", "outermost": true, "program_length": 26, "wall_seconds": 0.00022688298486173153}, {"classification": "finite_fixture", "cpu_seconds": 0.0003836340000020755, "exception": null, "family": "error_trace", "outermost": true, "program_length": 27, "wall_seconds": 0.000385160994483158}, {"classification": "finite_fixture", "cpu_seconds": 0.00021930300000150282, "exception": null, "family": "reverse_all", "outermost": true, "program_length": 27, "wall_seconds": 0.0002207560173701495}, {"classification": "finite_fixture", "cpu_seconds": 0.0004667900000008274, "exception": null, "family": "error_trace", "outermost": true, "program_length": 28, "wall_seconds": 0.0004683589795604348}, {"classification": "finite_fixture", "cpu_seconds": 0.00023473400000284528, "exception": null, "family": "reverse_all", "outermost": true, "program_length": 28, "wall_seconds": 0.00023622700246050954}, {"classification": "finite_fixture", "cpu_seconds": 0.00042273999999764555, "exception": null, "family": "error_trace", "outermost": true, "program_length": 29, "wall_seconds": 0.00042432500049471855}, {"classification": "finite_fixture", "cpu_seconds": 0.0002402650000021822, "exception": null, "family": "reverse_all", "outermost": true, "program_length": 29, "wall_seconds": 0.0002417630166746676}, {"classification": "finite_fixture", "cpu_seconds": 0.0004001630000018963, "exception": null, "family": "error_trace", "outermost": true, "program_length": 30, "wall_seconds": 0.0004020819906145334}, {"classification": "finite_fixture", "cpu_seconds": 0.00022455399999898873, "exception": null, "family": "reverse_all", "outermost": true, "program_length": 30, "wall_seconds": 0.0002259699977003038}, {"classification": "finite_fixture", "cpu_seconds": 0.0004824320000018645, "exception": null, "family": "error_trace", "outermost": true, "program_length": 31, "wall_seconds": 0.0004841220215894282}, {"classification": "finite_fixture", "cpu_seconds": 0.0002588750000001028, "exception": null, "family": "reverse_all", "outermost": true, "program_length": 31, "wall_seconds": 0.0002603379834908992}, {"classification": "finite_fixture", "cpu_seconds": 0.0004832789999973386, "exception": null, "family": "error_trace", "outermost": true, "program_length": 32, "wall_seconds": 0.0004848829994443804}, {"classification": "finite_fixture", "cpu_seconds": 0.00027825199999753636, "exception": null, "family": "reverse_all", "outermost": true, "program_length": 32, "wall_seconds": 0.00027969799702987075}, {"classification": "finite_fixture", "cpu_seconds": 0.00044181000000165227, "exception": null, "family": "error_trace", "outermost": true, "program_length": 33, "wall_seconds": 0.00044336600694805384}, {"classification": "finite_fixture", "cpu_seconds": 0.0002375239999992118, "exception": null, "family": "reverse_all", "outermost": true, "program_length": 33, "wall_seconds": 0.00023893799516372383}, {"classification": "finite_fixture", "cpu_seconds": 0.000515075000002696, "exception": null, "family": "error_trace", "outermost": true, "program_length": 34, "wall_seconds": 0.0005209480004850775}, {"classification": "finite_fixture", "cpu_seconds": 0.0002741630000002715, "exception": null, "family": "reverse_all", "outermost": true, "program_length": 34, "wall_seconds": 0.0002756309986580163}, {"classification": "finite_fixture", "cpu_seconds": 0.00047766499999823964, "exception": null, "family": "error_trace", "outermost": true, "program_length": 35, "wall_seconds": 0.0004792070249095559}, {"classification": "finite_fixture", "cpu_seconds": 0.0002729370000018605, "exception": null, "family": "reverse_all", "outermost": true, "program_length": 35, "wall_seconds": 0.00027442400460131466}, {"classification": "finite_fixture", "cpu_seconds": 0.000451267999999061, "exception": null, "family": "error_trace", "outermost": true, "program_length": 36, "wall_seconds": 0.00045272998977452517}, {"classification": "finite_fixture", "cpu_seconds": 0.0002461969999991709, "exception": null, "family": "reverse_all", "outermost": true, "program_length": 36, "wall_seconds": 0.0002476199879311025}, {"classification": "finite_fixture", "cpu_seconds": 0.000563020999997832, "exception": null, "family": "error_trace", "outermost": true, "program_length": 37, "wall_seconds": 0.0005646209756378084}, {"classification": "finite_fixture", "cpu_seconds": 0.00032334799999844677, "exception": null, "family": "reverse_all", "outermost": true, "program_length": 37, "wall_seconds": 0.0003247929853387177}, {"classification": "finite_fixture", "cpu_seconds": 0.0005040869999994868, "exception": null, "family": "error_trace", "outermost": true, "program_length": 38, "wall_seconds": 0.0005056480003986508}, {"classification": "finite_fixture", "cpu_seconds": 0.0002870460000004016, "exception": null, "family": "reverse_all", "outermost": true, "program_length": 38, "wall_seconds": 0.00028857699362561107}, {"classification": "finite_fixture", "cpu_seconds": 0.0004982330000018464, "exception": null, "family": "error_trace", "outermost": true, "program_length": 39, "wall_seconds": 0.0004997489741072059}, {"classification": "finite_fixture", "cpu_seconds": 0.00028332700000177624, "exception": null, "family": "reverse_all", "outermost": true, "program_length": 39, "wall_seconds": 0.0002846480056177825}, {"classification": "finite_fixture", "cpu_seconds": 0.0005944079999977703, "exception": null, "family": "error_trace", "outermost": true, "program_length": 40, "wall_seconds": 0.0005959420232102275}, {"classification": "finite_fixture", "cpu_seconds": 0.0003390080000009732, "exception": null, "family": "reverse_all", "outermost": true, "program_length": 40, "wall_seconds": 0.0003404789895284921}, {"classification": "finite_fixture", "cpu_seconds": 0.0005831050000004723, "exception": null, "family": "error_trace", "outermost": true, "program_length": 41, "wall_seconds": 0.0005849339941050857}, {"classification": "finite_fixture", "cpu_seconds": 0.0003328210000006493, "exception": null, "family": "reverse_all", "outermost": true, "program_length": 41, "wall_seconds": 0.0003341799892950803}, {"classification": "finite_fixture", "cpu_seconds": 0.0005662019999981283, "exception": null, "family": "error_trace", "outermost": true, "program_length": 42, "wall_seconds": 0.000567914015846327}, {"classification": "finite_fixture", "cpu_seconds": 0.00032214100000160784, "exception": null, "family": "reverse_all", "outermost": true, "program_length": 42, "wall_seconds": 0.00032367100357078016}, {"classification": "finite_fixture", "cpu_seconds": 0.0006203029999980458, "exception": null, "family": "error_trace", "outermost": true, "program_length": 43, "wall_seconds": 0.0006219460046850145}, {"classification": "finite_fixture", "cpu_seconds": 0.0003744539999992469, "exception": null, "family": "reverse_all", "outermost": true, "program_length": 43, "wall_seconds": 0.0003760499821510166}, {"classification": "finite_fixture", "cpu_seconds": 0.0005911219999994444, "exception": null, "family": "error_trace", "outermost": true, "program_length": 44, "wall_seconds": 0.0005927000020164996}, {"classification": "finite_fixture", "cpu_seconds": 0.000358529999999746, "exception": null, "family": "reverse_all", "outermost": true, "program_length": 44, "wall_seconds": 0.0003603899967856705}, {"classification": "finite_fixture", "cpu_seconds": 0.0005802680000002169, "exception": null, "family": "error_trace", "outermost": true, "program_length": 45, "wall_seconds": 0.0005821859813295305}, {"classification": "finite_fixture", "cpu_seconds": 0.0003126299999998139, "exception": null, "family": "reverse_all", "outermost": true, "program_length": 45, "wall_seconds": 0.00031408597715198994}, {"classification": "finite_fixture", "cpu_seconds": 0.0006835909999978185, "exception": null, "family": "error_trace", "outermost": true, "program_length": 46, "wall_seconds": 0.0006852189835626632}, {"classification": "finite_fixture", "cpu_seconds": 0.00036558699999744704, "exception": null, "family": "reverse_all", "outermost": true, "program_length": 46, "wall_seconds": 0.0003671080048661679}, {"classification": "finite_fixture", "cpu_seconds": 0.0006191549999989832, "exception": null, "family": "error_trace", "outermost": true, "program_length": 47, "wall_seconds": 0.0006208900013007224}, {"classification": "finite_fixture", "cpu_seconds": 0.00035314599999836105, "exception": null, "family": "reverse_all", "outermost": true, "program_length": 47, "wall_seconds": 0.00035462298546917737}, {"classification": "finite_fixture", "cpu_seconds": 0.0005804040000008115, "exception": null, "family": "error_trace", "outermost": true, "program_length": 48, "wall_seconds": 0.0005820700025651604}, {"classification": "finite_fixture", "cpu_seconds": 0.0003381469999972353, "exception": null, "family": "reverse_all", "outermost": true, "program_length": 48, "wall_seconds": 0.00034028998925350606}, {"classification": "finite_fixture", "cpu_seconds": 0.0006347590000004288, "exception": null, "family": "error_trace", "outermost": true, "program_length": 49, "wall_seconds": 0.0006366260058712214}, {"classification": "finite_fixture", "cpu_seconds": 0.0003806960000005688, "exception": null, "family": "reverse_all", "outermost": true, "program_length": 49, "wall_seconds": 0.0003823380102403462}, {"classification": "finite_fixture", "cpu_seconds": 0.0006646980000013514, "exception": null, "family": "error_trace", "outermost": true, "program_length": 50, "wall_seconds": 0.0006662849918939173}, {"classification": "finite_fixture", "cpu_seconds": 0.00037217599999905815, "exception": null, "family": "reverse_all", "outermost": true, "program_length": 50, "wall_seconds": 0.00037373299710452557}, {"classification": "finite_fixture", "cpu_seconds": 0.0007132340000026716, "exception": null, "family": "error_trace", "outermost": true, "program_length": 51, "wall_seconds": 0.0007149899902287871}, {"classification": "finite_fixture", "cpu_seconds": 0.0004019960000007927, "exception": null, "family": "reverse_all", "outermost": true, "program_length": 51, "wall_seconds": 0.00040360799175687134}, {"classification": "finite_fixture", "cpu_seconds": 0.0006844319999999016, "exception": null, "family": "error_trace", "outermost": true, "program_length": 52, "wall_seconds": 0.0006863849994260818}, {"classification": "finite_fixture", "cpu_seconds": 0.00037204099999854634, "exception": null, "family": "reverse_all", "outermost": true, "program_length": 52, "wall_seconds": 0.0003735939972102642}, {"classification": "finite_fixture", "cpu_seconds": 0.0006140389999984563, "exception": null, "family": "error_trace", "outermost": true, "program_length": 53, "wall_seconds": 0.0006155809969641268}, {"classification": "finite_fixture", "cpu_seconds": 0.0003599980000004166, "exception": null, "family": "reverse_all", "outermost": true, "program_length": 53, "wall_seconds": 0.0003614879969973117}, {"classification": "finite_fixture", "cpu_seconds": 0.0007541029999984517, "exception": null, "family": "error_trace", "outermost": true, "program_length": 54, "wall_seconds": 0.0007557990029454231}, {"classification": "finite_fixture", "cpu_seconds": 0.00045773399999760045, "exception": null, "family": "reverse_all", "outermost": true, "program_length": 54, "wall_seconds": 0.0004591410106513649}, {"classification": "finite_fixture", "cpu_seconds": 0.0007229100000003541, "exception": null, "family": "error_trace", "outermost": true, "program_length": 55, "wall_seconds": 0.000724475015886128}, {"classification": "finite_fixture", "cpu_seconds": 0.0003985819999989815, "exception": null, "family": "reverse_all", "outermost": true, "program_length": 55, "wall_seconds": 0.0003999430045951158}, {"classification": "finite_fixture", "cpu_seconds": 0.0007212849999973514, "exception": null, "family": "error_trace", "outermost": true, "program_length": 56, "wall_seconds": 0.0007231429917737842}, {"classification": "finite_fixture", "cpu_seconds": 0.00038292700000042146, "exception": null, "family": "reverse_all", "outermost": true, "program_length": 56, "wall_seconds": 0.0003844439925160259}, {"classification": "finite_fixture", "cpu_seconds": 0.0008024509999984275, "exception": null, "family": "error_trace", "outermost": true, "program_length": 57, "wall_seconds": 0.0008041580149438232}, {"classification": "finite_fixture", "cpu_seconds": 0.00040003499999841097, "exception": null, "family": "reverse_all", "outermost": true, "program_length": 57, "wall_seconds": 0.00040146801620721817}, {"classification": "finite_fixture", "cpu_seconds": 0.0009311499999995476, "exception": null, "family": "error_trace", "outermost": true, "program_length": 58, "wall_seconds": 0.0009328779997304082}, {"classification": "finite_fixture", "cpu_seconds": 0.0004957419999982449, "exception": null, "family": "reverse_all", "outermost": true, "program_length": 58, "wall_seconds": 0.0004973300092387944}, {"classification": "finite_fixture", "cpu_seconds": 0.0008640409999998155, "exception": null, "family": "error_trace", "outermost": true, "program_length": 59, "wall_seconds": 0.0008656879945192486}, {"classification": "finite_fixture", "cpu_seconds": 0.0004302980000012724, "exception": null, "family": "reverse_all", "outermost": true, "program_length": 59, "wall_seconds": 0.0004319259896874428}, {"classification": "finite_fixture", "cpu_seconds": 0.0009355430000006493, "exception": null, "family": "error_trace", "outermost": true, "program_length": 60, "wall_seconds": 0.0009370930201839656}, {"classification": "finite_fixture", "cpu_seconds": 0.0005227119999986485, "exception": null, "family": "reverse_all", "outermost": true, "program_length": 60, "wall_seconds": 0.000524084985954687}, {"classification": "finite_fixture", "cpu_seconds": 0.000801855999998935, "exception": null, "family": "error_trace", "outermost": true, "program_length": 61, "wall_seconds": 0.0008034810016397387}, {"classification": "finite_fixture", "cpu_seconds": 0.0004594509999975571, "exception": null, "family": "reverse_all", "outermost": true, "program_length": 61, "wall_seconds": 0.0004611089825630188}, {"classification": "finite_fixture", "cpu_seconds": 0.0010093320000024164, "exception": null, "family": "error_trace", "outermost": true, "program_length": 62, "wall_seconds": 0.001011182990623638}, {"classification": "finite_fixture", "cpu_seconds": 0.000521484999996602, "exception": null, "family": "reverse_all", "outermost": true, "program_length": 62, "wall_seconds": 0.0005231040122453123}, {"classification": "finite_fixture", "cpu_seconds": 0.0009533130000001222, "exception": null, "family": "error_trace", "outermost": true, "program_length": 63, "wall_seconds": 0.0009551009861752391}, {"classification": "finite_fixture", "cpu_seconds": 0.0005033559999993997, "exception": null, "family": "reverse_all", "outermost": true, "program_length": 63, "wall_seconds": 0.0005049110040999949}, {"classification": "finite_fixture", "cpu_seconds": 0.0008759749999995847, "exception": null, "family": "error_trace", "outermost": true, "program_length": 64, "wall_seconds": 0.0008778490009717643}, {"classification": "finite_fixture", "cpu_seconds": 0.0004851190000003669, "exception": null, "family": "reverse_all", "outermost": true, "program_length": 64, "wall_seconds": 0.00048672399134375155}, {"classification": "finite_fixture", "cpu_seconds": 0.0011565579999981423, "exception": null, "family": "error_trace", "outermost": true, "program_length": 65, "wall_seconds": 0.001158358994871378}, {"classification": "finite_fixture", "cpu_seconds": 0.0005371259999975564, "exception": null, "family": "reverse_all", "outermost": true, "program_length": 65, "wall_seconds": 0.0005385729891713709}, {"classification": "finite_fixture", "cpu_seconds": 0.0011456480000013869, "exception": null, "family": "error_trace", "outermost": true, "program_length": 66, "wall_seconds": 0.001147719012806192}, {"classification": "finite_fixture", "cpu_seconds": 0.0005801260000026787, "exception": null, "family": "reverse_all", "outermost": true, "program_length": 66, "wall_seconds": 0.0005938370013609529}, {"classification": "finite_fixture", "cpu_seconds": 0.0009714560000020356, "exception": null, "family": "error_trace", "outermost": true, "program_length": 67, "wall_seconds": 0.000973180023720488}, {"classification": "finite_fixture", "cpu_seconds": 0.0005081800000006353, "exception": null, "family": "reverse_all", "outermost": true, "program_length": 67, "wall_seconds": 0.0005096539971418679}, {"classification": "finite_fixture", "cpu_seconds": 0.0009652819999992346, "exception": null, "family": "error_trace", "outermost": true, "program_length": 68, "wall_seconds": 0.000991638022242114}, {"classification": "finite_fixture", "cpu_seconds": 0.0004665060000021981, "exception": null, "family": "reverse_all", "outermost": true, "program_length": 68, "wall_seconds": 0.00046804899466224015}, {"classification": "finite_fixture", "cpu_seconds": 0.000895700000000943, "exception": null, "family": "error_trace", "outermost": true, "program_length": 69, "wall_seconds": 0.0008975160017143935}, {"classification": "finite_fixture", "cpu_seconds": 0.0004653129999994121, "exception": null, "family": "reverse_all", "outermost": true, "program_length": 69, "wall_seconds": 0.0004668269830290228}, {"classification": "finite_fixture", "cpu_seconds": 0.0008054810000004409, "exception": null, "family": "error_trace", "outermost": true, "program_length": 70, "wall_seconds": 0.000807060016086325}, {"classification": "finite_fixture", "cpu_seconds": 0.0004457010000002981, "exception": null, "family": "reverse_all", "outermost": true, "program_length": 70, "wall_seconds": 0.00044724601320922375}, {"classification": "finite_fixture", "cpu_seconds": 0.0008873069999992822, "exception": null, "family": "error_trace", "outermost": true, "program_length": 71, "wall_seconds": 0.0008890499884728342}, {"classification": "finite_fixture", "cpu_seconds": 0.0005177230000015243, "exception": null, "family": "reverse_all", "outermost": true, "program_length": 71, "wall_seconds": 0.0005194690020289272}, {"classification": "finite_fixture", "cpu_seconds": 0.0009829499999973734, "exception": null, "family": "error_trace", "outermost": true, "program_length": 72, "wall_seconds": 0.0009845379972830415}, {"classification": "finite_fixture", "cpu_seconds": 0.0005426279999980466, "exception": null, "family": "reverse_all", "outermost": true, "program_length": 72, "wall_seconds": 0.0005442629917524755}, {"classification": "finite_fixture", "cpu_seconds": 0.0008931889999992393, "exception": null, "family": "error_trace", "outermost": true, "program_length": 73, "wall_seconds": 0.0008950020128395408}, {"classification": "finite_fixture", "cpu_seconds": 0.0005082499999993217, "exception": null, "family": "reverse_all", "outermost": true, "program_length": 73, "wall_seconds": 0.0005098290275782347}, {"classification": "finite_fixture", "cpu_seconds": 0.000977463999998207, "exception": null, "family": "error_trace", "outermost": true, "program_length": 74, "wall_seconds": 0.0009792600176297128}, {"classification": "finite_fixture", "cpu_seconds": 0.0005312150000023053, "exception": null, "family": "reverse_all", "outermost": true, "program_length": 74, "wall_seconds": 0.0005327419785317034}, {"classification": "finite_fixture", "cpu_seconds": 0.00015259899999975346, "exception": null, "family": "error_trace", "outermost": true, "program_length": 5, "wall_seconds": 0.00015424098819494247}, {"classification": "finite_fixture", "cpu_seconds": 8.160500000187199e-05, "exception": null, "family": "reverse_all", "outermost": true, "program_length": 5, "wall_seconds": 8.292400161735713e-05}, {"classification": "finite_fixture", "cpu_seconds": 0.00014379699999977902, "exception": null, "family": "error_trace", "outermost": true, "program_length": 6, "wall_seconds": 0.00014516498777084053}, {"classification": "finite_fixture", "cpu_seconds": 7.52689999998779e-05, "exception": null, "family": "reverse_all", "outermost": true, "program_length": 6, "wall_seconds": 7.656199159100652e-05}, {"classification": "finite_fixture", "cpu_seconds": 0.0001336670000000595, "exception": null, "family": "error_trace", "outermost": true, "program_length": 7, "wall_seconds": 0.00013516200124286115}, {"classification": "finite_fixture", "cpu_seconds": 7.598000000186289e-05, "exception": null, "family": "reverse_all", "outermost": true, "program_length": 7, "wall_seconds": 7.720600115135312e-05}, {"classification": "finite_fixture", "cpu_seconds": 0.00015224900000276875, "exception": null, "family": "error_trace", "outermost": true, "program_length": 8, "wall_seconds": 0.00015357602387666702}, {"classification": "finite_fixture", "cpu_seconds": 8.422000000152252e-05, "exception": null, "family": "reverse_all", "outermost": true, "program_length": 8, "wall_seconds": 8.539101690985262e-05}, {"classification": "finite_fixture", "cpu_seconds": 0.00015739499999867235, "exception": null, "family": "error_trace", "outermost": true, "program_length": 9, "wall_seconds": 0.00015879998682066798}, {"classification": "finite_fixture", "cpu_seconds": 9.448700000191934e-05, "exception": null, "family": "reverse_all", "outermost": true, "program_length": 9, "wall_seconds": 9.571699774824083e-05}, {"classification": "finite_fixture", "cpu_seconds": 0.0001509569999988969, "exception": null, "family": "error_trace", "outermost": true, "program_length": 10, "wall_seconds": 0.0001523930113762617}, {"classification": "finite_fixture", "cpu_seconds": 9.209099999907266e-05, "exception": null, "family": "reverse_all", "outermost": true, "program_length": 10, "wall_seconds": 9.332399349659681e-05}, {"classification": "finite_fixture", "cpu_seconds": 0.00018066700000218816, "exception": null, "family": "error_trace", "outermost": true, "program_length": 11, "wall_seconds": 0.00018207798711955547}, {"classification": "finite_fixture", "cpu_seconds": 0.00010734299999981545, "exception": null, "family": "reverse_all", "outermost": true, "program_length": 11, "wall_seconds": 0.00010869998368434608}, {"classification": "finite_fixture", "cpu_seconds": 0.00018535000000241553, "exception": null, "family": "error_trace", "outermost": true, "program_length": 12, "wall_seconds": 0.00018678398919291794}, {"classification": "finite_fixture", "cpu_seconds": 0.00010954599999735137, "exception": null, "family": "reverse_all", "outermost": true, "program_length": 12, "wall_seconds": 0.00011085599544458091}, {"classification": "finite_fixture", "cpu_seconds": 0.0002038529999985883, "exception": null, "family": "error_trace", "outermost": true, "program_length": 13, "wall_seconds": 0.00020534801296889782}, {"classification": "finite_fixture", "cpu_seconds": 0.0001108820000013111, "exception": null, "family": "reverse_all", "outermost": true, "program_length": 13, "wall_seconds": 0.00011211499804630876}, {"classification": "finite_fixture", "cpu_seconds": 0.0002217120000018724, "exception": null, "family": "error_trace", "outermost": true, "program_length": 14, "wall_seconds": 0.00022316499962471426}, {"classification": "finite_fixture", "cpu_seconds": 0.00011760499999979857, "exception": null, "family": "reverse_all", "outermost": true, "program_length": 14, "wall_seconds": 0.00011889901361428201}, {"classification": "finite_fixture", "cpu_seconds": 0.0002598240000004637, "exception": null, "family": "error_trace", "outermost": true, "program_length": 15, "wall_seconds": 0.00026135300868190825}, {"classification": "finite_fixture", "cpu_seconds": 0.00013238800000081596, "exception": null, "family": "reverse_all", "outermost": true, "program_length": 15, "wall_seconds": 0.00013369799125939608}, {"classification": "finite_fixture", "cpu_seconds": 0.00025406099999969456, "exception": null, "family": "error_trace", "outermost": true, "program_length": 16, "wall_seconds": 0.00025546300457790494}, {"classification": "finite_fixture", "cpu_seconds": 0.00013271199999920213, "exception": null, "family": "reverse_all", "outermost": true, "program_length": 16, "wall_seconds": 0.00013409199891611934}, {"classification": "finite_fixture", "cpu_seconds": 0.0002568079999996087, "exception": null, "family": "error_trace", "outermost": true, "program_length": 17, "wall_seconds": 0.0002582629967946559}, {"classification": "finite_fixture", "cpu_seconds": 0.00015575200000128575, "exception": null, "family": "reverse_all", "outermost": true, "program_length": 17, "wall_seconds": 0.00015709002036601305}, {"classification": "finite_fixture", "cpu_seconds": 0.00023024399999727052, "exception": null, "family": "error_trace", "outermost": true, "program_length": 18, "wall_seconds": 0.0002316450118087232}, {"classification": "finite_fixture", "cpu_seconds": 0.00014447600000266902, "exception": null, "family": "reverse_all", "outermost": true, "program_length": 18, "wall_seconds": 0.0001458320184610784}, {"classification": "finite_fixture", "cpu_seconds": 0.0002840550000016151, "exception": null, "family": "error_trace", "outermost": true, "program_length": 19, "wall_seconds": 0.0002855050261132419}, {"classification": "finite_fixture", "cpu_seconds": 0.00018312699999967208, "exception": null, "family": "reverse_all", "outermost": true, "program_length": 19, "wall_seconds": 0.00018462497973814607}, {"classification": "finite_fixture", "cpu_seconds": 0.00031345799999726864, "exception": null, "family": "error_trace", "outermost": true, "program_length": 20, "wall_seconds": 0.0003149470139760524}, {"classification": "finite_fixture", "cpu_seconds": 0.0001616579999996759, "exception": null, "family": "reverse_all", "outermost": true, "program_length": 20, "wall_seconds": 0.00016296299872919917}, {"classification": "finite_fixture", "cpu_seconds": 0.00040074400000023047, "exception": null, "family": "error_trace", "outermost": true, "program_length": 21, "wall_seconds": 0.00040234799962490797}, {"classification": "finite_fixture", "cpu_seconds": 0.0002005099999990989, "exception": null, "family": "reverse_all", "outermost": true, "program_length": 21, "wall_seconds": 0.00020196198602207005}, {"classification": "finite_fixture", "cpu_seconds": 0.0003034070000005329, "exception": null, "family": "error_trace", "outermost": true, "program_length": 22, "wall_seconds": 0.0003049529914278537}, {"classification": "finite_fixture", "cpu_seconds": 0.00024201699999792936, "exception": null, "family": "reverse_all", "outermost": true, "program_length": 22, "wall_seconds": 0.0002440699900034815}, {"classification": "finite_fixture", "cpu_seconds": 0.00037885499999745775, "exception": null, "family": "error_trace", "outermost": true, "program_length": 23, "wall_seconds": 0.0003806510067079216}, {"classification": "finite_fixture", "cpu_seconds": 0.00018845600000005902, "exception": null, "family": "reverse_all", "outermost": true, "program_length": 23, "wall_seconds": 0.00018994699348695576}, {"classification": "finite_fixture", "cpu_seconds": 0.0003611219999974935, "exception": null, "family": "error_trace", "outermost": true, "program_length": 24, "wall_seconds": 0.0003627039841376245}, {"classification": "finite_fixture", "cpu_seconds": 0.00019244699999987347, "exception": null, "family": "reverse_all", "outermost": true, "program_length": 24, "wall_seconds": 0.00019382100435905159}, {"classification": "finite_fixture", "cpu_seconds": 0.00036277799999950844, "exception": null, "family": "error_trace", "outermost": true, "program_length": 25, "wall_seconds": 0.0003643709933385253}, {"classification": "finite_fixture", "cpu_seconds": 0.00023032200000017156, "exception": null, "family": "reverse_all", "outermost": true, "program_length": 25, "wall_seconds": 0.00023177798721008003}, {"classification": "finite_fixture", "cpu_seconds": 0.0005676549999975578, "exception": null, "family": "error_trace", "outermost": true, "program_length": 26, "wall_seconds": 0.0005691930127795786}, {"classification": "finite_fixture", "cpu_seconds": 0.00030704399999947896, "exception": null, "family": "reverse_all", "outermost": true, "program_length": 26, "wall_seconds": 0.00030844099819660187}, {"classification": "finite_fixture", "cpu_seconds": 0.00039996900000005553, "exception": null, "family": "error_trace", "outermost": true, "program_length": 27, "wall_seconds": 0.0004015119920950383}, {"classification": "finite_fixture", "cpu_seconds": 0.0002251920000020391, "exception": null, "family": "reverse_all", "outermost": true, "program_length": 27, "wall_seconds": 0.00022657000226899981}, {"classification": "finite_fixture", "cpu_seconds": 0.00046611999999868203, "exception": null, "family": "error_trace", "outermost": true, "program_length": 28, "wall_seconds": 0.0004677840042859316}, {"classification": "finite_fixture", "cpu_seconds": 0.00026438699999786763, "exception": null, "family": "reverse_all", "outermost": true, "program_length": 28, "wall_seconds": 0.00026571800117380917}, {"classification": "finite_fixture", "cpu_seconds": 0.00040834599999683974, "exception": null, "family": "error_trace", "outermost": true, "program_length": 29, "wall_seconds": 0.0004099129873793572}, {"classification": "finite_fixture", "cpu_seconds": 0.00022373799999897415, "exception": null, "family": "reverse_all", "outermost": true, "program_length": 29, "wall_seconds": 0.00022508000256493688}, {"classification": "finite_fixture", "cpu_seconds": 0.0003256799999995508, "exception": null, "family": "error_trace", "outermost": true, "program_length": 30, "wall_seconds": 0.00032719000591896474}, {"classification": "finite_fixture", "cpu_seconds": 0.00019090900000051647, "exception": null, "family": "reverse_all", "outermost": true, "program_length": 30, "wall_seconds": 0.00019222599803470075}, {"classification": "finite_fixture", "cpu_seconds": 0.0004873039999999662, "exception": null, "family": "error_trace", "outermost": true, "program_length": 31, "wall_seconds": 0.0004889099800493568}, {"classification": "finite_fixture", "cpu_seconds": 0.00027466100000239635, "exception": null, "family": "reverse_all", "outermost": true, "program_length": 31, "wall_seconds": 0.00027608999516814947}, {"classification": "finite_fixture", "cpu_seconds": 0.0005151330000003895, "exception": null, "family": "error_trace", "outermost": true, "program_length": 32, "wall_seconds": 0.0005168509960640222}, {"classification": "finite_fixture", "cpu_seconds": 0.00029117700000114155, "exception": null, "family": "reverse_all", "outermost": true, "program_length": 32, "wall_seconds": 0.00029256701236590743}, {"classification": "finite_fixture", "cpu_seconds": 0.0004471210000005499, "exception": null, "family": "error_trace", "outermost": true, "program_length": 33, "wall_seconds": 0.0004486969846766442}, {"classification": "finite_fixture", "cpu_seconds": 0.00028580700000091497, "exception": null, "family": "reverse_all", "outermost": true, "program_length": 33, "wall_seconds": 0.00029401600477285683}, {"classification": "finite_fixture", "cpu_seconds": 0.000540269999998344, "exception": null, "family": "error_trace", "outermost": true, "program_length": 34, "wall_seconds": 0.000541912013432011}, {"classification": "finite_fixture", "cpu_seconds": 0.0003104100000008714, "exception": null, "family": "reverse_all", "outermost": true, "program_length": 34, "wall_seconds": 0.00031177999335341156}, {"classification": "finite_fixture", "cpu_seconds": 0.0005327560000019105, "exception": null, "family": "error_trace", "outermost": true, "program_length": 35, "wall_seconds": 0.0005431369936559349}, {"classification": "finite_fixture", "cpu_seconds": 0.00029573700000185, "exception": null, "family": "reverse_all", "outermost": true, "program_length": 35, "wall_seconds": 0.00029710200033150613}, {"classification": "finite_fixture", "cpu_seconds": 0.0005220000000001335, "exception": null, "family": "error_trace", "outermost": true, "program_length": 36, "wall_seconds": 0.0005236729921307415}, {"classification": "finite_fixture", "cpu_seconds": 0.00028518999999960215, "exception": null, "family": "reverse_all", "outermost": true, "program_length": 36, "wall_seconds": 0.00028661798569373786}, {"classification": "finite_fixture", "cpu_seconds": 0.0005586720000003709, "exception": null, "family": "error_trace", "outermost": true, "program_length": 37, "wall_seconds": 0.0005602489982265979}, {"classification": "finite_fixture", "cpu_seconds": 0.0003273259999971856, "exception": null, "family": "reverse_all", "outermost": true, "program_length": 37, "wall_seconds": 0.0003287639992777258}, {"classification": "finite_fixture", "cpu_seconds": 0.0005172590000022126, "exception": null, "family": "error_trace", "outermost": true, "program_length": 38, "wall_seconds": 0.0005187490023672581}, {"classification": "finite_fixture", "cpu_seconds": 0.0002770299999994563, "exception": null, "family": "reverse_all", "outermost": true, "program_length": 38, "wall_seconds": 0.00027843101997859776}, {"classification": "finite_fixture", "cpu_seconds": 0.0005501119999991033, "exception": null, "family": "error_trace", "outermost": true, "program_length": 39, "wall_seconds": 0.0005515750090125948}, {"classification": "finite_fixture", "cpu_seconds": 0.0002954970000033086, "exception": null, "family": "reverse_all", "outermost": true, "program_length": 39, "wall_seconds": 0.0002970100031234324}, {"classification": "finite_fixture", "cpu_seconds": 0.0006926010000007921, "exception": null, "family": "error_trace", "outermost": true, "program_length": 40, "wall_seconds": 0.0006946109933778644}, {"classification": "finite_fixture", "cpu_seconds": 0.00034711400000020376, "exception": null, "family": "reverse_all", "outermost": true, "program_length": 40, "wall_seconds": 0.0003486709902063012}, {"classification": "finite_fixture", "cpu_seconds": 0.0005777209999990873, "exception": null, "family": "error_trace", "outermost": true, "program_length": 41, "wall_seconds": 0.0005793180025648326}, {"classification": "finite_fixture", "cpu_seconds": 0.00035479099999946584, "exception": null, "family": "reverse_all", "outermost": true, "program_length": 41, "wall_seconds": 0.00035663897870108485}, {"classification": "finite_fixture", "cpu_seconds": 0.0005956639999986635, "exception": null, "family": "error_trace", "outermost": true, "program_length": 42, "wall_seconds": 0.0005979069974273443}, {"classification": "finite_fixture", "cpu_seconds": 0.0003422890000024381, "exception": null, "family": "reverse_all", "outermost": true, "program_length": 42, "wall_seconds": 0.0003438080020714551}, {"classification": "finite_fixture", "cpu_seconds": 0.0006236490000013362, "exception": null, "family": "error_trace", "outermost": true, "program_length": 43, "wall_seconds": 0.0006252790044527501}, {"classification": "finite_fixture", "cpu_seconds": 0.0005167059999990897, "exception": null, "family": "reverse_all", "outermost": true, "program_length": 43, "wall_seconds": 0.0005189670191612095}, {"classification": "finite_fixture", "cpu_seconds": 0.0010927040000012767, "exception": null, "family": "error_trace", "outermost": true, "program_length": 44, "wall_seconds": 0.0010976890043821186}, {"classification": "finite_fixture", "cpu_seconds": 0.00046655200000245145, "exception": null, "family": "reverse_all", "outermost": true, "program_length": 44, "wall_seconds": 0.0004692859947681427}, {"classification": "finite_fixture", "cpu_seconds": 0.000704907999999449, "exception": null, "family": "error_trace", "outermost": true, "program_length": 45, "wall_seconds": 0.0007071979925967753}, {"classification": "finite_fixture", "cpu_seconds": 0.0003584930000002373, "exception": null, "family": "reverse_all", "outermost": true, "program_length": 45, "wall_seconds": 0.0003600630152504891}, {"classification": "finite_fixture", "cpu_seconds": 0.0005944920000011678, "exception": null, "family": "error_trace", "outermost": true, "program_length": 46, "wall_seconds": 0.0005961139977443963}, {"classification": "finite_fixture", "cpu_seconds": 0.0003461359999974434, "exception": null, "family": "reverse_all", "outermost": true, "program_length": 46, "wall_seconds": 0.0003475929843261838}, {"classification": "finite_fixture", "cpu_seconds": 0.0007127279999998848, "exception": null, "family": "error_trace", "outermost": true, "program_length": 47, "wall_seconds": 0.0007143809925764799}, {"classification": "finite_fixture", "cpu_seconds": 0.0003941389999972955, "exception": null, "family": "reverse_all", "outermost": true, "program_length": 47, "wall_seconds": 0.00039561299490742385}, {"classification": "finite_fixture", "cpu_seconds": 0.0006830660000005651, "exception": null, "family": "error_trace", "outermost": true, "program_length": 48, "wall_seconds": 0.0006846199976280332}, {"classification": "finite_fixture", "cpu_seconds": 0.0003783589999990511, "exception": null, "family": "reverse_all", "outermost": true, "program_length": 48, "wall_seconds": 0.0003797959943767637}, {"classification": "finite_fixture", "cpu_seconds": 0.0007999249999990354, "exception": null, "family": "error_trace", "outermost": true, "program_length": 49, "wall_seconds": 0.0008015579951461405}, {"classification": "finite_fixture", "cpu_seconds": 0.00043738300000129016, "exception": null, "family": "reverse_all", "outermost": true, "program_length": 49, "wall_seconds": 0.0004388770030345768}, {"classification": "finite_fixture", "cpu_seconds": 0.0007498149999989323, "exception": null, "family": "error_trace", "outermost": true, "program_length": 50, "wall_seconds": 0.0007513450109399855}, {"classification": "finite_fixture", "cpu_seconds": 0.00036613900000048716, "exception": null, "family": "reverse_all", "outermost": true, "program_length": 50, "wall_seconds": 0.00036753699532710016}, {"classification": "finite_fixture", "cpu_seconds": 0.0007951649999995425, "exception": null, "family": "error_trace", "outermost": true, "program_length": 51, "wall_seconds": 0.0007966859848238528}, {"classification": "finite_fixture", "cpu_seconds": 0.0004382249999999033, "exception": null, "family": "reverse_all", "outermost": true, "program_length": 51, "wall_seconds": 0.0004397610027808696}, {"classification": "finite_fixture", "cpu_seconds": 0.0007184680000023036, "exception": null, "family": "error_trace", "outermost": true, "program_length": 52, "wall_seconds": 0.0007200730033218861}, {"classification": "finite_fixture", "cpu_seconds": 0.00038140400000230557, "exception": null, "family": "reverse_all", "outermost": true, "program_length": 52, "wall_seconds": 0.0003829510242212564}, {"classification": "finite_fixture", "cpu_seconds": 0.0006821049999992113, "exception": null, "family": "error_trace", "outermost": true, "program_length": 53, "wall_seconds": 0.000683632999425754}, {"classification": "finite_fixture", "cpu_seconds": 0.00038840400000239583, "exception": null, "family": "reverse_all", "outermost": true, "program_length": 53, "wall_seconds": 0.0003898270078934729}, {"classification": "finite_fixture", "cpu_seconds": 0.0007169010000005471, "exception": null, "family": "error_trace", "outermost": true, "program_length": 54, "wall_seconds": 0.0007185660069808364}, {"classification": "finite_fixture", "cpu_seconds": 0.00037520199999718784, "exception": null, "family": "reverse_all", "outermost": true, "program_length": 54, "wall_seconds": 0.0003766200097743422}], "scope": "frozen PR5864 full_C qualifier; separate custody checks excluded as before", "status": "PASS_ORIGINAL_INTEGER_BOUNDARY_DIAGNOSTIC", "strictly_exceeds_zero_cost_threshold": {"cpu": false, "wall": false}} diff --git a/research/c-verification-feasibility/evidence/runs/integer-owned-boundary-v1/usage.json b/research/c-verification-feasibility/evidence/runs/integer-owned-boundary-v1/usage.json new file mode 100644 index 0000000000..d0a33ffb53 --- /dev/null +++ b/research/c-verification-feasibility/evidence/runs/integer-owned-boundary-v1/usage.json @@ -0,0 +1 @@ +{"user_seconds":31.54,"system_seconds":0.20,"kernel_max_rss_kib":112360,"exit":0} diff --git a/research/c-verification-feasibility/owned_integer/diagnostic.py b/research/c-verification-feasibility/owned_integer/diagnostic.py new file mode 100644 index 0000000000..1fd8b0e58a --- /dev/null +++ b/research/c-verification-feasibility/owned_integer/diagnostic.py @@ -0,0 +1,202 @@ +"""One original-integer call-boundary rejection diagnostic; not a benchmark. + +SOURCE ONLY at handoff. Root owns all execution and resource accounting. +No arithmetic implementation is replaced. Frozen PR5864 full_C qualifier scope +and all its scientific/native/Observation checks run, with timers around the +selected ORIGINAL integer Engine methods. Separate custody scope is unchanged. +""" +from hashlib import sha256 +import json +from pathlib import Path +import sys +import time +from types import ModuleType + +ROUND = Path(__file__).resolve().parent.parent +BASE = ROUND / 'baseline-public' +FULL_SHA256 = 'ce6f15ca892db095d4b9f79b58cb3c199b18da341def761c577cc8651abc0cc0' +INTEGER_SHA256 = '82a73e4bcf1835bfdd510c7ad5538625c1b380c559b671e6a67be490615a743a' +BASELINE = dict(wall=34.66178539200337, cpu=34.47) +NOISE = dict(wall=2.713637237990042, cpu=2.3500000000000014) +EXPECTED_COUNTS = dict(ideal=4, error_trace=121, reverse_all=121) +FAMILIES = tuple(EXPECTED_COUNTS) +sys.path.insert(0, str(BASE)) + + +def need(ok, message): + if not ok: + raise ValueError(message) + + +def plain_json(value): + kind = type(value) + if kind in (str, int, float, bool, type(None)): + return True + if kind in (list, tuple): + return all(plain_json(item) for item in value) + if kind is dict: + return all(type(key) in (str, int) and plain_json(item) + for key, item in value.items()) + return False + + +class Ledger: + def __init__(self, digest, actual_word): + self.digest = digest + self.actual_key = digest(actual_word) + self.actual_length = len(actual_word['program']) + self.depth = 0 + self.records = [] + self.diagnostic_errors = [] + self.union_wall = 0.0 + self.union_cpu = 0.0 + + def metadata(self, word): + # Classification is outside every eligible interval and never changes + # the callee's return or exception. No foreign input method is invoked. + length = None + classification = 'unclassified' + try: + if type(word) is dict and type(word.get('program')) in (list, tuple): + length = len(word['program']) + if plain_json(word): + if self.digest(word) == self.actual_key: + classification = 'actual_word' + elif length is not None and length < self.actual_length: + classification = 'finite_fixture' + else: + classification = 'modified_word_control' + except Exception as error: + self.diagnostic_errors.append(type(error).__name__) + return length, classification + + def call(self, backend, family, word, args): + function = getattr(backend, family) + outermost = self.depth == 0 + self.depth += 1 + started_wall = time.perf_counter() + started_cpu = time.process_time() + error_type = None + try: + return function(word, *args) + except BaseException as error: + error_type = type(error).__name__ + raise + finally: + elapsed_cpu = time.process_time() - started_cpu + elapsed_wall = time.perf_counter() - started_wall + self.depth -= 1 + if outermost: + self.union_wall += elapsed_wall + self.union_cpu += elapsed_cpu + # Original Engine implementations do not call these three methods + # recursively. Outermost accounting still prevents double counting. + length, classification = self.metadata(word) + self.records.append(dict(family=family, program_length=length, + classification=classification, + outermost=outermost, exception=error_type, + wall_seconds=elapsed_wall, + cpu_seconds=elapsed_cpu)) + + def report(self): + counts = {name: sum(row['family'] == name for row in self.records) + for name in FAMILIES} + need(self.depth == 0, 'all timed calls exited') + need(not self.diagnostic_errors, 'diagnostic classification completed') + need(counts == EXPECTED_COUNTS, 'all expected original Engine boundaries observed') + need(all(row['outermost'] for row in self.records), 'frozen Engine boundaries are disjoint') + union = dict(wall=self.union_wall, cpu=self.union_cpu) + threshold = {kind: max(0.15 * BASELINE[kind], 0.50, NOISE[kind]) + for kind in ('wall', 'cpu')} + passes = {kind: union[kind] > threshold[kind] for kind in ('wall', 'cpu')} + return dict(status='PASS_ORIGINAL_INTEGER_BOUNDARY_DIAGNOSTIC', + arithmetic_changed=False, fraction_path_changed=False, + performance_sample=False, complete_speed_claim=False, + scope='frozen PR5864 full_C qualifier; separate custody checks excluded as before', + counts=counts, expected_actual_program_length=self.actual_length, + eligible_disjoint_union_seconds=union, + fixed_baseline_medians=BASELINE, fixed_noise_spreads=NOISE, + necessary_zero_cost_threshold_seconds=threshold, + strictly_exceeds_zero_cost_threshold=passes, + nomination_rejected=not all(passes.values()), + construction_admitted=False, + interpretation=('Even deleting every timed original integer call cannot fund the fixed gate.' + if not all(passes.values()) else + 'Zero-cost envelope did not reject; retained runtime and all new costs remain unpriced.'), + own_process_cpu_only_inside_engine=True, + outer_cpu_must_include_existing_compiler_children=True, + metadata_and_output_costs_outside_eligible_union=True, + records=self.records) + + +_LEDGERS = [] +_ORIGINAL_MODULES = [] + + +def timed_integer(module, reference, actual_word): + path = Path(module.__file__) + need(not path.is_symlink() and sha256(path.read_bytes()).hexdigest() == INTEGER_SHA256, + 'exact original integer source for boundary diagnostic') + original_engine = module.Engine + ledger = Ledger(reference.digest, actual_word) + _LEDGERS.append(ledger) + _ORIGINAL_MODULES.append((module, original_engine)) + + class TimedEngine: + def __init__(self, ref): + self._backend = original_engine(ref) + + def __getattr__(self, name): + return getattr(self._backend, name) + + def ideal(self, word): + return ledger.call(self._backend, 'ideal', word, ()) + + def error_trace(self, word, weights, rounded): + return ledger.call(self._backend, 'error_trace', word, (weights, rounded)) + + def reverse_all(self, word, weights, rounded): + return ledger.call(self._backend, 'reverse_all', word, (weights, rounded)) + + # Only this local facade changes the selected constructor. The loaded + # original module, its functions/globals, and every archive byte stay intact. + facade = ModuleType(module.__name__ + '_boundary_diagnostic') + facade.__dict__.update(module.__dict__) + facade.Engine = TimedEngine + return facade + + +def main(): + need(len(sys.argv) == 1, 'no diagnostic arguments or alternate workload') + path = BASE / 'full.py' + raw = path.read_bytes() + need(not path.is_symlink() and sha256(raw).hexdigest() == FULL_SHA256, + 'exact frozen PR5864 full qualifier source') + source = raw.decode() + before = " namespace=dict(entry.__dict__);namespace['_native_trace']=native_trace\n" + after = ''' integer_seam=" integer = v.load('integer_backend', package/'integer.py')\\n" + require(changed.count(integer_seam)==1,'one original integer diagnostic seam') + changed=changed.replace(integer_seam," integer = _timed_integer(v.load('integer_backend', package/'integer.py'), reference, word)\\n") + namespace=dict(entry.__dict__);namespace['_native_trace']=native_trace + namespace['_timed_integer']=_timed_integer +''' + need(source.count(before) == 1, 'one frozen full namespace seam') + source = source.replace(before, after) + namespace = dict(__name__='_original_integer_boundary_diagnostic', + __file__=str(path), _timed_integer=timed_integer) + exec(compile(source, str(path), 'exec'), namespace) + namespace['main'](True) + need(len(_LEDGERS) == 1, 'one selected original integer Engine family') + need(all(module.Engine is engine for module, engine in _ORIGINAL_MODULES), + 'loaded original Engine class was not changed') + need(sha256(path.read_bytes()).hexdigest() == FULL_SHA256, + 'full qualifier source unchanged after diagnostic') + result = _LEDGERS[0].report() + result['full_source_sha256'] = FULL_SHA256 + result['integer_source_sha256'] = INTEGER_SHA256 + result['instrumented_driver_sha256'] = sha256(source.encode()).hexdigest() + print(json.dumps(result, sort_keys=True)) + + +if __name__ == '__main__': + main() diff --git a/research/c-verification-feasibility/owned_screen.py b/research/c-verification-feasibility/owned_screen.py new file mode 100644 index 0000000000..83f19bab98 --- /dev/null +++ b/research/c-verification-feasibility/owned_screen.py @@ -0,0 +1,9 @@ +from pathlib import Path +import runpy,shutil,sys +from portable import prepared +with prepared('baseline') as (root,baseline,stage): + target=root/'owned_integer'/'diagnostic.py' + target.parent.mkdir() + shutil.copy2(Path(__file__).with_name('owned_integer')/'diagnostic.py',target) + sys.argv=[str(target)] + runpy.run_path(str(target),run_name='__main__') diff --git a/research/c-verification-feasibility/replay.py b/research/c-verification-feasibility/replay.py index 2461155efe..4a403909ed 100644 --- a/research/c-verification-feasibility/replay.py +++ b/research/c-verification-feasibility/replay.py @@ -5,8 +5,8 @@ import guard PACKAGE = Path(__file__).resolve().parent -if len(sys.argv) != 3 or sys.argv[1] not in ('B', 'C'): - raise ValueError('replay.py B|C NEW_EXTERNAL_EVIDENCE_DIRECTORY') +if len(sys.argv) != 3 or sys.argv[1] not in ('B', 'C', 'D'): + raise ValueError('replay.py B|C|D NEW_EXTERNAL_EVIDENCE_DIRECTORY') evidence = Path(sys.argv[2]).resolve() if evidence.is_relative_to(PACKAGE) or evidence.exists(): raise ValueError('new evidence directory outside the immutable package required') @@ -18,4 +18,5 @@ guard.AGGREGATE = 600 with (evidence / 'execution.lock').open('a') as lock: fcntl.flock(lock, fcntl.LOCK_EX | fcntl.LOCK_NB) - guard.run('complete-' + sys.argv[1], 'full_' + sys.argv[1] + '.py') + script = 'owned_screen.py' if sys.argv[1] == 'D' else 'full_' + sys.argv[1] + '.py' + guard.run('complete-' + sys.argv[1], script)