Compare commits
3292 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 3406fd525f | |||
| 82e399a2ca | |||
| 2ef58997e1 | |||
| b94c791b10 | |||
| c7cd80af29 | |||
| 1586a2e0e0 | |||
| 31fd09ba00 | |||
| 1ab8b51a21 | |||
| ad0458c5b2 | |||
| 8790ed487c | |||
| e912250950 | |||
| de24cd822e | |||
| fa8502eccc | |||
| 2c23b81082 | |||
| ed23103d79 | |||
| 71cd13cae1 | |||
| 111696cc77 | |||
| 5bb051f9ad | |||
| 68339a64f5 | |||
| 0d7d6c135b | |||
| 4427bdf235 | |||
| d38a945269 | |||
| 7172b51e75 | |||
| 33b1179e39 | |||
| d156742a38 | |||
| 17278c2dcd | |||
| 716ee56446 | |||
| 21a91e58b3 | |||
| 9ad300c68f | |||
| 294edf3b84 | |||
| 8fd34abdd8 | |||
| a2692003d5 | |||
| 20eca25f91 | |||
| 4b3a71cf0a | |||
| b04a251cdd | |||
| 44f1a76d98 | |||
| 26e43fbc85 | |||
| a6ccb8b183 | |||
| 92b6fec5e9 | |||
| b0efd9f782 | |||
| 99ee7a7aff | |||
| b7dd04e2eb | |||
| c1925d6934 | |||
| 873dac1e64 | |||
| b470caa066 | |||
| f7cc61dd31 | |||
| 9924b77166 | |||
| 9c39eec6da | |||
| eabddaebeb | |||
| 3dee3557aa | |||
| 7826f5044c | |||
| a7b948afea | |||
| 5d56c4b4d6 | |||
| 3753fc7342 | |||
| ac407149b8 | |||
| 3a3fe8c050 | |||
| 6563ea9c98 | |||
| e29e3eac70 | |||
| 8fe51c68ac | |||
| 23d3315b58 | |||
| 4729bf3aa3 | |||
| d76bcbace4 | |||
| cf67b13dff | |||
| 0eb578e421 | |||
| 82d8961dc1 | |||
| 4973afcbda | |||
| 94e08f7d83 | |||
| f882aec06e | |||
| d80b1437b6 | |||
| 421c45af62 | |||
| 98940c1a3d | |||
| 13b1c03c29 | |||
| 365ef4852f | |||
| 307b47a912 | |||
| 7ab231b761 | |||
| 3868b80ca0 | |||
| 45ceb2c90d | |||
| 4f4560fac6 | |||
| c365b9c0bb | |||
| dce42d13eb | |||
| cdb766b10a | |||
| 1918155b13 | |||
| a08ec3e658 | |||
| 484115e636 | |||
| 8f843ff2f0 | |||
| 514269157a | |||
| c301152420 | |||
| 07c0c8cfc5 | |||
| 96fb8a40cc | |||
| 22114b42bd | |||
| 3bbc61d404 | |||
| 4074b15a76 | |||
| b47a64c742 | |||
| 62e95b342d | |||
| a0b41fca24 | |||
| 968a0fa0d0 | |||
| f2111dbef3 | |||
| c241ae5257 | |||
| 270fb70435 | |||
| b4dc3b6d07 | |||
| 5d270fd649 | |||
| aef4329efa | |||
| 7382d88d49 | |||
| 301d7cb1f3 | |||
| 006583a068 | |||
| bbc092a11c | |||
| 35c8563d74 | |||
| 05eca9f48e | |||
| 6d188675ac | |||
| 0b886180cc | |||
| 7cd03d6c12 | |||
| fba54da277 | |||
| 01dab51ac0 | |||
| 2821e912ce | |||
| a7a50a8986 | |||
| 0a03bae037 | |||
| d6b573b4c3 | |||
| b132dd7224 | |||
| 76306f8f3b | |||
| cc8a4d2087 | |||
| 998135e3e9 | |||
| 0590e024d9 | |||
| 0a74525b3e | |||
| 20281737ee | |||
| 3864468206 | |||
| 3c957c1bb5 | |||
| 9fbdda0b5b | |||
| 5e34f3e78a | |||
| 2a10c5d0db | |||
| 910fe0583c | |||
| ac88b89a23 | |||
| 5f5462d91b | |||
| c37b99e6ed | |||
| cafe5a31ad | |||
| a89b860338 | |||
| cf7a961219 | |||
| 7b1764f9f5 | |||
| 21a3017d75 | |||
| 39c8b2b85b | |||
| 02da2839ea | |||
| 9b38e96e76 | |||
| 8f8242749d | |||
| 1ec3662f16 | |||
| cc75dbcca0 | |||
| e6e7ecd062 | |||
| d0a449e5cc | |||
| f67a842573 | |||
| bcc6b04d16 | |||
| 6e063a612a | |||
| 3f51727da3 | |||
| e417a836f8 | |||
| d77bcd560f | |||
| 29f90ffda9 | |||
| bb07d0b149 | |||
| 0d8325af88 | |||
| 861519da54 | |||
| 6e3c378fb0 | |||
| 37cf729947 | |||
| 345bd73658 | |||
| 874b80ea2d | |||
| 3394e0be5c | |||
| c61d7cb96f | |||
| b8441f2caf | |||
| bb536e9d36 | |||
| c101747e49 | |||
| ba04659f7c | |||
| 5984addb58 | |||
| 8a0388ff16 | |||
| 5b0eba2892 | |||
| 66f2f2739f | |||
| e7df935612 | |||
| 30628626bc | |||
| df9ee99497 | |||
| 67c1f3259b | |||
| a82f152658 | |||
| dbbc631f07 | |||
| 6fb3fe67d2 | |||
| de910b95be | |||
| a131719637 | |||
| 161cb28dc0 | |||
| 3f8e6453bc | |||
| 1a79773ffd | |||
| cfface3e00 | |||
| c52b7d8172 | |||
| efac04cebf | |||
| 0fe460297c | |||
| b010e7ecf7 | |||
| f8e685d442 | |||
| e5d45ce9ed | |||
| 91fcc5ee47 | |||
| 2be655882a | |||
| 556e93c69d | |||
| 92967bb2d9 | |||
| eb529b98af | |||
| d9c1647b95 | |||
| 502ccac36d | |||
| 107aa53ff3 | |||
| 7a5076319b | |||
| 3539b718e4 | |||
| ffb2ec1334 | |||
| 1a6e19bac6 | |||
| 008500ea8b | |||
| c723c2d0b7 | |||
| fbae89664f | |||
| 6282a08af3 | |||
| e0c41e259f | |||
| 3491a2da21 | |||
| eda7e1c7eb | |||
| 3ca55ec48c | |||
| e6952a6bbe | |||
| e96f49517d | |||
| 2c006cd349 | |||
| 5a46157f94 | |||
| fd14eb7484 | |||
| cf09e01336 | |||
| 7ab4d4c10c | |||
| 8a9fa7689a | |||
| af57b8e835 | |||
| 89592865d1 | |||
| eee73128e5 | |||
| b0ce27edd7 | |||
| bb8400db4d | |||
| 576984b093 | |||
| 4531e9751a | |||
| 04cd956e6c | |||
| 8d99a7fa03 | |||
| 4985686909 | |||
| 07f105e6bb | |||
| eae6f23517 | |||
| f7d7d2ff18 | |||
| 77b3990c66 | |||
| a95464957c | |||
| 76c3b635ea | |||
| 89fb0163b8 | |||
| 21f0873551 | |||
| 066d6ab555 | |||
| cff0c4f0cd | |||
| 4bfb636bc4 | |||
| 1b8d31a598 | |||
| ecbcf94bf7 | |||
| cb13027695 | |||
| 5fcf5b4954 | |||
| 9696543409 | |||
| 8182092d61 | |||
| a6249b5ef3 | |||
| 04774eb772 | |||
| 832e02ed61 | |||
| 31f7bc45a4 | |||
| 3cbf05f0ae | |||
| f5acb9eb86 | |||
| 26737308e0 | |||
| feede8c0ee | |||
| f8f5d50a3d | |||
| e2fda3bac4 | |||
| 8059ea9c7e | |||
| 1ad5f1a228 | |||
| 8fe4f3c6c5 | |||
| 2ab702eaad | |||
| c4ed79a859 | |||
| 6d5248659b | |||
| 91dea834da | |||
| 53130ef96f | |||
| 86aaf516cf | |||
| 46c575e9f7 | |||
| 3fdc35407f | |||
| 638d4343de | |||
| 574f430c59 | |||
| 1f118d3558 | |||
| c8920c39ea | |||
| debef7f383 | |||
| fddc8ede7c | |||
| 54633f0326 | |||
| 4becdd5d9f | |||
| 952aedf977 | |||
| 0fb49ec83a | |||
| 0941a882d0 | |||
| 89e2db14d0 | |||
| 65392710e3 | |||
| 028bd49756 | |||
| 468aad6132 | |||
| 992415297c | |||
| 4938640911 | |||
| 5a7714a4e4 | |||
| f777c8f0cb | |||
| a469b69637 | |||
| af1cd34ff2 | |||
| 9658bd19e7 | |||
| 4cf19e5aa1 | |||
| 6f186ceeb4 | |||
| f8a82b086a | |||
| 091bd34468 | |||
| c0ee17320c | |||
| 734b569c7c | |||
| 8a2fc752b0 | |||
| 22ca26954d | |||
| 7c4ca8a5df | |||
| 4223dd057b | |||
| 7a018f6a51 | |||
| 22cec2c3bf | |||
| 0799e673ab | |||
| 93499d7d77 | |||
| 87e3906c8a | |||
| 28dccf939a | |||
| e7a87172a9 | |||
| 7fc5a73248 | |||
| d874bdaf4b | |||
| fd6ac6462b | |||
| c05efc1f53 | |||
| 360f3ba90e | |||
| 443a7b31cf | |||
| 846a418b04 | |||
| 513b3fbeca | |||
| 85d9b727d3 | |||
| 32448e2b3e | |||
| d59dfb151b | |||
| 4624f25132 | |||
| 61a1c14e2c | |||
| 13351089f4 | |||
| b94338b991 | |||
| a6327c59b0 | |||
| e797f9dec0 | |||
| 423c1d20e0 | |||
| 3c6c13a45e | |||
| b4bbc9c68e | |||
| 815f898519 | |||
| b3e5c6ba24 | |||
| f2fb76a254 | |||
| c6668598be | |||
| cf5f31345f | |||
| 3a5b6b4b20 | |||
| b418cfd617 | |||
| 4759a7fb47 | |||
| a2d7c8c0c9 | |||
| f649f68a06 | |||
| c083fcb271 | |||
| 52523d6811 | |||
| 3c2e3c987b | |||
| 7247c58843 | |||
| 3a61aa469d | |||
| 6f872d97fc | |||
| 82ad13aa31 | |||
| 0ba3395e86 | |||
| 1ee94df9aa | |||
| 7eaec71fc5 | |||
| 1af6e38b00 | |||
| 34c9b72496 | |||
| 5489e8ece4 | |||
| bb726bfde3 | |||
| 85c9c922ef | |||
| 9e4e7b440e | |||
| 7f5ea575ea | |||
| 78c92dfb68 | |||
| 1a029ea162 | |||
| c10e7c0c72 | |||
| 06d8564273 | |||
| 1a889b6b48 | |||
| 8747278434 | |||
| 14287b0ca1 | |||
| fb47a3289a | |||
| a12289bf2f | |||
| 1ec73cfa96 | |||
| 2d1f43b349 | |||
| abb0e0d9b3 | |||
| 291b6dfda4 | |||
| 9c8f8c67e9 | |||
| 3d45167400 | |||
| 3389ca00f1 | |||
| f69ebb8567 | |||
| c315531eaf | |||
| c584cdb649 | |||
| 67c801774a | |||
| cd9015ad6f | |||
| da4f0c32ec | |||
| 804e415ea0 | |||
| 87738aaeec | |||
| 3c5c56671a | |||
| 11640bf143 | |||
| 1269951979 | |||
| 1879cbf429 | |||
| ab49ad38a8 | |||
| f77423b749 | |||
| cb4ceaa530 | |||
| b67c2f007b | |||
| c5ac2d60aa | |||
| 9c6f10d447 | |||
| 1203afb9cc | |||
| 1580c474cc | |||
| 5e14ca7d83 | |||
| 1abf709aa5 | |||
| 81e73407b5 | |||
| 1dba643148 | |||
| 490fdf790c | |||
| cc9bba8894 | |||
| f46ff2f4d3 | |||
| 6a9a8b1d24 | |||
| c39e930491 | |||
| 65b54ab2ee | |||
| 36eafc73c7 | |||
| d9e59b8d62 | |||
| e1f67e9374 | |||
| dfb05c5abc | |||
| 84bd6c0d71 | |||
| b1313a6514 | |||
| 6dd962c985 | |||
| 40cc421f18 | |||
| f280d5ee16 | |||
| 8819030169 | |||
| f8001a2081 | |||
| c7e7b9fb28 | |||
| a997831652 | |||
| 228bfb90dc | |||
| 9239502552 | |||
| 5695958f68 | |||
| 2b7162a6c6 | |||
| 4dfa599b1f | |||
| 5af9e14a16 | |||
| 0c6c2b5a96 | |||
| 537c642edb | |||
| 4255d62daa | |||
| 9d35e5a328 | |||
| 2a85796cd9 | |||
| 02d7546b49 | |||
| 95c4b03e38 | |||
| 5d665bb2fe | |||
| 7b9e7bae40 | |||
| f96f3cfe58 | |||
| 417fc05528 | |||
| c5dfef611c | |||
| 94f38e817c | |||
| 9109365f96 | |||
| ce89c5619f | |||
| b4753f7ead | |||
| 4e40590d66 | |||
| fa5f81e731 | |||
| 1b8e184718 | |||
| f1919a0570 | |||
| b65ffd554c | |||
| 3ff0b4e506 | |||
| 49d17e30bd | |||
| 65cc325b42 | |||
| ea18a6da43 | |||
| 3560d26adc | |||
| ada88195d4 | |||
| f4b7ace8f7 | |||
| b40b13f80b | |||
| 228eb6ae1e | |||
| dc55e309cf | |||
| f7c449f23f | |||
| 6e50f2dd22 | |||
| 92ba6d413c | |||
| e41fbb7db9 | |||
| 9c7ca30e39 | |||
| 474d9f8bd7 | |||
| 87e4db24a3 | |||
| 680780d4eb | |||
| 78181c41f5 | |||
| 8a9d8410b2 | |||
| 72101c4bf1 | |||
| de71459d18 | |||
| 3ccf0235e5 | |||
| 88e175919b | |||
| 8793e5e4ab | |||
| b8b20cc470 | |||
| bce1b0b19d | |||
| 7b43a4a46e | |||
| 00b2f993f3 | |||
| 09e7fc2bd5 | |||
| 9c42d4248e | |||
| 77f2be49a7 | |||
| 35f375c9b0 | |||
| f0ae9293f5 | |||
| d8dc3603c7 | |||
| fa5989107f | |||
| b0c12963b2 | |||
| 0ad72734d5 | |||
| 41063083b7 | |||
| a96d6dea49 | |||
| 224e6b1bbe | |||
| f54724fb29 | |||
| a53e6fc929 | |||
| ec1e594c7c | |||
| 4b65a4f14f | |||
| 581cd2b605 | |||
| 181d242590 | |||
| f8e8ce2fd5 | |||
| d516466ce6 | |||
| 63b90eb908 | |||
| b2e214dc3b | |||
| 6f3b7debda | |||
| be7dcc0866 | |||
| c2951f3747 | |||
| e776e792d4 | |||
| 3d188c7b53 | |||
| eea0ea3110 | |||
| 71a9319438 | |||
| a6c4f9bc57 | |||
| a9cad71e0b | |||
| 88eb2fec06 | |||
| ccf7356a4a | |||
| 781c361285 | |||
| 11df1245ae | |||
| 96fc5334dd | |||
| f98dcce373 | |||
| 5b8ea89c40 | |||
| 8b87b612fe | |||
| 299f80a1f4 | |||
| 47aab38365 | |||
| 42034e3b39 | |||
| 4b011f3aa0 | |||
| 56328b1144 | |||
| c97084e626 | |||
| aeb64c31a9 | |||
| 9f94a40f23 | |||
| 9c61082fc5 | |||
| c8c909560e | |||
| 66165e758f | |||
| 1b0cebae0a | |||
| 30eebb68d0 | |||
| 3e174cb632 | |||
| 3e3d4d461d | |||
| 4824d8bb93 | |||
| 7ec7c3aaa1 | |||
| 7da8f9d824 | |||
| 161265052b | |||
| 6c671fd54d | |||
| eecd4c5dfb | |||
| 5bb7313ae3 | |||
| c5bb9417fb | |||
| 8d428ebfd5 | |||
| 3bbc463068 | |||
| acf9e9588d | |||
| 3a1edf1d5b | |||
| 836ca1aa4b | |||
| a43dc59ecc | |||
| 4c9f1056dd | |||
| d540bb2b61 | |||
| 539b4cf5be | |||
| e7d62af98c | |||
| 8726c0e62e | |||
| b3e11ac6b8 | |||
| 1eeab6f3cc | |||
| 873c7811e7 | |||
| 4cccbb6e43 | |||
| 5b87bc5660 | |||
| d5123bc14f | |||
| b1e4029510 | |||
| e36862e9da | |||
| 32256ab5f4 | |||
| 3096b0056e | |||
| d1ab313a14 | |||
| 87e34cb7fa | |||
| c092011da5 | |||
| 25df926c68 | |||
| 1c7a99844b | |||
| b7d1bd8062 | |||
| 9ebab2299b | |||
| 492c7bd22b | |||
| f2ba2481a7 | |||
| 6286f84bd5 | |||
| 0e090f0103 | |||
| 06965dd15b | |||
| dafd7406c3 | |||
| b0f567d4be | |||
| db817f794e | |||
| a5dd61d9f6 | |||
| 0b5a37b843 | |||
| e4df534c67 | |||
| 130536a348 | |||
| 08479df817 | |||
| 203a3b6a99 | |||
| 34d0d47e3b | |||
| 4443736626 | |||
| 14544ecfb6 | |||
| 72e0e0d075 | |||
| ec227851ea | |||
| c56dfa5f49 | |||
| 6e38e042ec | |||
| c68eec8369 | |||
| 2717d0a135 | |||
| bed5a26bac | |||
| cda3e6c353 | |||
| 40c32d4f28 | |||
| a993c02405 | |||
| 69265aa1a7 | |||
| f38991b4b6 | |||
| 7e34c67241 | |||
| c47a6a5800 | |||
| 917ebee2d6 | |||
| 6e275cd8ec | |||
| 87260ae815 | |||
| 35372f6dda | |||
| 342c640a33 | |||
| 5682bd4c09 | |||
| 893906518c | |||
| 0d8a47260c | |||
| 79dccc525d | |||
| 1dac3fb540 | |||
| c012b14671 | |||
| b6fd7e16ef | |||
| 4a9dd03485 | |||
| 4fb6c11f18 | |||
| 2bc2081682 | |||
| e531f8b1a5 | |||
| 13e396934d | |||
| 9d8bbca5f0 | |||
| 173d1619f1 | |||
| 3400b2e604 | |||
| a34b16bbb3 | |||
| 71d4022abd | |||
| 89c93f5c8c | |||
| 6e4b215bc5 | |||
| 5247f2ab75 | |||
| 9d121b7048 | |||
| 4500d8125c | |||
| c9691996ce | |||
| 335e890065 | |||
| 5aca7577d9 | |||
| b79d98dd91 | |||
| d591c0bc1c | |||
| db254c5b33 | |||
| 9cd4c888bf | |||
| 452f3ead29 | |||
| 7b698a4306 | |||
| 200bfa9c41 | |||
| f52353713c | |||
| 6788f441ca | |||
| 75ce11e493 | |||
| 9fe0a722f4 | |||
| ed1312f97d | |||
| cc9993c07a | |||
| 075b7ae790 | |||
| f371af55bf | |||
| 9b2a9818a6 | |||
| 1e695684d2 | |||
| f3f5890877 | |||
| fcb6525ed5 | |||
| 62ec0b10d4 | |||
| de0f6f5693 | |||
| fa7d5ea28f | |||
| c59625d91b | |||
| bfe2a4c939 | |||
| f80545a256 | |||
| 5fe528f092 | |||
| bb1a66e4a9 | |||
| 8c4babc994 | |||
| 81a9d5cfe9 | |||
| 841d5476bc | |||
| a9fa4dc539 | |||
| 38e68e6fab | |||
| a427cc2cf4 | |||
| 9911549422 | |||
| 9e097810e0 | |||
| 42e7679c27 | |||
| 181474b721 | |||
| 894648dc52 | |||
| a4e9df1e4c | |||
| ef5d41bd82 | |||
| 0501a7e5ba | |||
| 07a2376878 | |||
| 339f542465 | |||
| 4a8e0daca9 | |||
| 82e214634c | |||
| db98dbc581 | |||
| 4ed36f9ecb | |||
| 3a519f6ea2 | |||
| 121ce77a2f | |||
| 3deef78d51 | |||
| def143240c | |||
| 4b5d4e7047 | |||
| 64a9266f9d | |||
| bae31f4c10 | |||
| 7dc3fbffd1 | |||
| 69fa357520 | |||
| 59bf674d20 | |||
| 0f19c39506 | |||
| 5871209111 | |||
| 87cbe092a0 | |||
| 6dbb6c24f6 | |||
| 085a472b11 | |||
| e63034b438 | |||
| fcda655121 | |||
| df121a2e3f | |||
| de3756a416 | |||
| d76783c7a6 | |||
| 03a16be1d7 | |||
| 015fc81a16 | |||
| 440d33a65d | |||
| a336ef25a3 | |||
| 1cc8b3d752 | |||
| 54e42bc198 | |||
| 17266b189e | |||
| 48422bf0d5 | |||
| fbc83d1a41 | |||
| 694b88463d | |||
| 7bd9850289 | |||
| 5ca96dbb9e | |||
| d7caa21171 | |||
| ffbcbd966f | |||
| 8281aa3179 | |||
| 944226b1de | |||
| c88a3d597a | |||
| dd4217f111 | |||
| aee1c1d59f | |||
| f06b2f9488 | |||
| 0c5ff7e739 | |||
| c03809e415 | |||
| 39327d8066 | |||
| ce2b8eaa1f | |||
| 9048c9e6e7 | |||
| c5820968be | |||
| 33370eb020 | |||
| 6d42f3fc2e | |||
| 1cb6a9dd07 | |||
| a396da9c2c | |||
| 13e1fe416c | |||
| 7be4d65c77 | |||
| f65b06c965 | |||
| 8954bdb978 | |||
| 24cf62375f | |||
| 59031ab71d | |||
| dd677f226a | |||
| d930774f02 | |||
| ec79fa2a31 | |||
| 957edad859 | |||
| c03e46072e | |||
| 34e097f354 | |||
| 7087694337 | |||
| f5b5e64dd6 | |||
| 4485e4f0c9 | |||
| 16b6bbd6ea | |||
| 92fa2642b3 | |||
| 76f1c7a033 | |||
| 88b97fadde | |||
| 79fc096c40 | |||
| 0544e2c3fd | |||
| d6882ddf1c | |||
| 6cb1237e71 | |||
| d4c417c11b | |||
| b50250a406 | |||
| a7090e0131 | |||
| b795fee068 | |||
| 5723fa9279 | |||
| fc7b07a411 | |||
| 231f6aa359 | |||
| bef5b639b7 | |||
| dc87f58939 | |||
| 599b01d4ec | |||
| 7052a94e11 | |||
| 2a323390a2 | |||
| dc1ff3e465 | |||
| 1705e35b79 | |||
| fa5ff2f966 | |||
| ad44032faa | |||
| 6403b4d553 | |||
| 3345300cb6 | |||
| 641feefc01 | |||
| b99bc55bd0 | |||
| dc1b8910fc | |||
| c561ba8128 | |||
| 03d53b78f0 | |||
| f8caf6629e | |||
| 76d686e542 | |||
| e842cb22d4 | |||
| 846ebc60f0 | |||
| 2e1d7a3ae5 | |||
| 860544e7df | |||
| b317322cc9 | |||
| 0fc4c2c6ee | |||
| 7b37480919 | |||
| 6c24a3d339 | |||
| e7675038ec | |||
| 58073cf566 | |||
| 504689fe78 | |||
| 4d936590fe | |||
| 292df502ae | |||
| e66ff7427c | |||
| 4066215368 | |||
| 60a3e3eb3f | |||
| 3f861b308b | |||
| c5fc681ed2 | |||
| 3231de17b9 | |||
| 14d8bfe21c | |||
| 50ca986c1e | |||
| d913a2ee5f | |||
| ef21be9e72 | |||
| 8cba80dbbc | |||
| c42f4bf451 | |||
| e6d1624504 | |||
| a49aaf6864 | |||
| c6ef52ca7d | |||
| f43996f262 | |||
| a1a3029637 | |||
| f9bce766b4 | |||
| 97f65e045f | |||
| 6ae2f11143 | |||
| e6dc6da8d2 | |||
| 985e2326ea | |||
| 5834fde500 | |||
| 1e020fead9 | |||
| 23bda8ec12 | |||
| 1db67f763b | |||
| 7f50c71aa6 | |||
| 1498a04268 | |||
| b067bca4e6 | |||
| e3d4870ac4 | |||
| 8a5dfeb2b1 | |||
| caa703d32a | |||
| c87d87f369 | |||
| 34704584d3 | |||
| ca109d6458 | |||
| ac6c70fcb8 | |||
| 7d8445fee5 | |||
| e8e0b436b4 | |||
| 6f9b0b7e0e | |||
| d85e86fb10 | |||
| f4de00b1e0 | |||
| 6bd77cec9a | |||
| 6e96184de3 | |||
| 7077e8905f | |||
| 6ffebbaa9c | |||
| 992357b4b8 | |||
| caeac9617d | |||
| 9e5ac5c78e | |||
| ea4abcd20f | |||
| bcf73fc7c6 | |||
| cf09c8a23a | |||
| 09bebdfcd5 | |||
| 6db4ad8aa5 | |||
| 222e2d2aa3 | |||
| db34bbf35f | |||
| 170c1a55d9 | |||
| 13369e263b | |||
| d5045179cc | |||
| 962f30982a | |||
| 1e5b4275d1 | |||
| 91ae03b9d9 | |||
| f5a98fe453 | |||
| 03cfc26bb3 | |||
| 806815a6f5 | |||
| 8888f24a54 | |||
| 9b9b977a0f | |||
| e3f11c489c | |||
| 093dae5f49 | |||
| 71212c4951 | |||
| dfdd0911cb | |||
| d1ad2cf712 | |||
| 0439428950 | |||
| 6be4c2d108 | |||
| 13880d4e6f | |||
| 6a6d101722 | |||
| c7a99ea2f6 | |||
| a41823e8b7 | |||
| adc24ae6e6 | |||
| 2a0e9c9145 | |||
| d8fb38c307 | |||
| f427935669 | |||
| c94682fad2 | |||
| 38545553ec | |||
| 42cf4b01b5 | |||
| 6af28bb0f9 | |||
| e023358528 | |||
| eefda261a5 | |||
| 672c212cb4 | |||
| 5c9ebe7a63 | |||
| bb23fbe5a1 | |||
| 18add6b391 | |||
| 7ba7d144fe | |||
| 77b46e77bb | |||
| f5e368e213 | |||
| d09a8e5469 | |||
| 958bc0184d | |||
| 6f0782d824 | |||
| 39ae21c6df | |||
| a6ed57de41 | |||
| 6b2fe63969 | |||
| ff7a8a1c1e | |||
| a51ae8c40b | |||
| 7efa226ef3 | |||
| eb232a7c21 | |||
| 6a44da599c | |||
| a5b95298c6 | |||
| 4c38e86980 | |||
| 2856e13344 | |||
| b02fa00ea2 | |||
| da6ad0a6bd | |||
| 43006e2948 | |||
| 058ed3951b | |||
| 0d56a95ea7 | |||
| 28e9d3e9cc | |||
| d96a163e93 | |||
| 19f78f9b9a | |||
| 2930e56ae5 | |||
| d015c626be | |||
| cef0a4e255 | |||
| ffb49a0efe | |||
| cf15dd85fb | |||
| fc421a9cb6 | |||
| bb86cf08dd | |||
| 7b3a7c580e | |||
| 19aea6f0e9 | |||
| f239a633c7 | |||
| 4c45ac0170 | |||
| ba88d0ab34 | |||
| 51bea7b088 | |||
| 447813121e | |||
| b344239181 | |||
| 5618bd1534 | |||
| 779108a590 | |||
| 381b3ed0e9 | |||
| 844513763c | |||
| 391a992017 | |||
| db52566887 | |||
| a5150337a7 | |||
| a56cf349db | |||
| 4f4f5d3350 | |||
| 7cddb45381 | |||
| 4e8e1a9c98 | |||
| c078636d51 | |||
| efc48d638c | |||
| 49bff9b4e9 | |||
| 7acac0c604 | |||
| ca9b6a946c | |||
| 2ef3a6c440 | |||
| 797f0452bd | |||
| 17110a17d8 | |||
| 811192f6dc | |||
| efb067ad54 | |||
| 70421b7d6a | |||
| a6f7761433 | |||
| 3a3e059cce | |||
| 3a11565c7f | |||
| 015ff42af8 | |||
| 5d61a8ab58 | |||
| 28ef3caaeb | |||
| bdb607d113 | |||
| ac4684a9ac | |||
| 418a570b20 | |||
| 83a7cd66b0 | |||
| 669ed0facc | |||
| 5158ccd65d | |||
| 25bb1572f2 | |||
| 5de8cf538b | |||
| 648b0164d3 | |||
| 8140958a9f | |||
| 7da7862877 | |||
| 73a6d22b77 | |||
| cb966dda61 | |||
| 017eb43346 | |||
| d8f975a6c2 | |||
| 5523fd5541 | |||
| 4f2f8419db | |||
| 133b33b617 | |||
| 63e6befcc8 | |||
| 7e37de11f4 | |||
| 35321c95bf | |||
| 78453357fc | |||
| 238471381e | |||
| 2914f4618b | |||
| c24f6ff829 | |||
| 121b0f7b7e | |||
| a0989466d2 | |||
| 705fd14c5b | |||
| 8d2c1c2426 | |||
| 4baec727ab | |||
| 3708418ae1 | |||
| 4d136e33a2 | |||
| 7019b657a7 | |||
| 2f80663a23 | |||
| ed69238896 | |||
| 733849b51c | |||
| df6d948acb | |||
| b16184aa25 | |||
| 907d54df33 | |||
| 2d7811d3f2 | |||
| cecfcf46da | |||
| 4d3f090820 | |||
| 82be471222 | |||
| dda0ff8b31 | |||
| c07caf2770 | |||
| 9d55f8f464 | |||
| a4661ef8ee | |||
| 0ef0175764 | |||
| c7032c5707 | |||
| 945438d035 | |||
| 604b0e1a1d | |||
| 99f02c0641 | |||
| a4d2c5d3db | |||
| 89b697da9c | |||
| 6348e9ac25 | |||
| 33a577d6d2 | |||
| 61b8464ce5 | |||
| 8632227ea5 | |||
| 3ca8b49af0 | |||
| 43a50826e2 | |||
| 7c78c44d43 | |||
| 41ceb75a1a | |||
| b2418c95d0 | |||
| de5e3c7ab8 | |||
| 508397df4f | |||
| 41a5c3bfbb | |||
| 0b47abed68 | |||
| 55c51c8952 | |||
| 349da4ce9a | |||
| 218f933fce | |||
| 51e9358631 | |||
| 9ac6d2af83 | |||
| 3257ee4884 | |||
| 0310c57001 | |||
| 54c9384b60 | |||
| c609ce746f | |||
| 41a1c02689 | |||
| 453bfcfe2e | |||
| fb740ef572 | |||
| 33efa80fd2 | |||
| c263d57e68 | |||
| 48dcf3ce8d | |||
| a44813512b | |||
| 90cbd5ef5e | |||
| 131f705401 | |||
| 590fd51ba6 | |||
| cafef7eabe | |||
| 1be11b9115 | |||
| f16f24b247 | |||
| 3ed0b74dc8 | |||
| b012cce7f5 | |||
| b077dc3e2a | |||
| defc8a1874 | |||
| 9979695228 | |||
| 8b52848d1d | |||
| 1dcf366fa3 | |||
| d20903fc6b | |||
| 207abdc6df | |||
| 264d4684b5 | |||
| da223ca18f | |||
| 8ad615a23b | |||
| e26f0a29d7 | |||
| b4c28265b7 | |||
| aec57dcff2 | |||
| a316f3219f | |||
| 6a4d3e36f2 | |||
| 5b1f7f2070 | |||
| 042979658c | |||
| cdfe867651 | |||
| d99579178e | |||
| 4603c86449 | |||
| fe45fc4473 | |||
| a6465e6509 | |||
| 3f88e96c2a | |||
| ffee0df209 | |||
| 97591fe467 | |||
| e6bbaafceb | |||
| 24f4aad3e1 | |||
| f8763ae9ab | |||
| ae2424d685 | |||
| 8d221a777c | |||
| 05be825d46 | |||
| e6b8493916 | |||
| 6394011dfc | |||
| d2cd84c72f | |||
| 36be3f79d4 | |||
| 01b128e819 | |||
| 9ae44920fc | |||
| 0234a4129a | |||
| 840c05b811 | |||
| 7ca665761a | |||
| 076e18af15 | |||
| f409cc79f6 | |||
| 11df9d14bf | |||
| e88c259022 | |||
| 777c8d8953 | |||
| 7be27dce8a | |||
| ec2d36dcbe | |||
| 0e1d5fac9b | |||
| 1368ecd0b7 | |||
| 7a7aa583d4 | |||
| 191d07f9d7 | |||
| eeea80de41 | |||
| 8067ad239d | |||
| c495ab1045 | |||
| 1a6631a0b1 | |||
| 62cce64e56 | |||
| 3e40394a2f | |||
| f038d65543 | |||
| 274925604c | |||
| fd232b21eb | |||
| 494fbae3f5 | |||
| cf0d9f43ae | |||
| 281dcd3ce6 | |||
| 7c9313022c | |||
| 0fa4f7e9ec | |||
| 013b20ff4b | |||
| de8d1cc3f0 | |||
| 2578ead588 | |||
| d233ed604b | |||
| ec54d364d9 | |||
| b1addd9b94 | |||
| 595838505a | |||
| d8f99d50d8 | |||
| 3e3f8d0d20 | |||
| ae1a89cf55 | |||
| 64e414fb34 | |||
| 1a7e37ac48 | |||
| 509c11f3be | |||
| 4057c4bd9a | |||
| 3e22bd1988 | |||
| e59451dbfb | |||
| c69b589879 | |||
| 4b346ed9bb | |||
| 76a104590c | |||
| 347f6e8f0a | |||
| 511d5aa5d9 | |||
| cfab778b56 | |||
| d755b727ef | |||
| 85280f510e | |||
| d3275c209f | |||
| e2be85a296 | |||
| aee9599ebf | |||
| d5e08145dd | |||
| 38250a501b | |||
| 62ed7337a0 | |||
| 540e371de5 | |||
| fe55f6d106 | |||
| 17df65b789 | |||
| 872cfc94b7 | |||
| 57335b8c98 | |||
| c9a40f6e2a | |||
| a3a7cea1d8 | |||
| 4fbc551203 | |||
| fc64e0f7fd | |||
| 785e5afe43 | |||
| bae566b878 | |||
| 79f742af5c | |||
| fc604dc505 | |||
| 3869235888 | |||
| 3f67034a59 | |||
| b24f8e3b84 | |||
| 92e402213e | |||
| 0b3cd1f6e5 | |||
| e998cc6ecd | |||
| b73c28d51e | |||
| 920f325d03 | |||
| 8a571d88d8 | |||
| 185a13567c | |||
| ff2160e5cc | |||
| 0eebbac98b | |||
| 1983d90bc9 | |||
| 061e79d5dd | |||
| 8ee6fee9ca | |||
| b832c7ede3 | |||
| fffa8f91dc | |||
| 636117f523 | |||
| 2ff2b9c7ac | |||
| 409eb5960c | |||
| 3b29ca4e8e | |||
| 1b0ecccf44 | |||
| 62de747499 | |||
| 1adff8e7bb | |||
| df98be0f80 | |||
| 1eb1e44a56 | |||
| 494738563d | |||
| 5018093f4e | |||
| 5212bcb011 | |||
| 28aa452326 | |||
| 828b47e961 | |||
| 28bb38d2e5 | |||
| 9068d3aff5 | |||
| b7471261c2 | |||
| 599fda8982 | |||
| 9f32850ac3 | |||
| d26a930fb8 | |||
| 6a49cbc94d | |||
| ee50489dcd | |||
| 3534201bae | |||
| fe0b68929a | |||
| 92e4e7cefd | |||
| 82fc678740 | |||
| c7c9169bd5 | |||
| 97d45f09bc | |||
| cde44e1356 | |||
| cf39c5d413 | |||
| 094308a54f | |||
| efae4eea6b | |||
| 76c8abb326 | |||
| 874e81696b | |||
| 6ea65556af | |||
| cc4fc962c8 | |||
| fad34b60fb | |||
| bed6fbcb87 | |||
| 54a05d34b4 | |||
| f1d66d4bf9 | |||
| 3aab7c7384 | |||
| b16c5f5a23 | |||
| e1c1d42920 | |||
| 33c98f1d38 | |||
| e69109cf4d | |||
| 3a508641e8 | |||
| dc54d46bde | |||
| b92d84cae9 | |||
| 70b530bb4a | |||
| 47e0372ab2 | |||
| fd7d561602 | |||
| bec7ce87f7 | |||
| 3789d175e1 | |||
| 303c3d6256 | |||
| 2773c50364 | |||
| 1451b6c1c9 | |||
| 1ac060552d | |||
| e68743ab5b | |||
| ff528b688e | |||
| f68377f934 | |||
| 614b005f6c | |||
| 7eff62bf7b | |||
| 938fefedce | |||
| 8da051aae6 | |||
| c6f9387742 | |||
| 43a5c1a257 | |||
| fb9a0e7ffe | |||
| 4127a5c083 | |||
| 1ae864b799 | |||
| a640639158 | |||
| 00619bf9cf | |||
| 6132e3be22 | |||
| 743951658e | |||
| 70d840a6d1 | |||
| 21fd1f9823 | |||
| fbad37f3ab | |||
| a78b8a9b0d | |||
| d73fe1b460 | |||
| 4f17572478 | |||
| d56e7f6325 | |||
| 79dec0c869 | |||
| cd82cd5dbe | |||
| 949c7c4515 | |||
| c3c59ed78f | |||
| 8891fffcbc | |||
| 75c5ebb476 | |||
| 4ea8154f1c | |||
| 26542ab790 | |||
| 5148c87b40 | |||
| 86cca17b07 | |||
| 4b8fe6ad10 | |||
| d20ad1688c | |||
| 1923622ff8 | |||
| ea25c900e3 | |||
| 948d258846 | |||
| e9ace457e4 | |||
| a0b3985697 | |||
| 1f1ea007b3 | |||
| 2ce7b22a6a | |||
| 0352ec5a55 | |||
| 460eefb1bb | |||
| 44046f5359 | |||
| 72026c4a1d | |||
| e0deb0733e | |||
| d175de698d | |||
| 5e11e4b065 | |||
| a5d8f721eb | |||
| e3adab4f63 | |||
| df31833101 | |||
| 667a31f401 | |||
| 295bb7cf2e | |||
| 8914850195 | |||
| 062e7f1d1e | |||
| e4aa07ee6c | |||
| af76bb023e | |||
| 09ea0cc135 | |||
| 6b6ea382b4 | |||
| 8c769a1f5b | |||
| ef44bfb421 | |||
| 2754f026cb | |||
| 73ee943e63 | |||
| 0946808e12 | |||
| ccf2bfa1a6 | |||
| e8533b97d1 | |||
| 74c672b47e | |||
| 1eb4fcce13 | |||
| bf0231911d | |||
| fffbbf38b0 | |||
| 1fa2c1756a | |||
| 8b308b6ac0 | |||
| 6abba1a1ba | |||
| 571fccfcf8 | |||
| 064d8310a7 | |||
| 9ff857c274 | |||
| 4c07b3e369 | |||
| 1c05c9c851 | |||
| 2da2eacf7c | |||
| c7bca0e33f | |||
| c34ae35882 | |||
| 3510074827 | |||
| 639faf2605 | |||
| ae874273ae | |||
| 9ec5410b25 | |||
| 690d12e7ce | |||
| a90602c34f | |||
| 98e1e39974 | |||
| dd70b9fccb | |||
| fc048917aa | |||
| 5655425208 | |||
| a164f16e8e | |||
| 4cb55b697f | |||
| e1dacb9454 | |||
| fb00ebc013 | |||
| 36c537fd30 | |||
| 7c8ebe474e | |||
| 0842972b1e | |||
| 5c2f5077f5 | |||
| 24914184fc | |||
| 7ec713f509 | |||
| 6beb43f6d4 | |||
| 6dcb96ebd3 | |||
| e2247daa53 | |||
| 7a3801ada8 | |||
| 2bb1e0d0b5 | |||
| dc4adfaed0 | |||
| df3554d375 | |||
| 2774deac68 | |||
| c33ea2e92b | |||
| 47db35353c | |||
| 7420c726b2 | |||
| 5b6226b978 | |||
| 78136f2800 | |||
| 850a336aab | |||
| f83cbf5245 | |||
| 1e14aa0a4e | |||
| 6e9d776532 | |||
| 507efb7a4c | |||
| ef80f6907c | |||
| d511095e7e | |||
| 51c5f15366 | |||
| a30d7c71a5 | |||
| ed9eee6ef8 | |||
| 439dd73d0d | |||
| ac8c349335 | |||
| af4f0467d4 | |||
| 86c6ced9b1 | |||
| fbb0cec9b1 | |||
| 727a0c5520 | |||
| d13dfa5cc0 | |||
| 79c981718a | |||
| 339d98eed1 | |||
| 1e632c9ebd | |||
| 2fdf095b00 | |||
| b710831ef6 | |||
| d50381b037 | |||
| 589c7b8ded | |||
| 2677b89d27 | |||
| 36ffebc02c | |||
| 6cb08b6793 | |||
| cd872b3b27 | |||
| 8c47cce233 | |||
| 2d19874ee4 | |||
| efc9cdc9be | |||
| b0bd2fc976 | |||
| 9fa13cd8b6 | |||
| 429e311be1 | |||
| 181c182dd8 | |||
| 73f5b5c64d | |||
| 5310436d20 | |||
| 214d4a8075 | |||
| b5a044f006 | |||
| 408d16ae3a | |||
| 20c96c99df | |||
| ad264242f5 | |||
| 72ccfd5bbe | |||
| 342456a254 | |||
| 38323386a9 | |||
| a72ed7df34 | |||
| f0f7ebe171 | |||
| bf95111e01 | |||
| a752b48c99 | |||
| 579facd100 | |||
| 1186b830b8 | |||
| 4973f635b7 | |||
| 4857c06e71 | |||
| 38196b8d7a | |||
| e17bc3148b | |||
| c4e0ad19ee | |||
| 27f6bdf4b4 | |||
| 47d20a41ea | |||
| cc3e8680a6 | |||
| 461ea9cd3c | |||
| 9cc01d8a9c | |||
| 5510a7821e | |||
| c1b086bda5 | |||
| 4b9eaa843f | |||
| b8397b9c03 | |||
| 45b6c77ff1 | |||
| 5b05c194db | |||
| 4cb312e902 | |||
| b30be9ccb5 | |||
| 2971a61f90 | |||
| 8b172f53da | |||
| 1e1644d1ef | |||
| c4eb5154c2 | |||
| f164249588 | |||
| 2cc2533940 | |||
| 296e771a7e | |||
| 1ed4278610 | |||
| bf128544a0 | |||
| 4fd572c84b | |||
| 78b16c5a4d | |||
| 13424e223d | |||
| 775cce489c | |||
| 8fde60098f | |||
| de1aa758e3 | |||
| bc56f3c18a | |||
| ed6fba35bb | |||
| f7981c0d4f | |||
| b671764158 | |||
| 932a1c0f07 | |||
| b6d737ddb8 | |||
| 1f51211475 | |||
| 6ab7c918ce | |||
| 5d1bb30c6d | |||
| 98c5a81469 | |||
| 2149f20463 | |||
| 9792b2fa0b | |||
| 854fbd21c4 | |||
| 7cd3448718 | |||
| a150f0b415 | |||
| 1a968507d7 | |||
| daaf684bcf | |||
| 9b202b2189 | |||
| e5139d6d7a | |||
| b3ad8bf7ec | |||
| 3196fd7d9f | |||
| e0ee8abe43 | |||
| 585a7a3d2f | |||
| 8a3f43cfe9 | |||
| 66c304531b | |||
| 98733ab3bd | |||
| 7ec90bf63f | |||
| 513d510353 | |||
| 012eda1d81 | |||
| 6e752d80da | |||
| ee027a7b6f | |||
| e82c245f66 | |||
| b9ff7990b3 | |||
| a2209af24d | |||
| c3c9ebd3ea | |||
| 8698724572 | |||
| b16135df95 | |||
| 61fe0e5983 | |||
| f6a8c43261 | |||
| 9e3516253d | |||
| cf2b9049ad | |||
| 553a09d905 | |||
| 172eb8db24 | |||
| 506747a41a | |||
| c669aea5d6 | |||
| 501056f842 | |||
| 31f38898e7 | |||
| 1cc213bc9f | |||
| c9f0ff7cfa | |||
| 0499a9739c | |||
| 56124be461 | |||
| f9e6188892 | |||
| 144f99f57b | |||
| 06ac1ba9f9 | |||
| e6f4e55956 | |||
| 80682527df | |||
| f2bf431af3 | |||
| a8b17a2b2c | |||
| 8332a802f0 | |||
| c114ab1ef5 | |||
| b784e141d6 | |||
| 632e728d77 | |||
| a3c571d14d | |||
| c25789ce00 | |||
| ee7829dd9f | |||
| 4977b08add | |||
| 2f24964035 | |||
| b114f3bf7d | |||
| 99c6c21dfe | |||
| 6a51290961 | |||
| 6d64f3063c | |||
| 60eabad15e | |||
| 3b45daafc1 | |||
| 06a531405f | |||
| 167baef137 | |||
| 4a4875ecba | |||
| 2d6aff43d1 | |||
| 8537bd3e71 | |||
| 2f55f154ca | |||
| bf824726fc | |||
| b3c9eba384 | |||
| bc35fb5a1c | |||
| 6c56e5ecc2 | |||
| 8375094e71 | |||
| bf6518b1cb | |||
| 06551438f8 | |||
| 5780dfef1a | |||
| 6c2040a289 | |||
| 6eb19aadb9 | |||
| 0323a206c0 | |||
| 8c63064eb0 | |||
| 374f8a34c6 | |||
| 68334d5f8a | |||
| 60ef3a9153 | |||
| be358ce3d5 | |||
| 0e364bee8b | |||
| 3b2227ec9d | |||
| 4c7fb728cf | |||
| 9ff0583b33 | |||
| 17f2b2ae92 | |||
| 89ff1f49e1 | |||
| feb9b29fe7 | |||
| ffc80c53bc | |||
| 066e7853f1 | |||
| 0de5ba1e70 | |||
| 1bbb36aa79 | |||
| a4f939990e | |||
| b2b0af01ad | |||
| 27a8f53fc8 | |||
| 8d09101fca | |||
| 07c9402cc7 | |||
| 344c4ff328 | |||
| 4b7abd0b28 | |||
| a3ce6d5659 | |||
| 82ba8aa055 | |||
| ae0d542b5f | |||
| 3c10138c25 | |||
| dfe1e04164 | |||
| 4483aedd30 | |||
| ea6793c7e6 | |||
| 877799a998 | |||
| 0a177a9935 | |||
| 0910fdc114 | |||
| 17f6d07175 | |||
| 4d71d2aa07 | |||
| 91b96a0b35 | |||
| b4bc63e67e | |||
| eb0282eb96 | |||
| 76706909a4 | |||
| db93c63a57 | |||
| fe1faf8672 | |||
| 78c1b62a76 | |||
| 28a47da370 | |||
| 158bd75cd0 | |||
| 3204110e5a | |||
| 6ce21266aa | |||
| 12528894f4 | |||
| e8ca247286 | |||
| 9cdae1082c | |||
| 6d5b70b6aa | |||
| 53228de8d2 | |||
| c597816e6d | |||
| f49f8c99f2 | |||
| 4f3c5ef089 | |||
| 47ddeb6b0e | |||
| 8e63f2c047 | |||
| 6c2758fe94 | |||
| 1b9f64af5e | |||
| 3a6fb0ae57 | |||
| b0f0cae797 | |||
| 6c86da5e3e | |||
| a155889c2e | |||
| 90f0852e73 | |||
| 1e562e8727 | |||
| d1e099ca0d | |||
| b1862f244c | |||
| 7a12930a1d | |||
| 56e7a9dc71 | |||
| f4b7998a2f | |||
| a1bcf4bc54 | |||
| bd09a11740 | |||
| 41a1824741 | |||
| f995e47fb4 | |||
| d0c1e2c339 | |||
| ea71317258 | |||
| fd54f6c5d4 | |||
| 96b3d71ecd | |||
| 2d7e8c4a65 | |||
| ffcd97e6cf | |||
| f0277442d2 | |||
| 4e2ebb0f21 | |||
| f3097a2ead | |||
| 03855117cf | |||
| c7695c03fc | |||
| 1de56988f5 | |||
| 282cfe0b58 | |||
| ba738b8080 | |||
| 158ad55a3a | |||
| a83266b2e5 | |||
| 3f13595ec5 | |||
| a414b8cee7 | |||
| b0075c0925 | |||
| cb73a84f65 | |||
| 754638dc2d | |||
| be9452bf5e | |||
| feffc03541 | |||
| 98bbe9d342 | |||
| 59cc737a42 | |||
| 1c81166570 | |||
| 81a3a77398 | |||
| 73e6abea61 | |||
| 9019b7bc50 | |||
| 0d514c67a1 | |||
| d5fdd64a0d | |||
| 8919364763 | |||
| 712b1a0faa | |||
| 1e5822d3f4 | |||
| e050376ad6 | |||
| 3a7c072015 | |||
| 150d817f67 | |||
| d243f8569d | |||
| 70cd71cb29 | |||
| bfa1685672 | |||
| b59fede2ba | |||
| 56c00275db | |||
| ac55419d8a | |||
| b7de2af761 | |||
| 13b2db9365 | |||
| 056b0979f7 | |||
| 3807a62fc6 | |||
| a56efcdc1a | |||
| 4e19e36362 | |||
| c3db754e89 | |||
| c280508b8a | |||
| b338c04525 | |||
| 0da3e7b36e | |||
| 495d6eab30 | |||
| e0b3caad3d | |||
| 477f62c857 | |||
| 2f5f521165 | |||
| a3b2b77eb5 | |||
| f93b7f7fdd | |||
| 58b2e9e8a8 | |||
| ca4de7c9a2 | |||
| 99a712632a | |||
| 7e1ad13e1e | |||
| 8aca28965a | |||
| 273e378de0 | |||
| 6558f99515 | |||
| d3b775efc4 | |||
| 00b045ca2c | |||
| 3d8c4e345a | |||
| 2986df849f | |||
| 037efde616 | |||
| 7080e1b78e | |||
| 2bce4e6407 | |||
| 6beea8a61f | |||
| 0821c7f7e6 | |||
| 6ec530e2de | |||
| 3e576c5f92 | |||
| c8327b51bb | |||
| 7bcebcaa0f | |||
| 8eb51fc2b9 | |||
| 0dad71d379 | |||
| 14c3441341 | |||
| 4ea421730d | |||
| a93484ee9a | |||
| 352055af34 | |||
| d46a16a105 | |||
| 7be77cd745 | |||
| cf7ae29952 | |||
| 7df3af711e | |||
| de40f8a4bb | |||
| 8044aa16ba | |||
| 4f158ded97 | |||
| 1ab33ebdd8 | |||
| 08c2b81b51 | |||
| 127e0465e5 | |||
| 925b6421ce | |||
| 49212f098b | |||
| 9469b56374 | |||
| eae52736b9 | |||
| 8b4a134316 | |||
| e2550cf9d9 | |||
| 244c7d3e52 | |||
| 11f71f8273 | |||
| 8417aecafa | |||
| ef61b06a22 | |||
| 149f76b6c5 | |||
| 19d99f5913 | |||
| 8b43915f95 | |||
| df0791c1d0 | |||
| 05a5153470 | |||
| a3a7281846 | |||
| cf29b356df | |||
| 6b4f745209 | |||
| dc92ab506a | |||
| 1a3ef7da83 | |||
| 265ee66b53 | |||
| b2b22ab990 | |||
| bc46133ef8 | |||
| 9e55f1ad0b | |||
| b7dea9bfde | |||
| 40d6b1f3e2 | |||
| cb447c579d | |||
| c63042bb93 | |||
| 800a37e605 | |||
| 776d675715 | |||
| 8651553d8a | |||
| bb98e4d78d | |||
| ff1a83761f | |||
| 8cb771a710 | |||
| e6ea54b817 | |||
| 441f5d308c | |||
| 3a0960e004 | |||
| 03d957f731 | |||
| 1b79caa0b6 | |||
| 5ca2421b75 | |||
| 0c18762028 | |||
| 9cada469c2 | |||
| 923904f0dd | |||
| 399ca84c93 | |||
| 18617a5044 | |||
| 4c1226e69c | |||
| 967e217827 | |||
| e3ae3a3ded | |||
| eea5f30a7f | |||
| 8f01104cae | |||
| 947770edc6 | |||
| 975426a377 | |||
| 71ecec44f8 | |||
| 1f2ca01966 | |||
| 7518f7803e | |||
| 97aa4b8031 | |||
| 78564fa3b3 | |||
| f7f246ac46 | |||
| 189a6ac955 | |||
| 9570203c98 | |||
| f3afc81a83 | |||
| 224ae213fc | |||
| 446a752dd9 | |||
| 16608570ea | |||
| 0d7d2fd798 | |||
| 507ec6ed37 | |||
| 9f194675f4 | |||
| 0ee195e398 | |||
| 6c14f56ebe | |||
| 30161af688 | |||
| 633fda695c | |||
| f7affe87a4 | |||
| d87819a584 | |||
| a990d74a29 | |||
| 02011fb527 | |||
| d43a7e720e | |||
| d4ed800327 | |||
| f7cf3be74f | |||
| 8b7f9f7faf | |||
| 0d486d3020 | |||
| 85c58ade36 | |||
| e5325bf3e7 | |||
| c456d17833 | |||
| f41ca84851 | |||
| 1ba4f2fd05 | |||
| 59b0d08749 | |||
| e991b9ef0d | |||
| d45cd96882 | |||
| 70442b3da9 | |||
| 6dbe74c892 | |||
| d5d78a6321 | |||
| bd7ff14a61 | |||
| 6dd606d3dc | |||
| 095e6bae35 | |||
| 8ae2447710 | |||
| 79885499da | |||
| ea37b69738 | |||
| 5499dd010e | |||
| 58b0f32894 | |||
| 1111fee4bc | |||
| d42f0e784a | |||
| a8f35c7355 | |||
| 91cf4db380 | |||
| d46d7e903a | |||
| 5a3cd673e9 | |||
| 99d23168ba | |||
| 258fefc41d | |||
| a2aa513e46 | |||
| cd6926567c | |||
| 2e90e39f79 | |||
| 3a720421e0 | |||
| f848de5bd6 | |||
| c42f25b914 | |||
| 762c074d1c | |||
| 9007161779 | |||
| fe0533236d | |||
| 126b62db68 | |||
| 76e4fd9dd6 | |||
| aed53c00bc | |||
| 91d192bb69 | |||
| 8c64e08160 | |||
| b27f0a0dae | |||
| 58deb5b512 | |||
| 24f251125d | |||
| cd744f5052 | |||
| 7c43e0064a | |||
| 01fc14a013 | |||
| 46037d5840 | |||
| 9012e7f8f9 | |||
| 3971ff6159 | |||
| 1d0aef60c0 | |||
| a8f20cebf4 | |||
| b260447db5 | |||
| 233ae01a92 | |||
| 774fd21156 | |||
| 975ad1340c | |||
| da236cbd46 | |||
| ef910f7953 | |||
| d373b1db52 | |||
| 1abee9ae49 | |||
| fededf193f | |||
| 3b77508841 | |||
| 0d3203ba2e | |||
| 1a92c80d35 | |||
| e4aeee11cc | |||
| 3bea7339e1 | |||
| 13196783d4 | |||
| 9d1c673188 | |||
| 716e293639 | |||
| 66b2047686 | |||
| f51599cbfa | |||
| f870aa3ae3 | |||
| 9cdcef8dcb | |||
| d4fb84efd1 | |||
| 168940e3ec | |||
| 57a1d719e8 | |||
| d53864232f | |||
| fec0a7a879 | |||
| 9e2bab5cdf | |||
| 0997826de8 | |||
| 05fe45a4e6 | |||
| f1eb13a02d | |||
| 93fe429bbc | |||
| f9e91f19be | |||
| 86c38831ff | |||
| 32e546cbf3 | |||
| 6008c72892 | |||
| dc00e24c98 | |||
| d4ee46b7a1 | |||
| 36f16b9455 | |||
| f1513d8c0e | |||
| 0b28380f40 | |||
| 933c550ce9 | |||
| a6743e7efb | |||
| 546e37dd38 | |||
| 51902a59ba | |||
| 929f84b9b5 | |||
| 0861ef660a | |||
| 28f6e59b3a | |||
| 67b43790bb | |||
| a3b6cfbbd8 | |||
| 2a13774d66 | |||
| 782ceb1a55 | |||
| 98e3b81c21 | |||
| ec4918f115 | |||
| f55097a439 | |||
| b194862aa2 | |||
| 9e82b160c7 | |||
| c74fde2a27 | |||
| ed854f2bbd | |||
| e3250f9834 | |||
| e3976b8dc1 | |||
| 16bbbbea3a | |||
| efbb4c634f | |||
| 02c43ca656 | |||
| 870673840b | |||
| 8fc11f0041 | |||
| 9faefa2629 | |||
| 38439b3e69 | |||
| 76de72a3a9 | |||
| 5f763daa4c | |||
| 4c7772f096 | |||
| 41bf136a6e | |||
| c293d332f7 | |||
| 3e3f8e327c | |||
| 0b56986bba | |||
| a3b84cec5e | |||
| e53ba8df0f | |||
| a44ca9b0cd | |||
| dc9901203e | |||
| 6f4584ce83 | |||
| 2d3e78619c | |||
| 3e11f790c6 | |||
| f2123eae5b | |||
| 6e2bc2ee3e | |||
| 197d37e92c | |||
| c8c6c5e44f | |||
| a7364dc3b6 | |||
| e9016b0560 | |||
| 46d7535370 | |||
| 41eaeef80e | |||
| 8327ad6d93 | |||
| 8afd0ae0a5 | |||
| 0e08cecdac | |||
| 4cc666efd6 | |||
| 025bc22dbf | |||
| 1cc64a0cc3 | |||
| 23f6db5f87 | |||
| 360ffb5d7f | |||
| 34fa470be0 | |||
| e7f1406694 | |||
| c1673735cc | |||
| 326aa03098 | |||
| 0b3b3b61f9 | |||
| a05077a16b | |||
| b221c12fcf | |||
| 4bda591042 | |||
| 6254908957 | |||
| 5dbcdc54c6 | |||
| 045a7e296a | |||
| 9229b349b3 | |||
| e3a160c1c8 | |||
| 237c235114 | |||
| 8ac0b690d6 | |||
| e865853415 | |||
| 1ec98976b1 | |||
| 93833b8e03 | |||
| c419644df9 | |||
| fa5edb27b3 | |||
| ec89e07bb4 | |||
| 26122578cb | |||
| 429589b148 | |||
| c106b23188 | |||
| 1b78c4ab46 | |||
| ddc341a835 | |||
| fd18f94586 | |||
| 481a958f97 | |||
| 6bfdd62a9c | |||
| 1939c7c0b1 | |||
| cb61f1caa8 | |||
| 189b1b8bcf | |||
| 1ca23730b0 | |||
| 5f827ac0a5 | |||
| d6cd2c9a7d | |||
| 7e51f02b6a | |||
| 5ecdf44471 | |||
| 8e78347f4c | |||
| 7f479b7d43 | |||
| 1ab17d06f3 | |||
| 10e86a877e | |||
| ae2679e164 | |||
| 641ccfefd1 | |||
| 34d95e58db | |||
| 7bc12b1948 | |||
| 49b2763e0c | |||
| f46e922cc7 | |||
| d8d46399e1 | |||
| 0f25eaa33a | |||
| e310746817 | |||
| 8fd91526d6 | |||
| 6aca8a47db | |||
| b7b4554a18 | |||
| b90a843acc | |||
| d0d53c0620 | |||
| 3b108de276 | |||
| a3f37d9ecd | |||
| 6a44686d25 | |||
| 20e59a92bc | |||
| 969867af86 | |||
| baccb32d2d | |||
| ce6f2cfb30 | |||
| 294997d734 | |||
| 24ac4cf19e | |||
| 6991a718b3 | |||
| 31fd1361aa | |||
| a3dad02c78 | |||
| 7159dc2934 | |||
| 83c0bfc6af | |||
| 88c9d3f089 | |||
| 308a985ef8 | |||
| 79535c6109 | |||
| 1dca359a8e | |||
| 449f37133b | |||
| 3f196088e4 | |||
| 81020c3ed7 | |||
| 9c0c1aa906 | |||
| feeee5eb8f | |||
| 32de87b185 | |||
| 78dd785035 | |||
| f4b39ea29e | |||
| 20f45e5923 | |||
| 06373d2cfc | |||
| 804d3a4df4 | |||
| e165ba91af | |||
| 12de1d9337 | |||
| 9599669956 | |||
| 2a3c0c3da9 | |||
| 53d4847c38 | |||
| b9c2e739eb | |||
| b016822c57 | |||
| aa5ef2a668 | |||
| fc2166a46d | |||
| 39a5ba846a | |||
| e4b28a7854 | |||
| e4819c35e1 | |||
| 7b7027cbee | |||
| 74fb1615d8 | |||
| 5523010cfd | |||
| 7c106605cc | |||
| 72f87b87a5 | |||
| 9047d1175b | |||
| da6a068639 | |||
| a46b8bbbb5 | |||
| 6446f4a9e4 | |||
| a886743005 | |||
| 0dbfb1a6ed | |||
| a8fb85c854 | |||
| 3406b68857 | |||
| 8a0e21f837 | |||
| 4ec1aba9a6 | |||
| f069ef42df | |||
| 4734d36b55 | |||
| 02dd569d35 | |||
| 40332eccb7 | |||
| e809eec2bf | |||
| 40bf6c2d59 | |||
| 167820fcd7 | |||
| da2e36fd8d | |||
| 6ef42555d8 | |||
| 86ad348b6a | |||
| 53ac7e8f62 | |||
| 1a2f38ded6 | |||
| 781bf34868 | |||
| 53a94a68bc | |||
| 4fb6c05667 | |||
| b951f747a8 | |||
| cb707a526c | |||
| 6eeb12b0ca | |||
| ea9b988f56 | |||
| 213eff9341 | |||
| b8d64a5399 | |||
| 9bba26a2c3 | |||
| d5bc51732e | |||
| cb18aea20c | |||
| 903a8d71e0 | |||
| 1b9a4a1978 | |||
| 70d7fa0422 | |||
| 3d1b726450 | |||
| 6265cdbf06 | |||
| 845a5e4e2f | |||
| d4d8839be5 | |||
| 93b357dc11 | |||
| 23c57bf1f2 | |||
| 9589cbee34 | |||
| 5b00e0597f | |||
| 4abcae09c9 | |||
| a4c07cf27c | |||
| d86ba3aa41 | |||
| 1e78934af6 | |||
| 6f2ab3c589 | |||
| 2df6005091 | |||
| d32f1f77cd | |||
| 45429a3e34 | |||
| bccfa160f8 | |||
| 883770575f | |||
| 756d884d61 | |||
| 0529db6b3d | |||
| 45844e019b | |||
| 07e2a9b237 | |||
| 994b547642 | |||
| 76129fd10f | |||
| 3a8584cf1e | |||
| 72702596d2 | |||
| 30ffccc59b | |||
| 8c73690b01 | |||
| 6c5e1564b8 | |||
| de9c8f0c7a | |||
| 1b14fc9c1d | |||
| 61242561d7 | |||
| 73f326f395 | |||
| ae03420dba | |||
| 61b3d2e494 | |||
| 28ad1c34e4 | |||
| a0a1effbdd | |||
| d055c409ed | |||
| 8df02aa8a3 | |||
| d954698e31 | |||
| a8d176796b | |||
| 60d62888db | |||
| 6fdb21d79b | |||
| 33a4496105 | |||
| 4635c6c4a4 | |||
| c2026ced33 | |||
| 84fa137298 | |||
| d495b4094c | |||
| e06fc98e81 | |||
| 9cfcbf0b30 | |||
| 990d2eacf8 | |||
| a3f863fa7b | |||
| 3677c3c80f | |||
| db657e5082 | |||
| f8930f4bc2 | |||
| 563bbbad1f | |||
| 836856204d | |||
| 902fdaa07f | |||
| 25bb1554cf | |||
| 5ec8c2a775 | |||
| 337e96ca84 | |||
| 8ffb1b4412 | |||
| affbbd087f | |||
| 2409db22d8 | |||
| 06411fa037 | |||
| 14d9bdbbdc | |||
| 1508378ec1 | |||
| c5f0eae2a4 | |||
| 48b3beef41 | |||
| 1b043c75de | |||
| 7a8be73f51 | |||
| 4a640d422e | |||
| f21cd85960 | |||
| e32ee2413e | |||
| 00640d79fd | |||
| d024d9018c | |||
| bde575eccc | |||
| d897dfeb4f | |||
| 3954d1eec6 | |||
| 36eaa0aef9 | |||
| 82d03eeb74 | |||
| bb289379eb | |||
| 04d9410b9e | |||
| a7d472f3f2 | |||
| 10d3cdd36a | |||
| 361d5a68b2 | |||
| b2e7857642 | |||
| 1b1909af1c | |||
| 33c446c708 | |||
| 852f1bb285 | |||
| c86ca4726d | |||
| 651d21f2a3 | |||
| 6e99273ac2 | |||
| 542b4e778e | |||
| ea230ce353 | |||
| d74af81c8a | |||
| 2c43180043 | |||
| aa25f11201 | |||
| 0974eac7cf | |||
| 7c0694b4c9 | |||
| 8f8da58139 | |||
| 607fe06199 | |||
| 9fe62d5f1c | |||
| 39df8b5a10 | |||
| 52431b90cc | |||
| c9185d623a | |||
| 850969e0d1 | |||
| 07b0586c32 | |||
| 5b34d53348 | |||
| 438d1251ac | |||
| ef1b486896 | |||
| 62d8543ddc | |||
| 7032cdac99 | |||
| c1cb2bc0b6 | |||
| 78dc9cddc5 | |||
| 6ec9bf3479 | |||
| 76c82ae5fb | |||
| c4b0e19c8a | |||
| 3a47111bbb | |||
| daaf76d7f9 | |||
| 8f7d439f62 | |||
| 1c607bd880 | |||
| 3778e33c6e | |||
| a79f306ec7 | |||
| 91346b10f2 | |||
| 60eb61b7f8 | |||
| e920c992ae | |||
| d399f5d74a | |||
| addef1ff56 | |||
| 1c2c0ea8bd | |||
| fa5eeb7b0a | |||
| 1600c88124 | |||
| 952e4065ed | |||
| 27d049b3b1 | |||
| ce99dc18ab | |||
| fed0e8a363 | |||
| 73644fd0af | |||
| d23cb169ee | |||
| 2fab062269 | |||
| 668d2a4aaf | |||
| cdd05a8351 | |||
| 6ad30814c5 | |||
| a8f559cf9f | |||
| 1341215ff3 | |||
| 85ea6ff296 | |||
| 620964759c | |||
| ba919c7941 | |||
| 703f8eb322 | |||
| 15ae38669d | |||
| 1c5a555419 | |||
| ff2d795f8e | |||
| 5abbc3c811 | |||
| 776040ac41 | |||
| 3537d22340 | |||
| 8f865a93ef | |||
| 15c6727954 | |||
| 566e12fa8d | |||
| f16786ecb5 | |||
| f9838a118b | |||
| 265ae7f236 | |||
| edd768beed | |||
| c776ac9412 | |||
| d04757a8b0 | |||
| ed5333b716 | |||
| f7f487d75b | |||
| 87564199b5 | |||
| 644ded8a7f | |||
| a41b2ff2f0 | |||
| b803af646a | |||
| bec972a015 | |||
| 29bdea6adf | |||
| bb9c1c923d | |||
| c6972500ac | |||
| 8335c5576e | |||
| 05ce10c375 | |||
| 19af68829b | |||
| 96ab7afd32 | |||
| f7ebd6c1c5 | |||
| 1da6a8373b | |||
| 3902a9e0e1 | |||
| be76e1085d | |||
| ce78703563 | |||
| 61ff2fdafa | |||
| d3e7b01aaf | |||
| ccd732f322 | |||
| 26d1869c25 | |||
| 2389bc1cd7 | |||
| 90486af748 | |||
| 2f82b1e993 | |||
| c4f997d79a | |||
| 645ad8b207 | |||
| 618915c30f | |||
| 0eba3914b9 | |||
| db132c5fd4 | |||
| 7c7f2eb2ae | |||
| 3382c49530 | |||
| 94df7279b9 | |||
| b42df934d7 | |||
| c0a0b72e51 | |||
| d99c7daf31 | |||
| f3c57978e1 | |||
| 04a5143529 | |||
| 99bf7bc018 | |||
| f53faff7a9 | |||
| d11da7cf9c | |||
| df042c2fd3 | |||
| 386f00bdc5 | |||
| 626b437b7f | |||
| fa07fd84f7 | |||
| cefd98b186 | |||
| ecedaca967 | |||
| ce82a0b882 | |||
| dd8a05e36d | |||
| 2487ac651e | |||
| 6fcf9a9fc9 | |||
| a423d40554 | |||
| ceab818352 | |||
| eaff6c165e | |||
| 851af76905 | |||
| d90f5b6d19 | |||
| 04eab3feae | |||
| fd3d54f42a | |||
| f4d067e9d8 | |||
| b3b131f991 | |||
| 794066ee2a | |||
| 24f5986eef | |||
| 7b1e62cd9f | |||
| 2952bfb264 | |||
| 3ca72151e4 | |||
| ee18ab5b88 | |||
| a632f751a6 | |||
| 3ad3b7775c | |||
| 0615a25447 | |||
| 782f5ed66c | |||
| 125df80b4e | |||
| 1a35039889 | |||
| c931460b54 | |||
| 362c3eaefc | |||
| bcbd4a4850 | |||
| 89773d7e76 | |||
| 2ebb2be892 | |||
| e49997d939 | |||
| 5027edaa58 | |||
| d215122c07 | |||
| 3f59cc85af | |||
| 5d0ee1fb42 | |||
| 552ae0dde0 | |||
| 2d06cfbcfd | |||
| bad4bb49eb | |||
| ef9c176be7 | |||
| 8d5d04aa0e | |||
| a62bbdda76 | |||
| dfc8128912 | |||
| 4e89f7bef3 | |||
| 44820e9c9c | |||
| 605f600cb7 | |||
| 0af651b1e2 | |||
| 01dae4ef0b | |||
| e37a1a65b1 | |||
| 6a5bf21d8d | |||
| 880c9739ea | |||
| 7ae4a97335 | |||
| a342d0d9cd | |||
| 7470c68b4a | |||
| a6b5259b34 | |||
| a80f5bc227 | |||
| b0d2e602a3 | |||
| 30d6fd5b42 | |||
| 0efab27e1c | |||
| 4667a381e0 | |||
| 88d71ccf5d | |||
| a29763448a | |||
| 3515b83970 | |||
| 561da880ef | |||
| ae7107bde0 | |||
| 1979f8da16 | |||
| 8039427e09 | |||
| 1c7ed0d137 | |||
| ed754170ad | |||
| a9e0a06acd | |||
| 12706fd3f0 | |||
| 2ff0243d34 | |||
| d72a52ec68 | |||
| ebe824164e | |||
| 324b99808d | |||
| cc523ee3b1 | |||
| 16a1981e1f | |||
| 687b0bb155 | |||
| dbbf0bbba3 | |||
| f345dd395a | |||
| b6038dbbae | |||
| b60eafb1f4 | |||
| 59e22df433 | |||
| 5f3a8d7d81 | |||
| 8b45cf4e3e | |||
| ae890e8ec0 | |||
| 3ae59db3ed | |||
| 74b9300089 | |||
| fddef77964 | |||
| 1739c377d5 | |||
| e503383c47 | |||
| b839caea68 | |||
| 8f654585dd | |||
| 73588bce69 | |||
| 77a5a260ea | |||
| a873457da5 | |||
| a1c8806619 | |||
| 7b4b55ae33 | |||
| 68c69226af | |||
| b6368138dc | |||
| 2fe5079e3e | |||
| 548692ee5f | |||
| 8ea496bcb9 | |||
| 0d8de6cc5d | |||
| 8a6e3e68e6 | |||
| 09470dc06c | |||
| 530c9f13a9 | |||
| d657dc2aa7 | |||
| 9bc44bf9f3 | |||
| 9fd2706fda | |||
| 3dcaf77b75 | |||
| 972f8df642 | |||
| 92144f5431 | |||
| e1add68dd4 | |||
| c8313145b0 | |||
| caf601d6d5 | |||
| ad84e9d757 | |||
| e9d1b3afad | |||
| 6119f2f2f9 | |||
| 3508cc488d | |||
| 129c3da3f6 | |||
| 89a97598de | |||
| 1ce956e1ae | |||
| e02695003a | |||
| 5a277b4f99 | |||
| 04bcbdb6eb | |||
| 70ec11d055 | |||
| 70276ce275 | |||
| d69cef0cdc | |||
| 137c93a998 | |||
| dc917f2f0c | |||
| 197396debe | |||
| b7a9ff5213 | |||
| 70035268eb | |||
| 601548a58d | |||
| 04a94567fc | |||
| a50d82ed70 | |||
| 29e553f4c5 | |||
| f36725e1fa | |||
| ef49d306d2 | |||
| 40ec0e0220 | |||
| 2b216acee6 | |||
| 13521b2569 | |||
| 4ef2981e05 | |||
| 31983be931 | |||
| f3e715657e | |||
| 75ee2e2a79 | |||
| a5ef2d23c0 | |||
| 1aed737278 | |||
| e2418be3e9 | |||
| 4874cc2f1c | |||
| 34f4b62e7a | |||
| c6b74a3591 | |||
| 20b60c354d | |||
| 7fc3fba92d | |||
| 33443c0123 | |||
| b160a5ef61 | |||
| 95c2c1697d | |||
| d49c6a9bdf | |||
| f7d28a492f | |||
| 3579eb9dd9 | |||
| feb73c8e88 | |||
| 7a2285dbda | |||
| 8ebac13d22 | |||
| 203309b88d | |||
| eb0d6f1b6e | |||
| dd801e37bf | |||
| c764d00a6f | |||
| 0465384e31 | |||
| bd896c7a81 | |||
| 90a519fcb9 | |||
| 37b1499b62 | |||
| 2df745999f | |||
| 3dc18415b5 | |||
| 87e598a4ad | |||
| 6d0a06b00f | |||
| 8ade32783d | |||
| 079c650f9a | |||
| e429ba6024 | |||
| eb0f174aaf | |||
| 6489dd2289 | |||
| cfec0c3b3c | |||
| 1755aef616 | |||
| 03c991ce15 | |||
| c45d3dfefc | |||
| 07d5a7476a | |||
| 557a855f49 | |||
| faa5f8cbd6 | |||
| 3802203de2 | |||
| 51f8e000c9 | |||
| a953a43c1f | |||
| 1245c37019 | |||
| 9791997f1f | |||
| 3b0645387d | |||
| b02dc1ad04 | |||
| cc354955fc | |||
| 89729c0cf1 | |||
| 5d29893aee | |||
| e73fd5a20a | |||
| fc91ef758d | |||
| 7133a66f47 | |||
| 032e6102b4 | |||
| 72be7c93c1 | |||
| af766dc80e | |||
| 3bac4d8f7c | |||
| 7b1b90f17d | |||
| 400c5b891a | |||
| c7bf139eba | |||
| 3343f2521c | |||
| e3b2c0cd6e | |||
| d2563d4cdb | |||
| f0a7821cc4 | |||
| 5c999d2bf2 | |||
| a206cf1ce8 | |||
| 7cde470ad1 | |||
| 090910abbb | |||
| 399b616a00 | |||
| aae35e1ba6 | |||
| 893ae24774 | |||
| 1394cc7512 | |||
| d3a00fcc4e | |||
| 303e1706b7 | |||
| ab609f2066 | |||
| 1c781358b0 | |||
| 9a52e330f8 | |||
| fcfd72f80f | |||
| 6c765c1337 | |||
| 8a9c4b505a | |||
| ab7a120d9e | |||
| 0880013262 | |||
| 5a685c7331 | |||
| 92d497e1a4 | |||
| 91ba9e3da0 | |||
| ca3ba1fc4f | |||
| ffab68b93f | |||
| 6804cf2b3b | |||
| 1d06df34df | |||
| 99f93200ac | |||
| e666cd000e | |||
| 6096c0bfc1 | |||
| 724be07d50 | |||
| bd75cf0e3b | |||
| 216a96d91a | |||
| 0c2fbe9bc8 | |||
| 1b885f011f | |||
| ca4d0e18eb | |||
| b694ae1a88 | |||
| 6f5ab9bf43 | |||
| 858aad7905 | |||
| 9e1edc0601 | |||
| 0ae0289621 | |||
| 1d33a6885e | |||
| 8240816c04 | |||
| 3c0ee240dc | |||
| 353f0f315c | |||
| 8b581156c5 | |||
| dfa8b67b04 | |||
| fcd721115a | |||
| 28e8d55189 | |||
| c68a82e5d4 | |||
| 180bdd1f31 | |||
| 4d30e50b42 | |||
| 448cbd137e | |||
| 22656adfac | |||
| 5e04d627ad | |||
| c9b028ff4a | |||
| 06ab49e92f | |||
| 201a0f7822 | |||
| 79e691b1a5 | |||
| 9839af1fcd | |||
| 2fecddffb0 | |||
| 8ef2129048 | |||
| d0e5fa009f | |||
| f17380b912 | |||
| 841896f873 | |||
| 0eec87e9e6 | |||
| 0f79a5f467 | |||
| bf1c80e4bf | |||
| 210b88ac07 | |||
| 8b5645ab17 | |||
| 53e267d5c8 | |||
| 1a3088dd5f | |||
| d22f340ba9 | |||
| 0ef8b0960b | |||
| 05ff75236d | |||
| 0966651a9c | |||
| 1cfbf0a769 | |||
| 4022ed12ae | |||
| 29d97d2a70 | |||
| a7c5d3c048 | |||
| 444edc68cb | |||
| bb928c9cab | |||
| 69748fc993 | |||
| 815ac6e55f | |||
| 2bd0f23cd5 | |||
| 53a720bc15 | |||
| cfbd1e5504 | |||
| d64ccd7d40 | |||
| 7b41fe2050 | |||
| f342f5e3ca | |||
| 7e2bd04ef8 | |||
| d480a26815 | |||
| cb1b52de82 | |||
| 0e8739efc7 | |||
| 086f1fb367 | |||
| 4e176a137c | |||
| 9bcbb44624 | |||
| be4d98f0da | |||
| 77a215ab17 | |||
| 541cbd2413 | |||
| 0c055f3a79 | |||
| 6fb23ca8e4 | |||
| 31ae4cbe7a | |||
| 4fc70c3994 | |||
| 117f022889 | |||
| 11ad31e62c | |||
| 12543bb366 | |||
| 459570dd7c | |||
| 9ff1ad4044 | |||
| c531c9c3e2 | |||
| 2b5095736d | |||
| 4e98b2e9de | |||
| da28bc91e3 | |||
| a36113873e | |||
| ce0260f810 | |||
| fe64b22d6b | |||
| 0af823f49b | |||
| 1f60ff9143 | |||
| 6b10d8053a | |||
| 18190c138a | |||
| d74d96e7fb | |||
| b7286f7198 | |||
| b818e68ae6 | |||
| 206d67adda | |||
| 174e8ff269 | |||
| 8cb572cab0 | |||
| 6c831db8f3 | |||
| 66773fde42 | |||
| ff765e041a | |||
| 7b682031eb | |||
| 8e66a744a7 | |||
| 2eb261c592 | |||
| 4692fd819b | |||
| f91fff6cd4 | |||
| 88597fb03b | |||
| 6e1703dcd6 | |||
| 2dcb42f3ef | |||
| bbeafe9eff | |||
| 2ad3148e27 | |||
| 26fe87e461 | |||
| 0ca97bb612 | |||
| d7dba628e3 | |||
| 5a0f78f924 | |||
| 079935ed4e | |||
| 1ab5a22606 | |||
| 2029ce0d3d | |||
| 3bdf68effc | |||
| 324ff339be | |||
| 32ce2728eb | |||
| f83ea63058 | |||
| baf90e5005 | |||
| d2833e6bca | |||
| 4b85f4ee6d | |||
| 20cea10050 | |||
| 3c261c85b6 | |||
| 51c71c662d | |||
| a056b77b18 | |||
| 9b42070807 | |||
| 18d79f4cf3 | |||
| fc94d3ab7d | |||
| e84f1479d9 | |||
| f76d4356d8 | |||
| 57d5546b7b | |||
| bbeaf9893c | |||
| 44355def2a | |||
| b8be7391a0 | |||
| 0cee264774 | |||
| 332e22e931 | |||
| 4bbb4910fc | |||
| 4f87a1b050 | |||
| c4f383ae2b | |||
| 122ad36b7d | |||
| 1bb997d030 | |||
| 9cbb09d0f5 | |||
| 59b519a103 | |||
| 94e7bd0696 | |||
| 8375d5e634 | |||
| a8c34044f4 | |||
| ac2c37c349 | |||
| b0290bb60e | |||
| ca7e9b1ae4 | |||
| d9eee885fa | |||
| 09e1b90de7 | |||
| 0997737b27 | |||
| 22c2105b03 | |||
| e71453641d | |||
| d08a6b1202 | |||
| 52a7df3d72 | |||
| dff7b524ba | |||
| c5bec2b3a5 | |||
| 67edf65502 | |||
| a4681a3c04 | |||
| bcd70c2302 | |||
| 9023583231 | |||
| 22dd72753e | |||
| 8db6fd8654 | |||
| 72d47e0a21 | |||
| c410c7c943 | |||
| b3a9ed2fe6 | |||
| 1f741664b6 | |||
| 99d196176a | |||
| 18fd82fd7e | |||
| 22a5aa1f08 | |||
| ee930e01a7 | |||
| 847fec0f13 | |||
| abf1e75713 | |||
| 3342373d67 | |||
| 224630968a | |||
| b56d4b5400 | |||
| e33ed69fcb | |||
| e059d8213e | |||
| e07fd0a0c8 | |||
| 6184957f42 | |||
| e585d0edbc | |||
| 41708e6228 | |||
| fdffa3ed76 | |||
| e88383e409 | |||
| 4a4ed579dc | |||
| 4f431014f1 | |||
| d052b65a15 | |||
| 925ad20690 | |||
| fd7051b6f3 | |||
| 5f01a2adac | |||
| 8816a9560c | |||
| 52bacf03a4 | |||
| 3f5c96f848 | |||
| 7071a350d0 | |||
| ef09502162 | |||
| cc4a46df64 | |||
| 7161fb6016 | |||
| 6bf4c8881f | |||
| a3589123ec | |||
| 79a2f281c5 | |||
| 02590a54d7 | |||
| d2beec373b | |||
| 101f11fa6c | |||
| b064339e91 | |||
| 004130086c | |||
| a6b95519d0 | |||
| b087d37b23 | |||
| 10776fcac9 | |||
| 16685ab12d | |||
| 83be35f713 | |||
| 889d312468 | |||
| c5774f6911 | |||
| 48e83f138d | |||
| af8383c34c | |||
| b67d1747dd | |||
| a7d268df10 | |||
| f5cb026ee1 | |||
| 663fc516d1 | |||
| 5cbdf9bf1c | |||
| c81ae9a766 | |||
| b40f23f64f | |||
| ece632eed7 | |||
| 17eb804a1d | |||
| 2cfeb99d8d | |||
| 716665b0a8 | |||
| 55319ec01e | |||
| 6d4a3ac00d | |||
| 7fa30714e6 | |||
| fdc3bf6f38 | |||
| f9ac95cb9b | |||
| e994655f0d | |||
| f91b9724a5 | |||
| 48b6a4e27c | |||
| 3b99d8322e | |||
| 73383f2710 | |||
| eacc0122f4 | |||
| f02287e445 | |||
| 694b11b4a1 | |||
| fe16dc2967 | |||
| 9ff417bc69 | |||
| 5c5f550b8c | |||
| 575d7596e1 | |||
| 380dd917c8 | |||
| 4594716347 | |||
| eb4098db9f | |||
| b95a8db827 | |||
| 2215bc4ed5 | |||
| fc4d60af70 | |||
| 94540634be | |||
| c64783366e | |||
| da014a698a | |||
| 6f5254e442 | |||
| 57eab29d7a | |||
| 2b5b3ceedf | |||
| c9c84d6175 | |||
| 876910a81b | |||
| d3a36d3214 | |||
| 27325ffbfd | |||
| 24f886de91 | |||
| 0457c48bfb | |||
| cba6aa8212 | |||
| 2e832a8150 | |||
| 5c814dad79 | |||
| 77f321dc09 | |||
| 9501ea2b90 | |||
| 1d19a7d2f1 | |||
| 619de63b3d | |||
| 3846d8653d | |||
| f583e29d76 | |||
| d658d61081 | |||
| 202f224991 | |||
| 6f8896ecd7 | |||
| 6a0beee038 | |||
| d75c0421f4 | |||
| 8834403ca0 | |||
| 1640c382de | |||
| b9f2d280a1 | |||
| 81504813b7 | |||
| 0dbce37fce | |||
| f1b6b770b0 | |||
| bc807a2660 | |||
| ce33412a09 | |||
| 0f1b0a300a | |||
| 3b8ad9632c | |||
| 060dbed7f7 | |||
| a1cb719176 | |||
| acb580ad0a | |||
| f394de84ce | |||
| b2d1d890c1 | |||
| d1fd7c14e6 | |||
| 306e9145a3 | |||
| 41e2e68e3f | |||
| 11964ff71f | |||
| f74763b8e6 | |||
| a1b1722e47 | |||
| 9dbe29ceae | |||
| ab84c78135 | |||
| b9c6a668c0 | |||
| 53f9ca1f2a | |||
| f02853063d | |||
| f3b92143f5 | |||
| fd5546901c | |||
| 88f477a7d5 | |||
| de82f95baf | |||
| 4b104260ba | |||
| 022b6f3d5a | |||
| 078f7b4861 | |||
| 193f2cd5f0 | |||
| aba8b86be3 | |||
| 8993fc2557 | |||
| 5b801d4e75 | |||
| 3ad05471e3 | |||
| fdb0ae65ba | |||
| 120d2261d1 | |||
| d849c9c67c | |||
| 2a3a784f3f | |||
| dbf1c03b7b | |||
| 7200356530 | |||
| 2ef8789182 | |||
| 1ffb230b2b | |||
| dd045a8949 | |||
| 429bb3faad | |||
| f20f9382e6 | |||
| c406945f63 | |||
| eedb50a7d6 | |||
| 0b9fc5de67 | |||
| db779d1068 | |||
| 7a87c1eb93 | |||
| c6503d6e1c | |||
| 8f003d68e0 | |||
| e521e9baab | |||
| bd05872b6b | |||
| 2bf7a1ace2 | |||
| 40e776bf29 | |||
| 866ed20f35 | |||
| 054ddf8648 | |||
| 495e417d82 | |||
| fdeb7bee94 | |||
| daa25c95e7 | |||
| 686bd5680d | |||
| 7e322b3c2b | |||
| 9f365be4a9 | |||
| fcbd3da22f | |||
| 509c047323 | |||
| 16c437514e | |||
| 7924cfa099 | |||
| 54a5a0555c | |||
| fe9128e60f | |||
| d3dfcbf37b | |||
| 4bb4d65b74 | |||
| bdc73d43d1 | |||
| 8e29a56cda | |||
| 9c856538a7 | |||
| c89ee3ea22 | |||
| 35eadc1697 | |||
| 2b5915b260 | |||
| ceeed297af | |||
| ae136cf9eb | |||
| 39cefd6304 | |||
| 3b2f6654f8 | |||
| e0edbcdc30 | |||
| 8d830dcef0 | |||
| 380373b6cd | |||
| 6e47c7142a | |||
| bd6551947f | |||
| 0c041509e6 | |||
| e3583307fd | |||
| 8fabe5d1b8 | |||
| 4cb969d991 | |||
| be11e4f2f6 | |||
| 3e1f05bac9 | |||
| b1c9efa270 | |||
| dec181b6fc | |||
| 0f3685a4fd | |||
| 23e94d542d | |||
| d7ea2e0c94 | |||
| 6726ca6ed3 | |||
| 52f0a2a954 | |||
| e54457bcb0 | |||
| 2412691694 | |||
| 051a893ca7 | |||
| 8bd05824ce | |||
| c43bf480f6 | |||
| 5c1ac2ca70 | |||
| 63a97a63ce | |||
| 20b73e2e20 | |||
| ff2251d6d9 | |||
| b61198cbf4 | |||
| b9375ba27a | |||
| 645704057d | |||
| 03c5d6be9e | |||
| 7808e5e993 | |||
| 9aa412b107 | |||
| 69c4e00613 | |||
| c7873a8a17 | |||
| 12d7500a69 | |||
| 67b0fca821 | |||
| 6df0840474 | |||
| 29598be699 | |||
| d15d16b0be | |||
| afbcdf240b | |||
| 13d484ca9e | |||
| 8c391275e3 | |||
| 604567018f | |||
| c8b917a884 | |||
| 29a69b6041 | |||
| 480374b245 | |||
| 52e25cdfe3 | |||
| 1c4ae672fa | |||
| a3f52dbf8e | |||
| c716ac5480 | |||
| 841a59eb32 | |||
| eb49677485 | |||
| f8ce734569 | |||
| ac8c37c6d5 | |||
| 1a8d88f6a6 | |||
| bc101f5785 | |||
| 8dbb9f1bcc | |||
| df88471be4 | |||
| 208c9160c9 | |||
| 36d4dd7feb | |||
| 7efec6a669 | |||
| dd2b3920c3 | |||
| d4bd548d61 | |||
| 3f76a2e51b | |||
| 01a0dc5c0c | |||
| 28b03d2145 | |||
| 28ffcc841b | |||
| 282eee5765 | |||
| 4966b62311 | |||
| 9fd4dfff71 | |||
| 0d888b84e6 | |||
| aad4d4aa39 | |||
| f08592d2c7 | |||
| 0dc3a16e31 | |||
| b9b4b8a035 | |||
| 0740055506 | |||
| c2aab35c60 | |||
| 7843090356 | |||
| 29dd998fae | |||
| 708a8eec80 | |||
| c5a956d05b | |||
| 5ca44254f6 | |||
| 24e34bf8bb | |||
| 8ee0f9844b | |||
| de1c1c2c0d | |||
| 32ee290773 | |||
| 8ea26048c4 | |||
| abfbe13624 | |||
| 455b40b073 | |||
| c701194f48 | |||
| aa892ef784 | |||
| 706bbb90ec | |||
| 4f35d9990f | |||
| e58d26fb83 | |||
| dfe829e7dc | |||
| 7b3c2df592 | |||
| 2b60a3919c | |||
| d8168632e5 | |||
| 1b68dd7f83 | |||
| f31e5277cd | |||
| 0895779064 | |||
| e6166495b7 | |||
| 8f90505d3e | |||
| 66c1731f3f | |||
| 3a3d36ab08 | |||
| 21ede922f7 | |||
| 0b3cc3ddd7 | |||
| 43f64b36a9 | |||
| 49637bebb9 | |||
| 71824ff287 | |||
| b71ea9ad10 | |||
| 51d2b5bab7 | |||
| 2e8f098d7e | |||
| acdd583aaf | |||
| 425f6e6105 | |||
| d5f8575eda | |||
| 17fb494060 | |||
| ae0018b525 | |||
| cbef1eca19 | |||
| 07b99d386a | |||
| 3459a104ee | |||
| 0f316a45b5 | |||
| 7dac5948b1 | |||
| 4be7471c56 | |||
| 1b3e49b96c | |||
| d9cf9336ce | |||
| 54e897094e | |||
| 74575d3404 | |||
| 1d039b6749 | |||
| 01b992ce05 | |||
| 538437b7ad | |||
| 610bd6fba4 | |||
| 9ee7277ab8 | |||
| ff31742b14 | |||
| 18736d61ac | |||
| bc349683e9 | |||
| b2c81cdb4c | |||
| 8bce249ff0 | |||
| 599f08b649 | |||
| b91b4c75c8 | |||
| 78e15feeaa | |||
| 64d06887a5 | |||
| d115fa6e30 | |||
| 2bc918fc4d | |||
| 3cc4aa2344 | |||
| 6ddfa97ebc | |||
| 32a7503e01 | |||
| 9ddf0f7acf | |||
| 2cb34fea5c | |||
| b59c1ad5e7 | |||
| 160b42759d | |||
| 6e8bd9ad27 | |||
| 7e49aa03fc | |||
| ee7f5a8034 | |||
| 80e05c8327 | |||
| 3f9f704587 | |||
| a2d676e517 | |||
| be8217f31a | |||
| 16354ee6e5 | |||
| 69a741c5ba | |||
| 9a10c803b3 | |||
| 26e2f658e4 | |||
| 088d5c7a30 | |||
| d7eb6d7f9f | |||
| 16b9d324b7 | |||
| 8d87497b00 | |||
| 6a97c7bb16 | |||
| 7218f25f50 | |||
| cd87f42a9b | |||
| dee4a153c4 | |||
| 31273296fe | |||
| a93faeb280 | |||
| 1f46ff65ea | |||
| 9b38815c56 | |||
| 647dd99e44 | |||
| 5b1c8dd644 | |||
| 553b834042 | |||
| 7b2da964e5 | |||
| 8575d62354 | |||
| bf289ae1bc | |||
| b31889d0e0 | |||
| 299d11f8a8 | |||
| 6f7a948488 | |||
| 56c6ad3b7f | |||
| 50a4728478 | |||
| 107670145a | |||
| 92ee0041ba | |||
| 49892f5ebb | |||
| 7586219c04 | |||
| 4917ebcf36 | |||
| 66c23b9de6 | |||
| db54a5c66f | |||
| dd3b23005d | |||
| d278917fcf | |||
| 4b59a6bd32 | |||
| d10df32600 | |||
| d51a94253a | |||
| a1e56a3ba9 | |||
| bd9511dd0e | |||
| 0355c52126 | |||
| d382d71c7e | |||
| 43873e8221 | |||
| 3abe789f76 | |||
| d40be19b02 | |||
| 34288c5bba | |||
| f696190c0e | |||
| adaec7704c | |||
| cb909a8f1a | |||
| 1164893367 | |||
| 1fa531daf8 | |||
| fa2b7fece2 | |||
| e09d9570cb | |||
| 621ece03ad | |||
| 1b9c6525da | |||
| bb7fc8d145 | |||
| c3814b9e59 | |||
| 61f3e7e818 | |||
| c6d5b13f12 | |||
| a87705b4ff | |||
| 4099678077 | |||
| 15e73d9bf7 | |||
| 6f1e67b2b5 | |||
| 2ec88efcca | |||
| ab8202ffbf | |||
| 0b3a0a7b8d | |||
| 618c805c7e | |||
| 60ebeddf41 | |||
| 7f5a789406 | |||
| a78965bc9d | |||
| 6486facd38 | |||
| 89e3a461c8 | |||
| 1d57375ced | |||
| 466093fad9 | |||
| b1dfcb99f8 | |||
| 72c36e0876 | |||
| 1fd2e67898 | |||
| b38adb5171 | |||
| 6fb28e5f7d | |||
| fa8d025ca8 | |||
| bcade58c1c | |||
| a617c5557b | |||
| f3993e1790 | |||
| 12924afa0a | |||
| 0e0fdcccd7 | |||
| 6548567ad7 | |||
| 3a5c6bca80 | |||
| 4d26ccb983 | |||
| 5d91a7604a | |||
| a29c4f8b51 | |||
| 96541108c3 | |||
| f3fcfe952a | |||
| d9a4772977 | |||
| 752da16214 | |||
| fc8cd5b6ea | |||
| 59a8809f98 | |||
| b7b374200b | |||
| d27d4cca72 | |||
| 51c4bea20a | |||
| 46b223174c | |||
| 5872a08793 | |||
| 1043b9c054 | |||
| 4359bc06f7 | |||
| 1e0aaf9c19 | |||
| 06595488c4 | |||
| d86a6bbed0 | |||
| 89d334cb20 | |||
| 7642088732 | |||
| b837affa1d | |||
| bba172f769 | |||
| 2384df3312 | |||
| 9f54fc4026 | |||
| e871f05cfe | |||
| 5bfb498b45 | |||
| 8aab319a2d | |||
| bf5746f6cf | |||
| efd642b151 | |||
| 735fc8f732 | |||
| 4465a8bd99 | |||
| 8aeb0b5445 | |||
| 2f46f75970 | |||
| e2539791a8 | |||
| ca4de0e435 | |||
| c708815a25 | |||
| 5a39a122dc | |||
| 82e8ba8b6a | |||
| 661515f5a8 | |||
| d29df5ef70 | |||
| fb249230c1 | |||
| f07ccdc417 | |||
| 3ecb150933 | |||
| 97aa5b02d5 | |||
| 07c38c5c86 | |||
| 3191ab295d | |||
| 59b174029f | |||
| 82b179ccaa | |||
| 6a989fd7eb | |||
| dce7f418c3 | |||
| 6f6b5b7565 | |||
| 296fbc586f | |||
| da68bd88ec | |||
| 17201d4a63 | |||
| b310933bb9 | |||
| a644bb2070 | |||
| 391d14e0d2 | |||
| 3ea7bae19f | |||
| 6672db333e | |||
| f80a95bf30 | |||
| e22629623a | |||
| 81ff398777 | |||
| 8f36b20ab9 | |||
| cfab568b31 | |||
| def64d1c6f | |||
| 2dd1f6768c | |||
| e906597c2d | |||
| fa702aaccc | |||
| c6908a45a6 | |||
| e0da601c80 | |||
| 33334b1b43 | |||
| f193441289 | |||
| 8eaa42ef39 | |||
| abc8c1dcec | |||
| d5bbebbb13 | |||
| 18cd288c82 | |||
| a7c3431323 | |||
| 97f02ac1d0 | |||
| ce8c1b70d5 | |||
| f906cfa686 | |||
| 138737c414 | |||
| 9ec3b79dea | |||
| e8a081c3dc | |||
| 06637d5221 | |||
| f999202e94 | |||
| e13e2cf5bd | |||
| fa920523c0 | |||
| 6c0ea314a3 | |||
| 7eaaf66419 | |||
| 966dec6f17 | |||
| f07011d828 | |||
| 66aef5b026 | |||
| 1c5e133ce6 | |||
| 49939fe2f4 | |||
| 23fd711cbc | |||
| 09c6af1659 | |||
| d9cde1c924 | |||
| fca96e56eb | |||
| bb4a277385 | |||
| a329707f22 | |||
| fed6d11e00 | |||
| 9e79e82dea | |||
| 0c448aebee | |||
| 728f9b3861 | |||
| f1cc518341 | |||
| d73bf1b0a5 | |||
| 90b1e9e5c0 | |||
| 8de29868c8 | |||
| 89d60a09e7 | |||
| 376470d685 | |||
| 780fb3f8f8 | |||
| d106d18f72 | |||
| ac234f6547 | |||
| f47d7d23e7 | |||
| 33e1951aa9 | |||
| 25c0efcd6e | |||
| fe74adcfad | |||
| 320d480be3 | |||
| 1655c66786 | |||
| 2abdaa4f90 | |||
| efa76d349f | |||
| ea43426ca2 | |||
| d9c9150be9 | |||
| 7893eebff5 | |||
| 5126601c1e | |||
| 73da55059c | |||
| d13c056933 | |||
| 709c0a94a9 | |||
| a913cdbfb6 | |||
| 366a9bb706 | |||
| 44f7429407 | |||
| 791c2c9ca2 | |||
| 8ca774328e | |||
| f051bad29f | |||
| d97aaf1a55 | |||
| 1ff7e7de2e | |||
| 052faf630d | |||
| f53341b98e | |||
| 8d8db42f7c | |||
| aca29eb87e | |||
| 5ac13271ff | |||
| c10195cddf | |||
| cfa2cc2ec8 | |||
| 3239eb7225 | |||
| e2ad3488e8 | |||
| fd33c6d95b | |||
| f331ff96be | |||
| e05b737703 | |||
| ebadb713e9 | |||
| bda60b521d | |||
| e4c138d490 | |||
| 12c9cdfe04 | |||
| 4379207dac | |||
| 1ca223cad6 | |||
| ac61ecd816 | |||
| 30fc086249 | |||
| d75db84abf | |||
| 5a76c1b240 | |||
| aad1729450 | |||
| 77e96f8416 | |||
| da8a507642 | |||
| 0688dc7254 | |||
| 8289563b69 | |||
| f7822e3277 | |||
| 033ca045e5 | |||
| 2a9653101f | |||
| 7b22be389f | |||
| 81939db6ea | |||
| 72ea655875 | |||
| 2766caf1ba | |||
| da685c1a70 | |||
| 7b38f8eeee | |||
| 537e0f056b | |||
| 6ee7e1f1bb | |||
| 1bd16e8a6d | |||
| a4ee191185 | |||
| 41f5b7fec6 | |||
| e793ed17df | |||
| 229de5aa05 | |||
| 4381229880 | |||
| 9f523ed7f1 | |||
| 624864f3e0 | |||
| 429e6e7694 | |||
| fcdbe4c938 | |||
| c21e563b1b | |||
| a0a7338118 | |||
| 0fcb2a152f | |||
| 68bf7febf0 | |||
| 71fe27cfdf | |||
| 41e34c4881 | |||
| c7545f2cd6 | |||
| ddfedd4d88 | |||
| 75c5f3bcda | |||
| 1deeab7071 | |||
| 8b25083310 | |||
| fcb5437882 | |||
| 8c0465a098 | |||
| 3ed298c7aa | |||
| dd2d53d480 | |||
| f67e598ba1 |
@@ -0,0 +1,128 @@
|
||||
# syntax=docker/dockerfile:1.7
|
||||
#
|
||||
# Multi-stage Dockerfile для публикации образа dicoop/blockchain.
|
||||
#
|
||||
# Сборка ожидает два build-context, передаваемых через docker buildx:
|
||||
# --build-context coopos=<path-to-coopos-checkout>
|
||||
# --build-context cdt=<path-to-cdt-checkout>
|
||||
#
|
||||
# Результат: тонкий runtime-образ, содержащий nodeos/cleos/keosd/leap-util,
|
||||
# trace_api_util и установленный CDT (cdt-cpp и компания) в /usr/local.
|
||||
# Сборочные артефакты, исходники и build-зависимости в финальный образ
|
||||
# не попадают.
|
||||
|
||||
# ============================================================
|
||||
# Stage 1: builder — собирает blockchain (coopos) и CDT
|
||||
# ============================================================
|
||||
FROM ubuntu:22.04 AS builder
|
||||
|
||||
ENV DEBIAN_FRONTEND=noninteractive
|
||||
ENV NEEDRESTART_MODE=a
|
||||
|
||||
RUN apt-get update && apt-get install -y --no-install-recommends \
|
||||
build-essential \
|
||||
clang \
|
||||
clang-tidy \
|
||||
cmake \
|
||||
git \
|
||||
libcurl4-openssl-dev \
|
||||
libgmp-dev \
|
||||
llvm-11-dev \
|
||||
libxml2-dev \
|
||||
opam \
|
||||
ocaml-interp \
|
||||
python3 \
|
||||
python3-pip \
|
||||
time \
|
||||
file \
|
||||
zlib1g-dev \
|
||||
g++-10 \
|
||||
unzip \
|
||||
ca-certificates \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
|
||||
RUN python3 -m pip install --no-cache-dir pygments
|
||||
|
||||
COPY --from=coopos . /blockchain
|
||||
COPY --from=cdt . /cdt
|
||||
|
||||
# Сборка blockchain (coopos). ENABLE_LEAP_DEV_DEB=ON активирует
|
||||
# component-based install (base + dev) и нужен для cpack -G DEB ниже,
|
||||
# чтобы получить два deb-пакета: coopos (runtime) и coopos-dev (headers,
|
||||
# libs, cmake-config — нужны для сборки контрактов и mono-тестов).
|
||||
RUN cd /blockchain \
|
||||
&& rm -rf build \
|
||||
&& mkdir build && cd build \
|
||||
&& cmake -DCMAKE_BUILD_TYPE=Release \
|
||||
-DCMAKE_PREFIX_PATH=/usr/lib/llvm-11 \
|
||||
-DENABLE_LEAP_DEV_DEB=ON \
|
||||
.. \
|
||||
&& make -j"$(nproc)" \
|
||||
&& make install
|
||||
|
||||
# DEB-сборка вынесена в отдельный RUN, чтобы изменения в cpack
|
||||
# не инвалидировали тяжёлый build выше — он остаётся cache-hit.
|
||||
# tools/tweak-deb.sh из leap-наследия не запускаем: он cosmetically
|
||||
# чистит libc deps в control file, но рассчитан на dpkg <22.04
|
||||
# (control.tar.gz vs новый control.tar.zst) и падает на новых cpack.
|
||||
RUN cd /blockchain/build \
|
||||
&& cpack -G DEB \
|
||||
&& mkdir -p /out/deb \
|
||||
&& cp /blockchain/build/coopos_*.deb /blockchain/build/coopos-dev_*.deb /out/deb/ \
|
||||
&& ls -la /out/deb/
|
||||
|
||||
# Сборка CDT
|
||||
RUN cd /cdt \
|
||||
&& rm -rf build \
|
||||
&& mkdir build && cd build \
|
||||
&& cmake .. \
|
||||
&& make -j"$(nproc)" \
|
||||
&& make install
|
||||
|
||||
# ============================================================
|
||||
# Stage 2: runtime — тонкий итоговый образ
|
||||
# ============================================================
|
||||
FROM ubuntu:22.04 AS runtime
|
||||
|
||||
ENV DEBIAN_FRONTEND=noninteractive
|
||||
ENV NEEDRESTART_MODE=a
|
||||
|
||||
# Минимум для запуска nodeos/cleos/keosd и сборки контрактов
|
||||
# через cdt-cpp внутри контейнера (cmake + make используют mono*).
|
||||
RUN apt-get update && apt-get install -y --no-install-recommends \
|
||||
cmake \
|
||||
make \
|
||||
gcc \
|
||||
g++ \
|
||||
python3 \
|
||||
python3-pip \
|
||||
ca-certificates \
|
||||
libcurl4 \
|
||||
libgmp10 \
|
||||
libxml2 \
|
||||
libllvm11 \
|
||||
libstdc++6 \
|
||||
libz3-4 \
|
||||
zlib1g \
|
||||
&& python3 -m pip install --no-cache-dir pygments \
|
||||
&& rm -rf /var/lib/apt/lists/* /root/.cache
|
||||
|
||||
COPY --from=builder /usr/local /usr/local
|
||||
|
||||
# Совместимость с mono*/components/contracts/CMakeLists.txt и с CDT
|
||||
# toolchain-файлом: CDTWasmToolchain.cmake жёстко прописывает пути
|
||||
# /cdt/build/bin/cdt-cc, /cdt/build/include, /cdt/build/lib и т.п.
|
||||
# Симлинк на установленный prefix /usr/local/cdt делает все эти пути
|
||||
# валидными внутри slim runtime.
|
||||
RUN mkdir -p /cdt && ln -s /usr/local/cdt /cdt/build
|
||||
|
||||
CMD ["/bin/bash"]
|
||||
|
||||
# ============================================================
|
||||
# Stage 3: deb — экспортирует только .deb файлы наружу
|
||||
# Используется в CI как `--target deb --output type=local,dest=./deb-out`,
|
||||
# чтобы выгрузить пакеты на runner для публикации в GitHub Release.
|
||||
# ============================================================
|
||||
FROM scratch AS deb
|
||||
COPY --from=builder /out/deb/ /
|
||||
|
||||
@@ -1,11 +0,0 @@
|
||||
{
|
||||
"ubuntu18": {
|
||||
"dockerfile": ".cicd/platforms/ubuntu18.Dockerfile"
|
||||
},
|
||||
"ubuntu20": {
|
||||
"dockerfile": ".cicd/platforms/ubuntu20.Dockerfile"
|
||||
},
|
||||
"ubuntu22": {
|
||||
"dockerfile": ".cicd/platforms/ubuntu22.Dockerfile"
|
||||
}
|
||||
}
|
||||
@@ -1,40 +0,0 @@
|
||||
FROM ubuntu:bionic
|
||||
|
||||
RUN apt-get update && apt-get upgrade -y && \
|
||||
DEBIAN_FRONTEND=noninteractive apt-get install -y build-essential \
|
||||
cmake \
|
||||
curl \
|
||||
g++-8 \
|
||||
git \
|
||||
jq \
|
||||
libcurl4-openssl-dev \
|
||||
libgmp-dev \
|
||||
libssl-dev \
|
||||
llvm-7-dev \
|
||||
ninja-build \
|
||||
python3 \
|
||||
python3-numpy \
|
||||
python3-pip \
|
||||
software-properties-common \
|
||||
zlib1g-dev \
|
||||
zstd
|
||||
|
||||
RUN python3 -m pip install dataclasses
|
||||
|
||||
# GitHub's actions/checkout requires git 2.18+ but Ubuntu 18 only provides 2.17
|
||||
RUN add-apt-repository ppa:git-core/ppa && apt update && apt install -y git
|
||||
|
||||
# Leap requires boost 1.67+ but Ubuntu 18 only provides 1.65
|
||||
# Probably need 1.70+ to work properly with old cmake provided in Ubuntu 18
|
||||
RUN curl -L https://boostorg.jfrog.io/artifactory/main/release/1.79.0/source/boost_1_79_0.tar.bz2 | tar jx && \
|
||||
cd boost_* && \
|
||||
./bootstrap.sh --prefix=/boost && \
|
||||
./b2 --with-iostreams --with-date_time --with-filesystem --with-system \
|
||||
--with-program_options --with-chrono --with-test -j$(nproc) install && \
|
||||
cd .. && \
|
||||
rm -rf boost_*
|
||||
|
||||
ENV CC=gcc-8
|
||||
ENV CXX=g++-8
|
||||
ENV BOOST_ROOT=/boost
|
||||
ENV LLVM_DIR=/usr/lib/llvm-7/
|
||||
@@ -1,16 +0,0 @@
|
||||
FROM ubuntu:focal
|
||||
|
||||
RUN apt-get update && apt-get upgrade -y && \
|
||||
DEBIAN_FRONTEND=noninteractive apt-get install -y build-essential \
|
||||
cmake \
|
||||
curl \
|
||||
git \
|
||||
jq \
|
||||
libboost-all-dev \
|
||||
libcurl4-openssl-dev \
|
||||
libgmp-dev \
|
||||
libssl-dev \
|
||||
llvm-11-dev \
|
||||
ninja-build \
|
||||
python3-numpy \
|
||||
zstd
|
||||
@@ -1,16 +0,0 @@
|
||||
FROM ubuntu:jammy
|
||||
|
||||
RUN apt-get update && apt-get upgrade -y && \
|
||||
DEBIAN_FRONTEND=noninteractive apt-get install -y build-essential \
|
||||
cmake \
|
||||
curl \
|
||||
git \
|
||||
jq \
|
||||
libboost-all-dev \
|
||||
libcurl4-openssl-dev \
|
||||
libgmp-dev \
|
||||
libssl-dev \
|
||||
llvm-11-dev \
|
||||
ninja-build \
|
||||
python3-numpy \
|
||||
zstd
|
||||
@@ -0,0 +1,19 @@
|
||||
# Применяется и к основному context, и к build-context coopos в CI.
|
||||
# Цель — не инвалидировать слой `COPY --from=coopos` при изменениях,
|
||||
# не относящихся к сборке blockchain (CI-конфиги).
|
||||
#
|
||||
# КОНСЕРВАТИВНО: исключаем только то, что точно не читается cmake
|
||||
# или сборкой. README/LICENSE/docs могут быть прочитаны через
|
||||
# configure_file()/install() — оставляем.
|
||||
|
||||
build
|
||||
*.log
|
||||
|
||||
# CI/Docker meta — не читаются cmake. Dockerfile.publish сам в .cicd,
|
||||
# но он подаётся buildkit-у через `file:`, не через context.
|
||||
.cicd
|
||||
.github
|
||||
.dockerignore
|
||||
|
||||
# Только картинки и логотипы — точно не нужны
|
||||
images
|
||||
@@ -1,14 +0,0 @@
|
||||
name: 'Parallel ctest'
|
||||
description: 'Runs a set of labeled ctests in parallel via multiple docker containers'
|
||||
inputs:
|
||||
container:
|
||||
required: true
|
||||
error-log-paths:
|
||||
required: true
|
||||
log-tarball-prefix:
|
||||
required: true
|
||||
tests-label:
|
||||
required: true
|
||||
runs:
|
||||
using: 'node16'
|
||||
main: 'dist/index.mjs'
|
||||
File diff suppressed because one or more lines are too long
@@ -1,69 +0,0 @@
|
||||
import child_process from 'node:child_process';
|
||||
import process from 'node:process';
|
||||
import stream from 'node:stream';
|
||||
import fs from 'node:fs';
|
||||
import zlib from 'node:zlib';
|
||||
import tar from 'tar-stream';
|
||||
import core from '@actions/core'
|
||||
|
||||
const container = core.getInput('container', {required: true});
|
||||
const error_log_paths = JSON.parse(core.getInput('error-log-paths', {required: true}));
|
||||
const log_tarball_prefix = core.getInput('log-tarball-prefix', {required: true});
|
||||
const tests_label = core.getInput('tests-label', {required: true});
|
||||
|
||||
try {
|
||||
if(child_process.spawnSync("docker", ["run", "--name", "base", "-v", `${process.cwd()}/build.tar.zst:/build.tar.zst`, "--workdir", "/__w/leap/leap", container, "sh", "-c", "zstdcat /build.tar.zst | tar x"], {stdio:"inherit"}).status)
|
||||
throw new Error("Failed to create base container");
|
||||
if(child_process.spawnSync("docker", ["commit", "base", "baseimage"], {stdio:"inherit"}).status)
|
||||
throw new Error("Failed to create base image");
|
||||
if(child_process.spawnSync("docker", ["rm", "base"], {stdio:"inherit"}).status)
|
||||
throw new Error("Failed to remove base container");
|
||||
|
||||
// the correct approach is by far "--show-only=json-v1" and then pluck out .tests[].name; but that doesn't work on U18's cmake 3.10 since it lacks json-v1 output
|
||||
const test_query_result = child_process.spawnSync("docker", ["run", "--rm", "baseimage", "bash", "-e", "-o", "pipefail", "-c", `cd build; ctest -L '${tests_label}' --show-only | head -n -1 | cut -d ':' -f 2 -s | jq -cnR '[inputs | select(length>0)[1:]]'`]);
|
||||
if(test_query_result.status)
|
||||
throw new Error("Failed to discover tests with label")
|
||||
const tests = JSON.parse(test_query_result.stdout);
|
||||
|
||||
let subprocesses = [];
|
||||
tests.forEach(t => {
|
||||
subprocesses.push(new Promise(resolve => {
|
||||
child_process.spawn("docker", ["run", "--security-opt", "seccomp=unconfined", "-e", "GITHUB_ACTIONS=True", "--name", t, "--init", "baseimage", "bash", "-c", `cd build; ctest --output-on-failure -R '^${t}$'`], {stdio:"inherit"}).on('close', code => resolve(code));
|
||||
}));
|
||||
});
|
||||
|
||||
const results = await Promise.all(subprocesses);
|
||||
|
||||
for(let i = 0; i < results.length; ++i) {
|
||||
if(results[i] === 0)
|
||||
continue;
|
||||
|
||||
//failing test
|
||||
core.setFailed("Some tests failed");
|
||||
|
||||
let extractor = tar.extract();
|
||||
let packer = tar.pack();
|
||||
|
||||
extractor.on('entry', (header, stream, next) => {
|
||||
if(!header.name.startsWith(`__w/leap/leap/build`)) {
|
||||
stream.on('end', () => next());
|
||||
stream.resume();
|
||||
return;
|
||||
}
|
||||
|
||||
header.name = header.name.substring(`__w/leap/leap/`.length);
|
||||
if(header.name !== "build/" && error_log_paths.filter(p => header.name.startsWith(p)).length === 0) {
|
||||
stream.on('end', () => next());
|
||||
stream.resume();
|
||||
return;
|
||||
}
|
||||
|
||||
stream.pipe(packer.entry(header, next));
|
||||
}).on('finish', () => {packer.finalize()});
|
||||
|
||||
child_process.spawn("docker", ["export", tests[i]]).stdout.pipe(extractor);
|
||||
stream.promises.pipeline(packer, zlib.createGzip(), fs.createWriteStream(`${log_tarball_prefix}-${tests[i]}-logs.tar.gz`));
|
||||
}
|
||||
} catch(e) {
|
||||
core.setFailed(`Uncaught exception ${e.message}`);
|
||||
}
|
||||
@@ -1,351 +0,0 @@
|
||||
{
|
||||
"name": "parallel-ctest-containers",
|
||||
"lockfileVersion": 2,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"dependencies": {
|
||||
"@actions/core": "^1.9.1",
|
||||
"@vercel/ncc": "^0.34.0",
|
||||
"tar-stream": "^2.2.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@actions/core": {
|
||||
"version": "1.9.1",
|
||||
"resolved": "https://registry.npmjs.org/@actions/core/-/core-1.9.1.tgz",
|
||||
"integrity": "sha512-5ad+U2YGrmmiw6du20AQW5XuWo7UKN2052FjSV7MX+Wfjf8sCqcsZe62NfgHys4QI4/Y+vQvLKYL8jWtA1ZBTA==",
|
||||
"dependencies": {
|
||||
"@actions/http-client": "^2.0.1",
|
||||
"uuid": "^8.3.2"
|
||||
}
|
||||
},
|
||||
"node_modules/@actions/http-client": {
|
||||
"version": "2.0.1",
|
||||
"resolved": "https://registry.npmjs.org/@actions/http-client/-/http-client-2.0.1.tgz",
|
||||
"integrity": "sha512-PIXiMVtz6VvyaRsGY268qvj57hXQEpsYogYOu2nrQhlf+XCGmZstmuZBbAybUl1nQGnvS1k1eEsQ69ZoD7xlSw==",
|
||||
"dependencies": {
|
||||
"tunnel": "^0.0.6"
|
||||
}
|
||||
},
|
||||
"node_modules/@vercel/ncc": {
|
||||
"version": "0.34.0",
|
||||
"resolved": "https://registry.npmjs.org/@vercel/ncc/-/ncc-0.34.0.tgz",
|
||||
"integrity": "sha512-G9h5ZLBJ/V57Ou9vz5hI8pda/YQX5HQszCs3AmIus3XzsmRn/0Ptic5otD3xVST8QLKk7AMk7AqpsyQGN7MZ9A==",
|
||||
"bin": {
|
||||
"ncc": "dist/ncc/cli.js"
|
||||
}
|
||||
},
|
||||
"node_modules/base64-js": {
|
||||
"version": "1.5.1",
|
||||
"resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
|
||||
"integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
|
||||
"funding": [
|
||||
{
|
||||
"type": "github",
|
||||
"url": "https://github.com/sponsors/feross"
|
||||
},
|
||||
{
|
||||
"type": "patreon",
|
||||
"url": "https://www.patreon.com/feross"
|
||||
},
|
||||
{
|
||||
"type": "consulting",
|
||||
"url": "https://feross.org/support"
|
||||
}
|
||||
]
|
||||
},
|
||||
"node_modules/bl": {
|
||||
"version": "4.1.0",
|
||||
"resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz",
|
||||
"integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==",
|
||||
"dependencies": {
|
||||
"buffer": "^5.5.0",
|
||||
"inherits": "^2.0.4",
|
||||
"readable-stream": "^3.4.0"
|
||||
}
|
||||
},
|
||||
"node_modules/buffer": {
|
||||
"version": "5.7.1",
|
||||
"resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
|
||||
"integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
|
||||
"funding": [
|
||||
{
|
||||
"type": "github",
|
||||
"url": "https://github.com/sponsors/feross"
|
||||
},
|
||||
{
|
||||
"type": "patreon",
|
||||
"url": "https://www.patreon.com/feross"
|
||||
},
|
||||
{
|
||||
"type": "consulting",
|
||||
"url": "https://feross.org/support"
|
||||
}
|
||||
],
|
||||
"dependencies": {
|
||||
"base64-js": "^1.3.1",
|
||||
"ieee754": "^1.1.13"
|
||||
}
|
||||
},
|
||||
"node_modules/end-of-stream": {
|
||||
"version": "1.4.4",
|
||||
"resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
|
||||
"integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
|
||||
"dependencies": {
|
||||
"once": "^1.4.0"
|
||||
}
|
||||
},
|
||||
"node_modules/fs-constants": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz",
|
||||
"integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow=="
|
||||
},
|
||||
"node_modules/ieee754": {
|
||||
"version": "1.2.1",
|
||||
"resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
|
||||
"integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
|
||||
"funding": [
|
||||
{
|
||||
"type": "github",
|
||||
"url": "https://github.com/sponsors/feross"
|
||||
},
|
||||
{
|
||||
"type": "patreon",
|
||||
"url": "https://www.patreon.com/feross"
|
||||
},
|
||||
{
|
||||
"type": "consulting",
|
||||
"url": "https://feross.org/support"
|
||||
}
|
||||
]
|
||||
},
|
||||
"node_modules/inherits": {
|
||||
"version": "2.0.4",
|
||||
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
|
||||
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
|
||||
},
|
||||
"node_modules/once": {
|
||||
"version": "1.4.0",
|
||||
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
|
||||
"integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
|
||||
"dependencies": {
|
||||
"wrappy": "1"
|
||||
}
|
||||
},
|
||||
"node_modules/readable-stream": {
|
||||
"version": "3.6.0",
|
||||
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
|
||||
"integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
|
||||
"dependencies": {
|
||||
"inherits": "^2.0.3",
|
||||
"string_decoder": "^1.1.1",
|
||||
"util-deprecate": "^1.0.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 6"
|
||||
}
|
||||
},
|
||||
"node_modules/safe-buffer": {
|
||||
"version": "5.2.1",
|
||||
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
|
||||
"integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
|
||||
"funding": [
|
||||
{
|
||||
"type": "github",
|
||||
"url": "https://github.com/sponsors/feross"
|
||||
},
|
||||
{
|
||||
"type": "patreon",
|
||||
"url": "https://www.patreon.com/feross"
|
||||
},
|
||||
{
|
||||
"type": "consulting",
|
||||
"url": "https://feross.org/support"
|
||||
}
|
||||
]
|
||||
},
|
||||
"node_modules/string_decoder": {
|
||||
"version": "1.3.0",
|
||||
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
|
||||
"integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
|
||||
"dependencies": {
|
||||
"safe-buffer": "~5.2.0"
|
||||
}
|
||||
},
|
||||
"node_modules/tar-stream": {
|
||||
"version": "2.2.0",
|
||||
"resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz",
|
||||
"integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==",
|
||||
"dependencies": {
|
||||
"bl": "^4.0.3",
|
||||
"end-of-stream": "^1.4.1",
|
||||
"fs-constants": "^1.0.0",
|
||||
"inherits": "^2.0.3",
|
||||
"readable-stream": "^3.1.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=6"
|
||||
}
|
||||
},
|
||||
"node_modules/tunnel": {
|
||||
"version": "0.0.6",
|
||||
"resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz",
|
||||
"integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==",
|
||||
"engines": {
|
||||
"node": ">=0.6.11 <=0.7.0 || >=0.7.3"
|
||||
}
|
||||
},
|
||||
"node_modules/util-deprecate": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
|
||||
"integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="
|
||||
},
|
||||
"node_modules/uuid": {
|
||||
"version": "8.3.2",
|
||||
"resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
|
||||
"integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
|
||||
"bin": {
|
||||
"uuid": "dist/bin/uuid"
|
||||
}
|
||||
},
|
||||
"node_modules/wrappy": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
|
||||
"integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="
|
||||
}
|
||||
},
|
||||
"dependencies": {
|
||||
"@actions/core": {
|
||||
"version": "1.9.1",
|
||||
"resolved": "https://registry.npmjs.org/@actions/core/-/core-1.9.1.tgz",
|
||||
"integrity": "sha512-5ad+U2YGrmmiw6du20AQW5XuWo7UKN2052FjSV7MX+Wfjf8sCqcsZe62NfgHys4QI4/Y+vQvLKYL8jWtA1ZBTA==",
|
||||
"requires": {
|
||||
"@actions/http-client": "^2.0.1",
|
||||
"uuid": "^8.3.2"
|
||||
}
|
||||
},
|
||||
"@actions/http-client": {
|
||||
"version": "2.0.1",
|
||||
"resolved": "https://registry.npmjs.org/@actions/http-client/-/http-client-2.0.1.tgz",
|
||||
"integrity": "sha512-PIXiMVtz6VvyaRsGY268qvj57hXQEpsYogYOu2nrQhlf+XCGmZstmuZBbAybUl1nQGnvS1k1eEsQ69ZoD7xlSw==",
|
||||
"requires": {
|
||||
"tunnel": "^0.0.6"
|
||||
}
|
||||
},
|
||||
"@vercel/ncc": {
|
||||
"version": "0.34.0",
|
||||
"resolved": "https://registry.npmjs.org/@vercel/ncc/-/ncc-0.34.0.tgz",
|
||||
"integrity": "sha512-G9h5ZLBJ/V57Ou9vz5hI8pda/YQX5HQszCs3AmIus3XzsmRn/0Ptic5otD3xVST8QLKk7AMk7AqpsyQGN7MZ9A=="
|
||||
},
|
||||
"base64-js": {
|
||||
"version": "1.5.1",
|
||||
"resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
|
||||
"integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="
|
||||
},
|
||||
"bl": {
|
||||
"version": "4.1.0",
|
||||
"resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz",
|
||||
"integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==",
|
||||
"requires": {
|
||||
"buffer": "^5.5.0",
|
||||
"inherits": "^2.0.4",
|
||||
"readable-stream": "^3.4.0"
|
||||
}
|
||||
},
|
||||
"buffer": {
|
||||
"version": "5.7.1",
|
||||
"resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
|
||||
"integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
|
||||
"requires": {
|
||||
"base64-js": "^1.3.1",
|
||||
"ieee754": "^1.1.13"
|
||||
}
|
||||
},
|
||||
"end-of-stream": {
|
||||
"version": "1.4.4",
|
||||
"resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
|
||||
"integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
|
||||
"requires": {
|
||||
"once": "^1.4.0"
|
||||
}
|
||||
},
|
||||
"fs-constants": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz",
|
||||
"integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow=="
|
||||
},
|
||||
"ieee754": {
|
||||
"version": "1.2.1",
|
||||
"resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
|
||||
"integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="
|
||||
},
|
||||
"inherits": {
|
||||
"version": "2.0.4",
|
||||
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
|
||||
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
|
||||
},
|
||||
"once": {
|
||||
"version": "1.4.0",
|
||||
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
|
||||
"integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
|
||||
"requires": {
|
||||
"wrappy": "1"
|
||||
}
|
||||
},
|
||||
"readable-stream": {
|
||||
"version": "3.6.0",
|
||||
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
|
||||
"integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
|
||||
"requires": {
|
||||
"inherits": "^2.0.3",
|
||||
"string_decoder": "^1.1.1",
|
||||
"util-deprecate": "^1.0.1"
|
||||
}
|
||||
},
|
||||
"safe-buffer": {
|
||||
"version": "5.2.1",
|
||||
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
|
||||
"integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
|
||||
},
|
||||
"string_decoder": {
|
||||
"version": "1.3.0",
|
||||
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
|
||||
"integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
|
||||
"requires": {
|
||||
"safe-buffer": "~5.2.0"
|
||||
}
|
||||
},
|
||||
"tar-stream": {
|
||||
"version": "2.2.0",
|
||||
"resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz",
|
||||
"integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==",
|
||||
"requires": {
|
||||
"bl": "^4.0.3",
|
||||
"end-of-stream": "^1.4.1",
|
||||
"fs-constants": "^1.0.0",
|
||||
"inherits": "^2.0.3",
|
||||
"readable-stream": "^3.1.1"
|
||||
}
|
||||
},
|
||||
"tunnel": {
|
||||
"version": "0.0.6",
|
||||
"resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz",
|
||||
"integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg=="
|
||||
},
|
||||
"util-deprecate": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
|
||||
"integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="
|
||||
},
|
||||
"uuid": {
|
||||
"version": "8.3.2",
|
||||
"resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
|
||||
"integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg=="
|
||||
},
|
||||
"wrappy": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
|
||||
"integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,7 +0,0 @@
|
||||
{
|
||||
"dependencies": {
|
||||
"@actions/core": "^1.9.1",
|
||||
"@vercel/ncc": "^0.34.0",
|
||||
"tar-stream": "^2.2.0"
|
||||
}
|
||||
}
|
||||
@@ -1,208 +0,0 @@
|
||||
name: "Build & Test"
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
- "release/*"
|
||||
pull_request:
|
||||
workflow_dispatch:
|
||||
|
||||
permissions:
|
||||
packages: read
|
||||
contents: read
|
||||
|
||||
defaults:
|
||||
run:
|
||||
shell: bash
|
||||
|
||||
jobs:
|
||||
d:
|
||||
name: Discover Platforms
|
||||
runs-on: ubuntu-latest
|
||||
outputs:
|
||||
missing-platforms: ${{steps.discover.outputs.missing-platforms}}
|
||||
p: ${{steps.discover.outputs.platforms}}
|
||||
steps:
|
||||
- name: Discover Platforms
|
||||
id: discover
|
||||
uses: AntelopeIO/discover-platforms-action@v1
|
||||
with:
|
||||
platform-file: .cicd/platforms.json
|
||||
password: ${{secrets.GITHUB_TOKEN}}
|
||||
package-name: builders
|
||||
build-platforms:
|
||||
name: Build Platforms
|
||||
needs: d
|
||||
if: needs.d.outputs.missing-platforms != '[]'
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
platform: ${{fromJSON(needs.d.outputs.missing-platforms)}}
|
||||
runs-on: ["self-hosted", "enf-x86-beefy"]
|
||||
permissions:
|
||||
packages: write
|
||||
contents: read
|
||||
steps:
|
||||
- name: Login to Container Registry
|
||||
uses: docker/login-action@v2
|
||||
with:
|
||||
registry: ghcr.io
|
||||
username: ${{github.repository_owner}}
|
||||
password: ${{secrets.GITHUB_TOKEN}}
|
||||
- name: Build and push
|
||||
uses: docker/build-push-action@v3
|
||||
with:
|
||||
push: true
|
||||
tags: ${{fromJSON(needs.d.outputs.p)[matrix.platform].image}}
|
||||
file: ${{fromJSON(needs.d.outputs.p)[matrix.platform].dockerfile}}
|
||||
|
||||
Build:
|
||||
needs: [d, build-platforms]
|
||||
if: always() && needs.d.result == 'success' && (needs.build-platforms.result == 'success' || needs.build-platforms.result == 'skipped')
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
platform: [ubuntu18, ubuntu20, ubuntu22]
|
||||
runs-on: ["self-hosted", "enf-x86-beefy"]
|
||||
container: ${{fromJSON(needs.d.outputs.p)[matrix.platform].image}}
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
with:
|
||||
submodules: recursive
|
||||
- name: Build
|
||||
id: build
|
||||
run: |
|
||||
# https://github.com/actions/runner/issues/2033
|
||||
chown -R $(id -u):$(id -g) $PWD
|
||||
mkdir build
|
||||
cd build
|
||||
cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr -GNinja ..
|
||||
ninja
|
||||
tar -pc -C .. --exclude "*.o" build | zstd --long -T0 -9 > ../build.tar.zst
|
||||
- name: Upload builddir
|
||||
uses: AntelopeIO/upload-artifact-large-chunks-action@v1
|
||||
with:
|
||||
name: ${{matrix.platform}}-build
|
||||
path: build.tar.zst
|
||||
|
||||
dev-package:
|
||||
name: Build leap-dev package
|
||||
needs: [d, Build]
|
||||
if: always() && needs.Build.result == 'success'
|
||||
runs-on: ubuntu-latest
|
||||
container: ${{fromJSON(needs.d.outputs.p)['ubuntu20'].image}}
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
with:
|
||||
submodules: true
|
||||
- name: Download builddir
|
||||
uses: actions/download-artifact@v3
|
||||
with:
|
||||
name: ubuntu20-build
|
||||
- name: Build dev package
|
||||
run: |
|
||||
zstdcat build.tar.zst | tar x
|
||||
cd build
|
||||
cpack
|
||||
- name: Upload dev package
|
||||
uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: leap-dev-ubuntu20-amd64
|
||||
path: build/leap-dev*.deb
|
||||
|
||||
tests:
|
||||
name: Tests
|
||||
needs: [d, Build]
|
||||
if: always() && needs.Build.result == 'success'
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
platform: [ubuntu20, ubuntu22]
|
||||
runs-on: ["self-hosted", "enf-x86-hightier"]
|
||||
container:
|
||||
image: ${{fromJSON(needs.d.outputs.p)[matrix.platform].image}}
|
||||
options: --security-opt seccomp=unconfined
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- name: Download builddir
|
||||
uses: actions/download-artifact@v3
|
||||
with:
|
||||
name: ${{matrix.platform}}-build
|
||||
- name: Run Parallel Tests
|
||||
run: |
|
||||
# https://github.com/actions/runner/issues/2033 -- need this because of full version label test looking at git revs
|
||||
chown -R $(id -u):$(id -g) $PWD
|
||||
# jammy's boost 1.74 can stumble on an EXDEV via copy_file_range() it doesn't have a fallback for; re-eval once moving to std::filesystem
|
||||
export TMPDIR="$PWD/tmp"
|
||||
mkdir -p $TMPDIR
|
||||
zstdcat build.tar.zst | tar x
|
||||
cd build
|
||||
ctest --output-on-failure -j $(nproc) -LE "(nonparallelizable_tests|long_running_tests)"
|
||||
|
||||
np-tests:
|
||||
name: NP Tests
|
||||
needs: [d, Build]
|
||||
if: always() && needs.Build.result == 'success'
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
platform: [ubuntu18, ubuntu20, ubuntu22]
|
||||
runs-on: ["self-hosted", "enf-x86-midtier"]
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- name: Download builddir
|
||||
uses: actions/download-artifact@v3
|
||||
with:
|
||||
name: ${{matrix.platform}}-build
|
||||
- name: Run tests in parallel containers
|
||||
uses: ./.github/actions/parallel-ctest-containers
|
||||
with:
|
||||
container: ${{fromJSON(needs.d.outputs.p)[matrix.platform].image}}
|
||||
error-log-paths: '["build/etc", "build/var", "build/leap-ignition-wd", "build/TestLogs"]'
|
||||
log-tarball-prefix: ${{matrix.platform}}
|
||||
tests-label: nonparallelizable_tests
|
||||
- name: Upload logs from failed tests
|
||||
uses: actions/upload-artifact@v3
|
||||
if: failure()
|
||||
with:
|
||||
name: ${{matrix.platform}}-np-logs
|
||||
path: '*-logs.tar.gz'
|
||||
|
||||
lr-tests:
|
||||
name: LR Tests
|
||||
needs: [d, Build]
|
||||
if: always() && needs.Build.result == 'success'
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
platform: [ubuntu18, ubuntu20, ubuntu22]
|
||||
runs-on: ["self-hosted", "enf-x86-lowtier"]
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- name: Download builddir
|
||||
uses: actions/download-artifact@v3
|
||||
with:
|
||||
name: ${{matrix.platform}}-build
|
||||
- name: Run tests in parallel containers
|
||||
uses: ./.github/actions/parallel-ctest-containers
|
||||
with:
|
||||
container: ${{fromJSON(needs.d.outputs.p)[matrix.platform].image}}
|
||||
error-log-paths: '["build/etc", "build/var", "build/leap-ignition-wd", "build/TestLogs"]'
|
||||
log-tarball-prefix: ${{matrix.platform}}
|
||||
tests-label: long_running_tests
|
||||
- name: Upload logs from failed tests
|
||||
uses: actions/upload-artifact@v3
|
||||
if: failure()
|
||||
with:
|
||||
name: ${{matrix.platform}}-lr-logs
|
||||
path: '*-logs.tar.gz'
|
||||
|
||||
all-passing:
|
||||
name: All Required Tests Passed
|
||||
needs: [dev-package, tests, np-tests]
|
||||
if: always()
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- if: needs.dev-package.result != 'success' || needs.tests.result != 'success' || needs.np-tests.result != 'success'
|
||||
run: false
|
||||
@@ -0,0 +1,150 @@
|
||||
name: Build & Publish Docker Image
|
||||
|
||||
on:
|
||||
push:
|
||||
tags:
|
||||
- 'v*'
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
cdt-ref:
|
||||
description: 'CDT git ref (branch/tag/sha) for coopenomics/cdt'
|
||||
required: false
|
||||
default: 'v4.2.0'
|
||||
version-tag:
|
||||
description: 'Override docker image tag (default: git tag or short sha)'
|
||||
required: false
|
||||
push-latest:
|
||||
description: 'Also push :latest'
|
||||
type: boolean
|
||||
default: true
|
||||
|
||||
env:
|
||||
IMAGE_NAME: dicoop/blockchain
|
||||
CDT_REPO: coopenomics/cdt
|
||||
|
||||
permissions:
|
||||
contents: write # нужен для публикации .deb в GitHub Release
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 360
|
||||
steps:
|
||||
- name: Free disk space on runner
|
||||
run: |
|
||||
sudo rm -rf /usr/share/dotnet \
|
||||
/usr/local/lib/android \
|
||||
/opt/ghc \
|
||||
/opt/hostedtoolcache/CodeQL \
|
||||
/usr/local/share/boost \
|
||||
"$AGENT_TOOLSDIRECTORY" \
|
||||
/opt/microsoft || true
|
||||
docker image prune -af || true
|
||||
df -h
|
||||
|
||||
- name: Checkout coopos
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
submodules: recursive
|
||||
fetch-depth: 0
|
||||
path: coopos
|
||||
|
||||
- name: Determine CDT ref
|
||||
id: cdtref
|
||||
run: |
|
||||
REF="${{ inputs.cdt-ref }}"
|
||||
if [ -z "$REF" ]; then REF="v4.2.0"; fi
|
||||
echo "ref=$REF" >> "$GITHUB_OUTPUT"
|
||||
|
||||
- name: Checkout CDT (${{ steps.cdtref.outputs.ref }})
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
repository: ${{ env.CDT_REPO }}
|
||||
ref: ${{ steps.cdtref.outputs.ref }}
|
||||
submodules: recursive
|
||||
fetch-depth: 0
|
||||
path: cdt
|
||||
|
||||
- name: Compute image tags
|
||||
id: meta
|
||||
run: |
|
||||
VERSION="${{ inputs.version-tag }}"
|
||||
if [ -z "$VERSION" ]; then
|
||||
if [[ "$GITHUB_REF" == refs/tags/* ]]; then
|
||||
VERSION="${GITHUB_REF#refs/tags/}"
|
||||
else
|
||||
VERSION="${GITHUB_SHA::7}"
|
||||
fi
|
||||
fi
|
||||
TAGS="${IMAGE_NAME}:${VERSION}"
|
||||
if [[ "${{ inputs.push-latest }}" != "false" ]]; then
|
||||
TAGS="${TAGS},${IMAGE_NAME}:latest"
|
||||
fi
|
||||
echo "tags=${TAGS}" >> "$GITHUB_OUTPUT"
|
||||
echo "version=${VERSION}" >> "$GITHUB_OUTPUT"
|
||||
echo "Will publish: ${TAGS}"
|
||||
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@v3
|
||||
|
||||
- name: Login to Docker Hub
|
||||
uses: docker/login-action@v3
|
||||
with:
|
||||
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||
|
||||
- name: Build & Push (${{ steps.meta.outputs.version }})
|
||||
uses: docker/build-push-action@v6
|
||||
with:
|
||||
context: ./coopos
|
||||
file: ./coopos/.cicd/Dockerfile.publish
|
||||
target: runtime
|
||||
build-contexts: |
|
||||
coopos=./coopos
|
||||
cdt=./cdt
|
||||
platforms: linux/amd64
|
||||
push: true
|
||||
tags: ${{ steps.meta.outputs.tags }}
|
||||
cache-from: type=gha,scope=docker-publish
|
||||
cache-to: type=gha,mode=max,scope=docker-publish
|
||||
|
||||
- name: Extract .deb packages from builder
|
||||
uses: docker/build-push-action@v6
|
||||
with:
|
||||
context: ./coopos
|
||||
file: ./coopos/.cicd/Dockerfile.publish
|
||||
target: deb
|
||||
build-contexts: |
|
||||
coopos=./coopos
|
||||
cdt=./cdt
|
||||
platforms: linux/amd64
|
||||
outputs: type=local,dest=./deb-out
|
||||
cache-from: type=gha,scope=docker-publish
|
||||
cache-to: type=gha,mode=max,scope=docker-publish
|
||||
|
||||
- name: List extracted .deb files
|
||||
run: ls -la ./deb-out/
|
||||
|
||||
- name: Publish .deb to GitHub Release (only on tag)
|
||||
if: startsWith(github.ref, 'refs/tags/')
|
||||
uses: softprops/action-gh-release@v2
|
||||
with:
|
||||
tag_name: ${{ steps.meta.outputs.version }}
|
||||
files: |
|
||||
./deb-out/coopos_*.deb
|
||||
./deb-out/coopos-dev_*.deb
|
||||
fail_on_unmatched_files: true
|
||||
|
||||
- name: Upload .deb as workflow artifact (always)
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: coopos-deb-${{ steps.meta.outputs.version }}
|
||||
path: ./deb-out/*.deb
|
||||
retention-days: 30
|
||||
|
||||
- name: Image summary
|
||||
run: |
|
||||
echo "Published: ${{ steps.meta.outputs.tags }}" >> "$GITHUB_STEP_SUMMARY"
|
||||
echo "CDT ref: ${{ steps.cdtref.outputs.ref }}" >> "$GITHUB_STEP_SUMMARY"
|
||||
echo "DEB files extracted:" >> "$GITHUB_STEP_SUMMARY"
|
||||
(cd deb-out && ls -la) >> "$GITHUB_STEP_SUMMARY"
|
||||
@@ -0,0 +1,18 @@
|
||||
# .github/workflows/trigger-coopenomics.yml
|
||||
name: Trigger Contracts Docs Deploy
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [main] # или когда нужно триггерить
|
||||
|
||||
jobs:
|
||||
trigger-coopenomics:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Trigger Coopenomics deployment
|
||||
uses: peter-evans/repository-dispatch@v2
|
||||
with:
|
||||
token: ${{ secrets.COOPENOMICS_PAT }}
|
||||
repository: coopenomics/coopenomics # укажи правильный owner/repo
|
||||
event-type: deploy_from_mono
|
||||
client-payload: '{"repository": "${{ github.repository }}", "sha": "${{ github.sha }}", "ref": "${{ github.ref }}", "actor": "${{ github.actor }}"}'
|
||||
@@ -1,42 +0,0 @@
|
||||
name: Jira Issue Creator
|
||||
on:
|
||||
issues:
|
||||
types:
|
||||
- labeled
|
||||
|
||||
jobs:
|
||||
create-jira-issue:
|
||||
runs-on: ubuntu-latest
|
||||
if: github.event.label.name == 'OCI'
|
||||
steps:
|
||||
- name: Create json issue file
|
||||
run: |
|
||||
cat << EOF > issue.json
|
||||
{
|
||||
"fields": {
|
||||
"project":
|
||||
{
|
||||
"key": "$JIRA_PROJECT_KEY"
|
||||
},
|
||||
"summary": "$JIRA_ISSUE_SUMMARY",
|
||||
"description": "$JIRA_ISSUE_DESCRIPTION",
|
||||
"issuetype": {
|
||||
"name": "$JIRA_ISSUE_TYPE_NAME"
|
||||
}
|
||||
}
|
||||
}
|
||||
EOF
|
||||
env:
|
||||
JIRA_PROJECT_KEY: ${{ secrets.JIRA_PROJECT_KEY }}
|
||||
JIRA_ISSUE_SUMMARY: ${{ github.event.issue.title }}
|
||||
JIRA_ISSUE_DESCRIPTION: "${{ github.event.issue.url }}\\n\\n${{ github.event.issue.html_url }}"
|
||||
JIRA_ISSUE_TYPE_NAME: "Story"
|
||||
- name: Check issue json
|
||||
run: |
|
||||
cat issue.json
|
||||
- name: Trigger jira issue creation
|
||||
run: |
|
||||
curl -u $JIRA_AUTH -X POST --data @issue.json -H "Content-Type: application/json" --url $JIRA_PROJECT_URL
|
||||
env:
|
||||
JIRA_AUTH: ${{ secrets.JIRA_USN_AND_TOKEN }}
|
||||
JIRA_PROJECT_URL: ${{ secrets.JIRA_PROJECT_URL }}
|
||||
@@ -1,18 +0,0 @@
|
||||
name: Label New Issue
|
||||
|
||||
on:
|
||||
issues:
|
||||
types: opened
|
||||
|
||||
jobs:
|
||||
label_new_issue:
|
||||
uses: AntelopeIO/issue-project-labeler-workflow/.github/workflows/issue-project-labeler.yaml@v1
|
||||
with:
|
||||
issue-id: ${{github.event.issue.node_id}}
|
||||
label: triage
|
||||
org-project: 'Team Backlog'
|
||||
project-field: Status=Todo
|
||||
skip-if-existing-project: true
|
||||
secrets:
|
||||
token: ${{secrets.ENFCIBOT_REPO_AND_PROJECTS}}
|
||||
|
||||
@@ -11,7 +11,7 @@ jobs:
|
||||
steps:
|
||||
- name: Checkout
|
||||
run: |
|
||||
git clone https://github.com/${GITHUB_REPOSITORY} .
|
||||
git clone https://x-access-token:${{github.token}}@github.com/${GITHUB_REPOSITORY} .
|
||||
git fetch -v --prune origin +refs/pull/${PR_NUMBER}/merge:refs/remotes/pull/${PR_NUMBER}/merge
|
||||
git checkout --force --progress refs/remotes/pull/${PR_NUMBER}/merge
|
||||
git submodule sync --recursive
|
||||
|
||||
+7
-8
@@ -5,26 +5,21 @@
|
||||
*.bc
|
||||
*.wast
|
||||
*.wast.hpp
|
||||
*.s
|
||||
*.dot
|
||||
*.abi.hpp
|
||||
*.cmake
|
||||
!.cicd
|
||||
!package.cmake
|
||||
!CMakeModules/*.cmake
|
||||
*.ninja
|
||||
\#*
|
||||
\.#*
|
||||
CMakeCache.txt
|
||||
CMakeFiles
|
||||
cmake_install.cmake
|
||||
cmake-build-debug/
|
||||
cmake-build-release/
|
||||
cmake-build-*/
|
||||
Makefile
|
||||
compile_commands.json
|
||||
moc_*
|
||||
*.moc
|
||||
|
||||
.cache
|
||||
|
||||
genesis.json
|
||||
hardfork.hpp
|
||||
|
||||
@@ -75,6 +70,8 @@ witness_node_data_dir
|
||||
*.pyc
|
||||
*.pyo
|
||||
|
||||
*.gdb_history
|
||||
|
||||
Testing/*
|
||||
build.tar.gz
|
||||
[Bb]uild*/*
|
||||
@@ -93,3 +90,5 @@ CMakeLists.txt.user
|
||||
|
||||
node_modules
|
||||
package-lock.json
|
||||
|
||||
snapshots
|
||||
|
||||
@@ -31,3 +31,12 @@
|
||||
[submodule "libraries/cli11/cli11"]
|
||||
path = libraries/cli11/cli11
|
||||
url = https://github.com/AntelopeIO/CLI11.git
|
||||
[submodule "libraries/libfc/libraries/bls12-381"]
|
||||
path = libraries/libfc/libraries/bls12-381
|
||||
url = https://github.com/AntelopeIO/bls12-381
|
||||
[submodule "libraries/boost"]
|
||||
path = libraries/boost
|
||||
url = https://github.com/boostorg/boost.git
|
||||
[submodule "libraries/libfc/libraries/boringssl/boringssl"]
|
||||
path = libraries/libfc/libraries/boringssl/boringssl
|
||||
url = https://github.com/AntelopeIO/boringssl-build
|
||||
|
||||
@@ -0,0 +1,52 @@
|
||||
# coopos — рабочие заметки
|
||||
|
||||
Репозиторий: `coopenomics/coopos` (форк Antelope/Leap). Сборка → `dicoop/blockchain` (Docker) + `.deb`. Соседи: `~/docker-hub/` (тест-харнесс миграций/снимков), `~/playbooks/` (Ansible для прод-нод).
|
||||
|
||||
## Миграции версий (подтверждено 2026-05-05: 5.1.0 → 5.2.0)
|
||||
|
||||
Минорный апгрейд бесшовен при одинаковом toolchain:
|
||||
|
||||
```
|
||||
systemctl stop nodeos
|
||||
dpkg -i coopos_X.Y.Z-…amd64.deb
|
||||
systemctl start nodeos
|
||||
```
|
||||
|
||||
Без replay, без двух нод. Перед роллаутом — `~/docker-hub/scripts/test-deb-compat.sh` с актуальными .deb на одном data dir.
|
||||
|
||||
**Когда replay реально нужен:** правки в `libraries/chain/include/eosio/chain/*_object.hpp` (поля chainbase) или смена major gcc/boost у CI runner'а. Тогда план — snapshot → clean `data/state*` → start `--snapshot`.
|
||||
|
||||
**Подвох legacy-образов:** `dicoop/blockchain:v5.1.0-dev` (апрель 2024, старый Dockerfile с .deb от Leap) с современным `latest` несовместим по shared_memory из-за разного build env, не из-за кода. Не использовать pre-built образы старше нескольких месяцев как baseline миграционного теста.
|
||||
|
||||
**Why:** `chainbase` (boost::interprocess managed_mapped_file) сериализует структуры через memcpy memory layout — критично совпадение gcc/boost у двух последовательных бинарников.
|
||||
|
||||
## Полная нода ≠ snapshot
|
||||
|
||||
При диагностике проблемных нод coopos (api prod, moochest:nodeos) **не предлагать snapshot-restart как путь**, даже если на порядки быстрее. Задача именно полный resync через blocks.log; snapshot скрывает проблемы (OOM, форки, застревания), а не диагностирует их.
|
||||
|
||||
**How to apply:** варианты восстановления выбирать из множества `{trim+replay, hard-replay, ручной rebuild reversible/state}`. Snapshot — только если пользователь сейчас прямо просит «возьми снапшот».
|
||||
|
||||
**Why:** инцидент 2026-05-18 — при анализе сиротского блока 113,273,321 я предложил A) full replay B) snapshot, получил «Snapshot работает, я знаю. У меня нет задачи со Snapshot запускаться. Задача — полную ноду синхронизировать нормально».
|
||||
|
||||
Связанные операционные пометки про nodeos (replay OOM, SIGHUP во время startup) — в `~/playbooks/CLAUDE.md` → раздел EOSIO ops.
|
||||
|
||||
## Dockerfile.publish — всегда явный target
|
||||
|
||||
В `coopos/.cicd/Dockerfile.publish` стадии: `builder → runtime → deb (FROM scratch)`. У `docker/build-push-action` без `target:` публикуется **последняя** стадия — это `deb` (scratch с .deb), не `runtime`. Результат: `dicoop/blockchain:latest` улетает неработающим scratch-артефактом.
|
||||
|
||||
**How to apply:** в `coopos/.github/workflows/docker-publish.yaml` у любого шага `docker/build-push-action`, который пушит runtime-образ, **обязателен** `target: runtime`. Нельзя полагаться на «последняя стадия = runnable image» когда после неё есть scratch-export. Любая правка `Dockerfile.publish` со сменой порядка стадий — перепроверять оба build-push шага в workflow.
|
||||
|
||||
**Why:** инцидент 2026-05-07 — закоммитил multi-stage с `deb` в конце, в workflow забыл `target: runtime`; commit 9b6cadb3be7 переключился на сломанный `:latest`.
|
||||
|
||||
## Заготовка `~/docker-hub/` (тест-харнесс)
|
||||
|
||||
- `scripts/start.sh --image <name> --tag <tag> [--from-snapshot --clean --replay --hard-replay --extra "..." --follow]` — параметризуемый запуск через docker compose.
|
||||
- `scripts/{stop,status,fetch-snapshot,fetch-debs,build-deb-image}.sh` — операции.
|
||||
- `scripts/test-compat.sh` — снапшот-совместимость двух тегов в Docker Hub.
|
||||
- `scripts/test-deb-compat.sh` — миграция .deb на одном data dir (главный тест перед прод-апгрейдом).
|
||||
- `scripts/fork-snapshot.sh` — снапшот → JSON → JQ-патч → бинарь через `leap-util snapshot to-json/from-json` (subcommand `from-json` добавлен в coopos v5.2.0+, см. `programs/leap-util/actions/snapshot.cpp`).
|
||||
- `scripts/start-fork.sh` — поднимает локальный writable fork (без p2p, eosio продьюсит сам под dev-key). Подтверждено 2026-05-05: `eosio::updateauth` от dev-key принят форкнутой нодой.
|
||||
- `patches/dev-fork.jq` — точечный патч под coopos-снапшот (single-producer mode).
|
||||
- `config-fork/config.ini` — конфиг форкнутой ноды.
|
||||
|
||||
**Структура снапшота coopos** (подтверждено 2026-05-05): верхний уровень JSON — секции как ключи (не `.sections[]`), формат `{"eosio::chain::permission_object": {rows: [...], num_rows: N}, ...}`. Ключевые секции для патча: `permission_object`, `block_state.rows[0].active_schedule.producers[*].authority[1].keys`, `block_state.rows[0].valid_block_signing_authority[1].keys`. Coopos в single-producer mode — `eosio` единственный продьюсер.
|
||||
+44
-49
@@ -1,6 +1,6 @@
|
||||
cmake_minimum_required( VERSION 3.8 )
|
||||
cmake_minimum_required( VERSION 3.16 )
|
||||
|
||||
project( leap )
|
||||
project( coopos )
|
||||
include(CTest) # suppresses DartConfiguration.tcl error
|
||||
enable_testing()
|
||||
|
||||
@@ -9,14 +9,14 @@ list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/CMakeModules")
|
||||
include( GNUInstallDirs )
|
||||
include( MASSigning )
|
||||
|
||||
set( CMAKE_CXX_STANDARD 17 )
|
||||
set( CMAKE_CXX_STANDARD 20 )
|
||||
set( CMAKE_CXX_EXTENSIONS ON )
|
||||
set( CXX_STANDARD_REQUIRED ON)
|
||||
|
||||
set(VERSION_MAJOR 4)
|
||||
set(VERSION_MINOR 1)
|
||||
set(VERSION_PATCH 0)
|
||||
set(VERSION_SUFFIX dev)
|
||||
set(VERSION_MAJOR 5)
|
||||
set(VERSION_MINOR 3)
|
||||
set(VERSION_PATCH 3)
|
||||
set(VERSION_SUFFIX "" CACHE STRING "Optional pre-release suffix appended to version (e.g. rc1, beta). Empty = clean release.")
|
||||
|
||||
if(VERSION_SUFFIX)
|
||||
set(VERSION_FULL "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}-${VERSION_SUFFIX}")
|
||||
@@ -37,12 +37,8 @@ set( LEAP_UTIL_EXECUTABLE_NAME leap-util )
|
||||
|
||||
# http://stackoverflow.com/a/18369825
|
||||
if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
|
||||
if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 8.0)
|
||||
message(FATAL_ERROR "GCC version must be at least 8.0!")
|
||||
endif()
|
||||
elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "AppleClang")
|
||||
if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 5.0)
|
||||
message(FATAL_ERROR "Clang version must be at least 5.0!")
|
||||
if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 10.2)
|
||||
message(FATAL_ERROR "GCC version must be at least 10.2.0!")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
@@ -58,15 +54,6 @@ set(CMAKE_EXPORT_COMPILE_COMMANDS "ON")
|
||||
set(BUILD_DOXYGEN FALSE CACHE BOOL "Build doxygen documentation on every make")
|
||||
set(ENABLE_MULTIVERSION_PROTOCOL_TEST FALSE CACHE BOOL "Enable nodeos multiversion protocol test")
|
||||
|
||||
# add defaults for openssl
|
||||
if(APPLE AND UNIX AND "${OPENSSL_ROOT_DIR}" STREQUAL "")
|
||||
if(CMAKE_SYSTEM_PROCESSOR STREQUAL "arm64")
|
||||
set(OPENSSL_ROOT_DIR "/opt/homebrew/opt/openssl@3;/opt/homebrew/opt/openssl@1.1")
|
||||
else()
|
||||
set(OPENSSL_ROOT_DIR "/usr/local/opt/openssl@3;/usr/local/opt/openssl@1.1")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
option(ENABLE_OC "Enable eosvm-oc on supported platforms" ON)
|
||||
|
||||
# WASM runtimes to enable. Each runtime in this list will have:
|
||||
@@ -79,7 +66,7 @@ if(ENABLE_OC AND CMAKE_SIZEOF_VOID_P EQUAL 8 AND NOT WIN32)
|
||||
# can be created with the exact version found
|
||||
find_package(LLVM REQUIRED CONFIG)
|
||||
if(LLVM_VERSION_MAJOR VERSION_LESS 7 OR LLVM_VERSION_MAJOR VERSION_GREATER_EQUAL 12)
|
||||
message(FATAL_ERROR "Leap requires an LLVM version 7 through 11")
|
||||
message(FATAL_ERROR "Coopos requires an LLVM version 7 through 11")
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
||||
@@ -105,12 +92,6 @@ else()
|
||||
set(no_whole_archive_flag "--no-whole-archive")
|
||||
endif()
|
||||
|
||||
set(Boost_USE_MULTITHREADED ON)
|
||||
set( Boost_USE_STATIC_LIBS ON CACHE STRING "ON or OFF" )
|
||||
# Most boost deps get implictly picked up via fc, as just about everything links to fc. In addition we pick up
|
||||
# the pthread dependency through fc.
|
||||
find_package(Boost 1.67 REQUIRED COMPONENTS program_options unit_test_framework system)
|
||||
|
||||
if( APPLE AND UNIX )
|
||||
# Apple Specific Options Here
|
||||
message( STATUS "Configuring Leap on macOS" )
|
||||
@@ -142,13 +123,13 @@ if(ENABLE_WEXTRA)
|
||||
endif()
|
||||
|
||||
|
||||
option(EOSIO_ENABLE_DEVELOPER_OPTIONS "enable developer options for Leap" OFF)
|
||||
option(EOSIO_ENABLE_DEVELOPER_OPTIONS "enable developer options for Coopos" OFF)
|
||||
|
||||
# based on http://www.delorie.com/gnu/docs/gdb/gdb_70.html
|
||||
# uncomment this line to tell GDB about macros (slows compile times)
|
||||
# set( CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -gdwarf-2 -g3" )
|
||||
|
||||
set(ENABLE_COVERAGE_TESTING FALSE CACHE BOOL "Build Leap for code coverage analysis")
|
||||
set(ENABLE_COVERAGE_TESTING FALSE CACHE BOOL "Build Coopos for code coverage analysis")
|
||||
|
||||
if(ENABLE_COVERAGE_TESTING)
|
||||
SET(CMAKE_C_FLAGS "--coverage ${CMAKE_C_FLAGS}")
|
||||
@@ -178,9 +159,10 @@ endif()
|
||||
|
||||
message( STATUS "Using '${EOSIO_ROOT_KEY}' as public key for 'eosio' account" )
|
||||
|
||||
find_package( Gperftools QUIET )
|
||||
if( GPERFTOOLS_FOUND )
|
||||
message( STATUS "Found gperftools; compiling Leap with TCMalloc")
|
||||
option(ENABLE_TCMALLOC "use tcmalloc (requires gperftools)" OFF)
|
||||
if( ENABLE_TCMALLOC )
|
||||
find_package( Gperftools REQUIRED )
|
||||
message( STATUS "Compiling Coopos with TCMalloc")
|
||||
#if doing this by the book, simply link_libraries( ${GPERFTOOLS_TCMALLOC} ) here. That will
|
||||
#give the performance benefits of tcmalloc but since it won't be linked last
|
||||
#the heap profiler & checker may not be accurate. This here is rather undocumented behavior
|
||||
@@ -189,6 +171,14 @@ if( GPERFTOOLS_FOUND )
|
||||
set(CMAKE_CXX_STANDARD_LIBRARIES "${CMAKE_CXX_STANDARD_LIBRARIES} ${GPERFTOOLS_TCMALLOC}")
|
||||
endif()
|
||||
|
||||
# leap includes a bundled BoringSSL which conflicts with OpenSSL. Make sure any other bundled libraries (such as boost)
|
||||
# do not attempt to use an external OpenSSL in any manner
|
||||
set(CMAKE_DISABLE_FIND_PACKAGE_OpenSSL On)
|
||||
|
||||
# many tests require handling of signals themselves and even when they don't we'd like for them to generate a core dump, this
|
||||
# is effectively --catch_system_errors=no broadly across all tests
|
||||
add_compile_definitions(BOOST_TEST_DEFAULTS_TO_CORE_DUMP)
|
||||
|
||||
add_subdirectory( libraries )
|
||||
add_subdirectory( plugins )
|
||||
add_subdirectory( programs )
|
||||
@@ -208,7 +198,7 @@ set(EOS_ROOT_DIR "${CMAKE_BINARY_DIR}/lib")
|
||||
configure_file(${CMAKE_SOURCE_DIR}/CMakeModules/eosio-config.cmake.in ${CMAKE_BINARY_DIR}/lib/cmake/eosio/eosio-config.cmake @ONLY)
|
||||
configure_file(${CMAKE_SOURCE_DIR}/CMakeModules/EosioTesterBuild.cmake.in ${CMAKE_BINARY_DIR}/lib/cmake/eosio/EosioTester.cmake @ONLY)
|
||||
configure_file(${CMAKE_SOURCE_DIR}/CMakeModules/EosioCheckVersion.cmake ${CMAKE_BINARY_DIR}/lib/cmake/eosio/EosioCheckVersion.cmake COPYONLY)
|
||||
# new leap CMake files
|
||||
# new coopos CMake files
|
||||
configure_file(${CMAKE_SOURCE_DIR}/CMakeModules/leap-config.cmake.in ${CMAKE_BINARY_DIR}/lib/cmake/leap/leap-config.cmake @ONLY)
|
||||
configure_file(${CMAKE_SOURCE_DIR}/CMakeModules/EosioTesterBuild.cmake.in ${CMAKE_BINARY_DIR}/lib/cmake/leap/EosioTester.cmake @ONLY)
|
||||
configure_file(${CMAKE_SOURCE_DIR}/CMakeModules/EosioCheckVersion.cmake ${CMAKE_BINARY_DIR}/lib/cmake/leap/EosioCheckVersion.cmake COPYONLY)
|
||||
@@ -220,7 +210,7 @@ configure_file(${CMAKE_SOURCE_DIR}/CMakeModules/eosio-config.cmake.in ${CMAKE_BI
|
||||
install(FILES ${CMAKE_BINARY_DIR}/modules/eosio-config.cmake DESTINATION ${CMAKE_INSTALL_FULL_LIBDIR}/cmake/eosio COMPONENT dev EXCLUDE_FROM_ALL)
|
||||
install(FILES ${CMAKE_BINARY_DIR}/modules/EosioTester.cmake DESTINATION ${CMAKE_INSTALL_FULL_LIBDIR}/cmake/eosio COMPONENT dev EXCLUDE_FROM_ALL)
|
||||
install(FILES ${CMAKE_SOURCE_DIR}/CMakeModules/EosioCheckVersion.cmake DESTINATION ${CMAKE_INSTALL_FULL_LIBDIR}/cmake/eosio COMPONENT dev EXCLUDE_FROM_ALL)
|
||||
# new leap CMake files
|
||||
# new coopos CMake files
|
||||
configure_file(${CMAKE_SOURCE_DIR}/CMakeModules/leap-config.cmake.in ${CMAKE_BINARY_DIR}/modules/leap-config.cmake @ONLY)
|
||||
install(FILES ${CMAKE_BINARY_DIR}/modules/leap-config.cmake DESTINATION ${CMAKE_INSTALL_FULL_LIBDIR}/cmake/leap COMPONENT dev EXCLUDE_FROM_ALL)
|
||||
install(FILES ${CMAKE_BINARY_DIR}/modules/EosioTester.cmake DESTINATION ${CMAKE_INSTALL_FULL_LIBDIR}/cmake/leap COMPONENT dev EXCLUDE_FROM_ALL)
|
||||
@@ -234,6 +224,8 @@ configure_file(libraries/libfc/include/fc/crypto/webauthn_json/license.txt licen
|
||||
configure_file(libraries/eos-vm/LICENSE licenses/leap/LICENSE.eos-vm COPYONLY)
|
||||
configure_file(libraries/prometheus/prometheus-cpp/LICENSE licenses/leap/LICENSE.prom COPYONLY)
|
||||
configure_file(programs/cleos/LICENSE.CLI11 licenses/leap/LICENSE.CLI11 COPYONLY)
|
||||
configure_file(libraries/libfc/libraries/bls12-381/LICENSE licenses/leap/LICENSE.bls12-381 COPYONLY)
|
||||
configure_file(libraries/libfc/libraries/boringssl/boringssl/src/LICENSE licenses/leap/LICENSE.boringssl COPYONLY)
|
||||
|
||||
install(DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/licenses/leap" DESTINATION "${CMAKE_INSTALL_FULL_DATAROOTDIR}/licenses/" COMPONENT base)
|
||||
|
||||
@@ -251,7 +243,6 @@ install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/tests/TestHarness DESTINATION ${CM
|
||||
PATTERN "*.json"
|
||||
PATTERN "__pycache__" EXCLUDE
|
||||
PATTERN "CMakeFiles" EXCLUDE)
|
||||
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/tests/launcher.py DESTINATION ${CMAKE_INSTALL_FULL_DATAROOTDIR}/leap_testing/tests COMPONENT dev EXCLUDE_FROM_ALL)
|
||||
|
||||
if(CMAKE_VERSION VERSION_GREATER_EQUAL 3.21)
|
||||
# Cmake versions < 3.21 did not support installing symbolic links to a directory via install(FILES ...)
|
||||
@@ -268,18 +259,8 @@ if(CMAKE_VERSION VERSION_GREATER_EQUAL 3.21)
|
||||
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/lib/python3/dist-packages/TestHarness DESTINATION ${CMAKE_INSTALL_FULL_LIBDIR}/python3/dist-packages COMPONENT dev EXCLUDE_FROM_ALL)
|
||||
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/share/leap_testing/bin DESTINATION ${CMAKE_INSTALL_FULL_DATAROOTDIR}/leap_testing COMPONENT dev EXCLUDE_FROM_ALL)
|
||||
else()
|
||||
# The following install(CODE ...) steps are necessary for `make dev-install` to work on cmake versions < 3.21.
|
||||
# However, it can flag as an error if using `make package` instead of `make dev-install` for installation.
|
||||
# This is due to those directories and symbolic links being created in the postinit script during the package install instead.
|
||||
|
||||
# Note If/when doing `make package`, it is not a true error if you see:
|
||||
# Error creating directory "/<leap_install_dir>/lib/python3/dist-packages".
|
||||
# CMake Error: failed to create symbolic link '/<leap_install_dir>/lib/python3/dist-packages/TestHarness': no such file or directory
|
||||
# CMake Error: failed to create symbolic link '/<leap_install_dir>/share/leap_testing/bin': no such file or directory
|
||||
|
||||
install(CODE "execute_process( COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_INSTALL_FULL_LIBDIR}/python3/dist-packages)" COMPONENT dev EXCLUDE_FROM_ALL)
|
||||
install(CODE "execute_process( COMMAND ${CMAKE_COMMAND} -E create_symlink ../../../share/leap_testing/tests/TestHarness ${CMAKE_INSTALL_FULL_LIBDIR}/python3/dist-packages/TestHarness)" COMPONENT dev EXCLUDE_FROM_ALL)
|
||||
install(CODE "execute_process( COMMAND ${CMAKE_COMMAND} -E create_symlink ../../bin ${CMAKE_INSTALL_FULL_DATAROOTDIR}/leap_testing/bin)" COMPONENT dev EXCLUDE_FROM_ALL)
|
||||
# The following install(SCRIPT ...) steps are necessary for `make dev-install` to work on cmake versions < 3.21.
|
||||
install(SCRIPT ${CMAKE_CURRENT_BINARY_DIR}/scripts/install_testharness_symlinks.cmake COMPONENT dev EXCLUDE_FROM_ALL)
|
||||
|
||||
# The `make package` installation of symlinks happens via the `postinst` script installed in cmake.package via the line below
|
||||
endif()
|
||||
@@ -292,6 +273,18 @@ configure_file(${CMAKE_SOURCE_DIR}/libraries/cli11/bash-completion/completions/c
|
||||
install(FILES libraries/cli11/bash-completion/completions/leap-util DESTINATION ${CMAKE_INSTALL_FULL_DATAROOTDIR}/bash-completion/completions COMPONENT base)
|
||||
install(FILES libraries/cli11/bash-completion/completions/cleos DESTINATION ${CMAKE_INSTALL_FULL_DATAROOTDIR}/bash-completion/completions COMPONENT base)
|
||||
|
||||
# Add the boost submodule we used to build to our install package, so headers can be found for libtester
|
||||
install(DIRECTORY "${CMAKE_SOURCE_DIR}/libraries/boost/"
|
||||
DESTINATION ${CMAKE_INSTALL_FULL_DATAROOTDIR}/leap_boost
|
||||
COMPONENT dev EXCLUDE_FROM_ALL
|
||||
PATTERN ".git/*" EXCLUDE
|
||||
PATTERN "example/*" EXCLUDE
|
||||
PATTERN "bench/*" EXCLUDE
|
||||
PATTERN "doc/*" EXCLUDE
|
||||
PATTERN "libs/*/test" EXCLUDE
|
||||
PATTERN "tools/*/test" EXCLUDE
|
||||
)
|
||||
|
||||
add_custom_target(dev-install
|
||||
COMMAND "${CMAKE_COMMAND}" --build "${CMAKE_BINARY_DIR}"
|
||||
COMMAND "${CMAKE_COMMAND}" --install "${CMAKE_BINARY_DIR}"
|
||||
@@ -301,5 +294,7 @@ add_custom_target(dev-install
|
||||
|
||||
include(doxygen)
|
||||
|
||||
option(ENABLE_LEAP_DEV_DEB "Enable building the leap-dev .deb package" OFF)
|
||||
|
||||
include(package.cmake)
|
||||
include(CPack)
|
||||
|
||||
Executable → Regular
Executable → Regular
Executable → Regular
@@ -14,19 +14,13 @@ if (LLVM_DIR STREQUAL "" OR NOT LLVM_DIR)
|
||||
set(LLVM_DIR @LLVM_DIR@)
|
||||
endif()
|
||||
|
||||
find_package( Gperftools QUIET )
|
||||
if( GPERFTOOLS_FOUND )
|
||||
message( STATUS "Found gperftools; compiling tests with TCMalloc")
|
||||
list( APPEND PLATFORM_SPECIFIC_LIBS tcmalloc )
|
||||
endif()
|
||||
|
||||
if(NOT "@LLVM_FOUND@" STREQUAL "")
|
||||
find_package(LLVM @LLVM_VERSION@ EXACT REQUIRED CONFIG)
|
||||
llvm_map_components_to_libnames(LLVM_LIBS support core passes mcjit native DebugInfoDWARF orcjit)
|
||||
link_directories(${LLVM_LIBRARY_DIR})
|
||||
endif()
|
||||
|
||||
set( CMAKE_CXX_STANDARD 17 )
|
||||
set( CMAKE_CXX_STANDARD 20 )
|
||||
set( CMAKE_CXX_EXTENSIONS ON )
|
||||
set( CXX_STANDARD_REQUIRED ON )
|
||||
|
||||
@@ -41,33 +35,26 @@ else ( APPLE )
|
||||
set( CMAKE_CXX_FLAGS "${CMAKE_C_FLAGS} ${CMAKE_CXX_FLAGS} -Wall")
|
||||
endif ( APPLE )
|
||||
|
||||
### Remove after Boost 1.70 CMake fixes are in place
|
||||
set( Boost_NO_BOOST_CMAKE ON CACHE STRING "ON or OFF" )
|
||||
set( Boost_USE_MULTITHREADED ON )
|
||||
set( Boost_USE_STATIC_LIBS ON CACHE STRING "ON or OFF" )
|
||||
find_package(Boost @Boost_MAJOR_VERSION@.@Boost_MINOR_VERSION@ EXACT REQUIRED COMPONENTS
|
||||
date_time
|
||||
filesystem
|
||||
system
|
||||
chrono
|
||||
iostreams
|
||||
unit_test_framework)
|
||||
set( BOOST_EXCLUDE_LIBRARIES "mysql" )
|
||||
|
||||
add_subdirectory( @CMAKE_INSTALL_FULL_DATAROOTDIR@/leap_boost ${PROJECT_BINARY_DIR}/libraries/boost EXCLUDE_FROM_ALL)
|
||||
|
||||
find_library(libtester eosio_testing @CMAKE_INSTALL_FULL_LIBDIR@ NO_DEFAULT_PATH)
|
||||
find_library(libchain eosio_chain @CMAKE_INSTALL_FULL_LIBDIR@ NO_DEFAULT_PATH)
|
||||
find_library(libfc fc @CMAKE_INSTALL_FULL_LIBDIR@ NO_DEFAULT_PATH)
|
||||
find_library(libsecp256k1 secp256k1 @CMAKE_INSTALL_FULL_LIBDIR@ NO_DEFAULT_PATH)
|
||||
find_library(libbn256 bn256 @CMAKE_INSTALL_FULL_LIBDIR@ NO_DEFAULT_PATH)
|
||||
find_library(libbls12-381 bls12-381 @CMAKE_INSTALL_FULL_LIBDIR@ NO_DEFAULT_PATH)
|
||||
|
||||
find_library(libwasm WASM @CMAKE_INSTALL_FULL_LIBDIR@ NO_DEFAULT_PATH)
|
||||
find_library(libwast WAST @CMAKE_INSTALL_FULL_LIBDIR@ NO_DEFAULT_PATH)
|
||||
find_library(libir IR @CMAKE_INSTALL_FULL_LIBDIR@ NO_DEFAULT_PATH)
|
||||
find_library(liblogging Logging @CMAKE_INSTALL_FULL_LIBDIR@ NO_DEFAULT_PATH)
|
||||
find_library(libruntime Runtime @CMAKE_INSTALL_FULL_LIBDIR@ NO_DEFAULT_PATH)
|
||||
find_library(libsoftfloat softfloat @CMAKE_INSTALL_FULL_LIBDIR@ NO_DEFAULT_PATH)
|
||||
get_filename_component(cryptodir @OPENSSL_CRYPTO_LIBRARY@ DIRECTORY)
|
||||
find_library(liboscrypto crypto "${cryptodir}" NO_DEFAULT_PATH)
|
||||
get_filename_component(ssldir @OPENSSL_SSL_LIBRARY@ DIRECTORY)
|
||||
find_library(libosssl ssl "${ssldir}" NO_DEFAULT_PATH)
|
||||
find_library(libbscrypto bscrypto @CMAKE_INSTALL_FULL_LIBDIR@ NO_DEFAULT_PATH)
|
||||
find_library(libdecrepit decrepit @CMAKE_INSTALL_FULL_LIBDIR@ NO_DEFAULT_PATH)
|
||||
find_library(libchainbase chainbase @CMAKE_INSTALL_FULL_LIBDIR@ NO_DEFAULT_PATH)
|
||||
find_library(libbuiltins builtins @CMAKE_INSTALL_FULL_LIBDIR@ NO_DEFAULT_PATH)
|
||||
|
||||
@@ -81,54 +68,72 @@ if("eos-vm-oc" IN_LIST EOSIO_WASM_RUNTIMES)
|
||||
set(WRAP_MAIN "-Wl,-wrap=main")
|
||||
endif()
|
||||
|
||||
add_library(EosioChain INTERFACE)
|
||||
|
||||
target_link_libraries(EosioChain INTERFACE
|
||||
${libchain}
|
||||
${libfc}
|
||||
${libwast}
|
||||
${libwasm}
|
||||
${libir}
|
||||
${libsoftfloat}
|
||||
${libbscrypto}
|
||||
${libdecrepit}
|
||||
${liblogging}
|
||||
${libchainbase}
|
||||
${libbuiltins}
|
||||
${libsecp256k1}
|
||||
${libbn256}
|
||||
${libbls12-381}
|
||||
@GMP_LIBRARY@
|
||||
|
||||
Boost::date_time
|
||||
Boost::filesystem
|
||||
Boost::system
|
||||
Boost::chrono
|
||||
Boost::multi_index
|
||||
Boost::multiprecision
|
||||
Boost::interprocess
|
||||
Boost::asio
|
||||
Boost::signals2
|
||||
Boost::iostreams
|
||||
"-lz" # Needed by Boost iostreams
|
||||
|
||||
${LLVM_LIBS}
|
||||
|
||||
${PLATFORM_SPECIFIC_LIBS}
|
||||
|
||||
${WRAP_MAIN}
|
||||
Threads::Threads
|
||||
)
|
||||
|
||||
target_include_directories(EosioChain INTERFACE
|
||||
@OPENSSL_INCLUDE_DIR@
|
||||
@CMAKE_INSTALL_PREFIX@
|
||||
@CMAKE_INSTALL_FULL_INCLUDEDIR@
|
||||
@CMAKE_INSTALL_FULL_INCLUDEDIR@/wasm-jit
|
||||
@CMAKE_INSTALL_FULL_INCLUDEDIR@/leapboringssl
|
||||
@CMAKE_INSTALL_FULL_INCLUDEDIR@/softfloat )
|
||||
|
||||
#adds -ltr. Ubuntu eosio.contracts build breaks without this
|
||||
if(UNIX AND NOT APPLE)
|
||||
target_link_libraries(EosioChain INTERFACE ${LIBRT})
|
||||
endif()
|
||||
|
||||
add_library(EosioTester INTERFACE)
|
||||
|
||||
target_link_libraries(EosioTester INTERFACE
|
||||
${libtester}
|
||||
Boost::unit_test_framework
|
||||
EosioChain
|
||||
)
|
||||
|
||||
macro(add_eosio_test_executable test_name)
|
||||
add_executable( ${test_name} ${ARGN} )
|
||||
target_link_libraries( ${test_name}
|
||||
${libtester}
|
||||
${libchain}
|
||||
${libfc}
|
||||
${libwast}
|
||||
${libwasm}
|
||||
${libruntime}
|
||||
${libir}
|
||||
${libsoftfloat}
|
||||
${liboscrypto}
|
||||
${libosssl}
|
||||
${liblogging}
|
||||
${libchainbase}
|
||||
${libbuiltins}
|
||||
${libsecp256k1}
|
||||
${libbn256}
|
||||
@GMP_LIBRARY@
|
||||
|
||||
${Boost_FILESYSTEM_LIBRARY}
|
||||
${Boost_SYSTEM_LIBRARY}
|
||||
${Boost_CHRONO_LIBRARY}
|
||||
${Boost_IOSTREAMS_LIBRARY}
|
||||
"-lz" # Needed by Boost iostreams
|
||||
${Boost_DATE_TIME_LIBRARY}
|
||||
|
||||
${LLVM_LIBS}
|
||||
|
||||
${PLATFORM_SPECIFIC_LIBS}
|
||||
|
||||
${WRAP_MAIN}
|
||||
Threads::Threads
|
||||
EosioTester
|
||||
)
|
||||
|
||||
#adds -ltr. Ubuntu eosio.contracts build breaks without this
|
||||
if(UNIX AND NOT APPLE)
|
||||
target_link_libraries(${test_name} ${LIBRT})
|
||||
endif()
|
||||
|
||||
target_include_directories( ${test_name} PUBLIC
|
||||
${Boost_INCLUDE_DIRS}
|
||||
@OPENSSL_INCLUDE_DIR@
|
||||
@CMAKE_INSTALL_PREFIX@
|
||||
@CMAKE_INSTALL_FULL_INCLUDEDIR@
|
||||
@CMAKE_INSTALL_FULL_INCLUDEDIR@/wasm-jit
|
||||
@CMAKE_INSTALL_FULL_INCLUDEDIR@/softfloat )
|
||||
|
||||
endmacro()
|
||||
|
||||
macro(add_eosio_test test_name)
|
||||
|
||||
@@ -12,19 +12,13 @@ if (LLVM_DIR STREQUAL "" OR NOT LLVM_DIR)
|
||||
set(LLVM_DIR @LLVM_DIR@)
|
||||
endif()
|
||||
|
||||
find_package( Gperftools QUIET )
|
||||
if( GPERFTOOLS_FOUND )
|
||||
message( STATUS "Found gperftools; compiling tests with TCMalloc")
|
||||
list( APPEND PLATFORM_SPECIFIC_LIBS tcmalloc )
|
||||
endif()
|
||||
|
||||
if(NOT "@LLVM_FOUND@" STREQUAL "")
|
||||
find_package(LLVM @LLVM_VERSION@ EXACT REQUIRED CONFIG)
|
||||
llvm_map_components_to_libnames(LLVM_LIBS support core passes mcjit native DebugInfoDWARF orcjit)
|
||||
link_directories(${LLVM_LIBRARY_DIR})
|
||||
endif()
|
||||
|
||||
set( CMAKE_CXX_STANDARD 17 )
|
||||
set( CMAKE_CXX_STANDARD 20 )
|
||||
set( CMAKE_CXX_EXTENSIONS ON )
|
||||
set( CXX_STANDARD_REQUIRED ON )
|
||||
|
||||
@@ -38,33 +32,26 @@ else ( APPLE )
|
||||
set( CMAKE_CXX_FLAGS "${CMAKE_C_FLAGS} ${CMAKE_CXX_FLAGS} -Wall")
|
||||
endif ( APPLE )
|
||||
|
||||
### Remove after Boost 1.70 CMake fixes are in place
|
||||
set( Boost_NO_BOOST_CMAKE ON CACHE STRING "ON or OFF" )
|
||||
set( Boost_USE_MULTITHREADED ON )
|
||||
set( Boost_USE_STATIC_LIBS ON CACHE STRING "ON or OFF" )
|
||||
find_package(Boost @Boost_MAJOR_VERSION@.@Boost_MINOR_VERSION@ EXACT REQUIRED COMPONENTS
|
||||
date_time
|
||||
filesystem
|
||||
system
|
||||
chrono
|
||||
iostreams
|
||||
unit_test_framework)
|
||||
set( BOOST_EXCLUDE_LIBRARIES "mysql" )
|
||||
|
||||
add_subdirectory( @CMAKE_SOURCE_DIR@/libraries/boost ${PROJECT_BINARY_DIR}/libraries/boost EXCLUDE_FROM_ALL)
|
||||
|
||||
find_library(libtester eosio_testing @CMAKE_BINARY_DIR@/libraries/testing NO_DEFAULT_PATH)
|
||||
find_library(libchain eosio_chain @CMAKE_BINARY_DIR@/libraries/chain NO_DEFAULT_PATH)
|
||||
find_library(libfc fc @CMAKE_BINARY_DIR@/libraries/libfc NO_DEFAULT_PATH)
|
||||
find_library(libsecp256k1 secp256k1 @CMAKE_BINARY_DIR@/libraries/libfc/secp256k1 NO_DEFAULT_PATH)
|
||||
find_library(libbn256 bn256 @CMAKE_BINARY_DIR@/libraries/libfc/libraries/bn256/src NO_DEFAULT_PATH)
|
||||
find_library(libbls12-381 bls12-381 @CMAKE_BINARY_DIR@/libraries/libfc/libraries/bls12-381 NO_DEFAULT_PATH)
|
||||
|
||||
find_library(libwasm WASM @CMAKE_BINARY_DIR@/libraries/wasm-jit/Source/WASM NO_DEFAULT_PATH)
|
||||
find_library(libwast WAST @CMAKE_BINARY_DIR@/libraries/wasm-jit/Source/WAST NO_DEFAULT_PATH)
|
||||
find_library(libir IR @CMAKE_BINARY_DIR@/libraries/wasm-jit/Source/IR NO_DEFAULT_PATH)
|
||||
find_library(liblogging Logging @CMAKE_BINARY_DIR@/libraries/wasm-jit/Source/Logging NO_DEFAULT_PATH)
|
||||
find_library(libruntime Runtime @CMAKE_BINARY_DIR@/libraries/wasm-jit/Source/Runtime NO_DEFAULT_PATH)
|
||||
find_library(libsoftfloat softfloat @CMAKE_BINARY_DIR@/libraries/softfloat NO_DEFAULT_PATH)
|
||||
get_filename_component(cryptodir @OPENSSL_CRYPTO_LIBRARY@ DIRECTORY)
|
||||
find_library(liboscrypto crypto "${cryptodir}" NO_DEFAULT_PATH)
|
||||
get_filename_component(ssldir @OPENSSL_SSL_LIBRARY@ DIRECTORY)
|
||||
find_library(libosssl ssl "${ssldir}" NO_DEFAULT_PATH)
|
||||
find_library(libbscrypto bscrypto @CMAKE_BINARY_DIR@/libraries/libfc/libraries/boringssl/boringssl NO_DEFAULT_PATH)
|
||||
find_library(libdecrepit decrepit @CMAKE_BINARY_DIR@/libraries/libfc/libraries/boringssl/boringssl NO_DEFAULT_PATH)
|
||||
find_library(libchainbase chainbase @CMAKE_BINARY_DIR@/libraries/chainbase NO_DEFAULT_PATH)
|
||||
find_library(libbuiltins builtins @CMAKE_BINARY_DIR@/libraries/builtins NO_DEFAULT_PATH)
|
||||
|
||||
@@ -78,57 +65,79 @@ if("eos-vm-oc" IN_LIST EOSIO_WASM_RUNTIMES)
|
||||
set(WRAP_MAIN "-Wl,-wrap=main")
|
||||
endif()
|
||||
|
||||
add_library(EosioChain INTERFACE)
|
||||
|
||||
target_link_libraries(EosioChain INTERFACE
|
||||
${libchain}
|
||||
${libfc}
|
||||
${libwast}
|
||||
${libwasm}
|
||||
${libir}
|
||||
${libsoftfloat}
|
||||
${libbscrypto}
|
||||
${libdecrepit}
|
||||
${liblogging}
|
||||
${libchainbase}
|
||||
${libbuiltins}
|
||||
${libsecp256k1}
|
||||
${libbn256}
|
||||
${libbls12-381}
|
||||
@GMP_LIBRARY@
|
||||
|
||||
Boost::date_time
|
||||
Boost::filesystem
|
||||
Boost::system
|
||||
Boost::chrono
|
||||
Boost::multi_index
|
||||
Boost::multiprecision
|
||||
Boost::interprocess
|
||||
Boost::asio
|
||||
Boost::signals2
|
||||
Boost::iostreams
|
||||
"-lz" # Needed by Boost iostreams
|
||||
|
||||
${LLVM_LIBS}
|
||||
|
||||
${PLATFORM_SPECIFIC_LIBS}
|
||||
|
||||
${WRAP_MAIN}
|
||||
Threads::Threads
|
||||
)
|
||||
|
||||
target_include_directories(EosioChain INTERFACE
|
||||
@OPENSSL_INCLUDE_DIR@
|
||||
@CMAKE_SOURCE_DIR@/libraries/chain/include
|
||||
@CMAKE_BINARY_DIR@/libraries/chain/include
|
||||
@CMAKE_SOURCE_DIR@/libraries/libfc/include
|
||||
@CMAKE_SOURCE_DIR@/libraries/libfc/libraries/boringssl/boringssl/src/include
|
||||
@CMAKE_SOURCE_DIR@/libraries/softfloat/source/include
|
||||
@CMAKE_SOURCE_DIR@/libraries/appbase/include
|
||||
@CMAKE_SOURCE_DIR@/libraries/chainbase/include
|
||||
@CMAKE_SOURCE_DIR@/libraries/wasm-jit/include )
|
||||
|
||||
|
||||
#adds -ltr. Ubuntu eosio.contracts build breaks without this
|
||||
if(UNIX AND NOT APPLE)
|
||||
target_link_libraries(EosioChain INTERFACE ${LIBRT})
|
||||
endif()
|
||||
|
||||
add_library(EosioTester INTERFACE)
|
||||
|
||||
target_link_libraries(EosioTester INTERFACE
|
||||
${libtester}
|
||||
Boost::unit_test_framework
|
||||
EosioChain
|
||||
)
|
||||
|
||||
target_include_directories(EosioTester INTERFACE
|
||||
@CMAKE_SOURCE_DIR@/libraries/testing/include )
|
||||
|
||||
macro(add_eosio_test_executable test_name)
|
||||
add_executable( ${test_name} ${ARGN} )
|
||||
target_link_libraries( ${test_name}
|
||||
${libtester}
|
||||
${libchain}
|
||||
${libfc}
|
||||
${libwast}
|
||||
${libwasm}
|
||||
${libruntime}
|
||||
${libir}
|
||||
${libsoftfloat}
|
||||
${liboscrypto}
|
||||
${libosssl}
|
||||
${liblogging}
|
||||
${libchainbase}
|
||||
${libbuiltins}
|
||||
${libsecp256k1}
|
||||
${libbn256}
|
||||
@GMP_LIBRARY@
|
||||
|
||||
${Boost_FILESYSTEM_LIBRARY}
|
||||
${Boost_SYSTEM_LIBRARY}
|
||||
${Boost_CHRONO_LIBRARY}
|
||||
${Boost_IOSTREAMS_LIBRARY}
|
||||
"-lz" # Needed by Boost iostreams
|
||||
${Boost_DATE_TIME_LIBRARY}
|
||||
|
||||
${LLVM_LIBS}
|
||||
|
||||
${PLATFORM_SPECIFIC_LIBS}
|
||||
|
||||
${WRAP_MAIN}
|
||||
Threads::Threads
|
||||
EosioTester
|
||||
)
|
||||
|
||||
#adds -ltr. Ubuntu eosio.contracts build breaks without this
|
||||
if(UNIX AND NOT APPLE)
|
||||
target_link_libraries(${test_name} ${LIBRT})
|
||||
endif()
|
||||
|
||||
target_include_directories( ${test_name} PUBLIC
|
||||
${Boost_INCLUDE_DIRS}
|
||||
@OPENSSL_INCLUDE_DIR@
|
||||
@CMAKE_SOURCE_DIR@/libraries/chain/include
|
||||
@CMAKE_BINARY_DIR@/libraries/chain/include
|
||||
@CMAKE_SOURCE_DIR@/libraries/libfc/include
|
||||
@CMAKE_SOURCE_DIR@/libraries/softfloat/source/include
|
||||
@CMAKE_SOURCE_DIR@/libraries/appbase/include
|
||||
@CMAKE_SOURCE_DIR@/libraries/chainbase/include
|
||||
@CMAKE_SOURCE_DIR@/libraries/testing/include
|
||||
@CMAKE_SOURCE_DIR@/libraries/wasm-jit/Include )
|
||||
endmacro()
|
||||
|
||||
macro(add_eosio_test test_name)
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
FROM ubuntu:latest
|
||||
|
||||
WORKDIR /workdir
|
||||
COPY build/leap*.deb /workdir/build/
|
||||
|
||||
RUN apt-get update && cd build && \
|
||||
apt-get install -y ./leap*.deb -y && \
|
||||
rm leap*.deb
|
||||
|
||||
@@ -1,3 +1,8 @@
|
||||
COOPOS/coopos
|
||||
Copyright (c) 2024-2025 CBS VOSKHOD and its contributors. All rights reserved.
|
||||
|
||||
The MIT License
|
||||
|
||||
AntelopeIO/leap
|
||||
Copyright (c) 2021-2022 EOS Network Foundation (ENF) and its contributors. All rights reserved.
|
||||
This ENF software is based upon:
|
||||
|
||||
@@ -1,56 +1,289 @@
|
||||
# Leap
|
||||
Leap is a C++ implementation of the [Antelope](https://github.com/AntelopeIO) protocol. It contains blockchain node software and supporting tools for developers and node operators.
|
||||
# Coopos
|
||||
|
||||
## Branches
|
||||
The `main` branch is the development branch; do not use it for production. Refer to the [release page](https://github.com/AntelopeIO/leap/releases) for current information on releases, pre-releases, and obsolete releases, as well as the corresponding tags for those releases.
|
||||
> [!IMPORTANT]
|
||||
> Coopos - операционная система смарт-контрактов платформы Кооперативной Экономики (https://coopenomics.world).
|
||||
|
||||
## Supported Operating Systems
|
||||
We currently support the following operating systems.
|
||||
1. [Ветки](#branches)
|
||||
2. [Быстрый старт с Docker](#docker-quick-start)
|
||||
3. [Поддерживаемые операционные системы](#supported-operating-systems)
|
||||
4. [Бинарная установка](#binary-installation)
|
||||
5. [Запуск ноды на основной сети](#join-mainnet)
|
||||
6. [Сборка и установка из исходного кода](#build-and-install-from-source)
|
||||
7. [Bash автодополнение](#bash-autocomplete)
|
||||
|
||||
Coopos - это C++ реализация протокола [Antelope](https://github.com/AntelopeIO) с расширениями для кооперативной экономики. Содержит программное обеспечение блокчейн-узла и вспомогательные инструменты для разработчиков и операторов узлов.
|
||||
|
||||
## Ветки
|
||||
Ветка `main` является веткой разработки; не используйте её для продакшена. Обратитесь к [странице релизов](https://github.com/AntelopeIO/leap/releases) для получения актуальной информации о релизах, предварительных релизах и устаревших релизах, а также соответствующих тегах для этих релизов.
|
||||
|
||||
## Быстрый старт с Docker
|
||||
|
||||
Для быстрого знакомства с Coopos и разработки смарт-контрактов на любой операционной системе (Windows, macOS, Linux) рекомендуется использовать готовый Docker-контейнер.
|
||||
|
||||
### Запуск контейнера
|
||||
|
||||
```bash
|
||||
docker run -it --rm \
|
||||
-v $(pwd)/workspace:/workspace \
|
||||
-p 8888:8888 \
|
||||
-p 9876:9876 \
|
||||
-p 8070:8070 \
|
||||
dicoop/blockchain_v5.1.1:dev
|
||||
```
|
||||
|
||||
### Что включено в контейнер
|
||||
|
||||
Контейнер основан на том же исходном коде Coopos и дополнительно содержит:
|
||||
- **CDT (Contract Development Toolkit)** - инструменты для компиляции смарт-контрактов
|
||||
- **eosio-cpp** - компилятор смарт-контрактов
|
||||
- **cleos** - командная строка для взаимодействия с блокчейном
|
||||
- **nodeos** - блокчейн-узел
|
||||
- **leap-util** - дополнительные утилиты
|
||||
- **Все необходимые зависимости** для разработки и запуска
|
||||
|
||||
### Использование
|
||||
|
||||
```bash
|
||||
# В контейнере вы можете сразу начать разработку
|
||||
cd /workspace
|
||||
|
||||
# Создать новый смарт-контракт
|
||||
eosio-cpp -abigen hello.cpp -o hello.wasm
|
||||
|
||||
# Запустить локальный блокчейн-узел с полным набором параметров
|
||||
nodeos \
|
||||
# Основные плагины для работы блокчейн-узла
|
||||
--plugin eosio::chain_plugin \
|
||||
--plugin eosio::producer_plugin \
|
||||
--plugin eosio::chain_api_plugin \
|
||||
--plugin eosio::http_plugin \
|
||||
--plugin eosio::state_history_plugin \
|
||||
--plugin eosio::producer_api_plugin \
|
||||
--plugin eosio::resource_monitor_plugin \
|
||||
# Настройки производства блоков
|
||||
--enable-stale-production true \
|
||||
--read-only-read-window-time-us 120000 \
|
||||
--producer-name eosio \
|
||||
--producer-name core \
|
||||
--signature-provider EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV=KEY:5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3 \
|
||||
# Сетевые настройки
|
||||
--net-threads 2 \
|
||||
--p2p-listen-endpoint 0.0.0.0:9876 \
|
||||
# HTTP API настройки
|
||||
--http-server-address 0.0.0.0:8888 \
|
||||
--access-control-allow-origin "*" \
|
||||
--access-control-allow-credentials false \
|
||||
--http-validate-host false \
|
||||
--verbose-http-errors true \
|
||||
--http-max-response-time-ms 30000 \
|
||||
--max-body-size 10485760 \
|
||||
# Настройки производительности и лимитов
|
||||
--max-transaction-time 2000 \
|
||||
--abi-serializer-max-time-ms 200000 \
|
||||
--max-block-cpu-usage-threshold-us 5000 \
|
||||
--max-block-net-usage-threshold-bytes 1024 \
|
||||
# Отладка и история
|
||||
--contracts-console true \
|
||||
--chain-state-history true \
|
||||
--trace-history true \
|
||||
--state-history-endpoint 0.0.0.0:8070 \
|
||||
# Мониторинг ресурсов
|
||||
--resource-monitor-space-threshold 90 \
|
||||
--resource-monitor-not-shutdown-on-threshold-exceeded true \
|
||||
# WASM runtime
|
||||
--wasm-runtime eos-vm
|
||||
```
|
||||
|
||||
### Монтирование рабочей директории
|
||||
|
||||
Параметр `-v $(pwd)/workspace:/workspace` монтирует вашу локальную папку `workspace` в контейнер, позволяя работать с файлами на хост-системе.
|
||||
|
||||
> ⚠️ **Важно:** Для регулярной стабильной работы и продакшена рекомендуется установка deb-пакета или сборка из исходного кода на нативной системе. Docker-контейнер предназначен для разработки и тестирования.
|
||||
|
||||
## Поддерживаемые операционные системы
|
||||
В настоящее время мы поддерживаем следующие операционные системы:
|
||||
- Ubuntu 22.04 Jammy
|
||||
- Ubuntu 20.04 Focal
|
||||
- Ubuntu 18.04 Bionic
|
||||
|
||||
Other Unix derivatives such as macOS are tended to on a best-effort basis and may not be full featured. If you aren't using Ubuntu, please visit the "[Build Unsupported OS](./docs/00_install/01_build-from-source/00_build-unsupported-os.md)" page to explore your options.
|
||||
Другие Unix-производные, такие как macOS, поддерживаются в режиме best-effort и могут быть не полностью функциональными. Если вы не используете Ubuntu, посетите страницу "[Сборка неподдерживаемой ОС](./docs/00_install/01_build-from-source/00_build-unsupported-os.md)" для изучения ваших вариантов.
|
||||
|
||||
If you are running an unsupported Ubuntu derivative, such as Linux Mint, you can find the version of Ubuntu your distribution was based on by using this command:
|
||||
Если вы используете неподдерживаемую производную Ubuntu, такую как Linux Mint, вы можете узнать версию Ubuntu, на которой она основана, используя эту команду:
|
||||
```bash
|
||||
cat /etc/upstream-release/lsb-release
|
||||
```
|
||||
Your best bet is to follow the instructions for your Ubuntu base, but we make no guarantees.
|
||||
Ваш лучший вариант - следовать инструкциям для вашей базовой версии Ubuntu, но мы не даём никаких гарантий.
|
||||
|
||||
## Binary Installation
|
||||
This is the fastest way to get started. From the [latest release](https://github.com/AntelopeIO/leap/releases/latest) page, download a binary for one of our [supported operating systems](#supported-operating-systems), or visit the [release tags](https://github.com/AntelopeIO/leap/releases) page to download a binary for a specific version of Leap.
|
||||
## Бинарная установка
|
||||
Это самый быстрый способ начать работу. Со [страницы последнего релиза](https://github.com/AntelopeIO/leap/releases/latest) скачайте бинарный файл для одной из наших [поддерживаемых операционных систем](#supported-operating-systems), или посетите [теги релизов](https://github.com/AntelopeIO/leap/releases) для скачивания бинарного файла конкретной версии Coopos.
|
||||
|
||||
Once you have a `*.deb` file downloaded for your version of Ubuntu, you can install it as follows:
|
||||
После того, как вы скачали файл `*.deb` для вашей версии Ubuntu, вы можете установить его следующим образом:
|
||||
```bash
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y ~/Downloads/leap*.deb
|
||||
sudo apt-get install -y ~/Downloads/coopos*.deb
|
||||
```
|
||||
Your download path may vary. If you are in an Ubuntu docker container, omit `sudo` because you run as `root` by default.
|
||||
Ваш путь загрузки может отличаться. Если вы находитесь в Ubuntu docker контейнере, опустите `sudo`, поскольку вы работаете как `root` по умолчанию.
|
||||
|
||||
Finally, verify Leap was installed correctly:
|
||||
Наконец, проверьте, что Coopos был установлен корректно:
|
||||
```bash
|
||||
nodeos --full-version
|
||||
```
|
||||
You should see a [semantic version](https://semver.org) string followed by a `git` commit hash with no errors. For example:
|
||||
Вы должны увидеть строку [семантической версии](https://semver.org), за которой следует git commit hash без ошибок. Например:
|
||||
```
|
||||
v3.1.2-0b64f879e3ebe2e4df09d2e62f1fc164cc1125d1
|
||||
v5.1.0-abc123def456...
|
||||
```
|
||||
|
||||
## Build and Install from Source
|
||||
You can also build and install Leap from source.
|
||||
<a id="join-mainnet"></a>
|
||||
## Запуск ноды на основной сети Кооперативной Экономики
|
||||
|
||||
### Prerequisites
|
||||
You will need to build on a [supported operating system](#supported-operating-systems).
|
||||
Чтобы свежая нода смогла подключиться к основной сети, ей нужно вычислить тот же `chain_id`, что у работающих пиров. `chain_id` — детерминированный хеш от стартовых параметров (`initial_timestamp`, `initial_key`, `initial_configuration`); при расхождении хотя бы одного бита пир отвечает `go_away_message reason=wrong chain` и закрывает соединение.
|
||||
|
||||
Requirements to build:
|
||||
- C++17 compiler and standard library
|
||||
- boost 1.67+
|
||||
- CMake 3.8+
|
||||
- LLVM 7 - 11 - for Linux only
|
||||
- newer versions do not work
|
||||
- openssl 1.1+
|
||||
- curl
|
||||
Дефолтное значение `EOSIO_ROOT_KEY` в этой сборке не равно тому, с которым была инициирована основная сеть, поэтому при запуске на пустой `data-dir` нужно явно подать `genesis.json` с правильным `initial_key`.
|
||||
|
||||
### Genesis основной сети
|
||||
|
||||
Сохраните содержимое ниже в файл `genesis.json` (например, в `~/blockchain/config/genesis.json`):
|
||||
|
||||
```json
|
||||
{
|
||||
"initial_timestamp": "2024-07-01T10:00:00.000",
|
||||
"initial_key": "EOS7TjqL5YfQ7tKzzKr3i1Pa1JkTVrcY2BJhMFfyMPajfAiPThjH7",
|
||||
"initial_configuration": {
|
||||
"max_block_net_usage": 1048576,
|
||||
"target_block_net_usage_pct": 1000,
|
||||
"max_transaction_net_usage": 1048575,
|
||||
"base_per_transaction_net_usage": 12,
|
||||
"net_usage_leeway": 500,
|
||||
"context_free_discount_net_usage_num": 20,
|
||||
"context_free_discount_net_usage_den": 100,
|
||||
"max_block_cpu_usage": 200000,
|
||||
"target_block_cpu_usage_pct": 500,
|
||||
"max_transaction_cpu_usage": 180000,
|
||||
"min_transaction_cpu_usage": 100,
|
||||
"max_transaction_lifetime": 3600,
|
||||
"deferred_trx_expiration_window": 600,
|
||||
"max_transaction_delay": 3888000,
|
||||
"max_inline_action_size": 4096,
|
||||
"max_inline_action_depth": 4,
|
||||
"max_authority_depth": 6
|
||||
},
|
||||
"initial_chain_id": "0000000000000000000000000000000000000000000000000000000000000000"
|
||||
}
|
||||
```
|
||||
|
||||
Ожидаемый `chain_id` основной сети: `6e37f9ac0f0ea717bfdbf57d1dd5d7f0e2d773227d9659a63bbf86eec0326c1b`.
|
||||
|
||||
### Полный ресинк mainnet — встроенные исторические исключения
|
||||
|
||||
Начиная с **v5.3.1** реестр исторических исключений (`chain_historical_exceptions`) поставляется *внутри бинаря* для известных production-цепочек. Для основной сети Кооперативной Экономики (chain_id `6e37f9ac…26c1b`) встроены два окна вокруг инцидента 2026-05-11 (релиз `v5.2.0-dev-294edf3b8`):
|
||||
|
||||
- `action_mroot_zero_windows = [113273322 .. 113275717]` — bypass расхождения action_mroot в окне;
|
||||
- `onblock_skip_windows = [113273322 .. 113275717]` — пропуск implicit-транзакции `onblock`, чтобы state нашего реплея не разъехался с канонической цепью. Окно включает блок 113275717 — в нём `eosio::setcode` восстановил системный контракт, но onblock в момент производства этого блока ещё падал; пользовательские транзакции внутри окна выполняются штатно.
|
||||
|
||||
Дополнительно — в `apply_block` снято строгое требование `action_mroot == 0` в bypass'е: внутри окна допускается *любое* расхождение action_mroot при условии полного совпадения остальных полей заголовка.
|
||||
|
||||
Никакого внешнего JSON-файла для mainnet больше не требуется. Достаточно установить `.deb` и запустить полный ресинк — bypass применится автоматически по совпадению `chain_id`. Форки и тестнеты с другим chain_id видят пустой реестр и работают идентично апстрим-Antelope.
|
||||
|
||||
Для разовой переопределения (например, расследование на одной ноде) ещё работает старая опция `chain-historical-exceptions = /path/to/file.json` — она полностью заменяет встроенную запись на этой ноде. JSON формата v5.3.0 (только `action_mroot_zero_windows`) грузится в v5.3.1 без правок.
|
||||
|
||||
### Первый запуск с genesis (полный ресинк с блока 1)
|
||||
|
||||
Начиная с **v5.3.3** канонические генезисы известных сетей вшиты в бинарь — внешний genesis.json хранить не нужно, он воспроизводится из пакета одной командой:
|
||||
|
||||
```bash
|
||||
leap-util genesis list # имена и chain_id вшитых генезисов
|
||||
leap-util genesis print mainnet > genesis.json # канонический genesis основной сети
|
||||
leap-util genesis print testnet > genesis.json # ... или тестнета
|
||||
```
|
||||
|
||||
`chain_id` печатается в stderr — сверьте его с `get_info` любого пира перед синком. Дев-форки не затронуты: дефолтный genesis (без аргументов nodeos) по-прежнему использует апстримовый `EOSIO_ROOT_KEY`.
|
||||
|
||||
`--genesis-json` принимается nodeos **только если `data-dir` пуст** (отсутствуют каталоги `state`, `blocks`, `state-history`, `snapshots`). Поэтому при первом запуске или при намеренном пересинке:
|
||||
|
||||
```bash
|
||||
sudo systemctl stop nodeos
|
||||
|
||||
# Полная очистка состояния (история и trace будут переслушаны с пира)
|
||||
sudo rm -rf ~/blockchain/data/blocks \
|
||||
~/blockchain/data/state \
|
||||
~/blockchain/data/state-history \
|
||||
~/blockchain/data/snapshots
|
||||
|
||||
# Подложить genesis (один раз, путь произвольный — главное чтобы совпадал с флагом ниже)
|
||||
sudo install -m 644 genesis.json ~/blockchain/config/genesis.json
|
||||
|
||||
# Подсунуть флаг --genesis-json в systemd unit на один запуск
|
||||
sudo sed -i 's|^\(ExecStart=/usr/local/bin/nodeos.*\)$|\1 --genesis-json /root/blockchain/config/genesis.json|' \
|
||||
/etc/systemd/system/nodeos.service
|
||||
sudo systemctl daemon-reload
|
||||
sudo systemctl start nodeos
|
||||
|
||||
# Удостовериться, что нода ловит блоки от пира — не должно быть "wrong chain"/"go_away"
|
||||
sudo journalctl -u nodeos -f --since '30 seconds ago'
|
||||
|
||||
# Когда увидели "Received block ...", снять флаг из unit, чтобы он не мешал последующим рестартам
|
||||
sudo sed -i 's| --genesis-json /root/blockchain/config/genesis.json||' /etc/systemd/system/nodeos.service
|
||||
sudo systemctl daemon-reload
|
||||
```
|
||||
|
||||
При повторных рестартах флаг `--genesis-json` не нужен: nodeos продолжит работу из существующего `state`, дефолтное значение `EOSIO_ROOT_KEY` из бинарника при этом не используется.
|
||||
|
||||
### Быстрый старт со снапшота вместо полного ресинка
|
||||
|
||||
Полный ресинк восстанавливает всю историю блоков с блока 1 и занимает часы. Если история до текущего состояния не нужна, можно стартовать со снапшота — нода поднимется за минуты, а историю с момента снапшота и далее догонит по p2p:
|
||||
|
||||
```bash
|
||||
sudo systemctl stop nodeos
|
||||
|
||||
# Получить снапшот от любой ноды, на которой включён producer_api_plugin:
|
||||
# curl -X POST http://<peer>:8888/v1/producer/create_snapshot
|
||||
# Файл будет в /<data-dir>/snapshots/snapshot-<head_block_id>.bin — забрать
|
||||
# его и положить как /root/blockchain/snapshot.bin на целевой ноде.
|
||||
|
||||
sudo rm -rf ~/blockchain/data/blocks \
|
||||
~/blockchain/data/state \
|
||||
~/blockchain/data/state-history \
|
||||
~/blockchain/data/snapshots
|
||||
|
||||
sudo sed -i 's|^\(ExecStart=/usr/local/bin/nodeos.*\)$|\1 --snapshot /root/blockchain/snapshot.bin|' \
|
||||
/etc/systemd/system/nodeos.service
|
||||
sudo systemctl daemon-reload
|
||||
sudo systemctl start nodeos
|
||||
sudo journalctl -u nodeos -f --since '30 seconds ago'
|
||||
|
||||
# После старта снять флаг
|
||||
sudo sed -i 's| --snapshot /root/blockchain/snapshot.bin||' /etc/systemd/system/nodeos.service
|
||||
sudo systemctl daemon-reload
|
||||
```
|
||||
|
||||
Снапшот несёт в себе `chain_id`, поэтому `--genesis-json` в этом сценарии не нужен.
|
||||
|
||||
## Сборка и установка из исходного кода
|
||||
Вы также можете собрать и установить Coopos из исходного кода.
|
||||
|
||||
### Системные требования
|
||||
|
||||
#### Требования к сборке
|
||||
Для успешной сборки Coopos из исходного кода рекомендуется использовать систему с:
|
||||
- **Процессор**: минимум 4 ядра (рекомендуется 8 ядер)
|
||||
- **Оперативная память**: минимум 8 GB RAM (рекомендуется 16 GB)
|
||||
- **Дисковое пространство**: минимум 20 GB для сборки и тестов
|
||||
|
||||
При меньших ресурсах сборка может быть невозможна или крайне медленной. Некоторые этапы компиляции требуют значительных ресурсов памяти.
|
||||
|
||||
#### Требования к работе
|
||||
Для работы блокчейн-узла Coopos достаточно:
|
||||
- **Процессор**: минимум 2 ядра
|
||||
- **Оперативная память**: минимум 4 GB RAM
|
||||
- **Дисковое пространство**: зависит от высоты цепочки блоков. На текущий момент для основной сети кооперативной экономики требуется около 20 GB, поэтому минимально рекомендуется 40 GB, оптимально - 160 GB для комфортной работы и хранения истории.
|
||||
|
||||
### Предварительные требования
|
||||
Вам нужно собирать на [поддерживаемой операционной системе](#supported-operating-systems).
|
||||
|
||||
Требования для сборки:
|
||||
- Компилятор C++20 и стандартная библиотека
|
||||
- CMake 3.16+
|
||||
- LLVM 7 - 11 - только для Linux
|
||||
- более новые версии не работают
|
||||
- libcurl 7.40.0+
|
||||
- git
|
||||
- GMP
|
||||
@@ -58,210 +291,164 @@ Requirements to build:
|
||||
- python3-numpy
|
||||
- zlib
|
||||
|
||||
### Step 1 - Clone
|
||||
If you don't have the Leap repo cloned to your computer yet, [open a terminal](https://itsfoss.com/open-terminal-ubuntu) and navigate to the folder where you want to clone the Leap repository:
|
||||
### Шаг 1 - Клонирование
|
||||
Если у вас ещё не клонирован репозиторий Coopos, [откройте терминал](https://itsfoss.com/open-terminal-ubuntu) и перейдите в папку, где хотите клонировать репозиторий Coopos:
|
||||
```bash
|
||||
cd ~/Downloads
|
||||
```
|
||||
Clone Leap using either HTTPS...
|
||||
Клонируйте Coopos используя либо HTTPS...
|
||||
```bash
|
||||
git clone --recursive https://github.com/AntelopeIO/leap.git
|
||||
```
|
||||
...or SSH:
|
||||
...либо SSH:
|
||||
```bash
|
||||
git clone --recursive git@github.com:AntelopeIO/leap.git
|
||||
```
|
||||
|
||||
> ℹ️ **HTTPS vs. SSH Clone** ℹ️
|
||||
Both an HTTPS or SSH git clone will yield the same result - a folder named `leap` containing our source code. It doesn't matter which type you use.
|
||||
И HTTPS, и SSH клонирование дадут одинаковый результат - папку с именем `leap`, содержащую наш исходный код. Не важно, какой тип вы используете.
|
||||
|
||||
Navigate into that folder:
|
||||
Перейдите в эту папку:
|
||||
```bash
|
||||
cd leap
|
||||
```
|
||||
|
||||
### Step 2 - Checkout Release Tag or Branch
|
||||
Choose which [release](https://github.com/AntelopeIO/leap/releases) or [branch](#branches) you would like to build, then check it out. If you are not sure, use the [latest release](https://github.com/AntelopeIO/leap/releases/latest). For example, if you want to build release 3.1.2 then you would check it out using its tag, `v3.1.2`. In the example below, replace `v0.0.0` with your selected release tag accordingly:
|
||||
### Шаг 2 - Переключение на тег релиза или ветку
|
||||
Выберите, какой [релиз](https://github.com/AntelopeIO/leap/releases) или [ветку](#branches) вы хотите собрать, затем переключитесь на неё. Если вы не уверены, используйте [последний релиз](https://github.com/AntelopeIO/leap/releases/latest). Например, если вы хотите собрать релиз 5.1.0, то переключитесь на его тег `v5.1.0`. В примере ниже замените `v0.0.0` на выбранный вами тег релиза:
|
||||
```bash
|
||||
git fetch --all --tags
|
||||
git checkout v0.0.0
|
||||
git checkout v5.1.0
|
||||
```
|
||||
|
||||
Once you are on the branch or release tag you want to build, make sure everything is up-to-date:
|
||||
После того, как вы находитесь на ветке или теге релиза, который хотите собрать, убедитесь, что всё обновлено:
|
||||
```bash
|
||||
git pull
|
||||
git submodule update --init --recursive
|
||||
```
|
||||
|
||||
### Step 3 - Build
|
||||
Select build instructions below for a [pinned build](#pinned-build) (preferred) or an [unpinned build](#unpinned-build).
|
||||
### Шаг 3 - Сборка
|
||||
Выберите инструкции по сборке ниже для [закреплённой сборки](#pinned-build) (предпочтительно) или [незакреплённой сборки](#unpinned-build).
|
||||
|
||||
> ℹ️ **Pinned vs. Unpinned Build** ℹ️
|
||||
We have two types of builds for Leap: "pinned" and "unpinned." The only difference is that pinned builds use specific versions for some dependencies hand-picked by the Leap engineers - they are "pinned" to those versions. In contrast, unpinned builds use the default dependency versions available on the build system at the time. We recommend performing a "pinned" build to ensure the compiler and boost versions remain the same between builds of different Leap versions. Leap requires these versions to remain the same, otherwise its state might need to be recovered from a portable snapshot or the chain needs to be replayed.
|
||||
> ℹ️ **Закреплённая vs. Незакреплённая сборка** ℹ️
|
||||
У нас есть два типа сборок для Coopos: "закреплённая" и "незакреплённая". Закреплённая сборка - это воспроизводимая сборка с фиксированной средой сборки и версиями зависимостей, установленными командой разработчиков. В отличие от этого, незакреплённые сборки используют версии зависимостей, предоставляемые платформой сборки. Незакреплённые сборки обычно быстрее, потому что закреплённая среда сборки должна быть построена с нуля. Закреплённые сборки, помимо воспроизводимости, обеспечивают, чтобы компилятор оставался тем же между сборками разных основных версий Coopos. Coopos требует, чтобы версия компилятора оставалась той же, иначе его состояние может потребовать восстановления из портативного снимка или цепочка должна быть перезапущена.
|
||||
|
||||
> ⚠️ **A Warning On Parallel Compilation Jobs (`-j` flag)** ⚠️
|
||||
When building C/C++ software, often the build is performed in parallel via a command such as `make -j "$(nproc)"` which uses all available CPU threads. However, be aware that some compilation units (`*.cpp` files) in Leap will consume nearly 4GB of memory. Failures due to memory exhaustion will typically, but not always, manifest as compiler crashes. Using all available CPU threads may also prevent you from doing other things on your computer during compilation. For these reasons, consider reducing this value.
|
||||
> ⚠️ **Предупреждение о параллельных задачах компиляции (флаг `-j`)** ⚠️
|
||||
При сборке программного обеспечения C/C++, часто сборка выполняется параллельно с помощью команды типа `make -j "$(nproc)"`, которая использует все доступные потоки CPU. Однако учтите, что некоторые единицы компиляции (`*.cpp` файлы) в Coopos будут потреблять почти 4GB памяти. Сбои из-за исчерпания памяти обычно, но не всегда, проявляются как сбои компилятора. Использование всех доступных потоков CPU также может помешать вам делать другие вещи на вашем компьютере во время компиляции. По этим причинам рассмотрите возможность уменьшения этого значения.
|
||||
|
||||
> 🐋 **Docker and `sudo`** 🐋
|
||||
If you are in an Ubuntu docker container, omit `sudo` from all commands because you run as `root` by default. Most other docker containers also exclude `sudo`, especially Debian-family containers. If your shell prompt is a hash tag (`#`), omit `sudo`.
|
||||
> 🐋 **Docker и `sudo`** 🐋
|
||||
Если вы находитесь в Ubuntu docker контейнере, опустите `sudo` из всех команд, поскольку вы работаете как `root` по умолчанию. Большинство других docker контейнеров также исключают `sudo`, особенно Debian-семейные контейнеры. Если ваш промпт оболочки - хэш-тег (`#`), опустите `sudo`.
|
||||
|
||||
#### Pinned Build
|
||||
Make sure you are in the root of the `leap` repo, then run the `install_depts.sh` script to install dependencies:
|
||||
#### Закреплённая воспроизводимая сборка
|
||||
Закреплённая воспроизводимая сборка требует Docker. Убедитесь, что вы находитесь в корне репозитория `leap`, затем выполните
|
||||
```bash
|
||||
sudo scripts/install_deps.sh
|
||||
DOCKER_BUILDKIT=1 docker build -f tools/reproducible.Dockerfile -o . .
|
||||
```
|
||||
Эта команда займёт существенное время, потому что цепочка инструментов собирается с нуля. После завершения текущая директория будет содержать собранные `.deb` и `.tar.gz` файлы (вы можете изменить аргумент `-o .` для размещения вывода в другой директории). Если нужно уменьшить количество параллельных задач, как предупреждалось выше, выполните команду как:
|
||||
```bash
|
||||
DOCKER_BUILDKIT=1 docker build --build-arg LEAP_BUILD_JOBS=4 -f tools/reproducible.Dockerfile -o . .
|
||||
```
|
||||
|
||||
Next, run the pinned build script. You have to give it three arguments in the following order:
|
||||
1. A temporary folder, for all dependencies that need to be built from source.
|
||||
1. A build folder, where the binaries you need to install will be built to.
|
||||
1. The number of jobs or CPU cores/threads to use (note the [jobs flag](#step-3---build) warning above).
|
||||
#### Незакреплённая сборка
|
||||
Следующие инструкции действительны для этой ветки. Другие ветки релизов могут иметь разные требования, поэтому убедитесь, что следуете указаниям в ветке или релизе, который собираетесь собирать. Если вы находитесь в Ubuntu docker контейнере, опустите `sudo`, поскольку вы работаете как `root` по умолчанию.
|
||||
|
||||
> 🔒 You do not need to run this script with `sudo` or as root.
|
||||
|
||||
For example, the following command runs the `pinned_build.sh` script, specifies a `deps` and `build` folder in the root of the Leap repo for the first two arguments, then builds the packages using all of your computer's CPU threads:
|
||||
```bash
|
||||
scripts/pinned_build.sh deps build "$(nproc)"
|
||||
```
|
||||
Now you can optionally [test](#step-4---test) your build, or [install](#step-5---install) the `*.deb` binary packages, which will be in the root of your build directory.
|
||||
|
||||
#### Unpinned Build
|
||||
The following instructions are valid for this branch. Other release branches may have different requirements, so ensure you follow the directions in the branch or release you intend to build. If you are in an Ubuntu docker container, omit `sudo` because you run as `root` by default.
|
||||
|
||||
<details> <summary>Ubuntu 22.04 Jammy & Ubuntu 20.04 Focal</summary>
|
||||
|
||||
Install dependencies:
|
||||
Установите зависимости:
|
||||
```bash
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y \
|
||||
build-essential \
|
||||
cmake \
|
||||
curl \
|
||||
git \
|
||||
libboost-all-dev \
|
||||
libcurl4-openssl-dev \
|
||||
libgmp-dev \
|
||||
libssl-dev \
|
||||
llvm-11-dev \
|
||||
python3-numpy
|
||||
```
|
||||
To build, make sure you are in the root of the `leap` repo, then run the following command:
|
||||
```bash
|
||||
mkdir -p build
|
||||
cd build
|
||||
cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_PREFIX_PATH=/usr/lib/llvm-11 ..
|
||||
make -j "$(nproc)" package
|
||||
```
|
||||
</details>
|
||||
|
||||
<details> <summary>Ubuntu 18.04 Bionic</summary>
|
||||
|
||||
Install dependencies:
|
||||
```bash
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y \
|
||||
build-essential \
|
||||
cmake \
|
||||
curl \
|
||||
g++-8 \
|
||||
git \
|
||||
libcurl4-openssl-dev \
|
||||
libgmp-dev \
|
||||
libssl-dev \
|
||||
llvm-7-dev \
|
||||
python3 \
|
||||
python3-numpy \
|
||||
python3-pip \
|
||||
file \
|
||||
zlib1g-dev
|
||||
```
|
||||
|
||||
python3 -m pip install dataclasses
|
||||
```
|
||||
You need to build Boost from source on this distribution:
|
||||
На Ubuntu 20.04 установите gcc-10, который имеет поддержку C++20:
|
||||
```bash
|
||||
curl -fL https://boostorg.jfrog.io/artifactory/main/release/1.79.0/source/boost_1_79_0.tar.bz2 -o ~/Downloads/boost_1_79_0.tar.bz2
|
||||
tar -jvxf ~/Downloads/boost_1_79_0.tar.bz2 -C ~/Downloads/
|
||||
pushd ~/Downloads/boost_1_79_0
|
||||
./bootstrap.sh --prefix="$HOME/boost1.79"
|
||||
./b2 --with-iostreams --with-date_time --with-filesystem --with-system --with-program_options --with-chrono --with-test -j "$(nproc)" install
|
||||
popd
|
||||
sudo apt-get install -y g++-10
|
||||
```
|
||||
The Boost `*.tar.bz2` download and `boost_1_79_0` folder can be removed now if you want more space.
|
||||
```bash
|
||||
rm -r ~/Downloads/boost_1_79_0.tar.bz2 ~/Downloads/boost_1_79_0
|
||||
```
|
||||
From a terminal in the root of the `leap` repo, build.
|
||||
|
||||
Для сборки убедитесь, что вы находитесь в корне репозитория `leap`, затем выполните следующую команду:
|
||||
```bash
|
||||
mkdir -p build
|
||||
cd build
|
||||
cmake -DCMAKE_C_COMPILER=gcc-8 -DCMAKE_CXX_COMPILER=g++-8 -DCMAKE_PREFIX_PATH="$HOME/boost1.79;/usr/lib/llvm-7/" -DCMAKE_BUILD_TYPE=Release ..
|
||||
|
||||
## на Ubuntu 20 укажите компилятор gcc-10
|
||||
cmake -DCMAKE_C_COMPILER=gcc-10 -DCMAKE_CXX_COMPILER=g++-10 -DCMAKE_BUILD_TYPE=Release -DCMAKE_PREFIX_PATH=/usr/lib/llvm-11 ..
|
||||
|
||||
## на Ubuntu 22 версия gcc по умолчанию 11, использование компилятора по умолчанию нормально
|
||||
cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_PREFIX_PATH=/usr/lib/llvm-11 ..
|
||||
|
||||
make -j "$(nproc)" package
|
||||
```
|
||||
After building, you may remove the `~/boost1.79` directory or you may keep it around for your next build.
|
||||
</details>
|
||||
|
||||
Now you can optionally [test](#step-4---test) your build, or [install](#step-5---install) the `*.deb` binary packages, which will be in the root of your build directory.
|
||||
Теперь вы можете опционально [протестировать](#step-4---test) вашу сборку, или [установить](#step-5---install) бинарные пакеты `*.deb`, которые будут в корне вашей директории сборки.
|
||||
|
||||
### Step 4 - Test
|
||||
Leap supports the following test suites:
|
||||
### Шаг 4 - Тестирование
|
||||
Coopos поддерживает следующие наборы тестов:
|
||||
|
||||
Test Suite | Test Type | [Test Size](https://testing.googleblog.com/2010/12/test-sizes.html) | Notes
|
||||
Набор тестов | Тип теста | [Размер теста](https://testing.googleblog.com/2010/12/test-sizes.html) | Примечания
|
||||
---|:---:|:---:|---
|
||||
[Parallelizable tests](#parallelizable-tests) | Unit tests | Small
|
||||
[WASM spec tests](#wasm-spec-tests) | Unit tests | Small | Unit tests for our WASM runtime, each short but _very_ CPU-intensive
|
||||
[Serial tests](#serial-tests) | Component/Integration | Medium
|
||||
[Long-running tests](#long-running-tests) | Integration | Medium-to-Large | Tests which take an extraordinarily long amount of time to run
|
||||
[Параллелизуемые тесты](#parallelizable-tests) | Модульные тесты | Маленький
|
||||
[WASM spec тесты](#wasm-spec-tests) | Модульные тесты | Маленький | Модульные тесты для нашего WASM runtime, каждый короткий но _очень_ CPU-интенсивный
|
||||
[Сериальные тесты](#serial-tests) | Компонент/Интеграция | Средний
|
||||
[Долго выполняемые тесты](#long-running-tests) | Интеграция | Средний-Крупный | Тесты, которые занимают чрезвычайно много времени на выполнение
|
||||
|
||||
When building from source, we recommended running at least the [parallelizable tests](#parallelizable-tests).
|
||||
При сборке из исходного кода мы рекомендуем запускать как минимум [параллелизуемые тесты](#parallelizable-tests).
|
||||
|
||||
#### Parallelizable Tests
|
||||
This test suite consists of any test that does not require shared resources, such as file descriptors, specific folders, or ports, and can therefore be run concurrently in different threads without side effects (hence, easily parallelized). These are mostly unit tests and [small tests](https://testing.googleblog.com/2010/12/test-sizes.html) which complete in a short amount of time.
|
||||
#### Параллелизуемые тесты
|
||||
Этот набор тестов состоит из любых тестов, которые не требуют разделяемых ресурсов, таких как файловые дескрипторы, специфические папки или порты, и поэтому могут выполняться параллельно в разных потоках без побочных эффектов (следовательно, легко параллелизуемы). Это в основном модульные тесты и [маленькие тесты](https://testing.googleblog.com/2010/12/test-sizes.html), которые завершаются за короткое время.
|
||||
|
||||
You can invoke them by running `ctest` from a terminal in your Leap build directory and specifying the following arguments:
|
||||
Вы можете запустить их, выполнив `ctest` из терминала в вашей директории сборки Coopos и указав следующие аргументы:
|
||||
```bash
|
||||
ctest -j "$(nproc)" -LE _tests
|
||||
```
|
||||
|
||||
#### WASM Spec Tests
|
||||
The WASM spec tests verify that our WASM execution engine is compliant with the web assembly standard. These are very [small](https://testing.googleblog.com/2010/12/test-sizes.html), very fast unit tests. However, there are over a thousand of them so the suite can take a little time to run. These tests are extremely CPU-intensive.
|
||||
#### WASM Spec тесты
|
||||
WASM spec тесты проверяют, что наш движок выполнения WASM соответствует стандарту web assembly. Это очень [маленькие](https://testing.googleblog.com/2010/12/test-sizes.html), очень быстрые модульные тесты. Однако их более тысячи, так что набор может занять немного времени на выполнение. Эти тесты чрезвычайно CPU-интенсивны.
|
||||
|
||||
You can invoke them by running `ctest` from a terminal in your Leap build directory and specifying the following arguments:
|
||||
Вы можете запустить их, выполнив `ctest` из терминала в вашей директории сборки Coopos и указав следующие аргументы:
|
||||
```bash
|
||||
ctest -j "$(nproc)" -L wasm_spec_tests
|
||||
```
|
||||
We have observed severe performance issues when multiple virtual machines are running this test suite on the same physical host at the same time, for example in a CICD system. This can be resolved by disabling hyperthreading on the host.
|
||||
Мы наблюдали серьёзные проблемы с производительностью, когда несколько виртуальных машин запускают этот набор тестов на одном физическом хосте одновременно, например в системе CICD. Это можно решить, отключив hyperthreading на хосте.
|
||||
|
||||
#### Serial Tests
|
||||
The serial test suite consists of [medium](https://testing.googleblog.com/2010/12/test-sizes.html) component or integration tests that use specific paths, ports, rely on process names, or similar, and cannot be run concurrently with other tests. Serial tests can be sensitive to other software running on the same host and they may `SIGKILL` other `nodeos` processes. These tests take a moderate amount of time to complete, but we recommend running them.
|
||||
#### Сериальные тесты
|
||||
Набор сериальных тестов состоит из [средних](https://testing.googleblog.com/2010/12/test-sizes.html) компонентных или интеграционных тестов, которые используют специфические пути, порты, полагаются на имена процессов или подобное, и не могут выполняться параллельно с другими тестами. Сериальные тесты могут быть чувствительны к другому программному обеспечению, работающему на том же хосте, и они могут отправлять `SIGKILL` другим процессам `nodeos`. Эти тесты занимают умеренное время на завершение, но мы рекомендуем их запускать.
|
||||
|
||||
You can invoke them by running `ctest` from a terminal in your Leap build directory and specifying the following arguments:
|
||||
Вы можете запустить их, выполнив `ctest` из терминала в вашей директории сборки Coopos и указав следующие аргументы:
|
||||
```bash
|
||||
ctest -L "nonparallelizable_tests"
|
||||
```
|
||||
|
||||
#### Long-Running Tests
|
||||
The long-running tests are [medium-to-large](https://testing.googleblog.com/2010/12/test-sizes.html) integration tests that rely on shared resources and take a very long time to run.
|
||||
#### Долго выполняемые тесты
|
||||
Долго выполняемые тесты - это [средние-крупные](https://testing.googleblog.com/2010/12/test-sizes.html) интеграционные тесты, которые полагаются на разделяемые ресурсы и занимают очень много времени на выполнение.
|
||||
|
||||
You can invoke them by running `ctest` from a terminal in your Leap build directory and specifying the following arguments:
|
||||
Вы можете запустить их, выполнив `ctest` из терминала в вашей директории сборки Coopos и указав следующие аргументы:
|
||||
```bash
|
||||
ctest -L "long_running_tests"
|
||||
```
|
||||
|
||||
### Step 5 - Install
|
||||
Once you have [built](#step-3---build-the-source-code) Leap and [tested](#step-4---test) your build, you can install Leap on your system. Don't forget to omit `sudo` if you are running in a docker container.
|
||||
### Шаг 5 - Установка
|
||||
После того, как вы [собрали](#step-3---build-the-source-code) Coopos и [протестировали](#step-4---test) вашу сборку, вы можете установить Coopos в вашу систему. Не забудьте опустить `sudo`, если вы работаете в docker контейнере.
|
||||
|
||||
We recommend installing the binary package you just built. Navigate to your Leap build directory in a terminal and run this command:
|
||||
Мы рекомендуем установить бинарный пакет, который вы только что собрали. Перейдите в вашу директорию сборки Coopos в терминале и выполните эту команду:
|
||||
```bash
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y ./leap[-_][0-9]*.deb
|
||||
```
|
||||
|
||||
It is also possible to install using `make` instead:
|
||||
Также возможно установить используя `make`:
|
||||
```bash
|
||||
sudo make install
|
||||
```
|
||||
|
||||
## Bash Autocomplete
|
||||
`cleos` and `leap-util` offer a substantial amount of functionality. Consider using bash's autocompletion support which makes it easier to discover all their various options.
|
||||
## Bash автодополнение
|
||||
`cleos` и `leap-util` предлагают существенный объём функциональности. Рассмотрите использование поддержки автодополнения bash, которая облегчает обнаружение всех их различных опций.
|
||||
|
||||
For our provided `.deb` packages simply install Ubuntu's `bash-completion` package: `apt-get install bash-completion` (you may need to log out/in after installing).
|
||||
Для наших предоставленных `.deb` пакетов просто установите Ubuntu пакет `bash-completion`: `apt-get install bash-completion` (вам может понадобиться выйти и войти снова после установки).
|
||||
|
||||
If building from source install the `build/programs/cleos/bash-completion/completions/cleos` and `build/programs/leap-util/bash-completion/completions/leap-util` files to your bash-completion directory. Refer to [bash-completion's documentation](https://github.com/scop/bash-completion#faq) on the possible install locations.
|
||||
Если собираете из исходного кода, установите файлы `build/programs/cleos/bash-completion/completions/cleos` и `build/programs/leap-util/bash-completion/completions/leap-util` в вашу директорию bash-completion. Обратитесь к [документации bash-completion](https://github.com/scop/bash-completion#faq) по возможным местам установки.
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
file(GLOB BENCHMARK "*.cpp")
|
||||
add_executable( benchmark ${BENCHMARK} )
|
||||
|
||||
target_link_libraries( benchmark fc Boost::program_options bn256)
|
||||
target_link_libraries( benchmark eosio_testing fc Boost::program_options bn256)
|
||||
target_include_directories( benchmark PUBLIC
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}"
|
||||
"${CMAKE_CURRENT_BINARY_DIR}/../unittests/include"
|
||||
)
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
|
||||
#include <benchmark.hpp>
|
||||
|
||||
namespace benchmark {
|
||||
namespace eosio::benchmark {
|
||||
|
||||
using bytes = std::vector<char>;
|
||||
using g1g2_pair = std::vector<std::string>;
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
|
||||
#include <benchmark.hpp>
|
||||
|
||||
namespace benchmark {
|
||||
namespace eosio::benchmark {
|
||||
|
||||
// update this map when a new feature is supported
|
||||
// key is the name and value is the function doing benchmarking
|
||||
@@ -15,10 +15,11 @@ std::map<std::string, std::function<void()>> features {
|
||||
{ "key", key_benchmarking },
|
||||
{ "hash", hash_benchmarking },
|
||||
{ "blake2", blake2_benchmarking },
|
||||
{ "bls", bls_benchmarking }
|
||||
};
|
||||
|
||||
// values to control cout format
|
||||
constexpr auto name_width = 28;
|
||||
constexpr auto name_width = 40;
|
||||
constexpr auto runs_width = 5;
|
||||
constexpr auto time_width = 12;
|
||||
constexpr auto ns_width = 2;
|
||||
@@ -46,10 +47,10 @@ void print_results(std::string name, uint32_t runs, uint64_t total, uint64_t min
|
||||
std::cout.imbue(std::locale(""));
|
||||
std::cout
|
||||
<< std::setw(name_width) << std::left << name
|
||||
<< std::setw(runs_width) << runs
|
||||
// std::fixed for not printing 1234 in 1.234e3.
|
||||
// setprecision(0) for not printing fractions
|
||||
<< std::right << std::fixed << std::setprecision(0)
|
||||
<< std::setw(runs_width) << runs
|
||||
<< std::setw(time_width) << total/runs << std::setw(ns_width) << " ns"
|
||||
<< std::setw(time_width) << min << std::setw(ns_width) << " ns"
|
||||
<< std::setw(time_width) << max << std::setw(ns_width) << " ns"
|
||||
@@ -62,8 +63,10 @@ bytes to_bytes(const std::string& source) {
|
||||
return output;
|
||||
};
|
||||
|
||||
void benchmarking(std::string name, const std::function<void()>& func) {
|
||||
uint64_t total {0}, min {std::numeric_limits<uint64_t>::max()}, max {0};
|
||||
void benchmarking(const std::string& name, const std::function<void()>& func) {
|
||||
uint64_t total{0};
|
||||
uint64_t min{std::numeric_limits<uint64_t>::max()};
|
||||
uint64_t max{0};
|
||||
|
||||
for (auto i = 0U; i < num_runs; ++i) {
|
||||
auto start_time = std::chrono::high_resolution_clock::now();
|
||||
|
||||
@@ -3,10 +3,11 @@
|
||||
#include <functional>
|
||||
#include <map>
|
||||
#include <vector>
|
||||
#include <limits>
|
||||
|
||||
#include <fc/crypto/hex.hpp>
|
||||
|
||||
namespace benchmark {
|
||||
namespace eosio::benchmark {
|
||||
using bytes = std::vector<char>;
|
||||
|
||||
void set_num_runs(uint32_t runs);
|
||||
@@ -19,7 +20,8 @@ void modexp_benchmarking();
|
||||
void key_benchmarking();
|
||||
void hash_benchmarking();
|
||||
void blake2_benchmarking();
|
||||
void bls_benchmarking();
|
||||
|
||||
void benchmarking(std::string name, const std::function<void()>& func);
|
||||
void benchmarking(const std::string& name, const std::function<void()>& func);
|
||||
|
||||
} // benchmark
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
#include <benchmark.hpp>
|
||||
|
||||
namespace benchmark {
|
||||
namespace eosio::benchmark {
|
||||
|
||||
void blake2_benchmarking() {
|
||||
uint32_t _rounds = 0x0C;
|
||||
|
||||
@@ -0,0 +1,444 @@
|
||||
#include <benchmark.hpp>
|
||||
#include <eosio/chain/apply_context.hpp>
|
||||
#include <eosio/chain/webassembly/interface.hpp>
|
||||
#include <eosio/testing/tester.hpp>
|
||||
#include <test_contracts.hpp>
|
||||
#include <bls12-381/bls12-381.hpp>
|
||||
#include <random>
|
||||
|
||||
using namespace eosio;
|
||||
using namespace eosio::chain;
|
||||
using namespace eosio::testing;
|
||||
using namespace bls12_381;
|
||||
|
||||
// Benchmark BLS host functions without relying on CDT wrappers.
|
||||
//
|
||||
// To run a benchmarking session, in the build directory, type
|
||||
// benchmark/benchmark -f bls
|
||||
|
||||
namespace eosio::benchmark {
|
||||
|
||||
// To benchmark host functions directly without CDT wrappers,
|
||||
// we need to contruct an eosio::chain::webassembly::interface object,
|
||||
// because host functions are implemented in
|
||||
// eosio::chain::webassembly::interface class.
|
||||
struct interface_in_benchmark {
|
||||
interface_in_benchmark() {
|
||||
// prevent logging from interwined with output benchmark results
|
||||
fc::logger::get(DEFAULT_LOGGER).set_log_level(fc::log_level::off);
|
||||
|
||||
// create a chain
|
||||
fc::temp_directory tempdir;
|
||||
auto conf_genesis = tester::default_config( tempdir );
|
||||
auto& cfg = conf_genesis.second.initial_configuration;
|
||||
// configure large cpu usgaes so expensive BLS functions like pairing
|
||||
// can finish within a trasaction time
|
||||
cfg.max_block_cpu_usage = 999'999'999;
|
||||
cfg.max_transaction_cpu_usage = 999'999'990;
|
||||
cfg.min_transaction_cpu_usage = 1;
|
||||
chain = std::make_unique<tester>(conf_genesis.first, conf_genesis.second);
|
||||
chain->execute_setup_policy( setup_policy::full );
|
||||
|
||||
// create account and deploy contract for a temp transaction
|
||||
chain->create_accounts( {"payloadless"_n} );
|
||||
chain->set_code( "payloadless"_n, test_contracts::payloadless_wasm() );
|
||||
chain->set_abi( "payloadless"_n, test_contracts::payloadless_abi() );
|
||||
|
||||
// construct a signed transaction
|
||||
fc::variant pretty_trx = fc::mutable_variant_object()
|
||||
("actions", fc::variants({
|
||||
fc::mutable_variant_object()
|
||||
("account", name("payloadless"_n))
|
||||
("name", "doit")
|
||||
("authorization", fc::variants({
|
||||
fc::mutable_variant_object()
|
||||
("actor", name("payloadless"_n))
|
||||
("permission", name(config::active_name))
|
||||
}))
|
||||
("data", fc::mutable_variant_object()
|
||||
)
|
||||
})
|
||||
);
|
||||
trx = std::make_unique<signed_transaction>();
|
||||
abi_serializer::from_variant(pretty_trx, *trx, chain->get_resolver(), abi_serializer::create_yield_function( chain->abi_serializer_max_time ));
|
||||
chain->set_transaction_headers(*trx);
|
||||
trx->sign( chain->get_private_key( "payloadless"_n, "active" ), chain->control.get()->get_chain_id() );
|
||||
|
||||
// construct a packed transaction
|
||||
ptrx = std::make_unique<packed_transaction>(*trx, eosio::chain::packed_transaction::compression_type::zlib);
|
||||
|
||||
// build transaction context from the packed transaction
|
||||
timer = std::make_unique<platform_timer>();
|
||||
trx_timer = std::make_unique<transaction_checktime_timer>(*timer);
|
||||
trx_ctx = std::make_unique<transaction_context>(*chain->control.get(), *ptrx, ptrx->id(), std::move(*trx_timer));
|
||||
trx_ctx->max_transaction_time_subjective = fc::microseconds::maximum();
|
||||
trx_ctx->init_for_input_trx( ptrx->get_unprunable_size(), ptrx->get_prunable_size() );
|
||||
trx_ctx->exec(); // this is required to generate action traces to be used by apply_context constructor
|
||||
|
||||
// build apply context from the control and transaction context
|
||||
apply_ctx = std::make_unique<apply_context>(*chain->control.get(), *trx_ctx, 1);
|
||||
|
||||
// finally construct the interface
|
||||
interface = std::make_unique<webassembly::interface>(*apply_ctx);
|
||||
}
|
||||
|
||||
std::unique_ptr<tester> chain;
|
||||
std::unique_ptr<signed_transaction> trx;
|
||||
std::unique_ptr<packed_transaction> ptrx;
|
||||
std::unique_ptr<platform_timer> timer;
|
||||
std::unique_ptr<transaction_checktime_timer> trx_timer;
|
||||
std::unique_ptr<transaction_context> trx_ctx;
|
||||
std::unique_ptr<apply_context> apply_ctx;
|
||||
std::unique_ptr<webassembly::interface> interface;
|
||||
};
|
||||
|
||||
// utilility to create a random scalar
|
||||
std::array<uint64_t, 4> random_scalar()
|
||||
{
|
||||
std::random_device rd;
|
||||
std::mt19937_64 gen(rd());
|
||||
std::uniform_int_distribution<uint64_t> dis;
|
||||
|
||||
return {
|
||||
dis(gen) % bls12_381::fp::Q[0],
|
||||
dis(gen) % bls12_381::fp::Q[1],
|
||||
dis(gen) % bls12_381::fp::Q[2],
|
||||
dis(gen) % bls12_381::fp::Q[3]
|
||||
};
|
||||
}
|
||||
|
||||
// utilility to create a random fp
|
||||
fp random_fe()
|
||||
{
|
||||
std::random_device rd;
|
||||
std::mt19937_64 gen(rd());
|
||||
std::uniform_int_distribution<uint64_t> dis;
|
||||
|
||||
return fp({
|
||||
dis(gen) % 0xb9feffffffffaaab,
|
||||
dis(gen) % 0x1eabfffeb153ffff,
|
||||
dis(gen) % 0x6730d2a0f6b0f624,
|
||||
dis(gen) % 0x64774b84f38512bf,
|
||||
dis(gen) % 0x4b1ba7b6434bacd7,
|
||||
dis(gen) % 0x1a0111ea397fe69a
|
||||
});
|
||||
}
|
||||
|
||||
// utilility to create a random fp2
|
||||
fp2 random_fe2()
|
||||
{
|
||||
return fp2({
|
||||
random_fe(),
|
||||
random_fe()
|
||||
});
|
||||
}
|
||||
|
||||
// utilility to create a random g1
|
||||
bls12_381::g1 random_g1()
|
||||
{
|
||||
std::array<uint64_t, 4> k = random_scalar();
|
||||
return bls12_381::g1::one().scale(k);
|
||||
}
|
||||
|
||||
// utilility to create a random g2
|
||||
bls12_381::g2 random_g2()
|
||||
{
|
||||
std::array<uint64_t, 4> k = random_scalar();
|
||||
return bls12_381::g2::one().scale(k);
|
||||
}
|
||||
|
||||
// bls_g1_add benchmarking
|
||||
void benchmark_bls_g1_add() {
|
||||
// prepare g1 operand in Jacobian LE format
|
||||
g1 p = random_g1();
|
||||
std::array<char, 96> op;
|
||||
p.toAffineBytesLE(std::span<uint8_t, 96>((uint8_t*)op.data(), 96), from_mont::yes);
|
||||
|
||||
// prepare result operand
|
||||
std::array<char, 96> result;
|
||||
|
||||
// set up bls_g1_add to be benchmarked
|
||||
interface_in_benchmark interface;
|
||||
auto benchmarked_func = [&]() {
|
||||
interface.interface->bls_g1_add(op, op, result);
|
||||
};
|
||||
|
||||
benchmarking("bls_g1_add", benchmarked_func);
|
||||
}
|
||||
|
||||
// bls_g2_add benchmarking
|
||||
void benchmark_bls_g2_add() {
|
||||
// prepare g2 operand in Jacobian LE format
|
||||
g2 p = random_g2();
|
||||
std::array<char, 192> op;
|
||||
p.toAffineBytesLE(std::span<uint8_t, 192>((uint8_t*)op.data(), 192), from_mont::yes);
|
||||
|
||||
// prepare result operand
|
||||
std::array<char, 192> result;
|
||||
|
||||
// set up bls_g2_add to be benchmarked
|
||||
interface_in_benchmark interface;
|
||||
auto benchmarked_func = [&]() {
|
||||
interface.interface->bls_g2_add(op, op, result);
|
||||
};
|
||||
|
||||
benchmarking("bls_g2_add", benchmarked_func);
|
||||
}
|
||||
|
||||
// bls_g1_weighted_sum benchmarking utility
|
||||
void benchmark_bls_g1_weighted_sum_impl(const std::string& test_name, uint32_t num_points) {
|
||||
// prepare g1 points operand
|
||||
std::vector<char> g1_buf(96*num_points);
|
||||
for (auto i=0u; i < num_points; ++i) {
|
||||
g1 p = random_g1();
|
||||
p.toAffineBytesLE(std::span<uint8_t, 96>((uint8_t*)g1_buf.data() + i * 96, 96), from_mont::yes);
|
||||
}
|
||||
chain::span<const char> g1_points(g1_buf.data(), g1_buf.size());
|
||||
|
||||
// prepare scalars operand
|
||||
std::vector<char> scalars_buf(32*num_points);
|
||||
for (auto i=0u; i < num_points; ++i) {
|
||||
std::array<uint64_t, 4> s = random_scalar();
|
||||
scalar::toBytesLE(s, std::span<uint8_t, 32>((uint8_t*)scalars_buf.data() + i*32, 32));
|
||||
}
|
||||
chain::span<const char> scalars(scalars_buf.data(), scalars_buf.size());
|
||||
|
||||
// prepare result operand
|
||||
std::array<char, 96> result;
|
||||
|
||||
// set up bls_g1_weighted_sum to be benchmarked
|
||||
interface_in_benchmark interface;
|
||||
auto benchmarked_func = [&]() {
|
||||
interface.interface->bls_g1_weighted_sum(g1_points, scalars, num_points, result);
|
||||
};
|
||||
|
||||
benchmarking(test_name, benchmarked_func);
|
||||
}
|
||||
|
||||
// bls_g1_weighted_sum benchmarking with 1 input point
|
||||
void benchmark_bls_g1_weighted_sum_one_point() {
|
||||
benchmark_bls_g1_weighted_sum_impl("bls_g1_weighted_sum 1 point", 1);
|
||||
}
|
||||
|
||||
// bls_g1_weighted_sum benchmarking with 3 input points
|
||||
void benchmark_bls_g1_weighted_sum_three_point() {
|
||||
benchmark_bls_g1_weighted_sum_impl("bls_g1_weighted_sum 3 points", 3);
|
||||
}
|
||||
|
||||
// bls_g1_weighted_sum benchmarking with 5 input points
|
||||
void benchmark_bls_g1_weighted_sum_five_point() {
|
||||
benchmark_bls_g1_weighted_sum_impl("bls_g1_weighted_sum 5 points", 5);
|
||||
}
|
||||
|
||||
// bls_g2_weighted_sum benchmarking utility
|
||||
void benchmark_bls_g2_weighted_sum_impl(const std::string& test_name, uint32_t num_points) {
|
||||
// prepare g2 points operand
|
||||
std::vector<char> g2_buf(192*num_points);
|
||||
for (auto i=0u; i < num_points; ++i) {
|
||||
g2 p = random_g2();
|
||||
p.toAffineBytesLE(std::span<uint8_t, 192>((uint8_t*)g2_buf.data() + i * 192, 192), from_mont::yes);
|
||||
}
|
||||
eosio::chain::span<const char> g2_points(g2_buf.data(), g2_buf.size());
|
||||
|
||||
// prepare scalars operand
|
||||
std::vector<char> scalars_buf(32*num_points);
|
||||
for (auto i=0u; i < num_points; ++i) {
|
||||
std::array<uint64_t, 4> s = random_scalar();
|
||||
scalar::toBytesLE(s, std::span<uint8_t, 32>((uint8_t*)scalars_buf.data() + i*32, 32));
|
||||
}
|
||||
eosio::chain::span<const char> scalars(scalars_buf.data(), scalars_buf.size());
|
||||
|
||||
// prepare result operand
|
||||
std::array<char, 192> result;
|
||||
|
||||
// set up bls_g2_weighted_sum to be benchmarked
|
||||
interface_in_benchmark interface;
|
||||
auto benchmarked_func = [&]() {
|
||||
interface.interface->bls_g2_weighted_sum(g2_points, scalars, num_points, result);
|
||||
};
|
||||
|
||||
benchmarking(test_name, benchmarked_func);
|
||||
}
|
||||
|
||||
// bls_g2_weighted_sum benchmarking with 1 input point
|
||||
void benchmark_bls_g2_weighted_sum_one_point() {
|
||||
benchmark_bls_g2_weighted_sum_impl("bls_g2_weighted_sum 1 point", 1);
|
||||
}
|
||||
|
||||
// bls_g2_weighted_sum benchmarking with 3 input points
|
||||
void benchmark_bls_g2_weighted_sum_three_point() {
|
||||
benchmark_bls_g2_weighted_sum_impl("bls_g2_weighted_sum 3 points", 3);
|
||||
}
|
||||
|
||||
// bls_g2_weighted_sum benchmarking with 5 input points
|
||||
void benchmark_bls_g2_weighted_sum_five_point() {
|
||||
benchmark_bls_g2_weighted_sum_impl("bls_g2_weighted_sum 5 points", 5);
|
||||
}
|
||||
|
||||
// bls_pairing benchmarking utility
|
||||
void benchmark_bls_pairing_impl(const std::string& test_name, uint32_t num_pairs) {
|
||||
// prepare g1 operand
|
||||
std::vector<char> g1_buf(96*num_pairs);
|
||||
for (auto i=0u; i < num_pairs; ++i) {
|
||||
g1 p = random_g1();
|
||||
p.toAffineBytesLE(std::span<uint8_t, 96>((uint8_t*)g1_buf.data() + i * 96, 96), from_mont::yes);
|
||||
}
|
||||
eosio::chain::span<const char> g1_points(g1_buf.data(), g1_buf.size());
|
||||
|
||||
// prepare g2 operand
|
||||
std::vector<char> g2_buf(192*num_pairs);
|
||||
for (auto i=0u; i < num_pairs; ++i) {
|
||||
g2 p2 = random_g2();
|
||||
p2.toAffineBytesLE(std::span<uint8_t, (192)>((uint8_t*)g2_buf.data() + i * 192, (192)), from_mont::yes);
|
||||
}
|
||||
eosio::chain::span<const char> g2_points(g2_buf.data(), g2_buf.size());
|
||||
|
||||
// prepare result operand
|
||||
std::array<char, 576> result;
|
||||
|
||||
// set up bls_pairing to be benchmarked
|
||||
interface_in_benchmark interface;
|
||||
auto benchmarked_func = [&]() {
|
||||
interface.interface->bls_pairing(g1_points, g2_points, num_pairs, result);
|
||||
};
|
||||
|
||||
benchmarking(test_name, benchmarked_func);
|
||||
}
|
||||
|
||||
// bls_pairing benchmarking with 1 input pair
|
||||
void benchmark_bls_pairing_one_pair() {
|
||||
benchmark_bls_pairing_impl("bls_pairing 1 pair", 1);
|
||||
}
|
||||
|
||||
// bls_pairing benchmarking with 3 input pairs
|
||||
void benchmark_bls_pairing_three_pair() {
|
||||
benchmark_bls_pairing_impl("bls_pairing 3 pairs", 3);
|
||||
}
|
||||
|
||||
// bls_g1_map benchmarking
|
||||
void benchmark_bls_g1_map() {
|
||||
// prepare e operand. Must be fp LE.
|
||||
std::array<char, 48> e;
|
||||
fp a = random_fe();
|
||||
a.toBytesLE(std::span<uint8_t, 48>((uint8_t*)e.data(), 48), from_mont::yes);
|
||||
|
||||
// prepare result operand
|
||||
std::array<char, 96> result;
|
||||
|
||||
// set up bls_g1_map to be benchmarked
|
||||
interface_in_benchmark interface;
|
||||
auto benchmarked_func = [&]() {
|
||||
interface.interface->bls_g1_map(e, result);
|
||||
};
|
||||
|
||||
benchmarking("bls_g1_map", benchmarked_func);
|
||||
}
|
||||
|
||||
// bls_g2_map benchmarking
|
||||
void benchmark_bls_g2_map() {
|
||||
std::array<char, 96> e;
|
||||
fp2 a = random_fe2();
|
||||
a.toBytesLE(std::span<uint8_t, 96>((uint8_t*)e.data(), 96), from_mont::yes);
|
||||
|
||||
// prepare result operand
|
||||
std::array<char, 192> result;
|
||||
|
||||
// set up bls_g2_map to be benchmarked
|
||||
interface_in_benchmark interface;
|
||||
auto benchmarked_func = [&]() {
|
||||
interface.interface->bls_g2_map(e, result);
|
||||
};
|
||||
|
||||
benchmarking("bls_g2_map", benchmarked_func);
|
||||
}
|
||||
|
||||
// bls_fp_mod benchmarking
|
||||
void benchmark_bls_fp_mod() {
|
||||
// prepare scalar operand
|
||||
std::array<char, 64> scalar;
|
||||
// random_scalar returns 32 bytes. need to call it twice
|
||||
for (auto i=0u; i < 2; ++i) {
|
||||
std::array<uint64_t, 4> s = random_scalar();
|
||||
scalar::toBytesLE(s, std::span<uint8_t, 32>((uint8_t*)scalar.data() + i*32, 32));
|
||||
}
|
||||
|
||||
// prepare result operand
|
||||
std::array<char, 48> result;
|
||||
|
||||
// set up bls_fp_mod to be benchmarked
|
||||
interface_in_benchmark interface;
|
||||
auto benchmarked_func = [&]() {
|
||||
interface.interface->bls_fp_mod(scalar, result);
|
||||
};
|
||||
|
||||
benchmarking("bls_fp_mod", benchmarked_func);
|
||||
}
|
||||
|
||||
void benchmark_bls_fp_mul() {
|
||||
// prepare op1
|
||||
std::array<char, 48> op1;
|
||||
fp a = random_fe();
|
||||
a.toBytesLE(std::span<uint8_t, 48>((uint8_t*)op1.data(), 48), from_mont::yes);
|
||||
|
||||
// prepare op2
|
||||
std::array<char, 48> op2;
|
||||
fp b = random_fe();
|
||||
b.toBytesLE(std::span<uint8_t, 48>((uint8_t*)op2.data(), 48), from_mont::yes);
|
||||
|
||||
// prepare result operand
|
||||
std::array<char, 48> result;
|
||||
|
||||
// set up bls_fp_mul to be benchmarked
|
||||
interface_in_benchmark interface;
|
||||
auto benchmarked_func = [&]() {
|
||||
interface.interface->bls_fp_mul(op1, op2, result);
|
||||
};
|
||||
|
||||
benchmarking("bls_fp_mul", benchmarked_func);
|
||||
}
|
||||
|
||||
void benchmark_bls_fp_exp() {
|
||||
// prepare base
|
||||
std::array<char, 48> base;
|
||||
fp a = random_fe();
|
||||
a.toBytesLE(std::span<uint8_t, 48>((uint8_t*)base.data(), 48), from_mont::yes);
|
||||
|
||||
// prepare exp operand
|
||||
std::array<char, 64> exp;
|
||||
// random_scalar returns 32 bytes. need to call it twice
|
||||
for (auto i=0u; i < 2; ++i) {
|
||||
std::array<uint64_t, 4> s = random_scalar();
|
||||
scalar::toBytesLE(s, std::span<uint8_t, 32>((uint8_t*)exp.data() + i*32, 32));
|
||||
}
|
||||
|
||||
// prepare result operand
|
||||
std::array<char, 48> result;
|
||||
|
||||
// set up bls_fp_exp to be benchmarked
|
||||
interface_in_benchmark interface;
|
||||
auto benchmarked_func = [&]() {
|
||||
interface.interface->bls_fp_exp(base, exp, result);
|
||||
};
|
||||
|
||||
benchmarking("bls_fp_exp", benchmarked_func);
|
||||
}
|
||||
|
||||
// register benchmarking functions
|
||||
void bls_benchmarking() {
|
||||
benchmark_bls_g1_add();
|
||||
benchmark_bls_g2_add();
|
||||
benchmark_bls_pairing_one_pair();
|
||||
benchmark_bls_pairing_three_pair();
|
||||
benchmark_bls_g1_weighted_sum_one_point();
|
||||
benchmark_bls_g1_weighted_sum_three_point();
|
||||
benchmark_bls_g1_weighted_sum_five_point();
|
||||
benchmark_bls_g2_weighted_sum_one_point();
|
||||
benchmark_bls_g2_weighted_sum_three_point();
|
||||
benchmark_bls_g2_weighted_sum_five_point();
|
||||
benchmark_bls_g1_map();
|
||||
benchmark_bls_g2_map();
|
||||
benchmark_bls_fp_mod();
|
||||
benchmark_bls_fp_mul();
|
||||
benchmark_bls_fp_exp();
|
||||
}
|
||||
} // namespace benchmark
|
||||
+1
-1
@@ -10,7 +10,7 @@
|
||||
|
||||
using namespace fc;
|
||||
|
||||
namespace benchmark {
|
||||
namespace eosio::benchmark {
|
||||
|
||||
void hash_benchmarking() {
|
||||
std::string small_message = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ01";
|
||||
|
||||
+1
-1
@@ -9,7 +9,7 @@ using namespace fc::crypto;
|
||||
using namespace fc;
|
||||
using namespace std::literals;
|
||||
|
||||
namespace benchmark {
|
||||
namespace eosio::benchmark {
|
||||
|
||||
void k1_sign_benchmarking() {
|
||||
auto payload = "Test Cases";
|
||||
|
||||
+3
-3
@@ -12,7 +12,7 @@ int main(int argc, char* argv[]) {
|
||||
uint32_t num_runs = 1;
|
||||
std::string feature_name;
|
||||
|
||||
auto features = benchmark::get_features();
|
||||
auto features = eosio::benchmark::get_features();
|
||||
|
||||
options_description cli ("benchmark command line options");
|
||||
cli.add_options()
|
||||
@@ -61,8 +61,8 @@ int main(int argc, char* argv[]) {
|
||||
std::cerr << "unknown exception" << std::endl;
|
||||
}
|
||||
|
||||
benchmark::set_num_runs(num_runs);
|
||||
benchmark::print_header();
|
||||
eosio::benchmark::set_num_runs(num_runs);
|
||||
eosio::benchmark::print_header();
|
||||
|
||||
if (feature_name.empty()) {
|
||||
for (auto& [name, f]: features) {
|
||||
|
||||
+22
-8
@@ -1,10 +1,11 @@
|
||||
#include <fc/crypto/modular_arithmetic.hpp>
|
||||
#include <fc/exception/exception.hpp>
|
||||
|
||||
#include <random>
|
||||
|
||||
#include <benchmark.hpp>
|
||||
|
||||
namespace benchmark {
|
||||
namespace eosio::benchmark {
|
||||
|
||||
void modexp_benchmarking() {
|
||||
std::mt19937 r(0x11223344);
|
||||
@@ -24,15 +25,14 @@ void modexp_benchmarking() {
|
||||
return result;
|
||||
};
|
||||
|
||||
static constexpr unsigned int start_num_bytes = 128; // 64
|
||||
static constexpr unsigned int end_num_bytes = 256; // 512
|
||||
static constexpr unsigned int delta_num_bytes = 128; // 64
|
||||
static constexpr unsigned int start_num_bytes = 8;
|
||||
static constexpr unsigned int end_num_bytes = 256;
|
||||
|
||||
static_assert(start_num_bytes <= end_num_bytes);
|
||||
static_assert(delta_num_bytes > 0);
|
||||
static_assert((end_num_bytes - start_num_bytes) % delta_num_bytes == 0);
|
||||
static_assert((start_num_bytes & (start_num_bytes - 1)) == 0);
|
||||
static_assert((end_num_bytes & (end_num_bytes - 1)) == 0);
|
||||
|
||||
for (unsigned int n = start_num_bytes, slot = 0; n <= end_num_bytes; n += delta_num_bytes, ++slot) {
|
||||
for (unsigned int n = start_num_bytes; n <= end_num_bytes; n *= 2) {
|
||||
auto base = generate_random_bytes(r, n);
|
||||
auto exponent = generate_random_bytes(r, n);
|
||||
auto modulus = generate_random_bytes(r, n);
|
||||
@@ -41,7 +41,21 @@ void modexp_benchmarking() {
|
||||
fc::modexp(base, exponent, modulus);
|
||||
};
|
||||
|
||||
benchmarking(std::to_string(n*8) + " bit width", f);
|
||||
auto even_and_odd = [&](const std::string& bm) {
|
||||
//some modexp implementations have drastically different performance characteristics depending on whether the modulus is
|
||||
// even or odd (this can determine whether Montgomery multiplication is used). So test both cases.
|
||||
modulus.back() &= ~1;
|
||||
benchmarking(std::to_string(n*8) + " bit even M, " + bm, f);
|
||||
modulus.back() |= 1;
|
||||
benchmarking(std::to_string(n*8) + " bit odd M, " + bm, f);
|
||||
};
|
||||
|
||||
//some modexp implementations need to take a minor different path if base is greater than modulus, try both
|
||||
FC_ASSERT(modulus[0] != '\xff' && modulus[0] != 0);
|
||||
base.front() = 0;
|
||||
even_and_odd("B<M");
|
||||
base.front() = '\xff';
|
||||
even_and_odd("B>M");
|
||||
}
|
||||
|
||||
// Running the above benchmark (using commented values for num_trials and *_num_bytes) with a release build on an AMD 3.4 GHz CPU
|
||||
|
||||
@@ -4,13 +4,9 @@ content_title: Build Antelope from Source on Other Unix-based OS
|
||||
|
||||
**Please keep in mind that instructions for building from source on other unsupported operating systems provided here should be considered experimental and provided AS-IS on a best-effort basis and may not be fully featured.**
|
||||
|
||||
### Using DUNE
|
||||
**A Warning On Parallel Compilation Jobs (`-j` flag)**: When building C/C++ software often the build is performed in parallel via a command such as `make -j $(nproc)` which uses the number of CPU cores as the number of compilation jobs to perform simultaneously. However, be aware that some compilation units (.cpp files) in leap are extremely complex and will consume nearly 4GB of memory to compile. You may need to reduce the level of parallelization depending on the amount of memory on your build host. e.g. instead of `make -j $(nproc)` run `make -j2`. Failures due to memory exhaustion will typically but not always manifest as compiler crashes.
|
||||
|
||||
For the official multi-platform support try [Docker Utilities for Node Execution](https://github.com/AntelopeIO/DUNE) which runs in an ubuntu image via a docker container.
|
||||
|
||||
**A Warning On Parallel Compilation Jobs (`-j` flag)**: When building C/C++ software often the build is performed in parallel via a command such as `make -j $(nproc)` which uses the number of CPU cores as the number of compilation jobs to perform simultaneously. However, be aware that some compilation units (.cpp files) in mandel are extremely complex and will consume nearly 4GB of memory to compile. You may need to reduce the level of parallelization depending on the amount of memory on your build host. e.g. instead of `make -j $(nproc)` run `make -j2`. Failures due to memory exhaustion will typically but not always manifest as compiler crashes.
|
||||
|
||||
Generally we recommend performing what we refer to as a "pinned build" which ensures the compiler and boost version remain the same between builds of different mandel versions (mandel requires these versions remain the same otherwise its state needs to be repopulated from a portable snapshot).
|
||||
Generally we recommend performing what we refer to as a "pinned build" which ensures the compiler and boost version remain the same between builds of different leap versions (leap requires these versions remain the same otherwise its state needs to be repopulated from a portable snapshot).
|
||||
|
||||
<details>
|
||||
<summary>FreeBSD 13.1 Build Instructions</summary>
|
||||
@@ -23,7 +19,6 @@ pkg update && pkg install \
|
||||
curl \
|
||||
boost-all \
|
||||
python3 \
|
||||
openssl \
|
||||
llvm11 \
|
||||
pkgconf
|
||||
```
|
||||
|
||||
@@ -12,7 +12,6 @@ Antelope currently supports the following operating systems:
|
||||
|
||||
1. Ubuntu 22.04 Jammy
|
||||
2. Ubuntu 20.04 Focal
|
||||
3. Ubuntu 18.04 Bionic
|
||||
|
||||
[[info | Note]]
|
||||
| It may be possible to build and install Antelope on other Unix-based operating systems. We gathered helpful information on the following page but please keep in mind that it is experimental and not officially supported.
|
||||
|
||||
@@ -29,7 +29,6 @@ nodeos \
|
||||
--plugin eosio::http_plugin \
|
||||
--plugin eosio::state_history_plugin \
|
||||
--contracts-console \
|
||||
--disable-replay-opts \
|
||||
--access-control-allow-origin='*' \
|
||||
--http-validate-host=false \
|
||||
--verbose-http-errors \
|
||||
@@ -46,7 +45,7 @@ The above `nodeos` command starts a producing node by:
|
||||
* setting the blockchain data directory (`--data-dir`)
|
||||
* setting the `config.ini` directory (`--config-dir`)
|
||||
* loading plugins `producer_plugin`, `chain_plugin`, `http_plugin`, `state_history_plugin` (`--plugin`)
|
||||
* passing `chain_plugin` options (`--contracts-console`, `--disable-replay-opts`)
|
||||
* passing `chain_plugin` options (`--contracts-console`)
|
||||
* passing `http-plugin` options (`--access-control-allow-origin`, `--http-validate-host`, `--verbose-http-errors`)
|
||||
* passing `state_history` options (`--state-history-dir`, `--trace-history`, `--chain-state-history`)
|
||||
* redirecting both `stdout` and `stderr` to the `nodeos.log` file
|
||||
|
||||
@@ -120,7 +120,7 @@ Config Options for eosio::chain_plugin:
|
||||
applied to them (may specify multiple
|
||||
times)
|
||||
--read-mode arg (=head) Database read mode ("head",
|
||||
"irreversible").
|
||||
"irreversible", "speculative").
|
||||
In "head" mode: database contains state
|
||||
changes up to the head block;
|
||||
transactions received by the node are
|
||||
@@ -131,7 +131,13 @@ Config Options for eosio::chain_plugin:
|
||||
received via the P2P network are not
|
||||
relayed and transactions cannot be
|
||||
pushed via the chain API.
|
||||
|
||||
In "speculative" mode: database
|
||||
contains state changes by transactions
|
||||
in the blockchain up to the head block
|
||||
as well as some transactions not yet
|
||||
included in the blockchain;
|
||||
transactions received by the node are
|
||||
relayed if valid.
|
||||
--api-accept-transactions arg (=1) Allow API transactions to be evaluated
|
||||
and relayed if valid.
|
||||
--validation-mode arg (=full) Chain validation mode ("full" or
|
||||
@@ -157,10 +163,14 @@ Config Options for eosio::chain_plugin:
|
||||
headers signed by it will be fully
|
||||
validated, but transactions in those
|
||||
validated blocks will be trusted.
|
||||
--database-map-mode arg (=mapped) Database map mode ("mapped", "heap", or
|
||||
"locked").
|
||||
--database-map-mode arg (=mapped) Database map mode ("mapped",
|
||||
"mapped_private", "heap", or "locked").
|
||||
In "mapped" mode database is memory
|
||||
mapped as a file.
|
||||
In "mapped_private" mode database is
|
||||
memory mapped as a file using a private
|
||||
mapping (no disk writeback until
|
||||
program exit).
|
||||
In "heap" mode database is preloaded in
|
||||
to swappable memory and will use huge
|
||||
pages if available.
|
||||
@@ -172,26 +182,35 @@ Config Options for eosio::chain_plugin:
|
||||
code cache
|
||||
--eos-vm-oc-compile-threads arg (=1) Number of threads to use for EOS VM OC
|
||||
tier-up
|
||||
--eos-vm-oc-enable Enable EOS VM OC tier-up runtime
|
||||
--eos-vm-oc-enable arg (=auto) Enable EOS VM OC tier-up runtime
|
||||
('auto', 'all', 'none').
|
||||
'auto' - EOS VM OC tier-up is enabled
|
||||
for eosio.* accounts, read-only trxs,
|
||||
and applying blocks.
|
||||
'all' - EOS VM OC tier-up is enabled
|
||||
for all contract execution.
|
||||
'none' - EOS VM OC tier-up is
|
||||
completely disabled.
|
||||
|
||||
--enable-account-queries arg (=0) enable queries to find accounts by
|
||||
various metadata.
|
||||
--max-nonprivileged-inline-action-size arg (=4096)
|
||||
maximum allowed size (in bytes) of an
|
||||
inline action for a nonprivileged
|
||||
account
|
||||
--transaction-retry-max-storage-size-gb arg
|
||||
Maximum size (in GiB) allowed to be
|
||||
allocated for the Transaction Retry
|
||||
feature. Setting above 0 enables this
|
||||
feature.
|
||||
--transaction-retry-interval-sec arg (=20)
|
||||
How often, in seconds, to resend an
|
||||
incoming transaction to network if not
|
||||
How often, in seconds, to resend an
|
||||
incoming transaction to network if not
|
||||
seen in a block.
|
||||
Needs to be at least twice as large as
|
||||
p2p-dedup-cache-expire-time-sec.
|
||||
--transaction-retry-max-expiration-sec arg (=120)
|
||||
Maximum allowed transaction expiration
|
||||
for retry transactions, will retry
|
||||
Maximum allowed transaction expiration
|
||||
for retry transactions, will retry
|
||||
transactions up to this value.
|
||||
Should be larger than
|
||||
transaction-retry-interval-sec.
|
||||
--transaction-finality-status-max-storage-size-gb arg
|
||||
Maximum size (in GiB) allowed to be
|
||||
allocated for the Transaction Finality
|
||||
|
||||
@@ -4,87 +4,84 @@ content_title: Block Production Explained
|
||||
|
||||
For simplicity of the explanation let's consider the following notations:
|
||||
|
||||
m = max_block_cpu_usage
|
||||
* `r` = `producer_repetitions = 12` (hard-coded value)
|
||||
* `m` = `max_block_cpu_usage` (on-chain consensus value)
|
||||
* `u` = `max_block_net_usage` (on-chain consensus value)
|
||||
* `t` = `block-time`
|
||||
* `e` = `produce-block-offset-ms` (nodeos configuration)
|
||||
* `w` = `block-time-interval = 500ms` (hard-coded value)
|
||||
* `a` = `produce-block-early-amount = w - (w - (e / r)) = e / r ms` (how much to release each block of round early by)
|
||||
* `l` = `produce-block-time = t - a`
|
||||
* `p` = `produce block time window = w - a` (amount of wall clock time to produce a block)
|
||||
* `c` = `billed_cpu_in_block = minimum(m, w - a)`
|
||||
* `n` = `network tcp/ip latency`
|
||||
* `h` = `block header validation time ms`
|
||||
|
||||
t = block-time
|
||||
Peer validation for similar hardware/version/config will be <= `m`
|
||||
|
||||
e = last-block-cpu-effort-percent
|
||||
**Let's consider the example of the following two BPs and their network topology as depicted in the below diagram**
|
||||
|
||||
w = block_time_interval = 500ms
|
||||
|
||||
a = produce-block-early-amount = (w - w*e/100) ms
|
||||
|
||||
p = produce-block-time; p = t - a
|
||||
|
||||
c = billed_cpu_in_block = minimum(m, w - a)
|
||||
|
||||
n = network tcp/ip latency
|
||||
|
||||
peer validation for similar hardware/eosio-version/config will be <= m
|
||||
|
||||
**Let's consider for exemplification the following four BPs and their network topology as depicted in below diagram**
|
||||
|
||||
|
||||
```dot-svg
|
||||
#p2p_local_chain_prunning.dot - local chain prunning
|
||||
#
|
||||
#notes: * to see image copy/paste to https://dreampuf.github.io/GraphvizOnline
|
||||
# * image will be rendered by gatsby-remark-graphviz plugin in eosio docs.
|
||||
|
||||
digraph {
|
||||
newrank=true #allows ranks inside subgraphs (important!)
|
||||
compound=true #allows edges connecting nodes with subgraphs
|
||||
graph [rankdir=LR]
|
||||
node [style=filled, fillcolor=lightgray, shape=square, fixedsize=true, width=.55, fontsize=10]
|
||||
edge [dir=both, arrowsize=.6, weight=100]
|
||||
splines=false
|
||||
|
||||
subgraph cluster_chain {
|
||||
label="Block Producers Peers"; labelloc="b"
|
||||
graph [color=invis]
|
||||
b0 [label="...", color=invis, style=""]
|
||||
b1 [label="BP-A"]; b2 [label="BP-A\nPeer"]; b3 [label="BP-B\nPeer"]; b4 [label="BP-B"]
|
||||
b5 [label="...", color=invis, style=""]
|
||||
b0 -> b1 -> b2 -> b3 -> b4 -> b5
|
||||
} //cluster_chain
|
||||
|
||||
} //digraph
|
||||
```
|
||||
+------+ +------+ +------+ +------+
|
||||
-->| BP-A |---->| BP-A |------>| BP-B |---->| BP-B |
|
||||
+------+ | Peer | | Peer | +------+
|
||||
+------+ +------+
|
||||
```
|
||||
|
||||
`BP-A` will send block at `p` and,
|
||||
|
||||
`BP-B` needs block at time `t` or otherwise will drop it.
|
||||
`BP-A` will send block at `l` and, `BP-B` needs block at time `t` or otherwise will drop it.
|
||||
|
||||
If `BP-A`is producing 12 blocks as follows `b(lock) at t(ime) 1`, `bt 1.5`, `bt 2`, `bt 2.5`, `bt 3`, `bt 3.5`, `bt 4`, `bt 4.5`, `bt 5`, `bt 5.5`, `bt 6`, `bt 6.5` then `BP-B` needs `bt 6.5` by time `6.5` so it has `.5` to produce `bt 7`.
|
||||
|
||||
Please notice that the time of `bt 7` minus `.5` equals the time of `bt 6.5` therefore time `t` is the last block time of `BP-A` and when `BP-B` needs to start its first block.
|
||||
|
||||
## Example 1
|
||||
`BP-A` has 50% e, m = 200ms, c = 200ms, n = 0ms, a = 250ms:
|
||||
`BP-A` sends at (t-250ms) <-> `BP-A-Peer` processes for 200ms and sends at (t - 50ms) <-> `BP-B-Peer` processes for 200ms and sends at (t + 150ms) <-> arrive at `BP-B` 150ms too late.
|
||||
A block is produced and sent when either it reaches `m` or `u` or `p`.
|
||||
|
||||
## Example 2
|
||||
`BP-A` has 40% e and m = 200ms, c = 200ms, n = 0ms, a = 300ms:
|
||||
(t-300ms) <-> (+200ms) <-> (+200ms) <-> arrive at `BP-B` 100ms too late.
|
||||
Starting in Leap 4.0, blocks are propagated after block header validation. This means instead of `BP-A Peer` & `BP-B Peer` taking `m` time to validate and forward a block it only takes a small number of milliseconds to verify the block header and then forward the block.
|
||||
|
||||
## Example 3
|
||||
`BP-A` has 30% e and m = 200ms, c = 150ms, n = 0ms, a = 350ms:
|
||||
(t-350ms) <-> (+150ms) <-> (+150ms) <-> arrive at `BP-B` with 50ms to spare.
|
||||
Starting in Leap 5.0, blocks in a round are started immediately after the completion of the previous block. Before 5.0, blocks were always started on `w` intervals and a node would "sleep" between blocks if needed. In 5.0, the "sleeps" are all moved to the end of the block production round.
|
||||
|
||||
## Example 4
|
||||
`BP-A` has 25% e and m = 200ms, c = 125ms, n = 0ms, a = 375ms:
|
||||
(t-375ms) <-> (+125ms) <-> (+125ms) <-> arrive at `BP-B` with 125ms to spare.
|
||||
## Example 1: block arrives 110ms early
|
||||
* Assuming zero network latency between all nodes.
|
||||
* Assuming blocks do not reach `m` and therefore take `w - a` time to produce.
|
||||
* Assume block completion including signing takes zero time.
|
||||
* `BP-A` has e = 120, n = 0ms, h = 5ms, a = 10ms
|
||||
* `BP-A` sends b1 at `t1-10ms` => `BP-A-Peer` processes `h=5ms`, sends at `t-5ms` => `BP-B-Peer` processes `h=5ms`, sends at `t-0ms` => arrives at `BP-B` at `t`.
|
||||
* `BP-A` starts b2 at `t1-10ms`, sends b2 at `t2-20ms` => `BP-A-Peer` processes `h=5ms`, sends at `t2-15ms` => `BP-B-Peer` processes `h=5ms`, sends at `t2-10ms` => arrives at `BP-B` at `t2-10ms`.
|
||||
* `BP-A` starts b3 at `t2-20ms`, ...
|
||||
* `BP-A` starts b12 at `t11-110ms`, sends b12 at `t12-120ms` => `BP-A-Peer` processes `h=5ms`, sends at `t12-115ms` => `BP-B-Peer` processes `h=5ms`, sends at `t12-110ms` => arrives at `BP-B` at `t12-110ms`
|
||||
|
||||
## Example 5
|
||||
`BP-A` has 10% e and m = 200ms, c = 50ms, n = 0ms, a = 450ms:
|
||||
(t-450ms) <-> (+50ms) <-> (+50ms) <-> arrive at `BP-B` with 350ms to spare.
|
||||
## Example 2: block arrives 80ms early
|
||||
* Assuming zero network latency between `BP-A` & `BP-A Peer` and between `BP-B Peer` & `BP-B`.
|
||||
* Assuming 150ms network latency between `BP-A Peer` & `BP-B Peer`.
|
||||
* Assuming blocks do not reach `m` and therefore take `w - a` time to produce.
|
||||
* Assume block completion including signing takes zero time.
|
||||
* `BP-A` has e = 240, n = 0ms/150ms, h = 5ms, a = 20ms
|
||||
* `BP-A` sends b1 at `t1-20ms` => `BP-A-Peer` processes `h=5ms`, sends at `t-15ms` =(150ms)> `BP-B-Peer` processes `h=5ms`, sends at `t+140ms` => arrives at `BP-B` at `t+140ms`.
|
||||
* `BP-A` starts b2 at `t1-20ms`, sends b2 at `t2-40ms` => `BP-A-Peer` processes `h=5ms`, sends at `t2-35ms` =(150ms)> `BP-B-Peer` processes `h=5ms`, sends at `t2+120ms` => arrives at `BP-B` at `t2+120ms`.
|
||||
* `BP-A` starts b3 at `t2-40ms`, ...
|
||||
* `BP-A` starts b12 at `t11-220ms`, sends b12 at `t12-240ms` => `BP-A-Peer` processes `h=5ms`, sends at `t12-235ms` =(150ms)> `BP-B-Peer` processes `h=5ms`, sends at `t12-80ms` => arrives at `BP-B` at `t12-80ms`
|
||||
|
||||
## Example 6
|
||||
`BP-A` has 10% e and m = 200ms, c = 50ms, n = 15ms, a = 450ms:
|
||||
(t-450ms) <- +15ms -> (+50ms) <- +15ms -> (+50ms) <- +15ms -> `BP-B` <-> arrive with 305ms to spare.
|
||||
## Example 3: block arrives 16ms late and is dropped
|
||||
* Assuming zero network latency between `BP-A` & `BP-A Peer` and between `BP-B Peer` & `BP-B`.
|
||||
* Assuming 200ms network latency between `BP-A Peer` & `BP-B Peer`.
|
||||
* Assuming blocks do not reach `m` and therefore take `w - a` time to produce.
|
||||
* Assume block completion including signing takes zero time.
|
||||
* `BP-A` has e = 204, n = 0ms/200ms, h = 10ms, a = 17ms
|
||||
* `BP-A` sends b1 at `t1-17ms` => `BP-A-Peer` processes `h=10ms`, sends at `t-7ms` =(200ms)> `BP-B-Peer` processes `h=10ms`, sends at `t+203ms` => arrives at `BP-B` at `t+203ms`.
|
||||
* `BP-A` starts b2 at `t1-17ms`, sends b2 at `t2-34ms` => `BP-A-Peer` processes `h=10ms`, sends at `t2-24ms` =(200ms)> `BP-B-Peer` processes `h=10ms`, sends at `t2+186ms` => arrives at `BP-B` at `t2+186ms`.
|
||||
* `BP-A` starts b3 at `t2-34ms`, ...
|
||||
* `BP-A` starts b12 at `t11-187ms`, sends b12 at `t12-204ms` => `BP-A-Peer` processes `h=10ms`, sends at `t12-194ms` =(200ms)> `BP-B-Peer` processes `h=10ms`, sends at `t12+16ms` => arrives at `BP-B` at `t12+16ms`
|
||||
|
||||
## Example 4: full blocks are produced early
|
||||
* Assuming zero network latency between `BP-A` & `BP-A Peer` and between `BP-B Peer` & `BP-B`.
|
||||
* Assuming 200ms network latency between `BP-A Peer` & `BP-B Peer`.
|
||||
* Assume all blocks are full as there are enough queued up unapplied transactions ready to fill all blocks.
|
||||
* Assume a block can be produced with 200ms worth of transactions in 225ms worth of time. There is overhead for producing the block.
|
||||
* `BP-A` has e = 120, m = 200ms, n = 0ms/200ms, h = 10ms, a = 10ms
|
||||
* `BP-A` sends b1 at `t1-275s` => `BP-A-Peer` processes `h=10ms`, sends at `t-265ms` =(200ms)> `BP-B-Peer` processes `h=10ms`, sends at `t-55ms` => arrives at `BP-B` at `t-55ms`.
|
||||
* `BP-A` starts b2 at `t1-275ms`, sends b2 at `t2-550ms (t1-50ms)` => `BP-A-Peer` processes `h=10ms`, sends at `t2-540ms` =(200ms)> `BP-B-Peer` processes `h=10ms`, sends at `t2-330ms` => arrives at `BP-B` at `t2-330ms`.
|
||||
* `BP-A` starts b3 at `t2-550ms`, ...
|
||||
* `BP-A` starts b12 at `t11-3025ms`, sends b12 at `t12-3300ms` => `BP-A-Peer` processes `h=10ms`, sends at `t12-3290ms` =(200ms)> `BP-B-Peer` processes `h=10ms`, sends at `t12-3080ms` => arrives at `BP-B` at `t12-3080ms`
|
||||
|
||||
## Example 7
|
||||
Example world-wide network:`BP-A`has 10% e and m = 200ms, c = 50ms, n = 15ms/250ms, a = 450ms:
|
||||
(t-450ms) <- +15ms -> (+50ms) <- +250ms -> (+50ms) <- +15ms -> `BP-B` <-> arrive with 70ms to spare.
|
||||
|
||||
Running wasm-runtime=eos-vm-jit eos-vm-oc-enable on relay node will reduce the validation time.
|
||||
|
||||
@@ -27,10 +27,11 @@ Config Options for eosio::producer_plugin:
|
||||
chain is stale.
|
||||
-x [ --pause-on-startup ] Start this node in a state where
|
||||
production is paused
|
||||
--max-transaction-time arg (=30) Limits the maximum time (in
|
||||
milliseconds) that is allowed a pushed
|
||||
transaction's code to execute before
|
||||
being considered invalid
|
||||
--max-transaction-time arg (=499) Setting this value (in milliseconds)
|
||||
will restrict the allowed transaction
|
||||
execution time to a value potentially
|
||||
lower than the on-chain consensus
|
||||
max_transaction_cpu_usage value.
|
||||
--max-irreversible-block-age arg (=-1)
|
||||
Limits the maximum age (in seconds) of
|
||||
the DPOS Irreversible Block for a chain
|
||||
@@ -71,20 +72,9 @@ Config Options for eosio::producer_plugin:
|
||||
can extend during low usage (only
|
||||
enforced subjectively; use 1000 to not
|
||||
enforce any limit)
|
||||
--produce-time-offset-us arg (=0) Offset of non last block producing time
|
||||
in microseconds. Valid range 0 ..
|
||||
-block_time_interval.
|
||||
--last-block-time-offset-us arg (=-200000)
|
||||
Offset of last block producing time in
|
||||
microseconds. Valid range 0 ..
|
||||
-block_time_interval.
|
||||
--cpu-effort-percent arg (=80) Percentage of cpu block production time
|
||||
used to produce block. Whole number
|
||||
percentages, e.g. 80 for 80%
|
||||
--last-block-cpu-effort-percent arg (=80)
|
||||
Percentage of cpu block production time
|
||||
used to produce last block. Whole
|
||||
number percentages, e.g. 80 for 80%
|
||||
--produce-block-offset-ms arg (=450) The minimum time to reserve at the end
|
||||
of a production round for blocks to
|
||||
propagate to the next block producer.
|
||||
--max-block-cpu-usage-threshold-us arg (=5000)
|
||||
Threshold of CPU block production to
|
||||
consider block full; when within
|
||||
@@ -95,13 +85,6 @@ Config Options for eosio::producer_plugin:
|
||||
consider block full; when within
|
||||
threshold of max-block-net-usage block
|
||||
can be produced immediately
|
||||
--max-scheduled-transaction-time-per-block-ms arg (=100)
|
||||
Maximum wall-clock time, in
|
||||
milliseconds, spent retiring scheduled
|
||||
transactions (and incoming transactions
|
||||
according to incoming-defer-ratio) in
|
||||
any block before returning to normal
|
||||
transaction processing.
|
||||
--subjective-cpu-leeway-us arg (=31000)
|
||||
Time in microseconds allowed for a
|
||||
transaction that starts with
|
||||
@@ -114,16 +97,11 @@ Config Options for eosio::producer_plugin:
|
||||
--subjective-account-decay-time-minutes arg (=1440)
|
||||
Sets the time to return full subjective
|
||||
cpu for accounts
|
||||
--incoming-defer-ratio arg (=1) ratio between incoming transactions and
|
||||
deferred transactions when both are
|
||||
queued for execution
|
||||
--incoming-transaction-queue-size-mb arg (=1024)
|
||||
Maximum size (in MiB) of the incoming
|
||||
transaction queue. Exceeding this value
|
||||
will subjectively drop transaction with
|
||||
resource exhaustion.
|
||||
--disable-subjective-billing arg (=1) Disable subjective CPU billing for
|
||||
API/P2P transactions
|
||||
--disable-subjective-account-billing arg
|
||||
Account which is excluded from
|
||||
subjective CPU billing
|
||||
@@ -133,8 +111,6 @@ Config Options for eosio::producer_plugin:
|
||||
--disable-subjective-api-billing arg (=1)
|
||||
Disable subjective CPU billing for API
|
||||
transactions
|
||||
--producer-threads arg (=2) Number of worker threads in producer
|
||||
thread pool
|
||||
--snapshots-dir arg (="snapshots") the location of the snapshots directory
|
||||
(absolute path or relative to
|
||||
application data dir)
|
||||
@@ -144,21 +120,6 @@ Config Options for eosio::producer_plugin:
|
||||
|
||||
* [`chain_plugin`](../chain_plugin/index.md)
|
||||
|
||||
## The priority of transaction
|
||||
|
||||
You can give one of the transaction types priority over another when the producer plugin has a queue of transactions pending.
|
||||
|
||||
The option below sets the ratio between the incoming transaction and the deferred transaction:
|
||||
|
||||
```console
|
||||
--incoming-defer-ratio arg (=1)
|
||||
```
|
||||
|
||||
By default value of `1`, the `producer` plugin processes one incoming transaction per deferred transaction. When `arg` sets to `10`, the `producer` plugin processes 10 incoming transactions per deferred transaction.
|
||||
|
||||
If the `arg` is set to a sufficiently large number, the plugin always processes the incoming transaction first until the queue of the incoming transactions is empty. Respectively, if the `arg` is 0, the `producer` plugin processes the deferred transactions queue first.
|
||||
|
||||
|
||||
### Load Dependency Examples
|
||||
|
||||
```console
|
||||
|
||||
@@ -51,23 +51,6 @@ Config Options for eosio::state_history_plugin:
|
||||
number of most recent blocks
|
||||
```
|
||||
|
||||
## Examples
|
||||
|
||||
## Dependencies
|
||||
|
||||
* [`chain_plugin`](../chain_plugin/index.md)
|
||||
|
||||
### Load Dependency Examples
|
||||
|
||||
```console
|
||||
# config.ini
|
||||
plugin = eosio::chain_plugin --disable-replay-opts
|
||||
```
|
||||
```sh
|
||||
# command-line
|
||||
nodeos ... --plugin eosio::chain_plugin --disable-replay-opts
|
||||
```
|
||||
|
||||
## How-To Guides
|
||||
|
||||
* [How to fast start without history on existing chains](10_how-to-fast-start-without-old-history.md)
|
||||
|
||||
@@ -29,6 +29,7 @@ The `nodeos` service can be run in different "read" modes. These modes control h
|
||||
|
||||
- `head`: this only includes the side effects of confirmed transactions, this mode processes unconfirmed transactions but does not include them.
|
||||
- `irreversible`: this mode also includes confirmed transactions only up to those included in the last irreversible block.
|
||||
- `speculative`: this includes the side effects of confirmed and unconfirmed transactions.
|
||||
|
||||
A transaction is considered confirmed when a `nodeos` instance has received, processed, and written it to a block on the blockchain, i.e. it is in the head block or an earlier block.
|
||||
|
||||
@@ -44,6 +45,16 @@ When `nodeos` is configured to be in irreversible read mode, it will still track
|
||||
|
||||
Clients such as `cleos` and the RPC API will see database state as of the current head block of the chain. It **will not** include changes made by transactions known to this node but not included in the chain, such as unconfirmed transactions.
|
||||
|
||||
### Speculative Mode ( Deprecated )
|
||||
|
||||
Clients such as `cleos` and the RPC API, will see database state as of the current head block plus changes made by all transactions known to this node but potentially not included in the chain, unconfirmed transactions for example.
|
||||
|
||||
Speculative mode is low latency but fragile, there is no guarantee that the transactions reflected in the state will be included in the chain OR that they will reflected in the same order the state implies.
|
||||
|
||||
This mode features the lowest latency, but is the least consistent.
|
||||
|
||||
In speculative mode `nodeos` is able to execute transactions which have TaPoS (Transaction as Proof of Stake) pointing to any valid block in a fork considered to be the best fork by this node.
|
||||
|
||||
## How To Specify the Read Mode
|
||||
|
||||
The mode in which `nodeos` is run can be specified using the `--read-mode` option from the `eosio::chain_plugin`.
|
||||
|
||||
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user