diff --git a/CHANGELOG.md b/CHANGELOG.md index c23e7c27..74ed39d9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,8 @@ after its public API and format compatibility policies are established. ## [Unreleased] +- Incomplete version-one segment seals now refuse observed fixed-framing corruption before recovery assessment can authorize discard, preserving precise seal diagnostics (#171). + - Retention recovery execution errors report the exact failed boundary, original typed cause, known namespace effects and uncertain effect/durability; retries freshly observe the store. Observed stage identity remains binding across reopening, and cleanup preserves verified pool evidence rather than promising the removed pathname survives (#99). - Retention recovery now preserves incomplete stages and requires explicit disposition before any recovery mutation or publication retry; automatic incomplete-stage disposal is deferred by maintainer decision (#99). diff --git a/docs/formats/segment-store-v1/recovery.md b/docs/formats/segment-store-v1/recovery.md index 1891d36c..f81d0d89 100644 --- a/docs/formats/segment-store-v1/recovery.md +++ b/docs/formats/segment-store-v1/recovery.md @@ -52,7 +52,7 @@ only regular files, and refuses entry replacement or length drift after reading. `classify_recovery_segment_stage` classifies complete caller-supplied stage bytes as a validated reusable prefix, a complete admitted segment, or an exact truncation only when every available segment- or record-header framing -byte remains canonical. It preserves proven partial-framing and +byte remains canonical. Recognized incomplete seals also validate available fixed version, flags, seal length, algorithm and reserved fields before returning truncation; failures preserve their precise seal cause through `RecoverySegmentStageError::Seal`. This does not prove future completion feasibility for every remaining coordinate. It preserves proven partial-framing and complete-looking corruption as typed refusals. Catalog- and next-head-stage classifiers apply the same available-fixed-framing rule before distinguishing exact truncation from complete canonical bytes. Every diff --git a/docs/formats/segment-store-v1/requirements.md b/docs/formats/segment-store-v1/requirements.md index 526fd25c..41db589d 100644 --- a/docs/formats/segment-store-v1/requirements.md +++ b/docs/formats/segment-store-v1/requirements.md @@ -124,7 +124,7 @@ device fault evidence. | `KEEP-RECOVERY-007` | Name classification requires the four initialized root entries, admits only fixed protocol names and canonical pool coordinates in their owning namespaces, refuses simultaneous fixed recovery stages before artifact reads, and moves a refused raw name without duplicating its allocation | Canonical-name matrix and allocation counter | `tests/recovery_name_classification.rs`, `tests/recovery_name_classification_memory.rs` | Implemented in #17 | | `KEEP-RECOVERY-008` | Stage evidence is fingerprinted through a zero-allocation bounded streaming reader under the named recovery domain; metadata and observed bytes cannot exceed the name-selected protocol maximum, and failures retain exact stage and offset | Independent framing oracle, adversarial reader matrix, and allocation counter | `tests/recovery_stage_fingerprint.rs`, `tests/recovery_stage_fingerprint_memory.rs` | Implemented in #17 | | `KEEP-RECOVERY-009` | Filesystem stage observation uses the pinned inventory capability, never follows a fixed-stage link, admits only regular files, and refuses entry replacement or length drift after bounded fingerprinting | Capability-relative replacement fixtures | `src/adapters/filesystem_recovery_stage_tests.rs` | Implemented in #17 | -| `KEEP-RECOVERY-010` | Whole-byte segment-stage classification distinguishes a validated reusable prefix, a complete admitted immutable segment, and exact header, record, or seal truncation only while every available fixed-framing byte remains canonical; proven partial-framing corruption, complete-looking corruption, duplicates, and resource-limit excess remain typed refusals | Exhaustive available-framing-byte, canonical prefix, and corruption matrix | `tests/recovery_segment_classification.rs`, `tests/recovery_segment_classification/*.rs` | Implemented in #17 | +| `KEEP-RECOVERY-010` | Whole-byte segment-stage classification distinguishes a validated reusable prefix, a complete admitted immutable segment, and exact header, record, or seal truncation only while every available fixed-framing byte remains canonical; proven partial-framing corruption, complete-looking corruption, duplicates, and resource-limit excess remain typed refusals | Exhaustive available-framing-byte, canonical prefix, and corruption matrix | `tests/recovery_segment_classification.rs`, `tests/recovery_segment_classification/*.rs`, `tests/recovery_partial_seal.rs`, `tests/recovery_partial_seal/*.rs` | Implemented in #17; partial-seal framing correction in #171 ([evidence](../../testing-evidence/partial-seal-corruption.md)) | | `KEEP-RECOVERY-011` | Whole-byte catalog and next-head stage classification distinguishes exact fixed-header, declared-body, and fixed-width truncation from complete canonical bytes only while every available fixed-framing byte remains canonical; proven partial-framing corruption, complete-looking corruption, and oversize remain typed format or metadata refusals | Exhaustive available-framing-byte, canonical publication-artifact truncation, and corruption matrix | `tests/recovery_publication_stage_classification.rs`, `tests/recovery_publication_stage_classification/*.rs` | Implemented in #17 | | `KEEP-RECOVERY-012` | Read-only semantic assessment admits materialized stage bytes only when the canonical-name stage, exact observed length, and `KEEP:RECOVERY:STAGE\0` fingerprint equal prior evidence, then dispatches through the name-selected segment, catalog, or next-head classifier | Evidence-binding mutation matrix and canonical stage assessments | `tests/recovery_stage_assessment.rs`, `tests/recovery_stage_assessment/*.rs` | Implemented in #17 | | `KEEP-RECOVERY-013` | Explicit discard plans only from an exact truncation assessment, retains the observation evidence and typed truncation reason, refuses changed evidence without mutation, synchronizes the name-selected parent after exact removal or admitted absence, and returns a receipt only after synchronization | Truncation-planning, evidence-drift, operation-order, and retry matrix | `tests/recovery_stage_discard.rs`, `tests/recovery_stage_discard/*.rs` | Implemented in #17 | diff --git a/docs/testing-evidence/partial-seal-corruption.md b/docs/testing-evidence/partial-seal-corruption.md new file mode 100644 index 00000000..9d0a43c4 --- /dev/null +++ b/docs/testing-evidence/partial-seal-corruption.md @@ -0,0 +1,51 @@ +# Partial segment seal corruption + +Change kind: bug fix for [#171](https://github.com/flyingrobots/keep/issues/171), under the T-13.2 audit. Owner: `@flyingrobots`; the author supplies execution evidence. The contract is KEEP-RECOVERY-010: demonstrated available fixed-framing corruption must refuse classification and assessment before a discard plan can be constructed. + +## Parent RED and correction + +Main `6051abb25a9fd33ae7ee0de5614514b709a4d82a` accepts a canonical one-zero segment truncated after seal version 2 as lawful truncation. The [parent RED receipt](partial-seal-corruption/parent-red.txt) records both public classifier and fingerprint-bound assessment regressions failing after successful compilation. The tests are committed separately at `1b6da984ece52e94777fe1b52dcf1bb6b82c3960`; run `cargo test --locked --test recovery_partial_seal` at that revision to reproduce the refusal gap. + +The classifier now validates the available fixed fields of a recognized incomplete seal before returning `Truncated`. It preserves the exact `SegmentSealError` under `RecoverySegmentStageError::Seal`; assessment preserves that source. This is read-only slice classification, not a filesystem deletion experiment. The borrowed bytes are immutable by API construction; an equality assertion on the same untouched caller buffer would add no runtime evidence. + +The finite sweep mutates each version, flags, embedded length, reserved and algorithm byte with a specified independent expected error, then visits every recognized incomplete seal length. A mutation beyond the observed end must remain a typed truncation; an observed contradiction must yield the exact specified refusal. The inputs and order are deterministic and finite, with offset/observed-length replay coordinates on failure. This is a fixed-framing family sweep, not arbitrary-byte coverage or proof of full future completion feasibility. + +## Execution and current limits + +[Focused and adjacent recovery GREEN](partial-seal-corruption/recovery-green.txt) covers the new public laws and existing classification, assessment and discard laws in debug/release. [Framing validation](partial-seal-corruption/framing-green.txt) includes formatting, source structure, all-feature workspace/all-target Clippy and the new laws in debug/release. Commands execute in copied Linux Docker trees with Rust 1.96.0 and the committed lockfile; the laws are small, in-memory and deterministic. Per-test resource ceilings and denied-egress enforcement remain repository gaps, not claimed implemented controls. + +Receipt normalization replaces container source/target prefixes with `` and removes trailing spaces and redundant trailing blank lines; assertion diagnostics and outcomes are preserved. These receipts cover the implementation slice, not final acceptance. Stable-candidate full validation and independent exact-head review remain required before this PR is ready. No physical power-loss, actual unlink, allocation benchmark or complete recovery audit claim is made. + +## Permanent counterexample and parser exploration + +The regression is reduced to the empty-segment header, seal magic and unsupported version 2 in `tests/fixtures/recovery/unsupported-partial-seal-version.hex`. Removing the record and unused seal suffix preserves both public failures on main, as shown by the [reduced parent runtime RED](partial-seal-corruption/reduced-parent-runtime-red.txt). Earlier compiler/setup failures are excluded from this runtime receipt. The ordinary tests and deterministic fuzz-seed preparation both consume the retained input. + +The existing registered `segment_format` target adds selector 5 for the production recovery classifier. Its independent byte-table oracle requires every available fixed seal byte in a returned seal truncation to be canonical. The [fuzz parent RED](partial-seal-corruption/fuzz-parent-red.txt) records the version-byte assertion failing against main's classifier; this is a semantic oracle failure, not merely a parser crash. [Fuzz GREEN](partial-seal-corruption/fuzz-green.txt) records successful single-input replay followed by a seeded bounded campaign on the corrected implementation. Fuzz target Clippy and the instrumented target build also pass. + +Replay inside a copied Docker checkout with the pinned `nightly-2026-07-24` toolchain and `cargo-fuzz 0.13.2`: + +```sh +cargo xtask prepare-fuzz-corpus +cargo +nightly-2026-07-24 fuzz run segment_format fuzz/corpus/segment_format/recovery-unsupported-partial-seal-version -- -runs=1 -timeout=5 -rss_limit_mb=1024 +cargo +nightly-2026-07-24 fuzz run segment_format -- -seed=17101 -max_total_time=15 -timeout=5 -rss_limit_mb=1024 -max_len=1048576 +``` + +The seed and commands were recorded before launch. The campaign uses cargo-fuzz's instrumented release profile and address sanitizer, with libFuzzer timeout/RSS/input bounds; it does not establish exhaustive input coverage, an allocation benchmark, or isolation of every ambient dependency. The baseline replay used unchanged main production with only the new oracle/input copied in; the ordinary parent regression remains separately committed and reproducible. Future fuzz findings retain minimized reproducers through the repository's existing corpus workflow. + +## Direct assertion calibration and seed-count retirement + +The original parent RED establishes missing refusal, not the later exact diagnostic/source assertions. Review required additional direct calibration. These production mutations compile and reach their named runtime checks; [restored debug/release and Clippy](partial-seal-corruption/calibration-green.txt) pass after restoring source and invalidating timestamps. + +| Broken contract | Replay patch | Observed failure | +| --- | --- | --- | +| Diagnostic reports a false observed value | [wrong diagnostic](partial-seal-corruption/wrong-diagnostic.patch) | [Exact expected/observed error comparison](partial-seal-corruption/wrong-diagnostic-red.txt) | +| Error loses the original seal source | [dropped source](partial-seal-corruption/dropped-source.patch) | [Required typed cause becomes absent](partial-seal-corruption/dropped-source-red.txt) | +| Canonical incomplete seal reports the wrong observed length | [wrong coordinate](partial-seal-corruption/wrong-coordinate.patch) | [Unobserved mutation must retain exact truncation](partial-seal-corruption/wrong-coordinate-red.txt) | + +Apply one patch to a clean copied candidate, touch its changed Rust file, run `cargo test --locked --test recovery_partial_seal`, reverse only that patch, touch the restored file and rerun debug/release. The expected failures are assertion failures after compilation, not exit status alone. Patches do not belong in a committed production tree. + +The first full candidate run also encountered `seed_preparation_materializes_the_complete_deterministic_set`: it failed because adding recovery inputs changed its frozen cardinality. Those counts neither asserted Keep behavior nor established that any seed reached its parser. They are retired under the no-protected-contract deletion criterion. The replacement feeds the actual materialized recovery input to Keep's classifier and requires the precise seal refusal; repeated preparation still must preserve the complete emitted bytes. This is tool-to-runtime replay evidence, distinct from the small direct classifier law and the fuzz campaign. + +The emitted-input witness is calibrated with a [wrong selector](partial-seal-corruption/materialized-selector.patch), [missing named input](partial-seal-corruption/materialized-absent.patch), and the same wrong-diagnostic production patch above. The respective runtime RED receipts are [selector](partial-seal-corruption/materialized-selector-red.txt), [absent input](partial-seal-corruption/materialized-absent-red.txt), and [diagnostic](partial-seal-corruption/materialized-diagnostic-red.txt). Run `cargo test --locked --package xtask --bin xtask seed_preparation_preserves_a_replayable_recovery_counterexample` with each mutation separately. Earlier setup attempts selecting zero tests are excluded; the admitted receipts execute and fail the named law. + +After all three emitted-input mutations are removed, [restored materialization GREEN](partial-seal-corruption/materialized-green.txt) records the named law executing in debug/release, followed by workspace Clippy and source-structure validation. The remaining broad acceptance chain is rerun on the resulting stable candidate; the earlier full run's seed-count failure is not hidden or treated as a product regression. diff --git a/docs/testing-evidence/partial-seal-corruption/calibration-green.txt b/docs/testing-evidence/partial-seal-corruption/calibration-green.txt new file mode 100644 index 00000000..de05b2da --- /dev/null +++ b/docs/testing-evidence/partial-seal-corruption/calibration-green.txt @@ -0,0 +1,26 @@ + Compiling keep v0.0.0 () + Finished `test` profile [unoptimized + debuginfo] target(s) in 0.94s + Running tests/recovery_partial_seal.rs (/debug/deps/recovery_partial_seal-50cc4959e316d0ba) + +running 3 tests +test unsupported_partial_seal_version_refuses_classification ... ok +test unsupported_partial_seal_version_refuses_discard_assessment ... ok +test framing_laws::available_fixed_seal_contradictions_refuse_every_later_short_boundary ... ok + +test result: ok. 3 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.02s + + Compiling keep v0.0.0 () + Finished `release` profile [optimized] target(s) in 2.37s + Running tests/recovery_partial_seal.rs (/release/deps/recovery_partial_seal-6b9a4d5315d5b74a) + +running 3 tests +test unsupported_partial_seal_version_refuses_classification ... ok +test unsupported_partial_seal_version_refuses_discard_assessment ... ok +test framing_laws::available_fixed_seal_contradictions_refuse_every_later_short_boundary ... ok + +test result: ok. 3 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + + Checking keep v0.0.0 () + Checking xtask v0.0.0 (/xtask) + Checking keep-benchmark v0.0.0 (/benchmark) + Finished `dev` profile [unoptimized + debuginfo] target(s) in 2.65s diff --git a/docs/testing-evidence/partial-seal-corruption/dropped-source-red.txt b/docs/testing-evidence/partial-seal-corruption/dropped-source-red.txt new file mode 100644 index 00000000..a9011481 --- /dev/null +++ b/docs/testing-evidence/partial-seal-corruption/dropped-source-red.txt @@ -0,0 +1,42 @@ + Compiling keep v0.0.0 () + Finished `test` profile [unoptimized + debuginfo] target(s) in 0.91s + Running tests/recovery_partial_seal.rs (/debug/deps/recovery_partial_seal-50cc4959e316d0ba) + +running 3 tests +test unsupported_partial_seal_version_refuses_discard_assessment ... FAILED +test unsupported_partial_seal_version_refuses_classification ... FAILED +test framing_laws::available_fixed_seal_contradictions_refuse_every_later_short_boundary ... FAILED + +failures: + +---- unsupported_partial_seal_version_refuses_discard_assessment stdout ---- + +thread 'unsupported_partial_seal_version_refuses_discard_assessment' (1794097) panicked at tests/recovery_partial_seal.rs:45:5: +assertion `left == right` failed + left: None + right: Some(UnsupportedVersion { expected: 1, observed: 2 }) + +---- unsupported_partial_seal_version_refuses_classification stdout ---- + +thread 'unsupported_partial_seal_version_refuses_classification' (1794096) panicked at tests/recovery_partial_seal.rs:23:5: +assertion `left == right` failed + left: None + right: Some(UnsupportedVersion { expected: 1, observed: 2 }) +note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace + +---- framing_laws::available_fixed_seal_contradictions_refuse_every_later_short_boundary stdout ---- + +thread 'framing_laws::available_fixed_seal_contradictions_refuse_every_later_short_boundary' (1794095) panicked at tests/recovery_partial_seal/framing_laws.rs:41:17: +assertion `left == right` failed: offset=16, observed=17 + left: None + right: Some(UnsupportedVersion { expected: 1, observed: 257 }) + + +failures: + framing_laws::available_fixed_seal_contradictions_refuse_every_later_short_boundary + unsupported_partial_seal_version_refuses_classification + unsupported_partial_seal_version_refuses_discard_assessment + +test result: FAILED. 0 passed; 3 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + +error: test failed, to rerun pass `--test recovery_partial_seal` diff --git a/docs/testing-evidence/partial-seal-corruption/dropped-source.patch b/docs/testing-evidence/partial-seal-corruption/dropped-source.patch new file mode 100644 index 00000000..624f1951 --- /dev/null +++ b/docs/testing-evidence/partial-seal-corruption/dropped-source.patch @@ -0,0 +1,11 @@ +--- a/src/adapters/recovery/recovery_segment_stage_error.rs ++++ b/src/adapters/recovery/recovery_segment_stage_error.rs +@@ -75,7 +75,7 @@ + match self { + Self::Metadata { source } => Some(source), + Self::Header { source } => Some(source), +- Self::Seal { source } => Some(source), ++ Self::Seal { .. } => None, + Self::Record { source } | Self::Complete { source } => Some(source), + Self::AddressSpace { .. } => None, + } diff --git a/docs/testing-evidence/partial-seal-corruption/framing-green.txt b/docs/testing-evidence/partial-seal-corruption/framing-green.txt new file mode 100644 index 00000000..e24d810e --- /dev/null +++ b/docs/testing-evidence/partial-seal-corruption/framing-green.txt @@ -0,0 +1,25 @@ + Checking keep v0.0.0 () + Checking xtask v0.0.0 (/xtask) + Checking keep-benchmark v0.0.0 (/benchmark) + Finished `dev` profile [unoptimized + debuginfo] target(s) in 1.88s + Compiling keep v0.0.0 () + Finished `test` profile [unoptimized + debuginfo] target(s) in 0.32s + Running tests/recovery_partial_seal.rs (/debug/deps/recovery_partial_seal-50cc4959e316d0ba) + +running 3 tests +test unsupported_partial_seal_version_refuses_classification ... ok +test unsupported_partial_seal_version_refuses_discard_assessment ... ok +test framing_laws::available_fixed_seal_contradictions_refuse_every_later_short_boundary ... ok + +test result: ok. 3 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.02s + + Compiling keep v0.0.0 () + Finished `release` profile [optimized] target(s) in 0.23s + Running tests/recovery_partial_seal.rs (/release/deps/recovery_partial_seal-6b9a4d5315d5b74a) + +running 3 tests +test unsupported_partial_seal_version_refuses_classification ... ok +test unsupported_partial_seal_version_refuses_discard_assessment ... ok +test framing_laws::available_fixed_seal_contradictions_refuse_every_later_short_boundary ... ok + +test result: ok. 3 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s diff --git a/docs/testing-evidence/partial-seal-corruption/fuzz-green.txt b/docs/testing-evidence/partial-seal-corruption/fuzz-green.txt new file mode 100644 index 00000000..18b0945e --- /dev/null +++ b/docs/testing-evidence/partial-seal-corruption/fuzz-green.txt @@ -0,0 +1,708 @@ + Finished `release` profile [optimized + debuginfo] target(s) in 0.01s + Finished `release` profile [optimized + debuginfo] target(s) in 0.01s + Running `/aarch64-unknown-linux-gnu/release/segment_format -artifact_prefix=/fuzz/artifacts/segment_format/ -runs=1 -timeout=5 -rss_limit_mb=1024 fuzz/corpus/segment_format/recovery-unsupported-partial-seal-version` +INFO: Running with entropic power schedule (0xFF, 100). +INFO: Seed: 470667612 +INFO: Loaded 1 modules (68182 inline 8-bit counters): 68182 [0xaaaaae387100, 0xaaaaae397b56), +INFO: Loaded 1 PC tables (68182 PCs): 68182 [0xaaaaae397b58,0xaaaaae4a20b8), +/aarch64-unknown-linux-gnu/release/segment_format: Running 1 inputs 1 time(s) each. +Running: fuzz/corpus/segment_format/recovery-unsupported-partial-seal-version +Executed fuzz/corpus/segment_format/recovery-unsupported-partial-seal-version in 0 ms +*** +*** NOTE: fuzzing was not performed, you have only +*** executed the target code on a fixed set of inputs. +*** + Finished `release` profile [optimized + debuginfo] target(s) in 0.01s + Finished `release` profile [optimized + debuginfo] target(s) in 0.01s + Running `/aarch64-unknown-linux-gnu/release/segment_format -artifact_prefix=/fuzz/artifacts/segment_format/ -seed=17101 -max_total_time=15 -timeout=5 -rss_limit_mb=1024 -max_len=1048576 /fuzz/corpus/segment_format` +INFO: Running with entropic power schedule (0xFF, 100). +INFO: Seed: 17101 +INFO: Loaded 1 modules (68182 inline 8-bit counters): 68182 [0xaaaad3357100, 0xaaaad3367b56), +INFO: Loaded 1 PC tables (68182 PCs): 68182 [0xaaaad3367b58,0xaaaad34720b8), +INFO: 10 files found in /fuzz/corpus/segment_format +INFO: seed corpus: files: 10 min: 65b max: 702b total: 2364b rss: 36Mb +#11 INITED cov: 518 ft: 1061 corp: 10/2364b exec/s: 0 rss: 39Mb +#12 NEW cov: 522 ft: 1065 corp: 11/2657b lim: 702 exec/s: 0 rss: 39Mb L: 293/702 MS: 1 CrossOver- +#13 NEW cov: 525 ft: 1068 corp: 12/3359b lim: 702 exec/s: 0 rss: 39Mb L: 702/702 MS: 1 CrossOver- +#16 REDUCE cov: 525 ft: 1068 corp: 12/3274b lim: 702 exec/s: 0 rss: 39Mb L: 208/702 MS: 3 ShuffleBytes-ChangeASCIIInt-EraseBytes- +#17 NEW cov: 534 ft: 1077 corp: 13/3339b lim: 702 exec/s: 0 rss: 39Mb L: 65/702 MS: 1 CrossOver- +#18 NEW cov: 537 ft: 1080 corp: 14/3436b lim: 702 exec/s: 0 rss: 40Mb L: 97/702 MS: 1 EraseBytes- +#19 NEW cov: 543 ft: 1086 corp: 15/3501b lim: 702 exec/s: 0 rss: 40Mb L: 65/702 MS: 1 ChangeByte- +#20 NEW cov: 545 ft: 1088 corp: 16/3649b lim: 702 exec/s: 0 rss: 40Mb L: 148/702 MS: 1 CrossOver- +#21 NEW cov: 546 ft: 1089 corp: 17/4205b lim: 702 exec/s: 0 rss: 40Mb L: 556/702 MS: 1 CopyPart- +#37 NEW cov: 551 ft: 1094 corp: 18/4318b lim: 702 exec/s: 0 rss: 40Mb L: 113/702 MS: 1 ChangeBinInt- +#39 NEW cov: 553 ft: 1096 corp: 19/4384b lim: 702 exec/s: 0 rss: 40Mb L: 66/702 MS: 2 ShuffleBytes-InsertByte- +#45 NEW cov: 571 ft: 1220 corp: 20/4722b lim: 702 exec/s: 0 rss: 40Mb L: 338/702 MS: 1 ChangeBit- +#46 NEW cov: 572 ft: 1221 corp: 21/4916b lim: 702 exec/s: 0 rss: 40Mb L: 194/702 MS: 1 InsertByte- +#52 NEW cov: 578 ft: 1245 corp: 22/5618b lim: 702 exec/s: 0 rss: 40Mb L: 702/702 MS: 1 ChangeASCIIInt- +#60 REDUCE cov: 578 ft: 1245 corp: 22/5578b lim: 702 exec/s: 0 rss: 40Mb L: 57/702 MS: 3 CrossOver-ShuffleBytes-EraseBytes- +#61 NEW cov: 586 ft: 1254 corp: 23/5724b lim: 702 exec/s: 0 rss: 40Mb L: 146/702 MS: 1 ShuffleBytes- +#67 NEW cov: 594 ft: 1262 corp: 24/5870b lim: 702 exec/s: 0 rss: 40Mb L: 146/702 MS: 1 ChangeBit- +#68 NEW cov: 596 ft: 1264 corp: 25/6208b lim: 702 exec/s: 0 rss: 40Mb L: 338/702 MS: 1 ChangeASCIIInt- +#80 NEW cov: 597 ft: 1265 corp: 26/6355b lim: 702 exec/s: 0 rss: 40Mb L: 147/702 MS: 2 InsertByte-ChangeBinInt- +#81 REDUCE cov: 597 ft: 1265 corp: 26/6314b lim: 702 exec/s: 0 rss: 40Mb L: 167/702 MS: 1 EraseBytes- +#83 NEW cov: 599 ft: 1267 corp: 27/6379b lim: 702 exec/s: 0 rss: 40Mb L: 65/702 MS: 2 ChangeBinInt-ShuffleBytes- +#85 NEW cov: 600 ft: 1268 corp: 28/6719b lim: 702 exec/s: 0 rss: 40Mb L: 340/702 MS: 2 ShuffleBytes-CMP- DE: "\000\000"- +#86 NEW cov: 600 ft: 1314 corp: 29/7421b lim: 702 exec/s: 0 rss: 41Mb L: 702/702 MS: 1 ChangeByte- +#95 NEW cov: 604 ft: 1318 corp: 30/7665b lim: 702 exec/s: 0 rss: 41Mb L: 244/702 MS: 4 CopyPart-EraseBytes-ShuffleBytes-PersAutoDict- DE: "\000\000"- +#106 NEW cov: 605 ft: 1319 corp: 31/7748b lim: 702 exec/s: 0 rss: 41Mb L: 83/702 MS: 1 CopyPart- +#118 REDUCE cov: 605 ft: 1319 corp: 31/7730b lim: 702 exec/s: 0 rss: 41Mb L: 128/702 MS: 2 CopyPart-CrossOver- +#135 NEW cov: 606 ft: 1320 corp: 32/8072b lim: 702 exec/s: 0 rss: 41Mb L: 342/702 MS: 2 PersAutoDict-CMP- DE: "\000\000"-"\000\000\000\000\000\000\000\002"- +#167 NEW cov: 607 ft: 1321 corp: 33/8678b lim: 702 exec/s: 0 rss: 41Mb L: 606/702 MS: 2 EraseBytes-ChangeByte- +#198 NEW cov: 608 ft: 1322 corp: 34/8872b lim: 702 exec/s: 0 rss: 42Mb L: 194/702 MS: 1 ChangeBinInt- +#199 REDUCE cov: 608 ft: 1322 corp: 34/8812b lim: 702 exec/s: 0 rss: 42Mb L: 282/702 MS: 1 EraseBytes- +#204 REDUCE cov: 608 ft: 1322 corp: 34/8759b lim: 702 exec/s: 0 rss: 42Mb L: 503/702 MS: 5 CrossOver-PersAutoDict-ChangeBit-ChangeASCIIInt-EraseBytes- DE: "\000\000\000\000\000\000\000\002"- +#234 REDUCE cov: 608 ft: 1322 corp: 34/8700b lim: 702 exec/s: 0 rss: 42Mb L: 223/702 MS: 5 ChangeByte-ShuffleBytes-ChangeBinInt-ShuffleBytes-EraseBytes- +#247 REDUCE cov: 608 ft: 1322 corp: 34/8645b lim: 702 exec/s: 0 rss: 42Mb L: 283/702 MS: 3 InsertByte-CMP-CrossOver- DE: "\377\377\377\377\377\377\377G"- +#253 NEW cov: 610 ft: 1324 corp: 35/8838b lim: 702 exec/s: 0 rss: 42Mb L: 193/702 MS: 1 ChangeByte- +#254 NEW cov: 612 ft: 1326 corp: 36/9031b lim: 702 exec/s: 0 rss: 42Mb L: 193/702 MS: 1 ChangeBinInt- +#270 NEW cov: 619 ft: 1333 corp: 37/9094b lim: 702 exec/s: 0 rss: 42Mb L: 63/702 MS: 1 EraseBytes- +#296 NEW cov: 620 ft: 1334 corp: 38/9177b lim: 702 exec/s: 0 rss: 43Mb L: 83/702 MS: 1 ChangeBit- +#305 NEW cov: 622 ft: 1336 corp: 39/9336b lim: 702 exec/s: 0 rss: 43Mb L: 159/702 MS: 4 ChangeBit-PersAutoDict-ChangeByte-InsertRepeatedBytes- DE: "\000\000\000\000\000\000\000\002"- +#313 REDUCE cov: 622 ft: 1336 corp: 39/9333b lim: 702 exec/s: 0 rss: 43Mb L: 220/702 MS: 3 InsertByte-CrossOver-EraseBytes- +#355 NEW cov: 623 ft: 1337 corp: 40/10035b lim: 702 exec/s: 0 rss: 43Mb L: 702/702 MS: 2 CrossOver-ChangeByte- +#356 NEW cov: 624 ft: 1338 corp: 41/10098b lim: 702 exec/s: 0 rss: 43Mb L: 63/702 MS: 1 EraseBytes- +#357 NEW cov: 625 ft: 1339 corp: 42/10211b lim: 702 exec/s: 0 rss: 43Mb L: 113/702 MS: 1 ChangeBit- +#369 NEW cov: 627 ft: 1341 corp: 43/10343b lim: 702 exec/s: 0 rss: 43Mb L: 132/702 MS: 2 ChangeBinInt-EraseBytes- +#372 NEW cov: 628 ft: 1342 corp: 44/10682b lim: 702 exec/s: 0 rss: 43Mb L: 339/702 MS: 3 ShuffleBytes-ChangeBinInt-InsertByte- +#373 NEW cov: 629 ft: 1344 corp: 45/10805b lim: 702 exec/s: 0 rss: 43Mb L: 123/702 MS: 1 EraseBytes- +#424 NEW cov: 630 ft: 1345 corp: 46/10857b lim: 702 exec/s: 0 rss: 44Mb L: 52/702 MS: 1 EraseBytes- +#430 NEW cov: 631 ft: 1346 corp: 47/10920b lim: 702 exec/s: 0 rss: 44Mb L: 63/702 MS: 1 ChangeBit- +#441 NEW cov: 631 ft: 1347 corp: 48/11114b lim: 702 exec/s: 0 rss: 44Mb L: 194/702 MS: 1 InsertByte- +#463 REDUCE cov: 631 ft: 1347 corp: 48/11102b lim: 702 exec/s: 0 rss: 44Mb L: 45/702 MS: 2 ChangeBit-EraseBytes- +#469 NEW cov: 638 ft: 1354 corp: 49/11465b lim: 702 exec/s: 0 rss: 44Mb L: 363/702 MS: 1 CopyPart- +#478 REDUCE cov: 638 ft: 1354 corp: 49/11458b lim: 702 exec/s: 0 rss: 44Mb L: 59/702 MS: 4 ShuffleBytes-ChangeBit-CrossOver-EraseBytes- +#489 NEW cov: 639 ft: 1355 corp: 50/12160b lim: 702 exec/s: 0 rss: 44Mb L: 702/702 MS: 1 ChangeBinInt- +#495 NEW cov: 640 ft: 1356 corp: 51/12292b lim: 702 exec/s: 0 rss: 44Mb L: 132/702 MS: 1 EraseBytes- +#506 NEW cov: 641 ft: 1357 corp: 52/12403b lim: 702 exec/s: 0 rss: 44Mb L: 111/702 MS: 1 EraseBytes- +#532 NEW cov: 642 ft: 1397 corp: 53/13105b lim: 702 exec/s: 0 rss: 44Mb L: 702/702 MS: 1 ChangeByte- +#553 NEW cov: 643 ft: 1398 corp: 54/13807b lim: 702 exec/s: 0 rss: 44Mb L: 702/702 MS: 1 CopyPart- +#555 NEW cov: 645 ft: 1400 corp: 55/14145b lim: 702 exec/s: 0 rss: 44Mb L: 338/702 MS: 2 ShuffleBytes-ChangeASCIIInt- +#565 NEW cov: 646 ft: 1401 corp: 56/14440b lim: 702 exec/s: 0 rss: 44Mb L: 295/702 MS: 5 EraseBytes-ChangeBinInt-ChangeBit-InsertRepeatedBytes-EraseBytes- +#573 NEW cov: 647 ft: 1402 corp: 57/14633b lim: 702 exec/s: 0 rss: 44Mb L: 193/702 MS: 3 ShuffleBytes-CopyPart-PersAutoDict- DE: "\377\377\377\377\377\377\377G"- +#614 NEW cov: 648 ft: 1403 corp: 58/14696b lim: 702 exec/s: 0 rss: 45Mb L: 63/702 MS: 1 PersAutoDict- DE: "\377\377\377\377\377\377\377G"- +#730 NEW cov: 648 ft: 1405 corp: 59/14842b lim: 702 exec/s: 0 rss: 45Mb L: 146/702 MS: 1 ChangeBinInt- +#792 REDUCE cov: 648 ft: 1405 corp: 59/14709b lim: 702 exec/s: 0 rss: 45Mb L: 569/702 MS: 2 ShuffleBytes-EraseBytes- +#844 NEW cov: 649 ft: 1406 corp: 60/14904b lim: 702 exec/s: 0 rss: 45Mb L: 195/702 MS: 2 EraseBytes-InsertRepeatedBytes- +#850 NEW cov: 650 ft: 1407 corp: 61/14997b lim: 702 exec/s: 0 rss: 45Mb L: 93/702 MS: 1 InsertRepeatedBytes- +#866 NEW cov: 651 ft: 1408 corp: 62/15699b lim: 702 exec/s: 0 rss: 45Mb L: 702/702 MS: 1 ChangeBinInt- +#874 NEW cov: 654 ft: 1411 corp: 63/16024b lim: 702 exec/s: 0 rss: 45Mb L: 325/702 MS: 3 CrossOver-CrossOver-ChangeBinInt- +#875 REDUCE cov: 654 ft: 1411 corp: 63/15946b lim: 702 exec/s: 0 rss: 45Mb L: 81/702 MS: 1 EraseBytes- +#881 REDUCE cov: 654 ft: 1411 corp: 63/15920b lim: 702 exec/s: 0 rss: 45Mb L: 67/702 MS: 1 EraseBytes- +#900 REDUCE cov: 654 ft: 1411 corp: 63/15909b lim: 702 exec/s: 0 rss: 46Mb L: 48/702 MS: 4 ChangeBit-CrossOver-ShuffleBytes-EraseBytes- +#916 NEW cov: 655 ft: 1412 corp: 64/16102b lim: 702 exec/s: 0 rss: 46Mb L: 193/702 MS: 1 EraseBytes- +#944 REDUCE cov: 655 ft: 1412 corp: 64/16099b lim: 702 exec/s: 0 rss: 46Mb L: 603/702 MS: 3 ShuffleBytes-ChangeBit-EraseBytes- +#974 REDUCE cov: 655 ft: 1412 corp: 64/16086b lim: 702 exec/s: 0 rss: 46Mb L: 135/702 MS: 5 CMP-ChangeBit-InsertByte-ChangeBit-EraseBytes- DE: "\000\000\000\000\000\000\000\300"- +#985 REDUCE cov: 655 ft: 1412 corp: 64/16058b lim: 702 exec/s: 0 rss: 46Mb L: 37/702 MS: 1 EraseBytes- +#1087 REDUCE cov: 655 ft: 1412 corp: 64/16033b lim: 702 exec/s: 0 rss: 46Mb L: 56/702 MS: 2 InsertByte-EraseBytes- +#1136 REDUCE cov: 655 ft: 1412 corp: 64/16028b lim: 702 exec/s: 0 rss: 46Mb L: 278/702 MS: 4 EraseBytes-CMP-CrossOver-CopyPart- DE: "\304\230\251\303\314$\024)&\205}w\217\356\177\326\"\270\2603\0221\212#`\246\213\343F\021h\326"- +#1157 NEW cov: 656 ft: 1413 corp: 65/16091b lim: 702 exec/s: 0 rss: 46Mb L: 63/702 MS: 1 CopyPart- +#1168 REDUCE cov: 656 ft: 1413 corp: 65/15878b lim: 702 exec/s: 0 rss: 46Mb L: 489/702 MS: 1 EraseBytes- +#1188 REDUCE cov: 656 ft: 1413 corp: 65/15864b lim: 702 exec/s: 0 rss: 46Mb L: 230/702 MS: 5 CMP-ShuffleBytes-ChangeBinInt-ChangeByte-CrossOver- DE: "\377\377\377\377"- +#1229 NEW cov: 657 ft: 1414 corp: 66/15977b lim: 702 exec/s: 0 rss: 46Mb L: 113/702 MS: 1 ChangeByte- +#1256 NEW cov: 662 ft: 1420 corp: 67/16Kb lim: 702 exec/s: 0 rss: 47Mb L: 702/702 MS: 2 ShuffleBytes-CopyPart- +#1262 NEW cov: 665 ft: 1423 corp: 68/16Kb lim: 702 exec/s: 0 rss: 47Mb L: 194/702 MS: 1 InsertRepeatedBytes- +#1264 NEW cov: 666 ft: 1424 corp: 69/16Kb lim: 702 exec/s: 0 rss: 47Mb L: 113/702 MS: 2 ShuffleBytes-CrossOver- +#1265 REDUCE cov: 666 ft: 1424 corp: 69/16Kb lim: 702 exec/s: 0 rss: 47Mb L: 39/702 MS: 1 EraseBytes- +#1266 NEW cov: 667 ft: 1425 corp: 70/16Kb lim: 702 exec/s: 0 rss: 47Mb L: 193/702 MS: 1 CopyPart- +#1309 NEW cov: 678 ft: 1436 corp: 71/16Kb lim: 702 exec/s: 0 rss: 47Mb L: 153/702 MS: 3 EraseBytes-ChangeBit-InsertByte- +#1310 NEW cov: 679 ft: 1437 corp: 72/17Kb lim: 702 exec/s: 0 rss: 47Mb L: 702/702 MS: 1 ChangeBinInt- +#1469 REDUCE cov: 679 ft: 1437 corp: 72/17Kb lim: 702 exec/s: 0 rss: 47Mb L: 241/702 MS: 4 InsertByte-ChangeByte-PersAutoDict-EraseBytes- DE: "\000\000\000\000\000\000\000\300"- +#1470 REDUCE cov: 679 ft: 1437 corp: 72/17Kb lim: 702 exec/s: 0 rss: 47Mb L: 38/702 MS: 1 EraseBytes- +#1476 REDUCE cov: 679 ft: 1437 corp: 72/17Kb lim: 702 exec/s: 0 rss: 47Mb L: 77/702 MS: 1 EraseBytes- +#1488 REDUCE cov: 679 ft: 1437 corp: 72/17Kb lim: 702 exec/s: 0 rss: 47Mb L: 29/702 MS: 2 ShuffleBytes-EraseBytes- +#1489 REDUCE cov: 679 ft: 1437 corp: 72/17Kb lim: 702 exec/s: 0 rss: 47Mb L: 117/702 MS: 1 EraseBytes- +#1554 REDUCE cov: 679 ft: 1437 corp: 72/17Kb lim: 702 exec/s: 0 rss: 47Mb L: 140/702 MS: 5 ChangeBinInt-CMP-ChangeBit-EraseBytes-InsertRepeatedBytes- DE: "\226\232\260\206\212\266;\300\242$$\210;\255\244\222\013\253\333P\001\037\261\213\261zBu\275X\362B"- +#1590 REDUCE cov: 679 ft: 1437 corp: 72/17Kb lim: 702 exec/s: 0 rss: 47Mb L: 162/702 MS: 1 EraseBytes- +#1602 REDUCE cov: 679 ft: 1437 corp: 72/17Kb lim: 702 exec/s: 0 rss: 47Mb L: 47/702 MS: 2 CMP-EraseBytes- DE: "F\032\334@a\371\346\\p\371\344\270\375\333\203\363\260\200\254u\207\251`\274\012\363\330\017<\211G\227"- +#1703 REDUCE cov: 679 ft: 1437 corp: 72/17Kb lim: 702 exec/s: 0 rss: 47Mb L: 34/702 MS: 1 EraseBytes- +#1705 REDUCE cov: 679 ft: 1437 corp: 72/17Kb lim: 702 exec/s: 0 rss: 47Mb L: 24/702 MS: 2 ChangeByte-EraseBytes- +#1751 REDUCE cov: 679 ft: 1437 corp: 72/17Kb lim: 702 exec/s: 0 rss: 48Mb L: 105/702 MS: 1 EraseBytes- +#1777 NEW cov: 695 ft: 1453 corp: 73/17Kb lim: 702 exec/s: 0 rss: 48Mb L: 116/702 MS: 1 EraseBytes- +#1792 NEW cov: 696 ft: 1454 corp: 74/17Kb lim: 702 exec/s: 0 rss: 48Mb L: 45/702 MS: 5 InsertByte-ChangeBit-InsertByte-ChangeBit-EraseBytes- +#1795 REDUCE cov: 696 ft: 1454 corp: 74/17Kb lim: 702 exec/s: 0 rss: 48Mb L: 129/702 MS: 3 ChangeBinInt-ChangeASCIIInt-EraseBytes- +#1846 REDUCE cov: 696 ft: 1454 corp: 74/17Kb lim: 702 exec/s: 0 rss: 48Mb L: 22/702 MS: 1 EraseBytes- +#1879 REDUCE cov: 696 ft: 1454 corp: 74/17Kb lim: 702 exec/s: 0 rss: 48Mb L: 43/702 MS: 3 InsertByte-CopyPart-EraseBytes- +#1937 NEW cov: 697 ft: 1455 corp: 75/17Kb lim: 702 exec/s: 0 rss: 48Mb L: 338/702 MS: 3 ShuffleBytes-CrossOver-ChangeByte- +#1946 REDUCE cov: 698 ft: 1456 corp: 76/18Kb lim: 702 exec/s: 0 rss: 48Mb L: 134/702 MS: 4 InsertByte-ShuffleBytes-EraseBytes-CopyPart- +#2017 NEW cov: 699 ft: 1457 corp: 77/18Kb lim: 702 exec/s: 0 rss: 48Mb L: 63/702 MS: 1 ShuffleBytes- +#2052 REDUCE cov: 699 ft: 1457 corp: 77/18Kb lim: 702 exec/s: 0 rss: 48Mb L: 109/702 MS: 5 ChangeBit-ChangeBinInt-ShuffleBytes-ChangeBit-EraseBytes- +#2063 REDUCE cov: 699 ft: 1457 corp: 77/18Kb lim: 702 exec/s: 0 rss: 48Mb L: 288/702 MS: 1 EraseBytes- +#2114 NEW cov: 700 ft: 1458 corp: 78/18Kb lim: 702 exec/s: 0 rss: 48Mb L: 338/702 MS: 1 ChangeByte- +#2195 NEW cov: 701 ft: 1459 corp: 79/18Kb lim: 702 exec/s: 0 rss: 48Mb L: 338/702 MS: 1 ChangeBinInt- +#2259 REDUCE cov: 701 ft: 1459 corp: 79/18Kb lim: 702 exec/s: 0 rss: 48Mb L: 201/702 MS: 4 ChangeBit-InsertRepeatedBytes-PersAutoDict-EraseBytes- DE: "\000\000"- +#2310 NEW cov: 702 ft: 1460 corp: 80/19Kb lim: 702 exec/s: 0 rss: 48Mb L: 702/702 MS: 1 ChangeByte- +#2318 NEW cov: 703 ft: 1461 corp: 81/19Kb lim: 702 exec/s: 0 rss: 48Mb L: 55/702 MS: 3 CopyPart-InsertByte-EraseBytes- +#2340 REDUCE cov: 703 ft: 1461 corp: 81/19Kb lim: 702 exec/s: 0 rss: 49Mb L: 271/702 MS: 2 CMP-EraseBytes- DE: "\000\000\000\000\000\000\000\000"- +#2416 NEW cov: 704 ft: 1462 corp: 82/19Kb lim: 702 exec/s: 0 rss: 49Mb L: 137/702 MS: 1 EraseBytes- +#2437 REDUCE cov: 704 ft: 1462 corp: 82/19Kb lim: 702 exec/s: 0 rss: 49Mb L: 23/702 MS: 1 EraseBytes- +#2439 REDUCE cov: 704 ft: 1462 corp: 82/19Kb lim: 702 exec/s: 0 rss: 49Mb L: 218/702 MS: 2 ChangeBit-EraseBytes- +#2525 NEW cov: 705 ft: 1463 corp: 83/19Kb lim: 702 exec/s: 0 rss: 49Mb L: 63/702 MS: 1 CopyPart- +#2551 REDUCE cov: 705 ft: 1463 corp: 83/19Kb lim: 702 exec/s: 0 rss: 49Mb L: 53/702 MS: 1 EraseBytes- +#2597 REDUCE cov: 705 ft: 1463 corp: 83/19Kb lim: 702 exec/s: 0 rss: 49Mb L: 80/702 MS: 1 EraseBytes- +#2604 REDUCE cov: 705 ft: 1463 corp: 83/19Kb lim: 702 exec/s: 0 rss: 49Mb L: 43/702 MS: 2 ShuffleBytes-EraseBytes- +#2614 REDUCE cov: 705 ft: 1463 corp: 83/19Kb lim: 702 exec/s: 0 rss: 49Mb L: 350/702 MS: 5 ChangeByte-ChangeBinInt-ChangeByte-ShuffleBytes-EraseBytes- +#2621 NEW cov: 706 ft: 1464 corp: 84/19Kb lim: 702 exec/s: 0 rss: 49Mb L: 175/702 MS: 2 InsertByte-EraseBytes- +#2644 REDUCE cov: 706 ft: 1464 corp: 84/19Kb lim: 702 exec/s: 0 rss: 49Mb L: 228/702 MS: 3 CrossOver-PersAutoDict-EraseBytes- DE: "\000\000"- +#2675 REDUCE cov: 706 ft: 1464 corp: 84/19Kb lim: 702 exec/s: 0 rss: 49Mb L: 32/702 MS: 1 EraseBytes- +#2826 REDUCE cov: 706 ft: 1464 corp: 84/19Kb lim: 702 exec/s: 0 rss: 49Mb L: 20/702 MS: 1 EraseBytes- +#2894 REDUCE cov: 706 ft: 1464 corp: 84/19Kb lim: 702 exec/s: 0 rss: 49Mb L: 62/702 MS: 3 ShuffleBytes-PersAutoDict-EraseBytes- DE: "\304\230\251\303\314$\024)&\205}w\217\356\177\326\"\270\2603\0221\212#`\246\213\343F\021h\326"- +#2948 REDUCE cov: 706 ft: 1464 corp: 84/19Kb lim: 702 exec/s: 0 rss: 49Mb L: 18/702 MS: 4 InsertRepeatedBytes-EraseBytes-ChangeBinInt-EraseBytes- +#3175 REDUCE cov: 706 ft: 1464 corp: 84/19Kb lim: 702 exec/s: 0 rss: 49Mb L: 16/702 MS: 2 CMP-EraseBytes- DE: "\001\000\000\000"- +#3241 REDUCE cov: 706 ft: 1464 corp: 84/19Kb lim: 702 exec/s: 0 rss: 49Mb L: 227/702 MS: 1 EraseBytes- +#3434 REDUCE cov: 706 ft: 1464 corp: 84/19Kb lim: 702 exec/s: 0 rss: 50Mb L: 33/702 MS: 3 PersAutoDict-ChangeBinInt-EraseBytes- DE: "\377\377\377\377"- +#3443 REDUCE cov: 706 ft: 1464 corp: 84/19Kb lim: 702 exec/s: 0 rss: 50Mb L: 26/702 MS: 4 InsertByte-CopyPart-ChangeASCIIInt-EraseBytes- +#3445 REDUCE cov: 706 ft: 1464 corp: 84/19Kb lim: 702 exec/s: 0 rss: 50Mb L: 16/702 MS: 2 ShuffleBytes-EraseBytes- +#3446 NEW cov: 707 ft: 1465 corp: 85/19Kb lim: 702 exec/s: 0 rss: 50Mb L: 144/702 MS: 1 EraseBytes- +#3619 NEW cov: 708 ft: 1466 corp: 86/19Kb lim: 702 exec/s: 0 rss: 50Mb L: 234/702 MS: 3 ChangeASCIIInt-ChangeByte-CrossOver- +#3647 NEW cov: 709 ft: 1467 corp: 87/19Kb lim: 702 exec/s: 0 rss: 50Mb L: 64/702 MS: 3 CrossOver-CopyPart-ChangeByte- +#3683 NEW cov: 710 ft: 1468 corp: 88/19Kb lim: 702 exec/s: 0 rss: 50Mb L: 113/702 MS: 1 ChangeBinInt- +#3721 REDUCE cov: 710 ft: 1468 corp: 88/19Kb lim: 702 exec/s: 0 rss: 50Mb L: 12/702 MS: 3 InsertByte-CopyPart-EraseBytes- +#3757 REDUCE cov: 710 ft: 1468 corp: 88/19Kb lim: 702 exec/s: 0 rss: 50Mb L: 134/702 MS: 1 EraseBytes- +#3829 REDUCE cov: 710 ft: 1468 corp: 88/19Kb lim: 702 exec/s: 0 rss: 50Mb L: 136/702 MS: 2 ChangeByte-EraseBytes- +#3845 REDUCE cov: 710 ft: 1468 corp: 88/19Kb lim: 702 exec/s: 0 rss: 50Mb L: 460/702 MS: 1 EraseBytes- +#3862 REDUCE cov: 710 ft: 1468 corp: 88/19Kb lim: 702 exec/s: 0 rss: 50Mb L: 122/702 MS: 2 ShuffleBytes-CrossOver- +#3879 NEW cov: 712 ft: 1470 corp: 89/19Kb lim: 702 exec/s: 0 rss: 50Mb L: 129/702 MS: 2 CrossOver-EraseBytes- +#3883 REDUCE cov: 713 ft: 1471 corp: 90/19Kb lim: 702 exec/s: 0 rss: 50Mb L: 5/702 MS: 4 ChangeByte-ChangeBinInt-ChangeASCIIInt-CrossOver- +#3934 NEW cov: 714 ft: 1472 corp: 91/20Kb lim: 702 exec/s: 0 rss: 50Mb L: 702/702 MS: 1 CrossOver- +#3960 NEW cov: 715 ft: 1473 corp: 92/20Kb lim: 702 exec/s: 0 rss: 50Mb L: 56/702 MS: 1 EraseBytes- +#3971 REDUCE cov: 715 ft: 1473 corp: 92/20Kb lim: 702 exec/s: 0 rss: 50Mb L: 38/702 MS: 1 EraseBytes- +#4254 REDUCE cov: 715 ft: 1473 corp: 92/20Kb lim: 702 exec/s: 0 rss: 51Mb L: 156/702 MS: 3 InsertByte-ChangeByte-EraseBytes- +#4260 REDUCE cov: 715 ft: 1473 corp: 92/20Kb lim: 702 exec/s: 0 rss: 51Mb L: 193/702 MS: 1 EraseBytes- +#4498 REDUCE cov: 716 ft: 1474 corp: 93/20Kb lim: 702 exec/s: 0 rss: 51Mb L: 461/702 MS: 3 InsertByte-ChangeBit-CopyPart- +#4557 REDUCE cov: 716 ft: 1474 corp: 93/20Kb lim: 702 exec/s: 0 rss: 51Mb L: 533/702 MS: 4 CrossOver-CrossOver-ShuffleBytes-EraseBytes- +#4564 REDUCE cov: 716 ft: 1474 corp: 93/20Kb lim: 702 exec/s: 0 rss: 51Mb L: 7/702 MS: 2 ChangeByte-CrossOver- +#4680 REDUCE cov: 716 ft: 1474 corp: 93/20Kb lim: 702 exec/s: 0 rss: 51Mb L: 68/702 MS: 1 EraseBytes- +#4874 REDUCE cov: 716 ft: 1474 corp: 93/20Kb lim: 702 exec/s: 0 rss: 51Mb L: 119/702 MS: 4 CopyPart-ShuffleBytes-ChangeByte-EraseBytes- +#5010 NEW cov: 717 ft: 1475 corp: 94/20Kb lim: 702 exec/s: 0 rss: 51Mb L: 193/702 MS: 1 ChangeBit- +#5259 REDUCE cov: 717 ft: 1475 corp: 94/20Kb lim: 702 exec/s: 0 rss: 52Mb L: 245/702 MS: 4 ChangeBit-ChangeBinInt-ShuffleBytes-EraseBytes- +#5318 REDUCE cov: 717 ft: 1475 corp: 94/20Kb lim: 702 exec/s: 0 rss: 52Mb L: 21/702 MS: 4 ChangeByte-ChangeBit-PersAutoDict-EraseBytes- DE: "\001\000\000\000"- +#5344 REDUCE cov: 717 ft: 1475 corp: 94/20Kb lim: 702 exec/s: 0 rss: 52Mb L: 488/702 MS: 1 EraseBytes- +#5367 REDUCE cov: 717 ft: 1475 corp: 94/20Kb lim: 702 exec/s: 0 rss: 52Mb L: 121/702 MS: 3 CopyPart-ChangeBit-EraseBytes- +#5412 REDUCE cov: 717 ft: 1475 corp: 94/20Kb lim: 702 exec/s: 0 rss: 52Mb L: 24/702 MS: 5 ChangeBinInt-CopyPart-ChangeBit-CopyPart-EraseBytes- +#5443 NEW cov: 718 ft: 1476 corp: 95/20Kb lim: 702 exec/s: 0 rss: 52Mb L: 124/702 MS: 1 EraseBytes- +#5525 NEW cov: 720 ft: 1478 corp: 96/20Kb lim: 702 exec/s: 0 rss: 52Mb L: 121/702 MS: 2 ChangeBit-EraseBytes- +#5606 REDUCE cov: 720 ft: 1478 corp: 96/20Kb lim: 702 exec/s: 0 rss: 52Mb L: 13/702 MS: 1 EraseBytes- +#5737 NEW cov: 721 ft: 1479 corp: 97/20Kb lim: 702 exec/s: 0 rss: 52Mb L: 193/702 MS: 1 CrossOver- +#5868 REDUCE cov: 721 ft: 1479 corp: 97/20Kb lim: 702 exec/s: 0 rss: 52Mb L: 25/702 MS: 1 EraseBytes- +#6020 REDUCE cov: 721 ft: 1479 corp: 97/20Kb lim: 702 exec/s: 0 rss: 52Mb L: 207/702 MS: 2 CrossOver-EraseBytes- +#6061 NEW cov: 722 ft: 1480 corp: 98/20Kb lim: 702 exec/s: 0 rss: 52Mb L: 338/702 MS: 1 ChangeBit- +#6233 REDUCE cov: 722 ft: 1480 corp: 98/20Kb lim: 702 exec/s: 0 rss: 52Mb L: 120/702 MS: 2 CrossOver-EraseBytes- +#6244 NEW cov: 723 ft: 1481 corp: 99/21Kb lim: 702 exec/s: 0 rss: 52Mb L: 129/702 MS: 1 PersAutoDict- DE: "\000\000"- +#6289 NEW cov: 724 ft: 1482 corp: 100/21Kb lim: 702 exec/s: 0 rss: 53Mb L: 274/702 MS: 5 PersAutoDict-CrossOver-CMP-EraseBytes-CrossOver- DE: "\000\000\000\000\000\000\000\002"-"\377\377\377\377"- +#6535 REDUCE cov: 724 ft: 1482 corp: 100/21Kb lim: 702 exec/s: 0 rss: 53Mb L: 233/702 MS: 1 EraseBytes- +#6576 NEW cov: 725 ft: 1483 corp: 101/21Kb lim: 702 exec/s: 0 rss: 53Mb L: 702/702 MS: 1 ChangeByte- +#7117 NEW cov: 726 ft: 1484 corp: 102/22Kb lim: 702 exec/s: 0 rss: 53Mb L: 338/702 MS: 1 ChangeBit- +#7146 REDUCE cov: 726 ft: 1484 corp: 102/21Kb lim: 702 exec/s: 0 rss: 53Mb L: 378/702 MS: 4 CMP-PersAutoDict-ChangeByte-EraseBytes- DE: "\000\000\000\000\000\000\000\002"-"\001\000\000\000"- +#7468 REDUCE cov: 726 ft: 1484 corp: 102/21Kb lim: 702 exec/s: 0 rss: 53Mb L: 3/702 MS: 2 CopyPart-EraseBytes- +#7917 REDUCE cov: 726 ft: 1484 corp: 102/21Kb lim: 702 exec/s: 0 rss: 54Mb L: 337/702 MS: 4 ChangeASCIIInt-ChangeByte-ChangeBit-EraseBytes- +#7924 NEW cov: 727 ft: 1485 corp: 103/21Kb lim: 702 exec/s: 0 rss: 54Mb L: 94/702 MS: 2 EraseBytes-ChangeBinInt- +#8041 REDUCE cov: 727 ft: 1485 corp: 103/21Kb lim: 702 exec/s: 0 rss: 54Mb L: 188/702 MS: 2 ShuffleBytes-EraseBytes- +#8056 REDUCE cov: 727 ft: 1485 corp: 103/21Kb lim: 702 exec/s: 0 rss: 54Mb L: 196/702 MS: 5 CrossOver-CopyPart-ChangeBinInt-InsertByte-EraseBytes- +#8192 REDUCE cov: 727 ft: 1485 corp: 103/21Kb lim: 702 exec/s: 0 rss: 54Mb L: 15/702 MS: 1 EraseBytes- +#8343 REDUCE cov: 727 ft: 1485 corp: 103/21Kb lim: 702 exec/s: 0 rss: 54Mb L: 52/702 MS: 1 EraseBytes- +#8396 REDUCE cov: 727 ft: 1485 corp: 103/21Kb lim: 702 exec/s: 0 rss: 54Mb L: 10/702 MS: 3 ChangeBinInt-PersAutoDict-EraseBytes- DE: "\000\000\000\000\000\000\000\000"- +#8455 REDUCE cov: 727 ft: 1485 corp: 103/21Kb lim: 702 exec/s: 0 rss: 54Mb L: 116/702 MS: 4 CopyPart-InsertByte-InsertRepeatedBytes-EraseBytes- +#8552 NEW cov: 728 ft: 1486 corp: 104/21Kb lim: 702 exec/s: 0 rss: 54Mb L: 193/702 MS: 2 ChangeASCIIInt-CMP- DE: "\000\000\000\000"- +#8696 REDUCE cov: 728 ft: 1486 corp: 104/21Kb lim: 702 exec/s: 0 rss: 54Mb L: 285/702 MS: 4 CopyPart-CMP-InsertRepeatedBytes-EraseBytes- DE: "\276\313F\263Q r2\020y\212G\342aD\270!M^\246](\200n\013\251A\322\252f\273\365"- +#8762 REDUCE cov: 728 ft: 1486 corp: 104/21Kb lim: 702 exec/s: 0 rss: 54Mb L: 145/702 MS: 1 EraseBytes- +#8773 REDUCE cov: 728 ft: 1486 corp: 104/21Kb lim: 702 exec/s: 0 rss: 54Mb L: 267/702 MS: 1 EraseBytes- +#8849 REDUCE cov: 728 ft: 1486 corp: 104/21Kb lim: 702 exec/s: 0 rss: 55Mb L: 12/702 MS: 1 EraseBytes- +#8905 REDUCE cov: 728 ft: 1486 corp: 104/21Kb lim: 702 exec/s: 0 rss: 55Mb L: 311/702 MS: 1 EraseBytes- +#9151 REDUCE cov: 728 ft: 1486 corp: 104/21Kb lim: 702 exec/s: 0 rss: 55Mb L: 248/702 MS: 1 EraseBytes- +#9242 REDUCE cov: 728 ft: 1486 corp: 104/21Kb lim: 702 exec/s: 0 rss: 55Mb L: 8/702 MS: 1 EraseBytes- +#9268 REDUCE cov: 728 ft: 1486 corp: 104/21Kb lim: 702 exec/s: 0 rss: 55Mb L: 7/702 MS: 1 EraseBytes- +#9490 REDUCE cov: 728 ft: 1486 corp: 104/21Kb lim: 702 exec/s: 0 rss: 55Mb L: 11/702 MS: 2 ChangeBinInt-EraseBytes- +#9595 REDUCE cov: 728 ft: 1486 corp: 104/21Kb lim: 702 exec/s: 0 rss: 55Mb L: 154/702 MS: 5 InsertRepeatedBytes-ChangeBit-ShuffleBytes-InsertRepeatedBytes-EraseBytes- +#10032 REDUCE cov: 731 ft: 1489 corp: 105/21Kb lim: 702 exec/s: 0 rss: 55Mb L: 10/702 MS: 2 InsertByte-CrossOver- +#10048 REDUCE cov: 731 ft: 1489 corp: 105/21Kb lim: 702 exec/s: 0 rss: 55Mb L: 2/702 MS: 1 EraseBytes- +#10256 REDUCE cov: 731 ft: 1489 corp: 105/21Kb lim: 702 exec/s: 0 rss: 55Mb L: 193/702 MS: 3 PersAutoDict-ChangeBinInt-EraseBytes- DE: "F\032\334@a\371\346\\p\371\344\270\375\333\203\363\260\200\254u\207\251`\274\012\363\330\017<\211G\227"- +#10347 REDUCE cov: 731 ft: 1489 corp: 105/21Kb lim: 702 exec/s: 0 rss: 55Mb L: 316/702 MS: 1 EraseBytes- +#10365 REDUCE cov: 731 ft: 1489 corp: 105/21Kb lim: 702 exec/s: 0 rss: 56Mb L: 117/702 MS: 3 ChangeByte-ChangeBinInt-EraseBytes- +#10681 NEW cov: 733 ft: 1491 corp: 106/21Kb lim: 702 exec/s: 0 rss: 56Mb L: 76/702 MS: 1 EraseBytes- +#10757 REDUCE cov: 733 ft: 1491 corp: 106/21Kb lim: 702 exec/s: 0 rss: 56Mb L: 290/702 MS: 1 EraseBytes- +#10852 REDUCE cov: 733 ft: 1491 corp: 106/21Kb lim: 702 exec/s: 0 rss: 56Mb L: 114/702 MS: 5 ShuffleBytes-CrossOver-ChangeByte-CMP-EraseBytes- DE: "\001\000\000\002"- +#10891 REDUCE cov: 733 ft: 1491 corp: 106/21Kb lim: 702 exec/s: 0 rss: 56Mb L: 11/702 MS: 4 InsertByte-ShuffleBytes-EraseBytes-EraseBytes- +#10967 REDUCE cov: 733 ft: 1491 corp: 106/21Kb lim: 702 exec/s: 0 rss: 56Mb L: 34/702 MS: 1 EraseBytes- +#11074 REDUCE cov: 733 ft: 1491 corp: 106/21Kb lim: 702 exec/s: 0 rss: 56Mb L: 6/702 MS: 2 CopyPart-EraseBytes- +#11080 REDUCE cov: 733 ft: 1491 corp: 106/21Kb lim: 702 exec/s: 0 rss: 56Mb L: 187/702 MS: 1 EraseBytes- +#11181 REDUCE cov: 733 ft: 1491 corp: 106/21Kb lim: 702 exec/s: 0 rss: 56Mb L: 1/702 MS: 1 EraseBytes- +#11307 REDUCE cov: 733 ft: 1491 corp: 106/21Kb lim: 702 exec/s: 0 rss: 56Mb L: 242/702 MS: 1 EraseBytes- +#11480 REDUCE cov: 733 ft: 1491 corp: 106/21Kb lim: 702 exec/s: 0 rss: 56Mb L: 100/702 MS: 3 ChangeBinInt-ChangeASCIIInt-EraseBytes- +#11691 REDUCE cov: 734 ft: 1492 corp: 107/21Kb lim: 702 exec/s: 0 rss: 56Mb L: 1/702 MS: 1 ChangeBit- +#11692 REDUCE cov: 734 ft: 1492 corp: 107/21Kb lim: 702 exec/s: 0 rss: 56Mb L: 114/702 MS: 1 EraseBytes- +#12394 REDUCE cov: 734 ft: 1492 corp: 107/21Kb lim: 702 exec/s: 0 rss: 57Mb L: 115/702 MS: 2 CMP-EraseBytes- DE: "\202\000\000\000\000\000\000\000"- +#12461 REDUCE cov: 734 ft: 1492 corp: 107/21Kb lim: 702 exec/s: 0 rss: 57Mb L: 12/702 MS: 2 CopyPart-EraseBytes- +#12607 REDUCE cov: 734 ft: 1492 corp: 107/21Kb lim: 702 exec/s: 0 rss: 57Mb L: 299/702 MS: 1 EraseBytes- +#12953 REDUCE cov: 734 ft: 1492 corp: 107/21Kb lim: 702 exec/s: 0 rss: 57Mb L: 197/702 MS: 1 CrossOver- +#13029 REDUCE cov: 734 ft: 1492 corp: 107/21Kb lim: 702 exec/s: 0 rss: 57Mb L: 260/702 MS: 1 EraseBytes- +#13045 NEW cov: 739 ft: 1497 corp: 108/21Kb lim: 702 exec/s: 0 rss: 57Mb L: 69/702 MS: 1 EraseBytes- +#13311 REDUCE cov: 739 ft: 1497 corp: 108/21Kb lim: 702 exec/s: 0 rss: 57Mb L: 4/702 MS: 1 EraseBytes- +#13413 REDUCE cov: 739 ft: 1497 corp: 108/21Kb lim: 702 exec/s: 0 rss: 57Mb L: 253/702 MS: 2 ChangeBinInt-EraseBytes- +#13559 REDUCE cov: 739 ft: 1497 corp: 108/21Kb lim: 702 exec/s: 0 rss: 57Mb L: 2/702 MS: 1 EraseBytes- +#13772 NEW cov: 740 ft: 1498 corp: 109/21Kb lim: 702 exec/s: 0 rss: 58Mb L: 193/702 MS: 3 ShuffleBytes-ChangeBit-ChangeBit- +#14148 REDUCE cov: 740 ft: 1498 corp: 109/21Kb lim: 702 exec/s: 0 rss: 58Mb L: 109/702 MS: 1 EraseBytes- +#14367 REDUCE cov: 740 ft: 1498 corp: 109/21Kb lim: 702 exec/s: 0 rss: 58Mb L: 118/702 MS: 4 CMP-ChangeBinInt-EraseBytes-CopyPart- DE: "\001\000\000\000\000\000\000\300"- +#14455 REDUCE cov: 740 ft: 1498 corp: 109/21Kb lim: 702 exec/s: 0 rss: 58Mb L: 195/702 MS: 3 InsertByte-CrossOver-EraseBytes- +#14481 REDUCE cov: 740 ft: 1498 corp: 109/21Kb lim: 702 exec/s: 0 rss: 58Mb L: 8/702 MS: 1 EraseBytes- +#14484 REDUCE cov: 740 ft: 1498 corp: 109/21Kb lim: 702 exec/s: 0 rss: 58Mb L: 4/702 MS: 3 ChangeBit-ChangeBinInt-EraseBytes- +#14952 REDUCE cov: 740 ft: 1498 corp: 109/21Kb lim: 702 exec/s: 0 rss: 58Mb L: 2/702 MS: 3 ChangeBinInt-ChangeBinInt-EraseBytes- +#15003 REDUCE cov: 740 ft: 1498 corp: 109/21Kb lim: 702 exec/s: 0 rss: 58Mb L: 226/702 MS: 1 EraseBytes- +#15294 NEW cov: 745 ft: 1503 corp: 110/21Kb lim: 702 exec/s: 0 rss: 58Mb L: 165/702 MS: 1 EraseBytes- +#15379 REDUCE cov: 745 ft: 1503 corp: 110/21Kb lim: 702 exec/s: 0 rss: 58Mb L: 216/702 MS: 5 ChangeByte-ChangeBinInt-ChangeBinInt-InsertByte-EraseBytes- +#15401 REDUCE cov: 745 ft: 1503 corp: 110/21Kb lim: 702 exec/s: 0 rss: 58Mb L: 224/702 MS: 2 ChangeASCIIInt-EraseBytes- +#15513 REDUCE cov: 745 ft: 1503 corp: 110/21Kb lim: 702 exec/s: 0 rss: 58Mb L: 4/702 MS: 2 ChangeBit-EraseBytes- +#15540 REDUCE cov: 745 ft: 1503 corp: 110/21Kb lim: 702 exec/s: 0 rss: 59Mb L: 1/702 MS: 2 ShuffleBytes-EraseBytes- +#15871 REDUCE cov: 745 ft: 1503 corp: 110/21Kb lim: 702 exec/s: 0 rss: 59Mb L: 54/702 MS: 1 EraseBytes- +#15981 REDUCE cov: 745 ft: 1503 corp: 110/21Kb lim: 702 exec/s: 0 rss: 59Mb L: 89/702 MS: 5 CMP-CrossOver-InsertByte-CrossOver-CrossOver- DE: "\001\020\000\332"- +#16312 REDUCE cov: 745 ft: 1503 corp: 110/21Kb lim: 702 exec/s: 0 rss: 59Mb L: 79/702 MS: 1 EraseBytes- +#16406 NEW cov: 746 ft: 1504 corp: 111/21Kb lim: 702 exec/s: 0 rss: 59Mb L: 81/702 MS: 4 PersAutoDict-CopyPart-ShuffleBytes-EraseBytes- DE: "\000\000\000\000"- +#16622 REDUCE cov: 746 ft: 1504 corp: 111/21Kb lim: 702 exec/s: 0 rss: 59Mb L: 24/702 MS: 1 EraseBytes- +#16630 REDUCE cov: 746 ft: 1504 corp: 111/21Kb lim: 702 exec/s: 0 rss: 59Mb L: 6/702 MS: 3 ChangeBit-ShuffleBytes-EraseBytes- +#16723 NEW cov: 747 ft: 1505 corp: 112/21Kb lim: 702 exec/s: 0 rss: 59Mb L: 193/702 MS: 3 ChangeBinInt-CrossOver-ChangeByte- +#17020 NEW cov: 748 ft: 1506 corp: 113/22Kb lim: 702 exec/s: 0 rss: 59Mb L: 338/702 MS: 2 ChangeByte-CopyPart- +#17086 REDUCE cov: 748 ft: 1506 corp: 113/22Kb lim: 702 exec/s: 0 rss: 59Mb L: 162/702 MS: 1 EraseBytes- +#17248 REDUCE cov: 748 ft: 1506 corp: 113/22Kb lim: 702 exec/s: 0 rss: 59Mb L: 41/702 MS: 2 ShuffleBytes-EraseBytes- +#17593 REDUCE cov: 748 ft: 1506 corp: 113/22Kb lim: 702 exec/s: 0 rss: 60Mb L: 55/702 MS: 5 InsertByte-InsertRepeatedBytes-ChangeBit-EraseBytes-EraseBytes- +#17609 REDUCE cov: 748 ft: 1506 corp: 113/22Kb lim: 702 exec/s: 0 rss: 60Mb L: 2/702 MS: 1 EraseBytes- +#17797 REDUCE cov: 748 ft: 1506 corp: 113/22Kb lim: 702 exec/s: 0 rss: 60Mb L: 168/702 MS: 3 ChangeBinInt-ChangeBit-EraseBytes- +#18053 REDUCE cov: 748 ft: 1506 corp: 113/22Kb lim: 702 exec/s: 0 rss: 60Mb L: 59/702 MS: 1 EraseBytes- +#18394 NEW cov: 749 ft: 1508 corp: 114/22Kb lim: 702 exec/s: 0 rss: 60Mb L: 102/702 MS: 1 EraseBytes- +#18660 REDUCE cov: 749 ft: 1508 corp: 114/22Kb lim: 702 exec/s: 0 rss: 60Mb L: 30/702 MS: 1 EraseBytes- +#18711 REDUCE cov: 749 ft: 1508 corp: 114/22Kb lim: 702 exec/s: 0 rss: 60Mb L: 124/702 MS: 1 EraseBytes- +#18762 REDUCE cov: 749 ft: 1508 corp: 114/22Kb lim: 702 exec/s: 0 rss: 60Mb L: 319/702 MS: 1 EraseBytes- +#18859 REDUCE cov: 749 ft: 1508 corp: 114/22Kb lim: 702 exec/s: 0 rss: 60Mb L: 189/702 MS: 2 CMP-EraseBytes- DE: "\003\000\000\000\000\000\000\000"- +#19616 REDUCE cov: 749 ft: 1508 corp: 114/22Kb lim: 702 exec/s: 0 rss: 61Mb L: 154/702 MS: 2 ChangeBinInt-EraseBytes- +#19732 REDUCE cov: 749 ft: 1508 corp: 114/21Kb lim: 702 exec/s: 0 rss: 61Mb L: 214/702 MS: 1 EraseBytes- +#19958 REDUCE cov: 749 ft: 1508 corp: 114/21Kb lim: 702 exec/s: 0 rss: 61Mb L: 5/702 MS: 1 EraseBytes- +#19999 REDUCE cov: 749 ft: 1508 corp: 114/21Kb lim: 702 exec/s: 0 rss: 61Mb L: 175/702 MS: 1 EraseBytes- +#20480 NEW cov: 750 ft: 1509 corp: 115/22Kb lim: 702 exec/s: 0 rss: 61Mb L: 193/702 MS: 1 CrossOver- +#20918 REDUCE cov: 750 ft: 1509 corp: 115/22Kb lim: 702 exec/s: 0 rss: 61Mb L: 5/702 MS: 3 ChangeBinInt-ShuffleBytes-EraseBytes- +#21231 NEW cov: 751 ft: 1510 corp: 116/22Kb lim: 702 exec/s: 0 rss: 61Mb L: 702/702 MS: 3 ShuffleBytes-ChangeBit-CrossOver- +#21287 NEW cov: 752 ft: 1511 corp: 117/23Kb lim: 702 exec/s: 0 rss: 62Mb L: 702/702 MS: 1 ChangeBinInt- +#21866 REDUCE cov: 752 ft: 1511 corp: 117/23Kb lim: 702 exec/s: 0 rss: 62Mb L: 188/702 MS: 4 ChangeBinInt-ChangeASCIIInt-ChangeByte-EraseBytes- +#22172 REDUCE cov: 752 ft: 1511 corp: 117/23Kb lim: 702 exec/s: 0 rss: 62Mb L: 113/702 MS: 1 EraseBytes- +#22260 REDUCE cov: 752 ft: 1511 corp: 117/23Kb lim: 702 exec/s: 0 rss: 62Mb L: 3/702 MS: 3 CopyPart-ShuffleBytes-EraseBytes- +#22422 REDUCE cov: 752 ft: 1511 corp: 117/23Kb lim: 702 exec/s: 0 rss: 62Mb L: 217/702 MS: 2 CMP-EraseBytes- DE: "\275\002\000\000\000\000\000\000"- +#23202 REDUCE cov: 752 ft: 1511 corp: 117/23Kb lim: 702 exec/s: 0 rss: 62Mb L: 56/702 MS: 5 ShuffleBytes-ChangeASCIIInt-ChangeBinInt-ChangeBinInt-EraseBytes- +#23260 REDUCE cov: 752 ft: 1511 corp: 117/23Kb lim: 702 exec/s: 0 rss: 62Mb L: 1/702 MS: 3 InsertByte-EraseBytes-EraseBytes- +#23651 REDUCE cov: 752 ft: 1511 corp: 117/23Kb lim: 702 exec/s: 0 rss: 63Mb L: 4/702 MS: 1 EraseBytes- +#23974 REDUCE cov: 752 ft: 1511 corp: 117/23Kb lim: 702 exec/s: 0 rss: 63Mb L: 350/702 MS: 3 InsertRepeatedBytes-ShuffleBytes-EraseBytes- +#24010 NEW cov: 753 ft: 1512 corp: 118/23Kb lim: 702 exec/s: 0 rss: 63Mb L: 338/702 MS: 1 CopyPart- +#24656 REDUCE cov: 753 ft: 1512 corp: 118/23Kb lim: 702 exec/s: 0 rss: 63Mb L: 6/702 MS: 1 EraseBytes- +#24737 REDUCE cov: 753 ft: 1512 corp: 118/23Kb lim: 702 exec/s: 0 rss: 63Mb L: 1/702 MS: 1 EraseBytes- +#25288 REDUCE cov: 753 ft: 1512 corp: 118/23Kb lim: 702 exec/s: 0 rss: 63Mb L: 2/702 MS: 1 EraseBytes- +#25965 REDUCE cov: 753 ft: 1512 corp: 118/23Kb lim: 702 exec/s: 0 rss: 64Mb L: 195/702 MS: 2 CMP-EraseBytes- DE: "q\222h\302%\263\303\013k[S\254\020j\017\002|\264pSh\221\323L\225!&\011\312\022_\227"- +#26441 REDUCE cov: 753 ft: 1512 corp: 118/23Kb lim: 702 exec/s: 0 rss: 64Mb L: 99/702 MS: 1 EraseBytes- +#26512 REDUCE cov: 753 ft: 1512 corp: 118/23Kb lim: 702 exec/s: 0 rss: 64Mb L: 4/702 MS: 1 EraseBytes- +#26989 NEW cov: 754 ft: 1513 corp: 119/24Kb lim: 702 exec/s: 0 rss: 64Mb L: 702/702 MS: 2 ChangeBinInt-ChangeBit- +#27216 REDUCE cov: 754 ft: 1513 corp: 119/24Kb lim: 702 exec/s: 0 rss: 64Mb L: 44/702 MS: 2 ChangeByte-EraseBytes- +#27503 REDUCE cov: 754 ft: 1513 corp: 119/24Kb lim: 702 exec/s: 0 rss: 64Mb L: 151/702 MS: 2 InsertRepeatedBytes-EraseBytes- +#27815 REDUCE cov: 754 ft: 1513 corp: 119/24Kb lim: 702 exec/s: 0 rss: 65Mb L: 279/702 MS: 2 ChangeBinInt-EraseBytes- +#29052 REDUCE cov: 754 ft: 1513 corp: 119/24Kb lim: 711 exec/s: 0 rss: 65Mb L: 142/702 MS: 2 ChangeBit-EraseBytes- +#29456 REDUCE cov: 754 ft: 1513 corp: 119/24Kb lim: 711 exec/s: 0 rss: 65Mb L: 50/702 MS: 4 InsertByte-CopyPart-ShuffleBytes-EraseBytes- +#30013 REDUCE cov: 754 ft: 1513 corp: 119/24Kb lim: 711 exec/s: 0 rss: 66Mb L: 96/702 MS: 2 ChangeBinInt-EraseBytes- +#30519 REDUCE cov: 754 ft: 1513 corp: 119/24Kb lim: 711 exec/s: 0 rss: 66Mb L: 2/702 MS: 1 EraseBytes- +#31051 REDUCE cov: 754 ft: 1513 corp: 119/24Kb lim: 711 exec/s: 0 rss: 66Mb L: 20/702 MS: 2 ChangeByte-EraseBytes- +#33187 REDUCE cov: 754 ft: 1513 corp: 119/24Kb lim: 729 exec/s: 0 rss: 67Mb L: 2/702 MS: 1 EraseBytes- +#33466 REDUCE cov: 754 ft: 1513 corp: 119/24Kb lim: 729 exec/s: 0 rss: 67Mb L: 215/702 MS: 4 CMP-ChangeByte-CopyPart-EraseBytes- DE: "\343\000\000\000\000\000\000\000"- +#33832 REDUCE cov: 754 ft: 1513 corp: 119/24Kb lim: 729 exec/s: 0 rss: 67Mb L: 66/702 MS: 1 EraseBytes- +#34570 REDUCE cov: 754 ft: 1513 corp: 119/24Kb lim: 729 exec/s: 0 rss: 68Mb L: 271/702 MS: 3 CrossOver-InsertRepeatedBytes-EraseBytes- +#34581 REDUCE cov: 754 ft: 1513 corp: 119/24Kb lim: 729 exec/s: 0 rss: 68Mb L: 153/702 MS: 1 EraseBytes- +#35442 REDUCE cov: 754 ft: 1513 corp: 119/24Kb lim: 729 exec/s: 0 rss: 68Mb L: 114/702 MS: 1 EraseBytes- +#36636 REDUCE cov: 754 ft: 1513 corp: 119/24Kb lim: 738 exec/s: 0 rss: 69Mb L: 199/702 MS: 4 ShuffleBytes-ChangeByte-CopyPart-EraseBytes- +#36840 REDUCE cov: 754 ft: 1513 corp: 119/24Kb lim: 738 exec/s: 0 rss: 69Mb L: 1/702 MS: 4 EraseBytes-InsertByte-CrossOver-EraseBytes- +#37046 REDUCE cov: 754 ft: 1513 corp: 119/24Kb lim: 738 exec/s: 0 rss: 69Mb L: 5/702 MS: 1 EraseBytes- +#38962 REDUCE cov: 754 ft: 1513 corp: 119/24Kb lim: 756 exec/s: 0 rss: 70Mb L: 291/702 MS: 1 EraseBytes- +#39223 REDUCE cov: 754 ft: 1513 corp: 119/24Kb lim: 756 exec/s: 0 rss: 70Mb L: 53/702 MS: 1 EraseBytes- +#39410 REDUCE cov: 754 ft: 1513 corp: 119/24Kb lim: 756 exec/s: 0 rss: 70Mb L: 151/702 MS: 2 ChangeBinInt-EraseBytes- +#39776 REDUCE cov: 754 ft: 1513 corp: 119/24Kb lim: 756 exec/s: 0 rss: 70Mb L: 44/702 MS: 1 EraseBytes- +#39898 REDUCE cov: 754 ft: 1513 corp: 119/24Kb lim: 756 exec/s: 0 rss: 70Mb L: 240/702 MS: 2 ShuffleBytes-EraseBytes- +#39985 REDUCE cov: 754 ft: 1513 corp: 119/24Kb lim: 756 exec/s: 0 rss: 70Mb L: 151/702 MS: 2 ChangeBinInt-EraseBytes- +#40342 REDUCE cov: 754 ft: 1513 corp: 119/23Kb lim: 756 exec/s: 0 rss: 70Mb L: 226/702 MS: 2 ChangeBinInt-EraseBytes- +#40543 REDUCE cov: 754 ft: 1513 corp: 119/23Kb lim: 756 exec/s: 0 rss: 70Mb L: 33/702 MS: 1 EraseBytes- +#41174 NEW cov: 755 ft: 1514 corp: 120/24Kb lim: 756 exec/s: 0 rss: 71Mb L: 702/702 MS: 1 PersAutoDict- DE: "\003\000\000\000\000\000\000\000"- +#41881 REDUCE cov: 755 ft: 1514 corp: 120/24Kb lim: 756 exec/s: 0 rss: 71Mb L: 182/702 MS: 2 CrossOver-CrossOver- +#41937 REDUCE cov: 755 ft: 1514 corp: 120/24Kb lim: 756 exec/s: 0 rss: 71Mb L: 1/702 MS: 1 EraseBytes- +#41938 REDUCE cov: 755 ft: 1514 corp: 120/24Kb lim: 756 exec/s: 0 rss: 71Mb L: 76/702 MS: 1 EraseBytes- +#43214 REDUCE cov: 755 ft: 1514 corp: 120/24Kb lim: 765 exec/s: 0 rss: 72Mb L: 122/702 MS: 1 EraseBytes- +#44190 REDUCE cov: 755 ft: 1514 corp: 120/24Kb lim: 774 exec/s: 0 rss: 72Mb L: 196/702 MS: 1 EraseBytes- +#45321 REDUCE cov: 755 ft: 1514 corp: 120/24Kb lim: 783 exec/s: 0 rss: 73Mb L: 244/702 MS: 1 EraseBytes- +#46046 NEW cov: 757 ft: 1520 corp: 121/25Kb lim: 783 exec/s: 0 rss: 73Mb L: 665/702 MS: 5 InsertRepeatedBytes-PersAutoDict-ChangeBinInt-CopyPart-CrossOver- DE: "\001\000\000\002"- +#46207 REDUCE cov: 757 ft: 1520 corp: 121/25Kb lim: 783 exec/s: 0 rss: 73Mb L: 48/702 MS: 1 EraseBytes- +#46354 REDUCE cov: 757 ft: 1520 corp: 121/25Kb lim: 783 exec/s: 0 rss: 73Mb L: 4/702 MS: 2 ShuffleBytes-EraseBytes- +#46449 REDUCE cov: 757 ft: 1520 corp: 121/25Kb lim: 783 exec/s: 0 rss: 73Mb L: 233/702 MS: 5 ChangeASCIIInt-ChangeBinInt-ChangeASCIIInt-ShuffleBytes-EraseBytes- +#46565 REDUCE cov: 757 ft: 1520 corp: 121/25Kb lim: 783 exec/s: 0 rss: 73Mb L: 543/702 MS: 1 EraseBytes- +#46626 REDUCE cov: 757 ft: 1520 corp: 121/24Kb lim: 783 exec/s: 0 rss: 73Mb L: 443/702 MS: 1 EraseBytes- +#46933 REDUCE cov: 757 ft: 1520 corp: 121/24Kb lim: 783 exec/s: 0 rss: 73Mb L: 208/702 MS: 2 CMP-EraseBytes- DE: "\301\000\000\000\000\000\000\000"- +#47269 REDUCE cov: 757 ft: 1520 corp: 121/24Kb lim: 783 exec/s: 0 rss: 74Mb L: 193/702 MS: 1 EraseBytes- +#49107 REDUCE cov: 757 ft: 1520 corp: 121/24Kb lim: 801 exec/s: 0 rss: 74Mb L: 70/702 MS: 3 ChangeBinInt-CMP-EraseBytes- DE: "\000\000\000\000\000\000\000L"- +#52434 REDUCE cov: 757 ft: 1520 corp: 121/24Kb lim: 828 exec/s: 0 rss: 76Mb L: 114/702 MS: 2 InsertByte-EraseBytes- +#52460 REDUCE cov: 757 ft: 1520 corp: 121/24Kb lim: 828 exec/s: 0 rss: 76Mb L: 180/702 MS: 1 EraseBytes- +#52536 REDUCE cov: 757 ft: 1520 corp: 121/24Kb lim: 828 exec/s: 0 rss: 76Mb L: 181/702 MS: 1 EraseBytes- +#53698 REDUCE cov: 757 ft: 1520 corp: 121/24Kb lim: 837 exec/s: 0 rss: 76Mb L: 3/702 MS: 2 ChangeByte-EraseBytes- +#55499 REDUCE cov: 757 ft: 1520 corp: 121/24Kb lim: 846 exec/s: 0 rss: 77Mb L: 34/702 MS: 1 EraseBytes- +#55905 NEW cov: 759 ft: 1522 corp: 122/24Kb lim: 846 exec/s: 0 rss: 77Mb L: 81/702 MS: 1 EraseBytes- +#56436 REDUCE cov: 759 ft: 1522 corp: 122/24Kb lim: 846 exec/s: 0 rss: 77Mb L: 133/702 MS: 1 EraseBytes- +#57187 REDUCE cov: 759 ft: 1522 corp: 122/24Kb lim: 846 exec/s: 0 rss: 78Mb L: 185/702 MS: 1 EraseBytes- +#58468 REDUCE cov: 759 ft: 1522 corp: 122/24Kb lim: 855 exec/s: 0 rss: 78Mb L: 2/702 MS: 1 EraseBytes- +#58749 REDUCE cov: 759 ft: 1522 corp: 122/24Kb lim: 855 exec/s: 0 rss: 78Mb L: 340/702 MS: 1 EraseBytes- +#59531 REDUCE cov: 766 ft: 1529 corp: 123/24Kb lim: 855 exec/s: 0 rss: 79Mb L: 147/702 MS: 2 EraseBytes-EraseBytes- +#59697 REDUCE cov: 766 ft: 1529 corp: 123/24Kb lim: 855 exec/s: 0 rss: 79Mb L: 116/702 MS: 1 EraseBytes- +#59939 REDUCE cov: 766 ft: 1529 corp: 123/24Kb lim: 855 exec/s: 0 rss: 79Mb L: 270/702 MS: 2 ChangeByte-EraseBytes- +#60805 REDUCE cov: 766 ft: 1529 corp: 123/24Kb lim: 855 exec/s: 0 rss: 79Mb L: 69/702 MS: 1 EraseBytes- +#61016 REDUCE cov: 766 ft: 1529 corp: 123/24Kb lim: 855 exec/s: 0 rss: 79Mb L: 28/702 MS: 1 EraseBytes- +#62462 REDUCE cov: 766 ft: 1529 corp: 123/24Kb lim: 864 exec/s: 0 rss: 80Mb L: 66/702 MS: 1 EraseBytes- +#62723 REDUCE cov: 766 ft: 1529 corp: 123/24Kb lim: 864 exec/s: 0 rss: 80Mb L: 173/702 MS: 1 EraseBytes- +#62819 REDUCE cov: 766 ft: 1529 corp: 123/24Kb lim: 864 exec/s: 0 rss: 80Mb L: 118/702 MS: 1 EraseBytes- +#62840 REDUCE cov: 766 ft: 1529 corp: 123/24Kb lim: 864 exec/s: 0 rss: 80Mb L: 142/702 MS: 1 EraseBytes- +#63686 REDUCE cov: 766 ft: 1529 corp: 123/24Kb lim: 864 exec/s: 0 rss: 81Mb L: 97/702 MS: 1 EraseBytes- +#64234 REDUCE cov: 766 ft: 1529 corp: 123/24Kb lim: 864 exec/s: 0 rss: 81Mb L: 66/702 MS: 3 CopyPart-CopyPart-EraseBytes- +#64333 REDUCE cov: 767 ft: 1530 corp: 124/25Kb lim: 864 exec/s: 0 rss: 81Mb L: 163/702 MS: 4 CrossOver-ChangeBinInt-ChangeBit-InsertByte- +#64949 REDUCE cov: 767 ft: 1530 corp: 124/24Kb lim: 864 exec/s: 0 rss: 81Mb L: 126/702 MS: 1 EraseBytes- +#65630 REDUCE cov: 768 ft: 1531 corp: 125/25Kb lim: 864 exec/s: 0 rss: 81Mb L: 53/702 MS: 1 ChangeBit- +#66313 REDUCE cov: 768 ft: 1531 corp: 125/25Kb lim: 864 exec/s: 0 rss: 82Mb L: 1/702 MS: 3 CopyPart-ShuffleBytes-EraseBytes- +#70486 REDUCE cov: 768 ft: 1531 corp: 125/24Kb lim: 900 exec/s: 0 rss: 83Mb L: 193/702 MS: 3 ShuffleBytes-ShuffleBytes-EraseBytes- +#71032 REDUCE cov: 769 ft: 1532 corp: 126/25Kb lim: 900 exec/s: 0 rss: 84Mb L: 131/702 MS: 1 EraseBytes- +#72364 REDUCE cov: 769 ft: 1532 corp: 126/25Kb lim: 909 exec/s: 0 rss: 84Mb L: 325/702 MS: 2 CrossOver-EraseBytes- +#74705 NEW cov: 770 ft: 1536 corp: 127/25Kb lim: 927 exec/s: 0 rss: 85Mb L: 95/702 MS: 1 EraseBytes- +#75350 REDUCE cov: 770 ft: 1536 corp: 127/25Kb lim: 927 exec/s: 0 rss: 85Mb L: 113/702 MS: 5 CMP-EraseBytes-ShuffleBytes-PersAutoDict-PersAutoDict- DE: "\377\377"-"\001\000\000\002"-"\000\000\000\000\000\000\000\300"- +#76827 REDUCE cov: 771 ft: 1537 corp: 128/25Kb lim: 936 exec/s: 0 rss: 86Mb L: 174/702 MS: 2 CMP-ShuffleBytes- DE: "\367\011\310A\272\233h\\\201+\001\350\302\301\346\263\033a\203\306M\024\006\336\332'F\345'\017\027\313"- +#76894 REDUCE cov: 772 ft: 1538 corp: 129/25Kb lim: 936 exec/s: 0 rss: 86Mb L: 146/702 MS: 2 ChangeBit-CMP- DE: "\377\377\377\007"- +#80171 REDUCE cov: 772 ft: 1538 corp: 129/25Kb lim: 963 exec/s: 0 rss: 87Mb L: 179/702 MS: 2 CrossOver-EraseBytes- +#81688 REDUCE cov: 772 ft: 1538 corp: 129/25Kb lim: 972 exec/s: 0 rss: 88Mb L: 194/702 MS: 2 ChangeByte-EraseBytes- +#85909 REDUCE cov: 772 ft: 1538 corp: 129/25Kb lim: 1008 exec/s: 0 rss: 90Mb L: 127/702 MS: 1 EraseBytes- +#86620 NEW cov: 773 ft: 1539 corp: 130/25Kb lim: 1008 exec/s: 0 rss: 90Mb L: 150/702 MS: 1 CMP- DE: "\004\000\000\000"- +#94301 REDUCE cov: 773 ft: 1539 corp: 130/25Kb lim: 1076 exec/s: 0 rss: 93Mb L: 62/702 MS: 1 EraseBytes- +#95089 REDUCE cov: 773 ft: 1539 corp: 130/25Kb lim: 1076 exec/s: 0 rss: 94Mb L: 194/702 MS: 3 InsertRepeatedBytes-CopyPart-EraseBytes- +#95295 REDUCE cov: 773 ft: 1539 corp: 130/25Kb lim: 1076 exec/s: 0 rss: 94Mb L: 55/702 MS: 1 EraseBytes- +#95971 REDUCE cov: 773 ft: 1539 corp: 130/25Kb lim: 1076 exec/s: 0 rss: 94Mb L: 129/702 MS: 1 EraseBytes- +#96213 REDUCE cov: 773 ft: 1539 corp: 130/25Kb lim: 1076 exec/s: 0 rss: 94Mb L: 97/702 MS: 2 ChangeASCIIInt-EraseBytes- +#97419 REDUCE cov: 773 ft: 1539 corp: 130/25Kb lim: 1086 exec/s: 0 rss: 95Mb L: 127/702 MS: 1 EraseBytes- +#98176 REDUCE cov: 780 ft: 1547 corp: 131/25Kb lim: 1086 exec/s: 0 rss: 95Mb L: 189/702 MS: 2 ShuffleBytes-EraseBytes- +#98417 REDUCE cov: 780 ft: 1547 corp: 131/25Kb lim: 1086 exec/s: 0 rss: 96Mb L: 114/702 MS: 1 EraseBytes- +#98693 REDUCE cov: 780 ft: 1547 corp: 131/25Kb lim: 1086 exec/s: 0 rss: 96Mb L: 126/702 MS: 1 EraseBytes- +#101024 REDUCE cov: 780 ft: 1547 corp: 131/25Kb lim: 1106 exec/s: 0 rss: 97Mb L: 26/702 MS: 1 EraseBytes- +#101535 REDUCE cov: 780 ft: 1547 corp: 131/25Kb lim: 1106 exec/s: 0 rss: 97Mb L: 65/702 MS: 1 EraseBytes- +#102476 REDUCE cov: 780 ft: 1547 corp: 131/25Kb lim: 1106 exec/s: 0 rss: 97Mb L: 113/702 MS: 1 EraseBytes- +#102897 REDUCE cov: 780 ft: 1547 corp: 131/25Kb lim: 1106 exec/s: 0 rss: 97Mb L: 58/702 MS: 1 EraseBytes- +#104633 REDUCE cov: 780 ft: 1547 corp: 131/25Kb lim: 1116 exec/s: 0 rss: 98Mb L: 18/702 MS: 1 EraseBytes- +#104700 REDUCE cov: 780 ft: 1547 corp: 131/25Kb lim: 1116 exec/s: 0 rss: 98Mb L: 160/702 MS: 2 ChangeBit-EraseBytes- +#106646 REDUCE cov: 780 ft: 1547 corp: 131/25Kb lim: 1126 exec/s: 0 rss: 99Mb L: 195/702 MS: 1 EraseBytes- +#107082 REDUCE cov: 780 ft: 1547 corp: 131/25Kb lim: 1126 exec/s: 0 rss: 99Mb L: 112/702 MS: 1 EraseBytes- +#111063 REDUCE cov: 780 ft: 1547 corp: 131/25Kb lim: 1156 exec/s: 0 rss: 101Mb L: 177/702 MS: 1 EraseBytes- +#111709 REDUCE cov: 782 ft: 1549 corp: 132/25Kb lim: 1156 exec/s: 0 rss: 101Mb L: 173/702 MS: 1 EraseBytes- +#112537 REDUCE cov: 782 ft: 1549 corp: 132/25Kb lim: 1156 exec/s: 0 rss: 101Mb L: 113/702 MS: 3 ChangeBit-ChangeBinInt-EraseBytes- +#115133 NEW cov: 783 ft: 1550 corp: 133/25Kb lim: 1176 exec/s: 0 rss: 103Mb L: 174/702 MS: 1 InsertByte- +#115805 NEW cov: 784 ft: 1551 corp: 134/26Kb lim: 1176 exec/s: 0 rss: 103Mb L: 162/702 MS: 2 ChangeASCIIInt-EraseBytes- +#118266 REDUCE cov: 784 ft: 1551 corp: 134/26Kb lim: 1196 exec/s: 0 rss: 104Mb L: 118/702 MS: 1 EraseBytes- +#119313 NEW cov: 785 ft: 1552 corp: 135/26Kb lim: 1206 exec/s: 0 rss: 105Mb L: 165/702 MS: 2 ShuffleBytes-EraseBytes- +#119721 REDUCE cov: 785 ft: 1552 corp: 135/26Kb lim: 1206 exec/s: 0 rss: 105Mb L: 154/702 MS: 3 CopyPart-ChangeASCIIInt-EraseBytes- +#121152 NEW cov: 786 ft: 1553 corp: 136/26Kb lim: 1216 exec/s: 0 rss: 105Mb L: 173/702 MS: 1 PersAutoDict- DE: "\367\011\310A\272\233h\\\201+\001\350\302\301\346\263\033a\203\306M\024\006\336\332'F\345'\017\027\313"- +#121528 REDUCE cov: 786 ft: 1553 corp: 136/26Kb lim: 1216 exec/s: 0 rss: 106Mb L: 129/702 MS: 1 EraseBytes- +#124194 REDUCE cov: 786 ft: 1553 corp: 136/26Kb lim: 1236 exec/s: 0 rss: 107Mb L: 148/702 MS: 1 EraseBytes- +#124492 REDUCE cov: 786 ft: 1553 corp: 136/26Kb lim: 1236 exec/s: 0 rss: 107Mb L: 171/702 MS: 3 CrossOver-CrossOver-EraseBytes- +#124629 REDUCE cov: 786 ft: 1553 corp: 136/26Kb lim: 1236 exec/s: 0 rss: 107Mb L: 200/702 MS: 2 ChangeASCIIInt-EraseBytes- +#126087 REDUCE cov: 786 ft: 1553 corp: 136/26Kb lim: 1246 exec/s: 0 rss: 108Mb L: 97/702 MS: 3 ChangeBit-PersAutoDict-EraseBytes- DE: "\301\000\000\000\000\000\000\000"- +#129438 NEW cov: 787 ft: 1554 corp: 137/26Kb lim: 1276 exec/s: 0 rss: 109Mb L: 174/702 MS: 1 ChangeBit- +#129540 REDUCE cov: 787 ft: 1554 corp: 137/26Kb lim: 1276 exec/s: 0 rss: 109Mb L: 123/702 MS: 2 PersAutoDict-EraseBytes- DE: "\202\000\000\000\000\000\000\000"- +#130306 REDUCE cov: 787 ft: 1554 corp: 137/26Kb lim: 1276 exec/s: 0 rss: 109Mb L: 225/702 MS: 1 EraseBytes- +#130907 NEW cov: 788 ft: 1555 corp: 138/27Kb lim: 1276 exec/s: 0 rss: 110Mb L: 702/702 MS: 1 ShuffleBytes- +#131349 NEW cov: 789 ft: 1556 corp: 139/27Kb lim: 1276 exec/s: 0 rss: 110Mb L: 100/702 MS: 2 ChangeBinInt-EraseBytes- +#131370 REDUCE cov: 789 ft: 1556 corp: 139/27Kb lim: 1276 exec/s: 0 rss: 110Mb L: 114/702 MS: 1 EraseBytes- +#132018 REDUCE cov: 789 ft: 1556 corp: 139/27Kb lim: 1276 exec/s: 0 rss: 110Mb L: 113/702 MS: 3 CrossOver-PersAutoDict-EraseBytes- DE: "\301\000\000\000\000\000\000\000"- +#134323 REDUCE cov: 789 ft: 1556 corp: 139/27Kb lim: 1296 exec/s: 0 rss: 111Mb L: 113/702 MS: 5 ChangeBinInt-CopyPart-CrossOver-EraseBytes-CrossOver- +#136314 REDUCE cov: 789 ft: 1556 corp: 139/27Kb lim: 1306 exec/s: 0 rss: 112Mb L: 145/702 MS: 1 EraseBytes- +#140995 REDUCE cov: 789 ft: 1556 corp: 139/27Kb lim: 1346 exec/s: 0 rss: 114Mb L: 98/702 MS: 1 EraseBytes- +#142931 NEW cov: 789 ft: 1557 corp: 140/27Kb lim: 1356 exec/s: 0 rss: 115Mb L: 96/702 MS: 1 InsertByte- +#143617 REDUCE cov: 789 ft: 1557 corp: 140/27Kb lim: 1356 exec/s: 0 rss: 115Mb L: 169/702 MS: 1 EraseBytes- +#144053 NEW cov: 790 ft: 1558 corp: 141/27Kb lim: 1356 exec/s: 0 rss: 115Mb L: 94/702 MS: 1 CrossOver- +#146443 NEW cov: 791 ft: 1559 corp: 142/27Kb lim: 1376 exec/s: 0 rss: 117Mb L: 86/702 MS: 5 CopyPart-CrossOver-ChangeASCIIInt-ShuffleBytes-EraseBytes- +#148740 REDUCE cov: 791 ft: 1559 corp: 142/27Kb lim: 1396 exec/s: 0 rss: 118Mb L: 148/702 MS: 2 ChangeByte-EraseBytes- +#150295 REDUCE cov: 791 ft: 1559 corp: 142/27Kb lim: 1406 exec/s: 0 rss: 118Mb L: 193/702 MS: 5 ShuffleBytes-ChangeBit-PersAutoDict-EraseBytes-InsertRepeatedBytes- DE: "\377\377\377\377\377\377\377G"- +#151386 REDUCE cov: 791 ft: 1559 corp: 142/27Kb lim: 1416 exec/s: 0 rss: 119Mb L: 53/702 MS: 1 EraseBytes- +#153758 NEW cov: 792 ft: 1560 corp: 143/28Kb lim: 1436 exec/s: 0 rss: 120Mb L: 702/702 MS: 2 ShuffleBytes-ShuffleBytes- +#159450 REDUCE cov: 792 ft: 1560 corp: 143/28Kb lim: 1486 exec/s: 0 rss: 122Mb L: 152/702 MS: 2 ChangeByte-EraseBytes- +#159631 REDUCE cov: 792 ft: 1560 corp: 143/28Kb lim: 1486 exec/s: 0 rss: 122Mb L: 133/702 MS: 1 EraseBytes- +#159888 REDUCE cov: 792 ft: 1560 corp: 143/28Kb lim: 1486 exec/s: 0 rss: 123Mb L: 117/702 MS: 2 ChangeASCIIInt-EraseBytes- +#162640 REDUCE cov: 792 ft: 1560 corp: 143/28Kb lim: 1506 exec/s: 0 rss: 124Mb L: 153/702 MS: 2 ChangeASCIIInt-EraseBytes- +#165098 REDUCE cov: 792 ft: 1560 corp: 143/28Kb lim: 1526 exec/s: 0 rss: 125Mb L: 194/702 MS: 3 ShuffleBytes-EraseBytes-InsertRepeatedBytes- +#168054 NEW cov: 796 ft: 1564 corp: 144/28Kb lim: 1546 exec/s: 0 rss: 126Mb L: 84/702 MS: 1 EraseBytes- +#169883 NEW cov: 797 ft: 1565 corp: 145/28Kb lim: 1556 exec/s: 0 rss: 127Mb L: 110/702 MS: 4 InsertRepeatedBytes-ChangeByte-InsertByte-EraseBytes- +#170224 NEW cov: 799 ft: 1567 corp: 146/28Kb lim: 1556 exec/s: 0 rss: 127Mb L: 86/702 MS: 1 EraseBytes- +#170261 REDUCE cov: 799 ft: 1567 corp: 146/28Kb lim: 1556 exec/s: 0 rss: 127Mb L: 65/702 MS: 2 InsertRepeatedBytes-EraseBytes- +#170777 REDUCE cov: 799 ft: 1567 corp: 146/28Kb lim: 1556 exec/s: 0 rss: 128Mb L: 160/702 MS: 1 EraseBytes- +#175313 REDUCE cov: 799 ft: 1567 corp: 146/28Kb lim: 1596 exec/s: 0 rss: 130Mb L: 188/702 MS: 1 EraseBytes- +#176935 REDUCE cov: 799 ft: 1567 corp: 146/28Kb lim: 1606 exec/s: 0 rss: 130Mb L: 118/702 MS: 2 ShuffleBytes-EraseBytes- +#179416 REDUCE cov: 799 ft: 1567 corp: 146/28Kb lim: 1626 exec/s: 0 rss: 131Mb L: 96/702 MS: 1 EraseBytes- +#181083 REDUCE cov: 799 ft: 1567 corp: 146/28Kb lim: 1636 exec/s: 0 rss: 132Mb L: 172/702 MS: 2 CrossOver-EraseBytes- +#182494 NEW cov: 802 ft: 1572 corp: 147/28Kb lim: 1646 exec/s: 0 rss: 133Mb L: 86/702 MS: 1 EraseBytes- +#184040 REDUCE cov: 802 ft: 1572 corp: 147/28Kb lim: 1656 exec/s: 0 rss: 133Mb L: 89/702 MS: 1 EraseBytes- +#186206 REDUCE cov: 802 ft: 1572 corp: 147/28Kb lim: 1676 exec/s: 0 rss: 134Mb L: 146/702 MS: 1 EraseBytes- +#187112 REDUCE cov: 803 ft: 1573 corp: 148/28Kb lim: 1676 exec/s: 0 rss: 135Mb L: 81/702 MS: 1 EraseBytes- +#187351 REDUCE cov: 803 ft: 1573 corp: 148/28Kb lim: 1676 exec/s: 0 rss: 135Mb L: 113/702 MS: 4 ShuffleBytes-EraseBytes-PersAutoDict-CrossOver- DE: "\001\000\000\000"- +#191492 REDUCE cov: 803 ft: 1573 corp: 148/28Kb lim: 1716 exec/s: 0 rss: 137Mb L: 178/702 MS: 1 EraseBytes- +#191503 REDUCE cov: 803 ft: 1573 corp: 148/28Kb lim: 1716 exec/s: 0 rss: 137Mb L: 42/702 MS: 1 EraseBytes- +#192801 NEW cov: 804 ft: 1574 corp: 149/28Kb lim: 1726 exec/s: 0 rss: 137Mb L: 126/702 MS: 3 CMP-ChangeASCIIInt-PersAutoDict- DE: "\001\216"-"\000\000\000\000\000\000\000\300"- +#195993 REDUCE cov: 805 ft: 1575 corp: 150/28Kb lim: 1756 exec/s: 0 rss: 139Mb L: 83/702 MS: 2 InsertByte-EraseBytes- +#198849 REDUCE cov: 805 ft: 1575 corp: 150/28Kb lim: 1776 exec/s: 0 rss: 140Mb L: 177/702 MS: 1 EraseBytes- +#206037 REDUCE cov: 805 ft: 1575 corp: 150/28Kb lim: 1846 exec/s: 0 rss: 143Mb L: 70/702 MS: 3 ChangeASCIIInt-PersAutoDict-EraseBytes- DE: "\226\232\260\206\212\266;\300\242$$\210;\255\244\222\013\253\333P\001\037\261\213\261zBu\275X\362B"- +#207308 REDUCE cov: 805 ft: 1575 corp: 150/28Kb lim: 1856 exec/s: 0 rss: 144Mb L: 119/702 MS: 1 EraseBytes- +#209789 REDUCE cov: 805 ft: 1575 corp: 150/28Kb lim: 1876 exec/s: 0 rss: 145Mb L: 193/702 MS: 1 EraseBytes- +#210420 REDUCE cov: 805 ft: 1575 corp: 150/28Kb lim: 1876 exec/s: 0 rss: 145Mb L: 50/702 MS: 1 EraseBytes- +#213536 NEW cov: 807 ft: 1577 corp: 151/28Kb lim: 1906 exec/s: 213536 rss: 149Mb L: 88/702 MS: 1 EraseBytes- +#218315 NEW cov: 813 ft: 1633 corp: 152/29Kb lim: 1946 exec/s: 218315 rss: 151Mb L: 702/702 MS: 4 PersAutoDict-PersAutoDict-ChangeBinInt-CMP- DE: "\000\000"-"\004\000\000\000"-"\230\032!v}\301^\232k\375C\211h\2137\232\331\223 V}\340)H\354u\030~D1\240\335"- +#218771 REDUCE cov: 813 ft: 1633 corp: 152/29Kb lim: 1946 exec/s: 218771 rss: 151Mb L: 65/702 MS: 1 EraseBytes- +#219462 REDUCE cov: 813 ft: 1633 corp: 152/29Kb lim: 1946 exec/s: 219462 rss: 151Mb L: 97/702 MS: 1 EraseBytes- +#229968 REDUCE cov: 813 ft: 1633 corp: 152/29Kb lim: 2046 exec/s: 229968 rss: 156Mb L: 150/702 MS: 1 EraseBytes- +#230165 REDUCE cov: 813 ft: 1633 corp: 152/29Kb lim: 2046 exec/s: 230165 rss: 156Mb L: 65/702 MS: 2 InsertByte-EraseBytes- +#243640 REDUCE cov: 813 ft: 1633 corp: 152/29Kb lim: 2177 exec/s: 243640 rss: 162Mb L: 181/702 MS: 5 ChangeByte-InsertByte-CMP-InsertByte-EraseBytes- DE: "\001\000\000\000@\000\000\000"- +#247771 REDUCE cov: 813 ft: 1633 corp: 152/29Kb lim: 2210 exec/s: 247771 rss: 164Mb L: 134/702 MS: 1 EraseBytes- +#251082 REDUCE cov: 813 ft: 1633 corp: 152/29Kb lim: 2232 exec/s: 251082 rss: 165Mb L: 119/702 MS: 1 EraseBytes- +#251458 REDUCE cov: 813 ft: 1633 corp: 152/29Kb lim: 2232 exec/s: 251458 rss: 165Mb L: 101/702 MS: 1 EraseBytes- +#253109 REDUCE cov: 813 ft: 1633 corp: 152/29Kb lim: 2243 exec/s: 253109 rss: 166Mb L: 25/702 MS: 1 EraseBytes- +#259920 REDUCE cov: 813 ft: 1633 corp: 152/29Kb lim: 2309 exec/s: 259920 rss: 169Mb L: 92/702 MS: 1 EraseBytes- +#260858 REDUCE cov: 813 ft: 1633 corp: 152/29Kb lim: 2309 exec/s: 260858 rss: 169Mb L: 84/702 MS: 3 ChangeByte-EraseBytes-PersAutoDict- DE: "\304\230\251\303\314$\024)&\205}w\217\356\177\326\"\270\2603\0221\212#`\246\213\343F\021h\326"- +#262859 NEW cov: 814 ft: 1634 corp: 153/29Kb lim: 2320 exec/s: 262859 rss: 170Mb L: 80/702 MS: 1 EraseBytes- +#264470 REDUCE cov: 815 ft: 1635 corp: 154/29Kb lim: 2331 exec/s: 264470 rss: 171Mb L: 85/702 MS: 1 EraseBytes- +#264861 REDUCE cov: 815 ft: 1635 corp: 154/29Kb lim: 2331 exec/s: 264861 rss: 171Mb L: 24/702 MS: 1 EraseBytes- +#268337 REDUCE cov: 815 ft: 1635 corp: 154/29Kb lim: 2364 exec/s: 268337 rss: 173Mb L: 76/702 MS: 1 EraseBytes- +#268518 REDUCE cov: 815 ft: 1635 corp: 154/29Kb lim: 2364 exec/s: 268518 rss: 173Mb L: 115/702 MS: 1 EraseBytes- +#268639 REDUCE cov: 815 ft: 1635 corp: 154/29Kb lim: 2364 exec/s: 268639 rss: 173Mb L: 142/702 MS: 1 EraseBytes- +#269007 REDUCE cov: 815 ft: 1635 corp: 154/29Kb lim: 2364 exec/s: 269007 rss: 173Mb L: 135/702 MS: 3 CMP-ShuffleBytes-EraseBytes- DE: "\000\020\000'"- +#274298 REDUCE cov: 815 ft: 1635 corp: 154/29Kb lim: 2408 exec/s: 274298 rss: 175Mb L: 29/702 MS: 1 EraseBytes- +#279716 REDUCE cov: 815 ft: 1635 corp: 154/29Kb lim: 2452 exec/s: 279716 rss: 178Mb L: 75/702 MS: 3 CopyPart-ChangeBinInt-EraseBytes- +#282467 REDUCE cov: 815 ft: 1635 corp: 154/29Kb lim: 2474 exec/s: 282467 rss: 179Mb L: 131/702 MS: 1 EraseBytes- +#288203 REDUCE cov: 815 ft: 1635 corp: 154/29Kb lim: 2529 exec/s: 288203 rss: 181Mb L: 134/702 MS: 1 EraseBytes- +#289734 REDUCE cov: 815 ft: 1635 corp: 154/29Kb lim: 2540 exec/s: 289734 rss: 182Mb L: 102/702 MS: 1 EraseBytes- +#290105 REDUCE cov: 815 ft: 1635 corp: 154/29Kb lim: 2540 exec/s: 290105 rss: 182Mb L: 71/702 MS: 1 EraseBytes- +#290176 REDUCE cov: 815 ft: 1635 corp: 154/29Kb lim: 2540 exec/s: 290176 rss: 182Mb L: 65/702 MS: 1 EraseBytes- +#310187 REDUCE cov: 815 ft: 1635 corp: 154/29Kb lim: 2738 exec/s: 310187 rss: 191Mb L: 156/702 MS: 1 EraseBytes- +#314260 REDUCE cov: 815 ft: 1635 corp: 154/29Kb lim: 2771 exec/s: 314260 rss: 193Mb L: 89/702 MS: 3 InsertByte-InsertRepeatedBytes-EraseBytes- +#317391 REDUCE cov: 815 ft: 1635 corp: 154/29Kb lim: 2793 exec/s: 317391 rss: 194Mb L: 150/702 MS: 1 EraseBytes- +#341237 REDUCE cov: 815 ft: 1635 corp: 154/29Kb lim: 3024 exec/s: 341237 rss: 204Mb L: 85/702 MS: 1 EraseBytes- +#345208 REDUCE cov: 815 ft: 1635 corp: 154/29Kb lim: 3057 exec/s: 345208 rss: 206Mb L: 133/702 MS: 1 EraseBytes- +#346334 NEW cov: 816 ft: 1636 corp: 155/29Kb lim: 3068 exec/s: 346334 rss: 207Mb L: 702/702 MS: 1 CopyPart- +#353400 REDUCE cov: 816 ft: 1636 corp: 155/29Kb lim: 3134 exec/s: 353400 rss: 210Mb L: 116/702 MS: 1 EraseBytes- +#360431 NEW cov: 817 ft: 1637 corp: 156/30Kb lim: 3200 exec/s: 360431 rss: 213Mb L: 174/702 MS: 1 CopyPart- +#361807 REDUCE cov: 817 ft: 1637 corp: 156/30Kb lim: 3211 exec/s: 361807 rss: 213Mb L: 21/702 MS: 1 EraseBytes- +#362968 NEW cov: 818 ft: 1638 corp: 157/30Kb lim: 3222 exec/s: 362968 rss: 214Mb L: 94/702 MS: 1 CrossOver- +#363850 REDUCE cov: 818 ft: 1638 corp: 157/30Kb lim: 3222 exec/s: 363850 rss: 214Mb L: 141/702 MS: 2 CopyPart-EraseBytes- +#364716 REDUCE cov: 818 ft: 1638 corp: 157/30Kb lim: 3222 exec/s: 364716 rss: 215Mb L: 134/702 MS: 1 EraseBytes- +#369617 REDUCE cov: 818 ft: 1638 corp: 157/30Kb lim: 3266 exec/s: 369617 rss: 217Mb L: 151/702 MS: 1 EraseBytes- +#376298 NEW cov: 818 ft: 1639 corp: 158/30Kb lim: 3332 exec/s: 376298 rss: 220Mb L: 702/702 MS: 1 ChangeBinInt- +#378969 REDUCE cov: 818 ft: 1639 corp: 158/30Kb lim: 3354 exec/s: 378969 rss: 221Mb L: 96/702 MS: 1 EraseBytes- +#385786 REDUCE cov: 818 ft: 1639 corp: 158/30Kb lim: 3420 exec/s: 385786 rss: 224Mb L: 147/702 MS: 2 ChangeBit-EraseBytes- +#387537 REDUCE cov: 818 ft: 1639 corp: 158/30Kb lim: 3431 exec/s: 387537 rss: 225Mb L: 26/702 MS: 1 EraseBytes- +#393028 REDUCE cov: 818 ft: 1639 corp: 158/30Kb lim: 3475 exec/s: 393028 rss: 227Mb L: 125/702 MS: 1 EraseBytes- +#396919 REDUCE cov: 818 ft: 1639 corp: 158/30Kb lim: 3508 exec/s: 396919 rss: 229Mb L: 106/702 MS: 1 EraseBytes- +#410300 REDUCE cov: 818 ft: 1639 corp: 158/30Kb lim: 3640 exec/s: 410300 rss: 235Mb L: 29/702 MS: 1 EraseBytes- +#414671 REDUCE cov: 818 ft: 1639 corp: 158/30Kb lim: 3673 exec/s: 414671 rss: 237Mb L: 96/702 MS: 1 EraseBytes- +#421908 NEW cov: 818 ft: 1640 corp: 159/31Kb lim: 3739 exec/s: 421908 rss: 240Mb L: 702/702 MS: 2 ShuffleBytes-CrossOver- +#432619 REDUCE cov: 818 ft: 1640 corp: 159/31Kb lim: 3838 exec/s: 432619 rss: 245Mb L: 193/702 MS: 1 EraseBytes- +#433551 REDUCE cov: 818 ft: 1640 corp: 159/31Kb lim: 3838 exec/s: 216775 rss: 245Mb L: 136/702 MS: 2 ChangeBit-EraseBytes- +#449152 REDUCE cov: 819 ft: 1641 corp: 160/31Kb lim: 3992 exec/s: 224576 rss: 253Mb L: 105/702 MS: 1 EraseBytes- +#454198 REDUCE cov: 819 ft: 1641 corp: 160/31Kb lim: 4036 exec/s: 227099 rss: 256Mb L: 148/702 MS: 1 EraseBytes- +#454327 REDUCE cov: 819 ft: 1641 corp: 160/31Kb lim: 4036 exec/s: 227163 rss: 256Mb L: 223/702 MS: 4 ChangeASCIIInt-ShuffleBytes-ChangeByte-EraseBytes- +#463833 REDUCE cov: 819 ft: 1641 corp: 160/31Kb lim: 4126 exec/s: 231916 rss: 260Mb L: 237/702 MS: 1 EraseBytes- +#501384 REDUCE cov: 819 ft: 1641 corp: 160/31Kb lim: 4498 exec/s: 250692 rss: 277Mb L: 93/702 MS: 1 EraseBytes- +#501790 REDUCE cov: 819 ft: 1641 corp: 160/31Kb lim: 4498 exec/s: 250895 rss: 277Mb L: 114/702 MS: 1 EraseBytes- +#502711 REDUCE cov: 819 ft: 1641 corp: 160/31Kb lim: 4498 exec/s: 251355 rss: 277Mb L: 146/702 MS: 1 EraseBytes- +#504777 REDUCE cov: 819 ft: 1642 corp: 161/31Kb lim: 4510 exec/s: 252388 rss: 278Mb L: 271/702 MS: 1 CrossOver- +#512028 REDUCE cov: 819 ft: 1642 corp: 161/31Kb lim: 4582 exec/s: 256014 rss: 282Mb L: 114/702 MS: 1 EraseBytes- +#522499 NEW cov: 820 ft: 1643 corp: 162/32Kb lim: 4678 exec/s: 261249 rss: 286Mb L: 150/702 MS: 1 EraseBytes- +#524288 pulse cov: 820 ft: 1643 corp: 162/32Kb lim: 4690 exec/s: 262144 rss: 287Mb +#524798 NEW cov: 820 ft: 1650 corp: 163/32Kb lim: 4690 exec/s: 262399 rss: 287Mb L: 453/702 MS: 4 ChangeBit-CopyPart-EraseBytes-CopyPart- +#527265 REDUCE cov: 820 ft: 1650 corp: 163/32Kb lim: 4714 exec/s: 263632 rss: 289Mb L: 100/702 MS: 2 InsertRepeatedBytes-EraseBytes- +#532537 REDUCE cov: 820 ft: 1650 corp: 163/32Kb lim: 4762 exec/s: 266268 rss: 291Mb L: 113/702 MS: 2 CopyPart-EraseBytes- +#540748 REDUCE cov: 820 ft: 1650 corp: 163/32Kb lim: 4834 exec/s: 270374 rss: 295Mb L: 203/702 MS: 1 EraseBytes- +#543224 REDUCE cov: 820 ft: 1650 corp: 163/32Kb lim: 4858 exec/s: 271612 rss: 296Mb L: 435/702 MS: 1 EraseBytes- +#554540 REDUCE cov: 820 ft: 1650 corp: 163/32Kb lim: 4966 exec/s: 277270 rss: 301Mb L: 434/702 MS: 1 EraseBytes- +#555561 REDUCE cov: 820 ft: 1650 corp: 163/32Kb lim: 4966 exec/s: 277780 rss: 302Mb L: 89/702 MS: 1 EraseBytes- +#557532 NEW cov: 821 ft: 1651 corp: 164/33Kb lim: 4978 exec/s: 278766 rss: 303Mb L: 702/702 MS: 1 ShuffleBytes- +#567103 REDUCE cov: 821 ft: 1651 corp: 164/33Kb lim: 5062 exec/s: 283551 rss: 307Mb L: 24/702 MS: 1 EraseBytes- +#568480 REDUCE cov: 821 ft: 1651 corp: 164/32Kb lim: 5074 exec/s: 284240 rss: 308Mb L: 144/702 MS: 2 PersAutoDict-EraseBytes- DE: "\202\000\000\000\000\000\000\000"- +#583147 REDUCE cov: 821 ft: 1651 corp: 164/32Kb lim: 5218 exec/s: 291573 rss: 315Mb L: 99/702 MS: 2 CopyPart-EraseBytes- +#589213 REDUCE cov: 821 ft: 1651 corp: 164/32Kb lim: 5278 exec/s: 294606 rss: 318Mb L: 91/702 MS: 1 EraseBytes- +#590459 REDUCE cov: 821 ft: 1651 corp: 164/32Kb lim: 5290 exec/s: 295229 rss: 319Mb L: 211/702 MS: 1 EraseBytes- +#597470 REDUCE cov: 821 ft: 1651 corp: 164/32Kb lim: 5350 exec/s: 298735 rss: 322Mb L: 48/702 MS: 1 EraseBytes- +#598701 REDUCE cov: 821 ft: 1651 corp: 164/32Kb lim: 5362 exec/s: 299350 rss: 323Mb L: 198/702 MS: 1 EraseBytes- +#608372 REDUCE cov: 821 ft: 1651 corp: 164/32Kb lim: 5458 exec/s: 304186 rss: 327Mb L: 134/702 MS: 1 EraseBytes- +#615949 REDUCE cov: 821 ft: 1651 corp: 164/32Kb lim: 5530 exec/s: 307974 rss: 331Mb L: 201/702 MS: 2 ChangeBit-EraseBytes- +#629125 REDUCE cov: 821 ft: 1651 corp: 164/32Kb lim: 5650 exec/s: 314562 rss: 337Mb L: 192/702 MS: 1 EraseBytes- +#650996 REDUCE cov: 821 ft: 1651 corp: 164/32Kb lim: 5866 exec/s: 325498 rss: 347Mb L: 210/702 MS: 1 EraseBytes- +#664142 REDUCE cov: 821 ft: 1651 corp: 164/32Kb lim: 5986 exec/s: 221380 rss: 354Mb L: 107/702 MS: 1 EraseBytes- +#669398 REDUCE cov: 821 ft: 1651 corp: 164/32Kb lim: 6034 exec/s: 223132 rss: 356Mb L: 52/702 MS: 1 EraseBytes- +#699145 REDUCE cov: 821 ft: 1651 corp: 164/32Kb lim: 6322 exec/s: 233048 rss: 370Mb L: 89/702 MS: 2 ShuffleBytes-EraseBytes- +#699671 REDUCE cov: 821 ft: 1651 corp: 164/32Kb lim: 6322 exec/s: 233223 rss: 370Mb L: 94/702 MS: 1 EraseBytes- +#701167 REDUCE cov: 821 ft: 1651 corp: 164/32Kb lim: 6334 exec/s: 233722 rss: 371Mb L: 149/702 MS: 1 EraseBytes- +#722689 REDUCE cov: 821 ft: 1651 corp: 164/32Kb lim: 6538 exec/s: 240896 rss: 381Mb L: 141/702 MS: 2 ChangeBit-EraseBytes- +#731020 REDUCE cov: 821 ft: 1651 corp: 164/32Kb lim: 6610 exec/s: 243673 rss: 385Mb L: 124/702 MS: 1 EraseBytes- +#735411 NEW cov: 823 ft: 1653 corp: 165/33Kb lim: 6646 exec/s: 245137 rss: 387Mb L: 93/702 MS: 1 EraseBytes- +#758052 REDUCE cov: 823 ft: 1653 corp: 165/33Kb lim: 6862 exec/s: 252684 rss: 398Mb L: 432/702 MS: 1 EraseBytes- +#758124 REDUCE cov: 823 ft: 1653 corp: 165/33Kb lim: 6862 exec/s: 252708 rss: 398Mb L: 149/702 MS: 2 ChangeASCIIInt-EraseBytes- +#774705 REDUCE cov: 823 ft: 1653 corp: 165/33Kb lim: 7018 exec/s: 258235 rss: 405Mb L: 106/702 MS: 1 EraseBytes- +#776383 REDUCE cov: 823 ft: 1653 corp: 165/33Kb lim: 7030 exec/s: 258794 rss: 406Mb L: 193/702 MS: 3 ChangeByte-InsertByte-EraseBytes- +#781570 REDUCE cov: 823 ft: 1653 corp: 165/33Kb lim: 7078 exec/s: 260523 rss: 409Mb L: 93/702 MS: 2 ShuffleBytes-EraseBytes- +#794087 REDUCE cov: 823 ft: 1653 corp: 165/32Kb lim: 7198 exec/s: 264695 rss: 415Mb L: 138/702 MS: 2 CrossOver-EraseBytes- +#797073 NEW cov: 826 ft: 1656 corp: 166/33Kb lim: 7222 exec/s: 265691 rss: 416Mb L: 65/702 MS: 1 EraseBytes- +#801868 REDUCE cov: 826 ft: 1656 corp: 166/33Kb lim: 7258 exec/s: 267289 rss: 418Mb L: 177/702 MS: 5 ShuffleBytes-ShuffleBytes-CopyPart-ChangeASCIIInt-EraseBytes- +#802084 REDUCE cov: 826 ft: 1656 corp: 166/33Kb lim: 7258 exec/s: 267361 rss: 418Mb L: 97/702 MS: 1 EraseBytes- +#824565 REDUCE cov: 826 ft: 1656 corp: 166/33Kb lim: 7474 exec/s: 274855 rss: 429Mb L: 94/702 MS: 1 EraseBytes- +#834501 REDUCE cov: 826 ft: 1656 corp: 166/33Kb lim: 7570 exec/s: 278167 rss: 433Mb L: 54/702 MS: 1 EraseBytes- +#853142 REDUCE cov: 826 ft: 1656 corp: 166/33Kb lim: 7750 exec/s: 284380 rss: 438Mb L: 95/702 MS: 1 EraseBytes- +#861088 REDUCE cov: 826 ft: 1656 corp: 166/33Kb lim: 7822 exec/s: 287029 rss: 438Mb L: 92/702 MS: 1 EraseBytes- +#880654 REDUCE cov: 826 ft: 1656 corp: 166/33Kb lim: 8014 exec/s: 220163 rss: 440Mb L: 125/702 MS: 1 EraseBytes- +#891285 REDUCE cov: 826 ft: 1656 corp: 166/33Kb lim: 8110 exec/s: 222821 rss: 440Mb L: 87/702 MS: 1 EraseBytes- +#894526 NEW cov: 828 ft: 1658 corp: 167/33Kb lim: 8134 exec/s: 223631 rss: 441Mb L: 85/702 MS: 1 EraseBytes- +#899112 REDUCE cov: 828 ft: 1658 corp: 167/33Kb lim: 8170 exec/s: 224778 rss: 441Mb L: 90/702 MS: 1 EraseBytes- +#917293 REDUCE cov: 828 ft: 1658 corp: 167/33Kb lim: 8350 exec/s: 229323 rss: 443Mb L: 193/702 MS: 1 EraseBytes- +#927389 REDUCE cov: 828 ft: 1658 corp: 167/33Kb lim: 8441 exec/s: 231847 rss: 445Mb L: 184/702 MS: 1 EraseBytes- +#931785 NEW cov: 830 ft: 1660 corp: 168/33Kb lim: 8480 exec/s: 232946 rss: 445Mb L: 83/702 MS: 1 EraseBytes- +#946336 REDUCE cov: 830 ft: 1660 corp: 168/33Kb lim: 8623 exec/s: 236584 rss: 445Mb L: 104/702 MS: 1 EraseBytes- +#948279 NEW cov: 840 ft: 1670 corp: 169/33Kb lim: 8636 exec/s: 237069 rss: 445Mb L: 702/702 MS: 3 ChangeASCIIInt-ChangeBit-CMP- DE: "Q\013^\037k\2665[\233\213\342K\301\016v\035\003\006\225\226P\245\305\244\330\013\363\271\351D\274~"- +#970340 REDUCE cov: 840 ft: 1670 corp: 169/33Kb lim: 8844 exec/s: 242585 rss: 445Mb L: 94/702 MS: 1 EraseBytes- +#985651 REDUCE cov: 840 ft: 1670 corp: 169/33Kb lim: 8987 exec/s: 246412 rss: 446Mb L: 129/702 MS: 1 EraseBytes- +#988762 REDUCE cov: 840 ft: 1670 corp: 169/33Kb lim: 9013 exec/s: 247190 rss: 446Mb L: 194/702 MS: 1 EraseBytes- +#996229 NEW cov: 841 ft: 1672 corp: 170/33Kb lim: 9078 exec/s: 249057 rss: 447Mb L: 134/702 MS: 2 CMP-EraseBytes- DE: "\3422\340lV\340\352i\323\007\257!\242\231\260\326\373\242\255\206\253\335\235M-\016\0204\271\022\330a"- +#1043768 REDUCE cov: 841 ft: 1672 corp: 170/33Kb lim: 9546 exec/s: 260942 rss: 450Mb L: 113/702 MS: 4 InsertRepeatedBytes-CopyPart-EraseBytes-InsertByte- +#1048576 pulse cov: 841 ft: 1672 corp: 170/33Kb lim: 9585 exec/s: 262144 rss: 450Mb +#1073099 REDUCE cov: 842 ft: 1673 corp: 171/34Kb lim: 9832 exec/s: 268274 rss: 450Mb L: 129/702 MS: 1 ShuffleBytes- +#1132246 REDUCE cov: 842 ft: 1673 corp: 171/34Kb lim: 10417 exec/s: 226449 rss: 453Mb L: 144/702 MS: 2 ChangeByte-EraseBytes- +#1149307 REDUCE cov: 842 ft: 1673 corp: 171/34Kb lim: 10586 exec/s: 229861 rss: 453Mb L: 322/702 MS: 1 EraseBytes- +#1175548 REDUCE cov: 842 ft: 1673 corp: 171/34Kb lim: 10846 exec/s: 235109 rss: 456Mb L: 40/702 MS: 1 EraseBytes- +#1189484 REDUCE cov: 842 ft: 1673 corp: 171/34Kb lim: 10976 exec/s: 237896 rss: 456Mb L: 139/702 MS: 1 EraseBytes- +#1212110 REDUCE cov: 842 ft: 1673 corp: 171/34Kb lim: 11197 exec/s: 242422 rss: 456Mb L: 91/702 MS: 1 EraseBytes- +#1224376 REDUCE cov: 842 ft: 1673 corp: 171/34Kb lim: 11314 exec/s: 244875 rss: 456Mb L: 92/702 MS: 1 EraseBytes- +#1239103 REDUCE cov: 842 ft: 1673 corp: 171/34Kb lim: 11457 exec/s: 247820 rss: 456Mb L: 133/702 MS: 2 ChangeBit-EraseBytes- +#1248364 REDUCE cov: 842 ft: 1673 corp: 171/34Kb lim: 11548 exec/s: 249672 rss: 456Mb L: 97/702 MS: 1 EraseBytes- +#1254255 REDUCE cov: 842 ft: 1673 corp: 171/34Kb lim: 11600 exec/s: 250851 rss: 456Mb L: 94/702 MS: 1 EraseBytes- +#1263961 REDUCE cov: 842 ft: 1673 corp: 171/34Kb lim: 11691 exec/s: 252792 rss: 456Mb L: 53/702 MS: 1 EraseBytes- +#1271001 REDUCE cov: 842 ft: 1673 corp: 171/34Kb lim: 11756 exec/s: 254200 rss: 456Mb L: 429/702 MS: 5 EraseBytes-ShuffleBytes-ChangeByte-ShuffleBytes-CMP- DE: "B\275\200\344K\330+\245\361H\330(\347\012\221t\216\344\012\255AZ]\365\277\334\360'\273\305\310\265"- +#1273652 REDUCE cov: 842 ft: 1673 corp: 171/34Kb lim: 11782 exec/s: 254730 rss: 456Mb L: 90/702 MS: 1 EraseBytes- +#1304748 NEW cov: 843 ft: 1677 corp: 172/34Kb lim: 12081 exec/s: 260949 rss: 456Mb L: 123/702 MS: 1 EraseBytes- +#1323654 REDUCE cov: 843 ft: 1677 corp: 172/34Kb lim: 12263 exec/s: 220609 rss: 456Mb L: 83/702 MS: 1 EraseBytes- +#1323730 REDUCE cov: 845 ft: 1681 corp: 173/34Kb lim: 12263 exec/s: 220621 rss: 456Mb L: 82/702 MS: 1 EraseBytes- +#1380019 NEW cov: 849 ft: 1730 corp: 174/34Kb lim: 12822 exec/s: 230003 rss: 458Mb L: 702/702 MS: 4 ShuffleBytes-ChangeASCIIInt-ShuffleBytes-CMP- DE: "\315\025\2701\012z#\245N\362\315=\300\213`;F\343~\204\2470\"[\252\343/xtask) + Compiling keep v0.0.0 () + Compiling keep-fuzz v0.0.0 (/fuzz) + Finished `release` profile [optimized + debuginfo] target(s) in 12.30s + Finished `release` profile [optimized + debuginfo] target(s) in 0.01s + Running `/aarch64-unknown-linux-gnu/release/segment_format -artifact_prefix=/fuzz/artifacts/segment_format/ -runs=1 -timeout=5 -rss_limit_mb=1024 fuzz/corpus/segment_format/recovery-unsupported-partial-seal-version` +INFO: Running with entropic power schedule (0xFF, 100). +INFO: Seed: 2076612330 +INFO: Loaded 1 modules (68145 inline 8-bit counters): 68145 [0xaaaac2e670c0, 0xaaaac2e77af1), +INFO: Loaded 1 PC tables (68145 PCs): 68145 [0xaaaac2e77af8,0xaaaac2f81e08), +/aarch64-unknown-linux-gnu/release/segment_format: Running 1 inputs 1 time(s) each. +Running: fuzz/corpus/segment_format/recovery-unsupported-partial-seal-version + +thread '' (1780079) panicked at fuzz_targets/segment_format.rs:98:17: +assertion `left == right` failed: discardable seal contradicts fixed field at 16 + left: 2 + right: 1 +note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace +==1780079== ERROR: libFuzzer: deadly signal + #0 0xaaaac289f638 (/aarch64-unknown-linux-gnu/release/segment_format+0x2af638) (BuildId: 0e8550fd6e645c555c405b6d285564352028a80e) + #1 0xaaaac28e3440 (/aarch64-unknown-linux-gnu/release/segment_format+0x2f3440) (BuildId: 0e8550fd6e645c555c405b6d285564352028a80e) + #2 0xaaaac28d21ac (/aarch64-unknown-linux-gnu/release/segment_format+0x2e21ac) (BuildId: 0e8550fd6e645c555c405b6d285564352028a80e) + #3 0xffffaf2328bc (linux-vdso.so.1+0x8bc) (BuildId: 91bd37d5562c97f21721e188c8617e7fb312061b) + #4 0xffffaed57d7c (/lib/aarch64-linux-gnu/libc.so.6+0x87d7c) (BuildId: 4c1eca4527d1163b2dde55860b69f270158febb4) + #5 0xffffaed0693c (/lib/aarch64-linux-gnu/libc.so.6+0x3693c) (BuildId: 4c1eca4527d1163b2dde55860b69f270158febb4) + #6 0xffffaecf1a80 (/lib/aarch64-linux-gnu/libc.so.6+0x21a80) (BuildId: 4c1eca4527d1163b2dde55860b69f270158febb4) + #7 0xaaaac2805028 (/aarch64-unknown-linux-gnu/release/segment_format+0x215028) (BuildId: 0e8550fd6e645c555c405b6d285564352028a80e) + #8 0xaaaac2804e78 (/aarch64-unknown-linux-gnu/release/segment_format+0x214e78) (BuildId: 0e8550fd6e645c555c405b6d285564352028a80e) + #9 0xaaaac27ea98c (/aarch64-unknown-linux-gnu/release/segment_format+0x1fa98c) (BuildId: 0e8550fd6e645c555c405b6d285564352028a80e) + #10 0xaaaac2cee06c (/aarch64-unknown-linux-gnu/release/segment_format+0x6fe06c) (BuildId: 0e8550fd6e645c555c405b6d285564352028a80e) + #11 0xaaaac2cdf00c (/aarch64-unknown-linux-gnu/release/segment_format+0x6ef00c) (BuildId: 0e8550fd6e645c555c405b6d285564352028a80e) + #12 0xaaaac2cd9984 (/aarch64-unknown-linux-gnu/release/segment_format+0x6e9984) (BuildId: 0e8550fd6e645c555c405b6d285564352028a80e) + #13 0xaaaac2cdf5d0 (/aarch64-unknown-linux-gnu/release/segment_format+0x6ef5d0) (BuildId: 0e8550fd6e645c555c405b6d285564352028a80e) + #14 0xaaaac28056d0 (/aarch64-unknown-linux-gnu/release/segment_format+0x2156d0) (BuildId: 0e8550fd6e645c555c405b6d285564352028a80e) + #15 0xaaaac28055c4 (/aarch64-unknown-linux-gnu/release/segment_format+0x2155c4) (BuildId: 0e8550fd6e645c555c405b6d285564352028a80e) + #16 0xaaaac27ea5dc (/aarch64-unknown-linux-gnu/release/segment_format+0x1fa5dc) (BuildId: 0e8550fd6e645c555c405b6d285564352028a80e) + #17 0xaaaac28c7b90 (/aarch64-unknown-linux-gnu/release/segment_format+0x2d7b90) (BuildId: 0e8550fd6e645c555c405b6d285564352028a80e) + #18 0xaaaac28cab34 (/aarch64-unknown-linux-gnu/release/segment_format+0x2dab34) (BuildId: 0e8550fd6e645c555c405b6d285564352028a80e) + #19 0xaaaac28cbae0 (/aarch64-unknown-linux-gnu/release/segment_format+0x2dbae0) (BuildId: 0e8550fd6e645c555c405b6d285564352028a80e) + #20 0xaaaac28cc82c (/aarch64-unknown-linux-gnu/release/segment_format+0x2dc82c) (BuildId: 0e8550fd6e645c555c405b6d285564352028a80e) + #21 0xaaaac28cb344 (/aarch64-unknown-linux-gnu/release/segment_format+0x2db344) (BuildId: 0e8550fd6e645c555c405b6d285564352028a80e) + #22 0xaaaac28d270c (/aarch64-unknown-linux-gnu/release/segment_format+0x2e270c) (BuildId: 0e8550fd6e645c555c405b6d285564352028a80e) + #23 0xaaaac28ec470 (/aarch64-unknown-linux-gnu/release/segment_format+0x2fc470) (BuildId: 0e8550fd6e645c555c405b6d285564352028a80e) + #24 0xaaaac28f532c (/aarch64-unknown-linux-gnu/release/segment_format+0x30532c) (BuildId: 0e8550fd6e645c555c405b6d285564352028a80e) + #25 0xaaaac2805980 (/aarch64-unknown-linux-gnu/release/segment_format+0x215980) (BuildId: 0e8550fd6e645c555c405b6d285564352028a80e) + #26 0xffffaecf2258 (/lib/aarch64-linux-gnu/libc.so.6+0x22258) (BuildId: 4c1eca4527d1163b2dde55860b69f270158febb4) + #27 0xffffaecf2338 (/lib/aarch64-linux-gnu/libc.so.6+0x22338) (BuildId: 4c1eca4527d1163b2dde55860b69f270158febb4) + #28 0xaaaac2805aec (/aarch64-unknown-linux-gnu/release/segment_format+0x215aec) (BuildId: 0e8550fd6e645c555c405b6d285564352028a80e) + +NOTE: libFuzzer has rudimentary signal handlers. + Combine libFuzzer with AddressSanitizer or similar for better crash reports. +SUMMARY: libFuzzer: deadly signal +──────────────────────────────────────────────────────────────────────────────── + +Error: Fuzz target exited with exit status: 77 diff --git a/docs/testing-evidence/partial-seal-corruption/materialized-absent-red.txt b/docs/testing-evidence/partial-seal-corruption/materialized-absent-red.txt new file mode 100644 index 00000000..5a5877b3 --- /dev/null +++ b/docs/testing-evidence/partial-seal-corruption/materialized-absent-red.txt @@ -0,0 +1,19 @@ + Compiling xtask v0.0.0 (/xtask) + Finished `test` profile [unoptimized + debuginfo] target(s) in 0.83s + Running unittests src/main.rs (/debug/deps/xtask-b2c3eaacd20fcb12) + +running 1 test +test fuzz_seed_corpus::tests::materialization::seed_preparation_preserves_a_replayable_recovery_counterexample ... FAILED + +failures: + +---- fuzz_seed_corpus::tests::materialization::seed_preparation_preserves_a_replayable_recovery_counterexample stdout ---- +Error: "materialized recovery counterexample is missing" + + +failures: + fuzz_seed_corpus::tests::materialization::seed_preparation_preserves_a_replayable_recovery_counterexample + +test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 303 filtered out; finished in 0.12s + +error: test failed, to rerun pass `-p xtask --bin xtask` diff --git a/docs/testing-evidence/partial-seal-corruption/materialized-absent.patch b/docs/testing-evidence/partial-seal-corruption/materialized-absent.patch new file mode 100644 index 00000000..46bb8b5e --- /dev/null +++ b/docs/testing-evidence/partial-seal-corruption/materialized-absent.patch @@ -0,0 +1,7 @@ +--- a/xtask/src/fuzz_seed_corpus/segment_seeds.rs ++++ b/xtask/src/fuzz_seed_corpus/segment_seeds.rs +@@ -61,3 +61,3 @@ + .map_err(|source| FuzzSeedError::violation(format!("recovery counterexample: {source}")))?; +- seed(5, "recovery-unsupported-partial-seal-version", &bytes) ++ seed(5, "missing-recovery-input", &bytes) + } diff --git a/docs/testing-evidence/partial-seal-corruption/materialized-diagnostic-red.txt b/docs/testing-evidence/partial-seal-corruption/materialized-diagnostic-red.txt new file mode 100644 index 00000000..ed6ed2ed --- /dev/null +++ b/docs/testing-evidence/partial-seal-corruption/materialized-diagnostic-red.txt @@ -0,0 +1,25 @@ + Compiling keep v0.0.0 () + Compiling xtask v0.0.0 (/xtask) + Finished `test` profile [unoptimized + debuginfo] target(s) in 1.80s + Running unittests src/main.rs (/debug/deps/xtask-b2c3eaacd20fcb12) + +running 1 test +test fuzz_seed_corpus::tests::materialization::seed_preparation_preserves_a_replayable_recovery_counterexample ... FAILED + +failures: + +---- fuzz_seed_corpus::tests::materialization::seed_preparation_preserves_a_replayable_recovery_counterexample stdout ---- + +thread 'fuzz_seed_corpus::tests::materialization::seed_preparation_preserves_a_replayable_recovery_counterexample' (1801219) panicked at xtask/src/fuzz_seed_corpus/tests/materialization.rs:157:5: +assertion `left == right` failed + left: UnsupportedVersion { expected: 1, observed: 1 } + right: UnsupportedVersion { expected: 1, observed: 2 } +note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace + + +failures: + fuzz_seed_corpus::tests::materialization::seed_preparation_preserves_a_replayable_recovery_counterexample + +test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 303 filtered out; finished in 0.14s + +error: test failed, to rerun pass `-p xtask --bin xtask` diff --git a/docs/testing-evidence/partial-seal-corruption/materialized-green.txt b/docs/testing-evidence/partial-seal-corruption/materialized-green.txt new file mode 100644 index 00000000..13ad5b15 --- /dev/null +++ b/docs/testing-evidence/partial-seal-corruption/materialized-green.txt @@ -0,0 +1,23 @@ + Compiling xtask v0.0.0 (/xtask) + Finished `test` profile [unoptimized + debuginfo] target(s) in 0.91s + Running unittests src/main.rs (/debug/deps/xtask-b2c3eaacd20fcb12) + +running 1 test +test fuzz_seed_corpus::tests::materialization::seed_preparation_preserves_a_replayable_recovery_counterexample ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 303 filtered out; finished in 0.25s + + Compiling keep v0.0.0 () + Compiling xtask v0.0.0 (/xtask) + Finished `release` profile [optimized] target(s) in 4.42s + Running unittests src/main.rs (/release/deps/xtask-9acf4f0e621733b7) + +running 1 test +test fuzz_seed_corpus::tests::materialization::seed_preparation_preserves_a_replayable_recovery_counterexample ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 303 filtered out; finished in 0.19s + + Checking keep v0.0.0 () + Checking xtask v0.0.0 (/xtask) + Checking keep-benchmark v0.0.0 (/benchmark) + Finished `dev` profile [unoptimized + debuginfo] target(s) in 2.73s diff --git a/docs/testing-evidence/partial-seal-corruption/materialized-selector-red.txt b/docs/testing-evidence/partial-seal-corruption/materialized-selector-red.txt new file mode 100644 index 00000000..0a361704 --- /dev/null +++ b/docs/testing-evidence/partial-seal-corruption/materialized-selector-red.txt @@ -0,0 +1,25 @@ + Compiling keep v0.0.0 () + Compiling xtask v0.0.0 (/xtask) + Finished `test` profile [unoptimized + debuginfo] target(s) in 1.36s + Running unittests src/main.rs (/debug/deps/xtask-b2c3eaacd20fcb12) + +running 1 test +test fuzz_seed_corpus::tests::materialization::seed_preparation_preserves_a_replayable_recovery_counterexample ... FAILED + +failures: + +---- fuzz_seed_corpus::tests::materialization::seed_preparation_preserves_a_replayable_recovery_counterexample stdout ---- + +thread 'fuzz_seed_corpus::tests::materialization::seed_preparation_preserves_a_replayable_recovery_counterexample' (1801843) panicked at xtask/src/fuzz_seed_corpus/tests/materialization.rs:150:5: +assertion `left == right` failed: counterexample must reach the recovery parser + left: 4 + right: 5 +note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace + + +failures: + fuzz_seed_corpus::tests::materialization::seed_preparation_preserves_a_replayable_recovery_counterexample + +test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 303 filtered out; finished in 0.15s + +error: test failed, to rerun pass `-p xtask --bin xtask` diff --git a/docs/testing-evidence/partial-seal-corruption/materialized-selector.patch b/docs/testing-evidence/partial-seal-corruption/materialized-selector.patch new file mode 100644 index 00000000..b1889d4d --- /dev/null +++ b/docs/testing-evidence/partial-seal-corruption/materialized-selector.patch @@ -0,0 +1,7 @@ +--- a/xtask/src/fuzz_seed_corpus/segment_seeds.rs ++++ b/xtask/src/fuzz_seed_corpus/segment_seeds.rs +@@ -61,3 +61,3 @@ + .map_err(|source| FuzzSeedError::violation(format!("recovery counterexample: {source}")))?; +- seed(5, "recovery-unsupported-partial-seal-version", &bytes) ++ seed(4, "recovery-unsupported-partial-seal-version", &bytes) + } diff --git a/docs/testing-evidence/partial-seal-corruption/parent-red.txt b/docs/testing-evidence/partial-seal-corruption/parent-red.txt new file mode 100644 index 00000000..8ad1e072 --- /dev/null +++ b/docs/testing-evidence/partial-seal-corruption/parent-red.txt @@ -0,0 +1,61 @@ + Compiling rustix v1.1.4 + Compiling io-lifetimes v2.0.4 + Compiling io-lifetimes v3.0.1 + Compiling bitflags v2.13.1 + Compiling linux-raw-sys v0.12.1 + Compiling proc-macro2 v1.0.107 + Compiling io-extras v0.19.0 + Compiling cap-primitives v4.0.2 + Compiling once_cell v1.21.4 + Compiling shlex v2.0.1 + Compiling quote v1.0.47 + Compiling unicode-ident v1.0.24 + Compiling find-msvc-tools v0.1.9 + Compiling ipnet v2.12.0 + Compiling cap-std v4.0.2 + Compiling maybe-owned v0.3.4 + Compiling ambient-authority v0.0.2 + Compiling clap_lex v1.1.0 + Compiling cap-fs-ext v4.0.2 + Compiling anstyle v1.0.14 + Compiling libc v0.2.186 + Compiling cfg-if v1.0.4 + Compiling cc v1.3.0 + Compiling constant_time_eq v0.4.2 + Compiling arrayvec v0.7.8 + Compiling clap_builder v4.6.2 + Compiling arrayref v0.3.9 + Compiling regex-lite v0.1.9 + Compiling condtype v1.3.0 + Compiling allocation-counter v0.8.1 + Compiling syn v2.0.119 + Compiling blake3 v1.8.5 + Compiling clap v4.6.4 + Compiling rustix-linux-procfs v0.1.1 + Compiling fs-set-times v0.20.3 + Compiling divan-macros v0.1.21 + Compiling keep v0.0.0 () + Compiling divan v0.1.21 + Finished `test` profile [unoptimized + debuginfo] target(s) in 3.65s + Running tests/recovery_partial_seal.rs (/debug/deps/recovery_partial_seal-50cc4959e316d0ba) + +running 2 tests +test unsupported_partial_seal_version_refuses_classification ... FAILED +test unsupported_partial_seal_version_refuses_discard_assessment ... FAILED + +failures: + +---- unsupported_partial_seal_version_refuses_classification stdout ---- +Error: "unsupported seal version admitted as discardable truncation" + +---- unsupported_partial_seal_version_refuses_discard_assessment stdout ---- +Error: "contradictory seal received a discardable assessment" + + +failures: + unsupported_partial_seal_version_refuses_classification + unsupported_partial_seal_version_refuses_discard_assessment + +test result: FAILED. 0 passed; 2 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + +error: test failed, to rerun pass `--test recovery_partial_seal` diff --git a/docs/testing-evidence/partial-seal-corruption/recovery-green.txt b/docs/testing-evidence/partial-seal-corruption/recovery-green.txt new file mode 100644 index 00000000..3c1333a8 --- /dev/null +++ b/docs/testing-evidence/partial-seal-corruption/recovery-green.txt @@ -0,0 +1,117 @@ + Compiling keep v0.0.0 () + Finished `test` profile [unoptimized + debuginfo] target(s) in 0.32s + Running tests/recovery_partial_seal.rs (/debug/deps/recovery_partial_seal-50cc4959e316d0ba) + +running 3 tests +test unsupported_partial_seal_version_refuses_classification ... ok +test unsupported_partial_seal_version_refuses_discard_assessment ... ok +test framing_laws::available_fixed_seal_contradictions_refuse_every_later_short_boundary ... ok + +test result: ok. 3 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.02s + + Compiling keep v0.0.0 () + Finished `release` profile [optimized] target(s) in 0.22s + Running tests/recovery_partial_seal.rs (/release/deps/recovery_partial_seal-6b9a4d5315d5b74a) + +running 3 tests +test unsupported_partial_seal_version_refuses_classification ... ok +test unsupported_partial_seal_version_refuses_discard_assessment ... ok +test framing_laws::available_fixed_seal_contradictions_refuse_every_later_short_boundary ... ok + +test result: ok. 3 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + + Compiling keep v0.0.0 () + Finished `test` profile [unoptimized + debuginfo] target(s) in 0.40s + Running tests/recovery_segment_classification.rs (/debug/deps/recovery_segment_classification-b554af50be399ceb) + +running 15 tests +test refusal_laws::complete_invalid_header_is_a_typed_refusal ... ok +test refusal_laws::complete_invalid_record_is_a_typed_refusal ... ok +test refusal_laws::duplicate_reusable_records_are_never_resumable ... ok +test refusal_laws::reusable_record_count_obeys_the_caller_limit ... ok +test refusal_laws::fixed_width_tail_with_invalid_seal_magic_stays_a_seal_refusal ... ok +test refusal_laws::every_corrupt_available_segment_header_byte_is_refused ... ok +test state_laws::canonical_header_is_a_reusable_empty_stage ... ok +test refusal_laws::every_corrupt_available_record_framing_byte_is_refused ... ok +test state_laws::partial_fixed_header_is_exactly_truncated ... ok +test state_laws::canonical_record_prefix_is_reusable_without_rewriting ... ok +test state_laws::canonical_sealed_stage_is_a_complete_segment ... ok +test refusal_laws::complete_invalid_seal_is_a_typed_refusal ... ok +test state_laws::partial_record_header_is_exactly_truncated ... ok +test state_laws::partial_record_body_is_exactly_truncated ... ok +test state_laws::partial_seal_is_exactly_truncated ... ok + +test result: ok. 15 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + + Running tests/recovery_stage_assessment.rs (/debug/deps/recovery_stage_assessment-d828aaa2a6508b53) + +running 6 tests +test admission_laws::canonical_name_stage_mismatch_refuses_before_byte_admission ... ok +test admission_laws::same_length_mutation_refuses_by_fingerprint ... ok +test assessment_laws::matching_evidence_does_not_sanitize_corrupt_content ... ok +test admission_laws::changed_length_refuses_before_fingerprint_comparison ... ok +test assessment_laws::every_fixed_stage_dispatches_to_its_only_semantic_classifier ... ok +test admission_laws::exact_stage_bytes_retain_their_prior_evidence ... ok + +test result: ok. 6 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + + Running tests/recovery_stage_discard.rs (/debug/deps/recovery_stage_discard-ee3a70bf405c9e63) + +running 7 tests +test execution_laws::retry_after_remove_before_parent_sync_is_idempotent ... ok +test execution_laws::exact_evidence_is_removed_before_its_parent_is_synchronized ... ok +test execution_laws::changed_evidence_refuses_without_removal_or_parent_sync ... ok +test execution_laws::absent_exact_retry_still_synchronizes_the_selected_parent ... ok +test planning_laws::every_exact_truncation_retains_its_reason_and_evidence ... ok +test planning_laws::reusable_segment_prefix_cannot_form_a_discard_request ... ok +test planning_laws::complete_stages_cannot_form_truncation_discard_requests ... ok + +test result: ok. 7 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + + Compiling keep v0.0.0 () + Finished `release` profile [optimized] target(s) in 0.27s + Running tests/recovery_segment_classification.rs (/release/deps/recovery_segment_classification-a7fe10ff49d492c5) + +running 15 tests +test refusal_laws::complete_invalid_header_is_a_typed_refusal ... ok +test refusal_laws::complete_invalid_record_is_a_typed_refusal ... ok +test refusal_laws::every_corrupt_available_record_framing_byte_is_refused ... ok +test refusal_laws::reusable_record_count_obeys_the_caller_limit ... ok +test refusal_laws::every_corrupt_available_segment_header_byte_is_refused ... ok +test state_laws::canonical_header_is_a_reusable_empty_stage ... ok +test state_laws::canonical_record_prefix_is_reusable_without_rewriting ... ok +test state_laws::canonical_sealed_stage_is_a_complete_segment ... ok +test state_laws::partial_fixed_header_is_exactly_truncated ... ok +test state_laws::partial_record_header_is_exactly_truncated ... ok +test state_laws::partial_seal_is_exactly_truncated ... ok +test refusal_laws::fixed_width_tail_with_invalid_seal_magic_stays_a_seal_refusal ... ok +test refusal_laws::complete_invalid_seal_is_a_typed_refusal ... ok +test state_laws::partial_record_body_is_exactly_truncated ... ok +test refusal_laws::duplicate_reusable_records_are_never_resumable ... ok + +test result: ok. 15 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + + Running tests/recovery_stage_assessment.rs (/release/deps/recovery_stage_assessment-8592cb6a93edcc9c) + +running 6 tests +test admission_laws::changed_length_refuses_before_fingerprint_comparison ... ok +test admission_laws::canonical_name_stage_mismatch_refuses_before_byte_admission ... ok +test admission_laws::same_length_mutation_refuses_by_fingerprint ... ok +test assessment_laws::every_fixed_stage_dispatches_to_its_only_semantic_classifier ... ok +test admission_laws::exact_stage_bytes_retain_their_prior_evidence ... ok +test assessment_laws::matching_evidence_does_not_sanitize_corrupt_content ... ok + +test result: ok. 6 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + + Running tests/recovery_stage_discard.rs (/release/deps/recovery_stage_discard-a4ec45a68810a67f) + +running 7 tests +test execution_laws::absent_exact_retry_still_synchronizes_the_selected_parent ... ok +test execution_laws::exact_evidence_is_removed_before_its_parent_is_synchronized ... ok +test execution_laws::changed_evidence_refuses_without_removal_or_parent_sync ... ok +test execution_laws::retry_after_remove_before_parent_sync_is_idempotent ... ok +test planning_laws::reusable_segment_prefix_cannot_form_a_discard_request ... ok +test planning_laws::every_exact_truncation_retains_its_reason_and_evidence ... ok +test planning_laws::complete_stages_cannot_form_truncation_discard_requests ... ok + +test result: ok. 7 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s diff --git a/docs/testing-evidence/partial-seal-corruption/reduced-parent-runtime-red.txt b/docs/testing-evidence/partial-seal-corruption/reduced-parent-runtime-red.txt new file mode 100644 index 00000000..99fd5d8e --- /dev/null +++ b/docs/testing-evidence/partial-seal-corruption/reduced-parent-runtime-red.txt @@ -0,0 +1,29 @@ + Compiling keep v0.0.0 () + Finished `test` profile [unoptimized + debuginfo] target(s) in 0.37s + Running tests/recovery_partial_seal.rs (/debug/deps/recovery_partial_seal-50cc4959e316d0ba) + +running 3 tests +test unsupported_partial_seal_version_refuses_classification ... FAILED +test unsupported_partial_seal_version_refuses_discard_assessment ... FAILED +test framing_laws::available_fixed_seal_contradictions_refuse_every_later_short_boundary ... FAILED + +failures: + +---- unsupported_partial_seal_version_refuses_classification stdout ---- +Error: "unsupported seal version admitted as discardable truncation" + +---- unsupported_partial_seal_version_refuses_discard_assessment stdout ---- +Error: "contradictory seal received a discardable assessment" + +---- framing_laws::available_fixed_seal_contradictions_refuse_every_later_short_boundary stdout ---- +Error: "offset=16, observed=17: corrupt seal admitted" + + +failures: + framing_laws::available_fixed_seal_contradictions_refuse_every_later_short_boundary + unsupported_partial_seal_version_refuses_classification + unsupported_partial_seal_version_refuses_discard_assessment + +test result: FAILED. 0 passed; 3 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + +error: test failed, to rerun pass `--test recovery_partial_seal` diff --git a/docs/testing-evidence/partial-seal-corruption/wrong-coordinate-red.txt b/docs/testing-evidence/partial-seal-corruption/wrong-coordinate-red.txt new file mode 100644 index 00000000..6f2a751e --- /dev/null +++ b/docs/testing-evidence/partial-seal-corruption/wrong-coordinate-red.txt @@ -0,0 +1,24 @@ + Compiling keep v0.0.0 () + Finished `test` profile [unoptimized + debuginfo] target(s) in 0.93s + Running tests/recovery_partial_seal.rs (/debug/deps/recovery_partial_seal-50cc4959e316d0ba) + +running 3 tests +test unsupported_partial_seal_version_refuses_classification ... ok +test unsupported_partial_seal_version_refuses_discard_assessment ... ok +test framing_laws::available_fixed_seal_contradictions_refuse_every_later_short_boundary ... FAILED + +failures: + +---- framing_laws::available_fixed_seal_contradictions_refuse_every_later_short_boundary stdout ---- + +thread 'framing_laws::available_fixed_seal_contradictions_refuse_every_later_short_boundary' (1794445) panicked at tests/recovery_partial_seal/framing_laws.rs:47:17: +unobserved mutation offset=16, observed=16 must not become corruption +note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace + + +failures: + framing_laws::available_fixed_seal_contradictions_refuse_every_later_short_boundary + +test result: FAILED. 2 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + +error: test failed, to rerun pass `--test recovery_partial_seal` diff --git a/docs/testing-evidence/partial-seal-corruption/wrong-coordinate.patch b/docs/testing-evidence/partial-seal-corruption/wrong-coordinate.patch new file mode 100644 index 00000000..5059cd2c --- /dev/null +++ b/docs/testing-evidence/partial-seal-corruption/wrong-coordinate.patch @@ -0,0 +1,11 @@ +--- a/src/adapters/recovery/recovery_segment_classifier.rs ++++ b/src/adapters/recovery/recovery_segment_classifier.rs +@@ -74,7 +74,7 @@ + RecoverySegmentTruncation::Seal { + offset: cursor.offset, + required: SegmentSeal::ENCODED_LENGTH, +- observed: cursor.remaining.len(), ++ observed: 0, + }, + )); + } diff --git a/docs/testing-evidence/partial-seal-corruption/wrong-diagnostic-red.txt b/docs/testing-evidence/partial-seal-corruption/wrong-diagnostic-red.txt new file mode 100644 index 00000000..d456bb5c --- /dev/null +++ b/docs/testing-evidence/partial-seal-corruption/wrong-diagnostic-red.txt @@ -0,0 +1,42 @@ + Compiling keep v0.0.0 () + Finished `test` profile [unoptimized + debuginfo] target(s) in 0.84s + Running tests/recovery_partial_seal.rs (/debug/deps/recovery_partial_seal-50cc4959e316d0ba) + +running 3 tests +test framing_laws::available_fixed_seal_contradictions_refuse_every_later_short_boundary ... FAILED +test unsupported_partial_seal_version_refuses_discard_assessment ... FAILED +test unsupported_partial_seal_version_refuses_classification ... FAILED + +failures: + +---- framing_laws::available_fixed_seal_contradictions_refuse_every_later_short_boundary stdout ---- + +thread 'framing_laws::available_fixed_seal_contradictions_refuse_every_later_short_boundary' (1793745) panicked at tests/recovery_partial_seal/framing_laws.rs:41:17: +assertion `left == right` failed: offset=16, observed=17 + left: Some(UnsupportedVersion { expected: 1, observed: 1 }) + right: Some(UnsupportedVersion { expected: 1, observed: 257 }) + +---- unsupported_partial_seal_version_refuses_discard_assessment stdout ---- + +thread 'unsupported_partial_seal_version_refuses_discard_assessment' (1793747) panicked at tests/recovery_partial_seal.rs:45:5: +assertion `left == right` failed + left: Some(UnsupportedVersion { expected: 1, observed: 1 }) + right: Some(UnsupportedVersion { expected: 1, observed: 2 }) + +---- unsupported_partial_seal_version_refuses_classification stdout ---- + +thread 'unsupported_partial_seal_version_refuses_classification' (1793746) panicked at tests/recovery_partial_seal.rs:23:5: +assertion `left == right` failed + left: Some(UnsupportedVersion { expected: 1, observed: 1 }) + right: Some(UnsupportedVersion { expected: 1, observed: 2 }) +note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace + + +failures: + framing_laws::available_fixed_seal_contradictions_refuse_every_later_short_boundary + unsupported_partial_seal_version_refuses_classification + unsupported_partial_seal_version_refuses_discard_assessment + +test result: FAILED. 0 passed; 3 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + +error: test failed, to rerun pass `--test recovery_partial_seal` diff --git a/docs/testing-evidence/partial-seal-corruption/wrong-diagnostic.patch b/docs/testing-evidence/partial-seal-corruption/wrong-diagnostic.patch new file mode 100644 index 00000000..a3779dbe --- /dev/null +++ b/docs/testing-evidence/partial-seal-corruption/wrong-diagnostic.patch @@ -0,0 +1,10 @@ +--- a/src/adapters/recovery/recovery_segment_seal_framing.rs ++++ b/src/adapters/recovery/recovery_segment_seal_framing.rs +@@ -62,6 +62,6 @@ + if observed == expected { + Ok(()) + } else { +- Err(error(expected, observed)) ++ Err(error(expected, expected)) + } + } diff --git a/fuzz/README.md b/fuzz/README.md index fcccd99e..f310a259 100644 --- a/fuzz/README.md +++ b/fuzz/README.md @@ -79,7 +79,7 @@ The `segment_format` seeds select the public segment-header, record-header, complete-record, seal, and complete-segment boundaries. Canonical empty, one-record, and bundled segments keep mutations inside the nested parsers; every admitted fixed-width value must re-encode byte-for-byte, and every -admitted segment must retain its exact bytes and declared record count. Run +admitted segment must retain its exact bytes and declared record count. The recovery selector also invokes whole-byte stage classification and requires every available fixed seal byte in a discardable truncation to match the independently specified format. Its permanent unsupported-version counterexample lives in `tests/fixtures/recovery/` and is replayed by ordinary runtime tests as well as seeded fuzzing. Run the reviewed smoke campaign across every registered target with: ```bash diff --git a/fuzz/fuzz_targets/segment_format.rs b/fuzz/fuzz_targets/segment_format.rs index 4e5b75ed..c653140f 100644 --- a/fuzz/fuzz_targets/segment_format.rs +++ b/fuzz/fuzz_targets/segment_format.rs @@ -6,6 +6,7 @@ use keep::{ AdmittedSegment, ChecksummedSegmentRecord, LayoutEntryLimit, SegmentHeader, SegmentReadPolicy, SegmentRecordHeader, SegmentRecordLimit, SegmentSeal, }; +use keep::{RecoverySegmentStage, RecoverySegmentTruncation, classify_recovery_segment_stage}; use libfuzzer_sys::fuzz_target; fuzz_target!(|bytes: &[u8]| { @@ -17,6 +18,7 @@ fuzz_target!(|bytes: &[u8]| { 1 => record_header(input), 2 => record(input), 3 => seal(input), + 5 => recovery(input), _ => segment(input), } }); @@ -64,3 +66,46 @@ fn segment(input: &[u8]) { ); } } + +fn recovery(input: &[u8]) { + if let Ok(RecoverySegmentStage::Truncated(RecoverySegmentTruncation::Seal { + offset, + required, + observed, + })) = classify_recovery_segment_stage(input, SegmentReadPolicy::MAXIMUM) + { + let offset = usize::try_from(offset); + assert!(offset.is_ok(), "seal offset must fit its supplied slice"); + if let Ok(offset) = offset { + let tail = input.get(offset..); + assert!(tail.is_some(), "seal offset must be within supplied bytes"); + if let Some(tail) = tail { + assert_eq!(tail.len(), observed); + assert_eq!(required, 128); + assert!(observed < required); + fixed_fields(tail); + } + } + } +} + +fn fixed_fields(tail: &[u8]) { + // Specified bytes, independent of the production validator/constants. + for (offset, expected) in [ + (16, &[0, 1][..]), + (18, &[0, 0][..]), + (20, &[0, 128][..]), + (22, &[0, 0][..]), + (28, &[0, 0, 0, 0][..]), + (56, &[1, 1, 0, 0, 0, 0, 0, 0][..]), + ] { + if let Some(available) = tail.get(offset..) { + for (actual, canonical) in available.iter().zip(expected) { + assert_eq!( + actual, canonical, + "discardable seal contradicts fixed field at {offset}" + ); + } + } + } +} diff --git a/src/adapters/recovery.rs b/src/adapters/recovery.rs index 02f35503..ab1d3263 100644 --- a/src/adapters/recovery.rs +++ b/src/adapters/recovery.rs @@ -43,6 +43,7 @@ mod recovery_segment_resume_request; pub(in crate::adapters) mod recovery_segment_resume_state; mod recovery_segment_resume_storage; mod recovery_segment_resume_storage_error; +mod recovery_segment_seal_framing; mod recovery_segment_stage; mod recovery_segment_stage_error; mod recovery_segment_truncation; diff --git a/src/adapters/recovery/rationale.md b/src/adapters/recovery/rationale.md new file mode 100644 index 00000000..1e9b3794 --- /dev/null +++ b/src/adapters/recovery/rationale.md @@ -0,0 +1,5 @@ +# Partial seal contradiction admission + +KEEP-RECOVERY-010 distinguishes demonstrably corrupt framing from an incomplete segment. A recognized seal magic is insufficient to authorize truncation: already-observed version, flags, length, algorithm and reserved bytes must agree with the version-one format before assessment can issue a discardable state (#171). + +The seal-prefix validator borrows format constants and returns existing precise seal diagnostics through an explicit incomplete-seal error boundary. Missing bytes are filled only in temporary fixed-field comparisons; the result never admits those bytes or promises that variable coordinates, digests or the entire seal have a canonical future completion. Complete-seal admission remains the full decoder's responsibility. This correction adds no on-disk format or recovery mutation capability and does not change the separate version-two incomplete-retention-stage disposition policy. diff --git a/src/adapters/recovery/recovery_segment_classifier.rs b/src/adapters/recovery/recovery_segment_classifier.rs index 51cbccf6..a897831c 100644 --- a/src/adapters/recovery/recovery_segment_classifier.rs +++ b/src/adapters/recovery/recovery_segment_classifier.rs @@ -68,6 +68,8 @@ fn classify_tail( } if is_seal_candidate(cursor.remaining) { if cursor.remaining.len() < SegmentSeal::ENCODED_LENGTH { + super::recovery_segment_seal_framing::validate(cursor.remaining) + .map_err(|source| RecoverySegmentStageError::Seal { source })?; return Ok(RecoverySegmentStage::Truncated( RecoverySegmentTruncation::Seal { offset: cursor.offset, diff --git a/src/adapters/recovery/recovery_segment_seal_framing.rs b/src/adapters/recovery/recovery_segment_seal_framing.rs new file mode 100644 index 00000000..f1d2a5d1 --- /dev/null +++ b/src/adapters/recovery/recovery_segment_seal_framing.rs @@ -0,0 +1,67 @@ +//! This module owns contradiction checks for available fixed seal framing. + +use super::recovery_fixed_field_prefix::observed_field; +use super::segment_seal::{ALGORITHM, FLAGS, SEAL_LENGTH, VERSION}; +use crate::adapters::SegmentSealError; + +// Canonical completion is only an instrument for detecting fixed-field +// contradictions. It does not admit absent bytes or prove seal completion. +pub(super) fn validate(encoded: &[u8]) -> Result<(), SegmentSealError> { + require_u16(encoded, 16, VERSION, |expected, observed| { + SegmentSealError::UnsupportedVersion { expected, observed } + })?; + require_u16(encoded, 18, FLAGS, |expected, observed| { + SegmentSealError::UnknownFlags { expected, observed } + })?; + require_u16(encoded, 20, SEAL_LENGTH, |expected, observed| { + SegmentSealError::SealLength { expected, observed } + })?; + require_u16(encoded, 22, 0, |expected, observed| { + SegmentSealError::ReservedU16 { expected, observed } + })?; + let observed = u32::from_be_bytes(observed_field(encoded, 28, [0; 4])); + if observed != 0 { + return Err(SegmentSealError::ReservedU32 { + expected: 0, + observed, + }); + } + validate_algorithms(encoded) +} + +fn validate_algorithms(encoded: &[u8]) -> Result<(), SegmentSealError> { + let checksum = observed_field(encoded, 56, [ALGORITHM]); + if checksum != [ALGORITHM] { + return Err(SegmentSealError::SealChecksumAlgorithm { + expected: ALGORITHM, + observed: u8::from_be_bytes(checksum), + }); + } + let digest = observed_field(encoded, 57, [ALGORITHM]); + if digest != [ALGORITHM] { + return Err(SegmentSealError::SegmentDigestAlgorithm { + expected: ALGORITHM, + observed: u8::from_be_bytes(digest), + }); + } + let expected = [0; 6]; + let observed = observed_field(encoded, 58, expected); + if observed != expected { + return Err(SegmentSealError::ReservedBytes { expected, observed }); + } + Ok(()) +} + +fn require_u16( + encoded: &[u8], + offset: usize, + expected: u16, + error: fn(u16, u16) -> SegmentSealError, +) -> Result<(), SegmentSealError> { + let observed = u16::from_be_bytes(observed_field(encoded, offset, expected.to_be_bytes())); + if observed == expected { + Ok(()) + } else { + Err(error(expected, observed)) + } +} diff --git a/src/adapters/recovery/recovery_segment_stage_error.rs b/src/adapters/recovery/recovery_segment_stage_error.rs index 5e4bf570..32a68b3c 100644 --- a/src/adapters/recovery/recovery_segment_stage_error.rs +++ b/src/adapters/recovery/recovery_segment_stage_error.rs @@ -4,6 +4,7 @@ use std::error::Error; use std::fmt; use super::{RecoveryStageMetadataError, SegmentHeaderError, SegmentReadError}; +use crate::adapters::SegmentSealError; /// Why complete supplied `current.seg` bytes could not be classified lawfully. #[derive(Debug)] @@ -28,6 +29,11 @@ pub enum RecoverySegmentStageError { /// Exact record or prefix refusal. source: SegmentReadError, }, + /// Available fixed framing in an incomplete seal is contradictory. + Seal { + /// Exact seal-framing refusal; absent bytes are not admitted. + source: SegmentSealError, + }, /// A complete-looking sealed segment was refused. Complete { /// Exact immutable-segment refusal. @@ -57,6 +63,9 @@ impl fmt::Display for RecoverySegmentStageError { Self::Complete { source } => { write!(formatter, "complete segment stage was refused: {source}") } + Self::Seal { source } => { + write!(formatter, "incomplete segment seal was refused: {source}") + } } } } @@ -66,6 +75,7 @@ impl Error for RecoverySegmentStageError { match self { Self::Metadata { source } => Some(source), Self::Header { source } => Some(source), + Self::Seal { source } => Some(source), Self::Record { source } | Self::Complete { source } => Some(source), Self::AddressSpace { .. } => None, } diff --git a/tests/fixtures/recovery/README.md b/tests/fixtures/recovery/README.md new file mode 100644 index 00000000..ae7b04f7 --- /dev/null +++ b/tests/fixtures/recovery/README.md @@ -0,0 +1,5 @@ +# Recovery counterexamples + +`unsupported-partial-seal-version.hex` is a version-one empty-segment header followed by the seal magic and version 2. It derives from `conformance/segment-store/v1/empty-segment.hex` by removing records and the seal suffix and changing the version's low byte. It retains only the 82 bytes needed to present this particular unsupported version after a valid header and seal discriminator. This is a corrupt regression input, not a canonical format vector. + +The public `recovery_partial_seal` tests replay it on every ordinary test pass. `cargo xtask prepare-fuzz-corpus` additionally prefixes selector 5 and materializes it for the registered `segment_format` target. The fixed-framing oracle must reject a discardable classification for these bytes; the replay was observed RED against main and GREEN with #171. Preserve this input unless a stronger, cheaper runtime law demonstrably subsumes its corruption/refusal contract. diff --git a/tests/fixtures/recovery/unsupported-partial-seal-version.hex b/tests/fixtures/recovery/unsupported-partial-seal-version.hex new file mode 100644 index 00000000..e1de83bd --- /dev/null +++ b/tests/fixtures/recovery/unsupported-partial-seal-version.hex @@ -0,0 +1 @@ +4b4545503a5345474d454e543a5631000001000000400070008000000000000004000000000000004000000000100000010100000000000000000000000000004b4545503a5345474d454e543a454e440002 diff --git a/tests/recovery_partial_seal.rs b/tests/recovery_partial_seal.rs new file mode 100644 index 00000000..55be45fb --- /dev/null +++ b/tests/recovery_partial_seal.rs @@ -0,0 +1,70 @@ +//! Runtime refusal laws for contradictory incomplete segment seals. + +#[path = "recovery_partial_seal/framing_laws.rs"] +mod framing_laws; +mod support; + +use std::error::Error; + +use keep::{ + RecoveryStage, RecoveryStageMetadata, SegmentReadPolicy, SegmentSealError, + admit_recovery_stage_bytes, assess_recovery_stage, classify_recovery_segment_stage, + fingerprint_recovery_stage, +}; + +// Size: small. Oracle: KEEP-RECOVERY-010 and the v1 seal version is exactly 1. +// Delete only if a stronger public corruption law subsumes this counterexample. +#[test] +fn unsupported_partial_seal_version_refuses_classification() -> Result<(), Box> { + let bytes = unsupported_version_prefix()?; + let error = classify_recovery_segment_stage(&bytes, SegmentReadPolicy::MAXIMUM) + .err() + .ok_or("unsupported seal version admitted as discardable truncation")?; + assert_eq!( + seal_cause(&error), + Some(&SegmentSealError::UnsupportedVersion { + expected: 1, + observed: 2 + }) + ); + Ok(()) +} + +// Size: small. Oracle: fingerprint-bound corruption cannot authorize discard. +// Delete only if another assessment law subsumes this precise refusal. +#[test] +fn unsupported_partial_seal_version_refuses_discard_assessment() -> Result<(), Box> { + let bytes = unsupported_version_prefix()?; + let stage = RecoveryStage::Segment; + let metadata = RecoveryStageMetadata::new(stage, u64::try_from(bytes.len())?)?; + let fingerprint = fingerprint_recovery_stage(metadata, bytes.as_slice())?; + let admitted = admit_recovery_stage_bytes(stage, fingerprint, &bytes)?; + let error = assess_recovery_stage(&admitted, SegmentReadPolicy::MAXIMUM) + .err() + .ok_or("contradictory seal received a discardable assessment")?; + assert_eq!( + seal_cause(&error), + Some(&SegmentSealError::UnsupportedVersion { + expected: 1, + observed: 2 + }) + ); + Ok(()) +} + +fn unsupported_version_prefix() -> Result, Box> { + Ok(support::decode_hex( + include_str!("fixtures/recovery/unsupported-partial-seal-version.hex").trim(), + )?) +} + +fn seal_cause<'a>(error: &'a (dyn Error + 'static)) -> Option<&'a SegmentSealError> { + let mut current = Some(error); + while let Some(cause) = current { + if let Some(seal) = cause.downcast_ref::() { + return Some(seal); + } + current = cause.source(); + } + None +} diff --git a/tests/recovery_partial_seal/framing_laws.rs b/tests/recovery_partial_seal/framing_laws.rs new file mode 100644 index 00000000..c19394ed --- /dev/null +++ b/tests/recovery_partial_seal/framing_laws.rs @@ -0,0 +1,202 @@ +//! Finite specification-derived sweep over partial seal framing. + +use std::error::Error; + +use keep::{ + RecoverySegmentStage, RecoverySegmentTruncation, SegmentReadPolicy, SegmentSealError, + classify_recovery_segment_stage, +}; + +use super::{seal_cause, support}; + +// Size: small. Oracle: v1 fixed-field table, independently encoded below. +// Exhaustive over each listed byte's first contradiction and every short seal end. +// Delete only if a stronger generated public boundary law subsumes these fields. +#[test] +fn available_fixed_seal_contradictions_refuse_every_later_short_boundary() +-> Result<(), Box> { + let canonical = support::decode_hex( + include_str!("../../conformance/segment-store/v1/one-zero-segment.hex").trim(), + )?; + let start = canonical + .len() + .checked_sub(128) + .ok_or("fixture lacks seal")?; + for &(offset, expected) in CONTRADICTIONS { + let mut changed = canonical.clone(); + let position = start + .checked_add(offset) + .ok_or("mutation offset overflow")?; + *changed + .get_mut(position) + .ok_or("mutation outside fixture")? ^= 1; + for observed in 16_usize..128 { + let end = start.checked_add(observed).ok_or("prefix end overflow")?; + let bytes = changed.get(..end).ok_or("prefix outside fixture")?; + let state = classify_recovery_segment_stage(bytes, SegmentReadPolicy::MAXIMUM); + if observed > offset { + let error = state.err().ok_or_else(|| { + format!("offset={offset}, observed={observed}: corrupt seal admitted") + })?; + assert_eq!( + seal_cause(&error), + Some(&expected), + "offset={offset}, observed={observed}" + ); + } else { + assert!( + matches!(state?, RecoverySegmentStage::Truncated(RecoverySegmentTruncation::Seal { + offset: actual, required: 128, observed: length, + }) if actual == u64::try_from(start)? && length == observed), + "unobserved mutation offset={offset}, observed={observed} must not become corruption" + ); + } + } + } + Ok(()) +} + +use SegmentSealError::{ReservedU16, ReservedU32, SealLength, UnknownFlags, UnsupportedVersion}; + +const CONTRADICTIONS: &[(usize, SegmentSealError)] = &[ + ( + 16, + UnsupportedVersion { + expected: 1, + observed: 257, + }, + ), + ( + 17, + UnsupportedVersion { + expected: 1, + observed: 0, + }, + ), + ( + 18, + UnknownFlags { + expected: 0, + observed: 256, + }, + ), + ( + 19, + UnknownFlags { + expected: 0, + observed: 1, + }, + ), + ( + 20, + SealLength { + expected: 128, + observed: 384, + }, + ), + ( + 21, + SealLength { + expected: 128, + observed: 129, + }, + ), + ( + 22, + ReservedU16 { + expected: 0, + observed: 256, + }, + ), + ( + 23, + ReservedU16 { + expected: 0, + observed: 1, + }, + ), + ( + 28, + ReservedU32 { + expected: 0, + observed: 16_777_216, + }, + ), + ( + 29, + ReservedU32 { + expected: 0, + observed: 65_536, + }, + ), + ( + 30, + ReservedU32 { + expected: 0, + observed: 256, + }, + ), + ( + 31, + ReservedU32 { + expected: 0, + observed: 1, + }, + ), + ( + 56, + SegmentSealError::SealChecksumAlgorithm { + expected: 1, + observed: 0, + }, + ), + ( + 57, + SegmentSealError::SegmentDigestAlgorithm { + expected: 1, + observed: 0, + }, + ), + ( + 58, + SegmentSealError::ReservedBytes { + expected: [0; 6], + observed: [1, 0, 0, 0, 0, 0], + }, + ), + ( + 59, + SegmentSealError::ReservedBytes { + expected: [0; 6], + observed: [0, 1, 0, 0, 0, 0], + }, + ), + ( + 60, + SegmentSealError::ReservedBytes { + expected: [0; 6], + observed: [0, 0, 1, 0, 0, 0], + }, + ), + ( + 61, + SegmentSealError::ReservedBytes { + expected: [0; 6], + observed: [0, 0, 0, 1, 0, 0], + }, + ), + ( + 62, + SegmentSealError::ReservedBytes { + expected: [0; 6], + observed: [0, 0, 0, 0, 1, 0], + }, + ), + ( + 63, + SegmentSealError::ReservedBytes { + expected: [0; 6], + observed: [0, 0, 0, 0, 0, 1], + }, + ), +]; diff --git a/xtask/src/fuzz_seed_corpus/segment_seeds.rs b/xtask/src/fuzz_seed_corpus/segment_seeds.rs index 242691d4..762ae00d 100644 --- a/xtask/src/fuzz_seed_corpus/segment_seeds.rs +++ b/xtask/src/fuzz_seed_corpus/segment_seeds.rs @@ -41,6 +41,8 @@ pub(super) fn seeds(files: &RepositoryFiles) -> Result, FuzzSeedError> seed(2, "record-one-zero", record)?, seed(3, "seal-empty", &empty)?, seed(3, "seal-one-zero", &one)?, + seed(5, "recovery-complete-empty", &empty)?, + recovery_counterexample()?, ]; for (name, segment) in [ ("complete-empty", empty.as_slice()), @@ -52,6 +54,14 @@ pub(super) fn seeds(files: &RepositoryFiles) -> Result, FuzzSeedError> Ok(seeds) } +fn recovery_counterexample() -> Result { + let encoded = + include_str!("../../../tests/fixtures/recovery/unsupported-partial-seal-version.hex"); + let bytes = decode_lower_hex(encoded.trim(), MAX_SEED_BYTES, EmptyHex::Refuse) + .map_err(|source| FuzzSeedError::violation(format!("recovery counterexample: {source}")))?; + seed(5, "recovery-unsupported-partial-seal-version", &bytes) +} + fn seed(selector: u8, name: &'static str, bytes: &[u8]) -> Result { Seed::new("segment_format", name, prefixed(selector, bytes)?) } diff --git a/xtask/src/fuzz_seed_corpus/tests/materialization.rs b/xtask/src/fuzz_seed_corpus/tests/materialization.rs index 8ea245d1..ee58a55d 100644 --- a/xtask/src/fuzz_seed_corpus/tests/materialization.rs +++ b/xtask/src/fuzz_seed_corpus/tests/materialization.rs @@ -1,4 +1,4 @@ -//! Complete deterministic seed materialization evidence. +//! Deterministic recovery-counterexample materialization evidence. use std::collections::BTreeMap; use std::path::Path; @@ -17,8 +17,10 @@ const TABLES: [&str; 5] = [ "capabilities.tsv", ]; +// Size: medium. Oracle: emitted version-2 partial seal triggers runtime refusal. +// Delete if stronger emitted-artifact replay subsumes this stable counterexample. #[test] -fn seed_preparation_materializes_the_complete_deterministic_set() +fn seed_preparation_preserves_a_replayable_recovery_counterexample() -> Result<(), Box> { use std::fs; @@ -47,14 +49,7 @@ fn seed_preparation_materializes_the_complete_deterministic_set() prepare(root)?; let corpus = root.join("fuzz/corpus"); let first = seed_contents(&corpus)?; - assert_eq!(first.len(), 47); - assert_eq!(target_seed_count(&first, "benchmark_report/"), 1); - assert_eq!(target_seed_count(&first, "catalog_format/"), 6); - assert_eq!(target_seed_count(&first, "golden_protocol/"), 9); - assert_eq!(target_seed_count(&first, "layout_record/"), 4); - assert_eq!(target_seed_count(&first, "migration_format/"), 3); - assert_eq!(target_seed_count(&first, "retention_format/"), 3); - assert_eq!(target_seed_count(&first, "segment_format/"), 8); + verify_recovery_counterexample(&first)?; prepare(root)?; assert_eq!(seed_contents(&corpus)?, first); @@ -144,11 +139,29 @@ fn copy_version_two_fixtures(source_root: &Path, root: &Path) -> Result<(), Fuzz Ok(()) } -fn target_seed_count(contents: &BTreeMap>, prefix: &str) -> usize { - contents - .keys() - .filter(|name| name.starts_with(prefix)) - .count() +// Tool output is admitted by the real runtime classifier, not a seed-count oracle. +fn verify_recovery_counterexample( + contents: &BTreeMap>, +) -> Result<(), Box> { + let bytes = contents + .get("segment_format/recovery-unsupported-partial-seal-version") + .ok_or("materialized recovery counterexample is missing")?; + let (&selector, input) = bytes.split_first().ok_or("counterexample is empty")?; + assert_eq!(selector, 5, "counterexample must reach the recovery parser"); + let error = keep::classify_recovery_segment_stage(input, keep::SegmentReadPolicy::MAXIMUM) + .err() + .ok_or("materialized counterexample did not trigger corruption refusal")?; + let keep::RecoverySegmentStageError::Seal { source } = error else { + return Err(format!("wrong materialized corruption boundary: {error:?}").into()); + }; + assert_eq!( + source, + keep::SegmentSealError::UnsupportedVersion { + expected: 1, + observed: 2 + } + ); + Ok(()) } fn seed_contents(root: &Path) -> Result>, FuzzSeedError> {