diff --git a/lib/forge-std b/lib/forge-std deleted file mode 160000 index e4aef94..0000000 --- a/lib/forge-std +++ /dev/null @@ -1 +0,0 @@ -Subproject commit e4aef94c1768803a16fe19f7ce8b65defd027cfd diff --git a/lib/openzeppelin-contracts b/lib/openzeppelin-contracts deleted file mode 160000 index cb2aaaa..0000000 --- a/lib/openzeppelin-contracts +++ /dev/null @@ -1 +0,0 @@ -Subproject commit cb2aaaa04a292887c49839cd958b08a83979d746 diff --git a/remappings.txt b/remappings.txt deleted file mode 100644 index f65f7e6..0000000 --- a/remappings.txt +++ /dev/null @@ -1,2 +0,0 @@ -forge-std/=lib/forge-std/src/ -openzeppelin-contracts/=lib/openzeppelin-contracts/ \ No newline at end of file diff --git a/src/test/CompleteMerkle.t.sol b/src/test/CompleteMerkle.t.sol deleted file mode 100644 index 0c3fe1f..0000000 --- a/src/test/CompleteMerkle.t.sol +++ /dev/null @@ -1,76 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.4; - -import "../CompleteMerkle.sol"; -import "forge-std/Test.sol"; -import "openzeppelin-contracts/contracts/utils/cryptography/MerkleProof.sol"; - -contract CompleteMerkleTest is Test { - CompleteMerkle m; - - function setUp() public { - m = new CompleteMerkle(); - } - - function testGenerateProof(bytes32[] memory data, uint256 node) public view { - vm.assume(data.length > 1); - vm.assume(node < data.length); - bytes32 root = m.getRoot(data); - bytes32[] memory proof = m.getProof(data, node); - bytes32 valueToProve = data[node]; - - bytes32 rollingHash = valueToProve; - for (uint256 i = 0; i < proof.length; ++i) { - rollingHash = m.hashLeafPairs(rollingHash, proof[i]); - } - assertEq(rollingHash, root); - } - - function testVerifyProofSucceedsForGoodValue(bytes32[] memory data, uint256 node) public view { - vm.assume(data.length > 1); - vm.assume(node < data.length); - bytes32 root = m.getRoot(data); - bytes32[] memory proof = m.getProof(data, node); - bytes32 valueToProve = data[node]; - assertTrue(m.verifyProof(root, proof, valueToProve)); - } - - function testVerifyProofFailsForBadValue(bytes32[] memory data, bytes32 valueToProve, uint256 node) public view { - vm.assume(data.length > 1); - vm.assume(node < data.length); - vm.assume(valueNotInArray(data, valueToProve)); - bytes32 root = m.getRoot(data); - bytes32[] memory proof = m.getProof(data, node); - assertFalse(m.verifyProof(root, proof, valueToProve)); - } - - function testVerifyProofOzForGasComparison(bytes32[] memory data, uint256 node) public view { - vm.assume(data.length > 1); - vm.assume(node < data.length); - bytes32 root = m.getRoot(data); - bytes32[] memory proof = m.getProof(data, node); - bytes32 valueToProve = data[node]; - assertTrue(MerkleProof.verify(proof, root, valueToProve)); - } - - function testWontGetRootSingleLeaf() public { - bytes32[] memory data = new bytes32[](1); - data[0] = bytes32(0x0); - vm.expectRevert("wont generate root for single leaf"); - m.getRoot(data); - } - - function testWontGetProofSingleLeaf() public { - bytes32[] memory data = new bytes32[](1); - data[0] = bytes32(0x0); - vm.expectRevert("wont generate proof for single leaf"); - m.getProof(data, 0x0); - } - - function valueNotInArray(bytes32[] memory data, bytes32 value) public pure returns (bool) { - for (uint256 i = 0; i < data.length; ++i) { - if (data[i] == value) return false; - } - return true; - } -} diff --git a/src/test/Merkle.t.sol b/src/test/Merkle.t.sol deleted file mode 100644 index ff3594b..0000000 --- a/src/test/Merkle.t.sol +++ /dev/null @@ -1,88 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.4; - -import "../Merkle.sol"; -import "forge-std/Test.sol"; -import "openzeppelin-contracts/contracts/utils/cryptography/MerkleProof.sol"; - -contract ContractTest is Test { - Merkle m; - - function setUp() public { - m = new Merkle(); - } - - function testHashes(bytes32 left, bytes32 right) public view { - bytes32 hAssem = m.hashLeafPairs(left, right); - bytes memory packed; - if (left <= right) { - packed = abi.encodePacked(left, right); - } else { - packed = abi.encodePacked(right, left); - } - bytes32 hNaive = keccak256(packed); - assertEq(hAssem, hNaive); - } - - function testGenerateProof(bytes32[] memory data, uint256 node) public view { - vm.assume(data.length > 1); - vm.assume(node < data.length); - bytes32 root = m.getRoot(data); - bytes32[] memory proof = m.getProof(data, node); - bytes32 valueToProve = data[node]; - - bytes32 rollingHash = valueToProve; - for (uint256 i = 0; i < proof.length; ++i) { - rollingHash = m.hashLeafPairs(rollingHash, proof[i]); - } - assertEq(rollingHash, root); - } - - function testVerifyProof(bytes32[] memory data, uint256 node) public view { - vm.assume(data.length > 1); - vm.assume(node < data.length); - bytes32 root = m.getRoot(data); - bytes32[] memory proof = m.getProof(data, node); - bytes32 valueToProve = data[node]; - assertTrue(m.verifyProof(root, proof, valueToProve)); - } - - function testFailVerifyProof(bytes32[] memory data, bytes32 valueToProve, uint256 node) public view { - vm.assume(data.length > 1); - vm.assume(node < data.length); - vm.assume(valueNotInArray(data, valueToProve)); - bytes32 root = m.getRoot(data); - bytes32[] memory proof = m.getProof(data, node); - assertTrue(m.verifyProof(root, proof, valueToProve)); - } - - function testVerifyProofOzForGasComparison(bytes32[] memory data, uint256 node) public view { - vm.assume(data.length > 1); - vm.assume(node < data.length); - bytes32 root = m.getRoot(data); - bytes32[] memory proof = m.getProof(data, node); - bytes32 valueToProve = data[node]; - assertTrue(MerkleProof.verify(proof, root, valueToProve)); - } - - function testWontGetRootSingleLeaf() public { - bytes32[] memory data = new bytes32[](1); - data[0] = bytes32(0x0); - vm.expectRevert("won't generate root for single leaf"); - m.getRoot(data); - } - - function testWontGetProofSingleLeaf() public { - bytes32[] memory data = new bytes32[](1); - data[0] = bytes32(0x0); - vm.expectRevert("won't generate proof for single leaf"); - m.getProof(data, 0x0); - } - - function valueNotInArray(bytes32[] memory data, bytes32 value) public pure returns (bool) { - for (uint256 i = 0; i < data.length; ++i) { - if (data[i] == value) return false; - } - return true; - } -} diff --git a/src/test/MurkyBase.t.sol b/src/test/MurkyBase.t.sol deleted file mode 100644 index f1dea57..0000000 --- a/src/test/MurkyBase.t.sol +++ /dev/null @@ -1,29 +0,0 @@ -pragma solidity ^0.8.4; - -import "forge-std/Test.sol"; -import "../common/MurkyBase.sol"; - -contract MurkyBaseTest is Test, MurkyBase { - // Hacky way to test the base functions until transitioned to library - function hashLeafPairs(bytes32, bytes32) public pure virtual override returns (bytes32) { - return bytes32(0x0); - } - - function testLogCeil(uint256 x) public view { - vm.assume(x > 0); - this.log2ceil(x); - } - - function testLogCeilBitMagic(uint256 x) public view { - vm.assume(x > 0); - this.log2ceilBitMagic(x); - } - - function testLogCeil_KnownPowerOf2() public view { - assertEq(3, this.log2ceilBitMagic(8)); - } - - function testLogCeil_Known() public view { - assertEq(8, this.log2ceilBitMagic((129))); - } -} diff --git a/src/test/StandardInput.t.sol b/src/test/StandardInput.t.sol deleted file mode 100644 index e7bc00e..0000000 --- a/src/test/StandardInput.t.sol +++ /dev/null @@ -1,82 +0,0 @@ -pragma solidity ^0.8.4; - -import "../Xorkle.sol"; -import "../Merkle.sol"; -import "../CompleteMerkle.sol"; -import "forge-std/Test.sol"; - -contract StandardizedInputTest is Test { - Xorkle x; - Merkle m; - CompleteMerkle cm; - bytes32[100] data; - uint256[8] leaves = [4, 8, 15, 16, 23, 42, 69, 88]; - - function setUp() public { - string[] memory inputs = new string[](2); - inputs[0] = "cat"; - inputs[1] = "src/test/standard_data/StandardInput.txt"; - bytes memory result = vm.ffi(inputs); - data = abi.decode(result, (bytes32[100])); - x = new Xorkle(); - m = new Merkle(); - cm = new CompleteMerkle(); - } - - function testXorkleGenerateProofStandard() public view { - bytes32[] memory _data = _getData(); - for (uint256 i = 0; i < leaves.length; ++i) { - x.getProof(_data, leaves[i]); - } - } - - function testMerkleGenerateProofStandard() public view { - bytes32[] memory _data = _getData(); - for (uint256 i = 0; i < leaves.length; ++i) { - m.getProof(_data, leaves[i]); - } - } - - function testXorkleVerifyProofStandard() public view { - bytes32[] memory _data = _getData(); - bytes32 root = x.getRoot(_data); - for (uint256 i = 0; i < leaves.length; ++i) { - bytes32[] memory proof = x.getProof(_data, leaves[i]); - assertTrue(x.verifyProof(root, proof, _data[leaves[i]])); - } - } - - function testMerkleVerifyProofStandard() public view { - bytes32[] memory _data = _getData(); - bytes32 root = m.getRoot(_data); - for (uint256 i = 0; i < leaves.length; ++i) { - bytes32[] memory proof = m.getProof(_data, leaves[i]); - assertTrue(m.verifyProof(root, proof, _data[leaves[i]])); - } - } - - function testCompleteMerkleGenerateProofStandard() public view { - bytes32[] memory _data = _getData(); - for (uint256 i = 0; i < leaves.length; ++i) { - cm.getProof(_data, leaves[i]); - } - } - - function testCompleteMerkleVerifyProofStandard() public view { - bytes32[] memory _data = _getData(); - bytes32 root = cm.getRoot(_data); - for (uint256 i = 0; i < leaves.length; ++i) { - bytes32[] memory proof = cm.getProof(_data, leaves[i]); - assertTrue(cm.verifyProof(root, proof, _data[leaves[i]])); - } - } - - function _getData() public view returns (bytes32[] memory) { - bytes32[] memory _data = new bytes32[](data.length); - uint256 length = data.length; - for (uint256 i = 0; i < length; ++i) { - _data[i] = data[i]; - } - return _data; - } -} diff --git a/src/test/Xorkle.t.sol b/src/test/Xorkle.t.sol deleted file mode 100644 index a3643f8..0000000 --- a/src/test/Xorkle.t.sol +++ /dev/null @@ -1,72 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.4; - -import "../Xorkle.sol"; -import "forge-std/Test.sol"; - -contract ContractTest is Test { - Xorkle m; - - function setUp() public { - m = new Xorkle(); - } - - function testHashes(bytes32 left, bytes32 right) public view { - bytes32 hAssem = m.hashLeafPairs(left, right); - bytes32 hNaive = keccak256(abi.encode(left ^ right)); - assertEq(hAssem, hNaive); - } - - function testGenerateProof(bytes32[] memory data, uint256 node) public view { - vm.assume(data.length > 1); - vm.assume(node < data.length); - bytes32 root = m.getRoot(data); - bytes32[] memory proof = m.getProof(data, node); - bytes32 valueToProve = data[node]; - - bytes32 rollingHash = valueToProve; - for (uint256 i = 0; i < proof.length; ++i) { - rollingHash = m.hashLeafPairs(rollingHash, proof[i]); - } - assertEq(rollingHash, root); - } - - function testVerifyProof(bytes32[] memory data, uint256 node) public view { - vm.assume(data.length > 1); - vm.assume(node < data.length); - bytes32 root = m.getRoot(data); - bytes32[] memory proof = m.getProof(data, node); - bytes32 valueToProve = data[node]; - assertTrue(m.verifyProof(root, proof, valueToProve)); - } - - function testFailVerifyProof(bytes32[] memory data, bytes32 valueToProve, uint256 node) public view { - vm.assume(data.length > 1); - vm.assume(node < data.length); - vm.assume(valueNotInArray(data, valueToProve)); - bytes32 root = m.getRoot(data); - bytes32[] memory proof = m.getProof(data, node); - assertTrue(m.verifyProof(root, proof, valueToProve)); - } - - function testWontGetRootSingleLeaf() public { - bytes32[] memory data = new bytes32[](1); - data[0] = bytes32(0x0); - vm.expectRevert("won't generate root for single leaf"); - m.getRoot(data); - } - - function testWontGetProofSingleLeaf() public { - bytes32[] memory data = new bytes32[](1); - data[0] = bytes32(0x0); - vm.expectRevert("won't generate proof for single leaf"); - m.getProof(data, 0x0); - } - - function valueNotInArray(bytes32[] memory data, bytes32 value) public pure returns (bool) { - for (uint256 i = 0; i < data.length; ++i) { - if (data[i] == value) return false; - } - return true; - } -} diff --git a/src/test/standard_data/README.md b/src/test/standard_data/README.md deleted file mode 100644 index 22d82e5..0000000 --- a/src/test/standard_data/README.md +++ /dev/null @@ -1,17 +0,0 @@ -## Standardized Testing Data - -This folder contains standardized testing data for reproducible proofs, gas snapshotting, etc. This is an important addition to fuzz testing as it allows for consistent performance measures, comparison with other libraries and implementations, and probably other benefits that I'm not aware of yet. - -The data is currently used by [StandardInput.t.sol](../StandardInput.t.sol) and is loaded at test time using Foundry's `ffi` cheatcode. - -The data is encoded, and is decoded into a `bytes32[100]` array at test time. - -### Files -* **StandardData.txt**: the current standard testing data file. Contains 100 addresses encoded to 32 bytes each. The generation script is [dead simple](https://gist.github.com/dmfxyz/36dce9db458eea1135e93ae739197bb3). Always interested in improvements! - -* **StandardData.old.txt**: a prior testing file. Also contains 100 32 byte data points, but most are very sparse with only the two highest order bits set. It remains here as prior gas-snapshots relied on it. - - - - - diff --git a/src/test/standard_data/StandardInput.old.txt b/src/test/standard_data/StandardInput.old.txt deleted file mode 100644 index 1c3abdc..0000000 --- a/src/test/standard_data/StandardInput.old.txt +++ /dev/null @@ -1 +0,0 @@ -98c6b6225ecabf3e62f3d99c3f2cc7e50d41a097d3fad11996ea2d2fbf5b8224460d86199978082aee3b1f551ffe261f716d5c8ffa19aa5784bd609ebeffc87363272026c7501dd99d94d143db41e9e13fd8e59fa1b0906b3eb83bf34ccc769d2acf067ac861cf3e10494f234d1746119ad829c89b35b34d683e1c85776396e3584400919ded9d1899adff062050ee2d0070346f290ae1e8a1e7d34f2af5e4830ca5a5193cd51a5830145bba57bc62b8e468c9c74570c679849e2b91166d9f60568a94acde693814dd7daf2a435a51d39f87c11b2fdfda65201ae74099dea53192834e574ec8ee19c894da69830a60adffc30d1277b0ec780d4402ec2949da4bc4ec995816d2509c993f4bf87be55c9cb53a99a3f7cfbc16a0343cade8c8fefc3df14a0202e058b82e5275076ce1ff10d0a492eeb545b92f96110a6bf706afb8d1a80a6b7a3600a84c466f49344a3b0067109fd502448c46ba8968b748988bd28a235fdcc4565b6a4097708585aecccd4ed85d9d093faa4fea37eca2c23b396eea1bd8eca3a5fbce56b11ccb80f5cf70ab5386ac93170ad249264e0d6f03f336496d6c84c4d9099cc02043cda2c642e31d184d1fbc1ea86acf48eded9274bc47206ba3f1ecfc2666442de2a1c754ff128202cb12e414a0be423295af0ed4ba05e169f10e78458e11029a222eb045d01c5faca61f94dc4ca81d6211f2675127fc8e45c85fe1bea862a583401bb4a6ac461ef003409c8dd490f62258b8540b2f1fd09c876e243ef2cc5cac23da8e8205f44d707b26520aa9ae0dc27633af0a332bb1f4f10abadb4bcdb34011e599737eb946e089dfddc8e7974ab99c80fb59cb956d51d7e863eba9f638aa828a325b134a9f6c8c6ca3877179ac4ba40ecc1571d284727b956f693d1cf187fc091183e727ae9deddc62db607322143c64aa4150e99b1470209411134d50dbc24d6ee0678b2a81154744266e93488b1c4e178397706776bfd91cbe7775853b881094fc86774de9c719902421cebfad9a0e1ca5d44ff5fee59eed0294ea4b39e27fca9395e2e5ec527f5cb94353bb2992d43a2cefd258ca054ab929503fc75abe08db69f40462e7a76990d7a80d7b0d0c3ad3d43c6cbaa2bb2029614ab31fe26483a5a7879ca24a0f266e9680562c2195bb9f5cd6aadae91073cdd49de339dd553cdd6b182c32bcb3201c003b75eaa21b6de2cb6253b6c60e3fe986dfb74f330df433e1b81bf1107659384ba69508d17c8f46a75af415d068045ddc5a814a9f669fcf2847772048e1ec1483b0ed61ec82adf5caaacc9cb75e05e2b9e51be03829d8d0c68e2bf42f4687572b6036db76f5c9f41cd7fc58cfeccd710586898eba192b564a375be81fd86eb01e6e60cc125bcb2b238a83367d0e5068540d93eca893d962566a6eae39ba72e94a103e1b5dd54cecdd81a05435e2dcc6ea87b6bab2749e9278626d8c94d5ca2db7a480cb5bea809653d4d1c4c1eaf128cfd2ab621053932d866833a82e0385e59bbafc7ed55fe3d9fc9cf3f4a3d3e6a29bc7119543111e6246871121b25fbd767fcc794a747e917bf576afed7da6ab5d06fdcf86e23c36b93231955be6ae34d669f683211163d58a3756abde8e766a39cfe89b95c765906f369fed01770499d641be42bfa243f4634afc332aeba31295a97f6973db6f291c3d6cac520c07375201b100bc629ac3fcb95de3378233b9b6b1339ae7c98d97910f9c0ab122e3888353eaf2cc426e07c8578a4419a78778343a41c0e294010f0d31543f5277fd9ab9230f9d5f5e47e2e7a3c40ee20e4c18ab93b0510908ba5d81c0c104805c8f8e462c731d6ecd5b8caca573ac656e4f0d7e18c7547693ef0a1150ecbb666098ab1974f2215ecfbe010ca74518bc4acb8079a381b016dd0bb623e1c075a1fcf80e2e7b4327760290f1e74e8a322fadbb69cefc54471e8002ff5ff954a52236031416aed06d9f2fc901901300416e1ed520fdb0fbb3f2b674a278c16939d1f0667570fed969e2a64f90d86d369ce38493d648484904c018738dc33dd6d959e20c768b692655c45014c9490d34aebc931133126a8b564c1a6d858ab3aabfa3066fe89f766a0400feca0d942e431bb6660fe9354c54d1e80194eb3a9fd6402861fbc81b49cd7d8b72a8a2e463b6813609da92d1fb749cd7fb2a03e878e5306c195a523f6f5debf9221ede92dde0c9529cda37727eb91681ee08ae8ed861e9f0355fd76002af2fb3ee9f160ded7449620ebce2f0f1f38cc06f84f841c7544104b5cb55719d2630512238b7f2177e87a8eef70356c9de9e36279a7db46a0d010b0b4643d788b1abcc9db74bdd9358047fa94f72c8148d0dfabbee18f5c756addbe303ad2f8e004beb2f0fe87acb72266286debbaf6c3912d753373b35920c783a9d7c9f190a2b990dba22165c617b5384de5d4b5372c23f3ef29824e5324f80babc77dfc70cfc507dbd07e81c16d7d66bad90d8fbb4fa0ba56e11a6bc9d8e0c6dc17fee076605524c8a7935f08d885ac8138eabdc3f291ab2adfff43ab40abb8aec9b652d1866fc748e91b6600cbf4daa9538cf12e96ee0e2f5010da2357ccb18a3f7b7f7c0e15d224e1169ae58c35ed673da9b7dff01c91fb5a79f492a6387eb11d8d0b9dfcb01c24723bb8eace99788381ac2e3b1d6e2b44da480a7bf1cb889e746a0ad862511f6ec22b7eaa7bb8f357034e685a8ed6a921bad6280beda3846ebd8a3abc6917eadb88646d213150b7505a5458b9ad8333a58dd28f3605ec02e55b60e33e27a84f3723c074609c02129aeb3c7cb96d155a559fe7383dd464a3d12b3361859b834cdb18a4b2e1790fb48391c8e03a2c1affdc9bc350e6c1705c5c691b4114cce56d2c3622a8af341afabae39a788877ad3e630eeaeeb9fd09a7be66d4f4f465fee847c46d8b64b190350068fbc4d58ac9ca89bf64ab5ee15f41272c2566b6668f8588faf2b0e195bf301c3d3de69b62f75c6342db0f266923149d857df9d2cd60c65994c041bb50883d0769c9204494929527fd61f0468500f25329128b563f5eda75f452d7f0a6a571e2d1f21be3adca75d8b63635214ef1c037d95647daba5aec0a2d84c81457592c1b8700bf9c926bdebc81c14527c46e25d546b818b1f8714f2367ff49443fb3fbd5a9df6b0ad99e67dc5897f387481e01bbae6894f0f2ad806e26902a7697c534c2917c60321cc228c286abf752c454eb5578a6315714e875f431ffdc0f56a0860ab1c0a227f424abfe680881b61c4e0d08ac45398638c6355702abdc33a6e2bbc72e49003a1b064b1ef47f93e10441718a4a9dfa8187302dcdf4c559dc9eebfc5e1605db96555496ca4b63bb26dfdbd1fd7ee9fec2950f9e2516d1ffffad60c4c9214f3e763800f3b21376cd2e12248362c958825717440b676d02a2ac8051e0d051f3b94f003a3ab9c49f6e0e41da784a912c235234e7f42200a5414485ffd33d202fa17082a7400e9e529f31eed90256316df39616e843f505d03cd2e15c2eb95a1551ceb052cc12c155ae21c61ae270362db32bfdd4bc1557bcef10a96138fbb2d8e216b939210e13f61935c5c44a871ad8ab743b91c27679444891ef8e63246d51e1e9d29e4d806a111266003401485dc65c6bcf8e4fc452306e907b2d4ace5c291dc8bd5e81dd9ff18989db3268ff6942817c1aef327ac070f47eba4668a66022aaadba2d2bcd54f99061d8d1bfeffcc1d127ea8b6080d887b09196db8aa110e024b10aecfb70a6b661feb5f65abedb4c6ffdb37b1742d676baa8e94d1c64e38840fb7f1cd32bc126d99cf7c2e0107598455590cfd7fc8e81e59bdf3bd21b1bcf0029cca4ec49046a8ae90c52200763edaed204413112c34057895f9cfa727b0760ab8c73f785756d0a5e91ac30d3c2d16f1bf8324f882e242042e52becc0f4ec81b84230096b1d9cc7c2da5f92ba6e9bfce3d64bfcac4e01eb62ecf4c945a804b6645389702c045b40050c7dd19e49a1b2aa2aa1e2da7122149db41341f94d2088f7f4d4dbc511a9862a78240518320078128b64e97d93aa4504d20b3dbce45362999484445079dde78a4c338b4b279d9cd72f69798c2889a14bcc41febbd47303a805379186dcfa6d1b0d6c6b83af257729c24e1cde76fbcd7677dbce090d1f641d95584777a705fce56d1530eb40346d461f69f1fd1b5653207222c73c3732cb63fc3c1f548a91ef9c55ec49fbbd5465c5279318d33190caac594a65ee10485485d74d82526fc1cee38ac01e0826d6c65399afc3b88843837baecd64c07c77edfc02b99e5b6c0413221dc10de97124c6a59f7a2951823eb9f055f68421c28ab66f5d363778c87994e6ae314a651e7fb20630f344a1d647f0358e495d8da948c6e7093b85187c685fc4e1cef306c90c0dba8539909d26cea05d037e693b1f3750cf0fda53cc84cac535bc33c7db9e9848f7480a79a72b32cc7b769efefb906222c604aa9ab0ff014b275370d3e4425389ad7b4cb27edb45512b8b84b \ No newline at end of file diff --git a/src/test/standard_data/StandardInput.txt b/src/test/standard_data/StandardInput.txt deleted file mode 100644 index be445bc..0000000 --- a/src/test/standard_data/StandardInput.txt +++ /dev/null @@ -1 +0,0 @@ -f910ccaa307836354233316666386231414464306335333243453944383735313530636239613337633333624633aa307831336341393634344241453063343638333062353035363532373237463131413066303361623033aa307836316433454436366136343633613745324536623337303139346235383831363632623964303563aa307836363139423438644334436262383143633139343864443632633732443035313643463162343231aa307862623038384337373630414365623138313536423830616341343432633738313631303663413545aa307832433334423933633839364463354362396439443465336665343532334341326532373046363544aa307841383641353734313562316346336235453239453536443539306346323433344366433363616661aa307833373846614534373233346263456241336230313142386431393163353841613136443637303937aa307830383438343037393566453464633362373633453339384436313937384532664432466434313243aa307842383430333130393434346237633033664434333338354563433236416239654630356638343063aa307865323437324235323535644235393762316361313837623145334262323330666635636534663736aa307865373845353531396238634134306131633335444463424436313239423134363831316564646232aa307831314231426264316530336566383638343031324262433566353432453737444435353446443633aa307835383433373043316133423546343531344146313146316244634164353462354531323430653561aa307837334643386662666638393562343237344446456234393231343266303046663962443439393346aa307837383645363535363432653235463931316331303837343239364446466434343032356136633837aa307831323066653637644533363763413165644143374639616231354632666232354135446644456262aa307862363166613644393035324130324245614335643743394231383836333031303335663742643936aa307835343432383632664233344442633245413945653942306530306639313565353533313334334435aa307866314266663135663639396539433131453530634132623536443035623643423364303938623063aa307862376333353032373564354462423837346234363061353864343738343864433733663232373836aa307866324530323234453839323832396131334246356131463731363964423535393435374435364361aa307845423239656143643736414331453132343942354333373638323135664236373534326136323244aa307830624442453538373635333938314638303336383936653838306236634535633535384537313530aa307837333931326631643438313344343838366431366163424361413237393442643836354331623238aa307864316633333830343330384437396266393939633133653330333866313130343366363330373136aa307835653165373161366146613336354235363242393835353534634232456137393961386444304544aa307861333245623139424130384331434564443263343464426566316136643464363338393735303135aa307832623031413737383638416334356631304345386230663361373539463737456338383936413141aa307865354437623246663838443534324233423732353631424231393165463736333931366563433142aa307862354330434433333545323031304443633242346134304631394339614539363438316166306438aa307834393062386637314464356534363234364431326237353838663035366333393945646539303431aa307835366630464146333336613446446162313546323242333545426536394333306245363336434238aa307834324131394139304335333630334639313937456444334145346445393935393135373535633936aa307862644543623444446542644536626534656231443833443539303430463135353936394341613234aa307830466544306641383332454542303439614631363638663465384635433930433931333666383539aa307862616336463637333236354162413366373046443736463835334533634234316662363835613144aa307833313546316541413342333830364264336132463336343135303465336362333731416233663736aa307861466531323834366436356533443236393632393564303536376444373335433430443632313746aa307834334662366132393337316544433642643166423466443565643565454541304443413939433146aa307839383939313162346131343845386334303633423042393337326543323332326241334232364136aa307837326533343937376632413166643632363762393131614530663437433436653763363936443163aa307830326446393536384362384636413539453238463231633746373144613733324432323337344634aa307837313764373331323534423964333631333433426534663539356344463037393844386264343932aa307832434130323836314441303536353933663731656663366430343464436532333461363663346533aa307838354243386231383530643033353845374136626235663836313963624563624235354531653935aa307835336234373535443033343230643931643941373444314532393537303741354135653133303864aa307838646462334543314635383532373038336336363164303342363837396432383231353632463037aa307862614439386331344564333832313763426632324466326539633835333532396637383530453738aa307865413862393736306662424633663266373264323344463638383565356233313236653334643036aa307832336337366664394335443844336630434330323645623235463236393833334434344264416232aa307843654334623938333342464334423136343438643744313134666437326242306233373339373430aa307831616463443965393946333045426146393265383765443437343439423543663632323164313144aa307865396430466137456536336463313632326143393336443031433843383037373442663941373765aa307866633732634242383466643034653934353434384438353338444432663145443265394238303839aa307838633633654242366537366241333162333438344530383341386139373638356663384231616533aa307834423963623431394132443634334231323436414235383537633938363731323242354230444666aa307833454445373045353737374231303061326264664243323565343934433341396435343541356131aa307844393666366432633065383735416130323930366261383246356164356437384164353843613834aa307833343331313631333334343361433366336430343130373964636230334361366635353631313245aa307834334243323531323544346333653535643238624661626630434136336331456338426238393446aa307831624132653866616639326531393136344132646342384331633735316362353030334642454442aa307842663943636435623634383838653036336337393930394665433935663634393432463130664163aa307835354534383138373645623236643731323232363832433031334166363435456139616638463866aa307863353238423463376645313366323235353133364364343139333533353434303035616330306462aa307866413837613161303933443145386139363832346237623265634431303743333632453535663430aa307842393030636266643139393941463733386238623932664331324342313042373041443566423266aa307831373733354164303837363437414233384533656137453944326337613131613035336432393141aa307831453462354233613841303734623166336435333336373732623232343935316237364239413533aa307837424141386339394566366330374566356346373641646443433031373831373945304632613634aa307832393864443637346539364444344636356363353632443339363861353442366262663339613339aa307866373839623339363036323642663566333830306130346631306643456265333361363831334136aa307830393835334335323336363933663531454233453765413535433561623563313634356130443063aa307837654135334339324541316134463164653036643138344465443131334333316538374463313031aa307832663564653638333735633239373236323345374261453439366331646364306441463443643264aa307834623533446131383061374534453730324244316337613332376332393434363430326130663937aa307832653336464541303931363030446437353636393339346234343734443862364137644336376641aa307833343033373042343045333434363438633139333642333237353536396138343432664443396245aa307837353737336631363736374139374434414431444566313831343536316135313235614133396245aa307843306244643346413844313236314433373439383244623944353762466334386242303146334262aa307841373335346162434230613336373331396338353963323661383336343961373035314338653636aa307832354230353142333944364444344446643137463735433838303139323835376238363138374235aa307843443333393336373437423532433132336242323731343441356339663635463861323744464663aa307830306232353566653131303944656443376333433137626131323032333534344334373933426146aa307838376131386361413364423734633765363439344563384137433962323839303166304162463932aa307835376233353343376231353638303646303943356545313562323935333939346541383932353441aa307839383030633136304630446137363336393730353142313736433933453236314564383636343630aa307831333842344344353746314364343739363031434341446641313745633065314331624633306335aa307862656438616331426331613961363431383038394564456146386239394363343144413735663934aa307838303430653266393238366634453432624464326344336562333945323261633131364262393533aa307837363437323045443565626435633046344330394431456334633661623132643738423138313339aa307834343630323630383030633842433239353843464344323635423031663038623630384337373564aa307844633635306632393046643241353343303739313636304233393431396642663562663445363735aa307865464535323633393843363839393961383262373932453839303165323334383338373864306538aa307832396641653534343735373533303738444263353530326563323530463346636532364337383733aa307837313633653137376439344130613763383432313332353362356244626636343139653766424139aa307830374438393230663466444133433837363131326462613730353634373635444565434541643045aa307831443333633244383633333344644646323461373666623363333839324434623046366434663842aa307833323042373335623332363836386131373837633132373138384165323335316438333739386465aa307861383444363146314242333638393338633830363335446245613936456145326333353562423532 \ No newline at end of file