aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMITSUNARI Shigeo <herumi@nifty.com>2018-09-05 22:07:14 +0800
committerMITSUNARI Shigeo <herumi@nifty.com>2018-09-05 22:07:14 +0800
commitf71bb89366c9fd7ac2d36dfc1c4ac244b6879b27 (patch)
tree1df8b970fd32dd1a043063ce4acf04c5a2ca9e84
parente8c418193accbcbf28efba4c4527768f8cc4c326 (diff)
downloaddexon-bls-f71bb89366c9fd7ac2d36dfc1c4ac244b6879b27.tar
dexon-bls-f71bb89366c9fd7ac2d36dfc1c4ac244b6879b27.tar.gz
dexon-bls-f71bb89366c9fd7ac2d36dfc1c4ac244b6879b27.tar.bz2
dexon-bls-f71bb89366c9fd7ac2d36dfc1c4ac244b6879b27.tar.lz
dexon-bls-f71bb89366c9fd7ac2d36dfc1c4ac244b6879b27.tar.xz
dexon-bls-f71bb89366c9fd7ac2d36dfc1c4ac244b6879b27.tar.zst
dexon-bls-f71bb89366c9fd7ac2d36dfc1c4ac244b6879b27.zip
use precomputed G2 for BN254
-rw-r--r--src/bls_c.cpp22
-rw-r--r--src/qcoeff-bn254.hpp72
2 files changed, 92 insertions, 2 deletions
diff --git a/src/bls_c.cpp b/src/bls_c.cpp
index a03850a..d46a15c 100644
--- a/src/bls_c.cpp
+++ b/src/bls_c.cpp
@@ -27,9 +27,27 @@ int blsInitNotThreadSafe(int curve, int maxUnitSize)
int ret = mclBn_init(curve, maxUnitSize);
if (ret < 0) return ret;
bool b;
- mapToG2(&b, g_Q, 1);
+
+ if (curve == MCL_BN254) {
+ const char *Qx_BN254 = "11ccb44e77ac2c5dc32a6009594dbe331ec85a61290d6bbac8cc7ebb2dceb128 f204a14bbdac4a05be9a25176de827f2e60085668becdd4fc5fa914c9ee0d9a";
+ const char *Qy_BN254 = "7c13d8487903ee3c1c5ea327a3a52b6cc74796b1760d5ba20ed802624ed19c8 8f9642bbaacb73d8c89492528f58932f2de9ac3e80c7b0e41f1a84f1c40182";
+ g_Q.x.setStr(&b, Qx_BN254, 16);
+ g_Q.y.setStr(&b, Qy_BN254, 16);
+ g_Q.z = 1;
+ } else {
+ mapToG2(&b, g_Q, 1);
+ }
if (!b) return -100;
- precomputeG2(&b, g_Qcoeff, getQ());
+ if (curve == MCL_BN254) {
+ #include "./qcoeff-bn254.hpp"
+ g_Qcoeff.resize(BN::param.precomputedQcoeffSize);
+ assert(g_Qcoeff.size() == CYBOZU_NUM_OF_ARRAY(tbl));
+ for (size_t i = 0; i < g_Qcoeff.size(); i++) {
+ g_Qcoeff[i].setStr(&b, tbl[i], 16);
+ }
+ } else {
+ precomputeG2(&b, g_Qcoeff, getQ());
+ }
if (!b) return -101;
return 0;
}
diff --git a/src/qcoeff-bn254.hpp b/src/qcoeff-bn254.hpp
new file mode 100644
index 0000000..e547731
--- /dev/null
+++ b/src/qcoeff-bn254.hpp
@@ -0,0 +1,72 @@
+static const char *tbl[70] = {
+"1b52b2cb2d502a93b7c05d4791c014160c9d83beb3b5aba6854048102ddf59c7 13e90f9a1bc21c7fca32694f409ec90acbc812ac347d6408c918c9ccd6dc53a8 f827b090f207dc7838bd464f474a56d98e8f2d62ec1ab7441db004c49da3390 11f2c85775596e7b1912924a51eb1265e5bd3587d018f61c83e3509e3880304 16c38b6b4655bdf0e1bef98115ac6dc037e375e665c131aca3de3c67426df9ab 222f7b591fb3ab370c75a420c897ad2c32afef3e43832646f178637e4dfe5f5e",
+"1ff6cc54c38c40c357f48e2f02e3b4792d3fd9a4af7017ad29607ffe840da6d2 16485bd845090eb2dee3ebde790bfcf008091b18b2162cd02503f1bc34d355f4 1309baff0e0119da07692365975019e224de285f490375227bf8d6ee0dd01791 2098bd6f42be51842e51be66a4ea4493d879a3ff9c891c01ddee1cdd21e15b57 623c37310510a9f2e694ce48928cdfdc524f6b7c8f832d152cdab0b651a96a7 e0b727ad6fb0a25c58b48bc49780be7d4e15de7e689b9a80a3abc4f26b8808b",
+"a523954616b9e17b6d9975fa5c91114282732b87aaf9780ad8f441c29815571 18e63eaed66a65424a83661d7a5a5177a08fe29e6d172f3b00e81e3852ae78c2 3dd6050ad1196f45f395694f8f58c9ec5b9dded8b2edba787054a2a356d5cc5 18acf738415a72035b5794f584091df7a2ca355fb9b6e29b19e288d29a461e89 18904ce9176b216469a1f5625f074a2f912436b14a8e16f7381d7808e21dc14e 1efc40f5c4932c31088877b883c6aceca137c1e84dea3575df24f4d4a83c83a4",
+"1c4def3d780c50d9a3463779e25c5a63a89fa9afa26259de802b2f0c58bf85db 1b664dcbb04fd046ea8efadfa4c5ea8b488a151bee526a6dee8a5f64c732fc2f 88e76a45d3336dbca2f126545f63752a4eab48228430fbc3057df263007f04f 6f99fdd0b9c8a75bd10fd11d661c628397f5ea277be4c725181c25acd6ab211 1eadae6a200685663bdf6986de1216a5dc6a3885596800b9e668f836e34f9ff7 189efc062fe812357213a46d30a3bd8510c41e19d71ad649ba62aaeaae955b46",
+"45896e8a7177b4b057f7a9554aff91abcbef032c43661f286f532a56424fd26 a28831c2345bb827c044fe6ebafef010afa04bf2f965cc1d1756ddcf1e00aee c0d2b7c50642bec548b36c40ad67205e51d4ab88fabf1c6d91f2f6770ae6cad 21d240e79528dd87b977e8a1253adafab3ce9398d5c6277f856c89f2455c1aec 99cd08ec142d7caf0cccd4a833780bb0b41bc5584f6c8363436ee276c20244b 26dadaf2a772cc445ab089066c14168d82cd7faee55fed0819aac24177ad3b1",
+"15e9e60260277950aae120e6135f7a9feee9efe050ebe3f16e8c914241f2f596 1f57d920dd187e0eae80f08ec81faaea6df1822699ef8b99259d0736db2a646e 1f5d71fc178236f0e6480ce8810b9c51c5aaa6cef8c527fceb0d7ab56a89278d 1004a72ab9515a7da301afb1a2dbd7380deab8c721120a9288231309c8c1f7c 61067d9da7197ef949a50337844a7df191dccdfa8694f6ab98a3991534be055 1c01d7d99a7d90412df95cfa37c3f290766672f15a1fc92e99f8de34345e8a32",
+"22efa6aa589af721d6281c579c20e0c93384fe2e4c692e07c8aeafc67f7f638 6373086b1f49d78eea130adbc96b91d5afe6731e0a9b9929e44e3683ba984b9 19457e9473a6f84c4542be94e35c0fe6513c4a2c5e2059f3b3c8974aaed73af1 2198973ede407aaaca0d347e593109df9e6d4068b219fbe6cae267a7c5448193 1880e4de226bb607a0dc08bd270448171d27bcd1694ee67543713286ab3c79e8 1442b670af54c4b4fb64917f6eec8c99961336aff83283aa2260c42457e927c1",
+"f0818e61cc997e027235c20b8d9d81b5b8459b275c1e903a56728c282aa4e12 35efbf2d50fe1ec184b2304ecff69d021fb1efaad35245ace6f6a25b75fd088 213251f906ae22a38166b2fea66b2173770f4a6e4ddc81284dd7b39986738756 aa5bd3634d1d41bc31d6f269522a2f80333d13803be980dca1f1e90b28e8f5b 19ace1ce3958e43f12d2478657a1fd75434650315780eacd881ff7b4acccd856 1b78bc90efaef58b56832328d890111a034c5632a34e19a6fc97d755f6930975",
+"e6d561463db9e5911ac3474d083bce57c4610488b6fa7aeb7305ef08f58dd5e 242293db3b044f5c371b142448cc1fd37c16f3993f8e575e811623a82ab0badd 1f97163c7ce3b19499df6b48fd73cea2e45a71859a15514b81b404ac2398aeb9 ed17908e97c6f91163e548d85a96cec94d10c4a1216a453b00c3c3e8664ec8d 10396d28e1cd66dad3909ac304e9e30e4ece74c7a6a75edcaccf85efdf3a7563 1aa3cd513a254e6160503ba1efcf5582c6d1bca35be2c12e31c46ad75bae5bff",
+"d7997c717f4a345bc21f42135e9cfa9a8b695db17acff2d7484e2f946b38bdd b396977204ac857087a33129b21794afbbc26c43f588ef750ea10ba1f8c680d 8bd55e968902e1c931e07114cec6beb17c76661e525bb9c352f553f338daecc 7f353a8762274d31466ca70fb258b9228e1e0d14bfe0d965188f1b27906334a 16a7e0733f8ba831d2d53116f2e9273bb7fba0197263f0d8a69cfd392c7c3ab7 dbb64ae28a05409f5f068f7bacb5b94417859697437c947e7bcace207fb4b39",
+"242b7242c7aa7299d85aab4d5ad21ea6fb110141e8acf0a886fb5de1b1b43d5f 83e86134c3ce4ad18e9fc7e964e89e12c8c5fc592bbec2551e97513dd0381c6 1d740e2f12947b4274600e919ddf964758131b44c181fdf7fa5fc8ef49b4f303 12e9ad8ab9aa2055bc43a91bd137a0881637e78e950d309617a30073e0dc5bfe 1219d80a6dc91fe89ec7348a03299288b71be7143498c443625c523d35a9ddbb 20f773fe4e930106ef2a1036d2cea751eab6b8b854e9a4e82be4d5e1edfed2ce",
+"5d245db490c0e0f2cd8f1644cc477169b7f15cc6a0b4bf82ae6cbdcabab45ca 1e98d4ada0d1392c12a455d53d41268bdeb2eee86d2841e82f3bdbb6eeeaa2cd 10cf17dd3ad4ae7bd7c1a9685ae005b9b0378c3a660efc82461e88885b46acfd 1e3bd8a6c61c1174b5cbf3ac60769716a9a9945884de06e72d1896afcedc2c99 92769f46c19288bc308ca5fdfc1a56297ca28ee9702383ed2babf83a3bd0845 3f1e6dea8a8b70551132b40b05428a66c6f5e75092e930305a8130787d824b9",
+"12974aeacc98ac036746219df281dc5ed925be50fe29f1a282cfccbbbf1fd319 ca112e88298fe5577133a373b73a610cc25b5d69c6c42a1c0f0de954243427e a96a0f7a6c342c762197694859d6ab4ba811c0ada4d44b42729196fa7c1bf4d 2e5fdf48bcbd1f2afaf24faf1220ca1dbcc34ba6fd74b0ddb936485c0f7bdf5 18391f1d234fdbe116cc11226eea6c05cd01207b4dae4f0c0933fee8f410fb32 46d2f22d2ad1f9c2f6fd1fb856629044881e75028a43c8a52764e868ee4c9d5",
+"f804aec661585b7e89957e2f366cb2a6c3cdde1ed7ae33efc9dfb4bcf87ba8b c473f86e2f4dfd8124abf8d32de417a6cd4064b629006ea2089d259d8c35f6a 1e2cd73dac794ff0b97110438c71b615cf11e7e5de9d80031ee509cf6a239028 1d4963f22cedbfa14329fa35d05c384375813a44a3ee781f3bf47ecee963a1e2 140bd8af025f723b32e2411036d34d15616a1a617d4b6d96a69000de1e03dd53 1d9f5c1bfb57ccba47a967a6591e818f5eb7b9ef5130ffecd50023dbedc7bf1",
+"8ecf1f3a191043a6ee1bfe676abb84e0dedd12637264b665b312a93d190ec0e ee20584b5b769b110ecf8e098359e75fdb62aa545d33c42a76fa22c8b835ba5 17f50dba36492ac7b53d45fa6693103ec2117fea4cb68d72d0bacea3b2b3f6ac 22dd94c273cfb529baf7bc80531ca7ca27180aa2f0a2ba98e9000b999990abe6 eb7210fa9942b48afa765c6deb51b2083a014ac8371073da844644fc5c362ee 144120ec2af3a6a1105e8914f70225b67aa8d07dd4fad9e4b1b3dc569d06acfc",
+"299dab78c4c5d9a5e3f7b9563565abb22f662e80c83a5c8e43cb5fc4e987d18 ab9672680e8e4ee978b2fc4175469841693d6ff09623ff9881bfcfc1e39d01e 14e119e2374a56340a1f1c68ada80b39ff1dd4678cb7f5aa05b0ee79620b1719 7b63466bad7683a5645f9498ad592f5373ec70c47b473d50a502ce26d93a02b 114db7c1e0c0f6768b485c79b275ef75f1d3aa1fb5b617beb0761a7887ce5397 8034b004f185d07c1c4d9d5dcc27a9ef4c26b1bd1599e67c871a8c7dfa0b4f0",
+"19397b5b6974b5019a5a6a6fc2cb5fafa2e983dcd9db756b754a5df13dad6127 7c67ca492c2ddcbb1e13557fc4a8eaaf9832206c6c0c1ad39c3fb439514a05e ecd69ef65bd1c92dd9b7cc6ba45f644adb518cf69f66615435e9b989063e5bf 24bb01847833ad5073e68b2b9893f5c970e8be8635f2d3a352b3a77af7c87645 126eec3bb70cdd79502dfe6b72c8eeb2cde713394ee6d7c66bd14df7d8d722f3 1aee3bb3dc21017c6d7a11409b60877abf1c31f630016266b3c882e9f29182a1",
+"1f8b9140c44ce1c2b6295ddb30b9f39a6db29b466c34fed193e5c3417505fb58 19c3af2d46840b589aa809f095ac6dd338caf7660711772b25445756cce34c5d 73b7725029d3dd54de301a7e542ea3b47d698ad8698dc9882794be7062f87d 48b36d7e748407f3199172db841086af154ae40715e843e443a605f2a145e9a 15eb897fa2ceaf6c6c024d7573ad118156905456f9e083d9776403b1b5b44220 11fb352937adc81d98da98106b801bd348e31fe6f2529814745b8888bc5cb495",
+"1f3760d9ba2205fd36ad71034ea0026a43f70e35049421917599c613e7f8e39f 3deb7acdefbc04dbcd81871bcbb1758b9529eba6bb47574b62ced1b2dea74ed dde67c17ad0b19e0a5239bdda0fd02b9ca83973a5273902eadd1faa1f39813f aa5dea589041da30b72dacad11ce41ab9b0caea68e4011daa33b417de1a772d 2418286acc1eb9195fcc208190b162da16f00a6f77a4fdcc539db18c802a3fc9 f4d05188eef03110ba81f14a9d8bde05e80eb22ba298756a0052644b58b1eb6",
+"1fe799facd74fe185079b76f1cb86fa81b1d2c59e1840d1c5fb0e8e13004d840 22f1626fbe5f1b50e586b11f04b75d8bdda2a2711868e2766ff96763a73b015d 2ad500c6115f11cb9b9db47967dd273146041506650099700b75dd90fa100d2 234e1077518f519a4292242366d0a00d8498f4e0234ba3da1bd4fa135be2db45 511c07b820c45e35dd9111e918794a60f8843b6a0cb48ad4e7a8b67f5d2825f c420e7e5b0b89639bdfc6f5ba0543f09a6b7042655bf5c3c68a914e97e8ca65",
+"734810c904c768b635f70752e4f3f7554fd02a17ede26cf58be484f58ae0369 156014198774b7eb6618cbff5a4355928e1fb0bda67aa78d64841d2a7ed98c8e c0028f1390f65fb453250903990c8b201f232293ea1910ffa8dbef6b00a35fb 9daa477756ee1f043d275af9649d4fbc25f623f2514c3188fd019d89137bf62 21165449637930b93044093928c28e70025ee06720277f46d596b06ce54295a9 1ca353aa98964a0c6c1e0154f029940b430f786cdfddcc93e898e3f0a8f84bfa",
+"1d9e235c946ce4e4ce949bc9e492cdc01358066a67b3bafb192f93ab2ad63bc0 abe18528a9136243e61d5fbc25f81c9b97a67d27d43b7d8c5726ad1a679f30d 14616faffd36cff47f27b30c98def2babbef22a10aac91ea9591173aeb188579 1e63af3bb34e0997ede1925525b471d5d1556cf72573503b2aab841744e6420a 230def6f589292cfabdda85d8b850d4a1e1b484aafd23eca691d07ac518caf38 1349c7b74654f2170c69b88415b14f5fd5716223dee4defed854650e2d6829f5",
+"1433868ce70016f8d9bd10989a61b7b8987c52b55e2f3543f96597d60e65cf03 c36abad808064bcd41c619593cb93838f0d04b02aa47b246ac50d1a7da73190 1b283c071eb86f2a1225facb64cef3c5e8b1c09213a23e53ac233fb3f78dc74e 42440cf187f904ff693324a66402037d23a44e3428d8f3c2a33a0a88dd0a5d5 1aaf821ab6988e420db38b6db055e59abae6376dadf72ab5919389f67b06685f 22c3a961140700309bb84c95c571cc20cc137c12907a11f548c068038c942cf9",
+"3a48d5a72d7595a93a2a2c879680820fccef72e53ee10e3a9c22752ca3276c0 1b3208ff86bc8e7e4250b18a12babeee5bf1468e85d21129520f266575366cd8 2081f2ae5c38ef371f3b646355837c7001bf8689186a5331bc4063e3934e464f 124bc9d31abcff7413160e8f92c600ba7f8b55ae95968dfa62fc9520956b383e 218ae52d314fc33babec28393661684e6478bb984c181a6334c053f4b3c9637c 1d811b283462435c0910ab169bf8495292969e731895e25d070a05433920bc9f",
+"e915c585dd1bed6f5be2e2e5c120ad9c0e256ea826e97c51d47d680d3ffc1ed 1beff7a9dcf60df17bd151782ec9b92b18880f4c6bd98266e959679ad537f24d 1d8f0007734eff7ce94943387fa1adbe3aee716c3774ec437e921d8d714dcad3 246d8d6fa9406d534baf4c45c2d2f2e8b3ee63fbe7b9f8188c7615c43694c7c7 fcbf57906c6b8627e51567c88c4a634ebe3ff278a306780b58e25f265926065 1a85e59538c7c1d7f88ac93b34e99df05dede64585393b1a8102dee6fd1fa9b7",
+"54052b0eacd2c3f48c975e82c1e88d02ac1e34208c1826fbd000fb5d16960ca 19583cd06f4bcf4563083b8e57d9591326e4e077654aea451fc3a4fa8e60bc9c 104d08637f7e3f161986456efa53a1b92f566e61d3c344aac04a47c9f5a491a6 24e10471810a5f1ee13ded704a26e1606228f31afa1b4fece58880df12e599f3 122aacb2733ba0a4ea6be3f96efaf431087a9348050a98cf583a2fb003934c28 6ef9f5f7bbbdcffda61867c600bb2cfd57b6756bb798a8b69ce92b2a81bb682",
+"1f6261228b9e3a39bc3c9e198e89890dd37c86ba26549e00f0cdd8d5066034b2 b98c2aec3085acb4993639440a3079b5eafc5b7ca6b484018d6ebb89d66894d 1a2e2c8ed008a6027a3a51dd9b403d158c9815bd900509a1d264bebf32545911 a5152df4f4bb5882124b1ea66056ba720db09931893955715948ba31e7fb20e 17abda5a5afbb81dc4903a19d320d246c43c695a9151ceced6ca9a0d4abddd09 17ce93aa7f50ae70e39f3b66d887671cba8a0092a78d6b83d02e82a2209b16e7",
+"1953b4e0de4f64d8571733b720d2ed1c860c268d0c8c90f4bfd0fef1a1897926 af2aecf758b389276de5c959ea91b9c2c869be7dea5f3b7d59252f1a984ad45 170edd20dcc8d0e730adae7710245d5481b62364aec5bf8c7b34fdaca7c111a8 13b243e4fc86d88a0ae905c1b3496f10a205a15068635eb7047d2107ba1068d3 ef8ed5ab268067581cb1c8efb2faebc2060d81a513c02dd3859cc1ba8477da7 10798174c0a729496e2b6b8135ff67d1955774c3dffdd8ae3f6fefc07d30433a",
+"c55a73d0c9f40a2b788942733ccf376a0fd23864c729f4df3e965967ee9d997 7410f999716af9a823f772d9763c07e1d53385398730602fb2d193c70a6e851 2adcc6fb476b770ef65eada638492d0df5637962e894631df395108c49cb765 230830972b2a3d78dcd4a5d1dcbdae2ba29406e21bac4e7f35d7001782bd6642 187ed7f0f2d352ae7200d4a638d795fc1d29880369ba491ddfbdc558378e6987 6300eefed5f5f9de4a029a31ad3d1da11d652c7abc3b30d8e3a21c439fade9e",
+"1c8ec4cdfad4644f6ca59dd8a9f8dbce537b6f4cde131c6151847b7dc0c5b5f7 b3f34712de87be4c7ee6025ca8011d7bb24d4a10cee5a56951f853b7e5ae882 ac972e4859f1fb990ec1df66425581edd6bb56b785b54eae962089175b02ba d0d255d2e71b36237bcf41b394acac272eadd4b1a37690a07e25f4fb88c8b01 588e16286124cc9d756466df335b55f1dab433645cd36cc694a6b1513c1a732 bc1c50a662ae1b2cd740710c07c3f139ae37a4344e89ccbc9492e81187cdf4c",
+"d2a9dc05308c3043236832925aaede5af46c60f70796ea8d5798e039d47cec7 1778919339872ada68c88b11b9184ee1793a17f4268c4b08ae4eb6d2826fe706 1d2af0de1387dc68b58aba61533c620ba20a2085eb3d97b0a15d4c8f51689300 3c2a7c2c183e7333e572de6c265b53832116829e3b8ddc98915606be59971d 94251b3ed13fcb65c0be4960e0d44f162050334a55d142ae1f727cf70116205 caba50fbe6e12b6753529a01386d20b7f464866b7557e8c6b6d99ffc2c6e677",
+"2a8ffc62ffe4a4807e63e94d74425811ea6a698a00c2d3d0ee04a38b55974b8 43c8c7f009fa65da6e3717c167a7ed5b87154e4a84f48e43f8409e1b9dc1262 d86b0da162d8a05082c33d5160f4349973a140ad36a7117eae2d3f006e9a9fe 304d4fabcc8a3a910b4c13a2d98dcf47d08547e86d7a739315f6b45720aaf8c d35c9766ab1ef6323b33acb6ac4eb7e7a7c1362784b157abfbee998cc9b596e 1a23bc170f79849c58165572a95aebe546d025efb046d4bb8dc0c7097ed60113",
+"1676786db9da9ee98f082e664151ee3cfbc4822d27cf1e64ba1269612a032ce9 219b0941ed6f5c4f5706a73ec1425ea3879fad0c65f81df2cfa271d2ba8cf729 4f620499dafd2ead0791d9cd0af59959851505ffe3ff3acf44e2560b4f5c30c e8e6bfdce08939790176b6273bbb5c2c419372858806afe0456a5eba0e101ae 4e4dc2cc1ee984012b0f7acb5a6b89e969fbd30b638817713a014749a49b086 4b02d0a164e53d7812c16ae69073e6e410d6e234d7dde31d736ccd23468f426",
+"205f2b26a810d795537e1c417cc6b419025b79860a9cf81efffa5efaa3121b5d ee0b74b1d39ae2258a72025d209506506f190be15579ea015d7144d2c6c7704 2282576ed752d0faddad868f76c9b50e719d327dd57ed3d65b46382075bef29d 41768c8c702c76403cf1d4350b196f3df74c64ac2a1e4fa089d0900c45aca67 154cb357b99970b40ae0901d3d72dad5674449f407d3e368cf8b305e85b8ac7 24e30be5840b051c87f98aff6735d0b9804aeb5510adf213d5c21f6bc5bf7abb",
+"1be29c2e133d1013094b59edb9ba71b47ae4e84247abe788cec4f2f79d385d41 13be740b6671dc3f588bc41b9082240a6994cb7eee8e33a8f45d13cfdc8d6203 1bb78cd9772146bfdfc86eb3d9b0b29c67b1f8feff5da8d7ec3c7774329f54ca 10f0f3ee2f1bb38840cf0b43bb7cdc64894986680aa673c24771efb09793d7ba 1bee7763894d328fe976a43a2b291b67073704f49fa6219f9f60ab18808cdaa7 13ba832ce0e466671c3ab263825310451cad68982129dfa1f51734a2fe2ba24d",
+"222671f5cbfdbd64a13843ac77d92b12453e96744c85fdd51f4e1c28b85ac524 10e30b990c23ef304d2300db636fdc3e750873207f9b0925657f2e9e3054588e 1e627020614901fdf37fa78b6cbad9152a72d7af6affa5c5fd406451b3034882 a4b758749092553ea5ef27f857492327f67b4336629e9e76241ef60388218aa 16bc91cbc98add458d5cd811e34847af7678802cd91232a5e8a79a46ff761edd 14580ff966b4178a369ea9d303fae85abe2b69ce77c44cfe3df7a2cad346d12c",
+"4451e4f92f07896229284ed920d8aa778d4de99b1c19b0e89a1c3380b3dc17e 113a05f65d747c781feb44c7e02b75c95d2476623a862ead3425507007e23a3a 1a2afbda930c694092aa8cd562e26b69e148282b1c0e51667cf37e917b971b43 235bc0ecdcf0da06e01d51475e6e28ec11af6c7406f98cf5590545ade8ca3d6a b6d9d8ca5a6f68ed96883457ff6a711e3c8ff702882b20fdf08de02dba24269 1eaf6537fa7e0224b05b55b14ebf339b63562dc57a46babffe89c92ff294cae7",
+"5c1645d5882bd2c567007cc011839917f9adf1b247e4cf58767a594dbf334df 20d0f6541bd75f9fbae1688544e264d242ee02faa2d4efdc20a8682ebbbef9a d8794675daf17062d02273a26d7453507bf673a914b1ec0cd965108968931ae 1625e6f9a34aa5a88a0adcb214f5031718b459cfdfb48a7fd0417e20a8b38a64 154ae02748725114a08166163499f61ec39b520cbd82247fa8970f097d384dae f249586ae878db14dc3a9dc5d2e58cf26e76c34c04be2e023f8491a3e6ec2cd",
+"1e03843f4c664a49ef0ae0c052b0a202c643a76e2e201daa7a8fee125e13fb83 1943554258015a6c8bb82ad553d37518dcf137fa6d751644e24fbccbbef7119d 10aa67e2ee1742061352b522f20d68aaa2bd7fe552f5137934b6f40577f582f1 f130521a3be055e20c6909eb8f8023ccb5e2bcb935fbe97df034d337af5fc46 1c8d71143b4a83ea3523a1b315e8f3f0b5fe602f7106a5e7bde03d08174d05ac b903706aa2837cd7ff5b3a7b983d292cc31579637a5892528825293853ed2d6",
+"1413e912d927e5e7742f4c8516ffe946cbf05a6ec6bd25ea9d83eb71b4eb936a 23f5e1e7a267cd84b2d4be329c65223586685a021b141f140ecffa9bb0bf4430 1e84e5bc32fbbacce25387aedf70cc8c63f669ac6d12148b1bbdfaa9420522d8 f81641ef8c5728eb3da4a8c071f0f4d6de779758a1e52327abf503532d8992c a12b82babe304f0107c276af7ee8dc87ad2cf139c341f0396d304ca20f00b22 2233bfef7f21af7a393e7444ab713bdbc5bd9920630db4265d321834feac3367",
+"15a9d8fa2aae8d8e9bdb23813f7c752a131e65d2501985c6891628ccec2080ba 26bbae92d9514dcde3b8563c024c1737f6a4ebac4c2f86c78388deba730422b 1d6821807e83761c53a231bd9ce1b71d289b894817e2cc97d6de8d740753ddf9 19bb6eb6dc18552b3cd8229bc74461253068582a31a87c07c7e228e3beee7464 a4ac4a897a40e0f1519fbbaecede615416ac90fd4abca23c84426970b175189 ff33122337dc7ef93599368910d3eb96f7553e516dd858e25e4e67d2944d9a7",
+"12b5f6fc0fe8528ff7271c0c0f11303c0eeb02556b2f2b627043a78e1dd8dc7 6db45646b39888537e702b22f26c0fdfdac910415bcf9b16551254b60a1a16d 18a991efa8282bd267f7ddf019cd77269fd05ad44bfe126acd2c145a85e36c35 5c0a17f8b76aaa99f3100f8cb02ff255706d4cccd2708c25858346fbeb10dc2 5e0faafb9b335e9cf3835a384127286bc39c93034ac703dd195207d3c3dc77c 2d8a7b0af99d23bbb6972e7fe18e3df678356a95dbf4736ff9bba8b4a2bf35a",
+"12a9ddc515e4bc8c543fe49e130227b69a10ee44c4373106a43f0905d962a2c1 489d46cfcdbf01e8759d5ca13137bdcf2ee0d0179add17c0060549413685370 d20538a11820b532bfba2ae3e75178bbe207d83e319ae0398dff36556b1c3d7 2babd0059d6166fef1c459a12116f2b0cbce2055c94d509a49dacaaef64d211 189a483c499f04e4414711e9d5f530ddcf47d5a31915edc71fa47f73941e5426 15cef90d6ad4c488ce9ed04e411289c39a642a45161686bc18bea2a76e8b0032",
+"1fa1814bc4bf2fa13e4a0a6eebe747dff9c0778c28b6203477f31afeea5a9322 1b76bffa77fe990ea129e23625567f86460b2349a0b9cd06ba0f114655bfe0ff 20b6a7830bab7707ead88b661188a5bba352f52bcb515fcc3481395ccf55c3ec 57245a401668d36640926a5c93f2df08ac034e14ce1b9ad0885e02bce2298e5 6f4b1a0fe52066995cc360ec63499bc948087a1cd6b062e195bc3bdaaaa0f55 106b82c03acccf156276672404e5b373513268e636b78dc7a7ed525dba218e9e",
+"62a10543ce70edf233954d59c8def1b17ff81181a05c95d4b0e2d1bc18ec882 15265960e79cda4ce7b453ebeea4a027b2b60380dffe09e1992cafce7860d8d6 276a88525a70d140ce7f0067f0fbd118b6bbf1120abfcaa242312131f570b3f 15113bd171a7635266c1bc33d7ccef7f84385a5d9e0e3a8653fe6c03d1f34c0f c18b14bef443ab8e6b3899e92334102e0d83d6d2db7cb039908c59767878127 24bd88570179f7decf9e76f50d1213ae16ab394147f6eb52d7404350726b313b",
+"102c32516b03ca323560f845bcb20336fc471e88599f000afe842281b85f8fd7 240ddec9c5141b7cf217cda43b4889f16c1f9754056de17b65a39c5b3f2bf85d 194cba2b9f7edeb526b41689750ddc3cc20502b194147d237c1b05655c6735b2 1c9bf26c5b97627ba348fc04b5b286cd578e08bba35937a94fe8e8c0be42bac0 28b3bf3e8c568cf87f125ce887ba04011a3dad172642b4ac5db2067cfe9d61b 18362ce8a0cf44a9e666d73d8568a6980d1ee933637c79747c120e5a6f06efb9",
+"249204e775f625aac126c0e1e9af2b2ec55d8a7ca3476692baae3fec01106082 1bb5fbf20558eb354271b21e2039f324f0a9ebab7063ab2d0a587f4ee4f0a6c6 9ff9fbe8ca09969346f005e83b99fa5b1a06b34418898ab5e89ba9d136795c9 1b300a40e2910687da5977d14e61fba29ab12a1ac4e1b5202ba50ba47ad91a30 f8aa8ecba9e74effe317ef2260622d780e52a973c454b11a3230c2c1c306f1e 567a578e7ca96e76df99ec8d37772e2a649a0c10be5be62ecee17b8ce9c01e",
+"c0935ae8433be8177cfb7b88145ad0553c639e5f97b2d4d0f8394ce6f188e6f 3e6d5a9ec3c56cc60019bc770f291bcdfa10af578aa9f40adc2dc523ce202af d2267b8a49e5eb72aa7870c4552c1a9cb7747a8a236b70bef87536519316a8d b889556dd99257d724373fafd8ef2e1b15c2150a690ae1602f34dd52724517d 17e904263e0e7c0f4ed1f8e507add57cdf4ea98fdf2858a96ef3ff44009012d8 136033731552d7779d76b9a7b20fb88a6401c85d1f6d4811870dfaf0b016c665",
+"1f6526a4935495ef9348f4bbb5e3f2aaa4e47d64232f63fcd0dd32b6769830e3 249c093a9a8605ee94c20eaf8b4201ca832bbd12e5799bf19f38eadd44f0c40 227553b1a8d7fc2d155e6b67c82a9eef87f00da270c45f2c2b1c4d0ba0ff68c7 2287da173f926a799314bffb72c0346f74bf17e97cb1c853ef650bc3ae8e8c09 2018770467a90c2f82882a870b8611a95855d8961ddc8a85e9a28b578ba3d914 a940ed36042541297ebafaca5a050172cd22f11182eb71bddb6ac7db6e08bff",
+"233621b30235eaf95f3514a080c6224883a530429b53921827c73ad81a6296ff 12cc7d3e2c41bf703409330d14e58b46b754c0dabbdb4809c92ad02d3a8c3955 d8cf53dc7375e2439184bcdf638852c0a722a33dd2198259daa6174c3593e6f 1f67db1bf760e24d743059684800b312620efe63f6baaebe9e2260904e335b39 42e2aaa97c940ac3b0b12b1b252d0e7fd8a2b1e48cf079a51237136dfea58bb 6d6edb2071ae130da9f90302aa92e306dd238b3b8af0feda78056fdc74df210",
+"e9a9c25e475bf9bcc7f3f85f81eda67898f306252aec05b979867c2b60a71e2 1d4bee38ef166f0bf0ad0ffeb5cf35b219fe4e29a822d5047d5dd2dbce472a07 b45aa3ef71d13b29bc71a91174b5ba38edb4da8860f716a7c74211474aecf7e 59177d6fa3245164a2a03122c6d3c89053edbca31f1da9d0294d829db6e7ec7 e76ad153dd3017c3cc114dbf13111189dbc613a3f75a782bc2246bc003af31 85429383c0477bbd07d1bef8222c9735e33bdab16f26c8f829af6e99be03ff6",
+"118dd88bd5b885006eaafce2aa9cd07760dfc3af3ccc3577572b63bb3ac6e9c3 510e1ce1104d484b46b0a03beb2a6cb6edd98432ec6129f6d8062b0319d9e1 1423f7993554980962f7fbdd27da8d72dc278337a27294605f108140db9443a5 1679f85ac1193e3e48ae2098940fdf9d73eda7921f73f8dfbc5c8b59424f02f8 21bc797303f2351cb5953f88bb4c0ef12f0d5368a200d80b77ad517e4dcb493d 1ef6b8e764cee9e807497a0b3c9f27e6adbc9ba5b35c23178d2c6dbdbecec536",
+"22c453ccc69171570a845366401ec229685dc17df44144155975b820fa17990e 35e34412e7bf892e402161c9fb90733ef21dc17b32826e7bb514cefe2768c0f 18c88fd0ac7040daf982d3402cd0278ca1c28a2db7ba6688492a87cb7b4c1570 1a70428259999bf2f2e669d1558c7880022567dfda7f4a4b6daadadea337165b 229642e1941866af8bd1e80ea27f3f9adefbef7fe83312d39c7fa60f03f4d1a2 1ca01d3337ba20c34e1fd6fe7d1388cda5e1c977db77407107bc234f74fd7b30",
+"7c9c97b270c51b68d2c8e62919e92445588185eb3c0f952fcec1eef35286e0e 221dea356e4aec63b078120c590878a7807ab232ee33e9ee0485a39daae53e5e 173646423323712ee44f9b7cc455668993cc1e645943c543c3996aa2e9f94be3 1eb285166c9a8ae120c9425a5084d459f505e5eb2c4991afd5433fc58e1fb6aa 22d4076911575f8a1ae7cc5d3c54bd77150a6d9eb7ac1a65a19276bccdde23bc 17bd2288971b4e8560d70be179f976cae961b75e83c9e113a8182e2fd93e0dd0",
+"b6e5247924ca51fecfa82f5edef9deb3628b58160eeb57dbf8bfc67b806d503 7fdd097712594d655dc48ea4be4ab70ef12f9c1c94a3df668b780785144e2e4 220c67062397381bdd55fe8309b8e733a8aa3422d2ca60d91bcdd56e32718bdb 2500df3074d37f36ca09cee1615c718364ad846c9b29f0929ecaa0e47c282261 2301a1ebb69a245de6ee178b23ccd91dd046b9191117aee25cabe93be56aae36 1a791eaf1f0ce805acaad13bb1d50c0c99aaab1856cc1c7efac823d4d06074f9",
+"27f16eada78233bd12825746445122291df0206abeae2a50818d407910f45c f7dec0b6ed8b1f34d65d41fd8b5354aa953b3ae5f26ee23f271f4c109d14a65 108e6f701fb397b1590d8246a6c4e100ae1dda21fa260b4361d71fc4fb520e09 18c6b53cf83adbd0b1385eba6c163871aa2330e1848cf308394717a5fb4c478b 19d806205aacb0c9dcec87a3621f9a22fd64567ad6c92375421de3c87cab91ca 17f07b0bdac223ea830c66538558b8cf588533620049257cf9f658c94896ea55",
+"1b7f3a149c96bf85b2b9b9d5eedf23d13b162752a32b7b988849ad02e8db3796 121f593363b0e9b554156dcc7eb5c0510812ee46ff04a7af85513f48c9ba6477 604efcd4930a859fdeb39ef3fa67f77be200b357934784e7a295b25b11aabcc 9a07d868191a518deecd73a16377d4dfac7e73adfcafcf0a89494008ab01c6d 25006b655fbe6c8c793f0ade374a3761da37611ce652cda8fc4e4104239d732e 20a5af4ee7a91501a8dabc3e00b28241d49a318fac013e879f5c83a41d748147",
+"15e14b8c45a032d45ab397c0f71f961f88a5a391ccb3957e98f533446d72a410 16b4c59c45f96216c0323b311336d3a3077af4c36b0749b6d147b89a921550dd 22912dc06690a4a9125ec29f05d7f6ff0c1487ff7a1ddde44ceef51b0576dc80 5b2c9e16493119d805865f65ba03788d3bc1dfd502c2b844476699405075949 f21f4a4398ac8c78d23e2a6ac49ed4eaf1962239849826fb007cb8b752e1be8 1761cd122bdf6a1b4c4b30a40f2bbea435fd2fb11a09b643a70790a2ad14b8d8",
+"1455c3016821b3653c3ef7f46c09057b96dae771d93228a3c9f1e773cc0d6b9 2425429670280933bacc8b0b660239562ef59bdf097a55727dc2c57d760a7027 1a439f39d819a2dac12662a7d959539a08feb200eb48394da81f278a6096288a b5e91773e94a99ac6e73a77b1a05467ee3b4b2ca1d3bf9fc466f442bbede62 b2c4e41f5fb917b165bba7af959b5079d66e47a69222b06567c958d2a0020f3 e672183095179b4ec98166f9888f529191d18e250edb412f220d88e4bd84c1f",
+"23501284d9e6afdb2077f5faf92e63781c293e81bb170890d6e555b36b4a7c5 10a18490eb2068d3a7b9881553b42a88d96f1868890086586b96fca5eded7433 22fc947931e1c397cc412a980f6ced9d9b522b0d41ea439e1317ef09905fd46d 1e85ace87d110792de28e394ae1eb1fbb02152b00eb0735b108d81146d2159d4 171925a6d21b06f134c8cb74a5698d885a18a2bacdcd65a7966676e3de646010 c9dcfb67f391f911d34ae7007df2baa7e3c675b3d7aad89d3d714c0eaad27f0",
+"12cee29e61adc777b51a40f16e69ac0f996af6b0e6559c7e55cae42819eb011 209ecfeac0553e993e5d5c521fe136210e2685fb0166ed862d45e369508b7cd1 232ae2e070de7557254e62aa31d1d10846f7c021e90bb6846c310286c373ec74 10fdc13eb66261e9fafff1e8f1b8d77d03da9f0c2d09139bd9c220aca01807bc 17780de6e7d9a5a678238cc49843479ac03ee43bbdf32692e41800ed454472f2 e679b641d0dd532d93e8e8f4c5b474b12f5738fb695bc1a49d52fb0947e3bcd",
+"3548c5cdfddcb890107b35947efdbafbe20f0b91b291b96ce84d32746a305 230b104a5db2b3c6bd40c9c89a3e18e1326875833965ee74445548dd687ff3ee 1a2a0974c4b2bedcc05e4ebc344fe2468717ad552ae03d7d8848b70b7cbaf4f4 24064acec01eaebfa0e9478b02ac8a58ec24447b2ad939862dea38f2c9452b26 f582d92cb774e28f4cc126d2278e302590ba61095874a95b6daa53bbde17a12 164f86921f240ca46fb97be66691ae31afbbacec7c7b3bf34b061989b7e6e74f",
+"11188236209b1426dcf18325c2ad03c65d93cecbfaf887575ba6e1e27dfc45e2 e3e13dca8ec6b36cc9c5a0b9b82995aa0241220d59c4317a8e3073d97ddf30b 4d447dd2de522450dcf581f458f73cf85a694807de1c5b7aec26bc6fa53cceb 915fde08d9f488684ccad3cb673d7b5d3370e753a9507df98d29f2692c57429 1050ed79af2b47d4ba79c8a713e0bef72c0854ff375cf8592242305daf63e067 1e015cfc30784f59600188c84ce179d392a862764090aeecf0b35acea464461b",
+"16e21d3ca101d75e393860543272ec7b61b7dc1265f2d2aa03f8453fe2c8d1c6 12d251ecb30ad48aa710c19c7e4268a85461d941ae868fcd40370ad8349f5ed4 16a5781301c514a7be892b2a37ac2ddff913fc334bddda5c07dafd995b848160 72c42e76d0d2f46845faa257e682bf1e6db5f0bdae67189fff44d579eb07c9d 12e04686d010c1532da3c85616e47d56c2ba7a5ed381c6e2dd656558a271e496 18c23163fb0f8265ae332a1122b170ec8e228dd7ca22e03f118fa39919eea291",
+"14a5749d6711a71457eaff20f198632cd160266ed42242315cc253bb8645c3c1 3f68208d01cfda2188d4f8c5497bedfa91b85cdfb6a7a3eae48795ea647c14b 22f39c106eb617d0735c839bb7230509ff76fd7fac7b066c94497e373b26e531 3c7fa16286898ca569b55c2a27b953ce1cf36455ca389760dc619f5d50010fd 10e8c296042ec10371aa5307cb4f30336d2401709216ce1e698ca4c84e9d8508 e5b07161f80d592cb0afd9caa62dbf8db7ea2322859dc6cbb94571244e4a91a",
+"1e83247e09456e3635948ba5d74b68083a3df9103f35719b5d9c0a44b6740fdb 17c7de11e876ced09ec8ced8aae4ac72b5f5897d65c756afc9c52dcc65197f51 544f8179fac1522d79bb3dda29e7e5f69cf058c7f4b15f4c1ebbfc67ba8b4b7 1fee12db2771acbbb6ed74420e7b3fafee8db120940c82bcce97718f7e11920d 12d24d08ccf76d6c09d7315d5ac0fb115093ceb1e6f1cfa9120b5bc7b4134000 76d57ad2482923005f1a1ab1566acb6c3a80fe58d5fad18d0e355c86609862a",
+"1bcc61b0c00ceeb043d1fafa446d220a2c84614bebcb2e5af8377bb47f5ac338 448115ad1ea10d7495c7673531e83b6f5a583e92707600b53b7340ea22d041 23d9194d45b5e5650b3a9110ecacf0bed9ae873e1bf6438dc95c42aa09cae457 1633bf2d1cd3333bcf0b2251b27bd36d02c445f4fb37f86da380b62d773e1171 d2c429f30a003cc03f542051dc2355dbf2f9234d98621eaced474150aa87855 17a2e84d674aaecbf464a8e84054681b1b8bd5709b20a4aa5fc1d9dfe9670cb9",
+"154bbbd97deb38fcdffb30cdb8f4f775b9fe487a581b375f2076fb9cb32625d4 8b8466e23a4aee54e22eff69283f6126edd80f68dacb779bd7c3cebc04df50c 41d97a42211b0821b29f1cb0ed367067535cbbfff040d1217598e400ac23187 4eca06fda95d93e11c0fd587c31e5dc56d10f837024029e0a5190129314a640 176f4f2b9e7dfcd3efa92cd5fc6339e9d50eaf1aeb6c379bf5399c7842e715ce 1625e4b934e4c541532500599890cd77c843fe0f693a1534e791a4592df657f2",
+"242c8ea88218445f1a408847b9b4e85f09b38d99e3cd36d65d2243ed15b09cf7 882d14aa2e296ab55f6edd9d497e863e8f149421de4ef58e25fd84915e3b99f adffb6214cd70da62993132f81e82d737ef93cc411a7ddff0f3f5c541693b6f 3b901ca6369302769496f52b196739f676eae73ff01800e999289969e06ac56 a16c0603b956a1915e26c682b9fba763e28c12216e6176ad143f233883300e5 1007f778f72f4060dd8e7bc2ab320fbb02d25fc137acdffab59d4a6d5eb5d800",
+"23c26ddbd55612f1bc643d9b6936278675f77557aca600d42441212bb4dc5b9d 12fd0fed9885b1d8d60ef972bfcbd88e4e9a27f945f054dd4020d73add462f41 12353ae4cb392e0e0c59aa633ad349b9cd093e81c0b43fdd461aba9292b0b584 d315a0d934d8b523525c6335e90da9f6aaa052691385db4edc29958d571c0d1 22115fb8f44f4c3377ed2b8c7ce21dcb29d2bb3817d6bbd61ce65e2a5d1ef877 1aa4fb0b4039c1758d4cf69583c2678d3b3ddd953346aaf51bd75da752a319ca",
+};