From 160c6b06954339f97d53529557247c22ff27c47d Mon Sep 17 00:00:00 2001 From: Gareth Davidson Date: Thu, 15 Oct 2026 09:16:26 +0100 Subject: [PATCH] Measure source-bound native compiler reuse with full replay controls --- .github/workflows/native-ccache-columns.yml | 43 + research/native-ccache-columns/BENCHMARK.json | 1085 +++++++++++++++++ research/native-ccache-columns/FIXTURES.json | 33 + research/native-ccache-columns/NATIVE.json | 392 ++++++ research/native-ccache-columns/NOTICE.md | 24 + research/native-ccache-columns/README.md | 149 +++ research/native-ccache-columns/SELECTION.json | 91 ++ research/native-ccache-columns/SOURCES.json | 36 + research/native-ccache-columns/TASK.json | 89 ++ .../native-ccache-columns/VALIDATION.json | 85 ++ research/native-ccache-columns/VERIFY.json | 35 + research/native-ccache-columns/benchmark.py | 279 +++++ .../fixtures/baseline.bin.gz | Bin 0 -> 53326 bytes .../fixtures/deferred.bin.gz | Bin 0 -> 52837 bytes .../fixtures/missing-undo.bin.gz | Bin 0 -> 52844 bytes .../native-ccache-columns/test_package.py | 149 +++ research/native-ccache-columns/verify.py | 194 +++ 17 files changed, 2684 insertions(+) create mode 100644 .github/workflows/native-ccache-columns.yml create mode 100644 research/native-ccache-columns/BENCHMARK.json create mode 100644 research/native-ccache-columns/FIXTURES.json create mode 100644 research/native-ccache-columns/NATIVE.json create mode 100644 research/native-ccache-columns/NOTICE.md create mode 100644 research/native-ccache-columns/README.md create mode 100644 research/native-ccache-columns/SELECTION.json create mode 100644 research/native-ccache-columns/SOURCES.json create mode 100644 research/native-ccache-columns/TASK.json create mode 100644 research/native-ccache-columns/VALIDATION.json create mode 100644 research/native-ccache-columns/VERIFY.json create mode 100644 research/native-ccache-columns/benchmark.py create mode 100644 research/native-ccache-columns/fixtures/baseline.bin.gz create mode 100644 research/native-ccache-columns/fixtures/deferred.bin.gz create mode 100644 research/native-ccache-columns/fixtures/missing-undo.bin.gz create mode 100644 research/native-ccache-columns/test_package.py create mode 100644 research/native-ccache-columns/verify.py diff --git a/.github/workflows/native-ccache-columns.yml b/.github/workflows/native-ccache-columns.yml new file mode 100644 index 0000000000..ce1d4ac281 --- /dev/null +++ b/.github/workflows/native-ccache-columns.yml @@ -0,0 +1,43 @@ +name: Native compiler cache boundary +on: + pull_request: + paths: + - 'research/native-ccache-columns/**' + - '.github/workflows/native-ccache-columns.yml' + - 'research/e8-bit-carrier-skeleton/code/bit/checkers/columns_k.cpp' + - 'research/e8-bit-carrier-skeleton/code/bit/checkers/json.hpp' + - 'research/e8-bit-carrier-skeleton/NOTICE.md' + push: + branches: [main] + paths: + - 'research/native-ccache-columns/**' + - '.github/workflows/native-ccache-columns.yml' + - 'research/e8-bit-carrier-skeleton/code/bit/checkers/columns_k.cpp' + - 'research/e8-bit-carrier-skeleton/code/bit/checkers/json.hpp' + - 'research/e8-bit-carrier-skeleton/NOTICE.md' + workflow_dispatch: +permissions: + contents: read +jobs: + native: + runs-on: ubuntu-24.04 + timeout-minutes: 15 + steps: + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 + with: + persist-credentials: false + - uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 + with: + python-version: '3.12' + - name: Install native benchmark dependencies + run: | + sudo apt-get update + sudo apt-get install -y --no-install-recommends g++ libboost-dev ccache + - name: Independent columns and failure controls + run: python -B scripts/research_package.py --package research/native-ccache-columns + - name: Fresh native benchmark with actual invalidation controls + run: | + python -I -O -B research/native-ccache-columns/benchmark.py \ + --work "$RUNNER_TEMP/native-cache-run" --cxx /usr/bin/g++ \ + --ccache /usr/bin/ccache --boost-include /usr/include --repeats 3 + - run: git diff --exit-code diff --git a/research/native-ccache-columns/BENCHMARK.json b/research/native-ccache-columns/BENCHMARK.json new file mode 100644 index 0000000000..4d74c4e351 --- /dev/null +++ b/research/native-ccache-columns/BENCHMARK.json @@ -0,0 +1,1085 @@ +{ + "builds": [ + { + "binary_sha256": "453650f9a0228647356e20c6f623c28c64b8ee2b1cb59563527284e72488727b", + "build_seconds": 2.9359512209994136, + "cached": true, + "commands": [ + [ + "/home/gaz/tmp/math/sprint/pass-47/ccache-local/usr/bin/ccache", + "/usr/bin/x86_64-linux-gnu-g++-15", + "-O2", + "-std=c++17", + "-DHDIM=8", + "-DVPORTS=111", + "-DRHELP=439", + "-I/home/gaz/tmp/math/sprint/pass-45/boost/usr/include", + "-include", + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/source/fixture_config.hpp", + "-DKPAIRS=4", + "-c", + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/source/columns_k.cpp", + "-o", + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/fill/columns.o" + ], + [ + "/usr/bin/x86_64-linux-gnu-g++-15", + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/fill/columns.o", + "-o", + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/fill/columns" + ] + ], + "compile_seconds": 2.8600878750003176, + "link_seconds": 0.023151260997110512, + "name": "fill", + "native_seconds": 0.0039363790056086145, + "object_sha256": "b663ce933c6e6f1fcbcd0d01e4e7ed5b3b713ecaea802fc119db2dd55371a9f1", + "pairs": 4, + "profile_sha256": "86b7fc4ac394f5c134fe1d71e45745ec8e6ce39169c2890a82a9dd620856ffb0", + "source_sha256": "1c344d18fcd494eeca93e259f10cafae7705780e6592f6dcb35b34752dab9bc2", + "stats_delta": { + "cache_miss": 1, + "cache_size_kibibyte": 88, + "files_in_cache": 1, + "local_storage_miss": 1, + "local_storage_read_miss": 1, + "local_storage_write": 1, + "preprocessed_cache_miss": 1, + "stats_updated_timestamp": 1792051625 + }, + "total_replay_seconds": 2.9417026810042444 + }, + { + "binary_sha256": "453650f9a0228647356e20c6f623c28c64b8ee2b1cb59563527284e72488727b", + "build_seconds": 2.8162508309978875, + "cached": false, + "commands": [ + [ + "/usr/bin/x86_64-linux-gnu-g++-15", + "-O2", + "-std=c++17", + "-DHDIM=8", + "-DVPORTS=111", + "-DRHELP=439", + "-I/home/gaz/tmp/math/sprint/pass-45/boost/usr/include", + "-include", + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/source/fixture_config.hpp", + "-DKPAIRS=4", + "-c", + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/source/columns_k.cpp", + "-o", + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/uncached-0/columns.o" + ], + [ + "/usr/bin/x86_64-linux-gnu-g++-15", + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/uncached-0/columns.o", + "-o", + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/uncached-0/columns" + ] + ], + "compile_seconds": 2.7405254260011134, + "link_seconds": 0.023220982002385426, + "name": "uncached-0", + "native_seconds": 0.004043138993438333, + "object_sha256": "b663ce933c6e6f1fcbcd0d01e4e7ed5b3b713ecaea802fc119db2dd55371a9f1", + "pairs": 4, + "profile_sha256": "86b7fc4ac394f5c134fe1d71e45745ec8e6ce39169c2890a82a9dd620856ffb0", + "source_sha256": "1c344d18fcd494eeca93e259f10cafae7705780e6592f6dcb35b34752dab9bc2", + "stats_delta": {}, + "total_replay_seconds": 2.821791362002841 + }, + { + "binary_sha256": "453650f9a0228647356e20c6f623c28c64b8ee2b1cb59563527284e72488727b", + "build_seconds": 0.237100193000515, + "cached": true, + "commands": [ + [ + "/home/gaz/tmp/math/sprint/pass-47/ccache-local/usr/bin/ccache", + "/usr/bin/x86_64-linux-gnu-g++-15", + "-O2", + "-std=c++17", + "-DHDIM=8", + "-DVPORTS=111", + "-DRHELP=439", + "-I/home/gaz/tmp/math/sprint/pass-45/boost/usr/include", + "-include", + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/source/fixture_config.hpp", + "-DKPAIRS=4", + "-c", + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/source/columns_k.cpp", + "-o", + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/warm-0/columns.o" + ], + [ + "/usr/bin/x86_64-linux-gnu-g++-15", + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/warm-0/columns.o", + "-o", + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/warm-0/columns" + ] + ], + "compile_seconds": 0.16201924499910092, + "link_seconds": 0.024683488998562098, + "name": "warm-0", + "native_seconds": 0.003759074999834411, + "object_sha256": "b663ce933c6e6f1fcbcd0d01e4e7ed5b3b713ecaea802fc119db2dd55371a9f1", + "pairs": 4, + "profile_sha256": "86b7fc4ac394f5c134fe1d71e45745ec8e6ce39169c2890a82a9dd620856ffb0", + "source_sha256": "1c344d18fcd494eeca93e259f10cafae7705780e6592f6dcb35b34752dab9bc2", + "stats_delta": { + "local_storage_hit": 1, + "local_storage_read_hit": 1, + "preprocessed_cache_hit": 1, + "stats_updated_timestamp": 3 + }, + "total_replay_seconds": 0.24228023600153392 + }, + { + "binary_sha256": "453650f9a0228647356e20c6f623c28c64b8ee2b1cb59563527284e72488727b", + "build_seconds": 0.23165936800069176, + "cached": true, + "commands": [ + [ + "/home/gaz/tmp/math/sprint/pass-47/ccache-local/usr/bin/ccache", + "/usr/bin/x86_64-linux-gnu-g++-15", + "-O2", + "-std=c++17", + "-DHDIM=8", + "-DVPORTS=111", + "-DRHELP=439", + "-I/home/gaz/tmp/math/sprint/pass-45/boost/usr/include", + "-include", + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/source/fixture_config.hpp", + "-DKPAIRS=4", + "-c", + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/source/columns_k.cpp", + "-o", + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/warm-1/columns.o" + ], + [ + "/usr/bin/x86_64-linux-gnu-g++-15", + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/warm-1/columns.o", + "-o", + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/warm-1/columns" + ] + ], + "compile_seconds": 0.15680903400061652, + "link_seconds": 0.02380861999699846, + "name": "warm-1", + "native_seconds": 0.003986212992458604, + "object_sha256": "b663ce933c6e6f1fcbcd0d01e4e7ed5b3b713ecaea802fc119db2dd55371a9f1", + "pairs": 4, + "profile_sha256": "86b7fc4ac394f5c134fe1d71e45745ec8e6ce39169c2890a82a9dd620856ffb0", + "source_sha256": "1c344d18fcd494eeca93e259f10cafae7705780e6592f6dcb35b34752dab9bc2", + "stats_delta": { + "local_storage_hit": 1, + "local_storage_read_hit": 1, + "preprocessed_cache_hit": 1 + }, + "total_replay_seconds": 0.23724235100235092 + }, + { + "binary_sha256": "453650f9a0228647356e20c6f623c28c64b8ee2b1cb59563527284e72488727b", + "build_seconds": 2.7477112480046344, + "cached": false, + "commands": [ + [ + "/usr/bin/x86_64-linux-gnu-g++-15", + "-O2", + "-std=c++17", + "-DHDIM=8", + "-DVPORTS=111", + "-DRHELP=439", + "-I/home/gaz/tmp/math/sprint/pass-45/boost/usr/include", + "-include", + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/source/fixture_config.hpp", + "-DKPAIRS=4", + "-c", + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/source/columns_k.cpp", + "-o", + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/uncached-1/columns.o" + ], + [ + "/usr/bin/x86_64-linux-gnu-g++-15", + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/uncached-1/columns.o", + "-o", + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/uncached-1/columns" + ] + ], + "compile_seconds": 2.6737269970035413, + "link_seconds": 0.02389517200208502, + "name": "uncached-1", + "native_seconds": 0.00367459500557743, + "object_sha256": "b663ce933c6e6f1fcbcd0d01e4e7ed5b3b713ecaea802fc119db2dd55371a9f1", + "pairs": 4, + "profile_sha256": "86b7fc4ac394f5c134fe1d71e45745ec8e6ce39169c2890a82a9dd620856ffb0", + "source_sha256": "1c344d18fcd494eeca93e259f10cafae7705780e6592f6dcb35b34752dab9bc2", + "stats_delta": {}, + "total_replay_seconds": 2.7527704419990187 + }, + { + "binary_sha256": "453650f9a0228647356e20c6f623c28c64b8ee2b1cb59563527284e72488727b", + "build_seconds": 2.744565444998443, + "cached": false, + "commands": [ + [ + "/usr/bin/x86_64-linux-gnu-g++-15", + "-O2", + "-std=c++17", + "-DHDIM=8", + "-DVPORTS=111", + "-DRHELP=439", + "-I/home/gaz/tmp/math/sprint/pass-45/boost/usr/include", + "-include", + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/source/fixture_config.hpp", + "-DKPAIRS=4", + "-c", + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/source/columns_k.cpp", + "-o", + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/uncached-2/columns.o" + ], + [ + "/usr/bin/x86_64-linux-gnu-g++-15", + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/uncached-2/columns.o", + "-o", + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/uncached-2/columns" + ] + ], + "compile_seconds": 2.668287030995998, + "link_seconds": 0.02473009599634679, + "name": "uncached-2", + "native_seconds": 0.0037050430037197657, + "object_sha256": "b663ce933c6e6f1fcbcd0d01e4e7ed5b3b713ecaea802fc119db2dd55371a9f1", + "pairs": 4, + "profile_sha256": "86b7fc4ac394f5c134fe1d71e45745ec8e6ce39169c2890a82a9dd620856ffb0", + "source_sha256": "1c344d18fcd494eeca93e259f10cafae7705780e6592f6dcb35b34752dab9bc2", + "stats_delta": {}, + "total_replay_seconds": 2.7496696739981417 + }, + { + "binary_sha256": "453650f9a0228647356e20c6f623c28c64b8ee2b1cb59563527284e72488727b", + "build_seconds": 0.23499315499793738, + "cached": true, + "commands": [ + [ + "/home/gaz/tmp/math/sprint/pass-47/ccache-local/usr/bin/ccache", + "/usr/bin/x86_64-linux-gnu-g++-15", + "-O2", + "-std=c++17", + "-DHDIM=8", + "-DVPORTS=111", + "-DRHELP=439", + "-I/home/gaz/tmp/math/sprint/pass-45/boost/usr/include", + "-include", + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/source/fixture_config.hpp", + "-DKPAIRS=4", + "-c", + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/source/columns_k.cpp", + "-o", + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/warm-2/columns.o" + ], + [ + "/usr/bin/x86_64-linux-gnu-g++-15", + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/warm-2/columns.o", + "-o", + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/warm-2/columns" + ] + ], + "compile_seconds": 0.15956388199992944, + "link_seconds": 0.023818297995603643, + "name": "warm-2", + "native_seconds": 0.0036845539943897165, + "object_sha256": "b663ce933c6e6f1fcbcd0d01e4e7ed5b3b713ecaea802fc119db2dd55371a9f1", + "pairs": 4, + "profile_sha256": "86b7fc4ac394f5c134fe1d71e45745ec8e6ce39169c2890a82a9dd620856ffb0", + "source_sha256": "1c344d18fcd494eeca93e259f10cafae7705780e6592f6dcb35b34752dab9bc2", + "stats_delta": { + "local_storage_hit": 1, + "local_storage_read_hit": 1, + "preprocessed_cache_hit": 1, + "stats_updated_timestamp": 6 + }, + "total_replay_seconds": 0.2402953369964962 + }, + { + "binary_sha256": "e1acce3b934a58e342be7ba27e86d4e88ed8e51464c4c995d2bc43219f5daf80", + "build_seconds": 2.8977318899997044, + "cached": true, + "commands": [ + [ + "/home/gaz/tmp/math/sprint/pass-47/ccache-local/usr/bin/ccache", + "/usr/bin/x86_64-linux-gnu-g++-15", + "-O2", + "-std=c++17", + "-DHDIM=8", + "-DVPORTS=111", + "-DRHELP=439", + "-I/home/gaz/tmp/math/sprint/pass-45/boost/usr/include", + "-include", + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/source/fixture_config.hpp", + "-DKPAIRS=4", + "-c", + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/source/columns_k.cpp", + "-o", + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/changed-transitive-header/columns.o" + ], + [ + "/usr/bin/x86_64-linux-gnu-g++-15", + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/changed-transitive-header/columns.o", + "-o", + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/changed-transitive-header/columns" + ] + ], + "compile_seconds": 2.8228606099946774, + "link_seconds": 0.02411729100276716, + "name": "changed-transitive-header", + "object_sha256": "469febb8edb2f678bc948e38e92b5e0c5ee96c70c544522cc2bfd82b2cc84d4a", + "pairs": 4, + "profile_sha256": "86b7fc4ac394f5c134fe1d71e45745ec8e6ce39169c2890a82a9dd620856ffb0", + "source_sha256": "1c344d18fcd494eeca93e259f10cafae7705780e6592f6dcb35b34752dab9bc2", + "stats_delta": { + "cache_miss": 1, + "cache_size_kibibyte": 88, + "files_in_cache": 1, + "local_storage_miss": 1, + "local_storage_read_miss": 1, + "local_storage_write": 1, + "preprocessed_cache_miss": 1, + "stats_updated_timestamp": 2 + } + }, + { + "binary_sha256": "0cb4cdc4665e66e44083ebae7611bb0a49c2e666882ed92df7697133f3d9899b", + "build_seconds": 2.9011425290009356, + "cached": true, + "commands": [ + [ + "/home/gaz/tmp/math/sprint/pass-47/ccache-local/usr/bin/ccache", + "/usr/bin/x86_64-linux-gnu-g++-15", + "-O2", + "-std=c++17", + "-DHDIM=8", + "-DVPORTS=111", + "-DRHELP=439", + "-I/home/gaz/tmp/math/sprint/pass-45/boost/usr/include", + "-include", + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/source/fixture_config.hpp", + "-DKPAIRS=4", + "-c", + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/source/columns_k.cpp", + "-o", + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/changed-source/columns.o" + ], + [ + "/usr/bin/x86_64-linux-gnu-g++-15", + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/changed-source/columns.o", + "-o", + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/changed-source/columns" + ] + ], + "compile_seconds": 2.8241070419971948, + "link_seconds": 0.02440686600311892, + "name": "changed-source", + "object_sha256": "8c5a543428d705cf034defd98b2466a99a22df03f2eafd2029966266070f4113", + "pairs": 4, + "profile_sha256": "86b7fc4ac394f5c134fe1d71e45745ec8e6ce39169c2890a82a9dd620856ffb0", + "source_sha256": "55f23d41713685490f63c8eb4424217d9ae100b99132dc26b4e2df1f4a36ebe2", + "stats_delta": { + "cache_miss": 1, + "cache_size_kibibyte": 88, + "files_in_cache": 1, + "local_storage_miss": 1, + "local_storage_read_miss": 1, + "local_storage_write": 1, + "preprocessed_cache_miss": 1, + "stats_updated_timestamp": 3 + } + }, + { + "binary_sha256": "c39c8372beed2e6ecaff932c7f9f76eac1e9ad12d283bf55f8a37595049e52e0", + "build_seconds": 2.9109372300008545, + "cached": true, + "commands": [ + [ + "/home/gaz/tmp/math/sprint/pass-47/ccache-local/usr/bin/ccache", + "/usr/bin/x86_64-linux-gnu-g++-15", + "-O2", + "-std=c++17", + "-DHDIM=8", + "-DVPORTS=111", + "-DRHELP=439", + "-I/home/gaz/tmp/math/sprint/pass-45/boost/usr/include", + "-include", + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/source/fixture_config.hpp", + "-DKPAIRS=5", + "-c", + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/source/columns_k.cpp", + "-o", + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/changed-flags/columns.o" + ], + [ + "/usr/bin/x86_64-linux-gnu-g++-15", + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/changed-flags/columns.o", + "-o", + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/changed-flags/columns" + ] + ], + "compile_seconds": 2.833275593002327, + "link_seconds": 0.02394907300185878, + "name": "changed-flags", + "object_sha256": "87345f8b2b7bf8d5ff91b59c738238e1edff76210987b45c0dbe9036eed1e4d8", + "pairs": 5, + "profile_sha256": "86b7fc4ac394f5c134fe1d71e45745ec8e6ce39169c2890a82a9dd620856ffb0", + "source_sha256": "1c344d18fcd494eeca93e259f10cafae7705780e6592f6dcb35b34752dab9bc2", + "stats_delta": { + "cache_miss": 1, + "cache_size_kibibyte": 88, + "files_in_cache": 1, + "local_storage_miss": 1, + "local_storage_read_miss": 1, + "local_storage_write": 1, + "preprocessed_cache_miss": 1, + "stats_updated_timestamp": 3 + } + }, + { + "binary_sha256": "453650f9a0228647356e20c6f623c28c64b8ee2b1cb59563527284e72488727b", + "build_seconds": 3.0314828019982087, + "cached": true, + "commands": [ + [ + "/home/gaz/tmp/math/sprint/pass-47/ccache-local/usr/bin/ccache", + "/usr/bin/x86_64-linux-gnu-g++-15", + "-O2", + "-std=c++17", + "-DHDIM=8", + "-DVPORTS=111", + "-DRHELP=439", + "-I/home/gaz/tmp/math/sprint/pass-45/boost/usr/include", + "-include", + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/source/fixture_config.hpp", + "-DKPAIRS=4", + "-c", + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/source/columns_k.cpp", + "-o", + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/changed-profile/columns.o" + ], + [ + "/usr/bin/x86_64-linux-gnu-g++-15", + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/changed-profile/columns.o", + "-o", + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/changed-profile/columns" + ] + ], + "compile_seconds": 2.9553506989977905, + "link_seconds": 0.023846139003580902, + "name": "changed-profile", + "object_sha256": "b663ce933c6e6f1fcbcd0d01e4e7ed5b3b713ecaea802fc119db2dd55371a9f1", + "pairs": 4, + "profile_sha256": "b8912596d6873d0a64239019f7a14b053b9bad874f11fd35d52575f3dc7b902b", + "source_sha256": "1c344d18fcd494eeca93e259f10cafae7705780e6592f6dcb35b34752dab9bc2", + "stats_delta": { + "cache_miss": 1, + "cache_size_kibibyte": 88, + "files_in_cache": 1, + "local_storage_miss": 1, + "local_storage_read_miss": 1, + "local_storage_write": 1, + "preprocessed_cache_miss": 1, + "stats_updated_timestamp": 3 + } + }, + { + "binary_sha256": "453650f9a0228647356e20c6f623c28c64b8ee2b1cb59563527284e72488727b", + "build_seconds": 0.23090458299702732, + "cached": true, + "commands": [ + [ + "/home/gaz/tmp/math/sprint/pass-47/ccache-local/usr/bin/ccache", + "/usr/bin/x86_64-linux-gnu-g++-15", + "-O2", + "-std=c++17", + "-DHDIM=8", + "-DVPORTS=111", + "-DRHELP=439", + "-I/home/gaz/tmp/math/sprint/pass-45/boost/usr/include", + "-include", + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/source/fixture_config.hpp", + "-DKPAIRS=4", + "-c", + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/source/columns_k.cpp", + "-o", + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/restored-inputs/columns.o" + ], + [ + "/usr/bin/x86_64-linux-gnu-g++-15", + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/restored-inputs/columns.o", + "-o", + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/restored-inputs/columns" + ] + ], + "compile_seconds": 0.1567484949991922, + "link_seconds": 0.02238368299731519, + "name": "restored-inputs", + "object_sha256": "b663ce933c6e6f1fcbcd0d01e4e7ed5b3b713ecaea802fc119db2dd55371a9f1", + "pairs": 4, + "profile_sha256": "86b7fc4ac394f5c134fe1d71e45745ec8e6ce39169c2890a82a9dd620856ffb0", + "source_sha256": "1c344d18fcd494eeca93e259f10cafae7705780e6592f6dcb35b34752dab9bc2", + "stats_delta": { + "local_storage_hit": 1, + "local_storage_read_hit": 1, + "preprocessed_cache_hit": 1, + "stats_updated_timestamp": 1 + } + }, + { + "binary_sha256": "453650f9a0228647356e20c6f623c28c64b8ee2b1cb59563527284e72488727b", + "build_seconds": 3.0088414790006937, + "cached": true, + "commands": [ + [ + "/home/gaz/tmp/math/sprint/pass-47/ccache-local/usr/bin/ccache", + "/usr/bin/x86_64-linux-gnu-g++-15", + "-O2", + "-std=c++17", + "-DHDIM=8", + "-DVPORTS=111", + "-DRHELP=439", + "-I/home/gaz/tmp/math/sprint/pass-45/boost/usr/include", + "-include", + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/source/fixture_config.hpp", + "-DKPAIRS=4", + "-c", + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/source/columns_k.cpp", + "-o", + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/damaged-cache/columns.o" + ], + [ + "/usr/bin/x86_64-linux-gnu-g++-15", + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/damaged-cache/columns.o", + "-o", + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/damaged-cache/columns" + ] + ], + "compile_seconds": 2.931611788997543, + "link_seconds": 0.023480298004869837, + "name": "damaged-cache", + "object_sha256": "b663ce933c6e6f1fcbcd0d01e4e7ed5b3b713ecaea802fc119db2dd55371a9f1", + "pairs": 4, + "profile_sha256": "86b7fc4ac394f5c134fe1d71e45745ec8e6ce39169c2890a82a9dd620856ffb0", + "source_sha256": "1c344d18fcd494eeca93e259f10cafae7705780e6592f6dcb35b34752dab9bc2", + "stats_delta": { + "cache_miss": 1, + "local_storage_hit": 1, + "local_storage_miss": 1, + "local_storage_read_hit": 1, + "local_storage_write": 1, + "preprocessed_cache_miss": 1, + "stats_updated_timestamp": 3 + } + } + ], + "ccache_sha256": "7d2751d15c9155129623875208b244eba175d6a75f3c4d2ff21bac8f613f09bd", + "ccache_version": "ccache version 4.12.3", + "controls": [ + "same-size same-mtime transitive header", + "same-size same-mtime source", + "changed compile flag", + "changed toolchain profile", + "restored-input cache hit", + "invalid word after cache hit", + "corrupt private cache result" + ], + "executions": [ + { + "build": "fill", + "command": [ + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/fill/columns", + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/baseline.bin", + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/fill/baseline.json" + ], + "exit_code": 0, + "input_sha256": "2df55087c71725651b7fc531323a371810f6c8c6d49d84d2c397bdc2d1862133", + "label": "baseline", + "name": "baseline", + "receipt_sha256": "52cef7fb4000f8596f32f9fc394e824f430754a4bf20e53e139704c9ef6890ca", + "seconds": 0.0017794340019463561, + "stderr_sha256": "a56d9c3fbb76cdf0d05df28605ad3e3ea46da3caf419504d055a2ba32d6b1dfa", + "stdout_sha256": "18fdac272e880e217a9129a2353ef88d133def76921055b85e0a3b68583c0819" + }, + { + "build": "fill", + "command": [ + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/fill/columns", + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/deferred.bin", + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/fill/deferred.json" + ], + "exit_code": 0, + "input_sha256": "9732a8373b845d090615a39a693dc3c1fdb165777aa9b136f4f86aaac8f90e0c", + "label": "deferred", + "name": "deferred", + "receipt_sha256": "f9e00efd26d1846826f6604e1970d9b5dcc996f8b9b2995a0a03e49b3eee2cb0", + "seconds": 0.0021569450036622584, + "stderr_sha256": "9acdae9d14f0706b83b0c43b0e6cd99f99e0ead18c4998618c89797a94e598c8", + "stdout_sha256": "1ff46eac997d6a93782719ea686247ff0ceca73b8777d22c3c81d7abc7e36c96" + }, + { + "build": "uncached-0", + "command": [ + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/uncached-0/columns", + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/baseline.bin", + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/uncached-0/baseline.json" + ], + "exit_code": 0, + "input_sha256": "2df55087c71725651b7fc531323a371810f6c8c6d49d84d2c397bdc2d1862133", + "label": "baseline", + "name": "baseline", + "receipt_sha256": "52cef7fb4000f8596f32f9fc394e824f430754a4bf20e53e139704c9ef6890ca", + "seconds": 0.002286868999362923, + "stderr_sha256": "6622265dc69ca9e26a4e6e4cf23785eb14a09dc84de66178f4fad7039ed9a8ff", + "stdout_sha256": "3dba180efe16e1eb6c92757d311589baa6cf6fecf27147df39cfba175522a6b2" + }, + { + "build": "uncached-0", + "command": [ + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/uncached-0/columns", + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/deferred.bin", + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/uncached-0/deferred.json" + ], + "exit_code": 0, + "input_sha256": "9732a8373b845d090615a39a693dc3c1fdb165777aa9b136f4f86aaac8f90e0c", + "label": "deferred", + "name": "deferred", + "receipt_sha256": "f9e00efd26d1846826f6604e1970d9b5dcc996f8b9b2995a0a03e49b3eee2cb0", + "seconds": 0.00175626999407541, + "stderr_sha256": "7a3d0269229edf85aa456d5dcb422891e995e35c3722d041c58a4befff11a0bc", + "stdout_sha256": "0785d119d51bba658c83dc4eb2e59ff5f61379382514fd3b13ef029369a997bb" + }, + { + "build": "warm-0", + "command": [ + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/warm-0/columns", + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/baseline.bin", + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/warm-0/baseline.json" + ], + "exit_code": 0, + "input_sha256": "2df55087c71725651b7fc531323a371810f6c8c6d49d84d2c397bdc2d1862133", + "label": "baseline", + "name": "baseline", + "receipt_sha256": "52cef7fb4000f8596f32f9fc394e824f430754a4bf20e53e139704c9ef6890ca", + "seconds": 0.001965675000974443, + "stderr_sha256": "15316f8f01616de55eb28931ecc845729a76c59d2178b20c64731d8acda53542", + "stdout_sha256": "de22e303d2615d39e404479db6e9460cee9c15844a6f056340864a345c1497b4" + }, + { + "build": "warm-0", + "command": [ + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/warm-0/columns", + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/deferred.bin", + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/warm-0/deferred.json" + ], + "exit_code": 0, + "input_sha256": "9732a8373b845d090615a39a693dc3c1fdb165777aa9b136f4f86aaac8f90e0c", + "label": "deferred", + "name": "deferred", + "receipt_sha256": "f9e00efd26d1846826f6604e1970d9b5dcc996f8b9b2995a0a03e49b3eee2cb0", + "seconds": 0.001793399998859968, + "stderr_sha256": "bb1e32c8ed4bfcbad8b7312c1ace1485e3d5f862c125dcb460c022bc8463e084", + "stdout_sha256": "8fc1b2ee9dd63cf7e09d86942121e2d2aaf9012f9c262eef3e99bab0224fda17" + }, + { + "build": "warm-1", + "command": [ + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/warm-1/columns", + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/baseline.bin", + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/warm-1/baseline.json" + ], + "exit_code": 0, + "input_sha256": "2df55087c71725651b7fc531323a371810f6c8c6d49d84d2c397bdc2d1862133", + "label": "baseline", + "name": "baseline", + "receipt_sha256": "52cef7fb4000f8596f32f9fc394e824f430754a4bf20e53e139704c9ef6890ca", + "seconds": 0.0019304379966342822, + "stderr_sha256": "825d7abb65c63dcdfb3403d5d15a63cab1203e5bdd01f398040d7b4ce3b22c86", + "stdout_sha256": "aa424219051276190cb0dcfd030eeb3cd20caac16942806a5e67fe6393cef360" + }, + { + "build": "warm-1", + "command": [ + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/warm-1/columns", + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/deferred.bin", + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/warm-1/deferred.json" + ], + "exit_code": 0, + "input_sha256": "9732a8373b845d090615a39a693dc3c1fdb165777aa9b136f4f86aaac8f90e0c", + "label": "deferred", + "name": "deferred", + "receipt_sha256": "f9e00efd26d1846826f6604e1970d9b5dcc996f8b9b2995a0a03e49b3eee2cb0", + "seconds": 0.002055774995824322, + "stderr_sha256": "17d13551b0a078d50e4138d33875275f7d8248511dbd2a0c4c5aed261c87f7e6", + "stdout_sha256": "8894daed05574267cd00c96a9d2b0f0bb6bacf7113ac4e672a6c935d434b0d97" + }, + { + "build": "uncached-1", + "command": [ + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/uncached-1/columns", + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/baseline.bin", + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/uncached-1/baseline.json" + ], + "exit_code": 0, + "input_sha256": "2df55087c71725651b7fc531323a371810f6c8c6d49d84d2c397bdc2d1862133", + "label": "baseline", + "name": "baseline", + "receipt_sha256": "52cef7fb4000f8596f32f9fc394e824f430754a4bf20e53e139704c9ef6890ca", + "seconds": 0.0019037680031033233, + "stderr_sha256": "4828a52ad172f0fe23dd47371021779cb39e9ebc2934857cabf11fa2ab22e2cd", + "stdout_sha256": "dae0e35a996de0dabfde53cff4abf5f39f8ae9d50625f9381cf0d95e37739c59" + }, + { + "build": "uncached-1", + "command": [ + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/uncached-1/columns", + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/deferred.bin", + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/uncached-1/deferred.json" + ], + "exit_code": 0, + "input_sha256": "9732a8373b845d090615a39a693dc3c1fdb165777aa9b136f4f86aaac8f90e0c", + "label": "deferred", + "name": "deferred", + "receipt_sha256": "f9e00efd26d1846826f6604e1970d9b5dcc996f8b9b2995a0a03e49b3eee2cb0", + "seconds": 0.0017708270024741068, + "stderr_sha256": "8876efed5de54176da8a4b8ef157aabd8c07376f15773b7bfc94f2494c1050c9", + "stdout_sha256": "9eb7e6f1dd4145c1b7d71d91e31baf55d95ee2018af7a38ec2fecdf16fef7bfe" + }, + { + "build": "uncached-2", + "command": [ + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/uncached-2/columns", + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/baseline.bin", + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/uncached-2/baseline.json" + ], + "exit_code": 0, + "input_sha256": "2df55087c71725651b7fc531323a371810f6c8c6d49d84d2c397bdc2d1862133", + "label": "baseline", + "name": "baseline", + "receipt_sha256": "52cef7fb4000f8596f32f9fc394e824f430754a4bf20e53e139704c9ef6890ca", + "seconds": 0.0019228240053053014, + "stderr_sha256": "85f4542f4d4e277e19dcee0133f458b4feb4defaed291a3938c8d69440411987", + "stdout_sha256": "f4856474fdcb8d393bdd38a16360c243532a4879149badf178919caa47d03a97" + }, + { + "build": "uncached-2", + "command": [ + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/uncached-2/columns", + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/deferred.bin", + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/uncached-2/deferred.json" + ], + "exit_code": 0, + "input_sha256": "9732a8373b845d090615a39a693dc3c1fdb165777aa9b136f4f86aaac8f90e0c", + "label": "deferred", + "name": "deferred", + "receipt_sha256": "f9e00efd26d1846826f6604e1970d9b5dcc996f8b9b2995a0a03e49b3eee2cb0", + "seconds": 0.0017822189984144643, + "stderr_sha256": "1d37e8f45928177cff87723b4b9ffe1565eee8234fa1dccd9b2a5ca5922f6053", + "stdout_sha256": "0d2ac1082a405c5ae2c557d653dc9d797a26589795c3b7ea66e5ec770787827c" + }, + { + "build": "warm-2", + "command": [ + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/warm-2/columns", + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/baseline.bin", + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/warm-2/baseline.json" + ], + "exit_code": 0, + "input_sha256": "2df55087c71725651b7fc531323a371810f6c8c6d49d84d2c397bdc2d1862133", + "label": "baseline", + "name": "baseline", + "receipt_sha256": "52cef7fb4000f8596f32f9fc394e824f430754a4bf20e53e139704c9ef6890ca", + "seconds": 0.0018471009971108288, + "stderr_sha256": "27d4445557548a13f62dee07394289e1460f6ad70efd84195c5bf0456e72132d", + "stdout_sha256": "a67d7ec3c5364ad73103b8af3d6ebec27e73ea2886b727fcec7fd22f144f5808" + }, + { + "build": "warm-2", + "command": [ + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/warm-2/columns", + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/deferred.bin", + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/warm-2/deferred.json" + ], + "exit_code": 0, + "input_sha256": "9732a8373b845d090615a39a693dc3c1fdb165777aa9b136f4f86aaac8f90e0c", + "label": "deferred", + "name": "deferred", + "receipt_sha256": "f9e00efd26d1846826f6604e1970d9b5dcc996f8b9b2995a0a03e49b3eee2cb0", + "seconds": 0.0018374529972788878, + "stderr_sha256": "e5a21e3e4a736040f6e8f85ad91b172e1590b2c43a230102cd9879566f41dd72", + "stdout_sha256": "40c2463d9c0d62f69b8f5a342ca3f272fc45b6459ee1d4afa8ea3a3f2d3d914b" + }, + { + "build": "changed-transitive-header", + "command": [ + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/changed-transitive-header/columns", + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/deferred.bin", + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/changed-transitive-header/wrong-copy-count.json" + ], + "exit_code": 2, + "expected_failure": "center boundaries", + "input_sha256": "9732a8373b845d090615a39a693dc3c1fdb165777aa9b136f4f86aaac8f90e0c", + "label": "deferred", + "name": "wrong-copy-count", + "seconds": 0.0011029279994545504, + "stderr_sha256": "edf541e1764f5dbadd57d4f3c8a42eee965a40ae195d8281bd959dfa7df03db7", + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + { + "build": "changed-source", + "command": [ + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/changed-source/columns", + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/deferred.bin", + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/changed-source/wrong-parity.json" + ], + "exit_code": 2, + "expected_failure": "local defining-decoder full formal column", + "input_sha256": "9732a8373b845d090615a39a693dc3c1fdb165777aa9b136f4f86aaac8f90e0c", + "label": "deferred", + "name": "wrong-parity", + "seconds": 0.0010102139931404963, + "stderr_sha256": "f85c6d1b3e3ba33de33b8a1b67726ed7eec2aeb725bdfa096baaf51dac0724e1", + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + { + "build": "changed-flags", + "command": [ + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/changed-flags/columns", + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/deferred.bin", + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/changed-flags/eleven-stages.json" + ], + "exit_code": 0, + "input_sha256": "9732a8373b845d090615a39a693dc3c1fdb165777aa9b136f4f86aaac8f90e0c", + "label": "deferred", + "name": "eleven-stages", + "receipt_sha256": "a3b64fca70cb8238d70786b8313ba0f976a6378b30f6c5877b76e14ef0a47ccf", + "seconds": 0.0022687659948132932, + "stderr_sha256": "baa854822d335717fedaa24a294c96f0c76bb1dcf4f1f98d3ad1888a1b4371ab", + "stdout_sha256": "bcda9f4f59063ffe8f2336a0c9cfaecdc489c71fa88ba39700d6b7806a54d6e9" + }, + { + "build": "changed-profile", + "command": [ + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/changed-profile/columns", + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/baseline.bin", + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/changed-profile/baseline.json" + ], + "exit_code": 0, + "input_sha256": "2df55087c71725651b7fc531323a371810f6c8c6d49d84d2c397bdc2d1862133", + "label": "baseline", + "name": "baseline", + "receipt_sha256": "52cef7fb4000f8596f32f9fc394e824f430754a4bf20e53e139704c9ef6890ca", + "seconds": 0.0019031260017072782, + "stderr_sha256": "d336cd7217da401f36ab76f9b4bc012ea88089d1f6406df83dc32b4c04467512", + "stdout_sha256": "30da32398452892c903c806682d4500f470993752e0b3fea614c1bc5d0b25b45" + }, + { + "build": "changed-profile", + "command": [ + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/changed-profile/columns", + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/deferred.bin", + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/changed-profile/deferred.json" + ], + "exit_code": 0, + "input_sha256": "9732a8373b845d090615a39a693dc3c1fdb165777aa9b136f4f86aaac8f90e0c", + "label": "deferred", + "name": "deferred", + "receipt_sha256": "f9e00efd26d1846826f6604e1970d9b5dcc996f8b9b2995a0a03e49b3eee2cb0", + "seconds": 0.0018455079989507794, + "stderr_sha256": "c244ff4f3727ddd03e84818e1c8603a70c5ca3a311ef657463ac221e605b655f", + "stdout_sha256": "bf0ba11d7c378332fe278a1603f7f25b47cf1c2cd183ff3799a809be4a737f7c" + }, + { + "build": "restored-inputs", + "command": [ + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/restored-inputs/columns", + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/baseline.bin", + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/restored-inputs/baseline.json" + ], + "exit_code": 0, + "input_sha256": "2df55087c71725651b7fc531323a371810f6c8c6d49d84d2c397bdc2d1862133", + "label": "baseline", + "name": "baseline", + "receipt_sha256": "52cef7fb4000f8596f32f9fc394e824f430754a4bf20e53e139704c9ef6890ca", + "seconds": 0.0017879500010167249, + "stderr_sha256": "b9b75f468788c5056262e3a03e6b8c782d63f8cf5d3b061ec701e4cbbbfd1cb8", + "stdout_sha256": "011d84a8a3b7e745370938f85f6c59788b08212531a6855b914f75756d8a5223" + }, + { + "build": "restored-inputs", + "command": [ + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/restored-inputs/columns", + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/deferred.bin", + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/restored-inputs/deferred.json" + ], + "exit_code": 0, + "input_sha256": "9732a8373b845d090615a39a693dc3c1fdb165777aa9b136f4f86aaac8f90e0c", + "label": "deferred", + "name": "deferred", + "receipt_sha256": "f9e00efd26d1846826f6604e1970d9b5dcc996f8b9b2995a0a03e49b3eee2cb0", + "seconds": 0.0017318129976047203, + "stderr_sha256": "04fff71c627da55a0bc5c1962fbf52be80cd7e4a25a0635b98658789d9e03c14", + "stdout_sha256": "9fe7c50d9a934ee36b4eea9390d5b1a41f6399ad5a1569e7ca0d5dbfefb65719" + }, + { + "build": "restored-inputs", + "command": [ + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/restored-inputs/columns", + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/missing-undo.bin", + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/restored-inputs/missing-undo.json" + ], + "exit_code": 2, + "expected_failure": "local defining-decoder full formal column", + "input_sha256": "2049f0fc960d3462561f372dc3b6cb9a8e33a90d84e18d4b513867208366e37b", + "label": "missing-undo", + "name": "missing-undo", + "seconds": 0.0010663399953045882, + "stderr_sha256": "f85c6d1b3e3ba33de33b8a1b67726ed7eec2aeb725bdfa096baaf51dac0724e1", + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + { + "build": "damaged-cache", + "command": [ + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/damaged-cache/columns", + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/baseline.bin", + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/damaged-cache/baseline.json" + ], + "exit_code": 0, + "input_sha256": "2df55087c71725651b7fc531323a371810f6c8c6d49d84d2c397bdc2d1862133", + "label": "baseline", + "name": "baseline", + "receipt_sha256": "52cef7fb4000f8596f32f9fc394e824f430754a4bf20e53e139704c9ef6890ca", + "seconds": 0.0019571779994294047, + "stderr_sha256": "c51db48da2aca76812e019da59d7b50399998a9f721e654687bd7769d16ddc89", + "stdout_sha256": "9bf196d85a58034d31b3ea4276ac2e962bebc271f33f3654466eae983ee0aecd" + }, + { + "build": "damaged-cache", + "command": [ + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/damaged-cache/columns", + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/deferred.bin", + "/home/gaz/tmp/math/sprint/pass-47/benchmark-final/damaged-cache/deferred.json" + ], + "exit_code": 0, + "input_sha256": "9732a8373b845d090615a39a693dc3c1fdb165777aa9b136f4f86aaac8f90e0c", + "label": "deferred", + "name": "deferred", + "receipt_sha256": "f9e00efd26d1846826f6604e1970d9b5dcc996f8b9b2995a0a03e49b3eee2cb0", + "seconds": 0.0018085679985233583, + "stderr_sha256": "0454b99a8491b3d2383ff6e22c63913dfa1cda53879c2879f689678d8078462a", + "stdout_sha256": "2b869daaa2ccaa523e1dd2271699c42af530d6cafe2af90c00619d5ab9190de6" + } + ], + "fill_seconds": 2.9417026810042444, + "input_replay": { + "formal_columns_per_word": 1327, + "native_executed": false, + "payload_sha256": { + "baseline": "2df55087c71725651b7fc531323a371810f6c8c6d49d84d2c397bdc2d1862133", + "deferred": "9732a8373b845d090615a39a693dc3c1fdb165777aa9b136f4f86aaac8f90e0c", + "missing-undo": "2049f0fc960d3462561f372dc3b6cb9a8e33a90d84e18d4b513867208366e37b" + }, + "stages_per_word": 9, + "status": "PASS_NATIVE_CACHE_INPUTS_AND_PYTHON_COLUMNS_ONLY", + "words": 2 + }, + "median_seconds": { + "uncached": 2.7527704419990187, + "warm": 0.2402953369964962 + }, + "native_executed": true, + "profiles": { + "86b7fc4ac394f5c134fe1d71e45745ec8e6ce39169c2890a82a9dd620856ffb0": { + "content_sha256": { + "/usr/bin/x86_64-linux-gnu-as": "4e5fcaa3cdc160173cb5cfe7aa35dc39d7aa1f06ba8d75b8d923bbae5473991b", + "/usr/bin/x86_64-linux-gnu-g++-15": "e6718f7e0c7d057c3ff77b550c603da9bc4030e3ede3c053705acce1293dbe4d", + "/usr/bin/x86_64-linux-gnu-ld.bfd": "97f48d93b8b076a92d2809ec29dcb17f0f37c8827358f832255e2ed22fef6075", + "/usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2": "bda779ea9e9ad234f60315477d7cfd0bdde861cd8ddd9df8cdaf62f18c4cec14", + "/usr/lib/x86_64-linux-gnu/libbfd-2.46-system.so": "950810b40b5d4d2e98769cfce6ec16b10f7f472afe069670b7dfeb3cde11a621", + "/usr/lib/x86_64-linux-gnu/libc.so.6": "85e64f97e348786a8fb4d9f3d52fec289e2fb86bba20f0731dfe61990525e0f7", + "/usr/lib/x86_64-linux-gnu/libctf.so.0.0.0": "8bc1c7c363920416d47ccee8eada9fb4c4b8a16c56e98df301976cd005670896", + "/usr/lib/x86_64-linux-gnu/libgmp.so.10.5.0": "fda9699eef15deda5f1c626e9140377a7f5d88c41516a54278ac02429cb20fa5", + "/usr/lib/x86_64-linux-gnu/libisl.so.23.4.0": "cef5afa0bca3dee62939b617c48a194138f238de0f8a7e272fae9fead65374ef", + "/usr/lib/x86_64-linux-gnu/libjansson.so.4.14.0": "8061b955f9d6bf15c6302470323c5cec3d7109482f306707ed019780cf0e7b33", + "/usr/lib/x86_64-linux-gnu/libm.so.6": "1c488db6f4fe8cecb72456bc018de000b7a9b539c2994864b0416b5e8371b3d8", + "/usr/lib/x86_64-linux-gnu/libmpc.so.3.3.1": "1fedb101971828caa0701a5b04620bb35841c2df3bf427cad131ec355bc0b5cd", + "/usr/lib/x86_64-linux-gnu/libmpfr.so.6.2.2": "1aed080b3143049fbe016cd82cdc5fb47db386386556cc1bb37cfccc133c0fae", + "/usr/lib/x86_64-linux-gnu/libsframe.so.3.0.0": "8ec144cd07697b4c1ff3a346541fe51d6f2e67304544c537e2e454c2d31e96ba", + "/usr/lib/x86_64-linux-gnu/libz.so.1.3.1": "47b61967895b30e8c0c6818dd633ffeb87711cf637c688f981896f0dd84ce23b", + "/usr/lib/x86_64-linux-gnu/libzstd.so.1.5.7": "060eeb79531d435306665fd78329d8a9dd579f95876c5960bb67937825362a80", + "/usr/libexec/gcc/x86_64-linux-gnu/15/cc1plus": "6f2b2c0e3fd32042eb2acace19a57fdb0b229d9c24cdd5e2cc100639c77e9ff0", + "/usr/libexec/gcc/x86_64-linux-gnu/15/collect2": "8ab5d946ba2c948e5ea5c91e25a104439302e0599a521785770d10690c565437" + }, + "environment_sha256": "ae281f1ad93d5689c661d8f6cd190092f59a21429224c23a65d2ae9b4225495b", + "machine": "x86_64", + "specs_sha256": "a719f80ca369e2646e95c5449c763404308fe1e77f00b235cb42fc651b24989b", + "system": "Linux", + "target": "x86_64-linux-gnu", + "tools": { + "as": "/usr/bin/x86_64-linux-gnu-as", + "cc1plus": "/usr/libexec/gcc/x86_64-linux-gnu/15/cc1plus", + "collect2": "/usr/libexec/gcc/x86_64-linux-gnu/15/collect2", + "driver": "/usr/bin/x86_64-linux-gnu-g++-15", + "ld": "/usr/bin/x86_64-linux-gnu-ld.bfd" + }, + "version": "x86_64-linux-gnu-g++-15 (Ubuntu 15.2.0-16ubuntu1) 15.2.0\nCopyright (C) 2025 Free Software Foundation, Inc.\nThis is free software; see the source for copying conditions. There is NO\nwarranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + }, + "b8912596d6873d0a64239019f7a14b053b9bad874f11fd35d52575f3dc7b902b": { + "content_sha256": { + "/usr/bin/x86_64-linux-gnu-as": "4e5fcaa3cdc160173cb5cfe7aa35dc39d7aa1f06ba8d75b8d923bbae5473991b", + "/usr/bin/x86_64-linux-gnu-g++-15": "e6718f7e0c7d057c3ff77b550c603da9bc4030e3ede3c053705acce1293dbe4d", + "/usr/bin/x86_64-linux-gnu-ld.bfd": "97f48d93b8b076a92d2809ec29dcb17f0f37c8827358f832255e2ed22fef6075", + "/usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2": "bda779ea9e9ad234f60315477d7cfd0bdde861cd8ddd9df8cdaf62f18c4cec14", + "/usr/lib/x86_64-linux-gnu/libbfd-2.46-system.so": "950810b40b5d4d2e98769cfce6ec16b10f7f472afe069670b7dfeb3cde11a621", + "/usr/lib/x86_64-linux-gnu/libc.so.6": "85e64f97e348786a8fb4d9f3d52fec289e2fb86bba20f0731dfe61990525e0f7", + "/usr/lib/x86_64-linux-gnu/libctf.so.0.0.0": "8bc1c7c363920416d47ccee8eada9fb4c4b8a16c56e98df301976cd005670896", + "/usr/lib/x86_64-linux-gnu/libgmp.so.10.5.0": "fda9699eef15deda5f1c626e9140377a7f5d88c41516a54278ac02429cb20fa5", + "/usr/lib/x86_64-linux-gnu/libisl.so.23.4.0": "cef5afa0bca3dee62939b617c48a194138f238de0f8a7e272fae9fead65374ef", + "/usr/lib/x86_64-linux-gnu/libjansson.so.4.14.0": "8061b955f9d6bf15c6302470323c5cec3d7109482f306707ed019780cf0e7b33", + "/usr/lib/x86_64-linux-gnu/libm.so.6": "1c488db6f4fe8cecb72456bc018de000b7a9b539c2994864b0416b5e8371b3d8", + "/usr/lib/x86_64-linux-gnu/libmpc.so.3.3.1": "1fedb101971828caa0701a5b04620bb35841c2df3bf427cad131ec355bc0b5cd", + "/usr/lib/x86_64-linux-gnu/libmpfr.so.6.2.2": "1aed080b3143049fbe016cd82cdc5fb47db386386556cc1bb37cfccc133c0fae", + "/usr/lib/x86_64-linux-gnu/libsframe.so.3.0.0": "8ec144cd07697b4c1ff3a346541fe51d6f2e67304544c537e2e454c2d31e96ba", + "/usr/lib/x86_64-linux-gnu/libz.so.1.3.1": "47b61967895b30e8c0c6818dd633ffeb87711cf637c688f981896f0dd84ce23b", + "/usr/lib/x86_64-linux-gnu/libzstd.so.1.5.7": "060eeb79531d435306665fd78329d8a9dd579f95876c5960bb67937825362a80", + "/usr/libexec/gcc/x86_64-linux-gnu/15/cc1plus": "6f2b2c0e3fd32042eb2acace19a57fdb0b229d9c24cdd5e2cc100639c77e9ff0", + "/usr/libexec/gcc/x86_64-linux-gnu/15/collect2": "8ab5d946ba2c948e5ea5c91e25a104439302e0599a521785770d10690c565437" + }, + "environment_sha256": "ae281f1ad93d5689c661d8f6cd190092f59a21429224c23a65d2ae9b4225495b", + "invalidation_control": "simulated-toolchain-content-change", + "machine": "x86_64", + "specs_sha256": "a719f80ca369e2646e95c5449c763404308fe1e77f00b235cb42fc651b24989b", + "system": "Linux", + "target": "x86_64-linux-gnu", + "tools": { + "as": "/usr/bin/x86_64-linux-gnu-as", + "cc1plus": "/usr/libexec/gcc/x86_64-linux-gnu/15/cc1plus", + "collect2": "/usr/libexec/gcc/x86_64-linux-gnu/15/collect2", + "driver": "/usr/bin/x86_64-linux-gnu-g++-15", + "ld": "/usr/bin/x86_64-linux-gnu-ld.bfd" + }, + "version": "x86_64-linux-gnu-g++-15 (Ubuntu 15.2.0-16ubuntu1) 15.2.0\nCopyright (C) 2025 Free Software Foundation, Inc.\nThis is free software; see the source for copying conditions. There is NO\nwarranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + } + }, + "python": "3.12.3 (main, Jan 22 2026, 20:57:42) [GCC 13.3.0]", + "scope": "One native column checker and two pinned words; fresh link and execution every time. No full selected replay or new mathematical result.", + "status": "PASS_NATIVE_CCACHE_COLUMNS", + "timings_seconds": { + "uncached": [ + 2.821791362002841, + 2.7527704419990187, + 2.7496696739981417 + ], + "warm": [ + 0.24228023600153392, + 0.23724235100235092, + 0.2402953369964962 + ] + }, + "warm_speedup": 11.455779693465951 +} diff --git a/research/native-ccache-columns/FIXTURES.json b/research/native-ccache-columns/FIXTURES.json new file mode 100644 index 0000000000..de07a58cc4 --- /dev/null +++ b/research/native-ccache-columns/FIXTURES.json @@ -0,0 +1,33 @@ +{ + "pr": 2373, + "head": "b52f87f5355ad9f02ca4ac4395117655ac1b19c7", + "inputs": { + "baseline": { + "path": "fixtures/baseline.bin.gz", + "container_sha256": "1a7d64777c6214084b6608048c6c02ca08b4fe682dd203fd4d1a6c086c4601be", + "payload_sha256": "2df55087c71725651b7fc531323a371810f6c8c6d49d84d2c397bdc2d1862133", + "records": 13421, + "endianness": "little", + "record_format": "six signed 32-bit integers", + "source": "Exact exported COHORT249-RECORDS.bin from the complete local PR2373 native replay." + }, + "deferred": { + "path": "fixtures/deferred.bin.gz", + "container_sha256": "b96c541149162e01c497b1fbbdf0f92da2044b51ae7e5e39e675c5af50794f5d", + "payload_sha256": "9732a8373b845d090615a39a693dc3c1fdb165777aa9b136f4f86aaac8f90e0c", + "records": 12991, + "endianness": "little", + "record_format": "six signed 32-bit integers", + "source": "Exact exported COHORT249-RECORDS.bin from the complete local PR2373 native replay." + }, + "missing-undo": { + "path": "fixtures/missing-undo.bin.gz", + "container_sha256": "eaada3c215e8c1bbdef1cf2551f9e51f4f851362d9dae997a365d8e389a964f4", + "payload_sha256": "2049f0fc960d3462561f372dc3b6cb9a8e33a90d84e18d4b513867208366e37b", + "records": 12990, + "endianness": "little", + "record_format": "six signed 32-bit integers", + "source": "Exact exported COHORT249-RECORDS.bin from the complete local PR2373 native replay." + } + } +} diff --git a/research/native-ccache-columns/NATIVE.json b/research/native-ccache-columns/NATIVE.json new file mode 100644 index 0000000000..b52f8d7c6d --- /dev/null +++ b/research/native-ccache-columns/NATIVE.json @@ -0,0 +1,392 @@ +{ + "baseline": { + "bridge_additions": 1998, + "copied_center_original_source_immutable": true, + "formal_columns_checked": 1327, + "fresh_center_copies": 81, + "global_live_registers": 1327, + "independent_dirty_registers": 439, + "local_odd_scalar_additions": 10492, + "local_raw_H": [ + [ + 1, + 1323 + ], + [ + 2, + 1342 + ], + [ + 3, + 79 + ], + [ + 4, + 44 + ], + [ + 5, + 102 + ], + [ + 6, + 11 + ], + [ + 7, + 19 + ] + ], + "local_registers": 661, + "local_scalar_additions": 10492, + "local_scalar_stream": "sha256:2df55087c71725651b7fc531323a371810f6c8c6d49d84d2c397bdc2d1862133", + "negative_controls": [ + { + "omit_bridge": 0, + "rejected": true + }, + { + "omit_bridge": 1, + "rejected": true + }, + { + "omit_bridge": 2, + "rejected": true + }, + { + "omit_bridge": 3, + "rejected": true + }, + { + "omit_bridge": 4, + "rejected": true + }, + { + "omit_bridge": 5, + "rejected": true + }, + { + "omit_bridge": 6, + "rejected": true + }, + { + "omit_bridge": 7, + "rejected": true + }, + { + "omit_bridge": 8, + "rejected": true + }, + { + "omit_bridge": 9, + "rejected": true + }, + { + "omit_bridge": 10, + "rejected": true + }, + { + "omit_bridge": 11, + "rejected": true + }, + { + "omit_bridge": 12, + "rejected": true + }, + { + "omit_bridge": 13, + "rejected": true + }, + { + "omit_bridge": 14, + "rejected": true + }, + { + "omit_bridge": 15, + "rejected": true + }, + { + "omit_bridge": 16, + "rejected": true + }, + { + "omit_bridge": 17, + "rejected": true + } + ], + "new_Q_categories": [ + 28, + 29 + ], + "payload_prefix_bits": 91, + "payload_prefix_upper": "2307861360443122886999501568", + "reverse_fresh_center_copies": 36, + "scope": "All independent physical input columns over F2, including all arbitrary helper dirt, restored; external copied-center work closes to zero. New cohort scalar lift uses actual signed coefficients and computed cancellation-free bounds; unchanged source527 signed decoder remains separate defining evidence. Physical projector routing and paid rank/bank receipts are independently bound, not inferred from scalar check.", + "signed_lift_prefix": [ + { + "bits": 14, + "cancellation_free_signed_row_l1_upper": "13667", + "reverse": false + }, + { + "bits": 22, + "cancellation_free_signed_row_l1_upper": "3758418", + "reverse": true + } + ], + "signed_reverse_semantics": "Reverse ADD coefficient negated; reverse DISCARD is fresh COPY from recorded unchanged original center; reverse COPY is DISCARD. Each such block is inverse over every commutative coefficient ring, by elementary-shear induction.", + "stage_additions": 94428, + "stages": [ + { + "fresh_copies": 9, + "scalar_additions": 10492, + "signed_inverse": false, + "stage": 0 + }, + { + "fresh_copies": 9, + "scalar_additions": 10492, + "signed_inverse": true, + "stage": 1 + }, + { + "fresh_copies": 9, + "scalar_additions": 10492, + "signed_inverse": false, + "stage": 2 + }, + { + "fresh_copies": 9, + "scalar_additions": 10492, + "signed_inverse": true, + "stage": 3 + }, + { + "fresh_copies": 9, + "scalar_additions": 10492, + "signed_inverse": false, + "stage": 4 + }, + { + "fresh_copies": 9, + "scalar_additions": 10492, + "signed_inverse": true, + "stage": 5 + }, + { + "fresh_copies": 9, + "scalar_additions": 10492, + "signed_inverse": false, + "stage": 6 + }, + { + "fresh_copies": 9, + "scalar_additions": 10492, + "signed_inverse": true, + "stage": 7 + }, + { + "fresh_copies": 9, + "scalar_additions": 10492, + "signed_inverse": false, + "stage": 8 + } + ], + "status": "PASS_NEW_COHORT249_ALL_BRIDGED_STAGE_FORMAL_COLUMNS_AND_PREFIX_BILL" + }, + "deferred": { + "bridge_additions": 1998, + "copied_center_original_source_immutable": true, + "formal_columns_checked": 1327, + "fresh_center_copies": 81, + "global_live_registers": 1327, + "independent_dirty_registers": 439, + "local_odd_scalar_additions": 10062, + "local_raw_H": [ + [ + 1, + 1323 + ], + [ + 2, + 1342 + ], + [ + 3, + 79 + ], + [ + 4, + 44 + ], + [ + 5, + 102 + ], + [ + 6, + 11 + ], + [ + 7, + 19 + ] + ], + "local_registers": 661, + "local_scalar_additions": 10062, + "local_scalar_stream": "sha256:9732a8373b845d090615a39a693dc3c1fdb165777aa9b136f4f86aaac8f90e0c", + "negative_controls": [ + { + "omit_bridge": 0, + "rejected": true + }, + { + "omit_bridge": 1, + "rejected": true + }, + { + "omit_bridge": 2, + "rejected": true + }, + { + "omit_bridge": 3, + "rejected": true + }, + { + "omit_bridge": 4, + "rejected": true + }, + { + "omit_bridge": 5, + "rejected": true + }, + { + "omit_bridge": 6, + "rejected": true + }, + { + "omit_bridge": 7, + "rejected": true + }, + { + "omit_bridge": 8, + "rejected": true + }, + { + "omit_bridge": 9, + "rejected": true + }, + { + "omit_bridge": 10, + "rejected": true + }, + { + "omit_bridge": 11, + "rejected": true + }, + { + "omit_bridge": 12, + "rejected": true + }, + { + "omit_bridge": 13, + "rejected": true + }, + { + "omit_bridge": 14, + "rejected": true + }, + { + "omit_bridge": 15, + "rejected": true + }, + { + "omit_bridge": 16, + "rejected": true + }, + { + "omit_bridge": 17, + "rejected": true + } + ], + "new_Q_categories": [ + 28, + 29 + ], + "payload_prefix_bits": 91, + "payload_prefix_upper": "1304011286425361906630611712", + "reverse_fresh_center_copies": 36, + "scope": "All independent physical input columns over F2, including all arbitrary helper dirt, restored; external copied-center work closes to zero. New cohort scalar lift uses actual signed coefficients and computed cancellation-free bounds; unchanged source527 signed decoder remains separate defining evidence. Physical projector routing and paid rank/bank receipts are independently bound, not inferred from scalar check.", + "signed_lift_prefix": [ + { + "bits": 14, + "cancellation_free_signed_row_l1_upper": "13667", + "reverse": false + }, + { + "bits": 22, + "cancellation_free_signed_row_l1_upper": "2825146", + "reverse": true + } + ], + "signed_reverse_semantics": "Reverse ADD coefficient negated; reverse DISCARD is fresh COPY from recorded unchanged original center; reverse COPY is DISCARD. Each such block is inverse over every commutative coefficient ring, by elementary-shear induction.", + "stage_additions": 90558, + "stages": [ + { + "fresh_copies": 9, + "scalar_additions": 10062, + "signed_inverse": false, + "stage": 0 + }, + { + "fresh_copies": 9, + "scalar_additions": 10062, + "signed_inverse": true, + "stage": 1 + }, + { + "fresh_copies": 9, + "scalar_additions": 10062, + "signed_inverse": false, + "stage": 2 + }, + { + "fresh_copies": 9, + "scalar_additions": 10062, + "signed_inverse": true, + "stage": 3 + }, + { + "fresh_copies": 9, + "scalar_additions": 10062, + "signed_inverse": false, + "stage": 4 + }, + { + "fresh_copies": 9, + "scalar_additions": 10062, + "signed_inverse": true, + "stage": 5 + }, + { + "fresh_copies": 9, + "scalar_additions": 10062, + "signed_inverse": false, + "stage": 6 + }, + { + "fresh_copies": 9, + "scalar_additions": 10062, + "signed_inverse": true, + "stage": 7 + }, + { + "fresh_copies": 9, + "scalar_additions": 10062, + "signed_inverse": false, + "stage": 8 + } + ], + "status": "PASS_NEW_COHORT249_ALL_BRIDGED_STAGE_FORMAL_COLUMNS_AND_PREFIX_BILL" + } +} diff --git a/research/native-ccache-columns/NOTICE.md b/research/native-ccache-columns/NOTICE.md new file mode 100644 index 0000000000..90c1a9571a --- /dev/null +++ b/research/native-ccache-columns/NOTICE.md @@ -0,0 +1,24 @@ +# Attribution + +New experiment, independent Python columns, wrapper, controls and writing: +Gareth Davidson (@bitplane), with substantial OpenAI Codex assistance. +No subagents or independent human review were used. Apache-2.0. + +Compilation reuse is provided by ccache, by Andrew Tridgell, Joel Rosdahl and +its contributors (GPL-3.0-or-later). Ccache is an external executable and is not +vendored or reimplemented. Its manual documents the options used here: +https://ccache.dev/manual/4.12.3.html + +The unchanged columns_k.cpp is DaysSky's PR #381 extension of Dylan Crow's +PR #370 / PR #346/#352 native cohort checker lineage. The authenticated +research/e8-bit-carrier-skeleton/NOTICE.md retains the complete predecessor +credit (eumemic, Anthropic Claude-assisted). The accompanying nlohmann/json +header retains Niels Lohmann and contributors' MIT license in its header. + +The raw fixtures come from our PR #2373, head +b52f87f5355ad9f02ca4ac4395117655ac1b19c7, which replays the PR #1188 baseline +and Sagar Thakrar's PR #2115 deferred-target-undo construction. No construction, +undo optimization or native checker theorem is claimed as new here. The +independent Python bitset and prefix implementation adds a replay of this +fixed nine-stage boundary; it does not replace the native engine in the timed +experiment. The benchmark runs unchanged, pinned native bytes. diff --git a/research/native-ccache-columns/README.md b/research/native-ccache-columns/README.md new file mode 100644 index 0000000000..191d4616c1 --- /dev/null +++ b/research/native-ccache-columns/README.md @@ -0,0 +1,149 @@ +# Reuse native compilation while rerunning every column check + +On this Linux/GCC fixture, a warm private compiler cache reduces the measured +build-and-replay median from **2.753 s to 0.240 s (11.46×)**. A fresh cache fill +takes **2.942 s**. These are local wall times for one native nine-stage checker +and two exact words; they are not whole selected-replay timings. + +This uses the existing **ccache** implementation. The contribution is the +source-bound experiment, full native receipt comparison, toolchain binding and +actual invalidation controls. No production entry point, frozen source or +selected certificate is changed. Mathematical success receipts are never reused. + +## Measured boundary + +The unchanged `columns_k.cpp` comes from the merged +`research/e8-bit-carrier-skeleton` at canonical base +`0fdd7d82de03e43c9e5a1000dfbcd380d1b687d2`. Its lineage is DaysSky's PR #381, +Dylan Crow's PR #370 and the original cohort checkers; upstream attribution and +the nlohmann/json header are authenticated by `SOURCES.json`. + +The two RAW6 fixtures are exact outputs of the complete native replay in +[our PR #2373](https://github.com/CrocSwap/integer-mult-bounds/pull/2373), +head `b52f87f5355ad9f02ca4ac4395117655ac1b19c7`: the PR #1188 baseline and +Sagar Thakrar's PR #2115 deferred-target-undo word. `FIXTURES.json` pins each +committed gzip container and its full uncompressed payload. The fixtures have +13,421 / 12,991 raw records and 10,492 / 10,062 scalar ADDs. The third fixture +removes one required undo from the latter word and must fail. + +Every normal native execution retains all **1,327 formal columns**, **439 dirty +helper rows**, **nine stages**, **81 fresh copies**, **36 reverse fresh copies**, +**1,998 bridge additions**, exact signed-prefix bounds and **18 omitted-bridge +controls**. Both words have local rank mass 5,129 and the same paid histogram; +the existing source checker, not this optimization, establishes its native +column conclusions. The source's phase-label, geometric, hosting, owner and +physical admission limits remain; this package does not rerun the complete +legality/exporter/5-stage/11-stage pipeline from PR #2373. + +Three uncached and three warm-cache samples were interleaved. Each sample +includes source and fixture authentication, fresh toolchain fingerprinting, +compilation or cache lookup, fresh linking, execution of both words and complete +receipt comparison. Each gets a new object/output directory. The fresh fill is +reported separately. `BENCHMARK.json` contains all individual times, command +arguments, object hashes, cache counters and execution receipts. + +| Mode | Local median / time | Native execution | +| --- | ---: | --- | +| Uncached, three samples | 2.752770 s | Both complete words every sample | +| Warm cache, three samples | 0.240295 s | Both complete words every sample | +| Initial cache fill | 2.941703 s | Both complete words | + +The warm improvement is 11.4558× on this host; first use is slower. The experiment +used GCC 15.2, ccache 4.12.3, Boost 1.90 and Python 3.12. Timing varies with host, +compiler, headers and cache state. `VALIDATION.json` records the separate +Python 3.14 read-only export replay. Hosted CI success is not implied. + +## Cache and comparison contract + +Ccache's [preprocessor mode](https://ccache.dev/manual/4.12.3.html#_the_preprocessor_mode) +keys the expanded translation unit and relevant compiler options. This experiment +turns direct/depend modes off, uses `compiler_check=content`, no sloppiness and +no remote storage. A dedicated config overrides system settings; all inherited +`CCACHE_*` variables are removed. A file named through `extra_files_to_hash` +adds fresh content hashes for the GCC driver, cc1plus, assembler, collect2, +linker and their shared libraries, plus target, compiler specs and a digest of +the effective environment. Compiler tools and the private cache remain trusted +build infrastructure, not an execution-authentication system. Those settings +follow the [ccache manual](https://ccache.dev/manual/4.12.3.html). + +The linker runs every time. Every resulting executable runs on both positive +fixtures during timing. Reference and cached object SHA-256 values must match +within each experiment. Every native JSON field participates in strict canonical +comparison, with exactly two declared treatments: elapsed `seconds` must be a +finite nonnegative number and is removed; `local_scalar_stream` must equal the +actual input path and is replaced by the SHA-256 of the complete consumed raw +bytes. No role, stage, histogram, bill, control or scope field is dropped. + +Seven actual controls run through the compiler/cache/executable chain: + +1. Change a transitive header's COPY count from 9 to 8, preserving size and + nanosecond mtime: cache miss, then the native COPY-count guard rejects it. +2. Change the source parity predicate, also preserving size and mtime: cache + miss, then the full-column identity fails. +3. Change KPAIRS from 4 to 5: cache miss, and the actual eleven-stage executable + checks 1,549 columns and 24 omitted bridges. This is a flag control, not a + full eleven-stage supplier admission. +4. Change the extra toolchain profile: cache miss, with the same native result. + This simulates a fingerprint change; no second GCC version was installed. +5. Restore the original inputs: a preprocessor-mode hit and both words pass. +6. Run the missing-undo word after that hit: the native defining column check + fails, demonstrating that compilation reuse cannot reuse a mathematical pass. +7. Damage this experiment's private cached object result: ccache rebuilds it; + both words then pass with complete receipts unchanged. + +The full benchmark performs **13 builds and 24 native executions**: 21 positive +executions and three expected mathematical rejections. Twenty positive executions +use nine stages; the flag control uses eleven. In total the successful runs +execute 384 of the source's omitted-bridge controls. No timing sample substitutes +an old proof receipt for a command. + +## Replay + +The registered replay is standard-library Python 3.12: + +```sh +python3.12 -B scripts/research_package.py --package research/native-ccache-columns +``` + +It authenticates source/fixture bytes and independently checks every dirty +column with Python integer bitsets, every local signed-prefix bound and the +missing-undo failure. Nine package control groups check pin drift, payload +binding, strict comparison, location binding, invalid JSON, inherited cache +policy, actual-entry-point receipt corruption and output preservation. Its +marker explicitly says `PYTHON_COLUMNS_ONLY`: it does not compile C++ or measure +native performance. + +For the actual native benchmark, install GCC, Boost headers and ccache, then: + +```sh +python3.12 -I -O -B research/native-ccache-columns/benchmark.py \ + --work /tmp/native-cache-new-run --cxx /usr/bin/g++ \ + --ccache /usr/bin/ccache --boost-include /usr/include --repeats 3 +``` + +The work directory must be new and outside the checkout. This harness currently +supports dynamically linked GCC tools on little-endian Linux. It uses a private +cache under that directory and changes no system cache. Each build, native run +and rejection retains its stdout/stderr there. The scoped workflow executes the +same benchmark. The locally downloaded ccache/Boost tools are not vendored in +this contribution. + +## Selection and next scope + +One fresh draw `2f939a000f93b5f7feca53d415dcfc3b` selected verifier-engineering, +first card `replay-runtime`, method source-bound reuse. No reroll or scope change. +The required selected baseline passed. Priority revision 4; selected κ unchanged. +Canonical claim: [Discussion #2408](https://github.com/CrocSwap/integer-mult-bounds/discussions/2408). + +## Open next questions + +Can the measured compilation boundary be integrated into a named production +native harness while retaining its exact pins and every required execution? +Start with PR #2373's native harness, keep its legality and 5/9/11-stage commands +and controls, and measure the entire before/after pipeline. This experiment +establishes one reusable compilation boundary; production adoption, persistent +CI caching and end-to-end speed remain separate work. + +Gareth Davidson (@bitplane), with substantial OpenAI Codex assistance. No +subagents or independent human review. See `NOTICE.md` for the unchanged native +checker, fixture lineage and ccache attribution. diff --git a/research/native-ccache-columns/SELECTION.json b/research/native-ccache-columns/SELECTION.json new file mode 100644 index 0000000000..db29f1d53b --- /dev/null +++ b/research/native-ccache-columns/SELECTION.json @@ -0,0 +1,91 @@ +{ + "seed": "2f939a000f93b5f7feca53d415dcfc3b", + "track": "verifier-engineering", + "suggestions": [ + { + "task_id": "replay-runtime", + "scope_key": "a76657a85478d269d19f", + "question": "Can one measured replay bottleneck be sped up without dropping coverage?", + "method": "Design source-bound reuse with explicit dependency invalidation and negative controls.", + "starting_points": [ + "scripts/run_isolated_tests.py", + "scripts/verify_replay_coverage.py", + "certificates/selected-result.json" + ], + "acceptance_gate": "Report before/after wall time on the same fixture, retained checks and invalidation behavior.", + "first_step": { + "command": [ + "python3", + "-B", + "scripts/research_baseline.py" + ], + "expected": "PASS_RESEARCH_BASELINE_BINDINGS_ONLY", + "inspect": "Read the selected reproduction command and choose a single replay stage for profiling.", + "scope": "Positive control / source-bound orientation only; this is not a new construction or full cold replay." + }, + "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" + ], + "scope_rule": "If you change the card's premise, record scope_status=changed and explain why. A package metadata check cannot establish mathematical relevance." + }, + { + "task_id": "portable-replay", + "scope_key": "831cc1a3c8f9ff01b197", + "question": "Can one reproducible environment or artifact-comparison failure be repaired?", + "method": "Reproduce one portability failure and add a minimal cross-environment fix.", + "starting_points": [ + "research/gzip-container-reproducibility/README.md", + "docs/ci-verification.md" + ], + "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" + ], + "scope_rule": "If you change the card's premise, record scope_status=changed and explain why. A package metadata check cannot establish mathematical relevance." + } + ], + "base_commit": "0fdd7d82de03e43c9e5a1000dfbcd380d1b687d2", + "catalog_assessed_on": "2026-10-14", + "priority_revision": 4, + "priority_log": "docs/research/research-priority-log.md", + "catalog_sha256": "d46eb6d5b3e279428753d770653663fbdf1063e55c255ea073d768f344927ef7", + "selected_record_sha256": "10b9e340fd8e354a37a0c4813c90e5de1dd42044b5f6aca4a3fc5a42b685fa32", + "selected": { + "kappa": "836330098538459/500000000000000000", + "review": "docs/research/community-batch1099-review.md", + "source_manifest": "research/community-frontier1094-audit/SELECTED-SOURCE.json", + "reproduce": "make frontier1094-verify" + }, + "status": "SUGGESTIONS_ONLY_NOT_RESERVED", + "next_step": "Check live overlap, refine one question's object and domain, and record a bounded task card. A different seed or scope key is not evidence of novelty." +} diff --git a/research/native-ccache-columns/SOURCES.json b/research/native-ccache-columns/SOURCES.json new file mode 100644 index 0000000000..71fb935334 --- /dev/null +++ b/research/native-ccache-columns/SOURCES.json @@ -0,0 +1,36 @@ +{ + "schema_version": 1, + "base_commit": "0fdd7d82de03e43c9e5a1000dfbcd380d1b687d2", + "files": [ + { + "path": "certificates/selected-result.json", + "usage": "provenance", + "git_blob": "ae6a99f28aa468649eb66a361e764d769363bf11", + "sha256": "10b9e340fd8e354a37a0c4813c90e5de1dd42044b5f6aca4a3fc5a42b685fa32" + }, + { + "path": "docs/research/agent-task-catalog.json", + "usage": "provenance", + "git_blob": "e8870e5917057d59b730eb14721a778639eca050", + "sha256": "d46eb6d5b3e279428753d770653663fbdf1063e55c255ea073d768f344927ef7" + }, + { + "path": "research/e8-bit-carrier-skeleton/code/bit/checkers/columns_k.cpp", + "usage": "input", + "git_blob": "42bb232fbec4de703e70cc13dc2f39a3b43a3a01", + "sha256": "1c344d18fcd494eeca93e259f10cafae7705780e6592f6dcb35b34752dab9bc2" + }, + { + "path": "research/e8-bit-carrier-skeleton/code/bit/checkers/json.hpp", + "usage": "input", + "git_blob": "82d69f7c5d044c9887c96b90c97f5639083ecd14", + "sha256": "aaf127c04cb31c406e5b04a63f1ae89369fccde6d8fa7cdda1ed4f32dfc5de63" + }, + { + "path": "research/e8-bit-carrier-skeleton/NOTICE.md", + "usage": "input", + "git_blob": "5a0ecdcd2c7fad0488740a1da0f633b73b56a809", + "sha256": "5f4b7fcbf99f572be28b6da612ce775363908cdfc7810f7aca167be01c86e49a" + } + ] +} diff --git a/research/native-ccache-columns/TASK.json b/research/native-ccache-columns/TASK.json new file mode 100644 index 0000000000..af66645ec7 --- /dev/null +++ b/research/native-ccache-columns/TASK.json @@ -0,0 +1,89 @@ +{ + "schema_version": 1, + "task_id": "replay-runtime", + "priority_revision": 4, + "base_commit": "0fdd7d82de03e43c9e5a1000dfbcd380d1b687d2", + "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_baseline.py" + ], + "expected": "PASS_RESEARCH_BASELINE_BINDINGS_ONLY", + "inspect": "Read the selected reproduction command and choose a single replay stage for profiling.", + "scope": "Positive control / source-bound orientation only; this is not a new construction or full cold replay." + }, + "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" + ] + }, + "scope_status": "refined", + "actual_scope": "Measure opt-in ccache object reuse for the unchanged native nine-stage BIT column checker on the two exact PR2373 words; retain fresh linking, every mathematical check and complete receipt comparison.", + "scope_change_reason": "Refines the drawn source-bound reuse method to one unchanged native column-checker compilation and two exact PR2373 fixtures, within the card's allowed one-stage boundary.", + "bottleneck_link": "Repeated native compilation dominates this measured replay stage. Source-bound compiler reuse can shorten candidate reviews without reusing mathematical success receipts.", + "budget_minutes": 60, + "stop_rule": "Compare three interleaved uncached/warm samples and a separate cache-fill run on identical inputs, prove actual invalidation controls, or report a precise negative result. Do not infer whole selected replay speedup.", + "outcome": "completed", + "evidence": "BENCHMARK.json: 13 native builds, 24 executions, exact reference/cached objects and complete native receipt equality; seven real invalidation/execution controls. Independent Python columns, source pins and nine package control groups.", + "author": "Gareth Davidson (@bitplane), with substantial OpenAI Codex assistance", + "ai_assistance": "Substantial OpenAI Codex assistance in design, implementation, execution and writing. No subagents or independent human review.", + "open_questions": [ + { + "question": "Can this opt-in compilation boundary be integrated into a named production native harness without changing its input pins or required executions?", + "why_it_matters": "The measured benefit covers this stage and a warm private cache. Production adoption and whole-pipeline timing remain separate.", + "first_step": "Wire a split compile/object-cache/fresh-link step into the PR2373 native harness, retain its legality and 5/9/11-stage commands and controls, and benchmark a complete before/after run.", + "blocked_by": "No production entry point or frozen source manifest is changed in this experiment." + } + ], + "selection": { + "seed": "2f939a000f93b5f7feca53d415dcfc3b", + "suggestion_index": 1, + "scope_key": "a76657a85478d269d19f", + "method": "Design source-bound reuse with explicit dependency invalidation and negative controls." + }, + "claim": "https://github.com/CrocSwap/integer-mult-bounds/discussions/2408", + "upstream_checkpoint": { + "commit": "0fdd7d82de03e43c9e5a1000dfbcd380d1b687d2", + "priority_revision": 4, + "checked_at_utc": "2026-10-15T08:15:17.573599+00:00", + "guidance_changed": false, + "selected_record_changed": false, + "overlap_coverage": { + "open_prs": { + "fetched_at": "2026-10-15T08:11:51.282742+00:00", + "complete_pagination": true, + "records": 617 + }, + "discussions": { + "fetched_at": "2026-10-15T08:13:44.536120+00:00", + "complete_pagination": true, + "records": 1140 + } + }, + "overlap_warnings": [], + "decision": "Continue the compilation-only experiment; matching current discussion is our own claim. Native source files and canonical base are unchanged." + } +} diff --git a/research/native-ccache-columns/VALIDATION.json b/research/native-ccache-columns/VALIDATION.json new file mode 100644 index 0000000000..f01d408c27 --- /dev/null +++ b/research/native-ccache-columns/VALIDATION.json @@ -0,0 +1,85 @@ +{ + "schema": "native-ccache-columns-validation/1", + "checked_at_utc": "2026-10-15T08:15:17.573599+00:00", + "native_executed": true, + "registered_python312": "PASS_REGISTERED_RESEARCH_PACKAGE; nine control groups", + "full_native_python312": { + "command": "python3.12 -I -O -B research/native-ccache-columns/benchmark.py --work --cxx /usr/bin/g++ --ccache --boost-include --repeats 3", + "receipt_sha256": "92511c79d1f7481af842aff094dc0e5b65e492b249579edbc3ac97289c6c5fd1", + "median_seconds": { + "uncached": 2.7527704419990187, + "warm": 0.2402953369964962 + }, + "warm_speedup": 11.455779693465951, + "fill_seconds": 2.9417026810042444, + "builds": 13, + "native_executions": 24, + "native_positive": 21, + "native_negative": 3, + "actual_controls": [ + "same-size same-mtime transitive header", + "same-size same-mtime source", + "changed compile flag", + "changed toolchain profile", + "restored-input cache hit", + "invalid word after cache hit", + "corrupt private cache result" + ] + }, + "full_native_python314_readonly": { + "command": "python3.14 -I -O -B /research/native-ccache-columns/benchmark.py --work --cxx /usr/bin/g++ --ccache --boost-include --repeats 3; python3.14 -I -O -B /research/native-ccache-columns/test_package.py", + "receipt_sha256": "dc553f2c93b8b58095ddb87ba451db85d36b0e241a97fd6701373ba278806b92", + "median_seconds": { + "uncached": 2.761171769001521, + "warm": 0.241031349003606 + }, + "warm_speedup": 11.455654131364513, + "all_normalized_native_execution_results_identical": true, + "nine_control_groups_passed": true, + "git_free": true, + "read_only": true, + "files_unchanged": 18, + "execution_snapshot_hashes": { + "research/e8-bit-carrier-skeleton/NOTICE.md": "5f4b7fcbf99f572be28b6da612ce775363908cdfc7810f7aca167be01c86e49a", + "research/native-ccache-columns/FIXTURES.json": "09dea334b5f848cef170d37425b813398a7d648492f38eb1348b71a108a6479b", + "research/native-ccache-columns/verify.py": "cc2a5a1eb8520569b5010285f56fdfe7050b8259c1acd62a09c9d82e55247874", + "research/native-ccache-columns/README.md": "dd05fba19effe6929e8ccdd31eb70218266b6714406c6a089c0056cc41f6a68a", + "research/native-ccache-columns/BENCHMARK.json": "92511c79d1f7481af842aff094dc0e5b65e492b249579edbc3ac97289c6c5fd1", + "research/native-ccache-columns/SOURCES.json": "8fbfba5efe736d831223d276ceee0eb32b8076959a8770d1b0707c2ab0a921c0", + "research/native-ccache-columns/NATIVE.json": "6e462c823e42ea136cf615462689f12478b123b16234001b3a1af5fe1415ed60", + "research/native-ccache-columns/test_package.py": "4684ded24b23204eeb631139cae79d83b9b5ce34a5656c8fa53fa0ba45eb4a6b", + "research/native-ccache-columns/SELECTION.json": "a621c366d2ef370426cb5cbf1f38f23f0ea8ee40fddf793ab0d382419eaa21a4", + "research/native-ccache-columns/VERIFY.json": "aa1fe01abc1e21dcbf6ad93b0669ace1cb4856fe7ce90264c7f767ba755593a1", + "research/native-ccache-columns/TASK.json": "1fe3c416aaeaf49d16a1acaf8f96efefaedef1d9a678f681f49d3caa7c6538a4", + "research/native-ccache-columns/benchmark.py": "afb6e0cd8dbfe9a9896f66743586917cae6e26ebdea8d56e8f61cc9bae0c973f", + "research/native-ccache-columns/NOTICE.md": "940cf90dd6ae613008c2ed77170d6ede44e365e3ff4a89fc7d21cac2f3a221ff", + "research/e8-bit-carrier-skeleton/code/bit/checkers/json.hpp": "aaf127c04cb31c406e5b04a63f1ae89369fccde6d8fa7cdda1ed4f32dfc5de63", + "research/e8-bit-carrier-skeleton/code/bit/checkers/columns_k.cpp": "1c344d18fcd494eeca93e259f10cafae7705780e6592f6dcb35b34752dab9bc2", + "research/native-ccache-columns/fixtures/deferred.bin.gz": "b96c541149162e01c497b1fbbdf0f92da2044b51ae7e5e39e675c5af50794f5d", + "research/native-ccache-columns/fixtures/baseline.bin.gz": "1a7d64777c6214084b6608048c6c02ca08b4fe682dd203fd4d1a6c086c4601be", + "research/native-ccache-columns/fixtures/missing-undo.bin.gz": "eaada3c215e8c1bbdef1cf2551f9e51f4f851362d9dae997a365d8e389a964f4" + }, + "snapshot_scope": "All execution code, fixtures, native receipts and exact live source inputs. Registration input declarations and final freshness/validation metadata were completed separately; no execution code or scientific input changed." + }, + "executed_source_sha256": { + "benchmark.py": "afb6e0cd8dbfe9a9896f66743586917cae6e26ebdea8d56e8f61cc9bae0c973f", + "verify.py": "cc2a5a1eb8520569b5010285f56fdfe7050b8259c1acd62a09c9d82e55247874", + "test_package.py": "4684ded24b23204eeb631139cae79d83b9b5ce34a5656c8fa53fa0ba45eb4a6b" + }, + "log_sha256": { + "BASELINE.log": "7ce90399c294ef676369ffbbf137bebe30bd219f701407c28ce96af46e60892a", + "REGISTERED-FINAL2.log": "1122fba823d069a6b66b18adf128dc2082e3fa6e121b3c1e6a251eba3083c47d", + "BENCHMARK-FINAL.log": "e9af684323f907d92fcd7e7e8ac9aa3b45831a9e4c9b145b9b46e7bd619e1472", + "BENCHMARK-EXPORT314.log": "01a9e74f41aeeda81b65fef7c024cf966e1a98ec1f2c3a60328c6291e1a89fc0", + "TESTS-EXPORT314.log": "eecf0c14416c5f74e1c30a949d4bc339c3e0aad592ea6db02a6848ef52bff510" + }, + "compiler_cache_documentation": "https://ccache.dev/manual/4.12.3.html", + "hosted_ci": "not claimed; scoped full-native workflow supplied", + "not_claimed": [ + "Production harness integration", + "whole selected replay speedup", + "new checker or cache algorithm", + "physical supplier admission", + "new kappa" + ] +} diff --git a/research/native-ccache-columns/VERIFY.json b/research/native-ccache-columns/VERIFY.json new file mode 100644 index 0000000000..d8e8fbd71e --- /dev/null +++ b/research/native-ccache-columns/VERIFY.json @@ -0,0 +1,35 @@ +{ + "schema_version": 1, + "status": "ready", + "python": "3.12", + "requirements": [], + "inputs": [ + "research/e8-bit-carrier-skeleton/code/bit/checkers/columns_k.cpp", + "research/e8-bit-carrier-skeleton/code/bit/checkers/json.hpp", + "research/e8-bit-carrier-skeleton/NOTICE.md" + ], + "commands": [ + { + "argv": [ + "{python}", + "-I", + "-O", + "-B", + "{package}/verify.py" + ], + "timeout_seconds": 60, + "checks": "Authenticate exact native sources and raw fixtures; independently replay every dirty column and local prefix bill in Python, including the missing-undo rejection. Does not compile or execute native code." + }, + { + "argv": [ + "{python}", + "-I", + "-O", + "-B", + "{package}/test_package.py" + ], + "timeout_seconds": 60, + "checks": "Nine package control groups for source/fixture binding, strict full-receipt comparison, cache-policy isolation and output preservation." + } + ] +} diff --git a/research/native-ccache-columns/benchmark.py b/research/native-ccache-columns/benchmark.py new file mode 100644 index 0000000000..99aceb39ab --- /dev/null +++ b/research/native-ccache-columns/benchmark.py @@ -0,0 +1,279 @@ +"""Opt-in native compilation benchmark. Every build is linked and executed afresh. + +Uses ccache's existing preprocessor mode, not a new cache algorithm. +Gareth Davidson with substantial OpenAI Codex assistance. Apache-2.0. +""" +from pathlib import Path +import argparse +import json +import os +import platform +import re +import shutil +import statistics +import subprocess +import sys +import time + +HERE = Path(__file__).resolve().parent +sys.path.insert(0, str(HERE)) +from verify import HUB, ROOT, canonical, fixtures, need, normalize, read, replay, sha, source_pins + + +def clean_environment(): + # Never inherit a user's relaxed cache policy, remote storage or cache directory. + env = {k: v for k, v in os.environ.items() if not k.startswith("CCACHE_")} + env.update(LC_ALL="C", LANG="C") + return env + + +def toolchain_profile(cxx, env): + """Fresh content digests, including compiler subprocesses and their libraries.""" + def query(*args): + return subprocess.check_output([str(cxx), *args], env=env, text=True).strip() + + tools = {"driver": cxx.resolve()} + for name in ("cc1plus", "as", "collect2", "ld"): + value = query("-print-prog-name=" + name) + resolved = Path(value) if Path(value).is_absolute() else Path(shutil.which(value, path=env.get("PATH")) or value) + need(resolved.is_file(), "GCC tool missing: " + name) + tools[name] = resolved.resolve() + files = set(tools.values()) + for path in tools.values(): + result = subprocess.run(["ldd", str(path)], env=env, capture_output=True, text=True, timeout=15) + need(result.returncode == 0, "supported dynamically linked Linux GCC toolchain required") + for item in re.findall(r"/[^\s()]+", result.stdout): + library = Path(item) + if library.is_file(): + files.add(library.resolve()) + return {"version": query("--version"), "target": query("-dumpmachine"), + "specs_sha256": sha(query("-dumpspecs").encode()), + "environment_sha256": sha(canonical(env).encode()), + "system": platform.system(), "machine": platform.machine(), + "tools": {key: str(value) for key, value in tools.items()}, + "content_sha256": {str(path): sha(path.read_bytes()) for path in sorted(files)}} + + +def cache_environment(work, env): + config = work / "ccache.conf" + config.write_text("compiler_check = content\ndirect_mode = false\ndepend_mode = false\n" + "sloppiness =\nremote_storage =\nhard_link = false\n" + "hash_dir = true\nstats = true\nmax_size = 200M\n") + return dict(env, CCACHE_CONFIGPATH=str(config), CCACHE_DIR=str(work / "cache"), + CCACHE_EXTRAFILES=str(work / "toolchain.json")) + + +def stats(ccache, env): + raw = subprocess.check_output([str(ccache), "--print-stats"], env=env, text=True) + return {row.split()[0]: int(row.split()[1]) for row in raw.splitlines()} + + +def delta(before, after): + return {key: after.get(key, 0) - before.get(key, 0) for key in set(before) | set(after) + if after.get(key, 0) != before.get(key, 0)} + + +def run_benchmark(args): + work = args.work.resolve() + need(not work.exists() and not work.is_relative_to(ROOT), "fresh external work directory required") + need(sys.byteorder == "little", "native RAW6 fixture requires little-endian host") + need(args.repeats >= 2, "at least two paired timing samples required") + independent = replay() + work.mkdir(parents=True) + raw = fixtures() + expected = read(HERE / "NATIVE.json") + source = work / "source" + source.mkdir() + for name in ("columns_k.cpp", "json.hpp"): + shutil.copyfile(ROOT / HUB / "code/bit/checkers" / name, source / name) + # A two-level include gives a real transitive-header invalidation control. + (source / "fixture_config.hpp").write_text('#include "copy_count.hpp"\n') + (source / "copy_count.hpp").write_text("#define NCOPY 9\n") + for label, data in raw.items(): + (work / (label + ".bin")).write_bytes(data) + cxx, ccache = args.cxx.resolve(), args.ccache.resolve() + need(cxx.is_file() and ccache.is_file(), "compiler and ccache executables required") + env = clean_environment() + cenv = cache_environment(work, env) + version = subprocess.check_output([str(ccache), "--version"], env=env, text=True).splitlines()[0] + flags = ["-O2", "-std=c++17", "-DHDIM=8", "-DVPORTS=111", "-DRHELP=439", + "-I" + str(args.boost_include.resolve()), "-include", str(source / "fixture_config.hpp")] + builds, executions, profiles = [], [], {} + + def execute(command, folder, name, *, command_env=env): + t = time.perf_counter() + result = subprocess.run([str(x) for x in command], cwd=source, env=command_env, + capture_output=True, timeout=120) + seconds = time.perf_counter() - t + (folder / (name + ".stdout")).write_bytes(result.stdout) + (folder / (name + ".stderr")).write_bytes(result.stderr) + return result, seconds + + def build(name, cached, *, pairs=4, profile_salt=None): + t = time.perf_counter() + # Input hashing and profile collection remain inside every measured build. + source_pins() + fixtures() + profile = toolchain_profile(cxx, env) + if profile_salt is not None: + profile["invalidation_control"] = profile_salt + profile_raw = (canonical(profile) + "\n").encode() + (work / "toolchain.json").write_bytes(profile_raw) + key = sha(profile_raw) + profiles[key] = profile + before = stats(ccache, cenv) + folder = work / name + folder.mkdir() + object_file, binary = folder / "columns.o", folder / "columns" + compile_cmd = ([str(ccache)] if cached else []) + [str(cxx), *flags, + "-DKPAIRS=" + str(pairs), "-c", str(source / "columns_k.cpp"), "-o", str(object_file)] + r, compile_seconds = execute(compile_cmd, folder, "compile", command_env=cenv if cached else env) + need(r.returncode == 0, "compile failed: " + name) + # The linker always executes; no executable or proof receipt is cached here. + link_cmd = [str(cxx), str(object_file), "-o", str(binary)] + r, link_seconds = execute(link_cmd, folder, "link") + need(r.returncode == 0, "link failed: " + name) + changes = delta(before, stats(ccache, cenv)) + build_seconds = time.perf_counter() - t + record = {"name": name, "cached": cached, "pairs": pairs, "profile_sha256": key, + "build_seconds": build_seconds, "compile_seconds": compile_seconds, + "link_seconds": link_seconds, "stats_delta": changes, + "object_sha256": sha(object_file.read_bytes()), "binary_sha256": sha(binary.read_bytes()), + "source_sha256": sha((source / "columns_k.cpp").read_bytes()), + "commands": [compile_cmd, link_cmd]} + builds.append(record) + print("build", name, round(build_seconds, 4), changes, flush=True) + return binary, record + + def hit(record): + need(record["stats_delta"].get("preprocessed_cache_hit") == 1 and + record["stats_delta"].get("cache_miss", 0) == 0 and + record["stats_delta"].get("direct_cache_hit", 0) == 0, "expected preprocessor cache hit") + + def miss(record): + need(record["stats_delta"].get("cache_miss") == 1 and + record["stats_delta"].get("preprocessed_cache_hit", 0) == 0, "expected cache invalidation") + + def native(binary, name, label, *, error=None, pairs=4): + folder = binary.parent + data = work / (label + ".bin") + receipt_path = folder / (name + ".json") + command = [binary, data, receipt_path] + r, seconds = execute(command, folder, name) + record = {"build": folder.name, "name": name, "label": label, "seconds": seconds, + "exit_code": r.returncode, "input_sha256": sha(data.read_bytes()), + "stdout_sha256": sha(r.stdout), "stderr_sha256": sha(r.stderr), + "command": list(map(str, command))} + if error is None: + need(r.returncode == 0 and receipt_path.is_file(), "native execution failed: " + name) + receipt = normalize(read(receipt_path), data, data.read_bytes()) + need(canonical(json.loads(r.stdout, object_pairs_hook=None)) == canonical(read(receipt_path)), + "native stdout and receipt differ") + stages = 2 * pairs + 1 + lines = r.stderr.decode().splitlines() + need(len(lines) == stages and all(re.fullmatch(r"stage " + str(i) + r" PASS elapsed [0-9.e+-]+s", line) + for i, line in enumerate(lines)), "native stage execution log") + if pairs == 4: + need(canonical(receipt) == canonical(expected[label]), "complete native receipt differs") + else: + need(receipt["formal_columns_checked"] == 2 * pairs * 111 + 439 and + len(receipt["stages"]) == stages and len(receipt["negative_controls"]) == 6 * (pairs - 1), + "changed flag coverage") + record["receipt_sha256"] = sha(canonical(receipt).encode()) + else: + need(r.returncode == 2 and not receipt_path.exists() and error in r.stderr.decode(), + "invalid mathematical rejection control: " + name) + record["expected_failure"] = error + executions.append(record) + return seconds + + def both(binary): + return sum(native(binary, label, label) for label in ("baseline", "deferred")) + + timings = {"uncached": [], "warm": []} + fill_start = time.perf_counter() + binary, fill = build("fill", True) + miss(fill) + fill["native_seconds"] = both(binary) + fill["total_replay_seconds"] = time.perf_counter() - fill_start + result_files = list((work / "cache").rglob("*R")) + need(len(result_files) == 1, "one cache result after initial fill") + base_result = result_files[0] + # Interleave timing modes to avoid attributing a one-way warmup trend to caching. + for i in range(args.repeats): + for mode in (("uncached", "warm") if i % 2 == 0 else ("warm", "uncached")): + start = time.perf_counter() + binary, record = build(mode + "-" + str(i), mode == "warm") + if mode == "warm": + hit(record) + need(record["object_sha256"] == fill["object_sha256"], "reference/cached object differs") + record["native_seconds"] = both(binary) + record["total_replay_seconds"] = time.perf_counter() - start + timings[mode].append(record["total_replay_seconds"]) + + # Every invalidation uses the actual C++ compiler, cache and executable. + header = source / "copy_count.hpp" + old, stat = header.read_bytes(), header.stat() + header.write_bytes(old.replace(b"NCOPY 9", b"NCOPY 8")) + os.utime(header, ns=(stat.st_atime_ns, stat.st_mtime_ns)) + binary, record = build("changed-transitive-header", True) + miss(record) + native(binary, "wrong-copy-count", "deferred", error="center boundaries") + header.write_bytes(old) + os.utime(header, ns=(stat.st_atime_ns, stat.st_mtime_ns)) + cpp = source / "columns_k.cpp" + old, stat = cpp.read_bytes(), cpp.stat() + need(old.count(b"if(q.c&1)xo") == 1, "source mutation site") + cpp.write_bytes(old.replace(b"if(q.c&1)xo", b"if(q.c&0)xo")) + os.utime(cpp, ns=(stat.st_atime_ns, stat.st_mtime_ns)) + binary, record = build("changed-source", True) + miss(record) + native(binary, "wrong-parity", "deferred", error="local defining-decoder full formal column") + cpp.write_bytes(old) + os.utime(cpp, ns=(stat.st_atime_ns, stat.st_mtime_ns)) + binary, record = build("changed-flags", True, pairs=5) + miss(record) + native(binary, "eleven-stages", "deferred", pairs=5) + binary, record = build("changed-profile", True, profile_salt="simulated-toolchain-content-change") + miss(record) + both(binary) + binary, record = build("restored-inputs", True) + hit(record) + both(binary) + native(binary, "missing-undo", "missing-undo", error="local defining-decoder full formal column") + # Corrupt only this experiment's private cached compiler result. + broken = bytearray(base_result.read_bytes()) + broken[len(broken) // 2] ^= 1 + base_result.write_bytes(broken) + binary, record = build("damaged-cache", True) + miss(record) + both(binary) + medians = {key: statistics.median(value) for key, value in timings.items()} + result = {"status": "PASS_NATIVE_CCACHE_COLUMNS", "native_executed": True, + "ccache_version": version, "ccache_sha256": sha(ccache.read_bytes()), + "python": sys.version, "profiles": profiles, + "input_replay": independent, "builds": builds, "executions": executions, + "timings_seconds": timings, "median_seconds": medians, + "warm_speedup": medians["uncached"] / medians["warm"], + "fill_seconds": fill["total_replay_seconds"], + "controls": ["same-size same-mtime transitive header", "same-size same-mtime source", + "changed compile flag", "changed toolchain profile", "restored-input cache hit", + "invalid word after cache hit", "corrupt private cache result"], + "scope": "One native column checker and two pinned words; fresh link and execution every time. No full selected replay or new mathematical result."} + (work / "BENCHMARK.json").write_text(json.dumps(result, indent=2, sort_keys=True) + "\n") + print(result["status"], "warm_speedup=" + str(result["warm_speedup"]), flush=True) + return result + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--work", type=Path, required=True) + parser.add_argument("--cxx", type=Path, required=True) + parser.add_argument("--ccache", type=Path, required=True) + parser.add_argument("--boost-include", type=Path, default=Path("/usr/include")) + parser.add_argument("--repeats", type=int, default=3) + run_benchmark(parser.parse_args()) + + +if __name__ == "__main__": + main() diff --git a/research/native-ccache-columns/fixtures/baseline.bin.gz b/research/native-ccache-columns/fixtures/baseline.bin.gz new file mode 100644 index 0000000000000000000000000000000000000000..db249d0bf8f3c990be82c55043b572b059a3d7c2 GIT binary patch literal 53326 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 F_^gkG@{QmX6_2RVKX)!u)`P4(IetzTg zsA9Uc(YV&I_4dcB#ixB=bN*uAL_)T&=~Nsl{hl)ww2k_w6Is*`K%gZPIO(?>MI#;WsiL>p0_fg|1a8Ncjq+zxOY6#++Ia zk*7b)i6-ao*Jc`59btKL4tbnyp40kyr_qLUvTU4mq9J7cms{@d7OZ}hy5@G;(q(a5 zZ!f#X&YpClX8A%gzmd9JvO=(G!?Kd}-+oB-E_@*0ac8V@_UnC7;-7!3Yg@iBnZIgo zZ5J{B{qlv0{8iSqONsIG4(usit?D7>&pqm5?LX!6z?bh<8(wa?yIS{He)Xg(L(r&v ztkaCy^?15&ra(V%{fp!fA%Eg>PScjtOLXtTCM-F-k3sQIJB!|xcNeLi3s!BcwI${6 zI~r&E<@oh?88o!=*2J8*@~P$LB5psj(4_uy#+WI&R4kqHI(V&k`R(|Nh0TISm!ol% z&gjMOGpk&8btkCbPP#7|%M7}$JIb{8FFU($A@L4%hAxi3%BHrB;J;`E9c>d8GZ((* zTx4I`;uoeHAJ&Sm9^UVNWvppY>DI@(y!0QJd2@H&UgmT~s?_{B(Esk#)VB7yu_Hd;Rw&~HRmc?h-fy|Ruba_ z?0cjl-Exj<%iU!+q{RH=Ng)s2TYB8f$2Gg2*}iXsv~OQlPfVJ((h&Cf#@4FN*Q+ZT zgnYwMje~#OnLV8pf9aut^j%xMm3G-@ql1~ZFI;*zvd1yV|E4fNbzpF~8RuR2Og{Cl zYP(?7WbeXx+0Id_9ztl?5!1BS;*uJgt$)6=(rFi$@=-DRGHJB%Ci->D-XC?v@~INl zX2IW5>Z|6MJJrKF%}sW$EOb3*)9nQ}#3I+QU18pmja$OU@x~i&J#9KI?{=@vC&V9* zYKeE>K&^Em8HeM#^U#%@LqqkDA8s;zk+v-A=>l z!=yia98?!S9{H8JL35iMy7D^Ow55Mqv10GvzC%rR{;Z`Rha{JaO-EkzpGBw0yVsua zRQldjxaTjbdhc5sO~|J?M>-ad{;%TeM)EA7(C@d7>N8@GXr`+#+%`&#S89}JM_x^< zGHNfMia0B~KTWrd-?(;XPQ2aVow>`0NAU?BubwyK)#cPn9>|U#X{Ol~p6}O*S8O?r zj3{FsrT&6!Mjk%js6+QaTq1{z;X!Nm)UJ3udRQeT=O6PL&72?I8S`G&vN&_9Pi$On ze6K~=uHD|D`?qYbPG1nYc=WHUs%89nHq$@Go>H#S3PT8eZ_vs5f)8&LY2UmzCYS*V_ZL@bA{yjQP!CZC|eS*-&yEk$h?j|MKt7E z7c#GBoX}R2;4Kz)$d&9`%HoALE*i#GF4NK8qWjL?x2Vk^@iNCTr|RDw&2=zFOf#<2 z2CUP)*FLa2m*H0%(@-}4Wc9Avk?>)Yjd9@&pT$w_ay2MLFdwI&3>NDYd+;=JyGxlO?P@T-R%;b)dr(zVy!|BlQxx9_>gx*#FiV6_1xE zZz2z#J{#5i#!ji8qYawiXz<|ozqP1cDpyzFPMRzOi^#~{1r~!3y|f_UOeukv3Wz^2S=&6%bW)Jt_3Fy|l+8N+^V1KA03Novn{()%4j`&|CUS9Ktd` zTNUuG%JhFZohcy~kk6fe$o*fCdqIw35hnl*@tnKgp*QrNOMA)9gX#aQfjtS*jT5h_ zpJbzh+7QD8u5|O;hi~lr^2*Si=;r3R`iC2-xUP`VV-FUdQ$K48)4 zUjG8o)v%CDzUX-EexyxaBA{gtZ*b9`Kr${B_6Kqpo8L-U&arVN@}Z?cO~NpPqMNbN zH!h~4@5v#}qgXUF^ek=K2!>EPEcbFHOd#xbBNFDXqCs~M7{8{*v_S9Y_%^GfbVp=WQL>!%v zafy5FWn{!ZL-(DE@7g@}!*wd=1@a;e^!H9YOt;a`U;0)bT zOXzeHCu|S}F!;mooV8M!hEFFdJ~^xA$e0A4b+8+IhIRmXBiqYY<7v1~3$YhkkA%x| zvMFS$ZKyS87P?03j3mgU1SW;+XvokC<;~exbhtuExi(`Z+33&yLAwiiBk#}3!;7pK z?qUb_6zzKCmb@)Hm8`MuB#UY2qNLu1EpC0jwX`fIQEJPj80J)@NME@%m8*0zr);TB zk)8NEcD(j)#98huh_MtoFz~RwaP3v3QI;<#C$Q{|W7w%$39?tF=FW0eF^W=XkLPJ5HO8gv)cX zbMZo}P$Fk4`n~o6vO+GkRFWj_94b0S`zIpJ7UCf`RD*XQ&D$c1~wl7z%icY`e~wqNd&Eg~^(C6=5ikZ^@ahD+lv5V9`6^nF+z zXrt>vQf1Waguw%SQIQ`UdNVq<2LF({Q{)tBQ#1jBu~EAZ4(6^vZP9F9M1`Pl)lNp1 z$dyEzC1b2Om`&6kMb64@@S&2(osQx;C>e`gb}CWhfTa?fuDyg*%a>;5k{~}VIb+dz z+6%~CxjL&EFQiBa95*ywYmd0g1F~6orKN;waD;=2Mxy z;%a(|FD(f{9!_W2i38cwwF{9!xw{~M$ihS1-O)wbFsy(Cxt6fNF|fcGWT`Bd4|#zz z5`qcRKfgn+%l)$QEJSu#u~gh=l;8CIGO4(7eXg@<9482MfGX`;v;Yf%#-h^$%EvJ& z(L>BgVmM1JjfB`6LOow|7ZoDqa!q!^=$N^}m<)#{tPlEeQai4#VHP??%Z_R~fQYhu zh&+#AKQ>qU57H>#lwD5LSV}B7WORwP0f~{Da8e@I#V`hS(z^WfupSrbP=te@_SgQ5 zyo8)e7+iQkf9uvr2f2x!iRfRGn^t6A^tetjM2yJx7gGi_1KD3Mgg&J`C%488FXAny z?i78%_m0iHxcM?=Aop;pC2VFII$Ntl_R4u=h&|rG(vBdJ@@j3>3A}MUdxv%naz);d zRc>Ljf=y1+dLbK4WjFWknOa=wzxx60_+B*bM2I#<<|oJ{De9z;9&T!78@WmJ*VN(0 zk!tjsF^c(#qQ5kHsp=tpV5vSQIePSM@Kobe0HmA90{Px-fHVh4s&VW@Z8{uMTUI$9 zBI?4iK$Enqk<&70c0?v#;%smS@Wo(6Xi2vcgV`PGRvn%e~YFJJQ56FVpJDow){K`nmxl>Y{Oos{S|pBch8biI&tFp zYr{k`anrn3XWNNS7y9;vy-~i`?0}p`dEzzF9Fi zkqu;+Cp%Mn4(XKzWu=m-q|k|wk+Fc9K{7p`N}^kHCm8I|pS1Z{HVNni9>LSL$!EI! zF5iVjBQYk57gVgLx)an@VNZAaTeaRH%PT&FJ!OPg)h#_zV$p2Na1|5S3$(*#fGa1m zD4j$x86Bq`LTu$yg2@>=7!y&*L;@v|XJxbtCMf%-X=g*_jf0i}Cq!z-LmAny_iG)H z5P3#+LRT<3d?cUE(H=nVc#Q@kG=3bR*{;YwHe=RbH}Cw_815pq;t~zk6)DDvIQ@h0 zi>BRHFPK>SglN z0yVyw!f*r_TCJS{N7lwqP?ulo=I!((7CCbK*x&yfFbh3~xIxo}Z)|<4Txd7Esg_5k z+d^}mi`svSTXup_#9pa=4FrLS%cT@q1yBEvAUw~G!@=r3f@$n9s4H*T3Vt3Al7s|{ z-LIX1%$Fw!6huHeXuNDE?GA*R16_7OMgqy1U9vaJCfr|w|AxZo_d$0BtBFxegsgAD{R}^(7yPR|+>6*qq z=j$?E3DPVp+wXNKJV>2%O<|uiqJR6;xM1R^{i^BmXzUSI3@dX|*dUs0NMV3+LnaUv zI2H>Q(Kv@41f8i%=EIM)6k1ChIo9Y5pqraysRE59-GVy~;<{h!j+A4)kd#YNmmfer z%AO0PcnG5lFs(002PBH#p{KdwX{-GYi|8+`0!_JDDOqEZHoICX4vu;1Fv;i|o3Eh( zQ}aT7kw?JOn(ZJ{1KHl%$H+S9E(!|~5o%*P+Yf5vmJFjRLR-K_FIdY=q+S-u7vkvl zMq8AMxX5YQCVQ?+@c4qrzp?$0I&rb?6#CfV%pd+q+x1;RUX6yY#PjR`niFy+TC4B; z9>w&q9$cd~c$%Eu|ZIHe72+7(UK`k6bh z$=0wCGD|84CX>~_C=AehiTp-Z3>iAp;HDG&k)G90O>=FAMN7jnca3`?`XS6zJFPqYy7kO8xUo6V;8{ZmI_s{4* z8!DKtwhG;yq|KhTy`?H3RDwLRh`=C<7qao%L*`ZqnQvhx?pE4mh+0PDGf7e#5Cl`S zK9K#)LmD2&W87r0Pm;)r;RcL<7Dn*FBrT>hw@f^qKbC3}YG<(jH^3g<1kGqgb{_Pw z6~}Xo-|PAzr$l@v8S2s9+^*{p+W$U!QiHwNleI69co{&sZILy|iuKxw$OBn_mKu5w z6xD3@80}?byWE!_V<{proPeX^%@lbPh8mR4F=Agf3rI3vUXm3_7GlkQ4EnQn9r6rL zUy4)ONt~hkdumy7O12sM9Sp(WFbu;)JkPQ;Az98O@Z12uW&qc8lkfcokl3q}wabAQ zBxEZ{BHKgxwv66ARA-=L1M?5k8ad9BFZclo^A)oHx8x2fi(-5SNr{9Q&oZzOP+18 z6L6r($aYMi5g{$cLRw4$9{H!NOuc*M0b`VI4?vZEE$7rd@}Ygy>ot*wQa(P4Ql7UP zJo;$%tO$cWrjg{|G!nx`JmEh=;hqg)w>1+AN66!C@_IoePG}QK1{OL)yA$+4y{tK# ziI+NO%J9loX#WlJ4831V+x1rf+*d0BtwxSiA@+~{^y3|5c?9?ob7;5F6LJ$Me= z2J(T$haO^6Rq!*01qR=N&=yfKOzmFaC7-oJn(>E)cYH#3+Ol=$&)Cpcafb2hT3dVL=js+cU%nm z!WWvMhTKWzOhnm9w?cRm+7*$4{@3%aDOL$ahU2xB`J}-E@lQ_%*w;Bl2vRP^&n}9J z&5sQ6_;ly_C8M9mC;IcPhTeVGnh#6y@8c~xtw29a0}9Z(e=q4?`I9WJ&@HKBoD>h( z80um;fhx*Y5UN|7aGZ-kZugz*1UBY1O-wDEa%oettD z?12Bn4lJmIPy*2I|NI6%q@$hLZ@>XvSRu<3uq=QsSabY9IfLJT$v+aE2z^e7#C+h` zDnx8}?enZS%Vuka1qjR~Sii)Ilcd3QI&mB;UggsLiba|br%%>?Z$l%XQ?1f&!ipa7 zL(x6`$pKx4-&RBCN>^!s(Y^U}mcoF5<8iLZ+I1{zhRwMP_Jd<%~JXjMv zOQ3lU1{}C1Ip189te!33LoC0!Ce4;W^=5;_d<;|%+Z4;eXw7!f$^i-LvvbM9V)W*3 zp~B6vn^?b&k7e$Vv+w_u^)FT3a0JsAbAJx(v!ujUX zDjU2gvHI9EmSZ_6qg|}}V0(?qwH(E%h;rL(7m``zP6q0ij@ZlG1?41@tC$X0^bATR zCVQy>dlYwq!9{xv$&=9pOrq2Qbklgy2>Y}nGsq0g^zqPgk&V)!g5M;4Jrj4<7vc5M zsx&zU3N&kmJ^Vn(|E1#^hfciM2dsd%nA(A!z$AIvOFWSJJ6*IZc0Pr4Qk?Cas@I*zcynAub>)4&lKWs-= z?R^{U@AB!b>YH!}gay?D+}jHvF(yl7X&MVwq=PmD$&gdBs3fqszC)Y8p)`?aV>~WV zCwa2ngQtM@{EVc@K)MiE1W4?lz(UGMR)SvBj|4BE)OkG-=w9|Ch6R)+;kPfR`?naf zplQ~a*X?2n%zC_dDxfoHG~kGlM4^LZ9K1UPybiNXgb5y7gTGli(PWxwbI=>eby>7P zO{Q6ZxU<$iG*@dvZ+8Es&iT|~vO1iOaCVkop!E9pU+VY)*2n;>?+Ug?oXF1T30XV= z*)M|zj7du(9Hs@>L;~4TK_rn$lsFp#QET9JUg+i;i(E>PW3V+lUE7Wf$&Q)B%y2O{ zX^W87v>lem|J-2F<>w+ppActDe*X5?87_-5;X5~CE!5$<4M?)giSL7p#2TqLSb^p? zN(8{NGi(Ou>WXZIAkUI!%WwmtwMt7u?7@~O$FcB`<4d85X39qR6cW`TbOMKjPQ>gW znOZ=zU|LCBfrHQ0zDIoJ3O)u9U`OuOjv{0kg%1fy;*JH#+7D%JmWUQSoTpQ%0Bp0Y zIE!XN5fQYF7j)P6@}8^!GRwY`1mqSopYXD!{9K&k(*oP@;ov~sK7iLa3m#SM2c+*O z=-@m&&*NnECTPoLgVio!RjWaWYJdSZXPd0KZU+Aff6WiUc19d1D{Sjs{CYe@5GcL* zz(sr?B1Sn4`^`iJGew(i0kbeeDOCKns;3$q*b9<+L$}BO$Q1rM{T}rw!0D&WE4EJjcg;2C%!BFA)?70k zF0qKTXJFcD8HQjO7bCLlItk(hY+LMnQ8vVK9qA+2>apeYwuIJ~f({?O4Ub(?Rec^qQ&>QwT zACi7C6d{+2QtJnl#tYw#Ey{tmyJi9M}_=2~7QAixI0KR1IAl_5o%t~*v zarL>6Yu&njk@TI7Yrx;Qy0f>k(x2G`O5w{Fn+nO{7)y~QxV2tpxAs4?*cPzEmQ69| zU`{rmo|VLggEzN4j0%}$rmMjUU9H`QsO2V{lvH}6XOp#F;d`lr>)q~h^MLM?szhFv zlD{sAde5eXNmTZ)i=r@z^@+{{8Ap{CQX+7)8_gnqv-gDIgv)OwK@*0fFJGd2PpIoX zOt;_>N(b-$FWmIwyjaEMOVTM5`g;DnA`S8wzKE#ANu0n3b%U-FAY)}K$vi7heCg6T@@-fy z+W^5}KmmK3>9Gi-$7FO1(BmocvXSR6XGiRqe>~?W``*PjV0blupuhCc2><15&mTDU z;5jG-LJQLvL!9U`H$Rn5n=2R;H^awah zE2IZfj?lJ>+w+p>-q1?tgA?I^l?_k~CV@KrhT_+wuN%6Id7YNx``xdaci+(R4)Kr;h^*OMK911G`G5dLkj!-u-J17ex|XYPD0pY)lGmw}Vfr(;^`={k39j@F2(|(1;9AF%HcDYoiB~ z_xMgX;O3Z)12ZYBnE))2z?lwEgbmVwXIRp0z$U*dCAU#Ho8{&Mr!_J?_(v>-}!i#ZWQv(;Zd3Oi6%jat3oX%xtbg zdm)RkArS^Udhm9kuaZK?8vL|rNW!;?kS!+w4F!H`_WsF{IO%h6+X#`iMGj`3a|%>B?|{t zZf|}qwtL=Hbp3T<&OV-1X&LXRdcDEDLc+r?@t>l}XX3L-gDn)~Z+4#+9$939r9KmYtLZo~lS!!i;LBBC%tWp(yqH_6Y z8GA8sbD*387YiBz_!l<(*)Ipv)4H^g*6E=3)%gP7EZbjjzZ!kiJDa;F=!O1%cqS|8 zxRWCdbEn7sHv)rJhzDw655r4vy0Nj8b*K%f$dzWM;gZd>2P%e{qL7=}OiQT^7g>fdZHT>jzsB3N@i;q;d9p5n4*`gXeQ*$amNpnM^L$I11H(a#V{eD@0r`}rAc$1A0pLd&Yh@$A7`vC#&Ahl^S2MHGn45_maeIzIptR79~$#jB$GPOaB5`wl0?8?8VB zuU9(eT6@|C`~Tm0HV+?+&FBV@pP)^vEt-i%?!i_^;X;6d3-TnwAE;gFuW*-RV+ z7Dga!*V3imQnYAXFd4$gL546Z5*v`Yu~%rDkj*e_)Zy@!mA9Z#hX+=l~F!>fJ{C}>VK z!^L%=_2-W?LD&* z4f6;aIBsm6*yQq9HaPmW08L}f9&Z_Rs&Y#fHhypd-?bC^%Sd*v1>_@k#=mIef%&@d zAuiUS#Kv=cp;j?%A|-+|OM+t!*DgioAP*gFgRS9E6qtpKqggYo!JOP{1_`ntq092? zKWP~>j;U4}ZP--7IA(Hy;RX&G2}Zl%d@ZD8qXi`RHf=>xFq6b{hB^Npv!(Dn3ua92 z!69f6oG`eTc$yW1AfAR+nn!Ul1T$$41zYh4^XS`T0hoUdhz8W8Rj0Ms57hE*vy#x` zskqQ_;PY6S4coYENLzv#fPdAN!BGeBS=eDyfem^+bik$$SPe~p=_?r9ErXNo6h!S4 z?4|q|61)@}_d8)`maL7RN~97>Z^b;Id|Ewn(Ri2g$!FxEGLiZs;A>b$A?TiuazAVu zM=G)fF+T>Ti0foMSqd2RciI7_1%a=Qm*-%9ArYjG9USoym;sdtU;=B!buxId?a+{^ z-|T8CxSBwQGuw^78Qb5ECJD=^O+F)AIbGa}=2l9taOAD{J0k(y{@YYYf}D{ly8pp6 z;k2Lx5ADDj+JUEeEWQHMT@+vxn9cteF!LMOMBd8i1-XmSWN>M~iH0ia1W`m5P%Qsj z85;{7_)0v>P%3n;<=R0QT$jUT2D&W>AWODgV6&6}w?2HqK#k6lIuw!3^5zuWl7I$A zV&ROTY%-k3Hd$HEpk+UOUM{7`4Sc*E(1hHmgRG%vIoJSs?{?{}>Gc*NXj-NfTzm{#{~n1)R(Y&lloq|Jdg zE-5J?c?Lh&3+xZ;8tOZoD0J`XRk2X}-4Kpy~}Rzg=Dr8@Hf zOaOIIh-w1pr-|T-dBb@31g7~dHH1!k=yFj>i5zr{t9mb?Rao0BfMj<7T=Pdmv~kGW zX&p?9TU~jYsGxsqnfj6(*?B!!d0*>Jfrm{US)&GdDH4I@gv?sqA-z2JKs0YU% z{4Z~~Z-NneFjPX|UP1ojeq@xhD?|sB5VQzn=T^DT_Pqlh@L%1=`gg zTmo$dZFJD~vg^r_7NF_YX@5bcgN1?(IvF-*sq&Y(??4GybP~)nHi~Q$zZ?f?WGSA) zjx-zkHlDDt!*lGzD>3q$-8 zB5Ve$zZ7lkw|iF@aACSM63j7yJcpk!`nmq%W|ix`6%z$t$vQH)fn{H_w>>T5*$p4d zm80d`lBz;Uy@vXWAPJc%fPH|Y$EX=1iFFxJ^_aVN)rzzf`tLQg5rdf$at1g9Q1Ayc%~bYJksm| zm4AiFE2M80oQ54F!9wt^9s+{`kXPusKp1jk((?v{$abxyT9!06vyv^8; ztGiN=mEH}vG$R&;LNKHY218J`BHl@WX8ia5}5jAsR_+^SRB?Q zy)kIVvFreN{h(}sX=3u5@}CZ=mchLwvd|(FyY_>%dOum*w=oqaOl)8fcLTc=VPi-D zjgldwWKnT+J1)UYOtJZa5~rwJB0Ml$M_0#bQ{mnV`0%764?vu>|Kl=Z7aKgp6gbY+ zM}_?1C(}RFkCPIhvyKOU`c_erP2b&!u+cEH#xP$Z!7fr^8Uyo)FuOVk8lwpZ8X*>> zu2di-(#g;kLVdeM?tdWo* za(FFVA`bc*?@CLa(6plDQs&6Kc4@((5f|MVEQZ-IOCc3GiLGD)42B#g{;(GL|FR^W z1vE%(QBX@+sc<)`(_KsfE%Q4VlfaOOOlye^pu>7?FQUY*s$lma=K@1>hxR4Rl3J+y zzcV*u;A3`0M3^CYnN3jN>;OwZei9%*1sv#VP*tA|;|!x?S~lO1j@s!|YPo*V!V!7? zq5UjU=a|@x-Op%G8G74+{>OgovLVIX`!SWg-xpBr&v35Hgo%FMo$A(w4_gl1IneK!XaexzQ#KdbbGTbX(=SfKlEkEXOS;hf}ux9DrTRXc^E zGtrykmT@aLj^w|1aBsLpxOzA+DgN}+BD{CPrFebVm!V%3(bpRidQSX1((~ zm8?_x!P8@D+kPzjy7j^Rgh9)nPH#vk&+{kU8jWp|w+{VOhZ7Uk-ie*3pQLTJR`L>y z__2Ov$qp^|i_5x}4V9(eETF@$x<%h?%s4f_w#@i5>|$`k_2=Tg)G-Axl7NoZ-q!RH!zv2U)_H(e5;uDV-M@porfExMeRKa zJ=QBERnB>LF0?*e*K+P=WB*yDXuau7e;eiK3TlNveRJKZg#HJ=H2#=akacfeOpa3I z9~#zr?p|7D%d2Z0tmTCf38`lnb{)RW?RfTTMH*>z!kWmZpR(7`pLGu{XC8PJ;j5UE z$hdWHbNt}6>utYwUHzpuEzx7e1>3PyZt6zqp?lstN26L^{XL$xvuTJqv<4+zo^ zzY=+EQ{7Ac_wQFHU(vnwhc(k@ZF^Lv>;2pR_Dq2=x_Gxf0N2RFBumMJzL99jRM1TOqQL>X&e{V+WHrb2&D$DT`G zyeVK21fe21e%q^V@-pRBf7aShGh0U`_m2G9b$a_Q(O1rf_|wnpT$bhQend0l`v>1; zl!nlZp7%^En5F)r^`91OtSo;bUv8_=XJ|tdudL7b-@3eYboAFQUh%4VQJ;gZ-4To4YDJiJWc&`Mc>ZR?k}0Iy668pxFUgk+W+60t)uB@9GgyW%sBHx z=(9K|3qqB7ek1R|&0f7tg@5Qz!xm*<=UoW@^F+*<2Xk8kmwl{!UgSF(=`KFUI@3w@ z(&x9LE7R7Oykbq>Yg0D#zm}!9PAokYTJ`4X$>LjkClA{9VxY0nJ!fj7wsql_J=Ee8 zf1Ybz-9tN_;+hzG^T`-RH}z3_SfaS}p8L+Om@AQ+@+rRCW*HCk-1KjXuKTq%t69JK zT0qL7^xyr9)_=NFc1G{L&HDwQNn`1>(UF^t_*0U~q9}?^{VeCn2G{4YUznoNPoHxd zng1Rida2?GP`_@aE5qQXXEYx%d8l|f=-qCmix|Bd;l@l-nX*v&BxAu)z*QGs)AVgC zeT_6WTYLI?l5LPJ0|Tuqg&!*Tv)@*LEXERd1BNZ-n>V} zT5MQ#Sh~%4LS3s&e(Va1b61%Tp_ScAlwsIha$Hx4W;pUFDosAmiLKKY&Yha1qAoJv z5A${!Gv6HJeK@1r?qeKN16LhOx|IhQhUk*x)`e)CqsdN{_|%sn-nGk(nXLMAQmBop zdg`>_U1+--&i{KP*HSlUl9A|i=Jhd`^6e`>*VG?C&pT2Z2vwhIkG0K}e5$EGguZs9 z))T6_%^!5v)E`7E98H(4m#eT3rY5VHd^B%TXp!}D^RG5NN_Yw zsPUN-c3q5pur`9T=5VBq?$OGqUulf?b92g^gcDV#!#Ori0}rvSpbwpdV^z_MIWwFF z4w*kV3`dm2z$v%e+$70$sdU z=**fDzp!}oI_^an+8j;(H6;OIAH^uIZ*L+a!Vu(Wa;S-$9mXP zqxp9RA~-t^H{0ocTKP1HA+DI&6%@f)f4JF3_hw}j$-H)flh8wTH=N_(bmkcr^(P-{ z)CbT4M_~hD`xjMhqMP3W-2<=CfEx9junXpAK8fHk4maEChE_(6H$UQ-laQ+F59e4q zoq1_~#HSjU11R5-`7dF6KlX^b3v>s)B(rN==7ha5KjL!)XZ2y4jjncOl!N&ZIZn)p zs$=1X%Bj;z%<*}Cgl4Jpo+K%@e*7Lg+3r266=9s|hiM7?J?5=GC`9)-G96UDe_Ra4 zcDBvaM>4i1hL1j;I!$DLgyINfs8WFbI(3@R{6X^(k%R7~m*kN3V~zQlsj7sqP9xU>i18^Z z_r;v>!>nKUN6n8|Qh?SuDqU6i=PzD1KVr3yWO_}&K~%pgY7Vy5JLjF0cB=d^&R(ar z?O3$F@2e@#LdQEQTL@J>*fS+PHRXJCy`!>~a8`?jZ$+RkagxNohW879c{-M&-i7FW zN9A}G-9PM#IV0CZaDooA$U2XeQSs)N+;dWnQ3WmL_&BYtGry#(CiM{7DUeCoBM=6Kc~q2hGmlepKc|1#I>`u(b$FvIM_)ZP5Q%+GvTfR1sb<5WxkxcJHZ z%>6#xaW%Po^x4#F=F-|weT0hFZJT8Db6We{yv~m`xd+iZj&wQUr8$8U7U-P3xRYxl z=Z2M;v#&M6@XKMLoi2K1l!tk%C!Ofds*=Tqc}{B;=126@MCPC$9qHACm*xcSS)db! z8`O^U=Y*GfZ0|imy1SFO<7=Az!|cuBBSjco98JWU<~d>Z=9e6bFvK1f+UojOMolrl zx#cD1AkkZ(ewQkdC?7kmo3EB9xhvYg3@E$BP?M!C6Qls$?qnfLi8l=mZ#HG||=7;r~2g*^kupax zGujD5UG!TcU395HH(M!ZpVw?P$n>+h2w}jdD9czwy*O$j?=+cQ+9^icJ~HpX@T1%) z`hs}ALHC=gmHlt@>S1(Yaw4ZAey1qZzV{_PY@|Q(snOtfFLl(ece8ZSNDJ+$WWX2x zY6E`_Gj*|^n%Jbe{K9PAj=8(n*ZrQdPi1n;*%4ZD^3uP__rLD_{GqtN(t1xLllD*M zs=8y3)oqU&0mYnn#(v=R5+`S7^Hx;d|@xrZHFQ zO>dv<9jK=?B=>x-66JS~rZ_A)>3hHD$9*X+3*z_-Gc+p~5bBlsW6Jfa72(pP_zx};3!Uo9pOd?eT`<0x)tOwny$Qehj4>gIT5@b;G$3rV zxa)J%$OqM+=+V%X8+okc=%Ui)(oM;yBVv3CS4_QjBTvK*@s`-dDjv)B_s*?hrgR^B zpo>AoGj=PgzJE8E@tCJ<400f@j19O#e{t?g{^_Q5PA}k-K5@hDPSo-`b)WuA+9lQ4<@AteQci>R#nBRT`^tvvT>xh>;0yG z2dMhhbw00^%c=U|pZUY=p@%&iD@3EeejQ04D)LiQN-q7Iwlbyax}LUzM_AW{$LQ-- znm@ki`#WRo_6Cm}oUG1#owjncec#F`x+b$@|EoDk%na2FX8Sjf~C- z!;3k>!2W4u_Gs%D2`PQ(>-_g_*9KDC2A`4^ehi);hOgpu4E{k%?~44Ty>^n+xUFuh z-I}^9uahST3icIUxERKes8Tw1>B}OwOl)u~cCcPF#j`R%FpUpr%LqmA;% zY*OW{H(T@}=L_YXBS-hVy1tj0K7BEEY-Rg$dL(K5P zeLw$Ec!{x~wwJ@xm;LsD=Gpze?dd>|o$ZpQ=)0q#)dl;0zEHT8A-VJ9U_&l*d#gGp zW9WwqU+iLrX`h2f-$pFF)7X?mW9rr|H{hOY{QhZ(=^pE?Z~uDiP1+Ar3ihea7mmTU z8**g~gMLh`{GA~Yoo~)8ZZZ9=Smye%*h%sE_`nzE-1RD#KlDM58}ymaMSjaaD&Ws-ZaET{QpX-TDlM&voIN@yOdFDHecXRxZjrpSf9S&L2+rO9 z3wa`x;LZIljk&Fgvwe5ij^^G9k08yKo2Mgicl};9#I%Rf|IM5!8sgNa4ZWJ(HM0&f zGU&C=wF}ngAJm1dZ`i*}tn)l&WYd((cT8+yZ=ZPBqhwxZi1Lp@9YbPWIB3_Q`1QQ5 z&PmL9?>Vnrof3RMu}g>)_aA+80m0V4Kb7g5P{xCsh3YjOup;) ztRY6cYwa%_N;IwT-TO^VXW~xH4SiZ_JMYmlpF3|ZynFB48GeNI^C!R4u>70pTv-10 zpp%(@pKiLbBku1!QN?C`OXjVsL!1)!(Bt_J#p)D;xaxjna!Xp{=asrI&gDIxm7@9c zHK~8)u_E^xN)An~-`qC1=<33c-^~e%hVsv!p?mbiP#@2Lf39U%|dp`Gszf8efMdn4DQB`_&A|;3|)v{-}52jX|?M?DZ)ew?n;`#!Rl1 z45&K;?bDckRh;NQjQ1}*M(x|E0neBDTzPZhBNn}?f{!OsPwD43G^C!G-u(UciDx#K zB%C`PG2^aZLqiOwbgWSRB(9+Meg2yPN~6P)CjGt9rFRSWt;sKZgXQMtKz*5UN5Ll- zhGcHQKw@)mAR~x1U|Zh#bBaX!WxwLcex^IQe@(~WcO7ZhSqBE$y5!{?OF#PVlX}U! z&WC@iQ;ZiAZ=CNcK3(_uiLNuRl6!rmHGgZBG_pOE*3zqSr*sJ+hd=kB>hga8tJvP5 zi5oO@h`i&&(USLDCE;o3HNVZeS%0i;@W&3+X14MY?nx>;$oxTe2b#Nzu8Gy`rS0rg zw?lL&ZMngUWjNq6i$7#D(}Kbbc1tA6}~kH7c_9Wz&MQ(wZeMqTXZ_iZ)p@b4Cvl;&@(Pyarp<b1 z+*Ox5Q}^ZU`~_>$cGoN33@$tu`0RsTv5zc`t z5ewfuX<7rg^L{yJs$XavRPmFyP2CSRQ{+t=MtAY)j?drse`)NyY0^l}y?IyJ-jI6l zfil+fXl%^Zd&}Y;oQ`m~d$+wICiw1HdhKx*^X+@z1pi`v`$Cf* z7;f>+?IN#FA6oCH@AM7-y}z$F_~hA$g%6%IEr<6nUj4i7;3~-tgN}5GN6lGx>EEG| z6yrZLd8FMyw~QrJ>@b~SN$~I{wMnr z%ko&;_eviu9Jhe?;O}K|Wo;2Zr>uwgC|0ZJa}~Pz42k9fM*+pNzjc3?BJkrozn}yN z4}Fa)*b%J7^W)C0@!?f+l9f-zgKaW@SA@Il!Vn`pJ9RJ}u?X+?_2Pnt+r z{dz(v&5FX5deIKQp3YrgPFCl47o|i`+p~F6<;mw$Q^mi%dGpSL44aD7m+kA8 zuy7ID$o=Wf=c3*P&mS@TF|)72 zvAha)``pL*>T|?@*1x6(tt-5vajx@Qgy0Iw$exUjcI%9UI z*ycEe=JKiw0==OFJ-VZy&0orEJihn!_@lA)b)l4m{I=a&Qtqc|R){Z;Wj=aW+0jsb z#;yNO$hZfdClj~5?z``EzOWa2--CO73G232o&4)IV`(h}jWK`5T*(@AsN$??1`i$D zThXplH$F-3eCv_Zw1d-dGV0yK$tjr{kBEh58=D+7frkU4Rog=tKM7Mx@>rbbaZQ_t%w>l^f!7Bpon{=NVH=e>)*27X-Y z7nA|Xp8CHfb@aI(HG^NyE{N<6F7L5!8;Z*4NIttGP6SPSinnpo-U2CnH$$Hb2Xgy! za2cz^xcqLvxe`2o8`+q?m-n!_K|k~ENtNWczdiq47AI`W-I4MYR#y_Edj7|NK4a){ z`*3Sf+y3dj;*rsag=J5gxY%*VI_t~gyC0^=8e)b&DZjKgi6Xasr38L_;U7fCV5mD}c%U zC4pooEy~J=Y-grSp)P5J&@s+V1>Y)UYs&H5d8J<~mKu$M(>K^T0Po8H4116HQvnmid;8K<_WIOlYI8B=(J?SSh0{uxwU+wfL024vK z*&u_+;fb$Q3&52XxuT%`*|8&GU{#sKMqk6JD)5%XKihux@F9B&zy#mPsS9_AGjC5G zZOLOd0gy3SwGC(3&K^Eu&j3V-JIhRYN)yDJ!^?*+2u7*`1KHa#ob1Sh_6)$24YLQD zs(bjGulfH_#S(pI7_54a`@0BbR|wVNZ3baiV%!0L3qQ}KJzd6fmqtUT+44>4sEysB zUUE=T)R?tB47g8Fb?Q=tF3Ixqt0zTi>{Y;%khtU#amkPfxFqDbN)7oW%<@uJNVWn8 zIGVwj&=H)w9q4H>=>N`&GD=@95Ve7uQHnz%{01j#SshK=ZuTX=WXKi>B}nG`4q?bW zg1mf=^E3jl=0xqSXz>A_T6&Aw*9=uF>g@D`m+3Vef zCvHwhb+PvZIjq8qqkcavhX22l7NhjRLcvO5e)UDbeOk5;+RtB+PS>>;7Bl|qLuCCZ z-QS88L=`gF-^i3tcvUB;`HshtRH;WiLMTGgzj{l50`~anMsW^9CinF+ROo(Oyq@(Px2+v;%2^GJmCGR4@uh7G6*)RLY7K->lKuS}Mh7aG& z<`eu$pr=GxP)SJCV6&*-r7USk1h|Fh=bc8&;ivEs~R?QjSYJ@^yb<^8mn z540cjSQys#d9Mx;)xJlzzN9-kaABljy}Mm;A9dY-GKK^TtbAZ62G=&uOi5CD1Oa;^ znm0@Qnr2@14=wlt(-GJvZC&h`KF!Ua6j61X)#z{`X0*`F-OjI%Y778{?x0rcAAn_m+Q=b*Kg@;2;Nd=Yd?zSOQyfe327o606@977W;V*w-WyOs zJpd%~O>u2ioal??vn_F<1p1?vayLcLn2!*N9s%Uv3CJJ$nlNK-&M4ahR}AGWMs83< z{FvR0@drf#^}logJL-Fh{n{IwtV@qOpd}*ilRyN)?sg7esa61oK_%V7{JwC~;?!`< z@+%ST6sE_gZ1M9jC?uxp|5$`JRaYM7%sQ#mE59-nDcW<0GlW$}{z4iK9sn1U zZm^&H7k5xAB){+Qk)x|ir*AH;5|SZ6-0&*|TOv9J(+<8oF0Zh3I3Ed4&(nqhpsT(?EniL?j1#S2Ac3{PLpDr zQF?`(CyM=|U(~nK;lKf{Z6c7{RMe2<8PF1Bh={-dDOUrKyBY=s) zw*&h9x_os+u+$tz{VuPKA7zWiVt?prVdRWPzzumZW1mI$86reo7E{Pg>Avi*RTlh~ z5P_w=2B5##lTKZ5>sc5eop|2HlJ1}axP}AVW1(c&P#ZG_VosZ4{L-*jve`!Fj3ciV zOwYYbwwWPC&}_vrJcS^5)F4WSonc;=9Y(@&%_vsEl8~131R;@9D50xN%308z`QP;G_JfKw4WsCoPeOp1a$E38K30$=cb4d3%RpHp_jzfAFO zlmN-J02(MLehMhKF;6&gW8}_$bH>PPNX?5~^c0%G3UMQsATpU?ulxhBKjDgk@ks%| zcwUshfFEZ6b1iyqjiLajkMYL=0^$G&f)Aib;Y8G{>e6TIRgq5&T4LjFr}@=g9{|t` zp!Y_7;o0+3rh&Un0Ra50r=3one`(pX(6O?l4ce@&8#b?DZg*qYff^q=uNPDt?i!s*H z4U>F#H=PA1E_b%4EBc|EUa{Xb#*8dLcqd$KUxn_UM|Q?$D`0=VPh<9x1dR}j>Y>If zp$drrKNOcc;LVJu9Ai@U0gd2h&Rio3H<^z;3Cd(T7Oi|4`FKq|jpr(6Ub4&MTujXm zwA{=D9~WzuNHrg`0y!mH5QO}XQ!z*6@cAU$kgmnxi0tOMf?qOlKV<=2?_%sea6u*7M-?mUKtmiO;I27JP^u zxh5N?;)jnEMS9W*&5PMh@{=w>MBNnr2SL*#As5S%t5pR%{79km@@k1i5`s2C0 zLopGAEd)d6^~%Jd9E@@`B*vlVPP&&U(FDXDW9u*wtJW6A$THJV#T8&k2Lan9`s#{`IF!ylxr*>)XGqhK*JY1zsJU)1vLkXh^akZBKu`RRu#d;Qm4}$^ zpZ%L>eOzG>M#&iS{E=(bbJBEn(sM}$pUQ8f_CALc?VUVgj(-~f0!X&4u`$+z_&?CU6PVlVxg&*~-Eq2eu84_fV-Dh4_6G!j@ zdEkpA?AqeeZQ31_fiWq)pn9^*yykqKQ2B<#CYZmk8+_2c@OhpyF+nG+*T*p&S^bP2 zj%SU>DRKAZgee)L?ai3!y7f~Svy`v0&fqc0L&Pv=oV15lIP<1Mv5|M^2tRL&Iq7s- zexng%AMfF6y+5&-@B!}PJUF%Z?q#IjkK8531>Y~iCT2>jz*J5{-G76vt|fHX%ReY{ zkJA3c$z#x0fKY-JlD-Ar??YptPfw>-Cka3M6a6R+uODV-{&6UOS?kdwz&=(aHiEx@ z38e5FW*3ymo6`4}eT^kBqg$Iyj7W@p+T-u>6qoXU`7nmjl_VtT=pl|xM--ki(bc>CK<`djA7E7l0^1HSpsoWy z!d;0S(<{u^QMgK#DOVMV|TukNW8@+^1w&p}|v#A(flLiYe;gM#=dUl(W8gDu!jRM?|< z#^oMC`orqU0*x=FB5k0=P+Bp2vv4*xDeAKc$L-2fU5`KbuvZ#hVskG9#ra4bwjU7f z9>Wc@yhnKmAJ%Qvj<5^NDcyCl#}Q8~XbhJLv{_{ld+jR#{&!zNVxTup@h-R`D>S@; z1zyNHnCz4sKFBDBCq-=uG`gHn#5ZIl=QPU=~nU<`)vq(a|@QkrPe(I<8 z7axxv?>j}z0Gu{Rjc3xzmcaldSWFf@{VgG03l$`M!!{YybzwKM1MeQ=9b2hC}lmnq{qUZLbeH2=Lv(3D}wt2FIe!fTDDz3U~jDhmmr%AW!T+{ zU})INMC`H#t#<;GrqGz_kcz6ci&o1g?q{84?&Qq%X0iNU%-?mfi6^oEm zDBYuGEy_G45}U4k7oP@_c=RY}`&N68%lCb+_go?~RH2oQ}iPvL!vxI>wV zxJCAm?05hDP7A%XN^1K?csuj&`6#tv&cp+%w^>GiN?e1dqV55=S=z?%c1(RFBnvxO zr^II*N@s{2NRv0U{l?Lo)ThJ^G^Qvz8A`{liylPyrM$mrw2N14HhUTTshhvD(Ft2w z!q1@1bsz?}Q$C#pioEEu;H4cd4kK@{myK*_ldUMt@fr``<)A0SH~T~-Z7>QLsv4p9 zvq<)un-*`t4fGqfRSTW<;=KNoEV0eLh-BrpP;?*XGou_(C!tQXbWGULRi_RaDBBLe+Kk@9W!WPj8>*41Ojg@=o zqekS{9=8i8>!wCxOI0&LZv;!1oPru>diU4o)(^RUuqNP z4%qCGSm4bUkGO@)JL^5GOWd^OaY-KjWDQeP8{HH&*Mof62L5yT9!P?z^Nf1K2!?e{ zuIMIKIa1t)H-#CA$!@6T1aB{{6rD1%GNez%nv*<^2!=2XHHNOCMzlhj?-P%Pt}=^0 zz8axHT^pl|F?WPc2-d)|bHD7hgDtH*u!HTBWKkrgiENNpH&d_;p}Ve31KGmp6@@NI zA9*w1-E$_0W=ek@pV5p_AFmm+6jrzgCwZU~tW6{bwtkSj(pWj$bZSCVaKzZX?UJdT z>?Z2n%(7+FUOYz4opNsfHQt~yCNZ%;1=0f@UkMU5FSN^B4(y~#P-icj)O&h7EYt=V zGC_%*L0yxPSQP?jphWR&tzFHL{^b1_LW2EwnA2iXTs{7_K1cTpMs>bw{5P-5#;Vvr z4Nm}1N03q~$Kz++kjL&hbE-+u0?A{N3uBv9M@w#qF&`AhYeA6&*juhDovHf;%B~!5 zJSr_|!3ho5f$uy`6jE04Z9{8o< z1PGG@R+k5=5yVe5vIR=5;86eWCBirgJOD;1&rqPV9(yISgldn0ol;e&l#kdmTuP=4 zTB08|(8@}e-TcURMAy_uj3!C_-&8Z!bWI_RFr_&IuHEub@3mV+U$vp4NsY71s^*p4 z9!5*NpF(S#Lb~6sZLlzrHF~=g7!a#Yefw2hOMUc-)(a> zK^#cJrnZ7*jvEZr>C~W1#il8Q+k=t#>z92s)EfoQ>TGD55yOx>rSiW#OzaAWQb5tE zWS{Rl6*L^cSg+XW`%byVb4_%_RuhD&61d`JE9ljD=>}2^CIIq`Y5^#StP{Zr|1%Cb z1L_K1Bj^j$eQ0%amLb8nfr<8itrqe~v5typmIB9-_g}S(ztp=l*hTaym8r{2Hh#Ub`55+zhq}U=H`f zk@StTPukdp@&15&)dg2Y(Rh95xm#T!o2!8rmeqajVVgPSZLdAwQ zKv`95ao`tz$R0TOl5cR!_DL&IJGNurwUx|}zYE|79_V>U}Vpd6Qbt35Ic<%;OWx^wjrej%JN&gAk zDz%;7I^R@D&T~O=>&NjTgX0ea%_ZxIr87BUTqQ_di?8~gmVVyZBg)6z zYg(IuxwoAlMmm&mRY7Z{sf3p^c^Zu?z5_e6mH^8ajon$OZ~g#Jm+e?*9yWeKsj+6-l1EUNbO?V6eY2w{k1Q#qZr{swB9KdO9Hnv3Sp^LD?`4<_ z4HG*h?P6)%&zyIqC!iC0k7Ylg8W--iDQ^$IEzMH)r>554>7H_kN#>uF5%EeRme@O| zB9^XW|L6hE;yR$4C)jrj`Qkc&_)htLrxYo}RkWYLt!u&AZFi?cJx$EFy2~V7=UNdf zBgO&<&ua5nxAh~U6GyLL3dQ?Yl>vemPYv$94qv#uHUnK_g(=A4TOWl^7--8q7n(9q zKcKD?=2N6K-SD^EQVr3;b!9BS+gz)n_lMNnF9xmy-2jTi3q1k*_UJ~Zer}I;CoRI( z7)rt`RC_MnTd>3wzNk$`|MpA~UOoyI_XOKqb<-M2PZ8%ezg>uR-6{6cDwZ9mmTin) z^%C+LRxOze*Yv}{MtFBu$N)?hLydjHE)X-C|3)m-LoIgO{`g?d-_SM5`B>dry*(m& z>Wv2?C>efW5;d3O@%yJ1R22DS*#{a<`x`S7X0;AnQJtuH;e4yTo-|Dv^E$D=%(c5R zY56`US!~g)(GVn;<{&n?z{PNNd5s$RShwir%6-Yfl_s*|_njD>Z)sw6E%aPIn*73X zyG*NCUeLHepS2M}JF8(_YGD+sP%*_*TJ1`$=gHH*LkhOP< z1l{Qe3w8!!fovm`~^R%}m5u2!D&xcsK2w_aQKbSGq+n zmXpGdXXU<1XMa@2vmYeq@d&2cjaP4%cBGcP?scB;)*m&z+fzyfcg}zX#N`bn2;f zG(n20E#c&8_Dx6UcHD(*YkW$l8s2ww!o`j_)ZHW%jsn-YH)P!Yn&Ah2oj`^tYlsZAW2WvS#FOq;k{Um^mdc{nj@B~ z*rtINr})ZO*9b{-_kHpFH8%cCx~j|9j0L!~?u8?Ik>nMXifsTsU6xy{#(x03{I{@u zs5XfbY_9Jd_mMiZ)5fv&laPh+xWKhb--v#eTtt=~wFwKlt0+&n>)Qb{+WqO>2gO2) zSugww7ks~n)_3%kqVsRSbv9tUh4;C~JYzODX0cB)rsJGANPvreXP|$dpsSSFs;N@ZZrCvVvANEg;2P|2? zF}ntOg=(9)~+aZ>l7?2dy5o|0inCdZ1iOOYFNn@h@GAIltIJFPRzI=tn0L z!)S8f472E%h|!t73mLmn=O*h$7tAfTM|JDGFdP5wy<6;_sjNte^Sx~NyowAR=hbhT z7f&5|+Z)<~e|s@#bQAX?#b7>B~am{Z)wL2^oSQv@JB%Akw@JFB9db7n)?JO84QKhacE`L#V)l8`TO?KCC zW|<}FfpmK87|iVnDHUOCKv8eD*6NP0qy3W|1WcWd1kp~E^EDaX8t3OW1sc?h)FpA^ z*B>q0&0yJfTV z1N9TX4a*~y;IxcmDZ=mGAr_Ov^;3+4gFy9n$n+!1=Ua_gOF6UFM6IaTyvPufnN6_4 zpJvI#sa0vkW4n|k4!YoBy*}D1{}`-v$v56Sdare@(s&K%Oy98YMs&qYW9?s2d#&Fa zjn{;o>(ldHi;OF7$S)k2?GUs-cE$TIt3MguoB!4_e&|$jvQ*-?&aMN8*$(ifI5S4O z{jEfCQx(ytlfHrjF1?SMvd9`R=@hiLfAfaymS0IZrpR_(IKMl3JAWmn;fIdV^ez33 zXxW$dWt9U%xcS4lGvdWgX@XG;91UCj*W)KWWyEedH=Psb3(6nf%17K%pE*1(F9Xiu z=?Bl31-Iy=E?PR9%)e{~a0v+?{j-;A{f;tbcQ$1(FHXr&_JtYOe`&_lGdW&`Y3B)Q z2~;FExPROzzISdq2spDY<5?IPtqsgjnEo(fK@A`1_}@9rfRdq1e?e5AD2pkwHcz^OO#i zK%>cwn2Fz*a?2D-Jb16@#dnV2@9x?^eGa0RR5L?t=<)x!poAuhhSx4+nMM!tBk$H8 zs@6kW9&v0k~Ji=0+ z_p)1K$QTMlcl3;NoH?5>9}R+I@S&bkSpZbAbwgP??$_G|%p^itRsKVU+;tn4p4 z-h5kcG1(;Aa6Eh3ls|3WhH>bYeyWg^En)$;m4C}TDNcH1#QyZ$ovHAFDOU%~GNVaPm1G-dNf1x&EY=#qVDRid? zh1rzX<`K&3_d@$>NUW_h{PS7y%2%30oLkn5FDJjuPgvHu-RXbnEPIV1Zd4htzUYqn zW3UsSL1P>391;2$`{`KGZjbSp8G-lX_<~c#38-R5$@1FFm4Mizc*9Z3Vuzg;CVQlO za@GknY7dlu?23*}pkk4kh@=oYf|zDY;!q}1STtOHRh}6@!;S0 zw?l_@><48I8$^LhzxrX1!}?fK=R8PN z2$c6LpG3-PEPFjr-p%TB2F48wj=*!K>_U=5*;)P^3XcAFHg>Bl-%yE=vT>yL;A3## zd=!pl=XpvT1=$!KG&&UTHs{;U$^z$ouARx>TmNZ_Cw(--?xV@THK7Aw(S48OFt5)b z=sG(Gr0;Ux5B6bk7-XI3iEL;+^t|8;OIilBS;KfWQuhqYq1~hI!$6@*fR;$hw4(;W z-u|VJ?b?ON<%+Y6?PxYW8Pc_O#LH_A(#Ddq^B`TnXvae(KnzGrat9g4I^g&R%y^IE z48{AsZ*YhMXgo(@{vWbI-`AhvII?Za zY&E~7`U8;je!B895507~lX7Ufv3Ub}!>mBAR@J`Lu&7;;vgBg$WaJ5jCGtKNbQo3* zUuVE{2JLM8(=m_jdRoSVxpg)bJKp}8@pF1wP6mjEaZ{7P{THT}x>3`?S( zGNci+pz+Y2c&wh-wO_`Cr*nMuT3EGv#MGXU6h4||@U5h1S+)j;?5r_=KXN346R1!& zScqmRZ)fxvq9*_kZM*&rBWGc-JpP~<^xE7xSwXp2HD`4VH(igL0 z#Xo$eP_UBAG%`TnhyDdxBSxbugbM4mkilMOP<&&Ex`G58J;w@2CEcST5D?VlcyktD!)gL)$`ikIZ&=P16z5oK(uft%_ zl|r++bt9HAvDudpbH0qLw-DIN31P$P54g)&H^y^>wHV|*_YIHD3DM$DitI--5YWlz;?zDl`@O*@AO@( z$lT#Mo`hcgJn|4sfbCo{APlUPsgWF(Q3~~F1cqhZS2qh+ zZKt%dM7)lJ!yUEWtcE zk94F4;~P5P!`D-EqC5?CWIAXYG?TWc{xnqp%rxzws!NNG%dd~ryZ4j-o#?+r>r__6Bzr_| zKc9sdJ0mp475F6VmRC4BX3Fl0wYleV$ds4GwGHZ!h_*XuQGRXF0=>kD)Ql1;P_ z#MmBDX@l8mf3UV6l^$o^;UP^oE5B}fkum{AH%$;7I#~LX{TCOGIg)GI2t8qk0& zZ_JQH|M>I}9JR=_(k)Ucq^{Wa=Y_XX%r2*_tYehD&wk7$_||2woL$UV-rwPfSWd{} ziwKcsE0HaV5o73@h%wT7K{Ze&?mh*h!f1_*EISKpx<`3?5jISqX$mEU8F`7rD@q>#Lk7uMRYAe1D;^by&uD{))cPop zn6^^R>Dzh&&hSRwCPNASP71rz%$SqPogtXlf4|fh3&EMLz$f)Vz5-DSZDqbikwV{a zxB1@mh5Ebr+(}JCiF3E~N5BX{aD7}yQ`R^ccUol;9s}drr;-Q}GMTxY;nm#P7u3559+n}fN0+d%X&^c6Aav-}q`_uGwCCiJOYx&$=atVYT)tah zsDk(FDF z3EQU2J;Pv#m~clKDvPZ!&H!C1o$a=|A-P8#hR&9pIS9Nw4}HTvR&?K4G07iqzEZ~Y zzPo|GuLRzTnhr#ZQQxg&^ojI^b93L=X;6HG9`c@cY@?XUOjH=daNj}q0-Cb;I+MID z^4#9RAkS=GWl{BR5j!0d6ntf*;c|H_A~l%ve(dTVeofWY*B;_g!Um2}Qy!{O-S={) zDB|4u+N{Wg>rzT&h{LoheF~GPvzA;n(V4$_ zArfOU`28@OpN4$=6^YT{?<>DBWra6=%)2u|Twmn;$~UhbS?RJwU=ok{ro7O9J8w&K zTT*3AeTc4z`UAM>oJmdp-$C@;cM*zKK?3}-$P4nu@DE&10u*lqm zqoJ7Qtr63th1J6|s#{<%9^w+y6P#VINZ|dsn*?GT?dNS5pkx8sa@>v~Jdy-EH_`uFwuu_{I2_YWyS+Rm%yEFE zA1h)B$KV@QB_&Ta%(wm!C<>HeRDmnBInq<{&2c9chx!4&BtC-bFw{V9VxPo3m~6$s zw$O5kIhgGIhlSyC-z5{lb1S+>w~Z)uj|Fsk;)krv+}otyh=&tuud( zf};wlSkfkv3W?IbL1v{Okn_FNr5lvU-&)MY*k$zSwQ-GY!X#yRz-F=ltH&_HzPus&6_4{wmx?80M5!ZO)PUF`~l z+*_Lmf%|u`KDW1U4spG+Se>kNiex9Na~y$_VxzD^1sc@wGL_D6R+c{tALB|p_^X>) zNCgXN-_ugRO*o{C$xa{ykLyTbc41D<4AO-Th7q2Iz{7435kdw&*jbDB`4g4)Q(0cI z8P=uCQrzdEcgR;ojvg-~6EP!?tV{%5)u(F~0aa2=l@-^G+&>dWs>h=kB)`^M zA(P7M$d3sYspPL@^^RL1sL}++HQ#z~y>NW_cGx6~61pEjBa_U5P_Q&ivqKxL?&cZ99WL^?>TwCF7rC zVVb^wBYz)B7^8W@)Z@A9+ex!0j(sjvVP?mi)G9H%SvQf7&v`9UE2>FwpSR#f)E3WXeycWA}7N~J4rplX2vZDZgH|E{{igwI8B#k^ha7@ zojreuC6L#(!p2&v4`vH)vPj}5;c|{O6Zvht`e4<&`b=JrOc~qMs>tV!loXA8?TUU= zOt9(-cjyxt{zm+W^S@~~pUM02?08lEe3nFN+_i#gu&8S4*ak8T%>+HsW5YAB86}Zf z;l=RIKqH`1gZ3k)4CXB}4 zww?D=S)mGbPKEn)uOJIr>&IdZt*YM5XR#Ly)JP);TzpR|{~t{K326)qdN*Y=J6ai= zW#R6Bo#voeDG9qmS%?eJtCm3FoES6Y-0X5D0zDi!0b5@9h#1b2tX6gsajj@1?Nw5?R&3 zF-`?zw6ZG_*eAm2vYIusY#5f=f`3@?D2C916s%9*!?G3rh4VWsMJQo^Zo^g`8Y=@f zE?7eA*RsWrKp|+-)=%^NaF%UEKCh_xI|2#~%gh+mW##-)#^hSaZHJ!5#{K-osqM1i zBUsIt#}f3?xj*(PY$$l}a91`@-w z!xf@?*ud?i-wjZj6%(Koya_Vpb;#cW+}QvAJeJRyICR<(k6V$v-1?ezA`UBW+VEIINc57Ybw!GL?+U&+3l$&+Su5t+bA zK?7X}the)vQgr#?SY1JVeb&6fJ#cK?l_i_G%|auycw^{V9v)H3GmLx6!>96pW{a{p z`6ddF8s)g6@#<9MmliN8cblcN+%=a|FsFG;^vtYBgp>Z13ShvUa<{n0C*@bA^_gyL z-7Ws<3cr(F4L14RQ399AG_YO5jgu9BK_}cg!XQhyNpceqMEc|}r>9Fxg&a%Z`I?6O zlk!V7ug!6>mBQFf(rBrG{M-ZKA{SuSDQ?Oo`?;#{9n;TtDYnTaMqE`wn?ml%#Z8ef zCwK_|AnU9laDAAgyFGlZmqi-@LU+@={U-@+SeP<& zg75o7({ibv$N19%CN^$Ma*~(lCXvp@E3CVWKUE=*(|Ny)r>q+USXQU+=}AHt7O00j zak}G|)shFBYz|P43!v^?qK%XDfj(UgsM@ncn4FR^ArO4n4=qMJf9peGn;17114r6o=m09@5j)}<0hIF^Sep&-Q*(0>I1gHgoB9DyiTDekGG!D z9P=iwca}e9HWn|Hj7rFL%pn7jcN!yMQgh5vx^<}o{Y~`%crihROCDB}TS)~Qzk!KK z7uTmsgGFK9z-LQE)4Opv1*-zc1taCGO~g7V{FHc`#ypAfC*|tQSQF8GjjiObkZ@2q z)1TGhaBZ(5{^>ZQ4J!ej@RxF+iC9xb^Lpk^RO-|AOzE(Ya}*#8Q^Y?XXS8DN0eP)T zIoXNWvTZuuh(#^RM^7$i3rnkq>?YlFC)?sa~eEzBBUjk}6>*eiRunmH>sXRloy6*`}>n zXXzrqVg$1uBvMS1u>eG_oAHizYx1GI24h%NaaSNtD(FBv0W-D(iwBTQNEa&y)#jEO z*rUlXMU#}}DgoJ(!L5oM#UkJV*8BaC*mywbw@^u#vQeadCh3_$r;R8qoUynNMd-^8 zDB2?mL5yTdLV8)ABVl?LU72?Hz+3NTbl6C+$l`2ALRF(rF}yjj@uO~p**v6HP$=@!Ku8G48yB~Ivg$Od9w0_eFfm?zoysz?z4 zajw&ptZ)&V(KZ=ryh-;Gg`E(25|z^mn)yL`jtn4@Jcl?(Efyb3Z769NJi3EyVHiSg z7AlgURgR+OzgFVY1RKj4y}!c3EIiD3hm_sfwYWrq#j5=oB7GdAq8q+?1W4O`>LwX< zl_hi`4R7k_#}FOY+rlnM-CGUFP2b|(($>hRkbLGULr z20W;-$U!Iru@*Y`+u!s%_QjttpgrA6Yn77j+kNenXw7W^&YfkVkIi|H^Y(VZ9}>Fy+c1s%dlIyNT9=FX#J3!2(bzh_8CV6$rvLa( zViW|BPBFdIiHVzOSB&s6%Kl$l3iX6{S*VypRSF+SY#NDlpc5rG<24y}MPg?(dBCL~P1#JIt@}o{^JLiV~+qo2JpvE<0dTK4l`rx@_c=#8}H!dp8lLG`kD*8ilLz z_I5LJ|0BND!JjssART_j-sRSYew}-fv)80baRCBLv|}O0RH84XAxj=I1wUQ;*lsdi zDJE5X9_g;T5|kQkUEZI}UO7`{PSbwju492UV=e5OPJSuhgfAV4dazfz5fb#4XTOad z^x%ahfo=Yg4}nk6CmX}E;9f(V4HoA6cyE=lsSy|m-2NHWW=e_}T)e`SY!?HIS%-@^ zo-C?VvmMhtS(KHDm^Kwkk4GKGz>VZ5yP|D!*)g&0{HY!Iq?0giT0n7leFN<9gzfb# z#)%0!8|gCn$U6=_9zXbvo1`_u^Bs3M36YpcSEc@Gm<7#FyW~j^mM!`;_E{UJhqK`s z#v>VakKJG;Tl)q1oIiM?bv^@$N%KBT4MGDvLHEqZm%kZT+92Jb#JM#d<=d}CY>qJ0 zrxkoh`It0>nNQpD&fW!?9#~3sO=CFO;#E!*^B_8zc2g%Xi37T=k=1Yd6WOVrLH93G za_veH+1k-txg!p9nOj7sUUi_awuIyj!~I;Lz}W~mktAK}o!akGa_ zsindDZ(S`)`JoIY<=E(LW0!o~O#6$4dUAy7p)?gwpom;vO^Elm^2c9I#61O1_qeSu z{#`^*w)=^!(vQBKv9h_`vXI|=Sbk^R8HInLNmo6HHzw94i2WxoyB6CLk38?Rbe`bQ z=B*nTjl|IVc9M)}<8rSgeqRp!_+&{B|IG0;n4wp+Qguj?NA-AQmTd3{*SJgYslz5L z1CgbIi}lW+H+dtO1*wKc(HTrF;^m4hQ?JQ%TU0%E#sIBEnGnNa{9NXvj?Yp>WFZl)!IM38%Z&&KYEz7#oDS;rVu zBb#Y*iCL3U%Yky!rG75tCNFb>7;-u&^Mx1PW-NCXZavM>&#|mvb6Ho|fu+N{$NE}& zw+puglC#uNFB9?)b5(&ndXayCd`)GL#{<#YHu5zEw+AZIf63rmLM6n@U*%ae;c`PR zp27h_koE$_#!0s`kVp66MTACs<^iUoTjBW0x;`AreqLG(4`hQ8sq$6n#g_B|% zo{AEKC)|k*=`JI%qA>WSA@&L%I;*{l5j5-Yx1>;0{=q|B$WF7moX$Qvt|_sPz41U^J2N*#wRgiy`F(juH>j`M`aLNjqI~!f^H==oNDJXoT2Aq%5 z*d?Q(R?+OZX{<6op{X$?1@HxY{dlLTG=a$v#Twy##{46^7BT=`FbE(FI#GF1arh#q zl+}FJhx4vgYKo2_iG%B~uY_`zRL-Olii&b*wn~!33L#{bBuNsou~{gGa*9fY?Nw;W zVM%hf$sCHdoRh<54#Ub$*k-f+p6}21_uq4S9`5@(+}C~G_jO&5JMb*xddowyltVNT z-@z_V<_gW0*D?QU5c~9erFXCx=TcrxdkDi78Z1%qb$&nH0ysPdBry{e2XgEZ?E)4U zNz>?F93#jSLq$HATsbr>{fQfyn2+;KT&D$8QDJ|lUYT@;Zl@Rn{eUnbo0yi-5*xtL z=k`)(1`yzA357cfdhLd64%wRE0G=cOD<`)(>0W`O5D}}!PUY6`S=G%DAL)hc0vaZZ zlZ{|m0*z19*F7uz?*wmD-1>8}^cm23yE%ic2*v32@roHE&`)sz%AS=*X2^mIB5JaP zJGV%f&r}<}$h@7eD_B;=wlOt~6*0G!cc*V8sfE^y3Xau!rLI-!))Ad2BmtRMmpDu4W7s&CNqdZ1lrBi_AlJuJ7P8*9XmL;;t{Mz5fzH<|O z{FpMz+=Ls)B|E60)rEo9VUO`xdk85zht1Q`fS{#=dmWI*1RX5J{~ZNlrfbg%*!At~0 z!u8oOnufkD25&@7u3}6Bs$@9~A>&4-&q{-^SL*D|_Bc%3Xx)K=xuT9iJ_etStN8&s zV?Wtbjkj;fJ0!i|2K&ZA$|ApI2TOdwMP05`)@yJ9-v1?q@)~IQ>>3uZZ%2(5l=Drv zOY`vmEms$NVfzFTk%VsLbFFTBvCI8GHJFOat-O7Jrgg4GC`k6q5fsEOAlMt&^xObb zn}qHO8L@o%XwR_*{nO%n1%wQOy$?%6u^224zQi3xtRQ*`u56yK z6hUKf;_?^>%LaWn27?N2S^}BxaR?07SJ7jsf(x>%lcnp)K#|u)2bC2=z;|aS%p%(F z|B9&IPH;Aq$Y-N}oP>4EUf2H|a8`8k#Su1S1CF8)$T+AP+28O^*v3_(m`POBvE=D@ zTs4NmVX7~<1T{F#&w>Zo95Co_^`LSC9%kfKC8C8lvWV#b8p3wu4m3m4ko=-z7Gcoe zWm%PNtdGxA*iF6^nXq>zAhw`Ee;X-`-Tc5QE$V0(Vls7EIg4)qY=R>?a#ls}V&~2o`A8Y0 zLYo%;r6hP9ui1`1XdJhn)@O5ojP+3n#WqgLN%UyT>0tPaDWrW?%@GpsIHkzg-OjXq zLv}(ihx)?t589GkXDpFrFGOu-jCm#60!Mp!CBn&nL{y5Ipf{%=W$jS&uC%t)gTM~pt60-11Yws0&44S+~DXB!XyG3AS8EHc4pvI7^nR*^1j zV8=^UVX2~%pk(-!%^X5KbU8tdplx?wJyw8k;D5r&ZcK^&XoP5rBdiz8nlho*+nX_s>xjh;* z7d5;k6b<=-tK1sd|7J|@U4D%Q^LnhgpgLYUtxqhr@d_Z6YxTGOJdEDJ2}*=wgKVX^ z9VC}9=P!4?6zP{q%@yiYl!PyH*$~T;}9>_ zjW8dZ$*Hz2%mW)iYr8vF%GMqKNRJK28U`LIiR=o3YO{t?Y(q024hwHPf*^m_sSE{h z_K04XV_{c%O#2_Bf9>Mr0S@BfK#0SL-e96_2xl!=FD-R4*wW|To3Z9i?0Fe2X5ZqY zF9s1v%QNB!*v^HT#ICI|M&xzG#1{)vR6zGch#KT2wSjr6Q0KJd+C41NM&gB;RG91pdnG42QU-U@`(En8LFIt_ct%l!#T)Q&^YFSfb1O%E? zsd98XqD<28Q+6r9KW6|p6!O0@f>fl30fT94faUN8ddX3LKYaKG&IOge2eQ~7%u!`S zvIc1_A{o&7RXKeoUMJ1grX%M5uGI0LcAJ!qFe%Lz8StkqQj{i5cD=(ElVUWn(|EXi z_vG%9$h8ZVc0(_0l6ZE>j8dJGpo0h%CC(zqXK)LB{BQ2s=QBqC7`lv~YIv3U>0PGi z*26$mcKIcmB*(Cm5Hq+UnGh-)i813s z{T@f7`|GP7!7JKtYxcKxdHMX-rr-IA096`cW`PlsAd9R0Paeqq{eBo)A9I%9t>rM3hfKaE z+M3@Zd+DTwY+_g$O$M>hkj?OA>#V4E;inp@7kYJ^o8{RHju?mhz9wrD5F>T1eGI?# zFSaW03$!b-Biv!$qu@8SCk5^ zPs4UjuU2tEV%g^`%P}HSu;}TyN2_X#E#%@`*}Ny#Ro?7_%@6+Q(?LCZS8Dz_Hb(TZ zaxj6@evwOm-*#UbS-&VSAhfuZ1 z5F-b+QOyu&71sRPN(YVXjlmb4YE<=-!A~Eiy!AXQDjjI~&x&M+#TFD9>HEd|RnkQN z*0TX?9{6A1&UaB~`LL&9*V9;x0e}J7MT=!kCkl=2Sf3PI@&DFYU7F1rjOge@TguKD zy!p)cUBoAj$2KoF)04>pRr2 z>izZ8c5+8uiAl9p zoemgTs-K*SLb#@lOe0p7)EG{?Azz!)7`vazKZZNxcP>O#!@)iL*dJ56Q+Xkk8p03q zruEaho%(8wj{i-ipQ#s?jZTkm#DeqLx_6(4DzLDyX zv-~Sh5G838`EgFf{Qd-7ZlpfhuA$`~CW?j5@L_`sp}!UB&0aH{RfPq~SDq4R?Zp4C zwk%gHW>R9YJp)V1!0F^H^~g6tfim#FHHVU>7xenqeT(rb^rwL3?*V2#)ry`AS#&pW zDy}o85Sk&dD)byRxgk2TAygNWC5wd=!BG!?V^)~cpj_NfE1+&!=|yO3hBTU`G0Q2XV~OH zxmNjmYXKcW0}?fcbAaI4^^_D)jq-gxsQ*dVJk**`n)Tm)M%=*A3vX-5Q8JSaG(aya*1GWD3y-+Lme6qb^34oZx8a-i)ect0X!Z=Zw z$^gZXLaUay5sUNVdnpFH`qvS~RAc(nhgb-ty`ejqhE$nBa!;yJ@(URmf~!CS+dr?L zdx!t~U(Qk&zcjH6Bt2;~L49;TP2RE4+QyM3N{$SC#^b63=k^ffQ}1A(zi6hm8BM?} z*Nz)WOld;q-R5JE&8>W%(9U)7!CoA4NlU#+hg- zM0!-oJH)1(0v#6uei*D(CG}LHP1@S?w?-4OM}|>`lRMesmHhfZ<>^vfL+9*?wAB0N zcQ3IMnkQooNr>VPPwftsi0-J^u;)_||E2Nv9hRC+-)UdbY`@n$6*VnSa*hgbI|Tfn zFLN8 zyfGn_E#1_iRcH72`a(4O*TV?_RZv?G5+c4(`jDzVI}^dN3+NokV=>a8v^Q@rsxkik zA5U4gm#t1CH?j2~W4y2g8uGz(k)$s=X9!jkWKr#IRUr5zsYeGk)7}@4J~7fTAGS-P@y9;sIi?>$o!s6D|KAqvg^j|mM8ktz=k<|DKg#C zp6>Y&i{)!#A?$dZ?(IfwMk-v=UYnlgx&B9&7zCShX{K_FCh$Ut98gc1p}HWsH3PBQ zNM^h?vN1Tmkpa1KH(@J>AZ)q0iG(l+n;ns+M8jC~O=$w^!vTgw(5lGD>m+}X98ssg z9T&MNxJT8QY|@Xv?_4@-_;n&8S#_O7$Wp2 zd*0@#U5RM+nE`iuTGTFl0kn;$b)R`8&4$weDm7JOI9hPVu)FDq?!7@fNCg7xCEGI} z%ikzOW-*Z6WrFp!apVEI18OPOT9c0ay*J^jrxQrEsbtcCg8>}AwGFw_f7WSvbEoE8 zZItP6<0vNE3vYX10jX+bNR$RngR<*M5el5IL<)YIR=p6NRwEPdb-s&loX~3MUR%JB z(HH4-9&KFMjd8xxFTa`ND{t>`0&*JbACwbmF~?a|N(%|=u8i0n7{Nk|72to%ccH>U z(%||*2bJ;vo1XL;goSaPwp#wDCq|{L3_k%WyyYH~)tBS$@+V!u+V3$&jgM;Ey{M)At(0 z3Z$}|YuAWD)ZTfPjX#OEJuDPnLBQzsqmG#xM5vHlf@}ad^yCp-&#a7L>tnQYlpz^+ zg+6BGOyYfUMZQp{ZbEh)-OrC&D$3v~R}EpFvIs``st@5&3Hm=D+hVUBq=>pT;JwPu z&30_Pk@Mnj0IICJUmgx5M5s|D;CxmlJSG8OC?5&#@x$<+nXuQDL2JLrfHivm<-M%| zy~OX*4<<&Ha{;v$sSubRR>p8Fq%@FNVXbKlyL8=%6pM zY79k-GPlcybVS=;l#Loy7AU1XLO6bq1lo~bp6#0!^TsH@>nVJtMH+dORxQ2rSN_Wd z67QYs?H6kJrGfhC5cMHb%Ou=|-4bk|pc0g5wu2Hotm8C854$AaaO{NqC-A@+7wkTg!DcWjaJukqu$oCF%5%NvNLp$$f7o2$kCX<;MYhi6 z9u)@f#*75er-8b2aOUv@#(!~>vv3%rW&NfRe>8dm5)F}lP92w{4FVJb>$cvtpdNJIC)BO#mg zMZsMGD?__6byxZ!>YRDk8v7Da7`nsGzpUACRSvAg;#n}_AHs)Pq#Q5+qY}HU0X|RS zS>`V*ooN0DonA(yQj1hlZ3{T-!h5~)S1tWXp_L1P#31Ouc?z;VjiHwh3Q{Nh0@nZH z0)|fZL)-82DT|zJVq6He0OnK(@=5?|DfechE@i24#09n1NWit{S-_f{PZeH*7xB-g zrOtiDUb+{z3RZ>xO$D6L?CqT99zSh~1Mr+a;b~Q(?RS34;?l^~NuTbaU}H%^4~i9L zNahF7(XD4lJdA7Sfi$TcvWvf`abH%Ftxt^!|Dqa&(Y%xm*T+(dfhVurSG7Gy;(>wT ztxwCsIt@~;A0%n5qlVu_D8<8#-D|yBfS!__ssGjP#;68xRWb!3L>wixQ2I%QKCXLT zqRBMGX#8esbNa={{p5jM&;K`CHIzWB2mN;TgU?>nK@*%eWJ%8UK_=3to%Pz_sqr)-BE=89RUJsUS{vRHT zMy{WKnK5dp#2t~JG4aXbbHh91_3;w&9@~if^Z!Gw7mA6VaOWkMI7z8+Wo&T}{fZ@z5u z+}@RBE5EL_2vD>0;^K1b_wlW3UV|5-OALw!7dDNAh`(5qYk>51``Rl+pxKSxLqIVOZqU+M)mn3G5 zp#iuAU-!XyJ*bp?J-?#kn!|l_;Kku{MN<~>0BV-#l!w)xm=ajkVCdi6TJH+R;=B2? z*uXNY$-QAcz9AznfGCI_A+KDA`>R`hn=qx8)q|JkbH_IZz%cLU&q8jLd3w$`(c)%} zo@6awducBdkgJmv(;BW>v{4Nm`OL)XWS^bu;8hpBh2sZf?3?!R<#}x?-TNr_n&?;$4fXEOgMlJ$hAu#zdA4^zChke-!~b-}fwG&I4EA zdSA185|{nX7&Tbx4$Ysrc|AdL6?m`CwP@AiyHkglauMiEX1;yQX??{xLZ&Am#g@SZ zARKrYe?J3wjay3IXaOLpi|aVRgN%Ip@PJiOCSuTdyWZ%|6N}4HE=!;}e3p0g4alal zfswtnn_j8fdG{@tb9G8phOCt?Mz5x6o0b`iEYB7_`LVKthXu6xGb?#eYYRWzZeyQg z-?R07B`QNpN?y^!YkybLQ5L|jJ<1oNnA9ZkZ<~7(0C!AMx>>Cv;}P zMen0J>;3$lZ5Uk-=T(_pdpAv2EKf0)<3mSGi)H7)aWol(9%xv<>{w*!PO zCU40{!Fnh)%4?#>f6MpAbU!UEdgplfHVgL8Q1ZbMV-09Y4QjRV8~D0MDzN3S-+uW# zrfmNF!$_w=Bg$Ku?L`BqRdEp2x@_Q2Ff|0=vXPF-YFM8A!GP8HbYW-|ATAU4MQe{L z=_>=UOJC?_*3pZpfRnl3{zazHesm{vF~`|2%87Aqs?;Rr1_TU{76FX7AL_pE=exlV zJyJpJH)i%W3M>~uma6CUxa_cZnZ?hA9)IKa$8`66s$Rux`^+o-9dU6n2Nz`Q#891j zYaVk0>s;m-_(EAz??kFZNom z!HYqa#i}mekPoNeaCB>&oqp=LA?er zMS4lIC?B=je2oxP=7?Fow7rPY(pqIAI^bF)1|rFhll?EY7u74r#F>l5hz+yN*I=P# zjt(|vW`Mu~%jX9l3V9zK(fmu%`}sA6K;Le;7TH-eNpyHoDxT4E#I>7)ua`bkU3;On z=lWi&Fmo^Bo^OMoT9-$uimT??_P>FN>oc^G~2(!w}4 zN6C(%jv*E5Qr~G%#?jT|!+TqcfZZl7!4{diDg$P`ZiFuW0eGy5lzNi>oO;x)ExwV| zb)GJ-CD`(ARQJQc!@YIGPT##Eb7MI(v8rN#oj8!rdx1?Cy{Rw z>ulKT8NAC>+lZA+0aIsfI8v{KmKosTW5H>);7Fgt-SPzoU6HM>Yah=dzqH{Oa$DuL z;cw4>x$m-GOgg@cqk5Qb@Glp9d7A-an}J&#T_4(Mt^w4142sc^mwfQec1eF=Q z@gKI>D;d*^*L8h%8cQrX5e3%@8Qz`z$sc>cPHAQv(lKRO>SIkT5+kl8$% zjil=w5Y8Yx&!_YJ^E(`PgiCZ?M!3W_m@u6wW~&0_p9h44Pmk`8RJjCT4!wOsPB|se z`O>IrOy$a81re^`p}Dxd07Tr>S9yIgsi@31Rkuc+5~l z$C;LE8hA$8HbVNlnm|m12f9_2mV43 zh_z2^WgoSXtCm>9q2CS$6YbYRJRX9tbiR7_IJxH$LVcGltX`UH=yWE7BLuWGNnBb&w}@x zpdh8>V4zR`6^=FlQep1ri0=-b%&DthZ5B=JZS5+HvjDo7vwENs(}Uyd#B|qqmp^4) z8&nj_uAG)#@eIU=!0rx?#Ijwe46l}g5tLn{=#GRCk`P;||BH!OnVG2fEtg+T#}^L@ zySmHqr5RlyUYIE-Cm-|D2VEH%Kq7ee8CAW^ZrK#AfQ)a(@F)M+s_M7mlj6<*Ko|UD zi+X0nDBOQlRA!6@))bHe)|7D#jTd?8h6obXq_%r8V=YUf$fm=pyyR!pz*Fg6R)j~} zq^6y=%{P8AjniNr=?r(g=*#oNi|T1G0KL{1&!`(X`mTkg%N!Vio=j*OLFF8ibwC#g z3aqg^jA3;I&g8ik*)O0)+3{GzX)1jM#QS+hAIz~akIb!mJs0A{|7P}t%&-=8CjItbhK z;sTqm0d>d%IT_eTBw;4Fd{!o>v)~C?&KRS72J{GallBuR^OUDvoiWm#&P%9BvpmEW z%1Iu-g>(~ZS1M$GfUc1kIs%Z4!Hs!Uud4Eq=GG;iRfMCY{4pDLi7tH2TF{>CA`)Wk zCx?i&G5g z-A7%gJnXF5Nl~VzA0V7y?#ccod z$j>u*CfCjPVwgw|c@yC>IlAZ@%;5gIVGgvmnfU^K>`{Qhj+ud`KDoze zY#)L31Bus^Phw=u3~VYYjM0sYEi!*T9nOjh``wMJM#ul8TFwmTK7+|2!NzF+?#hMT z*xS$QOvS~Hcf&P>USSDezTu9(<7-MnELsx0au~$0%x+xm8|ZUtk0Q8kE)~grjyh=v zfpPxma6^|C&7GuS`5EndvBUGN-hyS7HOt4+{ms}N0^*|^U~jH#I|w~PHR_b+LRs|K z{ax|dyZGlMhgM~r!IjFbZ`piev zR-Or#1qT^v)tyZUekHYJ&u($itDA{Ujp^*hVS+48#j@ksO2R?ce@;M2{Xf3B_#(aW zg*eOz{ohpwi#;pTxzZL_yt$La7|hAeMZVF2pH2_iB^nFqgc#KUvYKAfdJH`}P`+K_ zixpf4xL=+zgp{7@&j!kbQ&-+3an7Gz3j&~i{D*x6BZ3(_3*nc2_cFIZBe0-+fNJ}= zFo}-QW$1I{va{JMsLFRx$_zw_r!UKo!XmSCp<#E&p2PQtEM9vI#o)th5feEx03nj` z=5ILt>#AnRABpzv>8W$K3@!*v+Qi{)Yqda0o#ei6Y9?~gB_8_?*HEf)6x*L8_;6Md zVNqn_`6+8IPxNtSpm0{{AAd;$qVe5CHT&ZKK(6Z^Bj3nK@LbS4Ond=E#C4lsK#HW*xl98h{{2-wyFINgxzx?#Aw^_4vMSq%8(R6_GcM|)_RE=pHz!;l!zN9p*@NN}-QhqzIF?zQiu7xm{3wild_!`9%SsVr zH({kY%a5OlO>@GWkS~Mln}atP8K>7kM0c9-4&_4aws*W>m4Bto*58Z#R|@&Rkgpu+u%b86hs{Yz;x9SOycc$X*wx~v$i@-OTQ=i~ z=-v?Nm215uI-#e@K8otd&OdJD1@jxiwFqrF%k3}3_%>Mi)d|mDk&9$kx8r_xrjiSK z<9A%Zr>zQv&%1WIBv`RW%wAzR-=j`*L+(LN&kXqe+z05~`KIkalHoXGFZRC2+A-h0o_EQY6tKe}z*;QpRKC--tem}jLGa>gkqtMrD!SzuS~C|h_#9sk?fecfyDWv7GZW?_vB)P!9C$_HG)O+Z=G^EG?`h6{8gt{j3F~*LpLElb z>r>>9XAAGy5o*HfGGTR22G4UEP^#n{q@U;Q5@FKXO#CzCj|oiqeExQ3ciD;xcI;(Y zEc-hmPi%ntoR!CgD1C4IG?Sguh)ELKR|g&tMpKq>^PZJM0pYE(i=PyRU?J}txUZCRzk`xz zvUiSD&OpqEi}p&*53};M(Q7lYMnVJLu^A~nH$e?hr~e51d78@>woXlwD_qQe;g@5_ zFHa4;>Bqj25}=DJd!#;-FTXcwAVg)td)Nw{bKuM(ll|f`Qoa3Atl{Fq9_-v9Z8LE@ zX{~7nYl%@TTQS7;7N3)Bh{T>p!N7K^0L9f7g+DwsW8`xoyB0t0#t!Q{hw;(a3fFTI zcWiI63%JGcub1G<1AC9DtH~N{`^<{OP({N!qAOSb#wMvtwa$RF15Iu)o#`UlcLlK34OHB8T={zd z?pCuI-96XTx$Y-^M;d_KU>=~`ub9c=_&@Cw+!3aEnuXTxM+Ga&>z+^5D2B<^iNr z2>>v5Rw1xj4O#HE=BI5{Op1G~Eacz~#x)SW<`!HPK;O1S@@|<0dTB#Y6A`&K48n;4$sjv!sj;FEz-b{ZIyCoWcZ=wrX5BS zp;43jc8(lC@Wb`(&92>Kd>on4$CgWRC*)l5$>ivU{q-3ryH27KZ70oA5;TqVf3W_Q z(=?QuYZCd&qllXn-b-!5?QXLF8OiH2pdqCq@)?jurr;>jwR@G4Da_GsB@wrdLEHF> zqcQ#UFlCcFPphd%Q^?zlB?r$GI`!c|lp_k0eZ*8P`0Jb^=xU+m#m?U>4_RQhiDYnd z-XNHSc&;AeJPl9P;@q;Gjlz`Do)1`ixAka?tK|ZZ-4IcoT2l;md=`2g&aSF#!v>RJ z!)eaPE#5HjINI~EgilE$Rshnp8N3Ntk!m9UQ&+wAFT<9pB{~S)ZVwD>8%w<-jilHG z{L?JthRE%=4K*mC#VCsn9nlZfO*l|9Adgh@etQtz_sbk_8g z3O|i11in>6HodKxu&o+OahI3H=`!{ywDuCmcG)ic4V%9uNR*rGBm%q=zwCyU)7+Gr z-MWWmPq#ic_&|Feb|Ik6l<}@C$rJUQw@G z8St$#IQt5Og8R6e0+>Q{A(W~!K#mM}5Mi%ULi+B%`L}D%mp2Zo@6}KsyW)`MU&)V1I*|2F$!{ z5J4LaHL{Oa`ake~HngaUS2i#$9$c_L{(NQKH~-_*1nQWrFX z>=cc!#akk`ea%k7(rOUN)q(!)_`~L~TIEI8(%R z4DZKX;3$vU!}NxZ->f)e@@>HUOm>IxQXLqKTLLHmc1|?S|MV;g7EJp>z1x}4q-8&m zv95oU2GO#g&6w_Ab~XpU?n4*1JdnoP6I$NZbOo=k?}oK+Eia=1>#6(C2#+|d$T-lS zNQb{Q!buD>{hS#b)nRai%hW--pAB>*r>Q-gDEMv+&zu=F1Q!*h>HGmA7xmyOJXoG*({> zOdABvX8?%M^-0p=nf18U(mwXZcL|VM@NCUWcXgHbfUr?bGI9n4)3KLsH*)`$;6-Mb zSbTSVE-()4lGhfPSa1qX=_$i*&>ksUvz?X18ngBLJDmc%3=ZFOOTF#yYAV*3lVm1J z!)adSgY7hQ(EP|nw#PaBgh6T3mbF>MKGrqbtfn}jBOgp}0a6U2ST<~Lg~=bkLWBRt z)+N?it&WWm0Za~~B3C6nMQSCDVJaNMFoS`#tO(TCz|I=NqxUrfH0o`3Ht#a}>j%KL zO6$%Pc4>*$zi#OY>xgaN%+DoFsnNTt=R z3}Tpg)l2ujxgTN6E3LmHMSbv4)nwZ0A7a-i1w73YQ?o9x6_uJlC+1&RJbk^zH^h-p z^Au5yWc-v@ly^Xzi4NRE27iq<^ZjD`FUX&?kk4Sm zZwJb@h$^qKpXzXS+N}DIr_}&fX6js#`Z{VnL{x-WRn)#akHphzl-F6x;u8@}>Bxd$ zIz@6%23tu30IF-eTHhsR+pzIhhC>bv$D%7qkYQq%`Fg-RGTb;JoDlQ^d{W(jCFQT@ z8vMa2NIoY5C@EO8nA;fU9}GYq#%5Jiq0T7oOn@Du53)_c{sb-5hxfb05zkqXNr}?n zdGvI&n09LQcpFos7dj6;#3pPP`;|sGE$?g$Xv6!gp-xLyc6>{Q_>Fd~uTW8m$D4S7#WckQs6brRtOyPQO`}7Gng<;j!C55X1z{ zmDyhS38OGcBBCSH(YBpI3pQ5E=tz55d*!<1?VvhiBvb)g?scUyQDZgrGu2W_lKz+t zwWizk{bqenkt{gbPO^Sa8|Kw5L{0j?Zr+al=c$D%IjYzHyHuBDk^hgN#Sh~=-9`Z} z{k7M-$XUhQ$bgND;9x{ zwukJpe@LD5rMXQ!ou_?_sEXEB3k#xkNCsox?yLHELNqKkz$dT}xAxR&sEV@tX( zek5|)y7S=A!X?*F6ZH|$dvQfEVaC$MQ+P(cAJaIf5F?HFnLQK}r-yyv9QknsWl|9t z6NDRCXui|D6S5Ekd6b{Avi#YdQan88zr}xkxj8nx==rB$cRaI>d(qXtW~5|G4_@O7_6I#W|hney%$u4?XzG(r+;u zq7|;6{b^@QV0P$isP5u&quoLDt51}oB|bOpnU7jwpuzHM4zf3@QJS)%?=ZH|s!^M< zLTYfwhn0uUbWAL)G}7WTng_Jq@!4O8CqBkaWOu}2|47Bn&qW^^@OOKX`n?=SLh=cQ%@kUwH-`vJ*ct5q)fUqqA*G zVE+%9QF;tDStFyF|K6Qna67CQ`t@EMs_H1kY7*!_LkH2IT(}f*vog$PrBOPDI1}jX zfD`rm3Ri=QmSldBUWJ6wR^kw04#9~7sJseLZ-+bH969c5BOY6bdElKe!E)!T>b@eZZRI#@pYgmK6Bd>yutw{6iM{pi!b#?FON&jw9= zY#Bf$x?9hg)Jh0`*eqZ9!+i@9rGiXkfplO5(Y0FG87bz83%&mh?QkevohZ5!a3lK6zk+R>{??WAv!-SK@Oc&G3zNrYt*p1+ zyL+}p^tY+v7J0|b#{4^*dh@rr@q=TMS`bebB>P`zELS{R0GD!TnIkq6iq>12N4;>O zs9WeioePt@-Y~188*#f;K)<60T6S0G6u4SV_9i{1D;JeEv577}`Hbi0vW zFHP-{;;I%VF{PjIcfuQS`?W!x58jK)_7l8^q9MPxb-&GzYz#TDjk|L|Z@D3nx-GO3 zdrc9p?cm1u`zu3jO&f49DlqEOzS{_Ue7}pl0M?aJwHt_*svdukpenCYvBKi z?CGihV8cwS^U0-pgXL{vCE>vPU&ehqxu~u0qr!vQ$_qC)?Bb?QyD?O{<0C@tP5R}L z66|?KZs!SdxedJGvU_~`?Q9_j4NBD=NO;Z-0rdp`vD}R%5gk1P6GMdOMWwebS(m>q zjPIY_9puJ%R^TY9)0vqcFr;8MuPY5kTo{W+Z&|rweP}`_Z;OLj%=!4i8P%>=WXl^T z0^jeQanpW7c8o~@UEDMyp&L2BR1yB#kwdKr{-c9XojjEmYOtUT5B`zN{aX}@&IL7& zyl?TIjcQ$I*$9ur{181D*|G+kUIPrVfqz(RfY?lJPd#K1zk&Zo#Eyqk7Fg|9aOkSz zhp-LGyi)%|Ax&F(RXX?X5>yydVeV*E{5NWkrXZf6L{(;~en747rR}_C5Vx_O%KCu% z0U@q8`~AdHWFYdQ;u>O$`CDX)6%pDl7H_{tu=Ey<=MkaA0J<$Z=o1vAAddK5Cy^Cz z`72V9fov90lZmRtmirJk>fT+dB2rbL)Rf3dvg>!J9Ve=esvvcc(65`Qn;7DsM4Lod zwYos=l}v?vtBUw_Em8WYg{VzKKcv=b3(S7=*Hw^vd$0IxfT@V;gNgay9OAaJooEFI zH@9w>Bk~d{$tVC&B8q5IsEphpHV`Wd@Sk9qtw_1v!|!FVa#4gbBJN>?ot9uvJ=$$E zc;l+!bYgb0-H;`*>l-3eiQRW^Nm~}Vr?BbF1_PC->1)K)Z{zSS?6yy-+MAJv<9zuI zELA@L0B!xMOPfG4Ow?L)Y zp*M7FV}v4O%9>X8Dddh!^U*@7|3+wH!`&n7xqAlCO_NGwVLDNRhS5=NHWkdcJ?v_m zJhTHIR1fLg5V5)Sf+MZ(P}kiJ&0xXe%EJ*^YMBcA&pl{`Z1X+@u^B_$`x8vb5PYoS8fz3-M=S4^iJ}8$6V4h2E^cvGtZIZSOVkg-vkVzdzd_ zrY0Hq>%tGSot|#8+!UYlji{KI@1X|Y_`8Q8k5NUgG!q@Ks^rPT4+&OJ5~JG3|H{)E zh*H%Jv7h*dX_Iw6V6hJkM#PJh#u?6DlQSCZ>_ZgkhViCHh&CB7v0iT|brT=)5|rb3 zalGk!8*N?A(cNmx9PtSuMflI0X4%F-Zv@G&9vvl0j}}?NRm55X3N#Uti24=OM%Z|8 MBm3ff+vW}bA8ql$wEzGB literal 0 HcmV?d00001 diff --git a/research/native-ccache-columns/fixtures/missing-undo.bin.gz b/research/native-ccache-columns/fixtures/missing-undo.bin.gz new file mode 100644 index 0000000000000000000000000000000000000000..af66ad1eeb13c6bcf515fd7c2870c30800a2aba9 GIT binary patch literal 52844 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 literal 0 HcmV?d00001 diff --git a/research/native-ccache-columns/test_package.py b/research/native-ccache-columns/test_package.py new file mode 100644 index 0000000000..450b85ed96 --- /dev/null +++ b/research/native-ccache-columns/test_package.py @@ -0,0 +1,149 @@ +"""Actual-input and receipt failure controls; no native execution is implied. + +Gareth Davidson with substantial OpenAI Codex assistance. Apache-2.0. +""" +from pathlib import Path +import copy +import json +import os +import shutil +import subprocess +import sys +import tempfile +import unittest +from unittest.mock import patch + +HERE = Path(__file__).resolve().parent +sys.path.insert(0, str(HERE)) +import verify as v +import benchmark as b + + +def clone(temporary): + root = Path(temporary) / "repo" + package = root / "research" / HERE.name + shutil.copytree(HERE, package, copy_function=shutil.copyfile) + for row in v.source_pins(): + dst = root / row["path"] + dst.parent.mkdir(parents=True, exist_ok=True) + shutil.copyfile(v.ROOT / row["path"], dst) + for item in root.rglob("*"): + if item.is_dir(): + item.chmod(0o755) + return root, package + + +class Controls(unittest.TestCase): + def test_source_drift(self): + with tempfile.TemporaryDirectory() as temporary: + root, package = clone(temporary) + for row in v.source_pins(root, package): + with self.subTest(source=row["path"]): + p = root / row["path"] + old = p.read_bytes() + p.write_bytes(old + b"\n") + with self.assertRaisesRegex(ValueError, "source hash"): + v.source_pins(root, package) + p.write_bytes(old) + + def test_fixture_bytes_and_payload_binding(self): + with tempfile.TemporaryDirectory() as temporary: + _, package = clone(temporary) + meta = v.read(package / "FIXTURES.json") + for label, row in meta["inputs"].items(): + with self.subTest(fixture=label): + p = package / row["path"] + old = p.read_bytes() + p.write_bytes(old + b"changed") + with self.assertRaisesRegex(ValueError, "immutable fixture container"): + v.fixtures(package) + p.write_bytes(old) + meta["inputs"]["baseline"]["payload_sha256"] = "0" * 64 + (package / "FIXTURES.json").write_text(json.dumps(meta)) + with self.assertRaisesRegex(ValueError, "fixture payload"): + v.fixtures(package) + + def test_missing_undo_is_a_mathematical_failure(self): + with self.assertRaisesRegex(ValueError, "local defining full column"): + v.independent(v.fixtures()["missing-undo"]) + + def test_location_must_bind_before_normalization(self): + raw = v.fixtures()["baseline"] + expected = v.read(HERE / "NATIVE.json")["baseline"] + receipt = dict(expected, local_scalar_stream="/expected/input.bin", seconds=0.1) + self.assertEqual(v.normalize(receipt, Path("/expected/input.bin"), raw), expected) + with self.assertRaisesRegex(ValueError, "native input path binding"): + v.normalize(receipt, Path("/different/input.bin"), raw) + wrong = raw[:-1] + bytes([raw[-1] ^ 1]) + self.assertNotEqual(v.canonical(v.normalize(receipt, Path("/expected/input.bin"), wrong)), + v.canonical(expected)) + + def test_only_elapsed_and_bound_location_normalize(self): + raw = v.fixtures()["baseline"] + expected = v.read(HERE / "NATIVE.json")["baseline"] + receipt = dict(expected, local_scalar_stream="/input.bin", seconds=1.0) + bad = [] + r = copy.deepcopy(receipt); r["stages"][1]["signed_inverse"] = 1; bad.append(r) + r = copy.deepcopy(receipt); r["negative_controls"].pop(); bad.append(r) + r = copy.deepcopy(receipt); r["local_raw_H"][0][1] += 1; bad.append(r) + r = copy.deepcopy(receipt); r["payload_prefix_upper"] = "1"; bad.append(r) + r = copy.deepcopy(receipt); del r["scope"]; bad.append(r) + r = copy.deepcopy(receipt); r["bridge_additions"] -= 1; bad.append(r) + for r in bad: + self.assertNotEqual(v.canonical(v.normalize(r, Path("/input.bin"), raw)), v.canonical(expected)) + for elapsed in (None, True, float("nan"), -1): + with self.subTest(elapsed=elapsed), self.assertRaisesRegex(ValueError, "native elapsed field"): + v.normalize(dict(receipt, seconds=elapsed), Path("/input.bin"), raw) + + def test_strict_json(self): + with tempfile.TemporaryDirectory() as temporary: + p = Path(temporary) / "bad.json" + for text in ('{"x":1,"x":2}', '{"x":NaN}', '{"x":Infinity}'): + p.write_text(text) + with self.assertRaises(ValueError): + v.read(p) + + def test_inherited_cache_policy_is_removed(self): + with patch.dict(os.environ, {"CCACHE_SLOPPINESS": "time_macros,system_headers", + "CCACHE_COMPILERCHECK": "none", "CCACHE_REMOTE_STORAGE": "unused", + "CCACHE_DIR": "/outside", "CCACHE_DISABLE": "1"}): + env = b.clean_environment() + self.assertFalse(any(key.startswith("CCACHE_") for key in env)) + self.assertEqual(env["LC_ALL"], "C") + with tempfile.TemporaryDirectory() as temporary: + work = Path(temporary) + cenv = b.cache_environment(work, env) + self.assertEqual(cenv["CCACHE_DIR"], str(work / "cache")) + self.assertEqual(cenv["CCACHE_CONFIGPATH"], str(work / "ccache.conf")) + config = (work / "ccache.conf").read_text() + self.assertIn("compiler_check = content\n", config) + self.assertIn("direct_mode = false\n", config) + self.assertIn("sloppiness =\n", config) + self.assertIn("remote_storage =\n", config) + + def test_corrupted_receipt_actual_entry_point(self): + with tempfile.TemporaryDirectory() as temporary: + _, package = clone(temporary) + p = package / "NATIVE.json" + data = v.read(p) + data["deferred"]["local_scalar_additions"] -= 1 + p.write_text(json.dumps(data)) + r = subprocess.run([sys.executable, "-I", "-O", "-B", str(package / "verify.py")], + cwd=temporary, capture_output=True, text=True, timeout=30) + self.assertNotEqual(r.returncode, 0) + self.assertIn("independent native field: local_scalar_additions", r.stderr) + + def test_existing_work_is_preserved(self): + with tempfile.TemporaryDirectory() as temporary: + p = Path(temporary) / "keep" + p.write_bytes(b"preserve evidence\n") + r = subprocess.run([sys.executable, "-I", "-O", "-B", str(HERE / "benchmark.py"), + "--work", temporary, "--cxx", "/missing", "--ccache", "/missing"], + capture_output=True, text=True, timeout=30) + self.assertNotEqual(r.returncode, 0) + self.assertIn("fresh external work directory required", r.stderr) + self.assertEqual(p.read_bytes(), b"preserve evidence\n") + + +if __name__ == "__main__": + unittest.main(verbosity=2) diff --git a/research/native-ccache-columns/verify.py b/research/native-ccache-columns/verify.py new file mode 100644 index 0000000000..4189816694 --- /dev/null +++ b/research/native-ccache-columns/verify.py @@ -0,0 +1,194 @@ +"""Exact inputs and independent nine-stage replay. This does not compile C++. + +Gareth Davidson with substantial OpenAI Codex assistance. Apache-2.0. +""" +from pathlib import Path +from collections import Counter +import gzip +import hashlib +import json +import math +import struct + +HERE = Path(__file__).resolve().parent +ROOT = HERE.parents[1] +HUB = Path("research/e8-bit-carrier-skeleton") + + +def need(value, message): + if not value: + raise ValueError(message) + + +def pairs(items): + out = {} + for key, value in items: + need(key not in out, "duplicate JSON key") + out[key] = value + return out + + +def reject(value): + raise ValueError("nonfinite JSON: " + value) + + +def read(path): + return json.loads(Path(path).read_bytes(), object_pairs_hook=pairs, parse_constant=reject) + + +def canonical(value): + return json.dumps(value, sort_keys=True, separators=(",", ":"), allow_nan=False) + + +def sha(raw): + return hashlib.sha256(raw).hexdigest() + + +def source_pins(root=ROOT, package=HERE): + rows = [x for x in read(package / "SOURCES.json")["files"] if x["usage"] == "input"] + need({x["path"] for x in rows} == {str(HUB / x) for x in + ("code/bit/checkers/columns_k.cpp", "code/bit/checkers/json.hpp", "NOTICE.md")}, + "exact native source inventory") + for row in rows: + need(sha((root / row["path"]).read_bytes()) == row["sha256"], "source hash: " + row["path"]) + return rows + + +def fixtures(package=HERE): + meta = read(package / "FIXTURES.json") + need(meta["head"] == "b52f87f5355ad9f02ca4ac4395117655ac1b19c7", "fixture predecessor") + need(set(meta["inputs"]) == {"baseline", "deferred", "missing-undo"}, "fixture inventory") + out = {} + for label, item in meta["inputs"].items(): + path = Path(item["path"]) + need(path.parts == ("fixtures", label + ".bin.gz"), "fixture path") + container = (package / path).read_bytes() + need(sha(container) == item["container_sha256"], "immutable fixture container") + raw = gzip.decompress(container) + need(sha(raw) == item["payload_sha256"] and len(raw) == 24 * item["records"], "fixture payload") + out[label] = raw + return out + + +def normalize(receipt, raw_path, raw): + """Bind the sole location field before replacing it by the consumed byte hash.""" + out = dict(receipt) + need(out.get("local_scalar_stream") == str(raw_path), "native input path binding") + elapsed = out.pop("seconds", None) + need(type(elapsed) in (int, float) and math.isfinite(elapsed) and elapsed >= 0, "native elapsed field") + out["local_scalar_stream"] = "sha256:" + sha(raw) + return out + + +def independent(raw): + """All dirty columns as Python integer bitsets; literal fixed nine-stage schedule.""" + records = list(struct.iter_unpack("<6i", raw)) + operations = [q for q in records if q[0] != 0] + need(all(q[0] in (0, 1, 2, 3) for q in records), "raw opcode") + hist = Counter(q[4] for q in records if q[0] == 0 and q[4]) + hist.update(q[5] for q in operations if q[0] == 2) + local, v, dirt, total = 661, 111, 439, 1327 + adds = sum(q[0] == 1 for q in operations) + odd = sum(q[0] == 1 and q[3] % 2 for q in operations) + copies = sum(q[0] == 2 for q in operations) + need(copies == sum(q[0] == 3 for q in operations) == 9, "local copy count") + maxima = [] + for reverse in (False, True): + norms = [1] * (local + 1) + maximum, opened = 1, False + for op, a, b, c, _, _ in (reversed(operations) if reverse else operations): + if reverse and op in (2, 3): + op = 5 - op + if op == 1: + norms[a] += abs(c) * norms[b] + maximum = max(maximum, norms[a]) + elif op == 2: + need(not opened, "fresh prefix copy") + norms[local], opened = norms[a], True + else: + need(opened, "prefix erase") + norms[local], opened = 0, False + need(not opened, "prefix copy closed") + maxima.append(maximum) + # Independently spell the fixed 9-stage schedule, rather than generate it in C++. + active = [(0, 1), (1, 0), (0, 1), (3, 2), (2, 3), (5, 4), (4, 5), (7, 6), (6, 7)] + bridges = {1: [(0, 2), (3, 1)], 2: [(3, 1), (0, 2)], + 3: [(2, 4), (5, 3)], 4: [(5, 3), (2, 4)], + 5: [(4, 6), (7, 5)], 6: [(7, 5), (4, 6)], + 8: [(5, 7), (6, 4), (3, 5), (4, 2), (1, 3), (2, 0)]} + state = [1 << i for i in range(total)] + [0] + for stage, (left, right) in enumerate(active): + reverse = stage % 2 == 1 + opened = False + + def loc(i): + need(0 <= i <= local, "raw local index") + if i < v: + return left * v + i + if i < 2 * v: + return right * v + i - v + return 8 * v + i - 2 * v + + for op, a, b, c, _, _ in (reversed(operations) if reverse else operations): + if reverse and op in (2, 3): + op = 5 - op + if op == 1: + if c % 2: + state[loc(a)] ^= state[loc(b)] + elif op == 2: + need(not opened, "fresh physical copy") + state[total], opened = state[loc(a)], True + else: + need(opened, "physical erase") + state[total], opened = 0, False + need(not opened, "stage copy closed") + if stage == 0: + need(state[:total] == [(1 << i) ^ ((1 << (i - v)) if v <= i < 2 * v else 0) + for i in range(total)], "local defining full column") + for dst, src in bridges.get(stage, []): + for j in range(v): + state[dst * v + j] ^= state[src * v + j] + for bank in range(0, 8, 2): + for j in range(v): + a, b = bank * v + j, (bank + 1) * v + j + state[a], state[b] = state[b], state[a] + need(state == [1 << i for i in range(total)] + [0], "nine-stage full-column endpoint") + bound = 64 * maxima[0]**3 * maxima[1]**2 + need(bound < 2**104, "local prefix bound") + return {"formal_columns_checked": total, "independent_dirty_registers": dirt, + "local_scalar_additions": adds, "local_odd_scalar_additions": odd, + "stage_additions": 9 * adds, "bridge_additions": 18 * v, + "fresh_center_copies": 81, "reverse_fresh_center_copies": 36, + "local_raw_H": [[k, hist[k]] for k in sorted(hist)], + "payload_prefix_upper": str(bound), "payload_prefix_bits": bound.bit_length(), + "signed_lift_prefix": [{"reverse": bool(i), "cancellation_free_signed_row_l1_upper": str(m), + "bits": m.bit_length()} for i, m in enumerate(maxima)]} + + +def replay(root=ROOT, package=HERE): + source_pins(root, package) + raw = fixtures(package) + expected = read(package / "NATIVE.json") + need(set(expected) == {"baseline", "deferred"}, "native receipt inventory") + for label in ("baseline", "deferred"): + actual = independent(raw[label]) + need(expected[label]["local_scalar_stream"] == "sha256:" + sha(raw[label]), "record binding") + for key, value in actual.items(): + need(canonical(expected[label][key]) == canonical(value), "independent native field: " + key) + need(len(expected[label]["stages"]) == 9, "native nine-stage receipt") + controls = expected[label]["negative_controls"] + need(canonical(controls) == canonical([{"omit_bridge": i, "rejected": True} for i in range(18)]), + "bridge control inventory") + try: + independent(raw["missing-undo"]) + except ValueError as error: + need(str(error) == "local defining full column", "wrong negative-control failure") + else: + raise ValueError("missing undo accepted") + return {"status": "PASS_NATIVE_CACHE_INPUTS_AND_PYTHON_COLUMNS_ONLY", "native_executed": False, + "words": 2, "formal_columns_per_word": 1327, "stages_per_word": 9, + "payload_sha256": {key: sha(value) for key, value in raw.items()}} + + +if __name__ == "__main__": + print(json.dumps(replay(), sort_keys=True))