Convert test_mul to file_test.

BUG=31

Change-Id: I0af5f30cf62c86d1d41152e1e99840bf83c29b33
Reviewed-on: https://boringssl-review.googlesource.com/8526
Reviewed-by: Adam Langley <agl@google.com>
This commit is contained in:
David Benjamin 2016-06-26 17:28:55 -04:00 committed by Adam Langley
parent e1caf3974d
commit cca1c11ae8
2 changed files with 662 additions and 68 deletions

View File

@ -99,7 +99,6 @@ static const int num0 = 100; // number of tests
static const int num1 = 50; // additional tests for some functions
static const int num2 = 5; // number of tests for slow functions
static bool test_mul(FILE *fp);
static bool test_div(FILE *fp, BN_CTX *ctx);
static int rand_neg();
@ -122,6 +121,7 @@ static bool test_asc2bn(BN_CTX *ctx);
static bool test_mpi();
static bool test_rand();
static bool test_asn1();
static bool TestNegativeZero();
static bool RunTest(FileTest *t, void *arg);
// A wrapper around puts that takes its arguments in the same order as our *_fp
@ -180,12 +180,6 @@ int main(int argc, char *argv[]) {
"| grep -v 0 */\n");
puts_fp(bc_file.get(), "obase=16\nibase=16\n");
message(bc_file.get(), "BN_mul");
if (!test_mul(bc_file.get())) {
return 1;
}
flush_fp(bc_file.get());
message(bc_file.get(), "BN_div");
if (!test_div(bc_file.get(), ctx.get())) {
return 1;
@ -260,7 +254,8 @@ int main(int argc, char *argv[]) {
!test_asc2bn(ctx.get()) ||
!test_mpi() ||
!test_rand() ||
!test_asn1()) {
!test_asn1() ||
!TestNegativeZero()) {
return 1;
}
@ -463,6 +458,33 @@ static bool TestSquare(FileTest *t, BN_CTX *ctx) {
return true;
}
static bool TestProduct(FileTest *t, BN_CTX *ctx) {
ScopedBIGNUM a = GetBIGNUM(t, "A");
ScopedBIGNUM b = GetBIGNUM(t, "B");
ScopedBIGNUM product = GetBIGNUM(t, "Product");
ScopedBIGNUM zero(BN_new());
if (!a || !b || !product || !zero) {
return false;
}
BN_zero(zero.get());
ScopedBIGNUM ret(BN_new()), remainder(BN_new());
if (!ret || !remainder ||
!BN_mul(ret.get(), a.get(), b.get(), ctx) ||
!ExpectBIGNUMsEqual(t, "A * B", product.get(), ret.get()) ||
!BN_div(ret.get(), remainder.get(), product.get(), a.get(), ctx) ||
!ExpectBIGNUMsEqual(t, "Product / A", b.get(), ret.get()) ||
!ExpectBIGNUMsEqual(t, "Product % A", zero.get(), remainder.get()) ||
!BN_div(ret.get(), remainder.get(), product.get(), b.get(), ctx) ||
!ExpectBIGNUMsEqual(t, "Product / B", a.get(), ret.get()) ||
!ExpectBIGNUMsEqual(t, "Product % B", zero.get(), remainder.get())) {
return false;
}
return true;
}
struct Test {
const char *name;
bool (*func)(FileTest *t, BN_CTX *ctx);
@ -474,6 +496,7 @@ static const Test kTests[] = {
{"LShift", TestLShift},
{"RShift", TestRShift},
{"Square", TestSquare},
{"Product", TestProduct},
};
static bool RunTest(FileTest *t, void *arg) {
@ -579,66 +602,6 @@ static bool test_div(FILE *fp, BN_CTX *ctx) {
return true;
}
static bool test_mul(FILE *fp) {
ScopedBN_CTX ctx(BN_CTX_new());
ScopedBIGNUM a(BN_new());
ScopedBIGNUM b(BN_new());
ScopedBIGNUM c(BN_new());
ScopedBIGNUM d(BN_new());
ScopedBIGNUM e(BN_new());
if (!ctx || !a || !b || !c || !d || !e) {
return false;
}
for (int i = 0; i < num0 + num1; i++) {
if (i <= num1) {
if (!BN_rand(a.get(), 100, 0, 0) ||
!BN_rand(b.get(), 100, 0, 0)) {
return false;
}
} else if (!BN_rand(b.get(), i - num1, 0, 0)) {
return false;
}
a->neg = rand_neg();
b->neg = rand_neg();
if (!BN_mul(c.get(), a.get(), b.get(), ctx.get())) {
return false;
}
if (fp != NULL) {
BN_print_fp(fp, a.get());
puts_fp(fp, " * ");
BN_print_fp(fp, b.get());
puts_fp(fp, " - ");
BN_print_fp(fp, c.get());
puts_fp(fp, "\n");
}
if (!BN_div(d.get(), e.get(), c.get(), a.get(), ctx.get()) ||
!BN_sub(d.get(), d.get(), b.get())) {
return false;
}
if (!BN_is_zero(d.get()) || !BN_is_zero(e.get())) {
fprintf(stderr, "Multiplication test failed!\n");
return false;
}
}
// Test that BN_mul never gives negative zero.
if (!BN_set_word(a.get(), 1)) {
return false;
}
BN_set_negative(a.get(), 1);
BN_zero(b.get());
if (!BN_mul(c.get(), a.get(), b.get(), ctx.get())) {
return false;
}
if (!BN_is_zero(c.get()) || BN_is_negative(c.get())) {
fprintf(stderr, "Multiplication test failed!\n");
return false;
}
return true;
}
static int rand_neg() {
static unsigned int neg = 0;
static const int sign[8] = {0, 0, 0, 1, 1, 0, 1, 1};
@ -1760,3 +1723,29 @@ static bool test_asn1() {
return true;
}
static bool TestNegativeZero() {
ScopedBN_CTX ctx(BN_CTX_new());
ScopedBIGNUM a(BN_new());
ScopedBIGNUM b(BN_new());
ScopedBIGNUM c(BN_new());
if (!ctx || !a || !b || !c) {
return false;
}
// Test that BN_mul never gives negative zero.
if (!BN_set_word(a.get(), 1)) {
return false;
}
BN_set_negative(a.get(), 1);
BN_zero(b.get());
if (!BN_mul(c.get(), a.get(), b.get(), ctx.get())) {
return false;
}
if (!BN_is_zero(c.get()) || BN_is_negative(c.get())) {
fprintf(stderr, "Multiplication test failed!\n");
return false;
}
return true;
}

View File

@ -5348,3 +5348,608 @@ A = -e53ad05c88568f09f616797f0b7f2756fb543d691ec2a5b645c1e5892a247302826419a35b1
Square = eea8028b26e0df090504d54da714a6f5f2695202e53cff479c78aedd47a8dc676243ec586740fde53b3eca9ca02b91031ce766242184109503fbe25b1b6d318e3cd5970fabd16dfa22984dd2e9f1e0f14c189170fc69c031d66663703e6235a942d51a4545bd7b0769d01d302ce2b00b83f01568a1e378f61fd0ca6201b0490330580cd9de85719e174a71915d7efbf65cd73d8f4e66f27e0dd3144d58ec09ed0f7ed7d1238ee596922807100fb7a11127944ddcdec6a9ca3bbf6df7301e354f3f049bfb7c275b43c3d8cda5907a932fba507c9145ea3166081c1b48fcc710ee32cd931f936c796b14f8a78a592e67753a7c9e428a01719c8ba82652f3a89fae110
A = -3dcb44be1e54c5a5d7db48055ca9afa1ebe2ae648aa6e16ac497502a7deee09ffa124720fad0ab163ce8b3ea6a90f110ea52b67dbc424d0cf1e8c9726dfd9e45bebcefaa5cd5706edeed27896525f31c6bbea3d67ee97badefabf3e2532470b66e3ae3100f66ddf50cf02fc3a8e3f44c304251d3b6a7ca3a6e4bd5d16a41bd97a4
# Product tests.
#
# These test vectors satisfy A * B = Product.
Product = 5befab3320f8f90542f3120235abd926aac3805a19e343f690
A = b057af553afb120db6b7764f8
B = 857734c4c27a1d17f7cf59dee
Product = -ab1ce167f4b2945c55ae3f87df50ad07d4be87cf9f8aa07b0c
A = ae7a6a87ea8981a567d0b3ecc
B = -fb0fed5f8c737bcacef4d6cb1
Product = -c2606cd48e6b075c8da79eb4668e7157f1f175c2860fd4c475
A = -c28dc31984d4583e9d45424c3
B = ffc4581a5c3f885cf42767e67
Product = aa6805b5408aff7f914472756da07830dcad902834dbdd6944
A = -ffa07ff9f503511954e5dd3f9
B = -aaa7af472ad8957763f5a7c64
Product = 58ca2569173389df29b5ce4b784086055dee821a7243db7210
A = af417d936f4690008811a1ae8
B = 81b26b80b43aa65aa55ded52a
Product = -a043d31dfce8bd01724d31c863d0a64f1bf013509d77737c42
A = fb5fae5edefb6997d44a1ecd6
B = -a336e50c6f7845a1686cc88a3
Product = -b5d6a45ffce851b201239d938ba551bab7dcb59fc11fc35fce
A = -f918faa58bb57a2ffb8b01f05
B = bae08c3006fade695029a1df6
Product = 6f2fde7d1a18625d727c6345ed85e597d546d9228bf7f0564a
A = -8d108d7a16f0696d4ceb24445
B = -c9c764cae465207097ef8d2c2
Product = 93808b1140841dc9735cd61c6f855ddbbb83066689b0d7e1a0
A = b386d08daf3fa2154e9c768d6
B = d2557dceb2d02d04d9c578670
Product = -ad04212ca8cadb1f7861c5130ba3a747046a2a7e4a0c72b69a
A = e4e5f7d1311e0c5f2e404d55b
B = -c18057a328d8c7375afdfd4ee
Product = -685e75c232f2b4a0e455fe5ee8aea52f292ad8b8178320e692
A = -a683312f132b2320632e74ef6
B = a0758f12791453b4af354730b
Product = 6f588c53185c503dc5b0dc3002d3817ca2e7eb2370b3e9a647
A = -d70c9b93170261091f0c53f27
B = -848c86c51a186ac4c9080d3e1
Product = 5e3bc5a04e054a9a244bf7c86cae215072fdb70e9199989427
A = 898b64ef09d7cf63966e1a3b5
B = af638b12f26aa5d12e97439eb
Product = -8d8372b235b16108285203c03a8aef6fdd3c0e1a9fd31d4f68
A = f6003dc83818c14fbe36c9998
B = -9343f6cbcc81fa4c9399dce5f
Product = -5ee6509abeeb7af7fc5caef40d1822ad3150c8d74f522dc7c8
A = -875ff6f56ca72cbdf614bb9ca
B = b375a68a21dfb1f159c22fa14
Product = ada25be404a17385af5a330da799e5909da81bfa0715baa6f4
A = -c9b8df392e76abc3eb7d5ce04
B = -dc5ab818c70594dd917b4243d
Product = bb24422ee4656ddfcd50ec38201b15baf679d3b75e5cb878ca
A = f8e12cf4defe388b78510f687
B = c07ee817b4ae95c2915b88966
Product = -93da296ba164c7220a17330647aef0980c94eddd2cfa2a3b2d
A = bc5dc74ddf7a1363d1c2b1f25
B = -c8f069bad7f93cbfe6df51169
Product = -6b2e1d132c4e0b0dc9b7e7de7d424fda5180480cb5ff47c755
A = -a8048acb66a8bb88df39266e7
B = a34e0b265d71435ae8c92a463
Product = 6ccb2cd93783576a8602ae43f41c786008b6623a4cca0a010a
A = -b071f1f54790c951c1dd2a1cf
B = -9dd89bb4d9b546207e282e2d6
Product = 5c742ba47d0d64bd97509927ce957deedb855766cc24c60016
A = b44f3f252c368096fa62747f2
B = 83439b97dbac579fa4f7b7d23
Product = -7347ba65691c913286c2fb55e45b177f031c1d86ae0e9f654f
A = 937cf0643ffa53cdea24d642f
B = -c81881f78243dd5737a7d28e1
Product = -9bc0649a703674e59f83ff9b8a560e5cbf51f65ca310f80f95
A = -b536f8d9769be6f62da941ae5
B = dc0746fb101881ae0cacde6f1
Product = bf4992fc3a124de350f9fb90ea825cf663b1fa051282ef22e2
A = -ff7eacc7de1bb01d668c693aa
B = -bfaa6627f9fc7ba68ae41bb2d
Product = 7c8992d34cc0b63f1c953f68d4e12a99d3f3a34d16bd76caa9
A = 9e0d5a850d078890a983c0ec9
B = c9b72c118b3e1f1023a696ce1
Product = -a75840c95082b9a0ae0d6e0a4eb5e09288e4e2a66e9697d9cd
A = b2b042a21045a74ef1a5091d9
B = -efbf8b120b384e869692a1b15
Product = -a510b333bdb4ed7479c142e8fbe2b12f7671a42acbe16c0998
A = -e7fd5e0bb5496b9d876c27f65
B = b6262653b2be44501af1d85b8
Product = a1c1e90afc4684754155526e307fc6ed798746f347bae2c880
A = -b84674832b26ded0a690a8ff0
B = -e0b7bdf2fd05a038ed3640b78
Product = 5588e0c33bffbefcc5695ca0615abd383343f21a8a0d22b222
A = 80cad81ad9a66ab6a1c2e5669
B = aa0453a77c8af1584f54750d2
Product = -6460c2fcd6cf3304ab163ea883ac48e2031cd10f2e9014c0ab
A = c49ad3d7c8848d4fbf913b10b
B = -82b3dedbe3cc7cd532ad632e1
Product = -a18717330b711669e85abde8c4dce426529aa621ba3da2a477
A = -cab4a9c0a331a5a5e826dda1f
B = cbfee5041c13075dfe3399aa9
Product = 8ab6282ee892b53c083d319a9dcab48af97a1ac8493c0bfcad
A = -f7d13e47f9aaac8c25f9bf75b
B = -8f4aa95231c1e2336aa092297
Product = 8f2d1c23c78777ed371f13155445ca3c88cbc0a9b299bdf9d3
A = 9d8248d00defce1ad081337c3
B = e8b479295ecd9cef7301f24b1
Product = -86d5e0c5b581fe59819730b4b71e33d1f85f9ab504c7dbe2d6
A = b21b45e88acff48562a19729a
B = -c1cdfebccc763beeac394b997
Product = -484ca05aefa113bdfcb1bc623f730c9f9555b462a8ab4c9606
A = -8c12b406c02c4417163c0956b
B = 8422b15c80c1c087b17eedd92
Product = 614c3c91f60050c785fd229a3ad74674577a90cacb654e0a5c
A = -93d45bce155a23a397506d96a
B = -a87e339c3fd5aebede5fb1b36
Product = 9683285f194a7e4feeab196a36bdfc4f828035fd184b9cc692
A = f196d8fe760fdcae7eb60e2f7
B = 9f7d88a2163ad818bf3a6377e
Product = -988a64599c19cc64f3cadc1a83fea6550185f6cc3ab82af822
A = d0584b2a306671e4d2c9d0c7b
B = -bb6e7559df199c68d6df3a3c6
Product = -68456814cb0edd951196d04c853172afdd5787a5bd69a57876
A = -cefce1b0a1fb22862418bb597
B = 80f614139947aea5e76cd55fa
Product = b4b1cbf5d6566e7a57aee0cc5c9c8ec4ad885e8766aa7662a4
A = -d68ed1bea046c6cad057e21db
B = -d7988b9be54f6e332d019032c
Product = 6b09212675ff5257a1384371e17b37dcc268bbb141577902e4
A = a8208053adc20a609d5d01404
B = a2fa927c5458c4fe662d7a3b9
Product = -8361bc26f9bcf55f677e047d822d3004027da0d0455b244d10
A = e82b6410b29020c2d6810a977
B = -90ddfe0e7f0d6b9cdc0815f70
Product = -f1b6da00923fd513a83e32040a515649fbd362f69ebc016d9f
A = -f9b697d9ec774a8d1ee5ea905
B = f7ccb46a8869cb028492bed53
Product = d06206963f2e150bacdb32c823c3a47f013d5a267c3c0d0c88
A = -ea8e63afa99c719897ad7f2ab
B = -e36f11f55b6148d1b4f46e598
Product = af774a5eae6084df5ca499ef005642730adabf6a4f9533e2fd
A = e4c7af7eea3ec9cc2443b7319
B = c457bc264c8461789931baf85
Product = -76350f428bfbb95e6c253ec0f457aa84cebe8c7cb1af2a2120
A = 8fd1ff97465775d44dee58ae0
B = -d268a7d328f44baf80e35119f
Product = -787ae3f114f9a8dd4d249d5d3f3b0897b02564b9469416cefe
A = -bc0b398bd0ec045b0cf147b7e
B = a4050955c234e473257d0c641
Product = 9d6320b3d4aabac097a079b9bd2aca7f1898bcab0f23409fd0
A = -9d7a4ebac630cc0662b816fb5
B = -ffda517d3eb3214986b04e290
Product = 80bab8bd800ac8c9dc3bb57dca306f10af6fd88c5d8314833c
A = 834bc50140d6c6ab938dc58b6
B = fafee47793cbc533b3c66af3a
Product = -b08920f5922226b1dec87151ae087d8a7e5c1aea8c9be148b6
A = bfd5b1ad323c79428cb2db36a
B = -eb956a10edebdd658e6810fcf
Product = -6d428e08e8350bb4b0fae3b662c82df2aef7beadaa17430dbb
A = -a57da276998c548101f514e9f
B = a9040c1909712e1149d295765
Product = a57da276998c548101f514e9f
A = -a57da276998c548101f514e9f
B = -1
Product = 14afb44ed3318a90203ea29d3e
A = a57da276998c548101f514e9f
B = 2
Product = -295f689da6631520407d453a7c
A = a57da276998c548101f514e9f
B = -4
Product = -867614005cc204a8d19720fe13
A = -a57da276998c548101f514e9f
B = d
Product = 12bf3b676f64e5929d38c35e803
A = -a57da276998c548101f514e9f
B = -1d
Product = 24d8f92c68303ed0b96f91a8167
A = a57da276998c548101f514e9f
B = 39
Product = -49b1f258d0607da172df23502ce
A = a57da276998c548101f514e9f
B = -72
Product = -6fd5e6ca25c3d51b2e529f22173
A = -a57da276998c548101f514e9f
B = ad
Product = 1276d4705b81b82da4c7e82559d7
A = -a57da276998c548101f514e9f
B = -1c9
Product = 1ddb9abfc5d4017f068a67b5f4fd
A = a57da276998c548101f514e9f
B = 2e3
Product = -3a8b41c914b1b4a4e341433601f7
A = a57da276998c548101f514e9f
B = -5a9
Product = -97c0f4ba414d6e7d4c8b7ced84d4
A = -a57da276998c548101f514e9f
B = eac
Product = 1198739e0c23639c176d46d13f7c8
A = -a57da276998c548101f514e9f
B = -1b38
Product = 159150954ee0dedf541e4dbac0ec3
A = a57da276998c548101f514e9f
B = 215d
Product = -441d4bc44c86f02ff12c3d91a1562
A = a57da276998c548101f514e9f
B = -695e
Product = -64726b76005ebee27592237ba5dde
A = -a57da276998c548101f514e9f
B = 9b62
Product = bbe4ec7cf7c5bbd198e0ea86bb658
A = -a57da276998c548101f514e9f
B = -122a8
Product = 21f717d05681fd2eb1796776a69ef7
A = a57da276998c548101f514e9f
B = 348a9
Product = -396ac788a1748bc6955f99be4d2c64
A = a57da276998c548101f514e9f
B = -58d1c
Product = -54a213eb083aed1a04f3d1b2da62e7
A = -a57da276998c548101f514e9f
B = 82eb9
Product = 1366fb9c20fb14b8b9a9be4b3e3dde1
A = -a57da276998c548101f514e9f
B = -1e037f
Product = 238d65fd26da4733e5d93ab2485d40b
A = a57da276998c548101f514e9f
B = 36ff15
Product = -38272a99be154d531e922be405aee9a
A = a57da276998c548101f514e9f
B = -56dd26
Product = -64651b62b6a454c08951632c7f2c398
A = -a57da276998c548101f514e9f
B = 9b4d68
Product = fb272e3597b816144f8b945ae6130e0
A = -a57da276998c548101f514e9f
B = -1848320
Product = 280d9f5ed7243712ecb9a7c6358bcb8b
A = a57da276998c548101f514e9f
B = 3df5795
Product = -2fbb6bb8e1ba78cefc47fbbc20e188ee
A = a57da276998c548101f514e9f
B = -49d6652
Product = -57f29c13691ffa1642d2860dab9d288e
A = -a57da276998c548101f514e9f
B = 880c2b2
Product = 139c19d7668e6aabf2d7206cb0723ed34
A = -a57da276998c548101f514e9f
B = -1e55aa4c
Product = 2950ce04bf0cf836d4fe94b88fb757d0a
A = a57da276998c548101f514e9f
B = 3fe968b6
Product = -5175239488dad05a58414251496d2a06c
A = a57da276998c548101f514e9f
B = -7e020414
Product = -945ff0ed38bc6020cf679cbd3e0758c6d
A = -a57da276998c548101f514e9f
B = e585e573
Product = 11c69ae98f6b27e95477986f796bc67c8c
A = -a57da276998c548101f514e9f
B = -1b7f653f4
Product = 209afe75e8fb5ac76d13c06b545f5d4d73
A = a57da276998c548101f514e9f
B = 3270154ad
Product = -386d64b215e41506514f4988ed237e4da2
A = a57da276998c548101f514e9f
B = -5749c891e
Product = -6c13cccdb1d140d0babd52707ea72fa278
A = -a57da276998c548101f514e9f
B = a72fb6288
Product = 136228a8a45540372b9b3cd7f82021f6546
A = -a57da276998c548101f514e9f
B = -1dfc08a2fa
Product = 1f0ad3babf9d132eaa08cf5cdb8f19dbf01
A = a57da276998c548101f514e9f
B = 30050f2e5f
Product = -50d615ce183258e95af77319b766fac81e2
A = a57da276998c548101f514e9f
B = -7d0bf92cde
Product = -817d358293b86a56a4e881e50257c549471
A = -a57da276998c548101f514e9f
B = c84efb12ef
Product = f09b9e80be251de474d726b16e25a6865fc
A = -a57da276998c548101f514e9f
B = -1743322a484
Product = 22996cb0f9c60e35dce49f3825f8a479db26
A = a57da276998c548101f514e9f
B = 3585acec11a
Product = -2b307a37c91791a61c0691858f5f783e4678
A = a57da276998c548101f514e9f
B = -42cf6be3e88
Product = -8826698fcba6c30d755fc523de1cc25301ae
A = -a57da276998c548101f514e9f
B = d29cc8af592
Product = ae37fc99fd419809310782714530d7428d77
A = -a57da276998c548101f514e9f
B = -10d8059d4a29
Product = 1d544a20f9bc7d95ab67d1f65743979f23bba
A = a57da276998c548101f514e9f
B = 2d5eadef1c06
Product = -367897184e9929a0294d320f10278889fbeb7
A = a57da276998c548101f514e9f
B = -54431582d0e9
Product = -943a509076a00060a2e7fa1cddb7468d734a1
A = -a57da276998c548101f514e9f
B = e54bb102f4bf
Product = fcce6e42879af5ad13545c0bcaab85b690cea
A = -a57da276998c548101f514e9f
B = -18711db522cd6
Product = 258c49f86d0cbb14ae9edbd3456be8cede2022
A = a57da276998c548101f514e9f
B = 3a1562c7c269e
Product = -4a8bbce59ad7daa51136d557f7fa16e9a2faad
A = a57da276998c548101f514e9f
B = -7350e780b0f33
Product = -82f53ec9333275d5cc271876a7db936db49280
A = -a57da276998c548101f514e9f
B = ca94ad312dd80
Product = 11daee4fcc713db5b2806e47fa5dff3b5b770eb
A = -a57da276998c548101f514e9f
B = -1b9ed6758f9635
Product = 17038cac4f0c94dc24985ea108ae6682e175752
A = a57da276998c548101f514e9f
B = 2399b8a9b1116e
Product = -37e5f14394bf347a3ed061769fe8e6424af4348
A = a57da276998c548101f514e9f
B = -567840a7569fb8
Product = -9253d4a32a88d8f725984514d969012ead7cc9a
A = -a57da276998c548101f514e9f
B = e25b246f733f26
Product = ace3648371c16a931d29004e79f5b9678391da5
A = -a57da276998c548101f514e9f
B = -10b717b27b6a13b
Product = 1faa5b45d04c143c339b09d3aad94d39b94ef960
A = a57da276998c548101f514e9f
B = 30fbd672e106aa0
Product = -3fdfe246d27aae0d08d63b2bc501461d2bff3b8d
A = a57da276998c548101f514e9f
B = -62cef5f078a8253
Product = -5b792bfaeff04ee3d948cb343a249d49eb344f57
A = -a57da276998c548101f514e9f
B = 8d805ac65649c49
Product = c5f824406161eec321da5a58e3e00d393b55abe9
A = -a57da276998c548101f514e9f
B = -1323dd41d2e1e077
Product = 2226dec8a57be8e84e42559007e2d101ccbe67f8d
A = a57da276998c548101f514e9f
B = 34d47842b5d0be53
Product = -340f50f812c7420b502000940788a700f6769788a
A = a57da276998c548101f514e9f
B = -508836d8e1193d36
Product = -a00f1d96e19c590479625c5329a87774b5964cc78
A = -a57da276998c548101f514e9f
B = f798fc858657f888
Product = cb94f830cba8997331912a6a31c34f1bef826d121
A = -a57da276998c548101f514e9f
B = -13aec7a5c52a0883f
Product = 16b45140b048d6dc0b9fc811df7ce7dd88357fff04
A = a57da276998c548101f514e9f
B = 231f27f3e347bd67c
Product = -2aa94179351b4e87de5849ab619d94f47450640199
A = a57da276998c548101f514e9f
B = -41fe3ec2189599cc7
Product = -5489401d3da93158d4284e557d74016c0a7cfd935a
A = -a57da276998c548101f514e9f
B = 82c5281df41bfc066
Product = ae04d5b212ecfc9a6d7df07794d565df52991fb70e
A = -a57da276998c548101f514e9f
B = -10d3139229f5d02432
Product = 27821bc811f45d63089790b41d307be978d4b19564c
A = a57da276998c548101f514e9f
B = 3d1da85cc012b3e234
Product = -3de3c9e9d7fa3020a578706339314890dccf63096c2
A = a57da276998c548101f514e9f
B = -5fbcfb28bfc9044bfe
Product = -627dcb299a6720044abcf11469bdfd3f951edbb5bf7
A = -a57da276998c548101f514e9f
B = 985b930517b78e6ba9
Product = cc0622441497a37fddf1856d5e2c99df52b99ea4573
A = -a57da276998c548101f514e9f
B = -13b9b88948fb7e95cad
Product = 1a5168e1a492210591ad1ed660adde9110390e4caf32
A = a57da276998c548101f514e9f
B = 28b631c6e04b6ab0d8e
Product = -4d8ec27b7460ce616421b9f5cae708c2ac241daa59b4
A = a57da276998c548101f514e9f
B = -77f99bdf1eb09da6dcc
Product = -55afd796db7bce822a00073fc8926d3bd0c79772f036
A = -a57da276998c548101f514e9f
B = 848cdd6212b9bb3620a
Product = dc494b0d73e8ec07cd2bb6dd8191d2b4d48e7700cc34
A = -a57da276998c548101f514e9f
B = -154c39567bd8be5f6b4c
Product = 240e9301b4345b914ecd91a49a0e651524dcecb6fdc6c
A = a57da276998c548101f514e9f
B = 37c6e7ee89cf87674814
Product = -39002ecfd6d96661b336157ccef6536756ad2e9219be3
A = a57da276998c548101f514e9f
B = -582cdab09915a652203d
Product = -695f49fc891d53f396f0593efae3973082b76d4f9e944
A = -a57da276998c548101f514e9f
B = a30074dbce2246af043c
Product = bba2b7b45b97cb0d7fb30fed95089870742ad69e7aed7
A = -a57da276998c548101f514e9f
B = -1224195afc7b394ae8cc9
Product = 1910edc278515ab7d4cc09b496dc3c06c32c75bc7368af
A = a57da276998c548101f514e9f
B = 26c6701c39334169e7bf1
Product = -3670b7f9b661aba35ce50984d83173c84c8fa60e04d100
A = a57da276998c548101f514e9f
B = -5436e84b4a29858a68f00
Product = -7fa0d3e0082b37475342b7e22e5dbad7b8d4cb5d64f871
A = -a57da276998c548101f514e9f
B = c56e0f44fc63bca242eef
Product = da7fe3367ce640fa5941c033ac1874312f10ba5950da75
A = -a57da276998c548101f514e9f
B = -15200043166ff309f0426b
Product = 1871d72481f66b1d413100edd6b339cbbaa67b3b2b3cd57
A = a57da276998c548101f514e9f
B = 25d057879db26fa29a5e49
Product = -3cf1dd1e2df3456757d72f35353c3c7a659b2ef844ad857
A = a57da276998c548101f514e9f
B = -5e46be70de21949df67349
Product = -5e861cbe47aefab2a7ea59292aab1258932b9a322f66e63
A = -a57da276998c548101f514e9f
B = 9238670897685a6c9cbdbd
Product = f623344788efb857db55c924e95a437effa4dc8bb2bcd24
A = -a57da276998c548101f514e9f
B = -17cc0ec84c228225a7cf45c
Product = 15514c916b0ae7cde6add16c629d3e19ba52a101d75dff72
A = a57da276998c548101f514e9f
B = 20f9f925b3ed307edbb154e
Product = -460cf5b14f9d0b547c3084bf44207bf881745c409b08d07f
A = a57da276998c548101f514e9f
B = -6c5cbfd29f3dae1dce99221
Product = -5ddf7fb91d765af97dfda5333d8779e80837c2b51cfb4f43
A = -a57da276998c548101f514e9f
B = 9136aa79080defd1bcf90dd
Product = 12c1a0edfb6ab6a0caae2553fb3743827e1470a8954e0a3fd
A = -a57da276998c548101f514e9f
B = -1d03b512470dc3052779f3e3
Product = 28388a244214abf046488a8d95308d95f021eae4b994a5a52
A = a57da276998c548101f514e9f
B = 3e37dce784274962ff862e6e
Product = -4da476e76119deef291c0f56934a912a0877278a19a561ee0
A = a57da276998c548101f514e9f
B = -781b2f2dc40094a7f8fed520
Product = -5792496d33dd45e225f9dfca17419a04e075ffc0c90b37b82
A = -a57da276998c548101f514e9f
B = 87772a4fb582acafd3e4ef3e
Product = dd3a3506a7d748de16fb43d666928a87de0354d8e8a1bcaaa
A = -a57da276998c548101f514e9f
B = -1563841bf7851ff158a395716
Product = 24e8fb09a9ab0808ff643122479dea5ed41060c6c5b74e8752
A = a57da276998c548101f514e9f
B = 3918c30b5568318a58e9be16e
Product = -366c125f96b38b58d01c939c27c4100af3377eabb792b5491a
A = a57da276998c548101f514e9f
B = -542fb814f45924aa09a16f2a6