From 8e2e18b93d8c6b302e540ad5edc767cb98cf1514 Mon Sep 17 00:00:00 2001 From: Ali Romman <226877337+aliromman@users.noreply.github.com> Date: Tue, 13 Oct 2026 13:53:23 -0500 Subject: [PATCH] Prove a sharp k8 factory register bound and target frame barriers --- .../k8-frame-antichain/BASELINE-REPLAY.json | 262 + .../k8-frame-antichain/BASELINE-REPLAY.md | 61 + research/k8-frame-antichain/CERTIFICATE.json | 11371 ++++++++++++++++ research/k8-frame-antichain/LICENSE | 201 + research/k8-frame-antichain/NOTICE.md | 36 + research/k8-frame-antichain/PROOF.md | 192 + research/k8-frame-antichain/README.md | 82 + research/k8-frame-antichain/RESEARCH-NOTES.md | 69 + research/k8-frame-antichain/SOURCES.json | 93 + research/k8-frame-antichain/VALIDATION.md | 48 + research/k8-frame-antichain/independent.py | 138 + .../inputs/PACKET-PROGRAMS.json.gz | Bin 0 -> 3400 bytes .../inputs/SEVEN-SLOT-WORD.json.gz | Bin 0 -> 57222 bytes .../inputs/SLOT-PINS-k8.json | 47 + research/k8-frame-antichain/verify.py | 373 + 15 files changed, 12973 insertions(+) create mode 100644 research/k8-frame-antichain/BASELINE-REPLAY.json create mode 100644 research/k8-frame-antichain/BASELINE-REPLAY.md create mode 100644 research/k8-frame-antichain/CERTIFICATE.json create mode 100644 research/k8-frame-antichain/LICENSE create mode 100644 research/k8-frame-antichain/NOTICE.md create mode 100644 research/k8-frame-antichain/PROOF.md create mode 100644 research/k8-frame-antichain/README.md create mode 100644 research/k8-frame-antichain/RESEARCH-NOTES.md create mode 100644 research/k8-frame-antichain/SOURCES.json create mode 100644 research/k8-frame-antichain/VALIDATION.md create mode 100644 research/k8-frame-antichain/independent.py create mode 100644 research/k8-frame-antichain/inputs/PACKET-PROGRAMS.json.gz create mode 100644 research/k8-frame-antichain/inputs/SEVEN-SLOT-WORD.json.gz create mode 100644 research/k8-frame-antichain/inputs/SLOT-PINS-k8.json create mode 100644 research/k8-frame-antichain/verify.py diff --git a/research/k8-frame-antichain/BASELINE-REPLAY.json b/research/k8-frame-antichain/BASELINE-REPLAY.json new file mode 100644 index 0000000000..7952f87c56 --- /dev/null +++ b/research/k8-frame-antichain/BASELINE-REPLAY.json @@ -0,0 +1,262 @@ +{ + "base": [ + { + "step": "shadow-early", + "exit_code": 0, + "seconds": 0.312 + }, + { + "step": "shadow-prefix", + "exit_code": 0, + "seconds": 0.472 + }, + { + "step": "gauge-forward", + "exit_code": 0, + "seconds": 0.45 + }, + { + "step": "port0", + "exit_code": 0, + "seconds": 0.346 + }, + { + "step": "port1", + "exit_code": 0, + "seconds": 0.356 + }, + { + "step": "port2", + "exit_code": 0, + "seconds": 0.354 + }, + { + "step": "port3", + "exit_code": 0, + "seconds": 0.442 + } + ], + "cell": [ + { + "step": "gauge-forward", + "exit_code": 0, + "seconds": 0.395 + }, + { + "step": "port0", + "exit_code": 0, + "seconds": 0.374 + }, + { + "step": "port1", + "exit_code": 0, + "seconds": 0.482 + }, + { + "step": "port2", + "exit_code": 0, + "seconds": 0.517 + }, + { + "step": "port3", + "exit_code": 0, + "seconds": 0.442 + }, + { + "step": "cold44", + "exit_code": 0, + "seconds": 2.81 + } + ], + "chain": [ + { + "step": "pivot-swap", + "exit_code": 0, + "seconds": 10.172 + }, + { + "step": "cold44-exact", + "exit_code": 0, + "seconds": 2.01 + }, + { + "step": "lec-p6n", + "exit_code": 0, + "seconds": 117.763 + }, + { + "step": "promotion", + "exit_code": 0, + "seconds": 0.264 + }, + { + "step": "promo-controls", + "exit_code": 0, + "seconds": 7.186 + }, + { + "step": "lec-promo", + "exit_code": 0, + "seconds": 81.834 + }, + { + "step": "jx", + "exit_code": 0, + "seconds": 0.174 + }, + { + "step": "jx-control-C0_identity", + "exit_code": 0, + "seconds": 0.127 + }, + { + "step": "jx-control-C1_741_only", + "exit_code": 0, + "seconds": 0.128 + }, + { + "step": "jx-control-N3_plain_join_moved_reads", + "exit_code": 0, + "seconds": 0.133 + }, + { + "step": "lec-jx", + "exit_code": 0, + "seconds": 105.512 + }, + { + "step": "hybrids", + "exit_code": 0, + "seconds": 0.105 + }, + { + "step": "hybrid-controls", + "exit_code": 0, + "seconds": 13.119 + }, + { + "step": "lec-hyb", + "exit_code": 0, + "seconds": 88.857 + }, + { + "step": "frames", + "exit_code": 0, + "seconds": 0.521 + }, + { + "step": "lec-frames", + "exit_code": 0, + "seconds": 90.473 + }, + { + "step": "native", + "exit_code": 0, + "seconds": 1.243 + }, + { + "step": "ledgers", + "exit_code": 0, + "seconds": 0.822 + }, + { + "step": "local-replay", + "exit_code": 0, + "seconds": 5.213 + }, + { + "step": "wrappers", + "exit_code": 0, + "seconds": 2.337 + }, + { + "step": "phases", + "exit_code": 0, + "seconds": 191.38 + } + ], + "slots": [ + { + "step": "slots", + "command": [ + "python3", + "-B", + "SOURCES/research/gauge44-leaver8/construction/barch/build_tri.py", + "CHAIN/frames/FULL-WORD.json.gz", + "SOURCES/research/gauge44-slots/construction/slots/RECIPE-SLOTS-k8.json", + "SLOTS/FULL-WORD.json.gz" + ], + "exit_code": 0, + "seconds": 0.14077299972996116 + }, + { + "step": "native", + "command": [ + "python3", + "-B", + "MAIN/research/complex-k492-owner-repair/vendor/multicold/code/run_portable.py", + "SOURCES/research/complex-571-cold14-st2/code/hpe_audit_and_transport.py", + "--raw", + "SLOTS/FULL-WORD.json.gz", + "--routing", + "MAIN/research/complex-k492-owner-repair/vendor/multicold/vendor/pr558/vendor/pr552/complex-local/inputs/phase-baseline/CANONICAL-WORD.json.gz", + "--out", + "SLOTS/local" + ], + "exit_code": 0, + "seconds": 1.8713445831090212 + }, + { + "step": "ledgers", + "command": [ + "python3", + "-B", + "MAIN/research/complex-k492-owner-repair/vendor/multicold/code/run_portable.py", + "SOURCES/research/complex-571-cold14-st2/code/hpe_emit_local.py", + "SLOTS/local" + ], + "exit_code": 0, + "seconds": 1.0618331669829786 + }, + { + "step": "local-replay", + "command": [ + "python3", + "-B", + "MAIN/research/complex-k492-owner-repair/vendor/multicold/code/run_portable.py", + "SOURCES/research/complex-571-cold14-st2/code/hpe_audit_local.py", + "SLOTS/local" + ], + "exit_code": 0, + "seconds": 6.432917749974877 + }, + { + "step": "wrappers", + "command": [ + "python3", + "-B", + "MAIN/research/complex-k492-owner-repair/vendor/multicold/code/run_portable.py", + "SOURCES/research/complex-571-cold14-st2/code/hpe_adapters_local.py", + "SLOTS/local/CANONICAL-WORD.json.gz", + "SLOTS/local/RESIDUAL-ADAPTERS.json", + "SLOTS/local/WRAPPER-CHECKS.json" + ], + "exit_code": 0, + "seconds": 2.5233489158563316 + }, + { + "step": "exact-phases", + "command": [ + "python3", + "-B", + "MAIN/research/complex-k492-owner-repair/vendor/multicold/code/run_portable.py", + "MAIN/research/complex-k492-owner-repair/vendor/multicold/vendor/pr558/code/phases_full.py", + "SLOTS/local", + "MAIN/research/complex-k492-owner-repair/vendor/multicold/vendor/pr558/vendor/pr552/complex-global/vendor531/vendor/clifford" + ], + "exit_code": 0, + "seconds": 339.10877466667444, + "clifford_recipes_sha256": "d0768f2164d5f64a2fdbec422f1cfde4e400818792f1904ca541958377243731" + } + ] +} diff --git a/research/k8-frame-antichain/BASELINE-REPLAY.md b/research/k8-frame-antichain/BASELINE-REPLAY.md new file mode 100644 index 0000000000..3611b9d264 --- /dev/null +++ b/research/k8-frame-antichain/BASELINE-REPLAY.md @@ -0,0 +1,61 @@ +# Separate baseline rebuild + +The native baseline was rebuilt with unchanged source files and one CPU +thread. Output went to separate directories. No source assertion was +removed, replaced, or patched at runtime. + +The roles in the recorded commands are: + +| Role | Exact source | +| --- | --- | +| MAIN | base `abdc6a7002abdbcd9e21bfc5e1a795784deacfdf` | +| SOURCES, gauge44-leaver8 and gauge44-slots | PR1074 `052afc128954f7b6a2b3c409eb4d72248e4020f2` | +| SOURCES, complex-571-cold14-st2 | PR635 `a6895a69f8ad98ab45777b03e9e6f48888c39f6f` | +| BASE, CELL, CHAIN, SLOTS | separate generated output directories | + +The scalar chain used these commands, with each role replaced by its path: + +```sh +python3 -B SOURCES/research/gauge44-leaver8/construction/reproduce.py \ + --main MAIN --pr635 SOURCES --out BASE --until word --frozen-cold +python3 -B SOURCES/research/gauge44-leaver8/construction/leaver/reproduce_leaver.py \ + --main MAIN --pr635 SOURCES --word-dir BASE --id k8 --out CELL --word-only +python3 -B SOURCES/research/gauge44-leaver8/construction/leaver/reproduce_leaver_chain.py \ + --main MAIN --pr635 SOURCES --leaver-dir CELL --hamming BASE/hamming \ + --id k8 --out CHAIN +python3 -B SOURCES/research/gauge44-leaver8/construction/barch/build_tri.py \ + CHAIN/frames/FULL-WORD.json.gz \ + SOURCES/research/gauge44-slots/construction/slots/RECIPE-SLOTS-k8.json \ + SLOTS/FULL-WORD.json.gz +``` + +The base driver, cell driver, and all 21 k8 chain steps exited zero. +The last chain step checked its exact phases. The seven-slot word then +passed the unchanged PR635 native transport, local emission, local +endpoint audit, and residual-adapter checks. The unchanged PR558 +`phases_full.py` checked all 2,896 exact phase edges. The recipe digest +matched the seven-slot source pin. `BASELINE-REPLAY.json` records every +command and exit code with the role names above. + +The native tools were called through MAIN's retained +`research/complex-k492-owner-repair/vendor/multicold/code/run_portable.py`. +`MULTICOLD_SOURCE` and `GAIN_PR564_SOURCE` both named that `multicold` +directory. `OPENBLAS_NUM_THREADS`, `OMP_NUM_THREADS`, and +`VECLIB_MAXIMUM_THREADS` were set to one. + +| Output | Content SHA256 | +| --- | --- | +| Raw seven-slot word | `c2b294300760e1fd6eeab8c22c4d13e4633dca40e52cac8da0d68163a76e3ca8` | +| Canonical seven-slot word | `4ddb29fb9bc6f27e0c0fbfcf19a2a93a3496ad900d0f6d89059d0305c9576c0c` | +| Exact Clifford recipes | `d0768f2164d5f64a2fdbec422f1cfde4e400818792f1904ca541958377243731` | + +The raw word is the bundled input. A gzip input is bound by its +decompressed content, not its compression stream. This avoids a false +failure from a different Python or zlib version. + +The seven-slot-specific 34 controls and its old owner-map global replay +were not rerun by this lane. The new package's five controls are different +checks of its mathematical claims. The separate owner-packing lane uses +the same completed native baseline for its own full supplier replay. +No new full supplier, outer assembly, or repository-wide cold replay is +claimed by this package. diff --git a/research/k8-frame-antichain/CERTIFICATE.json b/research/k8-frame-antichain/CERTIFICATE.json new file mode 100644 index 0000000000..a3f0624c61 --- /dev/null +++ b/research/k8-frame-antichain/CERTIFICATE.json @@ -0,0 +1,11371 @@ +{ + "status": "PASS_K8_FRAME_ANTICHAIN", + "base_commit": "abdc6a7002abdbcd9e21bfc5e1a795784deacfdf", + "scope": "fixed factory value/frame interface; no kappa claim", + "factory": { + "demand_frame_count": 168, + "demand_value_count": 192, + "frame_ranks": { + "2": 24, + "3": 144 + }, + "source_registers": 112, + "register_lower_bound": 336, + "helper_lower_bound": 224, + "attained_helpers": 224, + "upper_witness": { + "modules": 14, + "registers_per_module": 24, + "source_partition": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57, + 58, + 59, + 60, + 61, + 62, + 63, + 64, + 65, + 66, + 67, + 68, + 69, + 70, + 71, + 72, + 73, + 74, + 75, + 76, + 77, + 78, + 79, + 80, + 81, + 82, + 83, + 84, + 85, + 86, + 87, + 88, + 89, + 90, + 91, + 92, + 93, + 94, + 95, + 96, + 97, + 98, + 99, + 100, + 101, + 102, + 103, + 104, + 105, + 106, + 107, + 108, + 109, + 110, + 111 + ], + "executed_adds": 728 + }, + "witnesses": [ + { + "phase": "A", + "event": 1594, + "register": 18, + "frame": [ + 8, + 6 + ], + "clean_row": [ + [ + 17, + "-1/2" + ], + [ + 18, + "1/2" + ] + ], + "kind": "leaver", + "block": [ + 0, + 1, + 6, + 7 + ] + }, + { + "phase": "A", + "event": 1593, + "register": 17, + "frame": [ + 8, + 6 + ], + "clean_row": [ + [ + 17, + "1" + ], + [ + 18, + "1" + ] + ], + "kind": "leaver", + "block": [ + 0, + 1, + 6, + 7 + ] + }, + { + "phase": "A", + "event": 1280, + "register": 59, + "frame": [ + 32, + 6 + ], + "clean_row": [ + [ + 56, + "-1/2" + ], + [ + 59, + "1/2" + ] + ], + "kind": "leaver", + "block": [ + 0, + 1, + 2, + 3 + ] + }, + { + "phase": "A", + "event": 1279, + "register": 56, + "frame": [ + 32, + 6 + ], + "clean_row": [ + [ + 56, + "1" + ], + [ + 59, + "1" + ] + ], + "kind": "leaver", + "block": [ + 0, + 1, + 2, + 3 + ] + }, + { + "phase": "A", + "event": 3150, + "register": 429, + "frame": [ + 49, + 6 + ], + "clean_row": [ + [ + 85, + "-1/2" + ], + [ + 86, + "1/2" + ] + ], + "kind": "leaver", + "block": [ + 2, + 3, + 6, + 7 + ] + }, + { + "phase": "A", + "event": 3149, + "register": 427, + "frame": [ + 49, + 6 + ], + "clean_row": [ + [ + 85, + "1" + ], + [ + 86, + "1" + ] + ], + "kind": "leaver", + "block": [ + 2, + 3, + 6, + 7 + ] + }, + { + "phase": "A", + "event": 1302, + "register": 237, + "frame": [ + 56, + 6 + ], + "clean_row": [ + [ + 61, + "-1/2" + ], + [ + 62, + "1/2" + ] + ], + "kind": "leaver", + "block": [ + 0, + 1, + 2, + 3 + ] + }, + { + "phase": "A", + "event": 1301, + "register": 235, + "frame": [ + 56, + 6 + ], + "clean_row": [ + [ + 61, + "1" + ], + [ + 62, + "1" + ] + ], + "kind": "leaver", + "block": [ + 0, + 1, + 2, + 3 + ] + }, + { + "phase": "A", + "event": 3128, + "register": 83, + "frame": [ + 73, + 6 + ], + "clean_row": [ + [ + 80, + "-1/2" + ], + [ + 83, + "1/2" + ] + ], + "kind": "leaver", + "block": [ + 2, + 3, + 6, + 7 + ] + }, + { + "phase": "A", + "event": 3127, + "register": 80, + "frame": [ + 73, + 6 + ], + "clean_row": [ + [ + 80, + "1" + ], + [ + 83, + "1" + ] + ], + "kind": "leaver", + "block": [ + 2, + 3, + 6, + 7 + ] + }, + { + "phase": "A", + "event": 1608, + "register": 271, + "frame": [ + 104, + 6 + ], + "clean_row": [ + [ + 20, + "-1/2" + ], + [ + 23, + "1/2" + ] + ], + "kind": "leaver", + "block": [ + 0, + 1, + 6, + 7 + ] + }, + { + "phase": "A", + "event": 1607, + "register": 265, + "frame": [ + 104, + 6 + ], + "clean_row": [ + [ + 20, + "1" + ], + [ + 23, + "1" + ] + ], + "kind": "leaver", + "block": [ + 0, + 1, + 6, + 7 + ] + }, + { + "phase": "A", + "event": 2980, + "register": 90, + "frame": [ + 137, + 6 + ], + "clean_row": [ + [ + 89, + "-1/2" + ], + [ + 90, + "1/2" + ] + ], + "kind": "leaver", + "block": [ + 2, + 3, + 4, + 5 + ] + }, + { + "phase": "A", + "event": 2979, + "register": 89, + "frame": [ + 137, + 6 + ], + "clean_row": [ + [ + 89, + "1" + ], + [ + 90, + "1" + ] + ], + "kind": "leaver", + "block": [ + 2, + 3, + 4, + 5 + ] + }, + { + "phase": "A", + "event": 3304, + "register": 445, + "frame": [ + 161, + 6 + ], + "clean_row": [ + [ + 53, + "-1/2" + ], + [ + 54, + "1/2" + ] + ], + "kind": "leaver", + "block": [ + 4, + 5, + 6, + 7 + ] + }, + { + "phase": "A", + "event": 3303, + "register": 443, + "frame": [ + 161, + 6 + ], + "clean_row": [ + [ + 53, + "1" + ], + [ + 54, + "1" + ] + ], + "kind": "leaver", + "block": [ + 4, + 5, + 6, + 7 + ] + }, + { + "phase": "A", + "event": 1456, + "register": 253, + "frame": [ + 168, + 6 + ], + "clean_row": [ + [ + 29, + "-1/2" + ], + [ + 30, + "1/2" + ] + ], + "kind": "leaver", + "block": [ + 0, + 1, + 4, + 5 + ] + }, + { + "phase": "A", + "event": 1455, + "register": 251, + "frame": [ + 168, + 6 + ], + "clean_row": [ + [ + 29, + "1" + ], + [ + 30, + "1" + ] + ], + "kind": "leaver", + "block": [ + 0, + 1, + 4, + 5 + ] + }, + { + "phase": "A", + "event": 3282, + "register": 51, + "frame": [ + 185, + 6 + ], + "clean_row": [ + [ + 48, + "-1/2" + ], + [ + 51, + "1/2" + ] + ], + "kind": "leaver", + "block": [ + 4, + 5, + 6, + 7 + ] + }, + { + "phase": "A", + "event": 3281, + "register": 48, + "frame": [ + 185, + 6 + ], + "clean_row": [ + [ + 48, + "1" + ], + [ + 51, + "1" + ] + ], + "kind": "leaver", + "block": [ + 4, + 5, + 6, + 7 + ] + }, + { + "phase": "A", + "event": 1434, + "register": 27, + "frame": [ + 208, + 6 + ], + "clean_row": [ + [ + 24, + "-1/2" + ], + [ + 27, + "1/2" + ] + ], + "kind": "leaver", + "block": [ + 0, + 1, + 4, + 5 + ] + }, + { + "phase": "A", + "event": 1433, + "register": 24, + "frame": [ + 208, + 6 + ], + "clean_row": [ + [ + 24, + "1" + ], + [ + 27, + "1" + ] + ], + "kind": "leaver", + "block": [ + 0, + 1, + 4, + 5 + ] + }, + { + "phase": "A", + "event": 2994, + "register": 415, + "frame": [ + 233, + 6 + ], + "clean_row": [ + [ + 92, + "-1/2" + ], + [ + 95, + "1/2" + ] + ], + "kind": "leaver", + "block": [ + 2, + 3, + 4, + 5 + ] + }, + { + "phase": "A", + "event": 2993, + "register": 409, + "frame": [ + 233, + 6 + ], + "clean_row": [ + [ + 92, + "1" + ], + [ + 95, + "1" + ] + ], + "kind": "leaver", + "block": [ + 2, + 3, + 4, + 5 + ] + }, + { + "phase": "B", + "event": 853, + "register": 97, + "frame": [ + 259, + 131, + 24 + ], + "clean_row": [ + [ + 96, + "1" + ], + [ + 97, + "1" + ], + [ + 98, + "1" + ], + [ + 99, + "1" + ] + ], + "kind": "face", + "block": [ + 1, + 3, + 5, + 7 + ] + }, + { + "phase": "A", + "event": 2845, + "register": 390, + "frame": [ + 259, + 131, + 96 + ], + "clean_row": [ + [ + 97, + "1" + ], + [ + 99, + "1" + ], + [ + 101, + "1" + ], + [ + 103, + "1" + ] + ], + "kind": "face", + "block": [ + 1, + 3, + 5, + 7 + ] + }, + { + "phase": "A", + "event": 2849, + "register": 396, + "frame": [ + 259, + 131, + 120 + ], + "clean_row": [ + [ + 97, + "-1/2" + ], + [ + 99, + "-1/2" + ], + [ + 100, + "1/2" + ], + [ + 102, + "1/2" + ] + ], + "kind": "face", + "block": [ + 1, + 3, + 5, + 7 + ] + }, + { + "phase": "A", + "event": 2848, + "register": 102, + "frame": [ + 259, + 155, + 96 + ], + "clean_row": [ + [ + 96, + "-1/2" + ], + [ + 97, + "-1/2" + ], + [ + 102, + "1/2" + ], + [ + 103, + "1/2" + ] + ], + "kind": "face", + "block": [ + 1, + 3, + 5, + 7 + ] + }, + { + "phase": "A", + "event": 2844, + "register": 386, + "frame": [ + 259, + 155, + 120 + ], + "clean_row": [ + [ + 96, + "1" + ], + [ + 97, + "1" + ], + [ + 100, + "1" + ], + [ + 101, + "1" + ] + ], + "kind": "face", + "block": [ + 1, + 3, + 5, + 7 + ] + }, + { + "phase": "B", + "event": 854, + "register": 98, + "frame": [ + 259, + 227, + 24 + ], + "clean_row": [ + [ + 97, + "-1/2" + ], + [ + 98, + "1/2" + ], + [ + 101, + "-1/2" + ], + [ + 102, + "1/2" + ] + ], + "kind": "face", + "block": [ + 1, + 3, + 5, + 7 + ] + }, + { + "phase": "A", + "event": 2974, + "register": 91, + "frame": [ + 265, + 6 + ], + "clean_row": [ + [ + 88, + "-1/2" + ], + [ + 91, + "1/2" + ] + ], + "kind": "leaver", + "block": [ + 2, + 3, + 4, + 5 + ] + }, + { + "phase": "A", + "event": 2973, + "register": 88, + "frame": [ + 265, + 6 + ], + "clean_row": [ + [ + 88, + "1" + ], + [ + 91, + "1" + ] + ], + "kind": "leaver", + "block": [ + 2, + 3, + 4, + 5 + ] + }, + { + "phase": "A", + "event": 2998, + "register": 402, + "frame": [ + 265, + 137, + 96 + ], + "clean_row": [ + [ + 88, + "1" + ], + [ + 89, + "1" + ], + [ + 92, + "1" + ], + [ + 93, + "1" + ] + ], + "kind": "face", + "block": [ + 2, + 3, + 4, + 5 + ] + }, + { + "phase": "A", + "event": 3002, + "register": 94, + "frame": [ + 265, + 137, + 102 + ], + "clean_row": [ + [ + 88, + "-1/2" + ], + [ + 89, + "-1/2" + ], + [ + 94, + "1/2" + ], + [ + 95, + "1/2" + ] + ], + "kind": "face", + "block": [ + 2, + 3, + 4, + 5 + ] + }, + { + "phase": "A", + "event": 3004, + "register": 414, + "frame": [ + 265, + 143, + 96 + ], + "clean_row": [ + [ + 88, + "-1/2" + ], + [ + 90, + "-1/2" + ], + [ + 93, + "1/2" + ], + [ + 95, + "1/2" + ] + ], + "kind": "face", + "block": [ + 2, + 3, + 4, + 5 + ] + }, + { + "phase": "A", + "event": 3000, + "register": 404, + "frame": [ + 265, + 143, + 102 + ], + "clean_row": [ + [ + 88, + "1" + ], + [ + 90, + "1" + ], + [ + 92, + "1" + ], + [ + 94, + "1" + ] + ], + "kind": "face", + "block": [ + 2, + 3, + 4, + 5 + ] + }, + { + "phase": "B", + "event": 779, + "register": 105, + "frame": [ + 266, + 138, + 30 + ], + "clean_row": [ + [ + 104, + "1" + ], + [ + 105, + "1" + ], + [ + 106, + "1" + ], + [ + 107, + "1" + ] + ], + "kind": "face", + "block": [ + 0, + 3, + 5, + 6 + ] + }, + { + "phase": "A", + "event": 2229, + "register": 326, + "frame": [ + 266, + 138, + 96 + ], + "clean_row": [ + [ + 105, + "1" + ], + [ + 107, + "1" + ], + [ + 109, + "1" + ], + [ + 111, + "1" + ] + ], + "kind": "face", + "block": [ + 0, + 3, + 5, + 6 + ] + }, + { + "phase": "A", + "event": 2233, + "register": 332, + "frame": [ + 266, + 138, + 126 + ], + "clean_row": [ + [ + 105, + "-1/2" + ], + [ + 107, + "-1/2" + ], + [ + 108, + "1/2" + ], + [ + 110, + "1/2" + ] + ], + "kind": "face", + "block": [ + 0, + 3, + 5, + 6 + ] + }, + { + "phase": "A", + "event": 2232, + "register": 110, + "frame": [ + 266, + 148, + 96 + ], + "clean_row": [ + [ + 104, + "-1/2" + ], + [ + 105, + "-1/2" + ], + [ + 110, + "1/2" + ], + [ + 111, + "1/2" + ] + ], + "kind": "face", + "block": [ + 0, + 3, + 5, + 6 + ] + }, + { + "phase": "A", + "event": 2228, + "register": 322, + "frame": [ + 266, + 148, + 126 + ], + "clean_row": [ + [ + 104, + "1" + ], + [ + 105, + "1" + ], + [ + 108, + "1" + ], + [ + 109, + "1" + ] + ], + "kind": "face", + "block": [ + 0, + 3, + 5, + 6 + ] + }, + { + "phase": "B", + "event": 780, + "register": 106, + "frame": [ + 266, + 234, + 30 + ], + "clean_row": [ + [ + 105, + "-1/2" + ], + [ + 106, + "1/2" + ], + [ + 109, + "-1/2" + ], + [ + 110, + "1/2" + ] + ], + "kind": "face", + "block": [ + 0, + 3, + 5, + 6 + ] + }, + { + "phase": "A", + "event": 3003, + "register": 412, + "frame": [ + 271, + 137, + 96 + ], + "clean_row": [ + [ + 89, + "-1/2" + ], + [ + 91, + "-1/2" + ], + [ + 92, + "1/2" + ], + [ + 94, + "1/2" + ] + ], + "kind": "face", + "block": [ + 2, + 3, + 4, + 5 + ] + }, + { + "phase": "A", + "event": 2999, + "register": 406, + "frame": [ + 271, + 137, + 102 + ], + "clean_row": [ + [ + 89, + "1" + ], + [ + 91, + "1" + ], + [ + 93, + "1" + ], + [ + 95, + "1" + ] + ], + "kind": "face", + "block": [ + 2, + 3, + 4, + 5 + ] + }, + { + "phase": "A", + "event": 2997, + "register": 407, + "frame": [ + 271, + 143, + 96 + ], + "clean_row": [ + [ + 90, + "1" + ], + [ + 91, + "1" + ], + [ + 94, + "1" + ], + [ + 95, + "1" + ] + ], + "kind": "face", + "block": [ + 2, + 3, + 4, + 5 + ] + }, + { + "phase": "A", + "event": 3001, + "register": 408, + "frame": [ + 271, + 143, + 102 + ], + "clean_row": [ + [ + 90, + "-1/2" + ], + [ + 91, + "-1/2" + ], + [ + 92, + "1/2" + ], + [ + 93, + "1/2" + ] + ], + "kind": "face", + "block": [ + 2, + 3, + 4, + 5 + ] + }, + { + "phase": "A", + "event": 2231, + "register": 328, + "frame": [ + 276, + 138, + 96 + ], + "clean_row": [ + [ + 106, + "-1/2" + ], + [ + 107, + "-1/2" + ], + [ + 108, + "1/2" + ], + [ + 109, + "1/2" + ] + ], + "kind": "face", + "block": [ + 0, + 3, + 5, + 6 + ] + }, + { + "phase": "A", + "event": 2227, + "register": 327, + "frame": [ + 276, + 138, + 126 + ], + "clean_row": [ + [ + 106, + "1" + ], + [ + 107, + "1" + ], + [ + 110, + "1" + ], + [ + 111, + "1" + ] + ], + "kind": "face", + "block": [ + 0, + 3, + 5, + 6 + ] + }, + { + "phase": "A", + "event": 2230, + "register": 324, + "frame": [ + 276, + 148, + 96 + ], + "clean_row": [ + [ + 104, + "1" + ], + [ + 106, + "1" + ], + [ + 108, + "1" + ], + [ + 110, + "1" + ] + ], + "kind": "face", + "block": [ + 0, + 3, + 5, + 6 + ] + }, + { + "phase": "A", + "event": 2234, + "register": 334, + "frame": [ + 276, + 148, + 126 + ], + "clean_row": [ + [ + 104, + "-1/2" + ], + [ + 106, + "-1/2" + ], + [ + 109, + "1/2" + ], + [ + 111, + "1/2" + ] + ], + "kind": "face", + "block": [ + 0, + 3, + 5, + 6 + ] + }, + { + "phase": "A", + "event": 2847, + "register": 392, + "frame": [ + 283, + 131, + 96 + ], + "clean_row": [ + [ + 98, + "-1/2" + ], + [ + 99, + "-1/2" + ], + [ + 100, + "1/2" + ], + [ + 101, + "1/2" + ] + ], + "kind": "face", + "block": [ + 1, + 3, + 5, + 7 + ] + }, + { + "phase": "A", + "event": 2843, + "register": 391, + "frame": [ + 283, + 131, + 120 + ], + "clean_row": [ + [ + 98, + "1" + ], + [ + 99, + "1" + ], + [ + 102, + "1" + ], + [ + 103, + "1" + ] + ], + "kind": "face", + "block": [ + 1, + 3, + 5, + 7 + ] + }, + { + "phase": "A", + "event": 2846, + "register": 388, + "frame": [ + 283, + 155, + 96 + ], + "clean_row": [ + [ + 96, + "1" + ], + [ + 98, + "1" + ], + [ + 100, + "1" + ], + [ + 102, + "1" + ] + ], + "kind": "face", + "block": [ + 1, + 3, + 5, + 7 + ] + }, + { + "phase": "A", + "event": 2850, + "register": 398, + "frame": [ + 283, + 155, + 120 + ], + "clean_row": [ + [ + 96, + "-1/2" + ], + [ + 98, + "-1/2" + ], + [ + 101, + "1/2" + ], + [ + 103, + "1/2" + ] + ], + "kind": "face", + "block": [ + 1, + 3, + 5, + 7 + ] + }, + { + "phase": "A", + "event": 3288, + "register": 50, + "frame": [ + 289, + 6 + ], + "clean_row": [ + [ + 49, + "-1/2" + ], + [ + 50, + "1/2" + ] + ], + "kind": "leaver", + "block": [ + 4, + 5, + 6, + 7 + ] + }, + { + "phase": "A", + "event": 3287, + "register": 49, + "frame": [ + 289, + 6 + ], + "clean_row": [ + [ + 49, + "1" + ], + [ + 50, + "1" + ] + ], + "kind": "leaver", + "block": [ + 4, + 5, + 6, + 7 + ] + }, + { + "phase": "A", + "event": 3306, + "register": 434, + "frame": [ + 289, + 161, + 24 + ], + "clean_row": [ + [ + 48, + "1" + ], + [ + 49, + "1" + ], + [ + 52, + "1" + ], + [ + 53, + "1" + ] + ], + "kind": "face", + "block": [ + 4, + 5, + 6, + 7 + ] + }, + { + "phase": "A", + "event": 3307, + "register": 438, + "frame": [ + 289, + 161, + 30 + ], + "clean_row": [ + [ + 49, + "1" + ], + [ + 51, + "1" + ], + [ + 53, + "1" + ], + [ + 55, + "1" + ] + ], + "kind": "face", + "block": [ + 4, + 5, + 6, + 7 + ] + }, + { + "phase": "A", + "event": 3311, + "register": 444, + "frame": [ + 289, + 167, + 24 + ], + "clean_row": [ + [ + 49, + "-1/2" + ], + [ + 51, + "-1/2" + ], + [ + 52, + "1/2" + ], + [ + 54, + "1/2" + ] + ], + "kind": "face", + "block": [ + 4, + 5, + 6, + 7 + ] + }, + { + "phase": "A", + "event": 3310, + "register": 54, + "frame": [ + 289, + 167, + 30 + ], + "clean_row": [ + [ + 48, + "-1/2" + ], + [ + 49, + "-1/2" + ], + [ + 54, + "1/2" + ], + [ + 55, + "1/2" + ] + ], + "kind": "face", + "block": [ + 4, + 5, + 6, + 7 + ] + }, + { + "phase": "B", + "event": 738, + "register": 299, + "frame": [ + 290, + 162, + 24 + ], + "clean_row": [ + [ + 36, + "1" + ], + [ + 37, + "1" + ], + [ + 38, + "1" + ], + [ + 39, + "1" + ] + ], + "kind": "face", + "block": [ + 0, + 2, + 5, + 7 + ] + }, + { + "phase": "A", + "event": 1921, + "register": 294, + "frame": [ + 290, + 162, + 102 + ], + "clean_row": [ + [ + 33, + "1" + ], + [ + 35, + "1" + ], + [ + 37, + "1" + ], + [ + 39, + "1" + ] + ], + "kind": "face", + "block": [ + 0, + 2, + 5, + 7 + ] + }, + { + "phase": "A", + "event": 1926, + "register": 302, + "frame": [ + 290, + 162, + 126 + ], + "clean_row": [ + [ + 32, + "-1/2" + ], + [ + 34, + "-1/2" + ], + [ + 37, + "1/2" + ], + [ + 39, + "1/2" + ] + ], + "kind": "face", + "block": [ + 0, + 2, + 5, + 7 + ] + }, + { + "phase": "A", + "event": 1923, + "register": 296, + "frame": [ + 290, + 186, + 102 + ], + "clean_row": [ + [ + 34, + "-1/2" + ], + [ + 35, + "-1/2" + ], + [ + 36, + "1/2" + ], + [ + 37, + "1/2" + ] + ], + "kind": "face", + "block": [ + 0, + 2, + 5, + 7 + ] + }, + { + "phase": "A", + "event": 1920, + "register": 290, + "frame": [ + 290, + 186, + 126 + ], + "clean_row": [ + [ + 32, + "1" + ], + [ + 33, + "1" + ], + [ + 36, + "1" + ], + [ + 37, + "1" + ] + ], + "kind": "face", + "block": [ + 0, + 2, + 5, + 7 + ] + }, + { + "phase": "B", + "event": 740, + "register": 34, + "frame": [ + 290, + 196, + 24 + ], + "clean_row": [ + [ + 33, + "-1/2" + ], + [ + 34, + "1/2" + ], + [ + 37, + "-1/2" + ], + [ + 38, + "1/2" + ] + ], + "kind": "face", + "block": [ + 0, + 2, + 5, + 7 + ] + }, + { + "phase": "A", + "event": 3312, + "register": 446, + "frame": [ + 295, + 161, + 24 + ], + "clean_row": [ + [ + 48, + "-1/2" + ], + [ + 50, + "-1/2" + ], + [ + 53, + "1/2" + ], + [ + 55, + "1/2" + ] + ], + "kind": "face", + "block": [ + 4, + 5, + 6, + 7 + ] + }, + { + "phase": "A", + "event": 3309, + "register": 440, + "frame": [ + 295, + 161, + 30 + ], + "clean_row": [ + [ + 50, + "-1/2" + ], + [ + 51, + "-1/2" + ], + [ + 52, + "1/2" + ], + [ + 53, + "1/2" + ] + ], + "kind": "face", + "block": [ + 4, + 5, + 6, + 7 + ] + }, + { + "phase": "A", + "event": 3305, + "register": 439, + "frame": [ + 295, + 167, + 24 + ], + "clean_row": [ + [ + 50, + "1" + ], + [ + 51, + "1" + ], + [ + 54, + "1" + ], + [ + 55, + "1" + ] + ], + "kind": "face", + "block": [ + 4, + 5, + 6, + 7 + ] + }, + { + "phase": "A", + "event": 3308, + "register": 436, + "frame": [ + 295, + 167, + 30 + ], + "clean_row": [ + [ + 48, + "1" + ], + [ + 50, + "1" + ], + [ + 52, + "1" + ], + [ + 54, + "1" + ] + ], + "kind": "face", + "block": [ + 4, + 5, + 6, + 7 + ] + }, + { + "phase": "A", + "event": 1454, + "register": 255, + "frame": [ + 296, + 6 + ], + "clean_row": [ + [ + 28, + "-1/2" + ], + [ + 31, + "1/2" + ] + ], + "kind": "leaver", + "block": [ + 0, + 1, + 4, + 5 + ] + }, + { + "phase": "A", + "event": 1453, + "register": 249, + "frame": [ + 296, + 6 + ], + "clean_row": [ + [ + 28, + "1" + ], + [ + 31, + "1" + ] + ], + "kind": "leaver", + "block": [ + 0, + 1, + 4, + 5 + ] + }, + { + "phase": "A", + "event": 1458, + "register": 242, + "frame": [ + 296, + 168, + 120 + ], + "clean_row": [ + [ + 24, + "1" + ], + [ + 25, + "1" + ], + [ + 28, + "1" + ], + [ + 29, + "1" + ] + ], + "kind": "face", + "block": [ + 0, + 1, + 4, + 5 + ] + }, + { + "phase": "A", + "event": 1461, + "register": 248, + "frame": [ + 296, + 168, + 126 + ], + "clean_row": [ + [ + 26, + "-1/2" + ], + [ + 27, + "-1/2" + ], + [ + 28, + "1/2" + ], + [ + 29, + "1/2" + ] + ], + "kind": "face", + "block": [ + 0, + 1, + 4, + 5 + ] + }, + { + "phase": "A", + "event": 1463, + "register": 252, + "frame": [ + 296, + 174, + 120 + ], + "clean_row": [ + [ + 25, + "-1/2" + ], + [ + 27, + "-1/2" + ], + [ + 28, + "1/2" + ], + [ + 30, + "1/2" + ] + ], + "kind": "face", + "block": [ + 0, + 1, + 4, + 5 + ] + }, + { + "phase": "A", + "event": 1460, + "register": 244, + "frame": [ + 296, + 174, + 126 + ], + "clean_row": [ + [ + 24, + "1" + ], + [ + 26, + "1" + ], + [ + 28, + "1" + ], + [ + 30, + "1" + ] + ], + "kind": "face", + "block": [ + 0, + 1, + 4, + 5 + ] + }, + { + "phase": "B", + "event": 816, + "register": 363, + "frame": [ + 301, + 173, + 30 + ], + "clean_row": [ + [ + 44, + "1" + ], + [ + 45, + "1" + ], + [ + 46, + "1" + ], + [ + 47, + "1" + ] + ], + "kind": "face", + "block": [ + 1, + 2, + 5, + 6 + ] + }, + { + "phase": "A", + "event": 2537, + "register": 358, + "frame": [ + 301, + 173, + 102 + ], + "clean_row": [ + [ + 41, + "1" + ], + [ + 43, + "1" + ], + [ + 45, + "1" + ], + [ + 47, + "1" + ] + ], + "kind": "face", + "block": [ + 1, + 2, + 5, + 6 + ] + }, + { + "phase": "A", + "event": 2542, + "register": 366, + "frame": [ + 301, + 173, + 120 + ], + "clean_row": [ + [ + 40, + "-1/2" + ], + [ + 42, + "-1/2" + ], + [ + 45, + "1/2" + ], + [ + 47, + "1/2" + ] + ], + "kind": "face", + "block": [ + 1, + 2, + 5, + 6 + ] + }, + { + "phase": "A", + "event": 2539, + "register": 360, + "frame": [ + 301, + 179, + 102 + ], + "clean_row": [ + [ + 42, + "-1/2" + ], + [ + 43, + "-1/2" + ], + [ + 44, + "1/2" + ], + [ + 45, + "1/2" + ] + ], + "kind": "face", + "block": [ + 1, + 2, + 5, + 6 + ] + }, + { + "phase": "A", + "event": 2536, + "register": 354, + "frame": [ + 301, + 179, + 120 + ], + "clean_row": [ + [ + 40, + "1" + ], + [ + 41, + "1" + ], + [ + 44, + "1" + ], + [ + 45, + "1" + ] + ], + "kind": "face", + "block": [ + 1, + 2, + 5, + 6 + ] + }, + { + "phase": "B", + "event": 818, + "register": 42, + "frame": [ + 301, + 203, + 30 + ], + "clean_row": [ + [ + 41, + "-1/2" + ], + [ + 42, + "1/2" + ], + [ + 45, + "-1/2" + ], + [ + 46, + "1/2" + ] + ], + "kind": "face", + "block": [ + 1, + 2, + 5, + 6 + ] + }, + { + "phase": "A", + "event": 1464, + "register": 254, + "frame": [ + 302, + 168, + 120 + ], + "clean_row": [ + [ + 24, + "-1/2" + ], + [ + 26, + "-1/2" + ], + [ + 29, + "1/2" + ], + [ + 31, + "1/2" + ] + ], + "kind": "face", + "block": [ + 0, + 1, + 4, + 5 + ] + }, + { + "phase": "A", + "event": 1459, + "register": 246, + "frame": [ + 302, + 168, + 126 + ], + "clean_row": [ + [ + 25, + "1" + ], + [ + 27, + "1" + ], + [ + 29, + "1" + ], + [ + 31, + "1" + ] + ], + "kind": "face", + "block": [ + 0, + 1, + 4, + 5 + ] + }, + { + "phase": "A", + "event": 1457, + "register": 247, + "frame": [ + 302, + 174, + 120 + ], + "clean_row": [ + [ + 26, + "1" + ], + [ + 27, + "1" + ], + [ + 30, + "1" + ], + [ + 31, + "1" + ] + ], + "kind": "face", + "block": [ + 0, + 1, + 4, + 5 + ] + }, + { + "phase": "A", + "event": 1462, + "register": 30, + "frame": [ + 302, + 174, + 126 + ], + "clean_row": [ + [ + 24, + "-1/2" + ], + [ + 25, + "-1/2" + ], + [ + 30, + "1/2" + ], + [ + 31, + "1/2" + ] + ], + "kind": "face", + "block": [ + 0, + 1, + 4, + 5 + ] + }, + { + "phase": "A", + "event": 2540, + "register": 46, + "frame": [ + 307, + 173, + 102 + ], + "clean_row": [ + [ + 40, + "-1/2" + ], + [ + 41, + "-1/2" + ], + [ + 46, + "1/2" + ], + [ + 47, + "1/2" + ] + ], + "kind": "face", + "block": [ + 1, + 2, + 5, + 6 + ] + }, + { + "phase": "A", + "event": 2535, + "register": 359, + "frame": [ + 307, + 173, + 120 + ], + "clean_row": [ + [ + 42, + "1" + ], + [ + 43, + "1" + ], + [ + 46, + "1" + ], + [ + 47, + "1" + ] + ], + "kind": "face", + "block": [ + 1, + 2, + 5, + 6 + ] + }, + { + "phase": "A", + "event": 2538, + "register": 356, + "frame": [ + 307, + 179, + 102 + ], + "clean_row": [ + [ + 40, + "1" + ], + [ + 42, + "1" + ], + [ + 44, + "1" + ], + [ + 46, + "1" + ] + ], + "kind": "face", + "block": [ + 1, + 2, + 5, + 6 + ] + }, + { + "phase": "A", + "event": 2541, + "register": 364, + "frame": [ + 307, + 179, + 120 + ], + "clean_row": [ + [ + 41, + "-1/2" + ], + [ + 43, + "-1/2" + ], + [ + 44, + "1/2" + ], + [ + 46, + "1/2" + ] + ], + "kind": "face", + "block": [ + 1, + 2, + 5, + 6 + ] + }, + { + "phase": "A", + "event": 3302, + "register": 447, + "frame": [ + 313, + 6 + ], + "clean_row": [ + [ + 52, + "-1/2" + ], + [ + 55, + "1/2" + ] + ], + "kind": "leaver", + "block": [ + 4, + 5, + 6, + 7 + ] + }, + { + "phase": "A", + "event": 3301, + "register": 441, + "frame": [ + 313, + 6 + ], + "clean_row": [ + [ + 52, + "1" + ], + [ + 55, + "1" + ] + ], + "kind": "leaver", + "block": [ + 4, + 5, + 6, + 7 + ] + }, + { + "phase": "A", + "event": 1924, + "register": 38, + "frame": [ + 314, + 162, + 102 + ], + "clean_row": [ + [ + 32, + "-1/2" + ], + [ + 33, + "-1/2" + ], + [ + 38, + "1/2" + ], + [ + 39, + "1/2" + ] + ], + "kind": "face", + "block": [ + 0, + 2, + 5, + 7 + ] + }, + { + "phase": "A", + "event": 1919, + "register": 295, + "frame": [ + 314, + 162, + 126 + ], + "clean_row": [ + [ + 34, + "1" + ], + [ + 35, + "1" + ], + [ + 38, + "1" + ], + [ + 39, + "1" + ] + ], + "kind": "face", + "block": [ + 0, + 2, + 5, + 7 + ] + }, + { + "phase": "A", + "event": 1922, + "register": 292, + "frame": [ + 314, + 186, + 102 + ], + "clean_row": [ + [ + 32, + "1" + ], + [ + 34, + "1" + ], + [ + 36, + "1" + ], + [ + 38, + "1" + ] + ], + "kind": "face", + "block": [ + 0, + 2, + 5, + 7 + ] + }, + { + "phase": "A", + "event": 1925, + "register": 300, + "frame": [ + 314, + 186, + 126 + ], + "clean_row": [ + [ + 33, + "-1/2" + ], + [ + 35, + "-1/2" + ], + [ + 36, + "1/2" + ], + [ + 38, + "1/2" + ] + ], + "kind": "face", + "block": [ + 0, + 2, + 5, + 7 + ] + }, + { + "phase": "B", + "event": 741, + "register": 303, + "frame": [ + 324, + 162, + 24 + ], + "clean_row": [ + [ + 32, + "-1/2" + ], + [ + 35, + "1/2" + ], + [ + 36, + "-1/2" + ], + [ + 39, + "1/2" + ] + ], + "kind": "face", + "block": [ + 0, + 2, + 5, + 7 + ] + }, + { + "phase": "B", + "event": 739, + "register": 33, + "frame": [ + 324, + 196, + 24 + ], + "clean_row": [ + [ + 32, + "1" + ], + [ + 33, + "1" + ], + [ + 34, + "1" + ], + [ + 35, + "1" + ] + ], + "kind": "face", + "block": [ + 0, + 2, + 5, + 7 + ] + }, + { + "phase": "B", + "event": 819, + "register": 367, + "frame": [ + 331, + 173, + 30 + ], + "clean_row": [ + [ + 40, + "-1/2" + ], + [ + 43, + "1/2" + ], + [ + 44, + "-1/2" + ], + [ + 47, + "1/2" + ] + ], + "kind": "face", + "block": [ + 1, + 2, + 5, + 6 + ] + }, + { + "phase": "B", + "event": 817, + "register": 41, + "frame": [ + 331, + 203, + 30 + ], + "clean_row": [ + [ + 40, + "1" + ], + [ + 41, + "1" + ], + [ + 42, + "1" + ], + [ + 43, + "1" + ] + ], + "kind": "face", + "block": [ + 1, + 2, + 5, + 6 + ] + }, + { + "phase": "A", + "event": 1440, + "register": 26, + "frame": [ + 336, + 6 + ], + "clean_row": [ + [ + 25, + "-1/2" + ], + [ + 26, + "1/2" + ] + ], + "kind": "leaver", + "block": [ + 0, + 1, + 4, + 5 + ] + }, + { + "phase": "A", + "event": 1439, + "register": 25, + "frame": [ + 336, + 6 + ], + "clean_row": [ + [ + 25, + "1" + ], + [ + 26, + "1" + ] + ], + "kind": "leaver", + "block": [ + 0, + 1, + 4, + 5 + ] + }, + { + "phase": "B", + "event": 855, + "register": 399, + "frame": [ + 355, + 131, + 24 + ], + "clean_row": [ + [ + 96, + "-1/2" + ], + [ + 99, + "1/2" + ], + [ + 100, + "-1/2" + ], + [ + 103, + "1/2" + ] + ], + "kind": "face", + "block": [ + 1, + 3, + 5, + 7 + ] + }, + { + "phase": "B", + "event": 852, + "register": 395, + "frame": [ + 355, + 227, + 24 + ], + "clean_row": [ + [ + 100, + "1" + ], + [ + 101, + "1" + ], + [ + 102, + "1" + ], + [ + 103, + "1" + ] + ], + "kind": "face", + "block": [ + 1, + 3, + 5, + 7 + ] + }, + { + "phase": "A", + "event": 2996, + "register": 413, + "frame": [ + 361, + 6 + ], + "clean_row": [ + [ + 93, + "-1/2" + ], + [ + 94, + "1/2" + ] + ], + "kind": "leaver", + "block": [ + 2, + 3, + 4, + 5 + ] + }, + { + "phase": "A", + "event": 2995, + "register": 411, + "frame": [ + 361, + 6 + ], + "clean_row": [ + [ + 93, + "1" + ], + [ + 94, + "1" + ] + ], + "kind": "leaver", + "block": [ + 2, + 3, + 4, + 5 + ] + }, + { + "phase": "B", + "event": 781, + "register": 335, + "frame": [ + 362, + 138, + 30 + ], + "clean_row": [ + [ + 104, + "-1/2" + ], + [ + 107, + "1/2" + ], + [ + 108, + "-1/2" + ], + [ + 111, + "1/2" + ] + ], + "kind": "face", + "block": [ + 0, + 3, + 5, + 6 + ] + }, + { + "phase": "B", + "event": 778, + "register": 331, + "frame": [ + 362, + 234, + 30 + ], + "clean_row": [ + [ + 108, + "1" + ], + [ + 109, + "1" + ], + [ + 110, + "1" + ], + [ + 111, + "1" + ] + ], + "kind": "face", + "block": [ + 0, + 3, + 5, + 6 + ] + }, + { + "phase": "B", + "event": 720, + "register": 9, + "frame": [ + 388, + 24, + 2 + ], + "clean_row": [ + [ + 8, + "1" + ], + [ + 9, + "1" + ], + [ + 10, + "1" + ], + [ + 11, + "1" + ] + ], + "kind": "face", + "block": [ + 0, + 2, + 4, + 6 + ] + }, + { + "phase": "A", + "event": 1768, + "register": 276, + "frame": [ + 388, + 96, + 2 + ], + "clean_row": [ + [ + 8, + "1" + ], + [ + 10, + "1" + ], + [ + 12, + "1" + ], + [ + 14, + "1" + ] + ], + "kind": "face", + "block": [ + 0, + 2, + 4, + 6 + ] + }, + { + "phase": "A", + "event": 1769, + "register": 280, + "frame": [ + 388, + 96, + 26 + ], + "clean_row": [ + [ + 10, + "-1/2" + ], + [ + 11, + "-1/2" + ], + [ + 12, + "1/2" + ], + [ + 13, + "1/2" + ] + ], + "kind": "face", + "block": [ + 0, + 2, + 4, + 6 + ] + }, + { + "phase": "B", + "event": 721, + "register": 10, + "frame": [ + 388, + 98, + 24 + ], + "clean_row": [ + [ + 9, + "-1/2" + ], + [ + 10, + "1/2" + ], + [ + 13, + "-1/2" + ], + [ + 14, + "1/2" + ] + ], + "kind": "face", + "block": [ + 0, + 2, + 4, + 6 + ] + }, + { + "phase": "A", + "event": 1765, + "register": 279, + "frame": [ + 388, + 98, + 26 + ], + "clean_row": [ + [ + 10, + "1" + ], + [ + 11, + "1" + ], + [ + 14, + "1" + ], + [ + 15, + "1" + ] + ], + "kind": "face", + "block": [ + 0, + 2, + 4, + 6 + ] + }, + { + "phase": "A", + "event": 1772, + "register": 286, + "frame": [ + 388, + 120, + 2 + ], + "clean_row": [ + [ + 8, + "-1/2" + ], + [ + 10, + "-1/2" + ], + [ + 13, + "1/2" + ], + [ + 15, + "1/2" + ] + ], + "kind": "face", + "block": [ + 0, + 2, + 4, + 6 + ] + }, + { + "phase": "B", + "event": 799, + "register": 1, + "frame": [ + 390, + 19, + 13 + ], + "clean_row": [ + [ + 0, + "1" + ], + [ + 1, + "1" + ], + [ + 2, + "1" + ], + [ + 3, + "1" + ] + ], + "kind": "face", + "block": [ + 1, + 2, + 4, + 7 + ] + }, + { + "phase": "B", + "event": 834, + "register": 379, + "frame": [ + 390, + 37, + 24 + ], + "clean_row": [ + [ + 76, + "1" + ], + [ + 77, + "1" + ], + [ + 78, + "1" + ], + [ + 79, + "1" + ] + ], + "kind": "face", + "block": [ + 1, + 3, + 4, + 6 + ] + }, + { + "phase": "B", + "event": 758, + "register": 315, + "frame": [ + 390, + 44, + 30 + ], + "clean_row": [ + [ + 68, + "1" + ], + [ + 69, + "1" + ], + [ + 70, + "1" + ], + [ + 71, + "1" + ] + ], + "kind": "face", + "block": [ + 0, + 3, + 4, + 7 + ] + }, + { + "phase": "B", + "event": 835, + "register": 73, + "frame": [ + 390, + 67, + 24 + ], + "clean_row": [ + [ + 72, + "1" + ], + [ + 73, + "1" + ], + [ + 74, + "1" + ], + [ + 75, + "1" + ] + ], + "kind": "face", + "block": [ + 1, + 3, + 4, + 6 + ] + }, + { + "phase": "A", + "event": 2692, + "register": 372, + "frame": [ + 390, + 67, + 37 + ], + "clean_row": [ + [ + 72, + "1" + ], + [ + 74, + "1" + ], + [ + 76, + "1" + ], + [ + 78, + "1" + ] + ], + "kind": "face", + "block": [ + 1, + 3, + 4, + 6 + ] + }, + { + "phase": "A", + "event": 2696, + "register": 382, + "frame": [ + 390, + 67, + 61 + ], + "clean_row": [ + [ + 72, + "-1/2" + ], + [ + 74, + "-1/2" + ], + [ + 77, + "1/2" + ], + [ + 79, + "1/2" + ] + ], + "kind": "face", + "block": [ + 1, + 3, + 4, + 6 + ] + }, + { + "phase": "B", + "event": 759, + "register": 65, + "frame": [ + 390, + 74, + 30 + ], + "clean_row": [ + [ + 64, + "1" + ], + [ + 65, + "1" + ], + [ + 66, + "1" + ], + [ + 67, + "1" + ] + ], + "kind": "face", + "block": [ + 0, + 3, + 4, + 7 + ] + }, + { + "phase": "A", + "event": 2076, + "register": 308, + "frame": [ + 390, + 74, + 44 + ], + "clean_row": [ + [ + 64, + "1" + ], + [ + 66, + "1" + ], + [ + 68, + "1" + ], + [ + 70, + "1" + ] + ], + "kind": "face", + "block": [ + 0, + 3, + 4, + 7 + ] + }, + { + "phase": "A", + "event": 2080, + "register": 318, + "frame": [ + 390, + 74, + 50 + ], + "clean_row": [ + [ + 64, + "-1/2" + ], + [ + 66, + "-1/2" + ], + [ + 69, + "1/2" + ], + [ + 71, + "1/2" + ] + ], + "kind": "face", + "block": [ + 0, + 3, + 4, + 7 + ] + }, + { + "phase": "A", + "event": 2079, + "register": 316, + "frame": [ + 390, + 84, + 44 + ], + "clean_row": [ + [ + 65, + "-1/2" + ], + [ + 67, + "-1/2" + ], + [ + 68, + "1/2" + ], + [ + 70, + "1/2" + ] + ], + "kind": "face", + "block": [ + 0, + 3, + 4, + 7 + ] + }, + { + "phase": "A", + "event": 2075, + "register": 310, + "frame": [ + 390, + 84, + 50 + ], + "clean_row": [ + [ + 65, + "1" + ], + [ + 67, + "1" + ], + [ + 69, + "1" + ], + [ + 71, + "1" + ] + ], + "kind": "face", + "block": [ + 0, + 3, + 4, + 7 + ] + }, + { + "phase": "A", + "event": 2695, + "register": 380, + "frame": [ + 390, + 91, + 37 + ], + "clean_row": [ + [ + 73, + "-1/2" + ], + [ + 75, + "-1/2" + ], + [ + 76, + "1/2" + ], + [ + 78, + "1/2" + ] + ], + "kind": "face", + "block": [ + 1, + 3, + 4, + 6 + ] + }, + { + "phase": "A", + "event": 2691, + "register": 374, + "frame": [ + 390, + 91, + 61 + ], + "clean_row": [ + [ + 73, + "1" + ], + [ + 75, + "1" + ], + [ + 77, + "1" + ], + [ + 79, + "1" + ] + ], + "kind": "face", + "block": [ + 1, + 3, + 4, + 6 + ] + }, + { + "phase": "A", + "event": 2384, + "register": 340, + "frame": [ + 390, + 96, + 13 + ], + "clean_row": [ + [ + 0, + "1" + ], + [ + 2, + "1" + ], + [ + 4, + "1" + ], + [ + 6, + "1" + ] + ], + "kind": "face", + "block": [ + 1, + 2, + 4, + 7 + ] + }, + { + "phase": "A", + "event": 2383, + "register": 342, + "frame": [ + 390, + 96, + 19 + ], + "clean_row": [ + [ + 1, + "1" + ], + [ + 3, + "1" + ], + [ + 5, + "1" + ], + [ + 7, + "1" + ] + ], + "kind": "face", + "block": [ + 1, + 2, + 4, + 7 + ] + }, + { + "phase": "A", + "event": 1767, + "register": 278, + "frame": [ + 390, + 96, + 26 + ], + "clean_row": [ + [ + 9, + "1" + ], + [ + 11, + "1" + ], + [ + 13, + "1" + ], + [ + 15, + "1" + ] + ], + "kind": "face", + "block": [ + 0, + 2, + 4, + 6 + ] + }, + { + "phase": "B", + "event": 719, + "register": 283, + "frame": [ + 390, + 98, + 24 + ], + "clean_row": [ + [ + 12, + "1" + ], + [ + 13, + "1" + ], + [ + 14, + "1" + ], + [ + 15, + "1" + ] + ], + "kind": "face", + "block": [ + 0, + 2, + 4, + 6 + ] + }, + { + "phase": "A", + "event": 1771, + "register": 284, + "frame": [ + 390, + 98, + 26 + ], + "clean_row": [ + [ + 9, + "-1/2" + ], + [ + 11, + "-1/2" + ], + [ + 12, + "1/2" + ], + [ + 14, + "1/2" + ] + ], + "kind": "face", + "block": [ + 0, + 2, + 4, + 6 + ] + }, + { + "phase": "A", + "event": 2387, + "register": 348, + "frame": [ + 390, + 109, + 19 + ], + "clean_row": [ + [ + 1, + "-1/2" + ], + [ + 3, + "-1/2" + ], + [ + 4, + "1/2" + ], + [ + 6, + "1/2" + ] + ], + "kind": "face", + "block": [ + 1, + 2, + 4, + 7 + ] + }, + { + "phase": "B", + "event": 798, + "register": 347, + "frame": [ + 390, + 109, + 30 + ], + "clean_row": [ + [ + 4, + "1" + ], + [ + 5, + "1" + ], + [ + 6, + "1" + ], + [ + 7, + "1" + ] + ], + "kind": "face", + "block": [ + 1, + 2, + 4, + 7 + ] + }, + { + "phase": "A", + "event": 2388, + "register": 350, + "frame": [ + 390, + 115, + 13 + ], + "clean_row": [ + [ + 0, + "-1/2" + ], + [ + 2, + "-1/2" + ], + [ + 5, + "1/2" + ], + [ + 7, + "1/2" + ] + ], + "kind": "face", + "block": [ + 1, + 2, + 4, + 7 + ] + }, + { + "phase": "A", + "event": 2385, + "register": 344, + "frame": [ + 395, + 96, + 19 + ], + "clean_row": [ + [ + 2, + "-1/2" + ], + [ + 3, + "-1/2" + ], + [ + 4, + "1/2" + ], + [ + 5, + "1/2" + ] + ], + "kind": "face", + "block": [ + 1, + 2, + 4, + 7 + ] + }, + { + "phase": "A", + "event": 2381, + "register": 343, + "frame": [ + 395, + 109, + 19 + ], + "clean_row": [ + [ + 2, + "1" + ], + [ + 3, + "1" + ], + [ + 6, + "1" + ], + [ + 7, + "1" + ] + ], + "kind": "face", + "block": [ + 1, + 2, + 4, + 7 + ] + }, + { + "phase": "B", + "event": 800, + "register": 2, + "frame": [ + 395, + 109, + 30 + ], + "clean_row": [ + [ + 1, + "-1/2" + ], + [ + 2, + "1/2" + ], + [ + 5, + "-1/2" + ], + [ + 6, + "1/2" + ] + ], + "kind": "face", + "block": [ + 1, + 2, + 4, + 7 + ] + }, + { + "phase": "A", + "event": 1588, + "register": 19, + "frame": [ + 400, + 6 + ], + "clean_row": [ + [ + 16, + "-1/2" + ], + [ + 19, + "1/2" + ] + ], + "kind": "leaver", + "block": [ + 0, + 1, + 6, + 7 + ] + }, + { + "phase": "A", + "event": 1587, + "register": 16, + "frame": [ + 400, + 6 + ], + "clean_row": [ + [ + 16, + "1" + ], + [ + 19, + "1" + ] + ], + "kind": "leaver", + "block": [ + 0, + 1, + 6, + 7 + ] + }, + { + "phase": "A", + "event": 1612, + "register": 258, + "frame": [ + 400, + 96, + 8 + ], + "clean_row": [ + [ + 16, + "1" + ], + [ + 17, + "1" + ], + [ + 20, + "1" + ], + [ + 21, + "1" + ] + ], + "kind": "face", + "block": [ + 0, + 1, + 6, + 7 + ] + }, + { + "phase": "A", + "event": 1618, + "register": 270, + "frame": [ + 400, + 96, + 14 + ], + "clean_row": [ + [ + 16, + "-1/2" + ], + [ + 18, + "-1/2" + ], + [ + 21, + "1/2" + ], + [ + 23, + "1/2" + ] + ], + "kind": "face", + "block": [ + 0, + 1, + 6, + 7 + ] + }, + { + "phase": "A", + "event": 1616, + "register": 22, + "frame": [ + 400, + 102, + 8 + ], + "clean_row": [ + [ + 16, + "-1/2" + ], + [ + 17, + "-1/2" + ], + [ + 22, + "1/2" + ], + [ + 23, + "1/2" + ] + ], + "kind": "face", + "block": [ + 0, + 1, + 6, + 7 + ] + }, + { + "phase": "A", + "event": 1614, + "register": 260, + "frame": [ + 400, + 102, + 14 + ], + "clean_row": [ + [ + 16, + "1" + ], + [ + 18, + "1" + ], + [ + 20, + "1" + ], + [ + 22, + "1" + ] + ], + "kind": "face", + "block": [ + 0, + 1, + 6, + 7 + ] + }, + { + "phase": "A", + "event": 2386, + "register": 6, + "frame": [ + 405, + 96, + 13 + ], + "clean_row": [ + [ + 0, + "-1/2" + ], + [ + 1, + "-1/2" + ], + [ + 6, + "1/2" + ], + [ + 7, + "1/2" + ] + ], + "kind": "face", + "block": [ + 1, + 2, + 4, + 7 + ] + }, + { + "phase": "A", + "event": 2382, + "register": 338, + "frame": [ + 405, + 115, + 13 + ], + "clean_row": [ + [ + 0, + "1" + ], + [ + 1, + "1" + ], + [ + 4, + "1" + ], + [ + 5, + "1" + ] + ], + "kind": "face", + "block": [ + 1, + 2, + 4, + 7 + ] + }, + { + "phase": "A", + "event": 1617, + "register": 268, + "frame": [ + 406, + 96, + 8 + ], + "clean_row": [ + [ + 17, + "-1/2" + ], + [ + 19, + "-1/2" + ], + [ + 20, + "1/2" + ], + [ + 22, + "1/2" + ] + ], + "kind": "face", + "block": [ + 0, + 1, + 6, + 7 + ] + }, + { + "phase": "A", + "event": 1611, + "register": 263, + "frame": [ + 406, + 96, + 14 + ], + "clean_row": [ + [ + 18, + "1" + ], + [ + 19, + "1" + ], + [ + 22, + "1" + ], + [ + 23, + "1" + ] + ], + "kind": "face", + "block": [ + 0, + 1, + 6, + 7 + ] + }, + { + "phase": "A", + "event": 1613, + "register": 262, + "frame": [ + 406, + 102, + 8 + ], + "clean_row": [ + [ + 17, + "1" + ], + [ + 19, + "1" + ], + [ + 21, + "1" + ], + [ + 23, + "1" + ] + ], + "kind": "face", + "block": [ + 0, + 1, + 6, + 7 + ] + }, + { + "phase": "A", + "event": 1615, + "register": 264, + "frame": [ + 406, + 102, + 14 + ], + "clean_row": [ + [ + 18, + "-1/2" + ], + [ + 19, + "-1/2" + ], + [ + 20, + "1/2" + ], + [ + 21, + "1/2" + ] + ], + "kind": "face", + "block": [ + 0, + 1, + 6, + 7 + ] + }, + { + "phase": "A", + "event": 3152, + "register": 418, + "frame": [ + 408, + 73, + 49 + ], + "clean_row": [ + [ + 80, + "1" + ], + [ + 81, + "1" + ], + [ + 84, + "1" + ], + [ + 85, + "1" + ] + ], + "kind": "face", + "block": [ + 2, + 3, + 6, + 7 + ] + }, + { + "phase": "A", + "event": 3156, + "register": 86, + "frame": [ + 408, + 73, + 55 + ], + "clean_row": [ + [ + 80, + "-1/2" + ], + [ + 81, + "-1/2" + ], + [ + 86, + "1/2" + ], + [ + 87, + "1/2" + ] + ], + "kind": "face", + "block": [ + 2, + 3, + 6, + 7 + ] + }, + { + "phase": "A", + "event": 2077, + "register": 312, + "frame": [ + 408, + 74, + 44 + ], + "clean_row": [ + [ + 66, + "-1/2" + ], + [ + 67, + "-1/2" + ], + [ + 68, + "1/2" + ], + [ + 69, + "1/2" + ] + ], + "kind": "face", + "block": [ + 0, + 3, + 4, + 7 + ] + }, + { + "phase": "A", + "event": 2073, + "register": 311, + "frame": [ + 408, + 74, + 50 + ], + "clean_row": [ + [ + 66, + "1" + ], + [ + 67, + "1" + ], + [ + 70, + "1" + ], + [ + 71, + "1" + ] + ], + "kind": "face", + "block": [ + 0, + 3, + 4, + 7 + ] + }, + { + "phase": "A", + "event": 3155, + "register": 424, + "frame": [ + 408, + 79, + 49 + ], + "clean_row": [ + [ + 82, + "-1/2" + ], + [ + 83, + "-1/2" + ], + [ + 84, + "1/2" + ], + [ + 85, + "1/2" + ] + ], + "kind": "face", + "block": [ + 2, + 3, + 6, + 7 + ] + }, + { + "phase": "A", + "event": 3151, + "register": 423, + "frame": [ + 408, + 79, + 55 + ], + "clean_row": [ + [ + 82, + "1" + ], + [ + 83, + "1" + ], + [ + 86, + "1" + ], + [ + 87, + "1" + ] + ], + "kind": "face", + "block": [ + 2, + 3, + 6, + 7 + ] + }, + { + "phase": "A", + "event": 2074, + "register": 306, + "frame": [ + 408, + 84, + 44 + ], + "clean_row": [ + [ + 64, + "1" + ], + [ + 65, + "1" + ], + [ + 68, + "1" + ], + [ + 69, + "1" + ] + ], + "kind": "face", + "block": [ + 0, + 3, + 4, + 7 + ] + }, + { + "phase": "A", + "event": 2078, + "register": 70, + "frame": [ + 408, + 84, + 50 + ], + "clean_row": [ + [ + 64, + "-1/2" + ], + [ + 65, + "-1/2" + ], + [ + 70, + "1/2" + ], + [ + 71, + "1/2" + ] + ], + "kind": "face", + "block": [ + 0, + 3, + 4, + 7 + ] + }, + { + "phase": "A", + "event": 1770, + "register": 14, + "frame": [ + 412, + 96, + 2 + ], + "clean_row": [ + [ + 8, + "-1/2" + ], + [ + 9, + "-1/2" + ], + [ + 14, + "1/2" + ], + [ + 15, + "1/2" + ] + ], + "kind": "face", + "block": [ + 0, + 2, + 4, + 6 + ] + }, + { + "phase": "A", + "event": 1766, + "register": 274, + "frame": [ + 412, + 120, + 2 + ], + "clean_row": [ + [ + 8, + "1" + ], + [ + 9, + "1" + ], + [ + 12, + "1" + ], + [ + 13, + "1" + ] + ], + "kind": "face", + "block": [ + 0, + 2, + 4, + 6 + ] + }, + { + "phase": "A", + "event": 2693, + "register": 376, + "frame": [ + 414, + 67, + 37 + ], + "clean_row": [ + [ + 74, + "-1/2" + ], + [ + 75, + "-1/2" + ], + [ + 76, + "1/2" + ], + [ + 77, + "1/2" + ] + ], + "kind": "face", + "block": [ + 1, + 3, + 4, + 6 + ] + }, + { + "phase": "A", + "event": 2689, + "register": 375, + "frame": [ + 414, + 67, + 61 + ], + "clean_row": [ + [ + 74, + "1" + ], + [ + 75, + "1" + ], + [ + 78, + "1" + ], + [ + 79, + "1" + ] + ], + "kind": "face", + "block": [ + 1, + 3, + 4, + 6 + ] + }, + { + "phase": "A", + "event": 3158, + "register": 430, + "frame": [ + 414, + 73, + 49 + ], + "clean_row": [ + [ + 80, + "-1/2" + ], + [ + 82, + "-1/2" + ], + [ + 85, + "1/2" + ], + [ + 87, + "1/2" + ] + ], + "kind": "face", + "block": [ + 2, + 3, + 6, + 7 + ] + }, + { + "phase": "A", + "event": 3154, + "register": 420, + "frame": [ + 414, + 73, + 55 + ], + "clean_row": [ + [ + 80, + "1" + ], + [ + 82, + "1" + ], + [ + 84, + "1" + ], + [ + 86, + "1" + ] + ], + "kind": "face", + "block": [ + 2, + 3, + 6, + 7 + ] + }, + { + "phase": "A", + "event": 3153, + "register": 422, + "frame": [ + 414, + 79, + 49 + ], + "clean_row": [ + [ + 81, + "1" + ], + [ + 83, + "1" + ], + [ + 85, + "1" + ], + [ + 87, + "1" + ] + ], + "kind": "face", + "block": [ + 2, + 3, + 6, + 7 + ] + }, + { + "phase": "A", + "event": 3157, + "register": 428, + "frame": [ + 414, + 79, + 55 + ], + "clean_row": [ + [ + 81, + "-1/2" + ], + [ + 83, + "-1/2" + ], + [ + 84, + "1/2" + ], + [ + 86, + "1/2" + ] + ], + "kind": "face", + "block": [ + 2, + 3, + 6, + 7 + ] + }, + { + "phase": "A", + "event": 2690, + "register": 370, + "frame": [ + 414, + 91, + 37 + ], + "clean_row": [ + [ + 72, + "1" + ], + [ + 73, + "1" + ], + [ + 76, + "1" + ], + [ + 77, + "1" + ] + ], + "kind": "face", + "block": [ + 1, + 3, + 4, + 6 + ] + }, + { + "phase": "A", + "event": 2694, + "register": 78, + "frame": [ + 414, + 91, + 61 + ], + "clean_row": [ + [ + 72, + "-1/2" + ], + [ + 73, + "-1/2" + ], + [ + 78, + "1/2" + ], + [ + 79, + "1/2" + ] + ], + "kind": "face", + "block": [ + 1, + 3, + 4, + 6 + ] + }, + { + "phase": "B", + "event": 836, + "register": 74, + "frame": [ + 419, + 67, + 24 + ], + "clean_row": [ + [ + 73, + "-1/2" + ], + [ + 74, + "1/2" + ], + [ + 77, + "-1/2" + ], + [ + 78, + "1/2" + ] + ], + "kind": "face", + "block": [ + 1, + 3, + 4, + 6 + ] + }, + { + "phase": "A", + "event": 3148, + "register": 431, + "frame": [ + 425, + 6 + ], + "clean_row": [ + [ + 84, + "-1/2" + ], + [ + 87, + "1/2" + ] + ], + "kind": "leaver", + "block": [ + 2, + 3, + 6, + 7 + ] + }, + { + "phase": "A", + "event": 3147, + "register": 425, + "frame": [ + 425, + 6 + ], + "clean_row": [ + [ + 84, + "1" + ], + [ + 87, + "1" + ] + ], + "kind": "leaver", + "block": [ + 2, + 3, + 6, + 7 + ] + }, + { + "phase": "B", + "event": 760, + "register": 66, + "frame": [ + 426, + 74, + 30 + ], + "clean_row": [ + [ + 65, + "-1/2" + ], + [ + 66, + "1/2" + ], + [ + 69, + "-1/2" + ], + [ + 70, + "1/2" + ] + ], + "kind": "face", + "block": [ + 0, + 3, + 4, + 7 + ] + }, + { + "phase": "A", + "event": 1286, + "register": 58, + "frame": [ + 448, + 6 + ], + "clean_row": [ + [ + 57, + "-1/2" + ], + [ + 58, + "1/2" + ] + ], + "kind": "leaver", + "block": [ + 0, + 1, + 2, + 3 + ] + }, + { + "phase": "A", + "event": 1285, + "register": 57, + "frame": [ + 448, + 6 + ], + "clean_row": [ + [ + 57, + "1" + ], + [ + 58, + "1" + ] + ], + "kind": "leaver", + "block": [ + 0, + 1, + 2, + 3 + ] + }, + { + "phase": "A", + "event": 1304, + "register": 226, + "frame": [ + 448, + 32, + 24 + ], + "clean_row": [ + [ + 56, + "1" + ], + [ + 57, + "1" + ], + [ + 60, + "1" + ], + [ + 61, + "1" + ] + ], + "kind": "face", + "block": [ + 0, + 1, + 2, + 3 + ] + }, + { + "phase": "A", + "event": 1308, + "register": 62, + "frame": [ + 448, + 32, + 30 + ], + "clean_row": [ + [ + 56, + "-1/2" + ], + [ + 57, + "-1/2" + ], + [ + 62, + "1/2" + ], + [ + 63, + "1/2" + ] + ], + "kind": "face", + "block": [ + 0, + 1, + 2, + 3 + ] + }, + { + "phase": "A", + "event": 1309, + "register": 236, + "frame": [ + 448, + 38, + 24 + ], + "clean_row": [ + [ + 57, + "-1/2" + ], + [ + 59, + "-1/2" + ], + [ + 60, + "1/2" + ], + [ + 62, + "1/2" + ] + ], + "kind": "face", + "block": [ + 0, + 1, + 2, + 3 + ] + }, + { + "phase": "A", + "event": 1305, + "register": 230, + "frame": [ + 448, + 38, + 30 + ], + "clean_row": [ + [ + 57, + "1" + ], + [ + 59, + "1" + ], + [ + 61, + "1" + ], + [ + 63, + "1" + ] + ], + "kind": "face", + "block": [ + 0, + 1, + 2, + 3 + ] + }, + { + "phase": "B", + "event": 837, + "register": 383, + "frame": [ + 453, + 37, + 24 + ], + "clean_row": [ + [ + 72, + "-1/2" + ], + [ + 75, + "1/2" + ], + [ + 76, + "-1/2" + ], + [ + 79, + "1/2" + ] + ], + "kind": "face", + "block": [ + 1, + 3, + 4, + 6 + ] + }, + { + "phase": "A", + "event": 1310, + "register": 238, + "frame": [ + 454, + 32, + 24 + ], + "clean_row": [ + [ + 56, + "-1/2" + ], + [ + 58, + "-1/2" + ], + [ + 61, + "1/2" + ], + [ + 63, + "1/2" + ] + ], + "kind": "face", + "block": [ + 0, + 1, + 2, + 3 + ] + }, + { + "phase": "A", + "event": 1306, + "register": 228, + "frame": [ + 454, + 32, + 30 + ], + "clean_row": [ + [ + 56, + "1" + ], + [ + 58, + "1" + ], + [ + 60, + "1" + ], + [ + 62, + "1" + ] + ], + "kind": "face", + "block": [ + 0, + 1, + 2, + 3 + ] + }, + { + "phase": "A", + "event": 1303, + "register": 231, + "frame": [ + 454, + 38, + 24 + ], + "clean_row": [ + [ + 58, + "1" + ], + [ + 59, + "1" + ], + [ + 62, + "1" + ], + [ + 63, + "1" + ] + ], + "kind": "face", + "block": [ + 0, + 1, + 2, + 3 + ] + }, + { + "phase": "A", + "event": 1307, + "register": 232, + "frame": [ + 454, + 38, + 30 + ], + "clean_row": [ + [ + 58, + "-1/2" + ], + [ + 59, + "-1/2" + ], + [ + 60, + "1/2" + ], + [ + 61, + "1/2" + ] + ], + "kind": "face", + "block": [ + 0, + 1, + 2, + 3 + ] + }, + { + "phase": "B", + "event": 761, + "register": 319, + "frame": [ + 460, + 44, + 30 + ], + "clean_row": [ + [ + 64, + "-1/2" + ], + [ + 67, + "1/2" + ], + [ + 68, + "-1/2" + ], + [ + 71, + "1/2" + ] + ], + "kind": "face", + "block": [ + 0, + 3, + 4, + 7 + ] + }, + { + "phase": "A", + "event": 3134, + "register": 82, + "frame": [ + 465, + 6 + ], + "clean_row": [ + [ + 81, + "-1/2" + ], + [ + 82, + "1/2" + ] + ], + "kind": "leaver", + "block": [ + 2, + 3, + 6, + 7 + ] + }, + { + "phase": "A", + "event": 3133, + "register": 81, + "frame": [ + 465, + 6 + ], + "clean_row": [ + [ + 81, + "1" + ], + [ + 82, + "1" + ] + ], + "kind": "leaver", + "block": [ + 2, + 3, + 6, + 7 + ] + }, + { + "phase": "A", + "event": 1300, + "register": 239, + "frame": [ + 472, + 6 + ], + "clean_row": [ + [ + 60, + "-1/2" + ], + [ + 63, + "1/2" + ] + ], + "kind": "leaver", + "block": [ + 0, + 1, + 2, + 3 + ] + }, + { + "phase": "A", + "event": 1299, + "register": 233, + "frame": [ + 472, + 6 + ], + "clean_row": [ + [ + 60, + "1" + ], + [ + 63, + "1" + ] + ], + "kind": "leaver", + "block": [ + 0, + 1, + 2, + 3 + ] + }, + { + "phase": "B", + "event": 722, + "register": 287, + "frame": [ + 484, + 24, + 2 + ], + "clean_row": [ + [ + 8, + "-1/2" + ], + [ + 11, + "1/2" + ], + [ + 12, + "-1/2" + ], + [ + 15, + "1/2" + ] + ], + "kind": "face", + "block": [ + 0, + 2, + 4, + 6 + ] + }, + { + "phase": "B", + "event": 801, + "register": 351, + "frame": [ + 486, + 19, + 13 + ], + "clean_row": [ + [ + 0, + "-1/2" + ], + [ + 3, + "1/2" + ], + [ + 4, + "-1/2" + ], + [ + 7, + "1/2" + ] + ], + "kind": "face", + "block": [ + 1, + 2, + 4, + 7 + ] + }, + { + "phase": "A", + "event": 1610, + "register": 269, + "frame": [ + 496, + 6 + ], + "clean_row": [ + [ + 21, + "-1/2" + ], + [ + 22, + "1/2" + ] + ], + "kind": "leaver", + "block": [ + 0, + 1, + 6, + 7 + ] + }, + { + "phase": "A", + "event": 1609, + "register": 267, + "frame": [ + 496, + 6 + ], + "clean_row": [ + [ + 21, + "1" + ], + [ + 22, + "1" + ] + ], + "kind": "leaver", + "block": [ + 0, + 1, + 6, + 7 + ] + } + ] + }, + "whole_block_target_exclusion": [ + { + "frame": [ + 259, + 131, + 96, + 24 + ], + "odd_vectors_by_target": [ + 24, + 24, + 24, + 24, + 24, + 24, + 24, + 24, + 131, + 131, + 131, + 131, + 131, + 131, + 131, + 131, + 24, + 24, + 24, + 24, + 24, + 24, + 24, + 24, + 24, + 24, + 24, + 24, + 24, + 24, + 24, + 24, + 96, + 96, + 96, + 96, + 96, + 96, + 96, + 96, + 24, + 24, + 24, + 24, + 24, + 24, + 24, + 24, + 96, + 96, + 96, + 96, + 96, + 96, + 96, + 96, + 96, + 96, + 96, + 96, + 96, + 96, + 96, + 96, + 24, + 24, + 24, + 24, + 24, + 24, + 24, + 24, + 96, + 96, + 96, + 96, + 96, + 96, + 96, + 96, + 24, + 24, + 24, + 24, + 24, + 24, + 24, + 24, + 24, + 24, + 24, + 24, + 24, + 24, + 24, + 24, + 131, + 259, + 259, + 131, + 259, + 131, + 131, + 259, + 24, + 24, + 24, + 24, + 24, + 24, + 24, + 24 + ] + }, + { + "frame": [ + 266, + 138, + 96, + 30 + ], + "odd_vectors_by_target": [ + 138, + 138, + 138, + 138, + 138, + 138, + 138, + 138, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 96, + 96, + 96, + 96, + 96, + 96, + 96, + 96, + 96, + 96, + 96, + 96, + 96, + 96, + 96, + 96, + 96, + 96, + 96, + 96, + 96, + 96, + 96, + 96, + 96, + 96, + 96, + 96, + 96, + 96, + 96, + 96, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 138, + 266, + 266, + 138, + 266, + 138, + 138, + 266 + ] + }, + { + "frame": [ + 290, + 162, + 102, + 24 + ], + "odd_vectors_by_target": [ + 24, + 24, + 24, + 24, + 24, + 24, + 24, + 24, + 102, + 102, + 102, + 102, + 102, + 102, + 102, + 102, + 24, + 24, + 24, + 24, + 24, + 24, + 24, + 24, + 24, + 24, + 24, + 24, + 24, + 24, + 24, + 24, + 290, + 162, + 162, + 290, + 162, + 290, + 290, + 162, + 24, + 24, + 24, + 24, + 24, + 24, + 24, + 24, + 102, + 102, + 102, + 102, + 102, + 102, + 102, + 102, + 102, + 102, + 102, + 102, + 102, + 102, + 102, + 102, + 24, + 24, + 24, + 24, + 24, + 24, + 24, + 24, + 162, + 162, + 162, + 162, + 162, + 162, + 162, + 162, + 24, + 24, + 24, + 24, + 24, + 24, + 24, + 24, + 24, + 24, + 24, + 24, + 24, + 24, + 24, + 24, + 102, + 102, + 102, + 102, + 102, + 102, + 102, + 102, + 24, + 24, + 24, + 24, + 24, + 24, + 24, + 24 + ] + }, + { + "frame": [ + 301, + 173, + 102, + 30 + ], + "odd_vectors_by_target": [ + 102, + 102, + 102, + 102, + 102, + 102, + 102, + 102, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 301, + 173, + 173, + 301, + 173, + 301, + 301, + 173, + 102, + 102, + 102, + 102, + 102, + 102, + 102, + 102, + 102, + 102, + 102, + 102, + 102, + 102, + 102, + 102, + 173, + 173, + 173, + 173, + 173, + 173, + 173, + 173, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 102, + 102, + 102, + 102, + 102, + 102, + 102, + 102 + ] + }, + { + "frame": [ + 388, + 96, + 24, + 2 + ], + "odd_vectors_by_target": [ + 24, + 24, + 2, + 2, + 2, + 2, + 24, + 24, + 2, + 388, + 388, + 2, + 388, + 2, + 2, + 388, + 24, + 24, + 2, + 2, + 24, + 24, + 2, + 2, + 24, + 24, + 2, + 2, + 24, + 24, + 2, + 2, + 96, + 96, + 96, + 96, + 2, + 2, + 2, + 2, + 24, + 2, + 24, + 2, + 2, + 24, + 2, + 24, + 96, + 96, + 2, + 2, + 96, + 96, + 2, + 2, + 96, + 96, + 2, + 2, + 96, + 96, + 2, + 2, + 24, + 24, + 2, + 2, + 24, + 24, + 2, + 2, + 96, + 2, + 2, + 96, + 96, + 2, + 2, + 96, + 24, + 24, + 2, + 2, + 24, + 24, + 2, + 2, + 24, + 24, + 2, + 2, + 24, + 24, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 24, + 2, + 24, + 2, + 24, + 2, + 24, + 2 + ] + }, + { + "frame": [ + 390, + 67, + 37, + 24 + ], + "odd_vectors_by_target": [ + 24, + 24, + 24, + 24, + 24, + 24, + 24, + 24, + 67, + 37, + 37, + 67, + 67, + 37, + 37, + 67, + 24, + 24, + 24, + 24, + 24, + 24, + 24, + 24, + 24, + 24, + 24, + 24, + 24, + 24, + 24, + 24, + 37, + 37, + 37, + 37, + 37, + 37, + 37, + 37, + 24, + 24, + 24, + 24, + 24, + 24, + 24, + 24, + 67, + 67, + 37, + 37, + 67, + 67, + 37, + 37, + 37, + 67, + 37, + 67, + 67, + 37, + 67, + 37, + 24, + 24, + 24, + 24, + 24, + 24, + 24, + 24, + 390, + 37, + 37, + 390, + 37, + 390, + 390, + 37, + 24, + 24, + 24, + 24, + 24, + 24, + 24, + 24, + 24, + 24, + 24, + 24, + 24, + 24, + 24, + 24, + 37, + 37, + 37, + 37, + 67, + 67, + 67, + 67, + 24, + 24, + 24, + 24, + 24, + 24, + 24, + 24 + ] + }, + { + "frame": [ + 390, + 74, + 44, + 30 + ], + "odd_vectors_by_target": [ + 74, + 44, + 44, + 74, + 74, + 44, + 44, + 74, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 44, + 44, + 44, + 44, + 44, + 44, + 44, + 44, + 74, + 44, + 74, + 44, + 74, + 44, + 74, + 44, + 44, + 74, + 44, + 74, + 44, + 74, + 44, + 74, + 390, + 44, + 44, + 390, + 44, + 390, + 390, + 44, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 30, + 44, + 44, + 44, + 44, + 74, + 74, + 74, + 74 + ] + }, + { + "frame": [ + 390, + 96, + 19, + 13 + ], + "odd_vectors_by_target": [ + 13, + 390, + 390, + 13, + 390, + 13, + 13, + 390, + 19, + 19, + 13, + 13, + 13, + 13, + 19, + 19, + 19, + 13, + 19, + 13, + 13, + 19, + 13, + 19, + 19, + 19, + 13, + 13, + 13, + 13, + 19, + 19, + 19, + 13, + 19, + 13, + 13, + 19, + 13, + 19, + 96, + 96, + 96, + 96, + 13, + 13, + 13, + 13, + 96, + 13, + 96, + 13, + 96, + 13, + 96, + 13, + 96, + 96, + 13, + 13, + 13, + 13, + 96, + 96, + 96, + 13, + 13, + 96, + 96, + 13, + 13, + 96, + 19, + 19, + 13, + 13, + 19, + 19, + 13, + 13, + 19, + 13, + 19, + 13, + 19, + 13, + 19, + 13, + 19, + 19, + 13, + 13, + 19, + 19, + 13, + 13, + 19, + 13, + 19, + 13, + 19, + 13, + 19, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13 + ] + } + ], + "center_target_exclusion": [ + { + "frame": [ + 256, + 128, + 64, + 32, + 16, + 8, + 4, + 2 + ], + "odd_vectors_by_target": [ + 4, + 4, + 2, + 2, + 2, + 2, + 4, + 4, + 2, + 4, + 4, + 2, + 4, + 2, + 2, + 4, + 16, + 8, + 2, + 2, + 8, + 16, + 2, + 2, + 16, + 16, + 2, + 2, + 8, + 8, + 2, + 2, + 4, + 4, + 4, + 4, + 2, + 2, + 2, + 2, + 4, + 2, + 4, + 2, + 2, + 4, + 2, + 4, + 8, + 32, + 2, + 2, + 8, + 32, + 2, + 2, + 32, + 64, + 2, + 2, + 8, + 8, + 2, + 2, + 4, + 4, + 2, + 2, + 4, + 4, + 2, + 2, + 4, + 2, + 2, + 4, + 4, + 2, + 2, + 4, + 8, + 16, + 2, + 2, + 8, + 16, + 2, + 2, + 8, + 8, + 2, + 2, + 8, + 8, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 4, + 2, + 4, + 2, + 4, + 2, + 4, + 2 + ] + }, + { + "frame": [ + 256, + 128, + 64, + 32, + 16, + 8, + 5, + 3 + ], + "odd_vectors_by_target": [ + 3, + 3, + 5, + 5, + 5, + 5, + 3, + 3, + 3, + 5, + 5, + 3, + 5, + 3, + 3, + 5, + 16, + 8, + 3, + 3, + 8, + 16, + 3, + 3, + 16, + 16, + 3, + 3, + 8, + 8, + 3, + 3, + 5, + 5, + 5, + 5, + 3, + 3, + 3, + 3, + 3, + 5, + 3, + 5, + 5, + 3, + 5, + 3, + 3, + 3, + 32, + 8, + 3, + 3, + 32, + 8, + 32, + 64, + 3, + 3, + 8, + 8, + 3, + 3, + 5, + 5, + 3, + 3, + 5, + 5, + 3, + 3, + 3, + 5, + 5, + 3, + 3, + 5, + 5, + 3, + 3, + 3, + 16, + 8, + 3, + 3, + 16, + 8, + 3, + 3, + 8, + 8, + 3, + 3, + 8, + 8, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 3, + 5, + 3, + 5, + 3, + 5, + 3 + ] + }, + { + "frame": [ + 256, + 128, + 64, + 32, + 17, + 9, + 4, + 2 + ], + "odd_vectors_by_target": [ + 4, + 4, + 2, + 2, + 2, + 2, + 4, + 4, + 2, + 4, + 4, + 2, + 4, + 2, + 2, + 4, + 17, + 9, + 2, + 2, + 9, + 17, + 2, + 2, + 17, + 17, + 2, + 2, + 9, + 9, + 2, + 2, + 4, + 4, + 4, + 4, + 2, + 2, + 2, + 2, + 4, + 2, + 4, + 2, + 2, + 4, + 2, + 4, + 32, + 9, + 2, + 2, + 32, + 9, + 2, + 2, + 32, + 64, + 2, + 2, + 9, + 9, + 2, + 2, + 4, + 4, + 2, + 2, + 4, + 4, + 2, + 2, + 4, + 2, + 2, + 4, + 4, + 2, + 2, + 4, + 17, + 9, + 2, + 2, + 17, + 9, + 2, + 2, + 17, + 17, + 2, + 2, + 17, + 17, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 4, + 2, + 4, + 2, + 4, + 2, + 4, + 2 + ] + }, + { + "frame": [ + 256, + 128, + 64, + 32, + 17, + 9, + 5, + 3 + ], + "odd_vectors_by_target": [ + 3, + 3, + 5, + 5, + 5, + 5, + 3, + 3, + 3, + 5, + 5, + 3, + 5, + 3, + 3, + 5, + 17, + 9, + 3, + 3, + 9, + 17, + 3, + 3, + 17, + 17, + 3, + 3, + 9, + 9, + 3, + 3, + 5, + 5, + 5, + 5, + 3, + 3, + 3, + 3, + 3, + 5, + 3, + 5, + 5, + 3, + 5, + 3, + 3, + 3, + 9, + 32, + 3, + 3, + 9, + 32, + 32, + 64, + 3, + 3, + 9, + 9, + 3, + 3, + 5, + 5, + 3, + 3, + 5, + 5, + 3, + 3, + 3, + 5, + 5, + 3, + 3, + 5, + 5, + 3, + 3, + 3, + 9, + 17, + 3, + 3, + 9, + 17, + 3, + 3, + 17, + 17, + 3, + 3, + 17, + 17, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 3, + 5, + 3, + 5, + 3, + 5, + 3 + ] + }, + { + "frame": [ + 256, + 128, + 65, + 33, + 17, + 9, + 4, + 2 + ], + "odd_vectors_by_target": [ + 4, + 4, + 2, + 2, + 2, + 2, + 4, + 4, + 2, + 4, + 4, + 2, + 4, + 2, + 2, + 4, + 17, + 9, + 2, + 2, + 9, + 17, + 2, + 2, + 17, + 17, + 2, + 2, + 9, + 9, + 2, + 2, + 4, + 4, + 4, + 4, + 2, + 2, + 2, + 2, + 4, + 2, + 4, + 2, + 2, + 4, + 2, + 4, + 65, + 9, + 2, + 2, + 65, + 9, + 2, + 2, + 33, + 65, + 2, + 2, + 9, + 9, + 2, + 2, + 4, + 4, + 2, + 2, + 4, + 4, + 2, + 2, + 4, + 2, + 2, + 4, + 4, + 2, + 2, + 4, + 17, + 9, + 2, + 2, + 17, + 9, + 2, + 2, + 17, + 17, + 2, + 2, + 17, + 17, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 4, + 2, + 4, + 2, + 4, + 2, + 4, + 2 + ] + }, + { + "frame": [ + 256, + 128, + 65, + 33, + 17, + 9, + 5, + 3 + ], + "odd_vectors_by_target": [ + 3, + 3, + 5, + 5, + 5, + 5, + 3, + 3, + 3, + 5, + 5, + 3, + 5, + 3, + 3, + 5, + 17, + 9, + 3, + 3, + 9, + 17, + 3, + 3, + 17, + 17, + 3, + 3, + 9, + 9, + 3, + 3, + 5, + 5, + 5, + 5, + 3, + 3, + 3, + 3, + 3, + 5, + 3, + 5, + 5, + 3, + 5, + 3, + 3, + 3, + 9, + 65, + 3, + 3, + 9, + 65, + 33, + 65, + 3, + 3, + 9, + 9, + 3, + 3, + 5, + 5, + 3, + 3, + 5, + 5, + 3, + 3, + 3, + 5, + 5, + 3, + 3, + 5, + 5, + 3, + 3, + 3, + 9, + 17, + 3, + 3, + 9, + 17, + 3, + 3, + 17, + 17, + 3, + 3, + 17, + 17, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 3, + 5, + 3, + 5, + 3, + 5, + 3 + ] + }, + { + "frame": [ + 256, + 128, + 65, + 33, + 16, + 8, + 4, + 2 + ], + "odd_vectors_by_target": [ + 4, + 4, + 2, + 2, + 2, + 2, + 4, + 4, + 2, + 4, + 4, + 2, + 4, + 2, + 2, + 4, + 16, + 8, + 2, + 2, + 8, + 16, + 2, + 2, + 16, + 16, + 2, + 2, + 8, + 8, + 2, + 2, + 4, + 4, + 4, + 4, + 2, + 2, + 2, + 2, + 4, + 2, + 4, + 2, + 2, + 4, + 2, + 4, + 8, + 65, + 2, + 2, + 8, + 65, + 2, + 2, + 33, + 65, + 2, + 2, + 8, + 8, + 2, + 2, + 4, + 4, + 2, + 2, + 4, + 4, + 2, + 2, + 4, + 2, + 2, + 4, + 4, + 2, + 2, + 4, + 8, + 16, + 2, + 2, + 8, + 16, + 2, + 2, + 8, + 8, + 2, + 2, + 8, + 8, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 4, + 2, + 4, + 2, + 4, + 2, + 4, + 2 + ] + }, + { + "frame": [ + 256, + 128, + 65, + 33, + 16, + 8, + 5, + 3 + ], + "odd_vectors_by_target": [ + 3, + 3, + 5, + 5, + 5, + 5, + 3, + 3, + 3, + 5, + 5, + 3, + 5, + 3, + 3, + 5, + 16, + 8, + 3, + 3, + 8, + 16, + 3, + 3, + 16, + 16, + 3, + 3, + 8, + 8, + 3, + 3, + 5, + 5, + 5, + 5, + 3, + 3, + 3, + 3, + 3, + 5, + 3, + 5, + 5, + 3, + 5, + 3, + 3, + 3, + 65, + 8, + 3, + 3, + 65, + 8, + 33, + 65, + 3, + 3, + 8, + 8, + 3, + 3, + 5, + 5, + 3, + 3, + 5, + 5, + 3, + 3, + 3, + 5, + 5, + 3, + 3, + 5, + 5, + 3, + 3, + 3, + 16, + 8, + 3, + 3, + 16, + 8, + 3, + 3, + 8, + 8, + 3, + 3, + 8, + 8, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 3, + 5, + 3, + 5, + 3, + 5, + 3 + ] + } + ], + "early_scalar_restoration": [ + { + "frame": [ + 259, + 131, + 96, + 24 + ], + "helpers": [ + 385, + 387, + 389, + 394 + ], + "tail_indices": [ + 77, + 78, + 79, + 80, + 81, + 82 + ], + "arbitrary_columns": 704 + }, + { + "frame": [ + 266, + 138, + 96, + 30 + ], + "helpers": [ + 321, + 323, + 325, + 330 + ], + "tail_indices": [ + 53, + 54, + 55, + 56, + 57, + 58 + ], + "arbitrary_columns": 704 + }, + { + "frame": [ + 290, + 162, + 102, + 24 + ], + "helpers": [ + 289, + 291, + 293, + 298 + ], + "tail_indices": [ + 41, + 42, + 43, + 44, + 45, + 46 + ], + "arbitrary_columns": 704 + }, + { + "frame": [ + 301, + 173, + 102, + 30 + ], + "helpers": [ + 353, + 355, + 357, + 362 + ], + "tail_indices": [ + 65, + 66, + 67, + 68, + 69, + 70 + ], + "arbitrary_columns": 704 + }, + { + "frame": [ + 388, + 96, + 24, + 2 + ], + "helpers": [ + 273, + 275, + 277, + 282 + ], + "tail_indices": [ + 35, + 36, + 37, + 38, + 39, + 40 + ], + "arbitrary_columns": 704 + }, + { + "frame": [ + 390, + 67, + 37, + 24 + ], + "helpers": [ + 369, + 371, + 373, + 378 + ], + "tail_indices": [ + 71, + 72, + 73, + 74, + 75, + 76 + ], + "arbitrary_columns": 704 + }, + { + "frame": [ + 390, + 74, + 44, + 30 + ], + "helpers": [ + 305, + 307, + 309, + 314 + ], + "tail_indices": [ + 47, + 48, + 49, + 50, + 51, + 52 + ], + "arbitrary_columns": 704 + }, + { + "frame": [ + 390, + 96, + 19, + 13 + ], + "helpers": [ + 337, + 339, + 341, + 346 + ], + "tail_indices": [ + 59, + 60, + 61, + 62, + 63, + 64 + ], + "arbitrary_columns": 704 + } + ], + "split_carriers": [ + { + "block": [ + 0, + 2, + 4, + 6 + ], + "sources": [ + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15 + ], + "target_masks": [ + { + "mask": 0, + "targets": [ + 96, + 97, + 98, + 99, + 100, + 101, + 102, + 103 + ] + }, + { + "mask": 15, + "targets": [ + 32, + 33, + 34, + 35, + 56, + 57, + 60, + 61 + ] + }, + { + "mask": 51, + "targets": [ + 24, + 25, + 28, + 29, + 64, + 65, + 68, + 69 + ] + }, + { + "mask": 60, + "targets": [ + 2, + 3, + 4, + 5, + 90, + 91, + 94, + 95 + ] + }, + { + "mask": 85, + "targets": [ + 16, + 17, + 20, + 21, + 104, + 106, + 108, + 110 + ] + }, + { + "mask": 90, + "targets": [ + 41, + 43, + 44, + 46, + 82, + 83, + 86, + 87 + ] + }, + { + "mask": 102, + "targets": [ + 50, + 51, + 54, + 55, + 73, + 74, + 77, + 78 + ] + }, + { + "mask": 105, + "targets": [ + 9, + 10, + 12, + 15 + ] + }, + { + "mask": 150, + "targets": [ + 8, + 11, + 13, + 14 + ] + }, + { + "mask": 153, + "targets": [ + 48, + 49, + 52, + 53, + 72, + 75, + 76, + 79 + ] + }, + { + "mask": 165, + "targets": [ + 40, + 42, + 45, + 47, + 80, + 81, + 84, + 85 + ] + }, + { + "mask": 170, + "targets": [ + 18, + 19, + 22, + 23, + 105, + 107, + 109, + 111 + ] + }, + { + "mask": 195, + "targets": [ + 0, + 1, + 6, + 7, + 88, + 89, + 92, + 93 + ] + }, + { + "mask": 204, + "targets": [ + 26, + 27, + 30, + 31, + 66, + 67, + 70, + 71 + ] + }, + { + "mask": 240, + "targets": [ + 36, + 37, + 38, + 39, + 58, + 59, + 62, + 63 + ] + } + ], + "two_cap_partitions": [ + { + "masks": [ + 15, + 240 + ], + "ranks": [ + 3, + 3 + ], + "target_pairs": 64 + }, + { + "masks": [ + 51, + 204 + ], + "ranks": [ + 3, + 3 + ], + "target_pairs": 64 + }, + { + "masks": [ + 60, + 195 + ], + "ranks": [ + 3, + 3 + ], + "target_pairs": 64 + }, + { + "masks": [ + 85, + 170 + ], + "ranks": [ + 3, + 3 + ], + "target_pairs": 64 + }, + { + "masks": [ + 90, + 165 + ], + "ranks": [ + 3, + 3 + ], + "target_pairs": 64 + }, + { + "masks": [ + 102, + 153 + ], + "ranks": [ + 3, + 3 + ], + "target_pairs": 64 + }, + { + "masks": [ + 105, + 150 + ], + "ranks": [ + 4, + 4 + ], + "target_pairs": 16 + } + ], + "four_cap_escape": { + "targets": [ + 32, + 36, + 48, + 50 + ], + "rows": [ + [ + 2, + 2, + 2, + 2, + 0, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 0, + 2, + 2, + 2, + 2 + ], + [ + 2, + 0, + 0, + -2, + 2, + 0, + 0, + -2 + ], + [ + 0, + 2, + -2, + 0, + 0, + 2, + -2, + 0 + ] + ], + "rational_rank": 4, + "frame_ranks": [ + 3, + 3, + 3, + 3 + ] + } + }, + { + "block": [ + 0, + 2, + 5, + 7 + ], + "sources": [ + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39 + ], + "target_masks": [ + { + "mask": 0, + "targets": [ + 72, + 73, + 74, + 75, + 76, + 77, + 78, + 79 + ] + }, + { + "mask": 15, + "targets": [ + 8, + 9, + 10, + 11, + 56, + 57, + 60, + 61 + ] + }, + { + "mask": 51, + "targets": [ + 24, + 26, + 28, + 30, + 104, + 105, + 108, + 109 + ] + }, + { + "mask": 60, + "targets": [ + 42, + 43, + 44, + 45, + 89, + 91, + 93, + 95 + ] + }, + { + "mask": 85, + "targets": [ + 16, + 18, + 20, + 22, + 64, + 66, + 68, + 70 + ] + }, + { + "mask": 90, + "targets": [ + 1, + 3, + 4, + 6, + 81, + 83, + 85, + 87 + ] + }, + { + "mask": 102, + "targets": [ + 49, + 51, + 52, + 54, + 97, + 98, + 101, + 102 + ] + }, + { + "mask": 105, + "targets": [ + 33, + 34, + 36, + 39 + ] + }, + { + "mask": 150, + "targets": [ + 32, + 35, + 37, + 38 + ] + }, + { + "mask": 153, + "targets": [ + 48, + 50, + 53, + 55, + 96, + 99, + 100, + 103 + ] + }, + { + "mask": 165, + "targets": [ + 0, + 2, + 5, + 7, + 80, + 82, + 84, + 86 + ] + }, + { + "mask": 170, + "targets": [ + 17, + 19, + 21, + 23, + 65, + 67, + 69, + 71 + ] + }, + { + "mask": 195, + "targets": [ + 40, + 41, + 46, + 47, + 88, + 90, + 92, + 94 + ] + }, + { + "mask": 204, + "targets": [ + 25, + 27, + 29, + 31, + 106, + 107, + 110, + 111 + ] + }, + { + "mask": 240, + "targets": [ + 12, + 13, + 14, + 15, + 58, + 59, + 62, + 63 + ] + } + ], + "two_cap_partitions": [ + { + "masks": [ + 15, + 240 + ], + "ranks": [ + 3, + 3 + ], + "target_pairs": 64 + }, + { + "masks": [ + 51, + 204 + ], + "ranks": [ + 3, + 3 + ], + "target_pairs": 64 + }, + { + "masks": [ + 60, + 195 + ], + "ranks": [ + 3, + 3 + ], + "target_pairs": 64 + }, + { + "masks": [ + 85, + 170 + ], + "ranks": [ + 3, + 3 + ], + "target_pairs": 64 + }, + { + "masks": [ + 90, + 165 + ], + "ranks": [ + 3, + 3 + ], + "target_pairs": 64 + }, + { + "masks": [ + 102, + 153 + ], + "ranks": [ + 3, + 3 + ], + "target_pairs": 64 + }, + { + "masks": [ + 105, + 150 + ], + "ranks": [ + 4, + 4 + ], + "target_pairs": 16 + } + ], + "four_cap_escape": { + "targets": [ + 8, + 12, + 48, + 49 + ], + "rows": [ + [ + 2, + 2, + 2, + 2, + 0, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 0, + 2, + 2, + 2, + 2 + ], + [ + 2, + 0, + 0, + -2, + 2, + 0, + 0, + -2 + ], + [ + 0, + 2, + -2, + 0, + 0, + 2, + -2, + 0 + ] + ], + "rational_rank": 4, + "frame_ranks": [ + 3, + 3, + 3, + 3 + ] + } + }, + { + "block": [ + 0, + 3, + 4, + 7 + ], + "sources": [ + 64, + 65, + 66, + 67, + 68, + 69, + 70, + 71 + ], + "target_masks": [ + { + "mask": 0, + "targets": [ + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47 + ] + }, + { + "mask": 15, + "targets": [ + 56, + 58, + 60, + 62, + 104, + 105, + 106, + 107 + ] + }, + { + "mask": 51, + "targets": [ + 8, + 9, + 12, + 13, + 24, + 25, + 28, + 29 + ] + }, + { + "mask": 60, + "targets": [ + 74, + 75, + 76, + 77, + 90, + 91, + 92, + 93 + ] + }, + { + "mask": 85, + "targets": [ + 16, + 18, + 20, + 22, + 32, + 34, + 36, + 38 + ] + }, + { + "mask": 90, + "targets": [ + 81, + 83, + 84, + 86, + 97, + 99, + 100, + 102 + ] + }, + { + "mask": 102, + "targets": [ + 1, + 2, + 5, + 6, + 49, + 51, + 53, + 55 + ] + }, + { + "mask": 105, + "targets": [ + 65, + 66, + 68, + 71 + ] + }, + { + "mask": 150, + "targets": [ + 64, + 67, + 69, + 70 + ] + }, + { + "mask": 153, + "targets": [ + 0, + 3, + 4, + 7, + 48, + 50, + 52, + 54 + ] + }, + { + "mask": 165, + "targets": [ + 80, + 82, + 85, + 87, + 96, + 98, + 101, + 103 + ] + }, + { + "mask": 170, + "targets": [ + 17, + 19, + 21, + 23, + 33, + 35, + 37, + 39 + ] + }, + { + "mask": 195, + "targets": [ + 72, + 73, + 78, + 79, + 88, + 89, + 94, + 95 + ] + }, + { + "mask": 204, + "targets": [ + 10, + 11, + 14, + 15, + 26, + 27, + 30, + 31 + ] + }, + { + "mask": 240, + "targets": [ + 57, + 59, + 61, + 63, + 108, + 109, + 110, + 111 + ] + } + ], + "two_cap_partitions": [ + { + "masks": [ + 15, + 240 + ], + "ranks": [ + 3, + 3 + ], + "target_pairs": 64 + }, + { + "masks": [ + 51, + 204 + ], + "ranks": [ + 3, + 3 + ], + "target_pairs": 64 + }, + { + "masks": [ + 60, + 195 + ], + "ranks": [ + 3, + 3 + ], + "target_pairs": 64 + }, + { + "masks": [ + 85, + 170 + ], + "ranks": [ + 3, + 3 + ], + "target_pairs": 64 + }, + { + "masks": [ + 90, + 165 + ], + "ranks": [ + 3, + 3 + ], + "target_pairs": 64 + }, + { + "masks": [ + 102, + 153 + ], + "ranks": [ + 3, + 3 + ], + "target_pairs": 64 + }, + { + "masks": [ + 105, + 150 + ], + "ranks": [ + 4, + 4 + ], + "target_pairs": 16 + } + ], + "four_cap_escape": { + "targets": [ + 56, + 57, + 0, + 1 + ], + "rows": [ + [ + 2, + 2, + 2, + 2, + 0, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 0, + 2, + 2, + 2, + 2 + ], + [ + 2, + 0, + 0, + -2, + 2, + 0, + 0, + -2 + ], + [ + 0, + 2, + -2, + 0, + 0, + 2, + -2, + 0 + ] + ], + "rational_rank": 4, + "frame_ranks": [ + 3, + 3, + 3, + 3 + ] + } + }, + { + "block": [ + 0, + 3, + 5, + 6 + ], + "sources": [ + 104, + 105, + 106, + 107, + 108, + 109, + 110, + 111 + ], + "target_masks": [ + { + "mask": 0, + "targets": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7 + ] + }, + { + "mask": 15, + "targets": [ + 56, + 58, + 60, + 62, + 64, + 65, + 66, + 67 + ] + }, + { + "mask": 51, + "targets": [ + 24, + 26, + 28, + 30, + 32, + 33, + 36, + 37 + ] + }, + { + "mask": 60, + "targets": [ + 89, + 91, + 92, + 94, + 98, + 99, + 100, + 101 + ] + }, + { + "mask": 85, + "targets": [ + 8, + 10, + 12, + 14, + 16, + 17, + 20, + 21 + ] + }, + { + "mask": 90, + "targets": [ + 73, + 75, + 76, + 78, + 82, + 83, + 84, + 85 + ] + }, + { + "mask": 102, + "targets": [ + 41, + 42, + 45, + 46, + 50, + 51, + 52, + 53 + ] + }, + { + "mask": 105, + "targets": [ + 105, + 106, + 108, + 111 + ] + }, + { + "mask": 150, + "targets": [ + 104, + 107, + 109, + 110 + ] + }, + { + "mask": 153, + "targets": [ + 40, + 43, + 44, + 47, + 48, + 49, + 54, + 55 + ] + }, + { + "mask": 165, + "targets": [ + 72, + 74, + 77, + 79, + 80, + 81, + 86, + 87 + ] + }, + { + "mask": 170, + "targets": [ + 9, + 11, + 13, + 15, + 18, + 19, + 22, + 23 + ] + }, + { + "mask": 195, + "targets": [ + 88, + 90, + 93, + 95, + 96, + 97, + 102, + 103 + ] + }, + { + "mask": 204, + "targets": [ + 25, + 27, + 29, + 31, + 34, + 35, + 38, + 39 + ] + }, + { + "mask": 240, + "targets": [ + 57, + 59, + 61, + 63, + 68, + 69, + 70, + 71 + ] + } + ], + "two_cap_partitions": [ + { + "masks": [ + 15, + 240 + ], + "ranks": [ + 3, + 3 + ], + "target_pairs": 64 + }, + { + "masks": [ + 51, + 204 + ], + "ranks": [ + 3, + 3 + ], + "target_pairs": 64 + }, + { + "masks": [ + 60, + 195 + ], + "ranks": [ + 3, + 3 + ], + "target_pairs": 64 + }, + { + "masks": [ + 85, + 170 + ], + "ranks": [ + 3, + 3 + ], + "target_pairs": 64 + }, + { + "masks": [ + 90, + 165 + ], + "ranks": [ + 3, + 3 + ], + "target_pairs": 64 + }, + { + "masks": [ + 102, + 153 + ], + "ranks": [ + 3, + 3 + ], + "target_pairs": 64 + }, + { + "masks": [ + 105, + 150 + ], + "ranks": [ + 4, + 4 + ], + "target_pairs": 16 + } + ], + "four_cap_escape": { + "targets": [ + 56, + 57, + 40, + 41 + ], + "rows": [ + [ + 2, + 2, + 2, + 2, + 0, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 0, + 2, + 2, + 2, + 2 + ], + [ + 2, + 0, + 0, + -2, + 2, + 0, + 0, + -2 + ], + [ + 0, + 2, + -2, + 0, + 0, + 2, + -2, + 0 + ] + ], + "rational_rank": 4, + "frame_ranks": [ + 3, + 3, + 3, + 3 + ] + } + }, + { + "block": [ + 1, + 2, + 4, + 7 + ], + "sources": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7 + ], + "target_masks": [ + { + "mask": 0, + "targets": [ + 104, + 105, + 106, + 107, + 108, + 109, + 110, + 111 + ] + }, + { + "mask": 15, + "targets": [ + 40, + 41, + 42, + 43, + 56, + 57, + 62, + 63 + ] + }, + { + "mask": 51, + "targets": [ + 24, + 25, + 30, + 31, + 72, + 73, + 76, + 77 + ] + }, + { + "mask": 60, + "targets": [ + 10, + 11, + 12, + 13, + 90, + 91, + 94, + 95 + ] + }, + { + "mask": 85, + "targets": [ + 16, + 18, + 21, + 23, + 96, + 98, + 100, + 102 + ] + }, + { + "mask": 90, + "targets": [ + 33, + 35, + 36, + 38, + 81, + 83, + 85, + 87 + ] + }, + { + "mask": 102, + "targets": [ + 49, + 51, + 53, + 55, + 65, + 66, + 69, + 70 + ] + }, + { + "mask": 105, + "targets": [ + 1, + 2, + 4, + 7 + ] + }, + { + "mask": 150, + "targets": [ + 0, + 3, + 5, + 6 + ] + }, + { + "mask": 153, + "targets": [ + 48, + 50, + 52, + 54, + 64, + 67, + 68, + 71 + ] + }, + { + "mask": 165, + "targets": [ + 32, + 34, + 37, + 39, + 80, + 82, + 84, + 86 + ] + }, + { + "mask": 170, + "targets": [ + 17, + 19, + 20, + 22, + 97, + 99, + 101, + 103 + ] + }, + { + "mask": 195, + "targets": [ + 8, + 9, + 14, + 15, + 88, + 89, + 92, + 93 + ] + }, + { + "mask": 204, + "targets": [ + 26, + 27, + 28, + 29, + 74, + 75, + 78, + 79 + ] + }, + { + "mask": 240, + "targets": [ + 44, + 45, + 46, + 47, + 58, + 59, + 60, + 61 + ] + } + ], + "two_cap_partitions": [ + { + "masks": [ + 15, + 240 + ], + "ranks": [ + 3, + 3 + ], + "target_pairs": 64 + }, + { + "masks": [ + 51, + 204 + ], + "ranks": [ + 3, + 3 + ], + "target_pairs": 64 + }, + { + "masks": [ + 60, + 195 + ], + "ranks": [ + 3, + 3 + ], + "target_pairs": 64 + }, + { + "masks": [ + 85, + 170 + ], + "ranks": [ + 3, + 3 + ], + "target_pairs": 64 + }, + { + "masks": [ + 90, + 165 + ], + "ranks": [ + 3, + 3 + ], + "target_pairs": 64 + }, + { + "masks": [ + 102, + 153 + ], + "ranks": [ + 3, + 3 + ], + "target_pairs": 64 + }, + { + "masks": [ + 105, + 150 + ], + "ranks": [ + 4, + 4 + ], + "target_pairs": 16 + } + ], + "four_cap_escape": { + "targets": [ + 40, + 44, + 48, + 49 + ], + "rows": [ + [ + 2, + 2, + 2, + 2, + 0, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 0, + 2, + 2, + 2, + 2 + ], + [ + 2, + 0, + 0, + -2, + 2, + 0, + 0, + -2 + ], + [ + 0, + 2, + -2, + 0, + 0, + 2, + -2, + 0 + ] + ], + "rational_rank": 4, + "frame_ranks": [ + 3, + 3, + 3, + 3 + ] + } + }, + { + "block": [ + 1, + 2, + 5, + 6 + ], + "sources": [ + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47 + ], + "target_masks": [ + { + "mask": 0, + "targets": [ + 64, + 65, + 66, + 67, + 68, + 69, + 70, + 71 + ] + }, + { + "mask": 15, + "targets": [ + 0, + 1, + 2, + 3, + 56, + 57, + 62, + 63 + ] + }, + { + "mask": 51, + "targets": [ + 24, + 26, + 29, + 31, + 96, + 97, + 100, + 101 + ] + }, + { + "mask": 60, + "targets": [ + 34, + 35, + 36, + 37, + 89, + 91, + 93, + 95 + ] + }, + { + "mask": 85, + "targets": [ + 16, + 17, + 22, + 23, + 72, + 74, + 76, + 78 + ] + }, + { + "mask": 90, + "targets": [ + 9, + 11, + 12, + 14, + 82, + 83, + 86, + 87 + ] + }, + { + "mask": 102, + "targets": [ + 50, + 51, + 52, + 53, + 105, + 106, + 109, + 110 + ] + }, + { + "mask": 105, + "targets": [ + 41, + 42, + 44, + 47 + ] + }, + { + "mask": 150, + "targets": [ + 40, + 43, + 45, + 46 + ] + }, + { + "mask": 153, + "targets": [ + 48, + 49, + 54, + 55, + 104, + 107, + 108, + 111 + ] + }, + { + "mask": 165, + "targets": [ + 8, + 10, + 13, + 15, + 80, + 81, + 84, + 85 + ] + }, + { + "mask": 170, + "targets": [ + 18, + 19, + 20, + 21, + 73, + 75, + 77, + 79 + ] + }, + { + "mask": 195, + "targets": [ + 32, + 33, + 38, + 39, + 88, + 90, + 92, + 94 + ] + }, + { + "mask": 204, + "targets": [ + 25, + 27, + 28, + 30, + 98, + 99, + 102, + 103 + ] + }, + { + "mask": 240, + "targets": [ + 4, + 5, + 6, + 7, + 58, + 59, + 60, + 61 + ] + } + ], + "two_cap_partitions": [ + { + "masks": [ + 15, + 240 + ], + "ranks": [ + 3, + 3 + ], + "target_pairs": 64 + }, + { + "masks": [ + 51, + 204 + ], + "ranks": [ + 3, + 3 + ], + "target_pairs": 64 + }, + { + "masks": [ + 60, + 195 + ], + "ranks": [ + 3, + 3 + ], + "target_pairs": 64 + }, + { + "masks": [ + 85, + 170 + ], + "ranks": [ + 3, + 3 + ], + "target_pairs": 64 + }, + { + "masks": [ + 90, + 165 + ], + "ranks": [ + 3, + 3 + ], + "target_pairs": 64 + }, + { + "masks": [ + 102, + 153 + ], + "ranks": [ + 3, + 3 + ], + "target_pairs": 64 + }, + { + "masks": [ + 105, + 150 + ], + "ranks": [ + 4, + 4 + ], + "target_pairs": 16 + } + ], + "four_cap_escape": { + "targets": [ + 0, + 4, + 48, + 50 + ], + "rows": [ + [ + 2, + 2, + 2, + 2, + 0, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 0, + 2, + 2, + 2, + 2 + ], + [ + 2, + 0, + 0, + -2, + 2, + 0, + 0, + -2 + ], + [ + 0, + 2, + -2, + 0, + 0, + 2, + -2, + 0 + ] + ], + "rational_rank": 4, + "frame_ranks": [ + 3, + 3, + 3, + 3 + ] + } + }, + { + "block": [ + 1, + 3, + 4, + 6 + ], + "sources": [ + 72, + 73, + 74, + 75, + 76, + 77, + 78, + 79 + ], + "target_masks": [ + { + "mask": 0, + "targets": [ + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39 + ] + }, + { + "mask": 15, + "targets": [ + 56, + 58, + 61, + 63, + 96, + 97, + 98, + 99 + ] + }, + { + "mask": 51, + "targets": [ + 0, + 1, + 4, + 5, + 24, + 25, + 30, + 31 + ] + }, + { + "mask": 60, + "targets": [ + 66, + 67, + 68, + 69, + 90, + 91, + 92, + 93 + ] + }, + { + "mask": 85, + "targets": [ + 16, + 17, + 22, + 23, + 40, + 42, + 44, + 46 + ] + }, + { + "mask": 90, + "targets": [ + 82, + 83, + 84, + 85, + 105, + 107, + 108, + 110 + ] + }, + { + "mask": 102, + "targets": [ + 9, + 10, + 13, + 14, + 50, + 51, + 54, + 55 + ] + }, + { + "mask": 105, + "targets": [ + 73, + 74, + 76, + 79 + ] + }, + { + "mask": 150, + "targets": [ + 72, + 75, + 77, + 78 + ] + }, + { + "mask": 153, + "targets": [ + 8, + 11, + 12, + 15, + 48, + 49, + 52, + 53 + ] + }, + { + "mask": 165, + "targets": [ + 80, + 81, + 86, + 87, + 104, + 106, + 109, + 111 + ] + }, + { + "mask": 170, + "targets": [ + 18, + 19, + 20, + 21, + 41, + 43, + 45, + 47 + ] + }, + { + "mask": 195, + "targets": [ + 64, + 65, + 70, + 71, + 88, + 89, + 94, + 95 + ] + }, + { + "mask": 204, + "targets": [ + 2, + 3, + 6, + 7, + 26, + 27, + 28, + 29 + ] + }, + { + "mask": 240, + "targets": [ + 57, + 59, + 60, + 62, + 100, + 101, + 102, + 103 + ] + } + ], + "two_cap_partitions": [ + { + "masks": [ + 15, + 240 + ], + "ranks": [ + 3, + 3 + ], + "target_pairs": 64 + }, + { + "masks": [ + 51, + 204 + ], + "ranks": [ + 3, + 3 + ], + "target_pairs": 64 + }, + { + "masks": [ + 60, + 195 + ], + "ranks": [ + 3, + 3 + ], + "target_pairs": 64 + }, + { + "masks": [ + 85, + 170 + ], + "ranks": [ + 3, + 3 + ], + "target_pairs": 64 + }, + { + "masks": [ + 90, + 165 + ], + "ranks": [ + 3, + 3 + ], + "target_pairs": 64 + }, + { + "masks": [ + 102, + 153 + ], + "ranks": [ + 3, + 3 + ], + "target_pairs": 64 + }, + { + "masks": [ + 105, + 150 + ], + "ranks": [ + 4, + 4 + ], + "target_pairs": 16 + } + ], + "four_cap_escape": { + "targets": [ + 56, + 57, + 8, + 9 + ], + "rows": [ + [ + 2, + 2, + 2, + 2, + 0, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 0, + 2, + 2, + 2, + 2 + ], + [ + 2, + 0, + 0, + -2, + 2, + 0, + 0, + -2 + ], + [ + 0, + 2, + -2, + 0, + 0, + 2, + -2, + 0 + ] + ], + "rational_rank": 4, + "frame_ranks": [ + 3, + 3, + 3, + 3 + ] + } + }, + { + "block": [ + 1, + 3, + 5, + 7 + ], + "sources": [ + 96, + 97, + 98, + 99, + 100, + 101, + 102, + 103 + ], + "target_masks": [ + { + "mask": 0, + "targets": [ + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15 + ] + }, + { + "mask": 15, + "targets": [ + 56, + 58, + 61, + 63, + 72, + 73, + 74, + 75 + ] + }, + { + "mask": 51, + "targets": [ + 24, + 26, + 29, + 31, + 40, + 41, + 44, + 45 + ] + }, + { + "mask": 60, + "targets": [ + 89, + 91, + 92, + 94, + 106, + 107, + 108, + 109 + ] + }, + { + "mask": 85, + "targets": [ + 0, + 2, + 4, + 6, + 16, + 18, + 21, + 23 + ] + }, + { + "mask": 90, + "targets": [ + 65, + 67, + 68, + 70, + 81, + 83, + 84, + 86 + ] + }, + { + "mask": 102, + "targets": [ + 33, + 34, + 37, + 38, + 49, + 51, + 52, + 54 + ] + }, + { + "mask": 105, + "targets": [ + 97, + 98, + 100, + 103 + ] + }, + { + "mask": 150, + "targets": [ + 96, + 99, + 101, + 102 + ] + }, + { + "mask": 153, + "targets": [ + 32, + 35, + 36, + 39, + 48, + 50, + 53, + 55 + ] + }, + { + "mask": 165, + "targets": [ + 64, + 66, + 69, + 71, + 80, + 82, + 85, + 87 + ] + }, + { + "mask": 170, + "targets": [ + 1, + 3, + 5, + 7, + 17, + 19, + 20, + 22 + ] + }, + { + "mask": 195, + "targets": [ + 88, + 90, + 93, + 95, + 104, + 105, + 110, + 111 + ] + }, + { + "mask": 204, + "targets": [ + 25, + 27, + 28, + 30, + 42, + 43, + 46, + 47 + ] + }, + { + "mask": 240, + "targets": [ + 57, + 59, + 60, + 62, + 76, + 77, + 78, + 79 + ] + } + ], + "two_cap_partitions": [ + { + "masks": [ + 15, + 240 + ], + "ranks": [ + 3, + 3 + ], + "target_pairs": 64 + }, + { + "masks": [ + 51, + 204 + ], + "ranks": [ + 3, + 3 + ], + "target_pairs": 64 + }, + { + "masks": [ + 60, + 195 + ], + "ranks": [ + 3, + 3 + ], + "target_pairs": 64 + }, + { + "masks": [ + 85, + 170 + ], + "ranks": [ + 3, + 3 + ], + "target_pairs": 64 + }, + { + "masks": [ + 90, + 165 + ], + "ranks": [ + 3, + 3 + ], + "target_pairs": 64 + }, + { + "masks": [ + 102, + 153 + ], + "ranks": [ + 3, + 3 + ], + "target_pairs": 64 + }, + { + "masks": [ + 105, + 150 + ], + "ranks": [ + 4, + 4 + ], + "target_pairs": 16 + } + ], + "four_cap_escape": { + "targets": [ + 56, + 57, + 32, + 33 + ], + "rows": [ + [ + 2, + 2, + 2, + 2, + 0, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 0, + 2, + 2, + 2, + 2 + ], + [ + 2, + 0, + 0, + -2, + 2, + 0, + 0, + -2 + ], + [ + 0, + 2, + -2, + 0, + 0, + 2, + -2, + 0 + ] + ], + "rational_rank": 4, + "frame_ranks": [ + 3, + 3, + 3, + 3 + ] + } + } + ], + "descent_only_cost_screen": [ + { + "stages": 9, + "parent_rank": 73, + "max_b": "1/32", + "max_removed_width": 9, + "extra_rank_per_reused_role": 2, + "integer_slack": 1860718755653901874165592270692408 + }, + { + "stages": 37, + "parent_rank": 297, + "max_b": "1/32", + "max_removed_width": 9, + "extra_rank_per_reused_role": 2, + "integer_slack": 1091573579908379077602234074693464 + } + ], + "negative_controls": [ + "duplicate demand frame", + "comparable demand frames", + "demand row mismatch", + "frame fits a target cap", + "cold dirt not restored" + ] +} diff --git a/research/k8-frame-antichain/LICENSE b/research/k8-frame-antichain/LICENSE new file mode 100644 index 0000000000..261eeb9e9f --- /dev/null +++ b/research/k8-frame-antichain/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/research/k8-frame-antichain/NOTICE.md b/research/k8-frame-antichain/NOTICE.md new file mode 100644 index 0000000000..39f7795196 --- /dev/null +++ b/research/k8-frame-antichain/NOTICE.md @@ -0,0 +1,36 @@ +# Attribution and license + +This package is by Ali Romman. The proof, checker, and research record +were prepared with substantial OpenAI Codex assistance. The work is +under Apache-2.0. A copy of the repository license is included. + +The binary geometry and packet programs come from the retained +`complex-k492-owner-repair` source tree. The exact path and commit are +pinned in `SOURCES.json`. Their prior attribution and license apply. + +The rebuilt word uses icekylinx's gauge44 construction and its retained +predecessors. PR1005 supplies the k8 work credited to LeaverSAT and +LeaverSAT2, together with the signed layer, promotion, hybrid, and frame +builders and their recorded reviewers. PR1074 supplies the seven-slot +recipe. These names identify the roles recorded in the source packages; +they are not claims of external human review of this contribution. +The seven-slot lineage retains Rohan Arun's PR987 search and NewBArch's +PR869 delivery mechanism. Jeremy Kothe maintains the k8 package lineage. +Chafreaky's frame and owner work, G44Pack's owner work, and the PR635 +native interfaces retain their predecessor credit. + +PR899 is the direct prior helper-minimality result. This package changes +its circuit class: the first-formation theorem permits arbitrary scalar +operations and block mixing, while retaining an explicit value/frame +interface. No PR899 code was copied. + +Concurrent PR1103, by steph4n-gh with AI assistance, studies rectangular +output borrowing. PR1105, by woklerx with AI assistance, studies projected +cleanup after target feedback. They informed the stated scope, but their +code is not imported. The concurrent owner-packing lane independently +uses the same rebuilt seven-slot word. Its construction and bound are +separate from this package. + +Concurrent PR1126, also by woklerx with AI assistance, proves a 21-ADD +minimum for the eight cell cores in a fixed positive-lift class. Its +different operation alphabet and cost objective are not used here. diff --git a/research/k8-frame-antichain/PROOF.md b/research/k8-frame-antichain/PROOF.md new file mode 100644 index 0000000000..e4972cf3fa --- /dev/null +++ b/research/k8-frame-antichain/PROOF.md @@ -0,0 +1,192 @@ +# Proof and scope + +## 1. The register model + +Let `x_0,...,x_111` be independent scalar inputs. Input `x_i` has binary +label `p_i` in `GF(2)^9`. A register has a scalar value and a binary frame. +Its clean row is the coefficient row of the x inputs after all other +arbitrary inputs have been set to zero. The support hull of that row is +the span of the labels with nonzero coefficients. + +Initially, the 112 source rows are the coordinate rows and their frames +contain the corresponding labels. All other clean rows are zero. A +scalar ADD uses two distinct registers at a common frame that contains +both preceding frames. A scale leaves its row support unchanged. Frames +can grow but cannot decrease. No operation injects a new source form +through a cut or a private descending query. Target registers are not +available as extra registers in this class. + +These rules imply that each clean support hull lies in its register's +frame. This follows by induction on the scalar gates. Cancellation can +remove support, but cannot add a label outside the common frame. + +The coefficients can be arbitrary elements of a characteristic-zero +field. The gate count, order, intermediate rows, coefficient size, and +mixing between the 14 blocks are unrestricted. In particular, the proof +does not use the fixed-operation-multiset hypothesis of PR899. It does +not assume the shipped end-of-A frames for individual helper registers. +It does retain the value/frame demands below. + +## 2. First formation and the antichain bound + +Suppose a required value has support hull `F`, with `dim(F)>=2`, and must +occur in a register whose frame is contained in F. Select the first time +in the whole computation that any clean row with support hull F occurs +at a frame contained in F. + +That event is an ADD. It cannot be an initial row or a scale. Neither +operand already has support hull F: its frame was contained in F before +the event, which would contradict the choice of the first time. The +resulting row has support hull F. Thus the common ADD frame contains F. +It is also contained in F, so it equals F. Both distinct operand +registers reach F at this event. + +Let A be a set of pairwise incomparable required frames. Assign the two +registers from the preceding argument to each F in A. One register +cannot be assigned to two different frames in A. Its frame can only +grow, so those two frames would have to be comparable. Therefore: + +```text +number of registers >= 2 * |A|. +``` + +The certificate derives the demands from the 14 pinned packet programs. +For each of the eight all-K cells, the omitted face operations expose +leaver operands at rank two. Across the six K blocks, these give 48 +leaver values at 24 distinct frames. The retained faces give 144 values +at 144 distinct rank-three frames. The checker tests every pair of the +168 frames and finds no containment in either direction. + +The checker then replays the actual final seven-slot word. It finds all +192 required clean rows, up to nonzero scale, at their specified frames +in A or B. Each witness records the phase, event, register, exact row, +and frame. No value is inferred from a helper name or a reported count. +The source clean rows do not depend on the omitted target cut because +the word has no target feedback into source-side registers in A or B. + +It follows that at least 336 registers are needed for this interface. +Only 112 are input registers, so at least 224 extra registers are needed. +The 14 packet programs each use eight input registers and 16 helpers. +They supply all the specified forms at their frames. Thus 224 is sharp +for the clean formation interface. This upper witness does not assert +an independently optimal complete dirty-word implementation. + +The bound concerns the total available registers for this interface. +Helpers from a different stage count if that stage lends them. The proof +does not add 224 to a separate lower bound for another stage unless the +two resource uses are independently shown to be disjoint. + +## 3. Whole-block target borrowing + +The final frame of target t is `H_t={z:z dot p_t=0}`. A register with +monotone frames can reach a frame F only if `F` is contained in its final +frame. For each of the eight rank-four cold-block frames and each of the +112 targets, the certificate gives an explicit vector in F with odd +pairing against `p_t`. It checks all 896 cases. No whole block can use a +target register, regardless of scalar cancellation or later restoration. + +The same check applies to all eight rank-eight center-query frames. +It rejects all 896 center/target pairs. Thus a target cannot hold a +complete retained center query or participate at that query's full frame. +Earlier staged reads at smaller frames are outside this statement. + +The scalar restoration check is separate. It starts with the full +704-by-704 identity matrix, replays A over exact rationals, then applies +the recorded low tails for each group of four cold helpers. All four +helper rows return to their exact input rows. These helpers have no B +uses. A missing-tail control fails restoration. This is a scalar fact, +not a claim that an altered native schedule has been admitted. + +The frame result is not based on rational orthogonality of complementary +root tetrads. The retained binary Gram relation has a constant term: +`p_s dot p_t = 1 + (root_s dot root_t / 2) mod 2`. The finite cap check +uses the actual binary labels and does not omit that term. + +## 4. Splits and a boundary counterexample + +Project a cold block onto its eight independent source inputs. Each +target cap admits either none or four of these source labels. Across +all 112 targets there are 15 different masks. The nonempty masks form +seven complementary pairs. + +Restrict the split mechanism to two disjoint support masks whose union +is the block. Every carrier is assigned to one of the two masks. Other +block columns can be present, but are removed by projection here. On +each side, the carriers must span the restriction of the four coordinate +totals to that side. Their number is at least the rational rank of that +restriction. The checker computes these ranks by exact elimination. +Six complementary pairs have ranks 3 and 3. The last pair has ranks 4 +and 4. This proves the six-carrier minimum in the two-cap class, with +eight needed for the last partition. It covers all possible target +choices, not a sampled set. + +That restriction matters. Write the four coordinate rows as a,b,c,d. +The four rows `a+b`, `a-b`, `c+d`, and `c-d` each fit an allowed rank-three +target cap. They are independent and recover a,b,c,d by sums and +differences divided by two. The certificate gives distinct target +choices for all eight blocks. Hence a claim that every split needs six +carriers would be false. These four algebraic carriers still need a +scalar circuit with arbitrary target dirt, valid frame paths, restoration, +and a complete supplier invoice. They do not constitute such a circuit. + +## 5. Cost of descent between local formation jobs + +This subsection uses an additional restriction. Each demand still has +its first formation inside its own frame, as in section 2. Descents are +allowed only to reuse registers between these local formation jobs. +This excludes forming a query above its delivery frame and descending +a private copy. The native center mechanism uses that excluded behavior. + +There are 336 assigned register/frame occurrences. With delta fewer +registers, at least delta transitions on reused registers go from one +antichain frame to another. Such a transition has at least one downward +rank step. Total frame variation equals final rank minus initial rank +plus twice the total downward rank. Therefore this reuse adds at least +`2*delta` paid rank above the same endpoint rises. + +For a limited invoice screen, retain all other paid and idle charges. +Grant each removed helper the largest possible width, nine. Grant that +all nine of its paid ranks were rank-one children, and return those nine +ranks as idle work at the full parent rank m. Both grants favor removal. +With `w_r(b)=r*(m/r)^b`, the largest saving is + +```text +9 * (m^b - 1) +``` + +per removed helper. The extra two ranks cost at least two because every +allowed child rank is at most m. At stage counts 9 and 37, m is 73 and +297. For `0 order[j] for i in range(size) for j in range(i + 1, size)) + value = sign + for i, j in enumerate(order): + value *= matrix[i][j] + total += value + return total + + +def minor_rank(matrix): + for size in range(min(len(matrix), len(matrix[0])), 0, -1): + for rows in combinations(range(len(matrix)), size): + for columns in combinations(range(len(matrix[0])), size): + if determinant([[matrix[i][j] for j in columns] for i in rows]): + return size + return 0 + + +def main(): + certificate = json.loads((ROOT / "CERTIFICATE.json").read_text()) + word = json.loads(gzip.decompress((ROOT / "inputs/SEVEN-SLOT-WORD.json.gz").read_bytes())) + witnesses = certificate["factory"]["witnesses"] + check(len(witnesses) == 192, "demand count") + visits = {} + for witness in witnesses: + visits.setdefault((witness["phase"], witness["event"]), []).append(witness) + stream = [(phase, index, event) for phase in ("A", "B") for index, event in enumerate(word[phase])] + for column in range(112): + values = [Fraction(0)] * 704 + values[column] = Fraction(1) + for phase, index, event in stream: + if event[0] == "add": + target, source, numerator, denominator = event[1:5] + values[target] += values[source] * Fraction(numerator, denominator) + else: + target, numerator, denominator = event[1:4] + values[target] *= Fraction(numerator, denominator) + for witness in visits.get((phase, index), []): + expected = dict(witness["clean_row"]).get(column, "0") + check(values[witness["register"]] == Fraction(expected), "column witness") + check(span(witness["frame"]) == span(event[-1]), "event frame") + frames = set() + for witness in witnesses: + labels = [word["ports"][i] for i, coefficient in witness["clean_row"] if Fraction(coefficient)] + frame = frozenset(span(witness["frame"])) + check(span(labels) == frame, "support hull") + frames.add(frame) + check(len(frames) == 168, "frame count") + check(sum(len(frame) == 4 for frame in frames) == 24, "rank two count") + check(sum(len(frame) == 8 for frame in frames) == 144, "rank three count") + for first, second in combinations(frames, 2): + check(not first <= second and not second <= first, "antichain") + check(2 * len(frames) - 112 == certificate["factory"]["helper_lower_bound"] == 224, + "register bound") + cap_pairs = 0 + for key in ("whole_block_target_exclusion", "center_target_exclusion"): + if key == "whole_block_target_exclusion": + expected_frames = {frozenset(span(frame)) for register, frame in word["helper_final"].items() + if len(frame) == 4 and register not in word["start_extra"]} + else: + expected_frames = {frozenset(span(frame)) for frame in word["center_frames"]} + check(len(certificate[key]) == 8 and + {frozenset(span(record["frame"])) for record in certificate[key]} == expected_frames, + "cap frame inventory") + for record in certificate[key]: + frame = span(record["frame"]) + check(len(record["odd_vectors_by_target"]) == 112, "cap target inventory") + for port, vector in zip(word["ports"], record["odd_vectors_by_target"]): + check(vector in frame and bin(vector & port).count("1") % 2 == 1, "cap witness") + cap_pairs += 1 + check(cap_pairs == 1792, "cap coverage") + split_ranks = 0 + for record in certificate["split_carriers"]: + sources = record["sources"] + labels = [word["ports"][i] for i in sources] + matrix = [[word["root_lines"][j][i] for j in sources] for i in record["block"]] + masks = {} + for target, port in enumerate(word["ports"]): + mask = sum(1 << i for i, label in enumerate(labels) if bin(label & port).count("1") % 2 == 0) + masks.setdefault(mask, []).append(target) + check(record["target_masks"] == [{"mask": m, "targets": masks[m]} for m in sorted(masks)], + "mask inventory") + pairs = [(m, 255 ^ m) for m in masks if m < (255 ^ m) and (255 ^ m) in masks] + check(len(pairs) == 7, "partition coverage") + check(len(record["two_cap_partitions"]) == 7 and + {tuple(p["masks"]) for p in record["two_cap_partitions"]} == set(pairs), + "partition inventory") + for partition in record["two_cap_partitions"]: + check(tuple(partition["masks"]) in pairs, "partition masks") + for mask, expected in zip(partition["masks"], partition["ranks"]): + restricted = [[row[j] for j in range(8) if mask >> j & 1] for row in matrix] + check(minor_rank(restricted) == expected, "split determinant rank") + split_ranks += 1 + escape = record["four_cap_escape"] + check(len(set(escape["targets"])) == 4 and minor_rank(escape["rows"]) == 4, "escape rank") + for row, target in zip(escape["rows"], escape["targets"]): + support = [labels[i] for i, value in enumerate(row) if value] + check(len(span(support)) == 8, "escape frame") + check(all(bin(x & word["ports"][target]).count("1") % 2 == 0 for x in support), + "escape target") + for pair in range(2): + plus, minus = escape["rows"][2 * pair:2 * pair + 2] + check([Fraction(x + y, 2) for x, y in zip(plus, minus)] == matrix[2 * pair], "escape sum") + check([Fraction(x - y, 2) for x, y in zip(plus, minus)] == matrix[2 * pair + 1], "escape difference") + check(split_ranks == 112, "split rank coverage") + print("PASS_K8_ANTICHAIN_INDEPENDENT columns=112 values=192 antichain=168 split_ranks=112 cap_pairs=1792") + + +if __name__ == "__main__": + main() diff --git a/research/k8-frame-antichain/inputs/PACKET-PROGRAMS.json.gz b/research/k8-frame-antichain/inputs/PACKET-PROGRAMS.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..e98ce5d879e99427347acd725efc3b0c96fe5c13 GIT binary patch literal 3400 zcmV-O4Y%?iiwFP!000023hiD0j^j2Cew849D~0vLvc3P^3)~AV7C|=S?dCR<1WBev zQS{x9q9l@<%-pp|4s$?>ouxiov`ERes85!i&%ZCX`+0MCIW0eZ{_MQ*W@U~2Vm>?L zEMaGQ!kq~fM>AAtqp>4xI5QCr#!^AHGpy7bOV+IE2u{XQvEW16HZErfmweJH8G~_N z_?Jq~8NG2_?r4%PIU@*fp?2U%$?yg?MV(yD01#`&kg8PnTW$j=w5z*CE2SdJUgNmw zYPBXq<@V4zdFRLt?oBPU6KBV>S#VgkR}?J~MWgnjAs7$rC)6*9ljFr1WbC;L&?Jmg z75O9+p7^|u6@D?xr+M?VKF>ezF4y^dflCkk=+apjQ_D{2-yVy z^E{`M2}aR!x+TKMvJWKvSVb5d$v##QT@_&%NkU~}leo~Pz7r`}MLn6KVgpDugFd_g zT#&#QU6I!PS#ikz)wGW?NqZ|yR*P;jC%tk4OW&Np(s@y5DktkxIl=+7T2CCFveDGb zXCj0*vbev+Z7+HQ(MgEDLv$&krx6{H=$AxyC3-Q@xrsh6!;UQY+^f_+ll##X_paRI zuDBoOzIi3OY|)XgLN=8B%AvwcV zZ!Mq4J_k68z%nw6h%F;I2Y3nja*4yL$<@s<~e>cX*mlGl;`=asBnU+8v<1R$%XW zv3ox4=V!>+TzAKVSsad_@_k->pZBNvyx1OJ;F#k#+_!x>pHmU%Vf2g3%jvY=&F7z% z*@^jZ*<6q3_3?Rkxj<16Z~rxKuk+LL)Ajr^nam!B5@gr?stQf>D0b%q1GRl1_6r5DHZ;^+PG z>t?^ewp?7c-{+^7{hUrgspo!oz?c|=iM@%?1rH`dJethVnIT<**W-1wug#J!wcEya z0nWh%F6x^gDvb&}z;_oL1YQ`Kg2kfE2rN`>LOHiZIk#(2wjNuA*1HC! zQldzcwoK7V!O7QJPqfsO!u7>GvWj_BZ`N!}X*JtYx?)@Ul>JaTp>#s&#N+4$#5tuC zN+;f?6KTE&?hxoDp?8eN4>%h%-9aasuq;Ed48J1eDy2|Lp_D=?#m7>L(BZ5%%CY>% zZVN@|B1zi?k^%d)EPL$Dvb44%31#N#a*<9qz~XU?@}M|N7#WY8K>kgdJ*^;(xMd1{ zQ~44V;{`yCj7&oz50t{-obtNVEArvhPO1<(RSXr3m1=z916V8a!5x>G_8D%apaek) zf)a#>5(H>0B?w9o-X;iXU;_6!3^m}U9t{izAiVo~o;Pri6|q&uQyD{*9Vk0ccA)Iw zgC97gil!UFvh?FfGS775D0K`Zt#c%&v5LN9na(RG&`&pMni1y&EY;;fbzP3F4+dJ4 z$MqE?^;=LT;0YxoQKn;?LXC>i3Z}75{RE@-#zk_Q3dwHf{SyxI9ec*=k=5(&Qn+xx zDV;ro-O3M?A1FU~6hCkVIluA)PUK=5XsWws>>|Bt8WZc z0Q$7PrXrv2^1OZ_KA*gL4u@z3n<&; z#b3O}a$1{Xlw0ICYLdsK$$7V$Z7IA(#$BjxDYZ~)q157W)S}l%4@xcGqZR?~A8P^- zP;Wvop*I2g#^Ih<9YlzhVOfS^8Ge;sD7{d6q4eT|*Cs`r*++@fASebBAx4&g1g^j= z(y{EjDxk#jvM&K&UsDjs(V8JbLwTpUrX%#up-uZvq(j*+(z?GVYuScxtg#0f)px0D z3OOxE4+?5-!qvmHdWoz7uAU~H>SfW-t(Wx)OC5PEl?e`ztyq0fx}bDH>B6Jv0*nHc zE+}1ik1h<*kNMOI55Ownwi?U;efT}EGKi2X18sN}S9@Kkq*Otvf>MQ#rwTStaD@Ea zG_o96TKv94mL9+Ikfrm1Wnk&^Gl={=qJArgL7+F08#FZlyvXVeD0A%%np!Zt1&TJI zXpPFktk7&#)2JBah8K;{w1_BgcwJuOQt?9R zgwhG66OW@4y)JB0I`Qtprqp4iyAba>xPQ`ZmhRPbui1NOMH8MyNN&Qg2)#-zlv*gY zP-^kP)WYMXg7e`$Nk6enonjVYvLvDJWZ6w5`_7U~-GP@W_9GIc_km>!7V9K`UuXFH zGJI~))PSUZ3kpFXl&nl51&?0=s9P~xLCR`@#|2SxV`AsIq~vX_W_c?DGb;AvEg!)9 zJ1z+~xTKzqhqTNIjVpyv3i0=#5QBO1-vcRx#djn0iG)&!cPPY|?ynASxI7$%yQ#m2 zIQUm_R|H!bU~^Da+Mu*SX@k;+kA62IADpj3&(gB=-jcM#MACOw$bqCCJV`jJ46q4w zmcBO1XsE0H34tGFYQF-oO5ajtaMM+w{HF=>jt8_l*9+G69L+)`?x)IzDnt)imX_ zAUz)-Ex?g9gCT2xtEcz?qIg;KbL(Y&!cs>b%Vkb%3z{?gpmag$g3^UY(FLzxX;QlI zAD%?OeP_++%;?kWYa?_~(Tw-JN-aWed=+A4T#fo9LaBmM1*HoA2Md^bd_s!S^%Kj{ zleBrtBR`MG6CWs@8(8+1q{q^-v}sa4G@$S641a_2D+(2W7v=Lu5|rOyYY?et0Dbu_ zDB6UQGv$>C0XVPB>4P(w7gXTf@CslS?M;r=dZINd3$v)cRgoQ}dY7Z9R!xhD^2$M6 zUgJ{nLg|Fk38fQ{qZ9gNCZ!YazZ=n|P9-fcO<(Is!;&#CL&eoj_xw0S6P`s#Zo;q# zy-F>VS}3(pYVpCp4-v7~ikSusEO90zOE*}S-jnos?!3r>r1KNY*ykTf7U^^Y%CaUx z;6wgJH<3;^fOQL^rwlDBFLYO`G1LW3Euzc}pq*t3wY*75C;44G#WKlM$zZ$WD`t_G z^(c|Yn&mhyu@;|vAiJ?I{wSSLI`Q|Q6Y1Bz{>$G3sfEKQ75anJN-f@@787(uL;6jh zDLqh6Z@1a}gQ4ABzbPR@vkb>g2v_ffx(h8*&A4@B6oh6EZ{a2CLb7hIMA}E6E zSx!~p90`hm(WUPPsA(vqgHqSihgk{XY<+Bz>u(Xw>N6UqVwclwzohBt zDATD)I$Q}`VW|_sdVJoU8wIX`Y6r0wI(2{6&-=4J<5~{1MYRfU4N4i5GAL#E-%$qr ziE5<`?=Nl|%?QH*Tzopgjpxl2%yiGY5HjX+oE5=UgjA&pN)?nUC{_62#Z4nlaG-SK z#1g*~;mX${EJ>f=@X8-qidM*hq|aX!${#)&^WdA(Sl2i)7|Kh`6@UkMR$ZiJy^sK; znnC@XQv=Gc!}V;kSh8%AoG3pSSDrYO)Rrd>HBI{~PR47!k`XEdGoo!b$SJNTZdk5K z(*j&tQEN&gU(mi%2&E8zlMlQmFaP}i2hxcY7nm}o(g(E==q$9 e_dI=Q!muO%E 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 p & 1: + vector ^= pivots[p] + if vector: + p = vector.bit_length() - 1 + for k in pivots: + if pivots[k] >> p & 1: + pivots[k] ^= vector + pivots[p] = vector + return tuple(pivots[p] for p in sorted(pivots, reverse=True)) + + +def points(frame): + result = {0} + for vector in frame: + result |= {x ^ vector for x in result} + return result + + +def contained(first, second): + return points(first) <= points(second) + + +def antichain(frames): + require(len(set(frames)) == len(frames), "duplicate demand frame") + for first, second in combinations(frames, 2): + require(not contained(first, second) and not contained(second, first), + "comparable demand frames") + + +def rank(matrix): + rows = [[Q(x) for x in row] for row in matrix] + pivot = 0 + for column in range(len(rows[0])): + found = next((i for i in range(pivot, len(rows)) if rows[i][column]), None) + if found is None: + continue + rows[pivot], rows[found] = rows[found], rows[pivot] + scale = rows[pivot][column] + rows[pivot] = [x / scale for x in rows[pivot]] + for i in range(len(rows)): + if i != pivot: + scale = rows[i][column] + rows[i] = [x - scale * y for x, y in zip(rows[i], rows[pivot])] + pivot += 1 + return pivot + + +def apply(event, rows): + target = event[1] + if event[0] == "scale": + q = Q(event[2], event[3]) + rows[target] = {k: q * x for k, x in rows[target].items()} + return [target] + require(event[0] == "add", "unknown scalar event") + source = event[2] + q = Q(event[3], event[4]) + for k, x in list(rows[source].items()): + value = rows[target].get(k, Q(0)) + q * x + if value: + rows[target][k] = value + else: + rows[target].pop(k, None) + return [target, source] + + +def serialized_row(row): + return [[k, str(q)] for k, q in sorted(row.items())] + + +def normalized(row): + scale = row[min(row)] + return tuple((k, q / scale) for k, q in sorted(row.items())) + + +def factory_demands(modules, word): + demands = {} + k_pairs = {(0, 1), (2, 3), (4, 5), (6, 7)} + require(len(modules) == 14, "factory block count") + all_sources = [s - 8 for module in modules for s in module["receipt"]["source_lines"]] + require(sorted(all_sources) == list(range(112)), "factory source partition") + for module in modules: + block = module["receipt"]["block"] + keys = [(pair, sign) for pair in combinations(block, 2) for sign in (-1, 1)] + frames = [basis(x) for x in module["start_frames"]] + require(len(frames) == 24 and all(not frame for frame in frames[8:]), "factory helper allocation") + labels = [basis(x)[0] for x in module["start_frames"][:8]] + require(labels == [word["ports"][s - 8] for s in module["receipt"]["source_lines"]], + "factory labels do not match word") + rows = [{r: Q(1)} if r < 8 else {} for r in range(24)] + for index, event in enumerate(module["events"]): + if index == 40: + pair_frames, pair_rows = frames[:], [dict(row) for row in rows] + target, source = event[:2] + require(0 <= target < 24 and 0 <= source < 24 and target != source, + "factory register allocation") + frame = basis(module["event_frames"][index]) + require(contained(frames[target], frame) and contained(frames[source], frame), + "factory frame descent") + apply(["add"] + event + [list(frame)], rows) + frames[target] = frames[source] = frame + for register in (target, source): + require(contained(basis(labels[k] for k in rows[register]), frame), + "factory support outside frame") + if index < 40: + continue + pair, sign = keys[index - 40] + if pair in k_pairs: + choices = [(r, pair_frames[r], pair_rows[r], "leaver") for r in (target, source)] + else: + choices = [(target, frame, rows[target], "face")] + for register, wanted, row, kind in choices: + require(basis(labels[k] for k in row) == wanted, "factory support hull") + global_row = {module["receipt"]["source_lines"][k] - 8: q for k, q in row.items()} + demand = demands.setdefault(wanted, {"kind": kind, "block": block, "clean_rows": set()}) + demand["clean_rows"].add(normalized(global_row)) + antichain(list(demands)) + require(Counter(x["kind"] for x in demands.values()) == {"face": 144, "leaver": 24}, + "factory interface changed") + require(sum(len(x["clean_rows"]) for x in demands.values()) == 192, "factory value count changed") + return demands + + +def word_witnesses(word, demands): + v = word["report"]["v"] + n = 2 * v + word["report"]["R"] + rows = [{r: Q(1)} if r < v else {} for r in range(n)] + frames = [(p,) for p in word["ports"]] + [()] * (n - v) + for register, frame in word["start_extra"].items(): + frames[int(register)] = basis(frame) + found = {} + for phase in ("A", "B"): + for index, event in enumerate(word[phase]): + if event[0] == "add": + require(not (v <= event[2] < 2 * v and not v <= event[1] < 2 * v), + "target feedback into source circuit") + touched = apply(event, rows) + frame = basis(event[-1]) + for register in touched: + require(contained(frames[register], frame), "word frame descent") + frames[register] = frame + if v <= register < 2 * v: + continue + hull = basis(word["ports"][k] for k in rows[register]) + require(contained(hull, frame), "source support outside frame") + if frame in demands and hull == frame: + clean = normalized(rows[register]) + key = frame, clean + if clean in demands[frame]["clean_rows"] and key not in found: + found[key] = {"phase": phase, "event": index, "register": register, + "frame": list(frame), "clean_row": serialized_row(rows[register]), + "kind": demands[frame]["kind"], "block": demands[frame]["block"]} + expected = {(frame, row) for frame, demand in demands.items() for row in demand["clean_rows"]} + require(set(found) == expected, "word does not supply the demand interface") + return [found[key] for key in sorted(found)] + + +def check_witness(word, witness): + v = word["report"]["v"] + n = 2 * v + word["report"]["R"] + rows = [{r: Q(1)} if r < v else {} for r in range(n)] + for phase in ("A", "B"): + for index, event in enumerate(word[phase]): + apply(event, rows) + if (phase, index) == (witness["phase"], witness["event"]): + require(serialized_row(rows[witness["register"]]) == witness["clean_row"], + "demand row mismatch") + require(basis(event[-1]) == tuple(witness["frame"]), "demand frame mismatch") + return + raise ValueError("demand event missing") + + +def cap_witnesses(frames, ports): + result = [] + for frame in frames: + witnesses = [] + for port in ports: + odd = next((x for x in sorted(points(frame)) if (x & port).bit_count() % 2), None) + require(odd is not None, "frame fits a target cap") + witnesses.append(odd) + result.append({"frame": list(frame), "odd_vectors_by_target": witnesses}) + return result + + +def cold_groups(word): + groups = defaultdict(list) + for register, frame in word["helper_final"].items(): + if len(frame) == 4 and register not in word["start_extra"]: + groups[basis(frame)].append(int(register)) + require(len(groups) == 8 and all(len(hs) == 4 for hs in groups.values()), "cold groups changed") + return groups + + +def cold_restoration(word, groups, omit=None): + v = word["report"]["v"] + n = 2 * v + word["report"]["R"] + rows = [{r: Q(1)} for r in range(n)] + for event in word["A"]: + apply(event, rows) + results = [] + for frame, helpers in sorted(groups.items()): + require(all(not set(event[1:3] if event[0] == "add" else event[1:2]) & set(helpers) + for event in word["B"]), "cold helper has a B use") + tails = [(index, word["cleanup"][index][:-1] + [level]) + for index, level in word["early_cleanup"] + if word["cleanup"][index][1] in helpers] + fresh = [dict(row) for row in rows] + for index, event in tails: + if index != omit: + apply(event, fresh) + require(all(fresh[h] == {h: Q(1)} for h in helpers), "cold dirt not restored") + results.append({"frame": list(frame), "helpers": sorted(helpers), + "tail_indices": [index for index, event in tails], "arbitrary_columns": n}) + return results + + +def split_carriers(word, modules, groups): + results = [] + for module in modules: + sources = [i - 8 for i in module["receipt"]["source_lines"]] + labels = [word["ports"][i] for i in sources] + frame = basis(labels) + if frame not in groups: + continue + block = module["receipt"]["block"] + matrix = [[word["root_lines"][j][i] for j in sources] for i in block] + masks = defaultdict(list) + for target, port in enumerate(word["ports"]): + mask = sum(1 << j for j, label in enumerate(labels) if (label & port).bit_count() % 2 == 0) + masks[mask].append(target) + require(len(masks) == 15 and 255 not in masks, "target mask class changed") + require(all(mask.bit_count() in (0, 4) for mask in masks), "target mask support size") + partitions = [] + for mask in sorted(masks): + other = 255 ^ mask + if mask >= other or other not in masks: + continue + ranks = [rank([[row[j] for j in range(8) if side >> j & 1] for row in matrix]) + for side in (mask, other)] + partitions.append({"masks": [mask, other], "ranks": ranks, + "target_pairs": len(masks[mask]) * len(masks[other])}) + require(Counter(tuple(item["ranks"]) for item in partitions) == {(3, 3): 6, (4, 4): 1}, + "two-cap split ranks changed") + carriers, targets = [], [] + for a, b in ((0, 1), (2, 3)): + for sign in (1, -1): + row = [matrix[a][j] + sign * matrix[b][j] for j in range(8)] + mask = sum(1 << j for j, q in enumerate(row) if q) + target = next(t for t in masks[mask] if t not in targets) + targets.append(target) + require(len(basis(labels[j] for j, q in enumerate(row) if q)) == 3, "mixed carrier rank") + carriers.append(row) + require(rank(carriers) == 4, "mixed carriers dependent") + for pair, (a, b) in enumerate(((0, 1), (2, 3))): + plus, minus = carriers[2 * pair:2 * pair + 2] + require([Q(x + y, 2) for x, y in zip(plus, minus)] == matrix[a], "mixed sum decoder") + require([Q(x - y, 2) for x, y in zip(plus, minus)] == matrix[b], "mixed difference decoder") + results.append({"block": block, "sources": sources, + "target_masks": [{"mask": mask, "targets": masks[mask]} for mask in sorted(masks)], + "two_cap_partitions": partitions, + "four_cap_escape": {"targets": targets, "rows": carriers, + "rational_rank": 4, "frame_ranks": [3] * 4}}) + require(len(results) == 8, "split block coverage") + return results + + +def expect_failure(operation, reason): + try: + operation() + except ValueError as error: + require(str(error) == reason, "wrong control rejection: " + str(error)) + return reason + raise ValueError("control accepted: " + reason) + + +def controls(word, demands, witnesses, groups): + frames = list(demands) + result = [expect_failure(lambda: antichain([frames[0], frames[0]]), "duplicate demand frame")] + larger = basis(list(frames[0]) + [x for x in range(1, 512) if x not in points(frames[0])][:1]) + result.append(expect_failure(lambda: antichain([frames[0], larger]), "comparable demand frames")) + changed = dict(witnesses[0]) + changed["clean_row"] = [list(entry) for entry in changed["clean_row"]] + changed["clean_row"][0][1] = str(Q(changed["clean_row"][0][1]) + 1) + result.append(expect_failure(lambda: check_witness(word, changed), "demand row mismatch")) + full_frame = next(iter(groups)) + orthogonal = next(p for p in range(1, 512) if all((x & p).bit_count() % 2 == 0 for x in full_frame)) + result.append(expect_failure(lambda: cap_witnesses([full_frame], [orthogonal]), "frame fits a target cap")) + tails = cold_restoration(word, groups) + result.append(expect_failure(lambda: cold_restoration(word, groups, tails[0]["tail_indices"][0]), + "cold dirt not restored")) + return result + + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument("--write-certificate", action="store_true") + args = parser.parse_args() + pins = json.loads((HERE / "SOURCES.json").read_text()) + inputs = {} + for name, pin in pins["inputs"].items(): + data = (HERE / "inputs" / name).read_bytes() + if name.endswith(".gz"): + data = gzip.decompress(data) + require(hashlib.sha256(data).hexdigest() == pin["content_sha256"], "input pin mismatch: " + name) + inputs[name] = json.loads(data) + word = inputs["SEVEN-SLOT-WORD.json.gz"] + modules = inputs["PACKET-PROGRAMS.json.gz"] + slot_pins = inputs["SLOT-PINS-k8.json"] + require(slot_pins["word_sha256"] == pins["inputs"]["SEVEN-SLOT-WORD.json.gz"]["content_sha256"], + "word does not match slot source pin") + require(word["report"]["v"] == 112 and word["report"]["R"] == 480, "word size changed") + require(len(word["center_frames"]) == 8 and all(len(basis(x)) == 8 for x in word["center_frames"]), + "center frame inventory changed") + demands = factory_demands(modules, word) + witnesses = word_witnesses(word, demands) + groups = cold_groups(word) + prices = [] + for stages in (9, 37): + m = 8 * stages + 1 + require(m * 9 ** 32 < 11 ** 32, "descent cost screen failed") + prices.append({"stages": stages, "parent_rank": m, "max_b": "1/32", + "max_removed_width": 9, "extra_rank_per_reused_role": 2, + "integer_slack": 11 ** 32 - m * 9 ** 32}) + result = {"status": "PASS_K8_FRAME_ANTICHAIN", "base_commit": pins["base_commit"], + "scope": "fixed factory value/frame interface; no kappa claim", + "factory": {"demand_frame_count": 168, "demand_value_count": 192, + "frame_ranks": {"2": 24, "3": 144}, + "source_registers": 112, "register_lower_bound": 336, + "helper_lower_bound": 224, "attained_helpers": 14 * 16, + "upper_witness": {"modules": len(modules), "registers_per_module": 24, + "source_partition": list(range(112)), + "executed_adds": sum(len(m["events"]) for m in modules)}, + "witnesses": witnesses}, + "whole_block_target_exclusion": cap_witnesses(sorted(groups), word["ports"]), + "center_target_exclusion": cap_witnesses([basis(x) for x in word["center_frames"]], word["ports"]), + "early_scalar_restoration": cold_restoration(word, groups), + "split_carriers": split_carriers(word, modules, groups), + "descent_only_cost_screen": prices, + "negative_controls": controls(word, demands, witnesses, groups)} + certificate = HERE / "CERTIFICATE.json" + if args.write_certificate: + certificate.write_text(json.dumps(result, indent=2) + "\n") + else: + require(result == json.loads(certificate.read_text()), "certificate differs from replay") + print("PASS_K8_FRAME_ANTICHAIN demands=168 helpers=224 cold_caps=896 center_caps=896 split_blocks=8 controls=5") + + +if __name__ == "__main__": + main()